From add42ee867fd03eaa46a389e0c6ff3eca007f707 Mon Sep 17 00:00:00 2001 From: wangwenrui Date: Wed, 16 Sep 2020 10:13:07 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E4=BF=AE=E5=A4=8Dasset=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E9=A1=B5=E5=88=A0=E9=99=A4tag=E7=AD=89=E8=BF=87=E6=BB=A4?= =?UTF-8?q?=E6=9D=A1=E4=BB=B6=E5=90=8E=E6=9F=A5=E8=AF=A2=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../charts/d3/d3Chart_20200812160506.js | 763 + .../charts/d3/d3Chart_20200812161713.js | 763 + .../charts/d3/d3Chart_20200812161721.js | 765 + .../charts/d3/d3Chart_20200812161722.js | 766 + .../charts/d3/d3Chart_20200812161726.js | 766 + .../charts/d3/d3Chart_20200812161730.js | 766 + .../charts/d3/d3Chart_20200812161732.js | 766 + .../charts/d3/d3Chart_20200812161735.js | 766 + .../charts/d3/d3Chart_20200812161736.js | 766 + .../charts/d3/d3Chart_20200812161739.js | 766 + .../charts/d3/d3Chart_20200812161741.js | 766 + .../charts/d3/d3Chart_20200812161746.js | 766 + .../charts/d3/d3Chart_20200812161750.js | 766 + .../charts/d3/d3Chart_20200812161753.js | 766 + .../charts/d3/d3Chart_20200812161754.js | 766 + .../charts/d3/d3Chart_20200812161758.js | 766 + .../charts/d3/d3Chart_20200812161801.js | 766 + .../charts/d3/d3Chart_20200812161803.js | 766 + .../charts/d3/d3Chart_20200812161805.js | 766 + .../charts/d3/d3Chart_20200812161806.js | 766 + .../charts/d3/d3Chart_20200812161807.js | 767 + .../charts/d3/d3Chart_20200812161813.js | 766 + .../charts/d3/d3Chart_20200812161815.js | 767 + .../charts/d3/d3Chart_20200812161820.js | 767 + .../charts/d3/d3Chart_20200812161822.js | 767 + .../charts/d3/d3Chart_20200812161929.js | 767 + .../charts/d3/d3Chart_20200812161930.js | 767 + .../charts/d3/d3Chart_20200812161933.js | 767 + .../charts/d3/d3Chart_20200812161936.js | 767 + .../charts/d3/d3Chart_20200812161945.js | 767 + .../charts/d3/d3Chart_20200812161953.js | 768 + .../charts/d3/d3Chart_20200812162021.js | 768 + .../charts/d3/d3Chart_20200812162025.js | 768 + .../charts/d3/d3Chart_20200812162032.js | 768 + .../charts/d3/d3Chart_20200812162040.js | 768 + .../charts/d3/d3Chart_20200812162048.js | 768 + .../charts/d3/d3Chart_20200812162052.js | 768 + .../charts/d3/d3Chart_20200812162053.js | 769 + .../charts/d3/d3Chart_20200812162055.js | 770 + .../charts/d3/d3Chart_20200812162103.js | 770 + .../charts/d3/d3Chart_20200812162106.js | 770 + .../charts/d3/d3Chart_20200812162109.js | 770 + .../charts/d3/d3Chart_20200812162220.js | 770 + .../charts/d3/d3Chart_20200812162224.js | 770 + .../charts/d3/d3Chart_20200812162227.js | 770 + .../charts/d3/d3Chart_20200812162230.js | 770 + .../charts/d3/d3Chart_20200812162232.js | 770 + .../charts/d3/d3Chart_20200812162234.js | 770 + .../charts/d3/d3Chart_20200812162239.js | 770 + .../charts/d3/d3Chart_20200812162243.js | 770 + .../charts/d3/d3Chart_20200812162244.js | 770 + .../charts/d3/d3Chart_20200812162250.js | 770 + .../charts/d3/d3Chart_20200812162302.js | 770 + .../charts/d3/d3Chart_20200812162305.js | 770 + .../charts/d3/d3Chart_20200812162308.js | 770 + .../charts/d3/d3Chart_20200812162310.js | 770 + .../charts/d3/d3Chart_20200812162312.js | 770 + .../charts/d3/d3Chart_20200812162317.js | 770 + .../charts/d3/d3Chart_20200812162320.js | 770 + .../charts/d3/d3Chart_20200812162322.js | 770 + .../charts/d3/d3Chart_20200812162325.js | 770 + .../charts/d3/d3Chart_20200812162327.js | 770 + .../charts/d3/d3Chart_20200812162328.js | 770 + .../charts/d3/d3Chart_20200812162332.js | 772 + .../charts/d3/d3Chart_20200812162342.js | 772 + .../charts/d3/d3Chart_20200812162345.js | 772 + .../charts/d3/d3Chart_20200812162350.js | 772 + .../charts/d3/d3Chart_20200812162356.js | 772 + .../charts/d3/d3Chart_20200812162403.js | 772 + .../charts/d3/d3Chart_20200812162407.js | 772 + .../charts/d3/d3Chart_20200812162410.js | 772 + .../charts/d3/d3Chart_20200812162414.js | 772 + .../charts/d3/d3Chart_20200812162416.js | 772 + .../charts/d3/d3Chart_20200812162426.js | 774 + .../charts/d3/d3Chart_20200812162428.js | 774 + .../charts/d3/d3Chart_20200812162429.js | 774 + .../charts/d3/d3Chart_20200812162431.js | 774 + .../charts/d3/d3Chart_20200812162754.js | 774 + .../charts/d3/d3Chart_20200812162756.js | 774 + .../charts/d3/d3Chart_20200812162800.js | 774 + .../charts/d3/d3Chart_20200812162903.js | 774 + .../charts/d3/d3Chart_20200812162904.js | 774 + .../charts/d3/d3Chart_20200812162907.js | 774 + .../charts/d3/d3Chart_20200812162911.js | 774 + .../charts/d3/d3Chart_20200812162914.js | 774 + .../charts/d3/d3Chart_20200812162916.js | 774 + .../charts/d3/d3Chart_20200812163012.js | 774 + .../charts/d3/d3Chart_20200812163018.js | 774 + .../charts/d3/d3Chart_20200812163028.js | 774 + .../charts/d3/d3Chart_20200812163031.js | 774 + .../charts/d3/d3Chart_20200812163034.js | 774 + .../charts/d3/d3Chart_20200812163038.js | 774 + .../charts/d3/d3Chart_20200812163041.js | 774 + .../charts/d3/d3Chart_20200812163042.js | 774 + .../charts/d3/d3Chart_20200812163044.js | 774 + .../charts/d3/d3Chart_20200812163049.js | 774 + .../charts/d3/d3Chart_20200812163052.js | 774 + .../charts/d3/d3Chart_20200812163151.js | 774 + .../charts/d3/d3Chart_20200812163206.js | 774 + .../charts/d3/d3Chart_20200812163220.js | 774 + .../charts/d3/d3Chart_20200812163526.js | 774 + .../charts/d3/d3Chart_20200812163628.js | 772 + .../charts/d3/d3Chart_20200812163633.js | 764 + .../charts/d3/d3Chart_20200812163634.js | 761 + .../charts/d3/d3Chart_20200812163636.js | 760 + .../charts/d3/d3Chart_20200812163642.js | 774 + .../charts/d3/d3Chart_20200812163647.js | 765 + .../charts/d3/d3Chart_20200812163651.js | 765 + .../charts/d3/d3Chart_20200812163926.js | 765 + .../charts/d3/d3Chart_20200812164034.js | 765 + .../charts/d3/d3Chart_20200812164038.js | 765 + .../charts/d3/d3Chart_20200812164112.js | 765 + .../charts/d3/d3Chart_20200812164201.js | 765 + .../charts/d3/d3Chart_20200812164342.js | 765 + .../charts/d3/d3Chart_20200812164346.js | 765 + .../charts/d3/d3Chart_20200812164808.js | 766 + .../charts/d3/d3Chart_20200812164816.js | 766 + .../charts/d3/d3Chart_20200812164818.js | 766 + .../charts/d3/d3Chart_20200812164828.js | 766 + .../charts/d3/d3Chart_20200812164843.js | 766 + .../charts/d3/d3Chart_20200812164848.js | 768 + .../charts/d3/d3Chart_20200812164853.js | 768 + .../charts/d3/d3Chart_20200812164900.js | 772 + .../charts/d3/d3Chart_20200812164905.js | 772 + .../charts/d3/d3Chart_20200812164906.js | 772 + .../charts/d3/d3Chart_20200812164909.js | 772 + .../charts/d3/d3Chart_20200812164910.js | 772 + .../charts/d3/d3Chart_20200812164918.js | 768 + .../charts/d3/d3Chart_20200812164922.js | 768 + .../charts/d3/d3Chart_20200812164924.js | 768 + .../charts/d3/d3Chart_20200812164925.js | 768 + .../charts/d3/d3Chart_20200812164928.js | 768 + .../charts/d3/d3Chart_20200812164946.js | 769 + .../charts/d3/d3Chart_20200812165255.js | 769 + .../charts/d3/d3Chart_20200812165258.js | 769 + .../charts/d3/d3Chart_20200812165403.js | 767 + .../charts/d3/d3Chart_20200812165607.js | 767 + .../charts/d3/d3Util_20200812135814.js | 341 + .../charts/d3/d3Util_20200812163439.js | 341 + .../charts/d3/d3Util_20200812163442.js | 341 + .../charts/d3/d3Util_20200812163450.js | 341 + .../charts/d3/d3Util_20200812163454.js | 341 + .../charts/d3/d3Util_20200812163725.js | 341 + .../common/leftMenu_20200915192236.vue | 746 + .../common/leftMenu_20200916094704.vue | 746 + .../common/leftMenu_20200916094813.vue | 746 + .../common/leftMenu_20200916095123.vue | 751 + .../common/leftMenu_20200916095129.vue | 751 + .../common/leftMenu_20200916095131.vue | 751 + .../common/leftMenu_20200916095134.vue | 751 + .../common/leftMenu_20200916095136.vue | 751 + .../common/leftMenu_20200916095139.vue | 751 + .../common/leftMenu_20200916095141.vue | 751 + .../common/leftMenu_20200916095151.vue | 751 + .../common/leftMenu_20200916095156.vue | 751 + .../common/leftMenu_20200916095202.vue | 751 + .../common/leftMenu_20200916095205.vue | 751 + .../common/leftMenu_20200916095211.vue | 751 + .../common/leftMenu_20200916095214.vue | 751 + .../common/leftMenu_20200916095353.vue | 750 + .../common/leftMenu_20200916095941.vue | 751 + .../common/leftMenu_20200916095943.vue | 751 + .../common/leftMenu_20200916095947.vue | 751 + .../common/leftMenu_20200916100004.vue | 751 + .../common/leftMenu_20200916100006.vue | 751 + .../common/leftMenu_20200916100007.vue | 751 + .../common/leftMenu_20200916100014.vue | 751 + .../common/leftMenu_20200916100015.vue | 751 + .../common/leftMenu_20200916100210.vue | 751 + .../common/leftMenu_20200916100228.vue | 752 + .../common/leftMenu_20200916100233.vue | 752 + .../common/leftMenu_20200916100234.vue | 752 + .../common/leftMenu_20200916100237.vue | 752 + .../common/leftMenu_20200916100240.vue | 752 + .../common/leftMenu_20200916100241.vue | 752 + .../common/leftMenu_20200916100243.vue | 752 + .../common/leftMenu_20200916100422.vue | 752 + .../common/leftMenu_20200916100606.vue | 752 + .../asset/assetAddUnit_20200109174241.vue | 1479 ++ .../asset/assetAddUnit_20200110100141.vue | 1479 ++ .../page/asset/asset_20200915191245.vue | 793 + .../page/asset/asset_20200916095227.vue | 792 + .../explore/editor_20200609191454.vue | 72 + .../explore/editor_20200609191738.vue | 54 + .../explore/editor_20200609191743.vue | 52 + .../explore/editor_20200609191745.vue | 52 + .../explore/editor_20200609191751.vue | 51 + .../explore/editor_20200609191754.vue | 50 + .../explore/editor_20200609191806.vue | 50 + .../explore/editor_20200609191810.vue | 50 + .../explore/editor_20200609191811.vue | 50 + .../explore/editor_20200609191813.vue | 50 + .../explore/editor_20200609191814.vue | 50 + .../explore/editor_20200609191815.vue | 50 + .../explore/editor_20200609191824.vue | 56 + .../explore/editor_20200609191843.vue | 56 + .../explore/editor_20200609191846.vue | 57 + .../explore/editor_20200609191856.vue | 57 + .../explore/editor_20200609191859.vue | 57 + .../explore/editor_20200609191912.vue | 51 + .../explore/editor_20200609191914.vue | 51 + .../explore/editor_20200609191918.vue | 51 + .../explore/editor_20200609191921.vue | 51 + .../explore/editor_20200609192625.vue | 51 + .../explore/editor_20200609192834.vue | 50 + .../explore/editor_20200609192842.vue | 50 + .../explore/editor_20200609192844.vue | 49 + .../explore/editor_20200609192851.vue | 50 + .../explore/editor_20200609192855.vue | 50 + .../explore/editor_20200609192858.vue | 50 + .../explore/editor_20200609192901.vue | 50 + .../explore/editor_20200609192904.vue | 50 + .../explore/editor_20200609192912.vue | 50 + .../explore/editor_20200609192937.vue | 50 + .../explore/editor_20200609192939.vue | 52 + .../explore/editor_20200609192944.vue | 52 + .../explore/editor_20200609192947.vue | 52 + .../explore/editor_20200609192950.vue | 52 + .../explore/editor_20200609192952.vue | 52 + .../explore/editor_20200609192958.vue | 54 + .../explore/editor_20200609193000.vue | 54 + .../explore/editor_20200609193043.vue | 54 + .../explore/editor_20200609193046.vue | 54 + .../explore/editor_20200609193135.vue | 54 + .../explore/editor_20200609193147.vue | 54 + .../explore/editor_20200609193151.vue | 54 + .../explore/editor_20200609193154.vue | 54 + .../explore/editor_20200609193155.vue | 54 + .../explore/editor_20200609193226.vue | 54 + .../explore/editor_20200609193234.vue | 54 + .../explore/editor_20200609193235.vue | 54 + .../explore/editor_20200609193244.vue | 55 + .../explore/editor_20200609193250.vue | 55 + .../explore/editor_20200609193254.vue | 55 + .../explore/editor_20200609193338.vue | 55 + .../explore/editor_20200609193343.vue | 55 + .../explore/editor_20200609193344.vue | 55 + .../explore/editor_20200609193350.vue | 55 + .../explore/editor_20200609193352.vue | 55 + .../explore/editor_20200609193354.vue | 55 + .../explore/editor_20200609193355.vue | 55 + .../explore/editor_20200609193357.vue | 55 + .../explore/editor_20200609193358.vue | 55 + .../explore/editor_20200609193400.vue | 57 + .../explore/editor_20200609193405.vue | 57 + .../explore/editor_20200609193408.vue | 57 + .../explore/editor_20200609193410.vue | 57 + .../explore/editor_20200609193413.vue | 57 + .../explore/editor_20200609193416.vue | 57 + .../explore/editor_20200609193438.vue | 57 + .../explore/editor_20200609193443.vue | 57 + .../explore/editor_20200609193448.vue | 57 + .../explore/editor_20200609193451.vue | 57 + .../explore/editor_20200609193452.vue | 57 + .../explore/editor_20200609193455.vue | 57 + .../explore/editor_20200609193515.vue | 58 + .../explore/editor_20200609193520.vue | 58 + .../explore/editor_20200609193521.vue | 58 + .../explore/editor_20200609193548.vue | 58 + .../explore/editor_20200609193616.vue | 57 + .../explore/editor_20200609193618.vue | 58 + .../explore/editor_20200609193622.vue | 58 + .../explore/editor_20200609193627.vue | 58 + .../explore/editor_20200609193707.vue | 58 + .../explore/editor_20200609193709.vue | 58 + .../explore/editor_20200609193744.vue | 59 + .../explore/editor_20200609193750.vue | 59 + .../explore/editor_20200609193753.vue | 59 + .../explore/editor_20200609193754.vue | 59 + .../explore/editor_20200609194242.vue | 59 + .../explore/editor_20200609194244.vue | 59 + .../explore/editor_20200622181933.vue | 854 + .../explore/editor_20200622182033.vue | 841 + .idea/.gitignore | 2 + .idea/misc.xml | 6 + .idea/modules.xml | 8 + .idea/nezha-fronted.iml | 8 + .idea/vcs.xml | 6 + .../src/components/common/exportXLSX.vue | 4 + .../src/components/common/leftMenu.vue | 104 +- .../src/components/page/asset/asset.vue | 40 +- .../src/components/page/config/util.vue | 60 + .../src/components/page/dashboard/panel.vue | 20 +- .../static/ueditor-1.4.3.3/.editorconfig | 16 + .../static/ueditor-1.4.3.3/.gitignore | 192 + .../static/ueditor-1.4.3.3/Gruntfile.js | 272 + nezha-fronted/static/ueditor-1.4.3.3/LICENSE | 20 + .../static/ueditor-1.4.3.3/README.md | 90 + .../_examples/addCustomizeButton.js | 38 + .../_examples/addCustomizeCombox.js | 69 + .../_examples/addCustomizeDialog.js | 49 + .../ueditor-1.4.3.3/_examples/charts.html | 71 + .../_examples/completeDemo.html | 175 + .../_examples/customPluginDemo.html | 54 + .../_examples/customToolbarDemo.html | 105 + .../_examples/customizeDialogPage.html | 25 + .../_examples/customizeToolbarUIDemo.html | 43 + .../ueditor-1.4.3.3/_examples/editor_api.js | 129 + .../_examples/filterRuleDemo.html | 151 + .../_examples/highlightDemo.html | 39 + .../ueditor-1.4.3.3/_examples/index.html | 118 + .../_examples/jqueryCompleteDemo.html | 43 + .../_examples/jqueryValidation.html | 63 + .../ueditor-1.4.3.3/_examples/multiDemo.html | 43 + .../_examples/multiEditorWithOneInstance.html | 60 + .../_examples/renderInTable.html | 26 + .../ueditor-1.4.3.3/_examples/resetDemo.html | 52 + .../_examples/sectiondemo.html | 181 + .../_examples/server/getContent.ashx | 44 + .../_examples/server/getContent.asp | 15 + .../_examples/server/getContent.jsp | 19 + .../_examples/server/getContent.php | 19 + .../_examples/setWidthHeightDemo.html | 43 + .../ueditor-1.4.3.3/_examples/simpleDemo.html | 36 + .../_examples/sortableDemo.html | 86 + .../_examples/submitFormDemo.html | 54 + .../_examples/textareaDemo.html | 34 + .../ueditor-1.4.3.3/_examples/uparsedemo.html | 204 + .../ueditor-1.4.3.3/_parse/background.js | 16 + .../static/ueditor-1.4.3.3/_parse/charts.js | 337 + .../ueditor-1.4.3.3/_parse/insertcode.js | 42 + .../static/ueditor-1.4.3.3/_parse/list.js | 94 + .../static/ueditor-1.4.3.3/_parse/parse.js | 327 + .../static/ueditor-1.4.3.3/_parse/table.js | 161 + .../static/ueditor-1.4.3.3/_parse/video.js | 34 + .../ueditor-1.4.3.3/_src/adapter/autosave.js | 18 + .../ueditor-1.4.3.3/_src/adapter/editor.js | 858 + .../ueditor-1.4.3.3/_src/adapter/editorui.js | 854 + .../ueditor-1.4.3.3/_src/adapter/message.js | 58 + .../static/ueditor-1.4.3.3/_src/api.js | 62 + .../_src/core/Editor.defaultoptions.js | 31 + .../ueditor-1.4.3.3/_src/core/Editor.js | 1527 ++ .../ueditor-1.4.3.3/_src/core/EventBase.js | 167 + .../static/ueditor-1.4.3.3/_src/core/Range.js | 1845 ++ .../ueditor-1.4.3.3/_src/core/Selection.js | 389 + .../static/ueditor-1.4.3.3/_src/core/ajax.js | 262 + .../ueditor-1.4.3.3/_src/core/browser.js | 258 + .../ueditor-1.4.3.3/_src/core/domUtils.js | 2413 +++ .../static/ueditor-1.4.3.3/_src/core/dtd.js | 179 + .../ueditor-1.4.3.3/_src/core/filternode.js | 130 + .../ueditor-1.4.3.3/_src/core/filterword.js | 189 + .../ueditor-1.4.3.3/_src/core/htmlparser.js | 197 + .../ueditor-1.4.3.3/_src/core/keymap.js | 48 + .../ueditor-1.4.3.3/_src/core/loadconfig.js | 66 + .../ueditor-1.4.3.3/_src/core/localstorage.js | 140 + .../static/ueditor-1.4.3.3/_src/core/node.js | 754 + .../ueditor-1.4.3.3/_src/core/plugin.js | 81 + .../static/ueditor-1.4.3.3/_src/core/utils.js | 1210 ++ .../static/ueditor-1.4.3.3/_src/editor.js | 21 + .../ueditor-1.4.3.3/_src/plugins/anchor.js | 85 + .../ueditor-1.4.3.3/_src/plugins/autofloat.js | 135 + .../_src/plugins/autoheight.js | 115 + .../ueditor-1.4.3.3/_src/plugins/autolink.js | 177 + .../ueditor-1.4.3.3/_src/plugins/autosave.js | 129 + .../_src/plugins/autosubmit.js | 39 + .../_src/plugins/autotypeset.js | 321 + .../_src/plugins/autoupload.js | 179 + .../_src/plugins/background.js | 107 + .../ueditor-1.4.3.3/_src/plugins/basestyle.js | 148 + .../_src/plugins/blockquote.js | 172 + .../_src/plugins/catchremoteimage.js | 106 + .../ueditor-1.4.3.3/_src/plugins/charts.js | 142 + .../ueditor-1.4.3.3/_src/plugins/cleardoc.js | 37 + .../_src/plugins/contextmenu.js | 496 + .../_src/plugins/convertcase.js | 56 + .../ueditor-1.4.3.3/_src/plugins/copy.js | 69 + .../_src/plugins/customstyle.js | 146 + .../_src/plugins/defaultfilter.js | 228 + .../_src/plugins/directionality.js | 121 + .../ueditor-1.4.3.3/_src/plugins/dragdrop.js | 56 + .../_src/plugins/elementpath.js | 43 + .../ueditor-1.4.3.3/_src/plugins/enterkey.js | 175 + .../_src/plugins/fiximgclick.js | 315 + .../ueditor-1.4.3.3/_src/plugins/font.js | 524 + .../_src/plugins/formatmatch.js | 137 + .../_src/plugins/horizontal.js | 104 + .../ueditor-1.4.3.3/_src/plugins/iframe.js | 19 + .../ueditor-1.4.3.3/_src/plugins/image.js | 273 + .../ueditor-1.4.3.3/_src/plugins/indent.js | 27 + .../_src/plugins/insertcode.js | 540 + .../_src/plugins/insertfile.js | 69 + .../_src/plugins/inserthtml.js | 255 + .../_src/plugins/insertparagraph.js | 44 + .../ueditor-1.4.3.3/_src/plugins/justify.js | 114 + .../_src/plugins/keystrokes.js | 214 + .../_src/plugins/lineheight.js | 48 + .../ueditor-1.4.3.3/_src/plugins/link.js | 174 + .../ueditor-1.4.3.3/_src/plugins/list.js | 1246 ++ .../ueditor-1.4.3.3/_src/plugins/music.js | 79 + .../ueditor-1.4.3.3/_src/plugins/pagebreak.js | 160 + .../ueditor-1.4.3.3/_src/plugins/paragraph.js | 170 + .../ueditor-1.4.3.3/_src/plugins/paste.js | 305 + .../ueditor-1.4.3.3/_src/plugins/preview.js | 28 + .../ueditor-1.4.3.3/_src/plugins/print.js | 23 + .../_src/plugins/puretxtpaste.js | 98 + .../_src/plugins/removeformat.js | 182 + .../_src/plugins/rowspacing.js | 46 + .../ueditor-1.4.3.3/_src/plugins/scrawl.js | 10 + .../_src/plugins/searchreplace.js | 193 + .../ueditor-1.4.3.3/_src/plugins/section.js | 269 + .../ueditor-1.4.3.3/_src/plugins/selectall.js | 42 + .../_src/plugins/serverparam.js | 107 + .../_src/plugins/shortcutmenu.js | 79 + .../_src/plugins/simpleupload.js | 172 + .../_src/plugins/snapscreen.js | 101 + .../ueditor-1.4.3.3/_src/plugins/source.js | 300 + .../_src/plugins/table.action.js | 1875 ++ .../_src/plugins/table.cmds.js | 936 + .../_src/plugins/table.core.js | 1140 ++ .../_src/plugins/table.sort.js | 165 + .../ueditor-1.4.3.3/_src/plugins/template.js | 39 + .../ueditor-1.4.3.3/_src/plugins/time.js | 50 + .../ueditor-1.4.3.3/_src/plugins/undo.js | 298 + .../ueditor-1.4.3.3/_src/plugins/video.js | 161 + .../ueditor-1.4.3.3/_src/plugins/webapp.js | 167 + .../ueditor-1.4.3.3/_src/plugins/wordcount.js | 33 + .../ueditor-1.4.3.3/_src/plugins/wordimage.js | 53 + .../ueditor-1.4.3.3/_src/plugins/xssFilter.js | 79 + .../_src/ui/autotypesetbutton.js | 138 + .../_src/ui/autotypesetpicker.js | 66 + .../ueditor-1.4.3.3/_src/ui/breakline.js | 19 + .../static/ueditor-1.4.3.3/_src/ui/button.js | 69 + .../_src/ui/cellalignpicker.js | 96 + .../ueditor-1.4.3.3/_src/ui/colorbutton.js | 60 + .../ueditor-1.4.3.3/_src/ui/colorpicker.js | 74 + .../static/ueditor-1.4.3.3/_src/ui/combox.js | 96 + .../static/ueditor-1.4.3.3/_src/ui/dialog.js | 415 + .../static/ueditor-1.4.3.3/_src/ui/mask.js | 53 + .../static/ueditor-1.4.3.3/_src/ui/menu.js | 276 + .../ueditor-1.4.3.3/_src/ui/menubutton.js | 40 + .../static/ueditor-1.4.3.3/_src/ui/message.js | 77 + .../ueditor-1.4.3.3/_src/ui/multiMenu.js | 39 + .../ueditor-1.4.3.3/_src/ui/pastepicker.js | 66 + .../static/ueditor-1.4.3.3/_src/ui/popup.js | 257 + .../ueditor-1.4.3.3/_src/ui/separator.js | 19 + .../ueditor-1.4.3.3/_src/ui/shortcutmenu.js | 232 + .../ueditor-1.4.3.3/_src/ui/splitbutton.js | 87 + .../ueditor-1.4.3.3/_src/ui/stateful.js | 108 + .../ueditor-1.4.3.3/_src/ui/tablebutton.js | 37 + .../ueditor-1.4.3.3/_src/ui/tablepicker.js | 83 + .../static/ueditor-1.4.3.3/_src/ui/toolbar.js | 49 + .../static/ueditor-1.4.3.3/_src/ui/ui.js | 3 + .../static/ueditor-1.4.3.3/_src/ui/uibase.js | 83 + .../static/ueditor-1.4.3.3/_src/ui/uiutils.js | 257 + .../ueditor-1.4.3.3/_test/core/Editor.js | 862 + .../ueditor-1.4.3.3/_test/core/EventBase.js | 194 + .../ueditor-1.4.3.3/_test/core/Range.js | 1582 ++ .../ueditor-1.4.3.3/_test/core/Selection.js | 199 + .../static/ueditor-1.4.3.3/_test/core/ajax.js | 271 + .../ueditor-1.4.3.3/_test/core/ajax.php | 57 + .../ueditor-1.4.3.3/_test/core/browser.js | 72 + .../ueditor-1.4.3.3/_test/core/domUtils.js | 1718 ++ .../ueditor-1.4.3.3/_test/core/filternode.js | 178 + .../ueditor-1.4.3.3/_test/core/filterword.js | 41 + .../ueditor-1.4.3.3/_test/core/htmlparser.js | 209 + .../_test/core/localstorage.js | 46 + .../static/ueditor-1.4.3.3/_test/core/node.js | 218 + .../ueditor-1.4.3.3/_test/core/plugin.js | 30 + .../ueditor-1.4.3.3/_test/core/tools.js | 50 + .../ueditor-1.4.3.3/_test/core/utils.js | 547 + .../ueditor-1.4.3.3/_test/coverage/api.js | 43 + .../_test/coverage/commands.js | 43 + .../_test/coverage/core/Editor.js | 1492 ++ .../_test/coverage/core/EventBase.js | 143 + .../_test/coverage/core/Range.js | 1888 ++ .../_test/coverage/core/Selection.js | 606 + .../_test/coverage/core/ajax.js | 203 + .../_test/coverage/core/browser.js | 135 + .../_test/coverage/core/domUtils.js | 1846 ++ .../_test/coverage/core/dtd.js | 73 + .../_test/coverage/core/filternode.js | 275 + .../_test/coverage/core/filterword.js | 266 + .../_test/coverage/core/htmlparser.js | 267 + .../_test/coverage/core/node.js | 874 + .../_test/coverage/core/utils.js | 888 + .../_test/coverage/customEvent.js | 43 + .../ueditor-1.4.3.3/_test/coverage/editor.js | 73 + .../_test/coverage/jscoverage-highlight.css | 38 + .../_test/coverage/jscoverage-ie.css | 108 + .../_test/coverage/jscoverage-throbber.gif | Bin 0 -> 425 bytes .../_test/coverage/jscoverage.css | 355 + .../_test/coverage/jscoverage.html | 164 + .../_test/coverage/jscoverage.js | 1176 ++ .../_test/coverage/plugins/anchor.js | 146 + .../_test/coverage/plugins/autofloat.js | 290 + .../_test/coverage/plugins/autoheight.js | 224 + .../_test/coverage/plugins/autolink.js | 246 + .../_test/coverage/plugins/autosubmit.js | 77 + .../_test/coverage/plugins/autotypeset.js | 434 + .../_test/coverage/plugins/background.js | 92 + .../_test/coverage/plugins/basestyle.js | 159 + .../_test/coverage/plugins/blockquote.js | 287 + .../coverage/plugins/catchremoteimage.js | 192 + .../_test/coverage/plugins/cleardoc.js | 75 + .../_test/coverage/plugins/contextmenu.js | 413 + .../_test/coverage/plugins/convertcase.js | 91 + .../_test/coverage/plugins/customstyle.js | 293 + .../_test/coverage/plugins/defaultfilter.js | 388 + .../_test/coverage/plugins/directionality.js | 199 + .../_test/coverage/plugins/dragdrop.js | 158 + .../_test/coverage/plugins/elementpath.js | 120 + .../_test/coverage/plugins/enterkey.js | 352 + .../_test/coverage/plugins/fiximgclick.js | 68 + .../_test/coverage/plugins/font.js | 646 + .../_test/coverage/plugins/formatmatch.js | 237 + .../_test/coverage/plugins/horizontal.js | 149 + .../_test/coverage/plugins/iframe.js | 64 + .../_test/coverage/plugins/image.js | 354 + .../_test/coverage/plugins/indent.js | 60 + .../_test/coverage/plugins/insertcode.js | 1066 + .../_test/coverage/plugins/inserthtml.js | 504 + .../_test/coverage/plugins/insertparagraph.js | 92 + .../_test/coverage/plugins/justify.js | 186 + .../_test/coverage/plugins/keystrokes.js | 465 + .../_test/coverage/plugins/lineheight.js | 80 + .../_test/coverage/plugins/link.js | 266 + .../_test/coverage/plugins/list.js | 2337 +++ .../_test/coverage/plugins/music.js | 135 + .../_test/coverage/plugins/pagebreak.js | 303 + .../_test/coverage/plugins/paragraph.js | 290 + .../_test/coverage/plugins/paste.js | 574 + .../_test/coverage/plugins/preview.js | 59 + .../_test/coverage/plugins/print.js | 50 + .../_test/coverage/plugins/puretxtpaste.js | 144 + .../_test/coverage/plugins/removeformat.js | 318 + .../_test/coverage/plugins/rowspacing.js | 83 + .../_test/coverage/plugins/scrawl.js | 50 + .../_test/coverage/plugins/searchreplace.js | 405 + .../_test/coverage/plugins/selectall.js | 80 + .../_test/coverage/plugins/shortcutmenu.js | 145 + .../_test/coverage/plugins/snapscreen.js | 173 + .../_test/coverage/plugins/source.js | 476 + .../_test/coverage/plugins/table.action.js | 3173 +++ .../_test/coverage/plugins/table.cmds.js | 1622 ++ .../_test/coverage/plugins/table.core.js | 2011 ++ .../_test/coverage/plugins/template.js | 108 + .../_test/coverage/plugins/time.js | 53 + .../_test/coverage/plugins/undo.js | 568 + .../_test/coverage/plugins/video.js | 138 + .../_test/coverage/plugins/webapp.js | 119 + .../_test/coverage/plugins/wordcount.js | 90 + .../_test/coverage/plugins/wordimage.js | 113 + .../_test/coverage/ui/autotypesetbutton.js | 207 + .../_test/coverage/ui/autotypesetpicker.js | 80 + .../_test/coverage/ui/breakline.js | 71 + .../_test/coverage/ui/button.js | 92 + .../_test/coverage/ui/cellalignpicker.js | 134 + .../_test/coverage/ui/colorbutton.js | 117 + .../_test/coverage/ui/colorpicker.js | 136 + .../_test/coverage/ui/combox.js | 198 + .../_test/coverage/ui/dialog.js | 535 + .../_test/coverage/ui/editor.js | 1531 ++ .../_test/coverage/ui/editorui.js | 1302 ++ .../ueditor-1.4.3.3/_test/coverage/ui/mask.js | 127 + .../ueditor-1.4.3.3/_test/coverage/ui/menu.js | 541 + .../_test/coverage/ui/menubutton.js | 104 + .../_test/coverage/ui/multiMenu.js | 94 + .../_test/coverage/ui/pastepicker.js | 125 + .../_test/coverage/ui/popup.js | 433 + .../_test/coverage/ui/separator.js | 71 + .../_test/coverage/ui/shortcutmenu.js | 462 + .../_test/coverage/ui/splitbutton.js | 170 + .../_test/coverage/ui/stateful.js | 214 + .../_test/coverage/ui/tablebutton.js | 85 + .../_test/coverage/ui/tablepicker.js | 160 + .../_test/coverage/ui/toolbar.js | 106 + .../ueditor-1.4.3.3/_test/coverage/ui/ui.js | 52 + .../_test/coverage/ui/uibase.js | 190 + .../_test/coverage/ui/uiutils.js | 567 + .../ueditor-1.4.3.3/_test/editor_config.js | 276 + .../_test/editor_config_src.js | 285 + .../static/ueditor-1.4.3.3/_test/import.js | 119 + .../static/ueditor-1.4.3.3/_test/index.php | 3 + .../ueditor-1.4.3.3/_test/plugins/anchor.js | 91 + .../ueditor-1.4.3.3/_test/plugins/auto.js | 21 + .../_test/plugins/autofloat.js | 47 + .../_test/plugins/autoheight.js | 28 + .../ueditor-1.4.3.3/_test/plugins/autolink.js | 364 + .../ueditor-1.4.3.3/_test/plugins/autosave.js | 104 + .../_test/plugins/autotypeset.js | 228 + .../_test/plugins/autoupload.js | 16 + .../_test/plugins/background.js | 53 + .../_test/plugins/basestyle.js | 315 + .../_test/plugins/blockquote.js | 165 + .../_test/plugins/catchremoteimage.js | 45 + .../ueditor-1.4.3.3/_test/plugins/charts.js | 105 + .../ueditor-1.4.3.3/_test/plugins/cleardoc.js | 125 + .../_test/plugins/contextmenu.js | 311 + .../_test/plugins/convertcase.js | 197 + .../ueditor-1.4.3.3/_test/plugins/copy.js | 50 + .../_test/plugins/customstyle.js | 451 + .../_test/plugins/defaultfilter.js | 241 + .../_test/plugins/directionality.js | 149 + .../ueditor-1.4.3.3/_test/plugins/dragdrop.js | 37 + .../_test/plugins/elementpath.js | 263 + .../ueditor-1.4.3.3/_test/plugins/enterkey.js | 634 + .../_test/plugins/fiximgclick.js | 117 + .../ueditor-1.4.3.3/_test/plugins/font.js | 506 + .../_test/plugins/formatmatch.js | 373 + .../_test/plugins/horizontal.js | 142 + .../ueditor-1.4.3.3/_test/plugins/iframe.js | 30 + .../ueditor-1.4.3.3/_test/plugins/image.js | 204 + .../ueditor-1.4.3.3/_test/plugins/indent.js | 233 + .../_test/plugins/insertcode.js | 283 + .../_test/plugins/inserthtml.js | 179 + .../_test/plugins/insertparagraph.js | 15 + .../ueditor-1.4.3.3/_test/plugins/justify.js | 88 + .../_test/plugins/keystrokes.js | 277 + .../_test/plugins/lineheight.js | 164 + .../ueditor-1.4.3.3/_test/plugins/link.js | 216 + .../ueditor-1.4.3.3/_test/plugins/list.js | 961 + .../ueditor-1.4.3.3/_test/plugins/music.js | 17 + .../_test/plugins/pagebreak.js | 148 + .../_test/plugins/paragraph.js | 107 + .../ueditor-1.4.3.3/_test/plugins/paste.js | 78 + .../ueditor-1.4.3.3/_test/plugins/preview.js | 22 + .../ueditor-1.4.3.3/_test/plugins/print.js | 17 + .../_test/plugins/removeformat.js | 97 + .../_test/plugins/rowspacing.js | 312 + .../ueditor-1.4.3.3/_test/plugins/scrawl.js | 18 + .../_test/plugins/searchreplace.js | 122 + .../ueditor-1.4.3.3/_test/plugins/section.js | 65 + .../_test/plugins/selectall.js | 76 + .../_test/plugins/serverparam.js | 17 + .../_test/plugins/shortcutkeys.js | 139 + .../_test/plugins/shortcutmenu.js | 86 + .../_test/plugins/snapscreen.js | 41 + .../ueditor-1.4.3.3/_test/plugins/source.js | 381 + .../_test/plugins/table.action.js | 1007 + .../_test/plugins/table.cmds.js | 1519 ++ .../_test/plugins/table.core.js | 345 + .../_test/plugins/table.sort.js | 258 + .../ueditor-1.4.3.3/_test/plugins/template.js | 24 + .../ueditor-1.4.3.3/_test/plugins/time.js | 76 + .../ueditor-1.4.3.3/_test/plugins/tools.js | 59 + .../_test/plugins/ueditor.config.js | 20 + .../ueditor-1.4.3.3/_test/plugins/undo.js | 496 + .../ueditor-1.4.3.3/_test/plugins/video.js | 64 + .../ueditor-1.4.3.3/_test/plugins/webapp.js | 46 + .../_test/plugins/wordcount.js | 50 + .../_test/plugins/wordimage.js | 57 + .../_test/qunit/jquery-1.5.1.js | 8316 ++++++++ .../ueditor-1.4.3.3/_test/qunit/qunit.css | 205 + .../ueditor-1.4.3.3/_test/qunit/qunit.js | 1417 ++ .../ueditor-1.4.3.3/_test/qunit/tools.js | 127 + ...accbef76094b364e2cfddaa1cc7cd98d109d49.jpg | Bin 0 -> 251128 bytes .../testDesign/Manual regression cases.xmind | Bin 0 -> 2297095 bytes .../_test/testDesign/VersionUpdate/readme.txt | 1 + .../VersionUpdate/test list for 1.3.0.xmind | Bin 0 -> 2621258 bytes .../VersionUpdate/test list for 1.3.6.xmind | Bin 0 -> 83728 bytes .../VersionUpdate/test list for 1.4.0.xmind | Bin 0 -> 175738 bytes .../VersionUpdate/test list for 1.4.3.xmind | Bin 0 -> 70010 bytes .../demo_1.3.0/IEAutolinkFalse_demo.html | 175 + .../_test/testDesign/demo_1.3.0/uparse.html | 179 + .../testDesign/demo_1.3.6/Demo_3831.html | 175 + .../demo_1.3.6/Demo_contentchange.html | 178 + .../testDesign/demo_1.4.0/uparsedemo.html | 51 + .../_test/testDesign/offical site.xmind | Bin 0 -> 161615 bytes .../_test/tools/br/analysis.php | 112 + .../_test/tools/br/batchrun.sh | 10 + .../_test/tools/br/case.class.php | 242 + .../ueditor-1.4.3.3/_test/tools/br/config.php | 83 + .../_test/tools/br/coverage/jscov.php | 61 + .../br/coverage/jscoverage-highlight.css | 38 + .../_test/tools/br/coverage/jscoverage-ie.css | 108 + .../tools/br/coverage/jscoverage-throbber.gif | Bin 0 -> 425 bytes .../_test/tools/br/coverage/jscoverage.css | 355 + .../_test/tools/br/coverage/jscoverage.html | 168 + .../_test/tools/br/coverage/jscoverage.js | 1176 ++ .../_test/tools/br/coverage/readCoverage.js | 98 + .../_test/tools/br/css/bg_button_a.gif | Bin 0 -> 577 bytes .../_test/tools/br/css/bg_button_span.gif | Bin 0 -> 1419 bytes .../_test/tools/br/css/qunit.css | 215 + .../_test/tools/br/css/tangramtest.css | 173 + .../_test/tools/br/css/testsuite.css | 119 + .../_test/tools/br/filehelper.php | 57 + .../_test/tools/br/geneHTML.php | 209 + .../_test/tools/br/geneHistory.php | 19 + .../_test/tools/br/geneXML.php | 82 + .../ueditor-1.4.3.3/_test/tools/br/import.php | 71 + .../_test/tools/br/js/UserAction manual.rar | Bin 0 -> 93842 bytes .../_test/tools/br/js/UserAction.js | 1888 ++ .../_test/tools/br/js/ext_qunit.js | 35 + .../_test/tools/br/js/jquery-1.5.1.js | 8316 ++++++++ .../ueditor-1.4.3.3/_test/tools/br/js/run.js | 287 + .../_test/tools/br/js/tangram.js | 11132 ++++++++++ .../_test/tools/br/js/testrunner.js | 1099 + .../_test/tools/br/js/tools.js | 108 + .../_test/tools/br/lib/Staf.php | 58 + .../_test/tools/br/lib/StafResult.php | 20 + .../ueditor-1.4.3.3/_test/tools/br/list.php | 78 + .../ueditor-1.4.3.3/_test/tools/br/log.php | 45 + .../ueditor-1.4.3.3/_test/tools/br/mail.php | 113 + .../ueditor-1.4.3.3/_test/tools/br/read.php | 12 + .../ueditor-1.4.3.3/_test/tools/br/record.php | 95 + .../ueditor-1.4.3.3/_test/tools/br/report.php | 158 + .../ueditor-1.4.3.3/_test/tools/br/run.php | 46 + .../ueditor-1.4.3.3/_test/tools/br/runC.php | 46 + .../ueditor-1.4.3.3/_test/tools/br/runall.php | 119 + .../_test/tools/br/txt/test1_1.txt | 76 + .../_test/tools/br/txt/test1_2.txt | 38 + .../_test/tools/br/txt/test1_3.txt | 65 + .../_test/tools/br/txt/test2_1.txt | 57 + .../_test/tools/br/txt/test2_2.txt | 32 + .../_test/tools/br/txt/test2_3.txt | 156 + .../_test/tools/br/txt/test3_1.txt | 131 + .../_test/tools/coverage/cov.bat | 2 + .../_test/tools/coverage/jscoverage.exe | Bin 0 -> 1088512 bytes .../_test/tools/data/frame.html | 10 + .../_test/tools/data/frame.php | 16 + .../ueditor-1.4.3.3/_test/tools/data/test.JPG | Bin 0 -> 7964 bytes .../_test/tools/data/test.html | 3 + .../_test/tools/data/testReady.html | 10 + .../_test/tools/lib/ant_tangram_ext.jar | Bin 0 -> 3063 bytes .../ueditor-1.4.3.3/_test/tools/lib/js.jar | Bin 0 -> 871260 bytes .../jshunter_dev/jshunter/conf/check.cfg | 117 + .../jshunter_dev/jshunter/conf/custcheck.conf | 1 + .../jshunter_dev/jshunter/conf/ignore.list | 14 + .../jshunter_dev/jshunter/conf/omitfiles.conf | 4 + .../jshunter/core/customcheck/cust.sh | 3 + .../jshunter_dev/jshunter/core/jshint/js.jar | Bin 0 -> 756883 bytes .../jshunter/core/jshint/jshint-rhino.js | 89 + .../jshunter/core/tpl/htmlpart.html | 15 + .../jshunter/core/tpl/toggle_tpl.html | 324 + .../jshunter_dev/jshunter/hint.py | 425 + .../jshunter_dev/jshunter/jshint.js | 4278 ++++ .../jshunter_dev/jshunter/version | 22 + .../_test/tools/lib/jslint4java-2.0.2.jar | Bin 0 -> 1270598 bytes .../_test/tools/lib/jslint4java-ant-1.4.2.jar | Bin 0 -> 18281 bytes .../_test/tools/lib/npPlugintest.dll | Bin 0 -> 1179136 bytes .../_test/ui/autotypesetbutton.js | 53 + .../static/ueditor-1.4.3.3/_test/ui/button.js | 94 + .../ueditor-1.4.3.3/_test/ui/colorbutton.js | 79 + .../static/ueditor-1.4.3.3/_test/ui/combox.js | 73 + .../ueditor-1.4.3.3/_test/ui/css/DEFAULT.css | 12 + .../static/ueditor-1.4.3.3/_test/ui/editor.js | 188 + .../ueditor-1.4.3.3/_test/ui/editorui.js | 11 + .../static/ueditor-1.4.3.3/_test/ui/mask.js | 11 + .../static/ueditor-1.4.3.3/_test/ui/menu.js | 327 + .../ueditor-1.4.3.3/_test/ui/menubutton.js | 73 + .../static/ueditor-1.4.3.3/_test/ui/popup.js | 84 + .../ueditor-1.4.3.3/_test/ui/separator.js | 11 + .../ueditor-1.4.3.3/_test/ui/splitbutton.js | 68 + .../ueditor-1.4.3.3/_test/ui/stateful.js | 11 + .../ueditor-1.4.3.3/_test/ui/tablebutton.js | 59 + .../ueditor-1.4.3.3/_test/ui/toolbar.js | 225 + .../static/ueditor-1.4.3.3/_test/ui/tools.js | 65 + .../static/ueditor-1.4.3.3/_test/ui/uibase.js | 11 + .../ueditor-1.4.3.3/_test/ui/uiutils.js | 11 + .../static/ueditor-1.4.3.3/_test/关键字.txt | 25 + .../ueditor-1.4.3.3/asp/ASPJson.class.asp | 271 + .../asp/MultiformProcessor.class.asp | 138 + .../asp/PathFormatter.class.asp | 81 + .../static/ueditor-1.4.3.3/asp/README.md | 115 + .../ueditor-1.4.3.3/asp/Uploader.Class.asp | 264 + .../ueditor-1.4.3.3/asp/action_config.asp | 9 + .../ueditor-1.4.3.3/asp/action_crawler.asp | 32 + .../ueditor-1.4.3.3/asp/action_list.asp | 81 + .../ueditor-1.4.3.3/asp/action_upload.asp | 29 + .../static/ueditor-1.4.3.3/asp/config.json | 94 + .../ueditor-1.4.3.3/asp/config_loader.asp | 21 + .../static/ueditor-1.4.3.3/asp/controller.asp | 44 + .../static/ueditor-1.4.3.3/changelog.md | 432 + .../dialogs/anchor/anchor.html | 40 + .../dialogs/attachment/attachment.css | 681 + .../dialogs/attachment/attachment.html | 60 + .../dialogs/attachment/attachment.js | 754 + .../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 .../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 .../dialogs/background/background.css | 94 + .../dialogs/background/background.html | 56 + .../dialogs/background/background.js | 376 + .../dialogs/background/images/bg.png | Bin 0 -> 2810 bytes .../dialogs/background/images/success.png | Bin 0 -> 1621 bytes .../dialogs/charts/chart.config.js | 65 + .../ueditor-1.4.3.3/dialogs/charts/charts.css | 165 + .../dialogs/charts/charts.html | 89 + .../ueditor-1.4.3.3/dialogs/charts/charts.js | 519 + .../dialogs/charts/images/charts0.png | Bin 0 -> 25306 bytes .../dialogs/charts/images/charts1.png | Bin 0 -> 19263 bytes .../dialogs/charts/images/charts2.png | Bin 0 -> 23016 bytes .../dialogs/charts/images/charts3.png | Bin 0 -> 7823 bytes .../dialogs/charts/images/charts4.png | Bin 0 -> 8344 bytes .../dialogs/charts/images/charts5.png | Bin 0 -> 47084 bytes .../dialogs/emotion/emotion.css | 43 + .../dialogs/emotion/emotion.html | 54 + .../dialogs/emotion/emotion.js | 186 + .../dialogs/emotion/images/0.gif | Bin 0 -> 43 bytes .../dialogs/emotion/images/bface.gif | Bin 0 -> 27167 bytes .../dialogs/emotion/images/cface.gif | Bin 0 -> 8603 bytes .../dialogs/emotion/images/fface.gif | Bin 0 -> 18479 bytes .../dialogs/emotion/images/jxface2.gif | Bin 0 -> 40706 bytes .../emotion/images/neweditor-tab-bg.png | Bin 0 -> 216 bytes .../dialogs/emotion/images/tface.gif | Bin 0 -> 19805 bytes .../dialogs/emotion/images/wface.gif | Bin 0 -> 49850 bytes .../dialogs/emotion/images/yface.gif | Bin 0 -> 28409 bytes .../ueditor-1.4.3.3/dialogs/gmap/gmap.html | 89 + .../ueditor-1.4.3.3/dialogs/help/help.css | 7 + .../ueditor-1.4.3.3/dialogs/help/help.html | 82 + .../ueditor-1.4.3.3/dialogs/help/help.js | 56 + .../ueditor-1.4.3.3/dialogs/image/image.css | 894 + .../ueditor-1.4.3.3/dialogs/image/image.html | 120 + .../ueditor-1.4.3.3/dialogs/image/image.js | 1142 ++ .../dialogs/image/images/alignicon.jpg | Bin 0 -> 16101 bytes .../dialogs/image/images/bg.png | Bin 0 -> 2810 bytes .../dialogs/image/images/icons.gif | Bin 0 -> 453 bytes .../dialogs/image/images/icons.png | Bin 0 -> 2678 bytes .../dialogs/image/images/image.png | Bin 0 -> 1672 bytes .../dialogs/image/images/progress.png | Bin 0 -> 1269 bytes .../dialogs/image/images/success.gif | Bin 0 -> 445 bytes .../dialogs/image/images/success.png | Bin 0 -> 1621 bytes .../dialogs/insertframe/insertframe.html | 98 + .../ueditor-1.4.3.3/dialogs/internal.js | 81 + .../ueditor-1.4.3.3/dialogs/link/link.html | 126 + .../ueditor-1.4.3.3/dialogs/map/map.html | 135 + .../ueditor-1.4.3.3/dialogs/map/show.html | 118 + .../ueditor-1.4.3.3/dialogs/music/music.css | 30 + .../ueditor-1.4.3.3/dialogs/music/music.html | 32 + .../ueditor-1.4.3.3/dialogs/music/music.js | 192 + .../dialogs/preview/preview.html | 40 + .../dialogs/scrawl/images/addimg.png | Bin 0 -> 628 bytes .../dialogs/scrawl/images/brush.png | Bin 0 -> 608 bytes .../dialogs/scrawl/images/delimg.png | Bin 0 -> 516 bytes .../dialogs/scrawl/images/delimgH.png | Bin 0 -> 578 bytes .../dialogs/scrawl/images/empty.png | Bin 0 -> 519 bytes .../dialogs/scrawl/images/emptyH.png | Bin 0 -> 657 bytes .../dialogs/scrawl/images/eraser.png | Bin 0 -> 43271 bytes .../dialogs/scrawl/images/redo.png | Bin 0 -> 454 bytes .../dialogs/scrawl/images/redoH.png | Bin 0 -> 536 bytes .../dialogs/scrawl/images/scale.png | Bin 0 -> 435 bytes .../dialogs/scrawl/images/scaleH.png | Bin 0 -> 330 bytes .../dialogs/scrawl/images/size.png | Bin 0 -> 775 bytes .../dialogs/scrawl/images/undo.png | Bin 0 -> 444 bytes .../dialogs/scrawl/images/undoH.png | Bin 0 -> 511 bytes .../ueditor-1.4.3.3/dialogs/scrawl/scrawl.css | 72 + .../dialogs/scrawl/scrawl.html | 95 + .../ueditor-1.4.3.3/dialogs/scrawl/scrawl.js | 671 + .../dialogs/searchreplace/searchreplace.html | 102 + .../dialogs/searchreplace/searchreplace.js | 164 + .../dialogs/snapscreen/snapscreen.html | 58 + .../dialogs/spechars/spechars.html | 21 + .../dialogs/spechars/spechars.js | 57 + .../dialogs/table/dragicon.png | Bin 0 -> 304 bytes .../dialogs/table/edittable.css | 84 + .../dialogs/table/edittable.html | 64 + .../dialogs/table/edittable.js | 237 + .../ueditor-1.4.3.3/dialogs/table/edittd.html | 61 + .../dialogs/table/edittip.html | 33 + .../dialogs/template/config.js | 42 + .../dialogs/template/images/bg.gif | Bin 0 -> 84 bytes .../dialogs/template/images/pre0.png | Bin 0 -> 250 bytes .../dialogs/template/images/pre1.png | Bin 0 -> 291 bytes .../dialogs/template/images/pre2.png | Bin 0 -> 394 bytes .../dialogs/template/images/pre3.png | Bin 0 -> 485 bytes .../dialogs/template/images/pre4.png | Bin 0 -> 393 bytes .../dialogs/template/template.css | 18 + .../dialogs/template/template.html | 26 + .../dialogs/template/template.js | 53 + .../dialogs/video/images/bg.png | Bin 0 -> 2810 bytes .../dialogs/video/images/center_focus.jpg | Bin 0 -> 11795 bytes .../dialogs/video/images/file-icons.gif | Bin 0 -> 20097 bytes .../dialogs/video/images/file-icons.png | Bin 0 -> 44070 bytes .../dialogs/video/images/icons.gif | Bin 0 -> 453 bytes .../dialogs/video/images/icons.png | Bin 0 -> 2678 bytes .../dialogs/video/images/image.png | Bin 0 -> 1672 bytes .../dialogs/video/images/left_focus.jpg | Bin 0 -> 11423 bytes .../dialogs/video/images/none_focus.jpg | Bin 0 -> 11546 bytes .../dialogs/video/images/progress.png | Bin 0 -> 1269 bytes .../dialogs/video/images/right_focus.jpg | Bin 0 -> 11334 bytes .../dialogs/video/images/success.gif | Bin 0 -> 445 bytes .../dialogs/video/images/success.png | Bin 0 -> 1621 bytes .../ueditor-1.4.3.3/dialogs/video/video.css | 635 + .../ueditor-1.4.3.3/dialogs/video/video.html | 86 + .../ueditor-1.4.3.3/dialogs/video/video.js | 791 + .../dialogs/webapp/webapp.html | 53 + .../dialogs/wordimage/fClipboard_ueditor.swf | Bin 0 -> 1908 bytes .../dialogs/wordimage/imageUploader.swf | Bin 0 -> 62857 bytes .../dialogs/wordimage/tangram.js | 1495 ++ .../dialogs/wordimage/wordimage.html | 111 + .../dialogs/wordimage/wordimage.js | 157 + .../static/ueditor-1.4.3.3/jsp/config.json | 94 + .../static/ueditor-1.4.3.3/jsp/controller.jsp | 14 + .../jsp/lib/commons-codec-1.9.jar | Bin 0 -> 263965 bytes .../jsp/lib/commons-fileupload-1.3.1.jar | Bin 0 -> 69002 bytes .../jsp/lib/commons-io-2.4.jar | Bin 0 -> 185140 bytes .../static/ueditor-1.4.3.3/jsp/lib/json.jar | Bin 0 -> 46252 bytes .../ueditor-1.4.3.3/jsp/lib/ueditor-1.1.2.jar | Bin 0 -> 30725 bytes .../src/com/baidu/ueditor/ActionEnter.java | 127 + .../src/com/baidu/ueditor/ConfigManager.java | 222 + .../jsp/src/com/baidu/ueditor/Encoder.java | 24 + .../jsp/src/com/baidu/ueditor/PathFormat.java | 157 + .../com/baidu/ueditor/define/ActionMap.java | 42 + .../com/baidu/ueditor/define/ActionState.java | 5 + .../src/com/baidu/ueditor/define/AppInfo.java | 77 + .../com/baidu/ueditor/define/BaseState.java | 90 + .../com/baidu/ueditor/define/FileType.java | 31 + .../com/baidu/ueditor/define/MIMEType.java | 20 + .../com/baidu/ueditor/define/MultiState.java | 112 + .../src/com/baidu/ueditor/define/State.java | 18 + .../com/baidu/ueditor/hunter/FileManager.java | 112 + .../com/baidu/ueditor/hunter/ImageHunter.java | 144 + .../baidu/ueditor/upload/Base64Uploader.java | 52 + .../baidu/ueditor/upload/BinaryUploader.java | 98 + .../baidu/ueditor/upload/StorageManager.java | 155 + .../com/baidu/ueditor/upload/Uploader.java | 29 + .../static/ueditor-1.4.3.3/lang/en/en.js | 684 + .../lang/en/images/addimage.png | Bin 0 -> 3373 bytes .../lang/en/images/alldeletebtnhoverskin.png | Bin 0 -> 743 bytes .../lang/en/images/alldeletebtnupskin.png | Bin 0 -> 743 bytes .../lang/en/images/background.png | Bin 0 -> 3854 bytes .../ueditor-1.4.3.3/lang/en/images/button.png | Bin 0 -> 4929 bytes .../ueditor-1.4.3.3/lang/en/images/copy.png | Bin 0 -> 1222 bytes .../lang/en/images/deletedisable.png | Bin 0 -> 649 bytes .../lang/en/images/deleteenable.png | Bin 0 -> 664 bytes .../lang/en/images/listbackground.png | Bin 0 -> 3750 bytes .../lang/en/images/localimage.png | Bin 0 -> 3083 bytes .../ueditor-1.4.3.3/lang/en/images/music.png | Bin 0 -> 91561 bytes .../lang/en/images/rotateleftdisable.png | Bin 0 -> 719 bytes .../lang/en/images/rotateleftenable.png | Bin 0 -> 952 bytes .../lang/en/images/rotaterightdisable.png | Bin 0 -> 754 bytes .../lang/en/images/rotaterightenable.png | Bin 0 -> 1007 bytes .../ueditor-1.4.3.3/lang/en/images/upload.png | Bin 0 -> 3941 bytes .../lang/zh-cn/images/copy.png | Bin 0 -> 4319 bytes .../lang/zh-cn/images/localimage.png | Bin 0 -> 6979 bytes .../lang/zh-cn/images/music.png | Bin 0 -> 23106 bytes .../lang/zh-cn/images/upload.png | Bin 0 -> 6608 bytes .../ueditor-1.4.3.3/lang/zh-cn/zh-cn.js | 669 + .../ueditor-1.4.3.3/net/App_Code/Config.cs | 55 + .../net/App_Code/ConfigHandler.cs | 17 + .../net/App_Code/CrawlerHandler.cs | 164 + .../ueditor-1.4.3.3/net/App_Code/Handler.cs | 44 + .../net/App_Code/ListFileHandler.cs | 106 + .../net/App_Code/NotSupportedHandler.cs | 23 + .../net/App_Code/PathFormater.cs | 50 + .../net/App_Code/UploadHandler.cs | 182 + .../static/ueditor-1.4.3.3/net/README.md | 141 + .../static/ueditor-1.4.3.3/net/Web.config | 9 + .../static/ueditor-1.4.3.3/net/config.json | 94 + .../ueditor-1.4.3.3/net/controller.ashx | 80 + .../static/ueditor-1.4.3.3/package.json | 36 + .../ueditor-1.4.3.3/php/Uploader.class.php | 372 + .../ueditor-1.4.3.3/php/action_crawler.php | 44 + .../ueditor-1.4.3.3/php/action_list.php | 92 + .../ueditor-1.4.3.3/php/action_upload.php | 66 + .../static/ueditor-1.4.3.3/php/config.json | 94 + .../static/ueditor-1.4.3.3/php/controller.php | 59 + .../themes/default/_css/autotypesetpicker.css | 21 + .../themes/default/_css/button.css | 42 + .../themes/default/_css/buttonicon.css | 419 + .../themes/default/_css/cellalignpicker.css | 56 + .../themes/default/_css/colorbutton.css | 9 + .../themes/default/_css/colorpicker.css | 119 + .../themes/default/_css/combox.css | 62 + .../themes/default/_css/contextmenu.css | 29 + .../themes/default/_css/dialog.css | 294 + .../themes/default/_css/editor.css | 168 + .../themes/default/_css/menu.css | 46 + .../themes/default/_css/menubutton.css | 72 + .../themes/default/_css/message.css | 66 + .../themes/default/_css/multiMenu.css | 29 + .../themes/default/_css/paragraphpicker.css | 45 + .../themes/default/_css/pastepicker.css | 72 + .../themes/default/_css/popup.css | 73 + .../themes/default/_css/separtor.css | 8 + .../themes/default/_css/shortcutmenu.css | 9 + .../themes/default/_css/splitbutton.css | 84 + .../themes/default/_css/tablepicker.css | 40 + .../themes/default/_css/toolbar.css | 18 + .../themes/default/_css/ueditor.css | 59 + .../themes/default/_css/uibase.css | 115 + .../themes/default/dialogbase.css | 100 + .../themes/default/images/anchor.gif | Bin 0 -> 184 bytes .../themes/default/images/arrow.png | Bin 0 -> 1173 bytes .../themes/default/images/arrow_down.png | Bin 0 -> 1610 bytes .../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 .../themes/default/images/charts.png | Bin 0 -> 518 bytes .../themes/default/images/cursor_h.gif | Bin 0 -> 253 bytes .../themes/default/images/cursor_h.png | Bin 0 -> 175 bytes .../themes/default/images/cursor_v.gif | Bin 0 -> 370 bytes .../themes/default/images/cursor_v.png | Bin 0 -> 177 bytes .../themes/default/images/dialog-title-bg.png | Bin 0 -> 938 bytes .../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 .../themes/default/images/icons.gif | Bin 0 -> 20947 bytes .../themes/default/images/icons.png | Bin 0 -> 19694 bytes .../themes/default/images/loaderror.png | Bin 0 -> 3209 bytes .../themes/default/images/loading.gif | Bin 0 -> 734 bytes .../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 .../themes/default/images/scale.png | Bin 0 -> 167 bytes .../themes/default/images/sortable.png | Bin 0 -> 2851 bytes .../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 .../themes/default/images/upload.png | Bin 0 -> 6608 bytes .../themes/default/images/videologo.gif | Bin 0 -> 1604 bytes .../themes/default/images/word.gif | Bin 0 -> 1019 bytes .../themes/default/images/wordpaste.png | Bin 0 -> 6467 bytes .../static/ueditor-1.4.3.3/themes/iframe.css | 1 + .../third-party/SyntaxHighlighter/shCore.js | 3655 ++++ .../SyntaxHighlighter/shCoreDefault.css | 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 + .../third-party/jquery-1.10.2.js | 9789 +++++++++ .../third-party/jquery-1.10.2.min.js | 6 + .../third-party/jquery-1.10.2.min.map | 1 + .../snapscreen/UEditorSnapscreen.exe | Bin 0 -> 519936 bytes .../third-party/video-js/font/vjs.eot | Bin 0 -> 3536 bytes .../third-party/video-js/font/vjs.svg | 65 + .../third-party/video-js/font/vjs.ttf | Bin 0 -> 3372 bytes .../third-party/video-js/font/vjs.woff | Bin 0 -> 4228 bytes .../third-party/video-js/video-js.css | 766 + .../third-party/video-js/video-js.min.css | 5 + .../third-party/video-js/video-js.swf | Bin 0 -> 16745 bytes .../third-party/video-js/video.dev.js | 7108 +++++++ .../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 | 6733 ++++++ .../webuploader/webuploader.min.js | 2 + .../webuploader/webuploader.withoutimage.js | 4593 +++++ .../webuploader.withoutimage.min.js | 2 + .../ueditor-1.4.3.3/third-party/xss.min.js | 1 + .../zeroclipboard/ZeroClipboard.js | 1256 ++ .../zeroclipboard/ZeroClipboard.min.js | 9 + .../zeroclipboard/ZeroClipboard.swf | Bin 0 -> 3933 bytes .../static/ueditor-1.4.3.3/ueditor.config.js | 497 + .../static/ueditor-1.4.3.3/ueditor.parse.js | 71 + 1096 files changed, 387528 insertions(+), 35 deletions(-) create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812160506.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161713.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161721.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161722.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161726.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161730.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161732.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161735.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161736.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161739.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161741.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161746.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161750.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161753.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161754.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161758.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161801.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161803.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161805.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161806.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161807.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161813.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161815.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161820.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161822.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161929.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161930.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161933.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161936.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161945.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161953.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162021.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162025.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162032.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162040.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162048.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162052.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162053.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162055.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162103.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162106.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162109.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162220.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162224.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162227.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162230.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162232.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162234.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162239.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162243.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162244.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162250.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162302.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162305.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162308.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162310.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162312.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162317.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162320.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162322.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162325.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162327.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162328.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162332.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162342.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162345.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162350.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162356.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162403.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162407.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162410.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162414.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162416.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162426.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162428.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162429.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162431.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162754.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162756.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162800.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162903.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162904.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162907.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162911.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162914.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162916.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163012.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163018.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163028.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163031.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163034.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163038.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163041.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163042.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163044.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163049.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163052.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163151.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163206.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163220.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163526.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163628.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163633.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163634.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163636.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163642.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163647.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163651.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163926.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164034.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164038.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164112.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164201.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164342.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164346.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164808.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164816.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164818.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164828.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164843.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164848.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164853.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164900.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164905.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164906.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164909.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164910.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164918.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164922.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164924.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164925.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164928.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164946.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812165255.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812165258.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812165403.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Chart_20200812165607.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Util_20200812135814.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Util_20200812163439.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Util_20200812163442.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Util_20200812163450.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Util_20200812163454.js create mode 100644 .history/nezha-fronted/src/components/charts/d3/d3Util_20200812163725.js create mode 100644 .history/nezha-fronted/src/components/common/leftMenu_20200915192236.vue create mode 100644 .history/nezha-fronted/src/components/common/leftMenu_20200916094704.vue create mode 100644 .history/nezha-fronted/src/components/common/leftMenu_20200916094813.vue create mode 100644 .history/nezha-fronted/src/components/common/leftMenu_20200916095123.vue create mode 100644 .history/nezha-fronted/src/components/common/leftMenu_20200916095129.vue create mode 100644 .history/nezha-fronted/src/components/common/leftMenu_20200916095131.vue create mode 100644 .history/nezha-fronted/src/components/common/leftMenu_20200916095134.vue create mode 100644 .history/nezha-fronted/src/components/common/leftMenu_20200916095136.vue create mode 100644 .history/nezha-fronted/src/components/common/leftMenu_20200916095139.vue create mode 100644 .history/nezha-fronted/src/components/common/leftMenu_20200916095141.vue create mode 100644 .history/nezha-fronted/src/components/common/leftMenu_20200916095151.vue create mode 100644 .history/nezha-fronted/src/components/common/leftMenu_20200916095156.vue create mode 100644 .history/nezha-fronted/src/components/common/leftMenu_20200916095202.vue create mode 100644 .history/nezha-fronted/src/components/common/leftMenu_20200916095205.vue create mode 100644 .history/nezha-fronted/src/components/common/leftMenu_20200916095211.vue create mode 100644 .history/nezha-fronted/src/components/common/leftMenu_20200916095214.vue create mode 100644 .history/nezha-fronted/src/components/common/leftMenu_20200916095353.vue create mode 100644 .history/nezha-fronted/src/components/common/leftMenu_20200916095941.vue create mode 100644 .history/nezha-fronted/src/components/common/leftMenu_20200916095943.vue create mode 100644 .history/nezha-fronted/src/components/common/leftMenu_20200916095947.vue create mode 100644 .history/nezha-fronted/src/components/common/leftMenu_20200916100004.vue create mode 100644 .history/nezha-fronted/src/components/common/leftMenu_20200916100006.vue create mode 100644 .history/nezha-fronted/src/components/common/leftMenu_20200916100007.vue create mode 100644 .history/nezha-fronted/src/components/common/leftMenu_20200916100014.vue create mode 100644 .history/nezha-fronted/src/components/common/leftMenu_20200916100015.vue create mode 100644 .history/nezha-fronted/src/components/common/leftMenu_20200916100210.vue create mode 100644 .history/nezha-fronted/src/components/common/leftMenu_20200916100228.vue create mode 100644 .history/nezha-fronted/src/components/common/leftMenu_20200916100233.vue create mode 100644 .history/nezha-fronted/src/components/common/leftMenu_20200916100234.vue create mode 100644 .history/nezha-fronted/src/components/common/leftMenu_20200916100237.vue create mode 100644 .history/nezha-fronted/src/components/common/leftMenu_20200916100240.vue create mode 100644 .history/nezha-fronted/src/components/common/leftMenu_20200916100241.vue create mode 100644 .history/nezha-fronted/src/components/common/leftMenu_20200916100243.vue create mode 100644 .history/nezha-fronted/src/components/common/leftMenu_20200916100422.vue create mode 100644 .history/nezha-fronted/src/components/common/leftMenu_20200916100606.vue create mode 100644 .history/nezha-fronted/src/components/page/asset/assetAddUnit_20200109174241.vue create mode 100644 .history/nezha-fronted/src/components/page/asset/assetAddUnit_20200110100141.vue create mode 100644 .history/nezha-fronted/src/components/page/asset/asset_20200915191245.vue create mode 100644 .history/nezha-fronted/src/components/page/asset/asset_20200916095227.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191454.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191738.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191743.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191745.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191751.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191754.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191806.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191810.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191811.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191813.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191814.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191815.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191824.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191843.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191846.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191856.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191859.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191912.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191914.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191918.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191921.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192625.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192834.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192842.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192844.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192851.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192855.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192858.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192901.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192904.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192912.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192937.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192939.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192944.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192947.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192950.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192952.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192958.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193000.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193043.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193046.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193135.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193147.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193151.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193154.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193155.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193226.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193234.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193235.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193244.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193250.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193254.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193338.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193343.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193344.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193350.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193352.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193354.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193355.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193357.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193358.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193400.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193405.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193408.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193410.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193413.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193416.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193438.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193443.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193448.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193451.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193452.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193455.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193515.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193520.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193521.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193548.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193616.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193618.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193622.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193627.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193707.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193709.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193744.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193750.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193753.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193754.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609194242.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609194244.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200622181933.vue create mode 100644 .history/nezha-fronted/src/components/page/dashboard/explore/editor_20200622182033.vue create mode 100644 .idea/.gitignore create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/nezha-fronted.iml create mode 100644 .idea/vcs.xml create mode 100644 nezha-fronted/src/components/page/config/util.vue create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/.editorconfig create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/.gitignore create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/Gruntfile.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/LICENSE create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/README.md create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_examples/addCustomizeButton.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_examples/addCustomizeCombox.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_examples/addCustomizeDialog.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_examples/charts.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_examples/completeDemo.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_examples/customPluginDemo.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_examples/customToolbarDemo.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_examples/customizeDialogPage.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_examples/customizeToolbarUIDemo.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_examples/editor_api.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_examples/filterRuleDemo.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_examples/highlightDemo.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_examples/index.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_examples/jqueryCompleteDemo.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_examples/jqueryValidation.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_examples/multiDemo.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_examples/multiEditorWithOneInstance.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_examples/renderInTable.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_examples/resetDemo.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_examples/sectiondemo.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_examples/server/getContent.ashx create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_examples/server/getContent.asp create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_examples/server/getContent.jsp create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_examples/server/getContent.php create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_examples/setWidthHeightDemo.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_examples/simpleDemo.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_examples/sortableDemo.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_examples/submitFormDemo.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_examples/textareaDemo.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_examples/uparsedemo.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_parse/background.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_parse/charts.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_parse/insertcode.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_parse/list.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_parse/parse.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_parse/table.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_parse/video.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/adapter/autosave.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/adapter/editor.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/adapter/editorui.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/adapter/message.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/api.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/core/Editor.defaultoptions.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/core/Editor.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/core/EventBase.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/core/Range.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/core/Selection.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/core/ajax.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/core/browser.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/core/domUtils.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/core/dtd.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/core/filternode.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/core/filterword.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/core/htmlparser.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/core/keymap.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/core/loadconfig.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/core/localstorage.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/core/node.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/core/plugin.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/core/utils.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/editor.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/anchor.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/autofloat.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/autoheight.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/autolink.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/autosave.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/autosubmit.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/autotypeset.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/autoupload.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/background.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/basestyle.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/blockquote.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/catchremoteimage.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/charts.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/cleardoc.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/contextmenu.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/convertcase.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/copy.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/customstyle.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/defaultfilter.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/directionality.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/dragdrop.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/elementpath.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/enterkey.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/fiximgclick.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/font.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/formatmatch.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/horizontal.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/iframe.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/image.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/indent.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/insertcode.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/insertfile.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/inserthtml.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/insertparagraph.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/justify.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/keystrokes.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/lineheight.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/link.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/list.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/music.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/pagebreak.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/paragraph.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/paste.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/preview.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/print.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/puretxtpaste.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/removeformat.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/rowspacing.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/scrawl.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/searchreplace.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/section.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/selectall.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/serverparam.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/shortcutmenu.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/simpleupload.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/snapscreen.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/source.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/table.action.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/table.cmds.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/table.core.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/table.sort.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/template.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/time.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/undo.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/video.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/webapp.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/wordcount.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/wordimage.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/xssFilter.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/ui/autotypesetbutton.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/ui/autotypesetpicker.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/ui/breakline.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/ui/button.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/ui/cellalignpicker.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/ui/colorbutton.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/ui/colorpicker.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/ui/combox.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/ui/dialog.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/ui/mask.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/ui/menu.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/ui/menubutton.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/ui/message.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/ui/multiMenu.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/ui/pastepicker.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/ui/popup.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/ui/separator.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/ui/shortcutmenu.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/ui/splitbutton.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/ui/stateful.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/ui/tablebutton.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/ui/tablepicker.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/ui/toolbar.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/ui/ui.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/ui/uibase.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_src/ui/uiutils.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/core/Editor.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/core/EventBase.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/core/Range.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/core/Selection.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/core/ajax.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/core/ajax.php create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/core/browser.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/core/domUtils.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/core/filternode.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/core/filterword.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/core/htmlparser.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/core/localstorage.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/core/node.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/core/plugin.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/core/tools.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/core/utils.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/api.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/commands.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/core/Editor.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/core/EventBase.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/core/Range.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/core/Selection.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/core/ajax.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/core/browser.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/core/domUtils.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/core/dtd.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/core/filternode.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/core/filterword.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/core/htmlparser.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/core/node.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/core/utils.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/customEvent.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/editor.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/jscoverage-highlight.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/jscoverage-ie.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/jscoverage-throbber.gif create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/jscoverage.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/jscoverage.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/jscoverage.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/anchor.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/autofloat.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/autoheight.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/autolink.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/autosubmit.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/autotypeset.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/background.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/basestyle.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/blockquote.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/catchremoteimage.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/cleardoc.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/contextmenu.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/convertcase.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/customstyle.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/defaultfilter.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/directionality.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/dragdrop.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/elementpath.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/enterkey.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/fiximgclick.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/font.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/formatmatch.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/horizontal.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/iframe.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/image.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/indent.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/insertcode.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/inserthtml.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/insertparagraph.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/justify.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/keystrokes.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/lineheight.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/link.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/list.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/music.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/pagebreak.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/paragraph.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/paste.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/preview.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/print.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/puretxtpaste.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/removeformat.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/rowspacing.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/scrawl.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/searchreplace.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/selectall.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/shortcutmenu.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/snapscreen.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/source.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/table.action.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/table.cmds.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/table.core.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/template.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/time.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/undo.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/video.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/webapp.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/wordcount.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/wordimage.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/autotypesetbutton.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/autotypesetpicker.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/breakline.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/button.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/cellalignpicker.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/colorbutton.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/colorpicker.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/combox.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/dialog.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/editor.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/editorui.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/mask.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/menu.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/menubutton.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/multiMenu.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/pastepicker.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/popup.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/separator.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/shortcutmenu.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/splitbutton.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/stateful.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/tablebutton.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/tablepicker.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/toolbar.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/ui.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/uibase.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/uiutils.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/editor_config.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/editor_config_src.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/import.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/index.php create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/anchor.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/auto.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/autofloat.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/autoheight.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/autolink.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/autosave.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/autotypeset.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/autoupload.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/background.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/basestyle.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/blockquote.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/catchremoteimage.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/charts.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/cleardoc.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/contextmenu.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/convertcase.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/copy.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/customstyle.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/defaultfilter.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/directionality.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/dragdrop.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/elementpath.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/enterkey.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/fiximgclick.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/font.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/formatmatch.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/horizontal.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/iframe.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/image.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/indent.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/insertcode.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/inserthtml.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/insertparagraph.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/justify.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/keystrokes.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/lineheight.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/link.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/list.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/music.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/pagebreak.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/paragraph.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/paste.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/preview.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/print.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/removeformat.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/rowspacing.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/scrawl.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/searchreplace.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/section.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/selectall.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/serverparam.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/shortcutkeys.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/shortcutmenu.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/snapscreen.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/source.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/table.action.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/table.cmds.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/table.core.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/table.sort.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/template.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/time.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/tools.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/ueditor.config.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/undo.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/video.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/webapp.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/wordcount.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/wordimage.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/qunit/jquery-1.5.1.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/qunit/qunit.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/qunit/qunit.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/qunit/tools.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/testDesign/8eaccbef76094b364e2cfddaa1cc7cd98d109d49.jpg create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/testDesign/Manual regression cases.xmind create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/testDesign/VersionUpdate/readme.txt create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/testDesign/VersionUpdate/test list for 1.3.0.xmind create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/testDesign/VersionUpdate/test list for 1.3.6.xmind create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/testDesign/VersionUpdate/test list for 1.4.0.xmind create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/testDesign/VersionUpdate/test list for 1.4.3.xmind create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/testDesign/demo_1.3.0/IEAutolinkFalse_demo.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/testDesign/demo_1.3.0/uparse.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/testDesign/demo_1.3.6/Demo_3831.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/testDesign/demo_1.3.6/Demo_contentchange.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/testDesign/demo_1.4.0/uparsedemo.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/testDesign/offical site.xmind create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/analysis.php create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/batchrun.sh create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/case.class.php create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/config.php create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/coverage/jscov.php create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/coverage/jscoverage-highlight.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/coverage/jscoverage-ie.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/coverage/jscoverage-throbber.gif create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/coverage/jscoverage.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/coverage/jscoverage.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/coverage/jscoverage.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/coverage/readCoverage.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/css/bg_button_a.gif create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/css/bg_button_span.gif create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/css/qunit.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/css/tangramtest.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/css/testsuite.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/filehelper.php create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/geneHTML.php create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/geneHistory.php create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/geneXML.php create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/import.php create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/js/UserAction manual.rar create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/js/UserAction.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/js/ext_qunit.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/js/jquery-1.5.1.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/js/run.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/js/tangram.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/js/testrunner.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/js/tools.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/lib/Staf.php create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/lib/StafResult.php create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/list.php create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/log.php create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/mail.php create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/read.php create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/record.php create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/report.php create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/run.php create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/runC.php create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/runall.php create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/txt/test1_1.txt create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/txt/test1_2.txt create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/txt/test1_3.txt create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/txt/test2_1.txt create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/txt/test2_2.txt create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/txt/test2_3.txt create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/txt/test3_1.txt create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/coverage/cov.bat create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/coverage/jscoverage.exe create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/data/frame.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/data/frame.php create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/data/test.JPG create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/data/test.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/data/testReady.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/lib/ant_tangram_ext.jar create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/lib/js.jar create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/lib/jshunter_1.2.0.1/jshunter_dev/jshunter/conf/check.cfg create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/lib/jshunter_1.2.0.1/jshunter_dev/jshunter/conf/custcheck.conf create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/lib/jshunter_1.2.0.1/jshunter_dev/jshunter/conf/ignore.list create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/lib/jshunter_1.2.0.1/jshunter_dev/jshunter/conf/omitfiles.conf create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/lib/jshunter_1.2.0.1/jshunter_dev/jshunter/core/customcheck/cust.sh create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/lib/jshunter_1.2.0.1/jshunter_dev/jshunter/core/jshint/js.jar create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/lib/jshunter_1.2.0.1/jshunter_dev/jshunter/core/jshint/jshint-rhino.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/lib/jshunter_1.2.0.1/jshunter_dev/jshunter/core/tpl/htmlpart.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/lib/jshunter_1.2.0.1/jshunter_dev/jshunter/core/tpl/toggle_tpl.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/lib/jshunter_1.2.0.1/jshunter_dev/jshunter/hint.py create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/lib/jshunter_1.2.0.1/jshunter_dev/jshunter/jshint.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/lib/jshunter_1.2.0.1/jshunter_dev/jshunter/version create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/lib/jslint4java-2.0.2.jar create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/lib/jslint4java-ant-1.4.2.jar create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/tools/lib/npPlugintest.dll create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/ui/autotypesetbutton.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/ui/button.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/ui/colorbutton.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/ui/combox.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/ui/css/DEFAULT.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/ui/editor.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/ui/editorui.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/ui/mask.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/ui/menu.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/ui/menubutton.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/ui/popup.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/ui/separator.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/ui/splitbutton.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/ui/stateful.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/ui/tablebutton.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/ui/toolbar.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/ui/tools.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/ui/uibase.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/ui/uiutils.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/_test/关键字.txt create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/asp/ASPJson.class.asp create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/asp/MultiformProcessor.class.asp create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/asp/PathFormatter.class.asp create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/asp/README.md create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/asp/Uploader.Class.asp create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/asp/action_config.asp create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/asp/action_crawler.asp create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/asp/action_list.asp create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/asp/action_upload.asp create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/asp/config.json create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/asp/config_loader.asp create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/asp/controller.asp create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/changelog.md create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/anchor/anchor.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/attachment.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/attachment.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/attachment.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/fileTypeImages/icon_chm.gif create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/fileTypeImages/icon_default.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/fileTypeImages/icon_doc.gif create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/fileTypeImages/icon_exe.gif create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/fileTypeImages/icon_jpg.gif create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/fileTypeImages/icon_mp3.gif create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/fileTypeImages/icon_mv.gif create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/fileTypeImages/icon_pdf.gif create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/fileTypeImages/icon_ppt.gif create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/fileTypeImages/icon_psd.gif create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/fileTypeImages/icon_rar.gif create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/fileTypeImages/icon_txt.gif create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/fileTypeImages/icon_xls.gif create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/images/alignicon.gif create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/images/alignicon.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/images/bg.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/images/file-icons.gif create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/images/file-icons.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/images/icons.gif create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/images/icons.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/images/image.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/images/progress.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/images/success.gif create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/images/success.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/background/background.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/background/background.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/background/background.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/background/images/bg.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/background/images/success.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/charts/chart.config.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/charts/charts.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/charts/charts.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/charts/charts.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/charts/images/charts0.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/charts/images/charts1.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/charts/images/charts2.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/charts/images/charts3.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/charts/images/charts4.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/charts/images/charts5.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/emotion/emotion.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/emotion/emotion.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/emotion/emotion.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/emotion/images/0.gif create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/emotion/images/bface.gif create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/emotion/images/cface.gif create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/emotion/images/fface.gif create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/emotion/images/jxface2.gif create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/emotion/images/neweditor-tab-bg.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/emotion/images/tface.gif create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/emotion/images/wface.gif create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/emotion/images/yface.gif create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/gmap/gmap.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/help/help.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/help/help.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/help/help.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/image/image.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/image/image.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/image/image.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/image/images/alignicon.jpg create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/image/images/bg.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/image/images/icons.gif create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/image/images/icons.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/image/images/image.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/image/images/progress.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/image/images/success.gif create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/image/images/success.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/insertframe/insertframe.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/internal.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/link/link.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/map/map.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/map/show.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/music/music.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/music/music.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/music/music.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/preview/preview.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/scrawl/images/addimg.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/scrawl/images/brush.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/scrawl/images/delimg.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/scrawl/images/delimgH.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/scrawl/images/empty.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/scrawl/images/emptyH.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/scrawl/images/eraser.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/scrawl/images/redo.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/scrawl/images/redoH.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/scrawl/images/scale.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/scrawl/images/scaleH.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/scrawl/images/size.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/scrawl/images/undo.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/scrawl/images/undoH.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/scrawl/scrawl.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/scrawl/scrawl.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/scrawl/scrawl.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/searchreplace/searchreplace.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/searchreplace/searchreplace.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/snapscreen/snapscreen.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/spechars/spechars.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/spechars/spechars.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/table/dragicon.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/table/edittable.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/table/edittable.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/table/edittable.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/table/edittd.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/table/edittip.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/template/config.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/template/images/bg.gif create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/template/images/pre0.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/template/images/pre1.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/template/images/pre2.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/template/images/pre3.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/template/images/pre4.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/template/template.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/template/template.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/template/template.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/video/images/bg.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/video/images/center_focus.jpg create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/video/images/file-icons.gif create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/video/images/file-icons.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/video/images/icons.gif create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/video/images/icons.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/video/images/image.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/video/images/left_focus.jpg create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/video/images/none_focus.jpg create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/video/images/progress.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/video/images/right_focus.jpg create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/video/images/success.gif create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/video/images/success.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/video/video.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/video/video.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/video/video.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/webapp/webapp.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/wordimage/fClipboard_ueditor.swf create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/wordimage/imageUploader.swf create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/wordimage/tangram.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/wordimage/wordimage.html create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/dialogs/wordimage/wordimage.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/jsp/config.json create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/jsp/controller.jsp create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/jsp/lib/commons-codec-1.9.jar create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/jsp/lib/commons-fileupload-1.3.1.jar create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/jsp/lib/commons-io-2.4.jar create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/jsp/lib/json.jar create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/jsp/lib/ueditor-1.1.2.jar create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/ActionEnter.java create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/ConfigManager.java create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/Encoder.java create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/PathFormat.java create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/define/ActionMap.java create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/define/ActionState.java create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/define/AppInfo.java create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/define/BaseState.java create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/define/FileType.java create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/define/MIMEType.java create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/define/MultiState.java create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/define/State.java create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/hunter/FileManager.java create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/hunter/ImageHunter.java create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/upload/Base64Uploader.java create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/upload/BinaryUploader.java create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/upload/StorageManager.java create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/upload/Uploader.java create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/lang/en/en.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/lang/en/images/addimage.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/lang/en/images/alldeletebtnhoverskin.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/lang/en/images/alldeletebtnupskin.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/lang/en/images/background.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/lang/en/images/button.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/lang/en/images/copy.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/lang/en/images/deletedisable.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/lang/en/images/deleteenable.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/lang/en/images/listbackground.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/lang/en/images/localimage.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/lang/en/images/music.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/lang/en/images/rotateleftdisable.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/lang/en/images/rotateleftenable.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/lang/en/images/rotaterightdisable.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/lang/en/images/rotaterightenable.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/lang/en/images/upload.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/lang/zh-cn/images/copy.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/lang/zh-cn/images/localimage.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/lang/zh-cn/images/music.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/lang/zh-cn/images/upload.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/lang/zh-cn/zh-cn.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/net/App_Code/Config.cs create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/net/App_Code/ConfigHandler.cs create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/net/App_Code/CrawlerHandler.cs create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/net/App_Code/Handler.cs create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/net/App_Code/ListFileHandler.cs create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/net/App_Code/NotSupportedHandler.cs create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/net/App_Code/PathFormater.cs create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/net/App_Code/UploadHandler.cs create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/net/README.md create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/net/Web.config create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/net/config.json create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/net/controller.ashx create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/package.json create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/php/Uploader.class.php create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/php/action_crawler.php create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/php/action_list.php create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/php/action_upload.php create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/php/config.json create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/php/controller.php create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/autotypesetpicker.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/button.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/buttonicon.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/cellalignpicker.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/colorbutton.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/colorpicker.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/combox.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/contextmenu.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/dialog.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/editor.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/menu.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/menubutton.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/message.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/multiMenu.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/paragraphpicker.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/pastepicker.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/popup.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/separtor.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/shortcutmenu.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/splitbutton.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/tablepicker.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/toolbar.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/ueditor.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/uibase.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/dialogbase.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/anchor.gif create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/arrow.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/arrow_down.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/arrow_up.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/button-bg.gif create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/cancelbutton.gif create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/charts.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/cursor_h.gif create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/cursor_h.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/cursor_v.gif create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/cursor_v.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/dialog-title-bg.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/filescan.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/highlighted.gif create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/icons-all.gif create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/icons.gif create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/icons.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/loaderror.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/loading.gif create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/lock.gif create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/neweditor-tab-bg.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/pagebreak.gif create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/scale.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/sortable.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/spacer.gif create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/sparator_v.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/table-cell-align.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/tangram-colorpicker.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/toolbar_bg.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/unhighlighted.gif create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/upload.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/videologo.gif create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/word.gif create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/wordpaste.png create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/themes/iframe.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/SyntaxHighlighter/shCore.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/SyntaxHighlighter/shCoreDefault.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/codemirror/codemirror.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/codemirror/codemirror.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/highcharts/adapters/mootools-adapter.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/highcharts/adapters/mootools-adapter.src.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/highcharts/adapters/prototype-adapter.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/highcharts/adapters/prototype-adapter.src.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/highcharts/adapters/standalone-framework.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/highcharts/adapters/standalone-framework.src.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/highcharts/highcharts-more.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/highcharts/highcharts-more.src.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/highcharts/highcharts.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/highcharts/highcharts.src.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/highcharts/modules/annotations.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/highcharts/modules/annotations.src.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/highcharts/modules/canvas-tools.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/highcharts/modules/canvas-tools.src.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/highcharts/modules/data.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/highcharts/modules/data.src.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/highcharts/modules/drilldown.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/highcharts/modules/drilldown.src.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/highcharts/modules/exporting.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/highcharts/modules/exporting.src.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/highcharts/modules/funnel.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/highcharts/modules/funnel.src.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/highcharts/modules/heatmap.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/highcharts/modules/heatmap.src.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/highcharts/modules/map.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/highcharts/modules/map.src.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/highcharts/modules/no-data-to-display.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/highcharts/modules/no-data-to-display.src.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/highcharts/themes/dark-blue.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/highcharts/themes/dark-green.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/highcharts/themes/gray.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/highcharts/themes/grid.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/highcharts/themes/skies.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/jquery-1.10.2.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/jquery-1.10.2.min.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/jquery-1.10.2.min.map create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/snapscreen/UEditorSnapscreen.exe create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/video-js/font/vjs.eot create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/video-js/font/vjs.svg create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/video-js/font/vjs.ttf create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/video-js/font/vjs.woff create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/video-js/video-js.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/video-js/video-js.min.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/video-js/video-js.swf create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/video-js/video.dev.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/video-js/video.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/webuploader/Uploader.swf create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/webuploader/webuploader.css create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/webuploader/webuploader.custom.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/webuploader/webuploader.custom.min.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/webuploader/webuploader.flashonly.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/webuploader/webuploader.flashonly.min.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/webuploader/webuploader.html5only.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/webuploader/webuploader.html5only.min.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/webuploader/webuploader.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/webuploader/webuploader.min.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/webuploader/webuploader.withoutimage.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/webuploader/webuploader.withoutimage.min.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/xss.min.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/zeroclipboard/ZeroClipboard.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/zeroclipboard/ZeroClipboard.min.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/third-party/zeroclipboard/ZeroClipboard.swf create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/ueditor.config.js create mode 100644 nezha-fronted/static/ueditor-1.4.3.3/ueditor.parse.js diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812160506.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812160506.js new file mode 100644 index 000000000..f1efe1217 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812160506.js @@ -0,0 +1,763 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161713.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161713.js new file mode 100644 index 000000000..b2ae30acc --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161713.js @@ -0,0 +1,763 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161721.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161721.js new file mode 100644 index 000000000..0dab9802c --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161721.js @@ -0,0 +1,765 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161722.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161722.js new file mode 100644 index 000000000..3fc61d059 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161722.js @@ -0,0 +1,766 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161726.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161726.js new file mode 100644 index 000000000..3fc61d059 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161726.js @@ -0,0 +1,766 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161730.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161730.js new file mode 100644 index 000000000..bbb3a0653 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161730.js @@ -0,0 +1,766 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + // + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161732.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161732.js new file mode 100644 index 000000000..8a9afe8ea --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161732.js @@ -0,0 +1,766 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + // + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161735.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161735.js new file mode 100644 index 000000000..6f24f3aa5 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161735.js @@ -0,0 +1,766 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //数据 + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161736.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161736.js new file mode 100644 index 000000000..f363c02c4 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161736.js @@ -0,0 +1,766 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //数据量 + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161739.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161739.js new file mode 100644 index 000000000..41c31f55a --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161739.js @@ -0,0 +1,766 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //数据量过大时, + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161741.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161741.js new file mode 100644 index 000000000..06ea19b01 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161741.js @@ -0,0 +1,766 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //数据量过大时, + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161746.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161746.js new file mode 100644 index 000000000..b428d3dd0 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161746.js @@ -0,0 +1,766 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //数据量过大时,渲染出的 + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161750.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161750.js new file mode 100644 index 000000000..ae9a2a284 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161750.js @@ -0,0 +1,766 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //数据量过大时,渲染出的元素 + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161753.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161753.js new file mode 100644 index 000000000..3a670a42d --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161753.js @@ -0,0 +1,766 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //数据量过大时,渲染出的元素width + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161754.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161754.js new file mode 100644 index 000000000..3cb02e299 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161754.js @@ -0,0 +1,766 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //数据量过大时,渲染出的元素width会 + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161758.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161758.js new file mode 100644 index 000000000..86a0bf494 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161758.js @@ -0,0 +1,766 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //数据量过大时,渲染出的元素width会为0, + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161801.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161801.js new file mode 100644 index 000000000..94faac03b --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161801.js @@ -0,0 +1,766 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //数据量过大时,渲染出的元素width会为0, + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161803.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161803.js new file mode 100644 index 000000000..6d29dcbcd --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161803.js @@ -0,0 +1,766 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //数据量过大时,渲染出的元素width会为0,导致无法 + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161805.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161805.js new file mode 100644 index 000000000..5dc29a0eb --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161805.js @@ -0,0 +1,766 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //数据量过大时,渲染出的元素width会为0,导致无法显示, + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161806.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161806.js new file mode 100644 index 000000000..f9771454d --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161806.js @@ -0,0 +1,766 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161807.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161807.js new file mode 100644 index 000000000..65fb74af0 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161807.js @@ -0,0 +1,767 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161813.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161813.js new file mode 100644 index 000000000..dbdd6fac6 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161813.js @@ -0,0 +1,766 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161815.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161815.js new file mode 100644 index 000000000..0cc895296 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161815.js @@ -0,0 +1,767 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161820.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161820.js new file mode 100644 index 000000000..8c4777075 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161820.js @@ -0,0 +1,767 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161822.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161822.js new file mode 100644 index 000000000..9dfd11638 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161822.js @@ -0,0 +1,767 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161929.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161929.js new file mode 100644 index 000000000..de09ca440 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161929.js @@ -0,0 +1,767 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + // + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161930.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161930.js new file mode 100644 index 000000000..5de5dadcd --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161930.js @@ -0,0 +1,767 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以 + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161933.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161933.js new file mode 100644 index 000000000..a4f64a445 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161933.js @@ -0,0 +1,767 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小 + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161936.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161936.js new file mode 100644 index 000000000..a4f64a445 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161936.js @@ -0,0 +1,767 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小 + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161945.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161945.js new file mode 100644 index 000000000..40efaa9a8 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161945.js @@ -0,0 +1,767 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算 + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161953.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161953.js new file mode 100644 index 000000000..c347d414f --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812161953.js @@ -0,0 +1,768 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算 + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162021.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162021.js new file mode 100644 index 000000000..32b744ee9 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162021.js @@ -0,0 +1,768 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算 + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162025.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162025.js new file mode 100644 index 000000000..6dddc61e0 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162025.js @@ -0,0 +1,768 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算 + let + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162032.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162032.js new file mode 100644 index 000000000..388ac3501 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162032.js @@ -0,0 +1,768 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算 + let svgWidth= + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162040.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162040.js new file mode 100644 index 000000000..5827864d3 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162040.js @@ -0,0 +1,768 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算 + let svgWidth=this.svg.node(). + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162048.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162048.js new file mode 100644 index 000000000..26fa7f2eb --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162048.js @@ -0,0 +1,768 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算 + let svgWidth=this.svg.node().client + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162052.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162052.js new file mode 100644 index 000000000..377bb3368 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162052.js @@ -0,0 +1,768 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算 + let svgWidth=this.svg.node().clientWidth; + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162053.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162053.js new file mode 100644 index 000000000..3ffe784cc --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162053.js @@ -0,0 +1,769 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算 + let svgWidth=this.svg.node().clientWidth; + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162055.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162055.js new file mode 100644 index 000000000..71d59e9bd --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162055.js @@ -0,0 +1,770 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算 + let svgWidth=this.svg.node().clientWidth; + + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162103.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162103.js new file mode 100644 index 000000000..daf9dd068 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162103.js @@ -0,0 +1,770 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算, + let svgWidth=this.svg.node().clientWidth; + + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162106.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162106.js new file mode 100644 index 000000000..65a454081 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162106.js @@ -0,0 +1,770 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据 + let svgWidth=this.svg.node().clientWidth; + + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162109.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162109.js new file mode 100644 index 000000000..94c3570a7 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162109.js @@ -0,0 +1,770 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应 + let svgWidth=this.svg.node().clientWidth; + + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162220.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162220.js new file mode 100644 index 000000000..12fdc5542 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162220.js @@ -0,0 +1,770 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1 + let svgWidth=this.svg.node().clientWidth; + + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162224.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162224.js new file mode 100644 index 000000000..e06ab458a --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162224.js @@ -0,0 +1,770 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1* + let svgWidth=this.svg.node().clientWidth; + + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162227.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162227.js new file mode 100644 index 000000000..e8781470c --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162227.js @@ -0,0 +1,770 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas. + let svgWidth=this.svg.node().clientWidth; + + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162230.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162230.js new file mode 100644 index 000000000..2acb1ff48 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162230.js @@ -0,0 +1,770 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[] + let svgWidth=this.svg.node().clientWidth; + + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162232.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162232.js new file mode 100644 index 000000000..e3c04c183 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162232.js @@ -0,0 +1,770 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0] + let svgWidth=this.svg.node().clientWidth; + + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162234.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162234.js new file mode 100644 index 000000000..c64f8256e --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162234.js @@ -0,0 +1,770 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let svgWidth=this.svg.node().clientWidth; + + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162239.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162239.js new file mode 100644 index 000000000..4c1946cb2 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162239.js @@ -0,0 +1,770 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let svgWidth=this.svg.node().clientWidth; + + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162243.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162243.js new file mode 100644 index 000000000..4c1946cb2 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162243.js @@ -0,0 +1,770 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let svgWidth=this.svg.node().clientWidth; + + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162244.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162244.js new file mode 100644 index 000000000..cd05cc1d1 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162244.js @@ -0,0 +1,770 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let svgWidth=this.svg.node().clientWidth; + let + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162250.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162250.js new file mode 100644 index 000000000..cd05cc1d1 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162250.js @@ -0,0 +1,770 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let svgWidth=this.svg.node().clientWidth; + let + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162302.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162302.js new file mode 100644 index 000000000..cd05cc1d1 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162302.js @@ -0,0 +1,770 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let svgWidth=this.svg.node().clientWidth; + let + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162305.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162305.js new file mode 100644 index 000000000..5afa9469f --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162305.js @@ -0,0 +1,770 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let svgWidth=this.svg.node().clientWidth; + let par + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162308.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162308.js new file mode 100644 index 000000000..5afa9469f --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162308.js @@ -0,0 +1,770 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let svgWidth=this.svg.node().clientWidth; + let par + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162310.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162310.js new file mode 100644 index 000000000..4529c55da --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162310.js @@ -0,0 +1,770 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let svgWidth=this.svg.node().clientWidth; + let parent + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162312.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162312.js new file mode 100644 index 000000000..c025ee677 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162312.js @@ -0,0 +1,770 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let svgWidth=this.svg.node().clientWidth; + let parentRect + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162317.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162317.js new file mode 100644 index 000000000..41acd94cf --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162317.js @@ -0,0 +1,770 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let svgWidth=this.svg.node().clientWidth; + let parentRectWidth=this. + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162320.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162320.js new file mode 100644 index 000000000..38cd67fb9 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162320.js @@ -0,0 +1,770 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let svgWidth=this.svg.node().clientWidth; + let parentRectWidth= + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162322.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162322.js new file mode 100644 index 000000000..c48a8d629 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162322.js @@ -0,0 +1,770 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let svgWidth=this.svg.node().clientWidth; + let parentRectWidth=0.1 + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162325.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162325.js new file mode 100644 index 000000000..9a8ceab8f --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162325.js @@ -0,0 +1,770 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let svgWidth=this.svg.node().clientWidth; + let parentRectWidth=0.1*this.datas + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162327.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162327.js new file mode 100644 index 000000000..163a44bac --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162327.js @@ -0,0 +1,770 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let svgWidth=this.svg.node().clientWidth; + let parentRectWidth=0.1*this.datas[] + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162328.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162328.js new file mode 100644 index 000000000..a91217860 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162328.js @@ -0,0 +1,770 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let svgWidth=this.svg.node().clientWidth; + let parentRectWidth=0.1*this.datas[0] + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162332.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162332.js new file mode 100644 index 000000000..4a4923b59 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162332.js @@ -0,0 +1,772 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let svgWidth=this.svg.node().clientWidth; + let parentRectWidth=0.1*this.datas[0].length; + + + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162342.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162342.js new file mode 100644 index 000000000..0c48e6267 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162342.js @@ -0,0 +1,772 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let svgWidth=this.svg.node().clientWidth; + let parentRectWidth=0.1*this.datas[0].length; + + let + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162345.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162345.js new file mode 100644 index 000000000..0c48e6267 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162345.js @@ -0,0 +1,772 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let svgWidth=this.svg.node().clientWidth; + let parentRectWidth=0.1*this.datas[0].length; + + let + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162350.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162350.js new file mode 100644 index 000000000..6fa43de04 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162350.js @@ -0,0 +1,772 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let svgWidth=this.svg.node().clientWidth; + let parentRectWidth=0.1*this.datas[0].length; + + let rect + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162356.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162356.js new file mode 100644 index 000000000..325b19c62 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162356.js @@ -0,0 +1,772 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let svgWidth=this.svg.node().clientWidth; + let parentRectWidth=0.1*this.datas[0].length; + + let rectNum=Number() + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162403.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162403.js new file mode 100644 index 000000000..a7ec21687 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162403.js @@ -0,0 +1,772 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let svgWidth=this.svg.node().clientWidth; + let parentRectWidth=0.1*this.datas[0].length; + + let rectNum=Number.parseInt() + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162407.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162407.js new file mode 100644 index 000000000..030992367 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162407.js @@ -0,0 +1,772 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let svgWidth=this.svg.node().clientWidth; + let parentRectWidth=0.1*this.datas[0].length; + + let rectNum=Number.parseInt(svg) + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162410.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162410.js new file mode 100644 index 000000000..780a5ce2c --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162410.js @@ -0,0 +1,772 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let svgWidth=this.svg.node().clientWidth; + let parentRectWidth=0.1*this.datas[0].length; + + let rectNum=Number.parseInt(svgWidth/) + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162414.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162414.js new file mode 100644 index 000000000..74a90cece --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162414.js @@ -0,0 +1,772 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let svgWidth=this.svg.node().clientWidth; + let parentRectWidth=0.1*this.datas[0].length; + + let rectNum=Number.parseInt(svgWidth/parentRectWidth) + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162416.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162416.js new file mode 100644 index 000000000..19b5b68dc --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162416.js @@ -0,0 +1,772 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let svgWidth=this.svg.node().clientWidth; + let parentRectWidth=0.1*this.datas[0].length; + + let rectNum=Number.parseInt(svgWidth/parentRectWidth); + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162426.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162426.js new file mode 100644 index 000000000..c7bc1a2fd --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162426.js @@ -0,0 +1,774 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let svgWidth=this.svg.node().clientWidth; + let parentRectWidth=0.1*this.datas[0].length; + + let rectNum=Number.parseInt(svgWidth/parentRectWidth); + + console.log('rect ') + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162428.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162428.js new file mode 100644 index 000000000..1348be0c4 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162428.js @@ -0,0 +1,774 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let svgWidth=this.svg.node().clientWidth; + let parentRectWidth=0.1*this.datas[0].length; + + let rectNum=Number.parseInt(svgWidth/parentRectWidth); + + console.log('rect num') + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162429.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162429.js new file mode 100644 index 000000000..02a6bbd98 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162429.js @@ -0,0 +1,774 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let svgWidth=this.svg.node().clientWidth; + let parentRectWidth=0.1*this.datas[0].length; + + let rectNum=Number.parseInt(svgWidth/parentRectWidth); + + console.log('rect number') + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162431.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162431.js new file mode 100644 index 000000000..3674821a4 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162431.js @@ -0,0 +1,774 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let svgWidth=this.svg.node().clientWidth; + let parentRectWidth=0.1*this.datas[0].length; + + let rectNum=Number.parseInt(svgWidth/parentRectWidth); + + console.log('rect number',rectNum) + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162754.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162754.js new file mode 100644 index 000000000..36bb6c7ef --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162754.js @@ -0,0 +1,774 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let svgWidth=this.svg.node().clientWidth; + let parentRectWidth=0.1*this.datas[0].length; + + let rectNum=Number.parseInt(svgWidth/parentRectWidth); + + console.log('rect number',rectNum,'data number') + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162756.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162756.js new file mode 100644 index 000000000..d5606bc30 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162756.js @@ -0,0 +1,774 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let svgWidth=this.svg.node().clientWidth; + let parentRectWidth=0.1*this.datas[0].length; + + let rectNum=Number.parseInt(svgWidth/parentRectWidth); + + console.log('rect number',rectNum,'data number',th) + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162800.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162800.js new file mode 100644 index 000000000..e26d7a340 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162800.js @@ -0,0 +1,774 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let svgWidth=this.svg.node().clientWidth; + let parentRectWidth=0.1*this.datas[0].length; + + let rectNum=Number.parseInt(svgWidth/parentRectWidth); + + console.log('rect number',rectNum,'data number',this.datas.length) + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162903.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162903.js new file mode 100644 index 000000000..1dfdd7f7d --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162903.js @@ -0,0 +1,774 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let svgWidth=this.svg.node().clientWidth; + let parentRectWidth=0.1*this.datas[0].length; + + let rectNum=Number.parseInt(svgWidth/parentRectWidth); + + console.log(,'rect number',rectNum,'data number',this.datas.length) + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162904.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162904.js new file mode 100644 index 000000000..6dbb8b4b4 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162904.js @@ -0,0 +1,774 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let svgWidth=this.svg.node().clientWidth; + let parentRectWidth=0.1*this.datas[0].length; + + let rectNum=Number.parseInt(svgWidth/parentRectWidth); + + console.log('','rect number',rectNum,'data number',this.datas.length) + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162907.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162907.js new file mode 100644 index 000000000..3abeaf9d5 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162907.js @@ -0,0 +1,774 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let svgWidth=this.svg.node().clientWidth; + let parentRectWidth=0.1*this.datas[0].length; + + let rectNum=Number.parseInt(svgWidth/parentRectWidth); + + console.log('parent','rect number',rectNum,'data number',this.datas.length) + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162911.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162911.js new file mode 100644 index 000000000..93f1a6251 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162911.js @@ -0,0 +1,774 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let svgWidth=this.svg.node().clientWidth; + let parentRectWidth=0.1*this.datas[0].length; + + let rectNum=Number.parseInt(svgWidth/parentRectWidth); + + console.log('parentRectWidth','rect number',rectNum,'data number',this.datas.length) + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162914.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162914.js new file mode 100644 index 000000000..756901dc3 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162914.js @@ -0,0 +1,774 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let svgWidth=this.svg.node().clientWidth; + let parentRectWidth=0.1*this.datas[0].length; + + let rectNum=Number.parseInt(svgWidth/parentRectWidth); + + console.log('parentRectWidth',pare'rect number',rectNum,'data number',this.datas.length) + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162916.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162916.js new file mode 100644 index 000000000..03196151f --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812162916.js @@ -0,0 +1,774 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let svgWidth=this.svg.node().clientWidth; + let parentRectWidth=0.1*this.datas[0].length; + + let rectNum=Number.parseInt(svgWidth/parentRectWidth); + + console.log('parentRectWidth',parentRectWidth,'rect number',rectNum,'data number',this.datas.length) + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163012.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163012.js new file mode 100644 index 000000000..1316ce0a8 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163012.js @@ -0,0 +1,774 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let drawWidth=this.svg.node().clientWidth; + let parentRectWidth=0.1*this.datas[0].length; + + let rectNum=Number.parseInt(svgWidth/parentRectWidth); + + console.log('parentRectWidth',parentRectWidth,'rect number',rectNum,'data number',this.datas.length) + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163018.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163018.js new file mode 100644 index 000000000..7d5db6eea --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163018.js @@ -0,0 +1,774 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let drawWidth=this. + let parentRectWidth=0.1*this.datas[0].length; + + let rectNum=Number.parseInt(svgWidth/parentRectWidth); + + console.log('parentRectWidth',parentRectWidth,'rect number',rectNum,'data number',this.datas.length) + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163028.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163028.js new file mode 100644 index 000000000..c0d230e9f --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163028.js @@ -0,0 +1,774 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let drawWidth=this.options.width - this.options. + let parentRectWidth=0.1*this.datas[0].length; + + let rectNum=Number.parseInt(svgWidth/parentRectWidth); + + console.log('parentRectWidth',parentRectWidth,'rect number',rectNum,'data number',this.datas.length) + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163031.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163031.js new file mode 100644 index 000000000..4700f1ea6 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163031.js @@ -0,0 +1,774 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let drawWidth=this.options.width - this.options.padding. + let parentRectWidth=0.1*this.datas[0].length; + + let rectNum=Number.parseInt(svgWidth/parentRectWidth); + + console.log('parentRectWidth',parentRectWidth,'rect number',rectNum,'data number',this.datas.length) + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163034.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163034.js new file mode 100644 index 000000000..4ef51656f --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163034.js @@ -0,0 +1,774 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let drawWidth=this.options.width - this.options.padding.left + let parentRectWidth=0.1*this.datas[0].length; + + let rectNum=Number.parseInt(svgWidth/parentRectWidth); + + console.log('parentRectWidth',parentRectWidth,'rect number',rectNum,'data number',this.datas.length) + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163038.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163038.js new file mode 100644 index 000000000..837008b0b --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163038.js @@ -0,0 +1,774 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let drawWidth=this.options.width - this.options.padding.left - this.options. + let parentRectWidth=0.1*this.datas[0].length; + + let rectNum=Number.parseInt(svgWidth/parentRectWidth); + + console.log('parentRectWidth',parentRectWidth,'rect number',rectNum,'data number',this.datas.length) + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163041.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163041.js new file mode 100644 index 000000000..fafabf682 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163041.js @@ -0,0 +1,774 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let drawWidth=this.options.width - this.options.padding.left - this.options.padding. + let parentRectWidth=0.1*this.datas[0].length; + + let rectNum=Number.parseInt(svgWidth/parentRectWidth); + + console.log('parentRectWidth',parentRectWidth,'rect number',rectNum,'data number',this.datas.length) + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163042.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163042.js new file mode 100644 index 000000000..b59aadf80 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163042.js @@ -0,0 +1,774 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let drawWidth=this.options.width - this.options.padding.left - this.options.padding.ri + let parentRectWidth=0.1*this.datas[0].length; + + let rectNum=Number.parseInt(svgWidth/parentRectWidth); + + console.log('parentRectWidth',parentRectWidth,'rect number',rectNum,'data number',this.datas.length) + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163044.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163044.js new file mode 100644 index 000000000..8542c6535 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163044.js @@ -0,0 +1,774 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let drawWidth=this.options.width - this.options.padding.left - this.options.padding.right; + let parentRectWidth=0.1*this.datas[0].length; + + let rectNum=Number.parseInt(svgWidth/parentRectWidth); + + console.log('parentRectWidth',parentRectWidth,'rect number',rectNum,'data number',this.datas.length) + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163049.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163049.js new file mode 100644 index 000000000..d1bae27ec --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163049.js @@ -0,0 +1,774 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let drawWidth=this.options.width - this.options.padding.left - this.options.padding.right; + let parentRectWidth=0.1*this.datas[0].length; + + let rectNum=Number.parseInt(drawWidth/parentRectWidth); + + console.log('parentRectWidth',parentRectWidth,'rect number',rectNum,'data number',this.datas.length) + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163052.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163052.js new file mode 100644 index 000000000..d1bae27ec --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163052.js @@ -0,0 +1,774 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let drawWidth=this.options.width - this.options.padding.left - this.options.padding.right; + let parentRectWidth=0.1*this.datas[0].length; + + let rectNum=Number.parseInt(drawWidth/parentRectWidth); + + console.log('parentRectWidth',parentRectWidth,'rect number',rectNum,'data number',this.datas.length) + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163151.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163151.js new file mode 100644 index 000000000..88bc9b259 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163151.js @@ -0,0 +1,774 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let drawWidth=this.options.width - this.options.padding.left - this.options.padding.right; + let parentRectWidth=0.1*this.datas[0].length; + + let rectNum=Number.parseInt(drawWidth/parentRectWidth); + + console.log('parentRectWidth',parentRectWidth,'rect number',rectNum,'data number',this.datas.length) + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + // .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163206.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163206.js new file mode 100644 index 000000000..db264c8ee --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163206.js @@ -0,0 +1,774 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let drawWidth=this.options.width - this.options.padding.left - this.options.padding.right; + let parentRectWidth=0.1*this.datas[0].length; + + let rectNum=Number.parseInt(drawWidth/parentRectWidth); + + console.log('parentRectWidth',parentRectWidth,'rect number',rectNum,'data number',this.datas.length) + + + if(this.datas.length/interval>1){ + domain=domain.filter((item,index)=>{return index%interval==0}) + } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + // .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163220.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163220.js new file mode 100644 index 000000000..2243e06de --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163220.js @@ -0,0 +1,774 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let drawWidth=this.options.width - this.options.padding.left - this.options.padding.right; + let parentRectWidth=0.1*this.datas[0].length; + + let rectNum=Number.parseInt(drawWidth/parentRectWidth); + + console.log('parentRectWidth',parentRectWidth,'rect number',rectNum,'data number',this.datas.length) + + + if(this.datas.length/interval>1){ + domain=domain.filter((item,index)=>{return index%interval==0}) + } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + // .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163526.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163526.js new file mode 100644 index 000000000..932dea142 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163526.js @@ -0,0 +1,774 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let drawWidth=this.options.width - this.options.padding.left - this.options.padding.right; + let parentRectWidth=0.1*this.datas[0].length; + + let rectNum=Number.parseInt(drawWidth/parentRectWidth); + + console.log('parentRectWidth',parentRectWidth,'rect number',rectNum,'data number',this.datas.length) + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + // .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163628.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163628.js new file mode 100644 index 000000000..aa7d8923b --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163628.js @@ -0,0 +1,772 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let drawWidth=this.options.width - this.options.padding.left - this.options.padding.right; + let parentRectWidth=0.1*this.datas[0].length; + + let rectNum=Number.parseInt(drawWidth/parentRectWidth); + + console.log('parentRectWidth',parentRectWidth,'rect number',rectNum,'data number',this.datas.length) + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + // .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163633.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163633.js new file mode 100644 index 000000000..3a6636696 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163633.js @@ -0,0 +1,764 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + let domain=this.datas.map(item=>{return item[0][0]}); + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + // .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163634.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163634.js new file mode 100644 index 000000000..dcdf94b28 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163634.js @@ -0,0 +1,761 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + let domain=this.datas.map(item=>{return item[0][0]}); + + + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + // .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163636.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163636.js new file mode 100644 index 000000000..836bd0c82 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163636.js @@ -0,0 +1,760 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + let domain=this.datas.map(item=>{return item[0][0]}); + + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + // .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163642.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163642.js new file mode 100644 index 000000000..932dea142 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163642.js @@ -0,0 +1,774 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + //以每一个小rect宽度为0.1计算,一条数据对应0.1*this.datas[0].length + let drawWidth=this.options.width - this.options.padding.left - this.options.padding.right; + let parentRectWidth=0.1*this.datas[0].length; + + let rectNum=Number.parseInt(drawWidth/parentRectWidth); + + console.log('parentRectWidth',parentRectWidth,'rect number',rectNum,'data number',this.datas.length) + + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + // .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163647.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163647.js new file mode 100644 index 000000000..5062ba1fc --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163647.js @@ -0,0 +1,765 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + // .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163651.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163651.js new file mode 100644 index 000000000..99a5e6d78 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163651.js @@ -0,0 +1,765 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + // .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163926.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163926.js new file mode 100644 index 000000000..946c1e586 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812163926.js @@ -0,0 +1,765 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + // .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + // .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164034.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164034.js new file mode 100644 index 000000000..99a5e6d78 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164034.js @@ -0,0 +1,765 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + // .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 20]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164038.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164038.js new file mode 100644 index 000000000..5fb749625 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164038.js @@ -0,0 +1,765 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + // .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 30]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164112.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164112.js new file mode 100644 index 000000000..956e2a961 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164112.js @@ -0,0 +1,765 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + // .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 50]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164201.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164201.js new file mode 100644 index 000000000..674266779 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164201.js @@ -0,0 +1,765 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + // .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + // .scaleExtent([1, 50]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164342.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164342.js new file mode 100644 index 000000000..956e2a961 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164342.js @@ -0,0 +1,765 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + // .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 50]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164346.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164346.js new file mode 100644 index 000000000..6e4f82764 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164346.js @@ -0,0 +1,765 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + // .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 100]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164808.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164808.js new file mode 100644 index 000000000..53303de25 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164808.js @@ -0,0 +1,766 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + _ + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + // .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 100]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164816.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164816.js new file mode 100644 index 000000000..cbdc904d1 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164816.js @@ -0,0 +1,766 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + _timeFormate + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + // .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 100]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164818.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164818.js new file mode 100644 index 000000000..b4936c5cc --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164818.js @@ -0,0 +1,766 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + _timeFormat + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + // .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 100]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164828.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164828.js new file mode 100644 index 000000000..b4936c5cc --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164828.js @@ -0,0 +1,766 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + _timeFormat + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + // .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 100]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164843.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164843.js new file mode 100644 index 000000000..f8fd149e6 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164843.js @@ -0,0 +1,766 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + _timeFormatCheck:func + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + // .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 100]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164848.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164848.js new file mode 100644 index 000000000..6e190ec1e --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164848.js @@ -0,0 +1,768 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + _timeFormatCheck:function(){ + + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + // .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 100]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164853.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164853.js new file mode 100644 index 000000000..b2a28a274 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164853.js @@ -0,0 +1,768 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + _timeFormatCheck:function(range){ + + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + // .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 100]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164900.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164900.js new file mode 100644 index 000000000..7e0422aa8 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164900.js @@ -0,0 +1,772 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + _timeFormatCheck:function(range){ + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + // .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 100]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164905.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164905.js new file mode 100644 index 000000000..2dcca2576 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164905.js @@ -0,0 +1,772 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + _timeFormatCheck:function(range){ + if(range[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + // .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 100]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164906.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164906.js new file mode 100644 index 000000000..367301b61 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164906.js @@ -0,0 +1,772 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + _timeFormatCheck:function(range){ + if(range[1]-range[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + // .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 100]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164909.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164909.js new file mode 100644 index 000000000..b0265dd60 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164909.js @@ -0,0 +1,772 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + _timeFormatCheck:function(range){ + if(range[1]-range[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(range[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + // .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 100]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164910.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164910.js new file mode 100644 index 000000000..acfa660cf --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164910.js @@ -0,0 +1,772 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + _timeFormatCheck:function(range){ + if(range[1]-range[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(range[1]-range[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + if(t_max_min[1]-t_max_min[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(t_max_min[1]-t_max_min[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + // .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 100]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164918.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164918.js new file mode 100644 index 000000000..a88938180 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164918.js @@ -0,0 +1,768 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + _timeFormatCheck:function(range){ + if(range[1]-range[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(range[1]-range[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + // .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 100]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164922.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164922.js new file mode 100644 index 000000000..f4581426b --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164922.js @@ -0,0 +1,768 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + _timeFormatCheck:function(range){ + if(range[1]-range[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(range[1]-range[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + this._ + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + // .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 100]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164924.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164924.js new file mode 100644 index 000000000..b2acdc40b --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164924.js @@ -0,0 +1,768 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + _timeFormatCheck:function(range){ + if(range[1]-range[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(range[1]-range[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + this._timeFormatCheck() + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + // .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 100]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164925.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164925.js new file mode 100644 index 000000000..22e2861b1 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164925.js @@ -0,0 +1,768 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + _timeFormatCheck:function(range){ + if(range[1]-range[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(range[1]-range[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + this._timeFormatCheck(t) + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + // .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 100]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164928.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164928.js new file mode 100644 index 000000000..873c7974d --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164928.js @@ -0,0 +1,768 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + _timeFormatCheck:function(range){ + if(range[1]-range[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(range[1]-range[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + this._timeFormatCheck(t_max_min) + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + // .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 100]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164946.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164946.js new file mode 100644 index 000000000..bd1b9f61e --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812164946.js @@ -0,0 +1,769 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + _timeFormatCheck:function(range){ + if(range[1]-range[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d') + }else if(range[1]-range[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + this._timeFormatCheck(t_max_min) + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + this._timeFormatCheck(t_max_min) + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + // .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 100]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812165255.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812165255.js new file mode 100644 index 000000000..0b3caea06 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812165255.js @@ -0,0 +1,769 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + _timeFormatCheck:function(range){ + if(range[1]-range[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d ') + }else if(range[1]-range[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + this._timeFormatCheck(t_max_min) + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + this._timeFormatCheck(t_max_min) + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + // .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 100]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812165258.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812165258.js new file mode 100644 index 000000000..083539caf --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812165258.js @@ -0,0 +1,769 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + _timeFormatCheck:function(range){ + if(range[1]-range[0]>7*24*60*60*1000){ //时间大于7天不显示小时分钟 + this._timeFormat=d3.timeFormat('%Y-%m-%d %H') + }else if(range[1]-range[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + this._timeFormatCheck(t_max_min) + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + this._timeFormatCheck(t_max_min) + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + // .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 100]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812165403.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812165403.js new file mode 100644 index 000000000..d001a8d9a --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812165403.js @@ -0,0 +1,767 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + _timeFormatCheck:function(range){ + if(range[1]-range[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + this._timeFormatCheck(t_max_min) + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + this._timeFormatCheck(t_max_min) + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + // .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 100]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812165607.js b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812165607.js new file mode 100644 index 000000000..b00f03a23 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Chart_20200812165607.js @@ -0,0 +1,767 @@ +import * as d3 from "d3"; +import './d3Chart.scss' +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; +import i18n from "../../common/i18n"; +import chartDataFormat from "../chartDataFormat"; +import {Bar, CHART_TYPE} from "./d3Util"; +import {Line} from "./d3Util"; +import {tooltipFormatter} from "./d3Util"; +import {getUUID} from "../../common/js/common"; + +export function D3LineChart(selector,option){ + return { + options:{ + selector:selector, //选择器 + type:option.type, + toolbox:{ + show:true, + width:100, + height:25, + stack:{ + title:i18n.t('overall.toolBox.stack'), + backTitle:i18n.t('overall.toolBox.stackBack'), + show:true, + } + }, + width:option.width, + height:option.height, + timeFormat:option.timeFormat?option.timeFormat:'%Y-%m-%d', + datas:option.datas, + legends:option.legends, + title:option.title?option.title:'', + subTitle:option.subTitle?option.subTitle:'', + colors:option.colors, + padding:option.padding?option.padding:{top:40,left:40,bottom:40,right:20}, + duration:option.duration?option.duration:800, + showXAxisTick:option.showXAxisTick?option.showXAxisTick:false, + showYAxisTick:option.showYAxisTick?option.showYAxisTick:false, + tooltipFormatter:option.tooltipFormatter, + unit:option.dataFormatter?option.dataFormatter:9, + }, + + + init:function(){ + //定义画布 + if(option){ + this.initOption(); + } + this.dealData(); + this.drawChart(); + }, + createSvg:function(){ + let $self=this; + this.svg=d3.select(this.options.selector) + .append('svg') + .attr('width',this.options.width) + .attr('height',this.options.height) + .on('mouseover',function(){ + if ($self.tooltip) $self.tooltip.style('display', null); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'orange'); + $self.svg.style('cursor','crosshair') + }) + .on('mouseout', removeTooltip); + + function removeTooltip() { + if ($self.tooltip) $self.tooltip.style('display', 'none'); + if ($self.tooltipLine) $self.tooltipLine.attr('stroke', 'none'); + } + }, + drawChart(){ + this.createSvg(); + + this.drawTitle(); + + this.createDefs() + + this.creatScale(); + // if(this.type!==CHART_TYPE.BAR&&this.type!==CHART_TYPE.STACK_BAR){ + this.createXInnerBar(); + // } + + this.createYInnderBar(); + this.createXAxis(); + this.createYAxis(); + + // this.createLegends(); + if(this._type!==CHART_TYPE.BAR && this._type!==CHART_TYPE.STACK_BAR){ + this.drawLines(); + }else{ + this.drawBars(); + } + + this.createZoom() + + this.drawToolbox(); + + this.drawTooltipContainor() + + }, + initOption:function(){ + let $self=this; + if(this.options.type){ + this._type=this.options.type + }else{ + this._type =CHART_TYPE.LINE + } + + this._timeFormat=d3.timeFormat(this.options.timeFormat) + this._head_height=this.options.padding.top + this._foot_height=this.options.padding.bottom + this.currentLineNum=this.options.datas.length; + this._dataFormatter=chartDataFormat.getUnit(this.options.unit).compute; + + if(this.options.toolbox){ + this.options.toolbox=this.options.toolbox; + } + + if(!this.options.colors || this.options.colors.length{ + if(i!=0){ + let stackData=this.datas[i-1]; + d.forEach((t,j)=>{ + let pre=stackData[j] + + t[1]=t[1]+pre[1] + }) + } + }) + } + + if(this._type == CHART_TYPE.BAR ||this._type == CHART_TYPE.STACK_BAR){ + this._pastSourceData=JSON.parse(JSON.stringify(this.datas)); + this.datas=[]; + for(let i=0;i{ + return item[i] + }) + this.datas.push(data) + } + } + + if(this._type == CHART_TYPE.STACK_BAR){ + this._stackSourceData=JSON.parse(JSON.stringify(this.datas));//保存转换之前的数据 + this.datas.forEach(data=>{ + data.map((item,i)=>{ + if(i != 0){ + let before=data[i-1] + item[1]+=before[1]; + } + return item; + }) + }) + } + /*if(this.type == CHART_TYPE.BAR||this.type == CHART_TYPE.STACK_BAR){ + this.minMax=getBarDataMinMax(this.datas) + }else{ + + }*/ + this.minMax=getMinMax(this.datas); + if(this.options.padding.left < computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'')){ + this.options.padding.left = computeDistance(this._dataFormatter(this.minMax.max,null,-1,3)+'') + } + }, + drawTitle:function(){ + //添加标题 + if (this.options.title != "") { + this.svg.append("g") + .append("text") + .text(this.options.title) + .attr("class", "title") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + this._head_height += 30; + } + //添加副标题 + if (this.options.subTitle != "") { + this.svg.append("g") + .append("text") + .text(this.options.subTitle) + .attr("class", "subTitle") + .attr("x", this.options.width / 2) + .attr("y", this._head_height); + + this._head_height += 20; + } + }, + drawTooltipContainor:function(){ + this.tooltip = d3.select('body') + .append('div') + .attr('id',this.options.selector+'-'+'tooltip') + .attr('style',"position: absolute;z-index:9999; background-color: rgba(221,228,237,1);border-color:rgba(221,228,237,1); padding: 5px; display: none; left: 983px; top: 89px;") + this.tooltipLine = this.svg.append('line'); + this.dotBox = this.svg.append('g') + /* .selectAll() + .data(this.datas) + .enter() + .append('circle') + .attr("cx", 0) + .attr("cy", 0) + .attr("r", 3) + .attr("fill", function(d,i){ + return $self.colors[i] + }) + .transaction()*/ + }, + _timeFormatCheck:function(range){ + if(range[1]-range[0]>24*60*60*1000){//时间大于一天小于7天,不显示秒 + this._timeFormat=d3.timeFormat('%m-%d %H:%M') + } + }, + creatScale:function(){ + let t_max_min = d3.extent(this.datas[0], function(d) { + return d[0]; + }); + this._timeFormatCheck(t_max_min) + this.xTicks = Math.min(this.datas[0].length,10) + + //横坐标轴比例尺 + this.xScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + + t_max_min = d3.extent(this._pastSourceData[0], function(d) { + return d[0]; + }); + this._timeFormatCheck(t_max_min) + + //辅助比例尺 用于确定鼠标当前对应的x轴位置 + this._assistScale = d3.scaleTime() + .domain(t_max_min) + .range([this.options.padding.left, this.options.width - this.options.padding.right]); + + //数据量过大时,渲染出的元素width会为0,导致无法显示 + // let interval=Number.parseInt(this.datas.length/Number.parseInt((this.options.width-this.options.padding.left-this.options.padding.right)/37+'')) + let domain=this.datas.map(item=>{return item[0][0]}); + + // if(this.datas.length/interval>1){ + // domain=domain.filter((item,index)=>{return index%interval==0}) + // } + this._barXAxisDomain=domain; + this.xScale=d3.scaleBand() + .domain(domain) + .range([this.options.padding.left, this.options.width - this.options.padding.right]) + .paddingInner(0.1) + + this.xScale1=d3.scaleBand() + .domain(d3.range(this.options.legends.length)) + .rangeRound([0,this.xScale.bandwidth()]) + } + + let minMax=this.minMax + //纵坐标轴比例尺 + this.yScale = d3.scaleLinear() + .domain([minMax.min, Math.round(minMax.max*1.05)]) + .range([this.options.height - this._foot_height, this._head_height]); + + }, + createZoom:function(){ + let $self=this; + this.zoom = d3.zoom() + .scaleExtent([1, 100]) + .translateExtent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .extent([ + [this.options.padding.top, 0], + [this.options.width - this.options.padding.right, this.options.height] + ]) + .on("zoom", zoomed); + this.svg.call(this.zoom); + + function zoomed() { + let t = d3.event.transform; + $self.currentTransform=t; + if($self._type != CHART_TYPE.BAR&&$self._type != CHART_TYPE.STACK_BAR){ + let xt = t.rescaleX($self.xScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + + $self.svg.select('.inner_line_x').call($self.xInner.scale(xt)); + + for (let i = 0; i < $self.lines.length; i++) { + let lineObject = $self.lines[i]; + + lineObject.scale(i, 0, t); + } + }else{ + $self.xScale.range([$self.options.padding.left, $self.options.width - $self.options.padding.right].map(d=>d3.event.transform.applyX(d))) + $self.xScale1.rangeRound([0,$self.xScale.bandwidth()]) + + let xt = t.rescaleX($self._assistScale); + $self.svg.select('.bottom_axis').call($self.xAxis.scale(xt)).selectAll("text") + .attr("transform", "translate(-10,10) rotate(-20)"); + + if(!$self.options.showXAxisTick){ + let xAxis=$self.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + for (let i = 0; i < $self.bars.length; i++) { + let barObject = $self.bars[i]; + + barObject.scale(i, 0, t); + } + } + } + }, + createDefs:function(){ //创建遮罩 + this._clipSelector=getUUID()+'-clip'; + this.svg.append("defs").append("clipPath") + .attr("id", this._clipSelector) + .append("rect") + + .attr('x', this.options.padding.left) + .attr('y', 0) + .attr("width", this.options.width - this.options.padding.left - this.options.padding.right) + .attr("height", this.options.height); + }, + createXInnerBar:function(){ + + let xInner = d3.axisBottom() + .scale(this.xScale) + .tickSize(-(this.options.height - this._head_height - this._foot_height), 0, 0) + .tickFormat("") + .ticks(this.xTicks); + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xInner.scale(this._assistScale) + } + this.xInner=xInner; + //添加横轴网格线 + let xInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_x") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xInner); + }, + createYInnderBar:function(){ + //定义纵轴网格线 + let yInner = d3.axisLeft() + .scale(this.yScale) + .tickSize(-(this.options.width - this.options.padding.left - this.options.padding.right), 0, 0) + .tickFormat("") + .ticks(10); + this.yInner=yInner + //添加纵轴网格线 + let yInnerBar = this.svg.append("g") + .attr("class", "inner_line inner_line_y") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yInner); + }, + createXAxis:function(){ + let $self=this; + //定义横轴 + let xAxis = d3.axisBottom() + .scale(this.xScale) + .ticks(this.xTicks) + .tickFormat($self._timeFormat) + if(this._type == CHART_TYPE.BAR||this._type == CHART_TYPE.STACK_BAR){ + xAxis.scale(this._assistScale) + } + this.xAxis=xAxis + //添加横坐标轴 + let xBar = this.svg.append("g") + .attr("class", "bottom_axis") + .attr("transform", "translate(0," + (this.options.height - this._foot_height) + ")") + .call(xAxis).selectAll("text") + .attr("transform", "translate(-10,8) rotate(-20)") + + if(!this.options.showXAxisTick){ + let xAxis=this.svg.select('.bottom_axis') + xAxis.select('.domain').remove(); + xAxis.selectAll('.tick').select('line').remove() + } + }, + createYAxis:function(){ + let dataFormatter=this._dataFormatter; + let $self=this; + //定义纵轴 + let yAxis = d3.axisLeft() + .scale(this.yScale) + .tickFormat(function(d,i,g){ + let yAxisVals=g.map(item=>{ + return item.__data__; + }) + let dot = 0; + let yAxisValsCopy=Object.assign([],yAxisVals) + yAxisVals=yAxisValsCopy.map(item=>{ + return dataFormatter(item,null,-1,dot) + }) + while(new Set(yAxisVals).size != yAxisVals.length){ + dot++; + yAxisVals=yAxisValsCopy.map(item => { + return dataFormatter(item,null,-1,dot) + }) + } + + return yAxisVals[i]; + }) + this.yAxis=yAxis; + //添加纵轴 + let yBar = this.svg.append("g") + .attr("class", "left_axis") + .attr("transform", "translate(" + this.options.padding.left + ",0)") + .call(yAxis); + + if(!this.options.showYAxisTick){ + let yAxis=this.svg.select('.left_axis') + yAxis.select('.domain').remove(); + yAxis.selectAll('.tick').select('line').remove() + } + }, + createLegends:function(){ + let $self=this; + let legend = d3.select('#legendArea').attr('class','legend') + let textGroup = legend.selectAll("div") + .data(this.options.legends); + + textGroup.exit().remove(); + + let legendItem=legend.selectAll("div") + .data(this.options.legends) + .enter() + .append("div") + .attr("class", "legend-item") + + legendItem.append('span') + .attr('class','legend-shape') + .style('background',function(d,i){ + return $self.colors[i] + }) + + legendItem.append('span') + .text(function(d,i){ + return d.name + }) + + + /*let rectGroup = legend.selectAll("rect") + .data(this.legends); + + rectGroup.exit().remove(); + + legend.selectAll("rect") + .data(this.legends) + .enter() + .append("rect") + .attr("x", function(d, i) { + return i * 100 - 20; + }) + .attr("y", -10) + .attr("width", 12) + .attr("height", 12) + .attr("fill", function(d, i) { + return $self.colors[i]; + });*/ + + // legend.attr("transform", "translate(" + ((this.width - this.legends.length * 100) / 2) + "," + (this.height - 10) + ")"); + }, + drawLines:function(){ + this.lines=[]; + let $self=this; + this.svg + .on('mousemove', lineTooltip) + + let totalColor=randomcolor(); + function lineTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self.xScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self.xScale.invert(d3.mouse($self.svg.node())[0]); + + drawTipLine(time) + drawTipDot(time) + let sum=0; + let items=[]; + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(time)) + + let tooltipDatas=$self._type == CHART_TYPE.STACK_AREA?$self._stackSourceData:$self.datas; + + tooltipDatas.forEach((d,i)=>{ + let toolVal=d[0]; + let min=Math.abs(+toolVal[0] - +time ) + d.forEach(item=>{ + let temp=Math.abs(+item[0] - +time) + if(temp - min < 0){ + min=temp; + toolVal=item; + } + }) + if(toolVal){ + sum+=toolVal[1]; + items.push({legend:$self.options.legends[i],value:$self._dataFormatter(toolVal[1],null,-1,2),color:$self.colors[i]}) + } + }) + if($self._type == CHART_TYPE.STACK_AREA){ + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(sum,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + + function drawTipLine(time){ + if ($self.currentTransform) + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.currentTransform.applyX($self.xScale(time))) + .attr('x2', $self.currentTransform.applyX($self.xScale(time))) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + else + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)) + .attr('x2', $self.xScale(time)) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + function drawTipDot(time) { + // if(chart.currentTransform){ + // + // }else{ + // + // } + } + + for (let i = 0; i < this.currentLineNum; i++) { + let newLine = new Line(this); + newLine.init(i); + this.lines.push(newLine); + } + }, + drawBars:function(){ + let $self=this; + this.svg.on('mousemove', barTooltip) + let totalColor=randomcolor(); + function barTooltip(){ + let x=d3.mouse($self.svg.node())[0]; + if(x<$self.options.padding.left||x>$self.options.width-$self.options.padding.right){ + return false; + } + + if ($self.currentTransform) + var time = $self.currentTransform.rescaleX($self._assistScale).invert(d3.mouse($self.svg.node())[0]); + else + var time = $self._assistScale.invert(d3.mouse($self.svg.node())[0]); + // var time = assistScale.invert(d3.mouse($self.svg.node())[0]); + + let min=Math.abs(time-$self._barXAxisDomain[0]); + let minIndex=0; + $self._barXAxisDomain.forEach((item,i)=>{ + let temp=Math.min(min,Math.abs(time - item)) + if(min!==temp){ + min=temp; + minIndex=i; + } + }) + let xAisVal=$self._barXAxisDomain[minIndex]; + drawTipLine(xAisVal) + let tooltipArr=$self._type == CHART_TYPE.BAR?$self.datas:$self._stackSourceData + let tooltipData=tooltipArr.find(item=>{return item[0][0] == xAisVal}) + + $self.tooltip.html(d3.timeFormat('%Y-%m-%d %H:%M:%S')(xAisVal)) + + + let items=tooltipData.map((item,i)=>{ + return {legend:$self.options.legends[i],value:$self._dataFormatter(item[1],null,-1,2),color:$self.colors[i]} + }) + if($self._type == CHART_TYPE.STACK_BAR){ + let totalData=d3.sum(tooltipData.map(item=>{return item[1]})) + items.push({legend:{name:i18n.t('dashboard.panel.chartTotal'),isGray:false},value:$self._dataFormatter(totalData,null,-1,2),color:totalColor}) + } + tooltipFormatter($self.tooltip,items) + + let position=getTooltipPosition($self.tooltip); + + $self.tooltip + .style('left', position.left + 'px') + .style('top', position.top + 'px') + } + function drawTipLine(time){ + $self.tooltipLine + .style('stroke-width','1') + .attr("clip-path", "url(#"+$self._clipSelector+")") + .attr('x1', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('x2', $self.xScale(time)+$self.xScale.bandwidth()/2) + .attr('y1', $self._head_height) + .attr('y2', $self.options.height - $self._foot_height); + } + this.bars=[]; + for(let i=0;i < this.datas.length;i++){ + let newBar=new Bar(this); + newBar.init(i) + this.bars.push(newBar) + } + + }, + reDrawChart:function(type,data){ + let $self=this; + this.clearChart(); + $self._type=type?type:$self._type; + this.dealData(); + this.drawChart(); + + }, + drawToolbox:function(){ + if(this.options.toolbox.show){ + let $self=this; + let toolbox=d3.select(this.options.selector).select('.toolbox') + if(!toolbox.node()){ + toolbox=d3.select(this.options.selector) + .append('div').attr('class','toolbox') + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + }else{ + toolbox + .attr('style','position:absolute;top:'+(this._head_height-this.options.toolbox.height)+'px;left:'+(this.options.width-this.options.toolbox.width-this.options.padding.right)+'px;min-width:'+this.options.toolbox.width+'px;height:'+this.options.toolbox.height+'px;') + toolbox.selectAll('i').remove(); + } + if(this.options.toolbox.stack.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-stack toolbox-stack') + .attr('title',this.options.toolbox.stack.title) + .on('click',function(){ + if($self._type == CHART_TYPE.LINE ||$self._type == CHART_TYPE.AREA){ + $self.backZoom={ + type:$self._type, + } + $self.reDrawChart(CHART_TYPE.STACK_AREA) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type==CHART_TYPE.BAR){ + $self.backZoom={ + type:$self._type, + data:JSON.parse(JSON.stringify($self._pastSourceData)) + } + $self.reDrawChart(CHART_TYPE.STACK_BAR,$self._pastSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.backTitle) + }else if($self._type == CHART_TYPE.STACK_AREA){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self._stackSourceData) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + }else if($self._type == CHART_TYPE.STACK_BAR){ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + toolbox.select('.toolbox-stack').attr('title',$self.options.toolbox.stack.title) + } + } + }) + } + /*if(this.toolbox.area.show){ + toolbox.append('i') + .attr('class','nz-icon nz-icon-area') + .attr('title',this.toolbox.area.title) + .on('click',function(){ + if($self.type != CHART_TYPE.AREA){ + $self.reDrawChart(CHART_TYPE.AREA) + }else{ + if($self.backZoom){ + $self.reDrawChart($self.backZoom.type,$self.backZoom.data) + } + } + }) + }*/ + + } + }, + dispatchAction(type,param){ + this.svg.selectAll('.event-echo-unit').dispatch(type,{detail:{name:param}}) + }, + clearChart:function(){ + d3.select(this.options.selector).selectAll('svg').remove(); + this.tooltip.remove(); + this.tooltipLine.remove(); + + } + } +} +//取得多维数组最大值 +function getMaxdata(arr) { + let maxdata = 0; + for (let i = 0; i < arr.length; i++) { + maxdata = d3.max([maxdata, d3.max(arr[i], function(d) { + return d[1]; + })]); + } + return maxdata; +} + +function getMinMax(arr){ + let temp=[]; + arr.forEach((item,i)=>{ + let minMax=d3.extent(item,function(d){return d[1]}) + temp=temp.concat(minMax) + }) + let minMax=d3.extent(temp) + return{min:minMax[0],max:minMax[1]} +} + +function computeDistance(str){ + let width = 0; + let html = document.createElement('span'); + html.innerText = str; + html.className = 'getTextWidth'; + document.querySelector('body').appendChild(html); + width = document.querySelector('.getTextWidth').offsetWidth; + document.querySelector('.getTextWidth').remove(); + return Number((width+5)); +} + +function getTooltipPosition(tooltip){ + + let x=d3.event.pageX + let y=d3.event.pageY + + let tooltipWidth=tooltip.node().offsetWidth + let tooltipHeight=tooltip.node().offsetHeight + + + let windowWidth=document.body.offsetWidth; + let windowHeight=document.body.offsetHeight; + + let left=x + 20; + let top=y + 20; + + if(x+tooltipWidth+20>windowWidth){ + left=x - 20 - tooltipWidth; + } + + if(y+tooltipHeight+20>windowHeight){ + top=y - 20 - tooltipHeight; + } + + return {left:left,top:top} + +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Util_20200812135814.js b/.history/nezha-fronted/src/components/charts/d3/d3Util_20200812135814.js new file mode 100644 index 000000000..a617cdc5f --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Util_20200812135814.js @@ -0,0 +1,341 @@ +import * as d3 from "d3"; +import i18n from "../../common/i18n"; +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; + +export function CHART_TYPE(){} +CHART_TYPE.LINE='line' +CHART_TYPE.AREA='area' +CHART_TYPE.STACK_AREA='stackArea' +CHART_TYPE.BAR='bar' +CHART_TYPE.STACK_BAR='stackBar' + +export function Bar(chart){ + this.group=null; + let dataset=chart.datas; + let svg=chart.svg; + let xScale=chart.xScale; + let xScale1=chart.xScale1; + let yScale=chart.yScale; + let colors=chart.colors; + let legends=chart.options.legends; + let singleFlag=legends.find(item=>{return item.isGray==true}) + let state='multi'; + let colorScale=d3.scaleOrdinal() + .domain(chart.options.height - chart._foot_height,chart._head_height) + .range(colors) + + this.init=function(index){ + /*let data=dataset.map((item,i)=>{ + return item[index]; + })*/ + let data=dataset[index] + let time=data[0][0] + let $self=this; + let timeScale=xScale(time); + if(!timeScale){ + return; + } + this.data=data; + this.group=svg.append('g').attr("clip-path","url(#"+chart._clipSelector+")") + .append('g') + .attr('transform','translate('+timeScale+',0)') + this.rects=[]; + data.forEach((d,i)=>{ + let rect=this.group.append('g').attr('fill',legends[i].isGray?'none':colors[i]) + .append('rect') + .attr('class','event-echo-unit') + .attr('y',yScale(d[1])) + .on('legend-single-show',function(){ + state='single' + let legend=chart.options.legends[i]; + let event=d3.event; + let name=event.detail?event.detail.name:"" + if(legend.name == name){ + if(chart._type == CHART_TYPE.BAR){ + rect.transition().duration(chart.options.duration) + .attr('x',xScale1(0)) + .attr('width',xScale.bandwidth()) + .attr('fill',colors[i]) + }else{ + rect.transition().duration(chart.options.duration) + .attr('fill',colors[i]) + .attr('height', yScale(chart.minMax.min) - yScale(d[1])) + } + + legend.isGray=false; + }else{ + if(chart._type == CHART_TYPE.BAR){ + rect.attr('fill','none').attr('x',xScale1(i)).attr('width',xScale1.bandwidth()) + }else{ + rect.attr('fill','none') + } + legend.isGray=true; + } + }) + .on('legend-all-show',function(){ + state='multi' + if(chart._type == CHART_TYPE.BAR){ + rect.transition().duration(chart.options.duration) + .attr('fill',colors[i]).attr('x',xScale1(i)).attr('width',xScale1.bandwidth()) + }else{ + rect.transition().duration(chart.options.duration) + .attr('fill',colors[i]) + .attr('height',function(){ + if(i==0){ + return yScale(chart.minMax.min) - yScale(d[1]) + }else{ + let before=data[i-1]; + return yScale(before[1]) - yScale(d[1]) + } + }) + } + chart.options.legends.forEach(item=>{item.isGray=false}) + }) + + if(chart._type==CHART_TYPE.BAR){ + rect.attr('x',xScale1 (i) ) + .attr('width',xScale1.bandwidth()) + .attr('height', yScale(chart.minMax.min) - yScale(d[1])) + }else{ + rect.attr('width',xScale.bandwidth()) + .attr('height',function(){ + if(i==0){ + return yScale(chart.minMax.min) - yScale(d[1]) + }else{ + if(singleFlag){ + return yScale(chart.minMax.min) - yScale(d[1]) + }else{ + let before=data[i-1]; + return yScale(before[1]) - yScale(d[1]) + } + } + }) + } + this.rects.push(rect) + }) + } + this.scale = function(index, _duration, transform) { + if(!this.data){ + return; + } + let data=this.data; + let time=data[0][0] + let $self=this; + let timeScale=xScale(time); + + if(!timeScale){ + return; + } + if(this.group){ + this.group.attr('transform','translate('+timeScale+',0)') + if(chart._type == CHART_TYPE.BAR){ + if(state == 'single'){ + this.rects.forEach((rect,i)=>{ + rect.attr('x',xScale1(0)) + .attr('width',xScale.bandwidth()) + }) + }else{ + this.rects.forEach((rect,i)=>{ + rect.attr('x',xScale1(i)) + .attr('width',xScale1.bandwidth()) + }) + } + }else{ + this.rects.forEach((rect,i)=>{ + rect.attr('x',xScale1(0)) + .attr('width',xScale.bandwidth()) + }) + } + } + } +} +export function Line(chart) { + this.group = null; + this.path = null; + let state = 'multi'//区分是显示单条还是全部显示 + let dataset=chart.datas; + let svg=chart.svg; + let xScale=chart.xScale; + let yScale=chart.yScale; + let lineColor=chart.colors; + let legends=chart.options.legends; + let singleFlag=legends.find(item=>{return item.isGray == true}) + const dispatch=chart.dispatch; + + this.init = function(id) { + let arr = dataset[id]; + let legend=chart.options.legends[id]; + this.group = svg.append("g"); + let $self=this; + let line = d3.line() + .x(function(d, i) { + return xScale(d[0]); + }) + .y(function(d) { + return yScale(d[1]); + }) + .curve(d3.curveCatmullRom.alpha(0.3)); //折线曲度 + + let areaForStack = d3.area() + .x(function(d, i) { + return xScale(d[0]); + }) + // .y0(chart.height - chart._foot_height) + .y0(function(d,i){ + if(id==0){ + return chart.options.height - chart._foot_height + }else{ + if(singleFlag){ + return chart.options.height - chart._foot_height + }else{ + return yScale(dataset[id-1][i][1]) + } + } + }) + .y1(function(d) { + return yScale(d[1]) + }) + .curve(d3.curveCatmullRom.alpha(0.3)); //折线曲度 + + let areaForNormal=d3.area() + .x(function(d, i) { + return xScale(d[0]); + }) + .y0(chart.options.height - chart._foot_height) + .y1(function(d) { + return yScale(d[1]) + }) + .curve(d3.curveCatmullRom.alpha(0.3)); //折线曲度 + //添加折线 + this.path = this.group.append("path") + .attr("clip-path","url(#"+chart._clipSelector+")") + .attr("d", line(arr)) + .attr('class','event-echo-unit chart-line') + .style("fill", 'none') + .style("stroke-width", 1) + .style("stroke", legends[id].isGray?'none':lineColor[id]) + .style("stroke-opacity", 0.9) + .on('legend-single-show',function(d,i,group){ + let event=d3.event; + state='single' + let name=event.detail?event.detail.name:"" + if(legend.name != name){ + $self.group + .transition() + .duration(chart.options.duration) + .style('opacity','0') + legend.isGray=true; + }else{ + $self.group.transition() + .duration(chart.options.duration).style('opacity','1') + legend.isGray=false; + if(chart.currentTransform){ + $self.scale(id,chart.options.duration,chart.currentTransform) + }else{ + $self.group.select('.chart-area').attr('d',areaForNormal(arr)) + } + } + }) + .on('legend-all-show',function(){ + let event=d3.event; + state='multi' + $self.group.transition() + .duration(chart.options.duration).style('opacity','1') + chart.options.legends.forEach(item=>{ + item.isGray=false; + }) + if(chart.currentTransform){ + $self.scale(id,chart.options.duration,chart.currentTransform) + }else{ + $self.group.select('.chart-area').attr('d',areaForStack(arr)) + } + }) + if(chart._type==CHART_TYPE.AREA||chart._type == CHART_TYPE.STACK_AREA){ + this.area=this.group.append('path') + .attr("clip-path", "url(#"+chart._clipSelector+")") + .attr('class','chart-area') + .style('fill',legends[id].isGray?'none':lineColor[id]) + .style("stroke", 'none') + .style('opacity','.1') + if(chart._type == CHART_TYPE.AREA){ + this.area.attr('d',areaForNormal(arr)) + }else{ + this.area.attr('d',areaForStack(arr)) + } + } + }; + + this.scale = function(id, _duration, transform) { + + let arr = dataset[id]; + + let line = d3.line() + .x(function(d, i) { + return transform.applyX(xScale(d[0])) + }) + .y(function(d) { + return yScale(d[1]); + }) + let areaForNormal=d3.area() + .x(function(d, i) { + return transform.applyX(xScale(d[0])) + }) + .y0(chart.options.height - chart._foot_height) + .y1(function(d) { + return yScale(d[1]) + }) + + let areaForStack=d3.area() + .x(function(d, i) { + return transform.applyX(xScale(d[0])) + }) + .y0(function(d,i){ + if(id==0){ + return chart.options.height - chart._foot_height + }else{ + return yScale(dataset[id-1][i][1]) + } + }) + .y1(function(d) { + return yScale(d[1]) + }) + + //添加折线 + this.group.select(".chart-line") + .attr("d", line(arr)) + .style("fill", "none") + .style("stroke-width", 1) + .style("stroke", legends[id].isGray?'none':lineColor[id]) + .style("stroke-opacity", 0.9); + if(chart._type == CHART_TYPE.AREA||chart._type == CHART_TYPE.STACK_AREA){ + let area=this.group.select(".chart-area") + .style('fill',legends[id].isGray?'none':lineColor[id]) + .style("stroke", 'none') + .style('opacity','.1') + if(state == 'single'){ + area.attr("d", areaForNormal(arr)) + }else if(state == 'multi'){ + if(chart._type == CHART_TYPE.STACK_AREA) { + area.attr("d", areaForStack(arr)) + }else { + area.attr("d", areaForNormal(arr)) + } + } + } + } +} + +export function tooltipFormatter(target,params){ + target.selectAll('div') + .data(params) + .enter() + .append('div') + .html(function(d,i){ + if(!d.legend.isGray){ + return `
+
${d.legend.alias?d.legend.alias:d.legend.name}:
+
${d.value}
+
` + } + }) +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Util_20200812163439.js b/.history/nezha-fronted/src/components/charts/d3/d3Util_20200812163439.js new file mode 100644 index 000000000..9ba42428a --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Util_20200812163439.js @@ -0,0 +1,341 @@ +import * as d3 from "d3"; +import i18n from "../../common/i18n"; +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; + +export function CHART_TYPE(){} +CHART_TYPE.LINE='line' +CHART_TYPE.AREA='area' +CHART_TYPE.STACK_AREA='stackArea' +CHART_TYPE.BAR='bar' +CHART_TYPE.STACK_BAR='stackBar' + +export function Bar(chart){ + this.group=null; + let dataset=chart.datas; + let svg=chart.svg; + let xScale=chart.xScale; + let xScale1=chart.xScale1; + let yScale=chart.yScale; + let colors=chart.colors; + let legends=chart.options.legends; + let singleFlag=legends.find(item=>{return item.isGray==true}) + let state='multi'; + let colorScale=d3.scaleOrdinal() + .domain(chart.options.height - chart._foot_height,chart._head_height) + .range(colors) + + this.init=function(index){ + /*let data=dataset.map((item,i)=>{ + return item[index]; + })*/ + let data=dataset[index] + let time=data[0][0] + let $self=this; + let timeScale=xScale(time); + if(!timeScale){ + return; + } + this.data=data; + this.group=svg.append('g').attr("clip-path","url(#"+chart._clipSelector+")") + .append('g') + .attr('transform','translate('+timeScale+',0)') + this.rects=[]; + data.forEach((d,i)=>{ + let rect=this.group.append('g').attr('fill',legends[i].isGray?'none':colors[i]) + .append('rect') + .attr('class','event-echo-unit') + .attr('y',yScale(d[1])) + .on('legend-single-show',function(){ + state='single' + let legend=chart.options.legends[i]; + let event=d3.event; + let name=event.detail?event.detail.name:"" + if(legend.name == name){ + if(chart._type == CHART_TYPE.BAR){ + rect.transition().duration(chart.options.duration) + .attr('x',xScale1(0)) + .attr('width',xScale.bandwidth()) + .attr('fill',colors[i]) + }else{ + rect.transition().duration(chart.options.duration) + .attr('fill',colors[i]) + .attr('height', yScale(chart.minMax.min) - yScale(d[1])) + } + + legend.isGray=false; + }else{ + if(chart._type == CHART_TYPE.BAR){ + rect.attr('fill','none').attr('x',xScale1(i)).attr('width',xScale1.bandwidth()) + }else{ + rect.attr('fill','none') + } + legend.isGray=true; + } + }) + .on('legend-all-show',function(){ + state='multi' + if(chart._type == CHART_TYPE.BAR){ + rect.transition().duration(chart.options.duration) + .attr('fill',colors[i]).attr('x',xScale1(i)).attr('width',xScale1.bandwidth()) + }else{ + rect.transition().duration(chart.options.duration) + .attr('fill',colors[i]) + .attr('height',function(){ + if(i==0){ + return yScale(chart.minMax.min) - yScale(d[1]) + }else{ + let before=data[i-1]; + return yScale(before[1]) - yScale(d[1]) + } + }) + } + chart.options.legends.forEach(item=>{item.isGray=false}) + }) + + if(chart._type==CHART_TYPE.BAR){ + rect.attr('x',xScale1 (i) ) + .attr('width',xScale1.bandwidth()==0?) + .attr('height', yScale(chart.minMax.min) - yScale(d[1])) + }else{ + rect.attr('width',xScale.bandwidth()) + .attr('height',function(){ + if(i==0){ + return yScale(chart.minMax.min) - yScale(d[1]) + }else{ + if(singleFlag){ + return yScale(chart.minMax.min) - yScale(d[1]) + }else{ + let before=data[i-1]; + return yScale(before[1]) - yScale(d[1]) + } + } + }) + } + this.rects.push(rect) + }) + } + this.scale = function(index, _duration, transform) { + if(!this.data){ + return; + } + let data=this.data; + let time=data[0][0] + let $self=this; + let timeScale=xScale(time); + + if(!timeScale){ + return; + } + if(this.group){ + this.group.attr('transform','translate('+timeScale+',0)') + if(chart._type == CHART_TYPE.BAR){ + if(state == 'single'){ + this.rects.forEach((rect,i)=>{ + rect.attr('x',xScale1(0)) + .attr('width',xScale.bandwidth()) + }) + }else{ + this.rects.forEach((rect,i)=>{ + rect.attr('x',xScale1(i)) + .attr('width',xScale1.bandwidth()) + }) + } + }else{ + this.rects.forEach((rect,i)=>{ + rect.attr('x',xScale1(0)) + .attr('width',xScale.bandwidth()) + }) + } + } + } +} +export function Line(chart) { + this.group = null; + this.path = null; + let state = 'multi'//区分是显示单条还是全部显示 + let dataset=chart.datas; + let svg=chart.svg; + let xScale=chart.xScale; + let yScale=chart.yScale; + let lineColor=chart.colors; + let legends=chart.options.legends; + let singleFlag=legends.find(item=>{return item.isGray == true}) + const dispatch=chart.dispatch; + + this.init = function(id) { + let arr = dataset[id]; + let legend=chart.options.legends[id]; + this.group = svg.append("g"); + let $self=this; + let line = d3.line() + .x(function(d, i) { + return xScale(d[0]); + }) + .y(function(d) { + return yScale(d[1]); + }) + .curve(d3.curveCatmullRom.alpha(0.3)); //折线曲度 + + let areaForStack = d3.area() + .x(function(d, i) { + return xScale(d[0]); + }) + // .y0(chart.height - chart._foot_height) + .y0(function(d,i){ + if(id==0){ + return chart.options.height - chart._foot_height + }else{ + if(singleFlag){ + return chart.options.height - chart._foot_height + }else{ + return yScale(dataset[id-1][i][1]) + } + } + }) + .y1(function(d) { + return yScale(d[1]) + }) + .curve(d3.curveCatmullRom.alpha(0.3)); //折线曲度 + + let areaForNormal=d3.area() + .x(function(d, i) { + return xScale(d[0]); + }) + .y0(chart.options.height - chart._foot_height) + .y1(function(d) { + return yScale(d[1]) + }) + .curve(d3.curveCatmullRom.alpha(0.3)); //折线曲度 + //添加折线 + this.path = this.group.append("path") + .attr("clip-path","url(#"+chart._clipSelector+")") + .attr("d", line(arr)) + .attr('class','event-echo-unit chart-line') + .style("fill", 'none') + .style("stroke-width", 1) + .style("stroke", legends[id].isGray?'none':lineColor[id]) + .style("stroke-opacity", 0.9) + .on('legend-single-show',function(d,i,group){ + let event=d3.event; + state='single' + let name=event.detail?event.detail.name:"" + if(legend.name != name){ + $self.group + .transition() + .duration(chart.options.duration) + .style('opacity','0') + legend.isGray=true; + }else{ + $self.group.transition() + .duration(chart.options.duration).style('opacity','1') + legend.isGray=false; + if(chart.currentTransform){ + $self.scale(id,chart.options.duration,chart.currentTransform) + }else{ + $self.group.select('.chart-area').attr('d',areaForNormal(arr)) + } + } + }) + .on('legend-all-show',function(){ + let event=d3.event; + state='multi' + $self.group.transition() + .duration(chart.options.duration).style('opacity','1') + chart.options.legends.forEach(item=>{ + item.isGray=false; + }) + if(chart.currentTransform){ + $self.scale(id,chart.options.duration,chart.currentTransform) + }else{ + $self.group.select('.chart-area').attr('d',areaForStack(arr)) + } + }) + if(chart._type==CHART_TYPE.AREA||chart._type == CHART_TYPE.STACK_AREA){ + this.area=this.group.append('path') + .attr("clip-path", "url(#"+chart._clipSelector+")") + .attr('class','chart-area') + .style('fill',legends[id].isGray?'none':lineColor[id]) + .style("stroke", 'none') + .style('opacity','.1') + if(chart._type == CHART_TYPE.AREA){ + this.area.attr('d',areaForNormal(arr)) + }else{ + this.area.attr('d',areaForStack(arr)) + } + } + }; + + this.scale = function(id, _duration, transform) { + + let arr = dataset[id]; + + let line = d3.line() + .x(function(d, i) { + return transform.applyX(xScale(d[0])) + }) + .y(function(d) { + return yScale(d[1]); + }) + let areaForNormal=d3.area() + .x(function(d, i) { + return transform.applyX(xScale(d[0])) + }) + .y0(chart.options.height - chart._foot_height) + .y1(function(d) { + return yScale(d[1]) + }) + + let areaForStack=d3.area() + .x(function(d, i) { + return transform.applyX(xScale(d[0])) + }) + .y0(function(d,i){ + if(id==0){ + return chart.options.height - chart._foot_height + }else{ + return yScale(dataset[id-1][i][1]) + } + }) + .y1(function(d) { + return yScale(d[1]) + }) + + //添加折线 + this.group.select(".chart-line") + .attr("d", line(arr)) + .style("fill", "none") + .style("stroke-width", 1) + .style("stroke", legends[id].isGray?'none':lineColor[id]) + .style("stroke-opacity", 0.9); + if(chart._type == CHART_TYPE.AREA||chart._type == CHART_TYPE.STACK_AREA){ + let area=this.group.select(".chart-area") + .style('fill',legends[id].isGray?'none':lineColor[id]) + .style("stroke", 'none') + .style('opacity','.1') + if(state == 'single'){ + area.attr("d", areaForNormal(arr)) + }else if(state == 'multi'){ + if(chart._type == CHART_TYPE.STACK_AREA) { + area.attr("d", areaForStack(arr)) + }else { + area.attr("d", areaForNormal(arr)) + } + } + } + } +} + +export function tooltipFormatter(target,params){ + target.selectAll('div') + .data(params) + .enter() + .append('div') + .html(function(d,i){ + if(!d.legend.isGray){ + return `
+
${d.legend.alias?d.legend.alias:d.legend.name}:
+
${d.value}
+
` + } + }) +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Util_20200812163442.js b/.history/nezha-fronted/src/components/charts/d3/d3Util_20200812163442.js new file mode 100644 index 000000000..3aef91e2f --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Util_20200812163442.js @@ -0,0 +1,341 @@ +import * as d3 from "d3"; +import i18n from "../../common/i18n"; +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; + +export function CHART_TYPE(){} +CHART_TYPE.LINE='line' +CHART_TYPE.AREA='area' +CHART_TYPE.STACK_AREA='stackArea' +CHART_TYPE.BAR='bar' +CHART_TYPE.STACK_BAR='stackBar' + +export function Bar(chart){ + this.group=null; + let dataset=chart.datas; + let svg=chart.svg; + let xScale=chart.xScale; + let xScale1=chart.xScale1; + let yScale=chart.yScale; + let colors=chart.colors; + let legends=chart.options.legends; + let singleFlag=legends.find(item=>{return item.isGray==true}) + let state='multi'; + let colorScale=d3.scaleOrdinal() + .domain(chart.options.height - chart._foot_height,chart._head_height) + .range(colors) + + this.init=function(index){ + /*let data=dataset.map((item,i)=>{ + return item[index]; + })*/ + let data=dataset[index] + let time=data[0][0] + let $self=this; + let timeScale=xScale(time); + if(!timeScale){ + return; + } + this.data=data; + this.group=svg.append('g').attr("clip-path","url(#"+chart._clipSelector+")") + .append('g') + .attr('transform','translate('+timeScale+',0)') + this.rects=[]; + data.forEach((d,i)=>{ + let rect=this.group.append('g').attr('fill',legends[i].isGray?'none':colors[i]) + .append('rect') + .attr('class','event-echo-unit') + .attr('y',yScale(d[1])) + .on('legend-single-show',function(){ + state='single' + let legend=chart.options.legends[i]; + let event=d3.event; + let name=event.detail?event.detail.name:"" + if(legend.name == name){ + if(chart._type == CHART_TYPE.BAR){ + rect.transition().duration(chart.options.duration) + .attr('x',xScale1(0)) + .attr('width',xScale.bandwidth()) + .attr('fill',colors[i]) + }else{ + rect.transition().duration(chart.options.duration) + .attr('fill',colors[i]) + .attr('height', yScale(chart.minMax.min) - yScale(d[1])) + } + + legend.isGray=false; + }else{ + if(chart._type == CHART_TYPE.BAR){ + rect.attr('fill','none').attr('x',xScale1(i)).attr('width',xScale1.bandwidth()) + }else{ + rect.attr('fill','none') + } + legend.isGray=true; + } + }) + .on('legend-all-show',function(){ + state='multi' + if(chart._type == CHART_TYPE.BAR){ + rect.transition().duration(chart.options.duration) + .attr('fill',colors[i]).attr('x',xScale1(i)).attr('width',xScale1.bandwidth()) + }else{ + rect.transition().duration(chart.options.duration) + .attr('fill',colors[i]) + .attr('height',function(){ + if(i==0){ + return yScale(chart.minMax.min) - yScale(d[1]) + }else{ + let before=data[i-1]; + return yScale(before[1]) - yScale(d[1]) + } + }) + } + chart.options.legends.forEach(item=>{item.isGray=false}) + }) + + if(chart._type==CHART_TYPE.BAR){ + rect.attr('x',xScale1 (i) ) + .attr('width',xScale1.bandwidth()==0?0.1:) + .attr('height', yScale(chart.minMax.min) - yScale(d[1])) + }else{ + rect.attr('width',xScale.bandwidth()) + .attr('height',function(){ + if(i==0){ + return yScale(chart.minMax.min) - yScale(d[1]) + }else{ + if(singleFlag){ + return yScale(chart.minMax.min) - yScale(d[1]) + }else{ + let before=data[i-1]; + return yScale(before[1]) - yScale(d[1]) + } + } + }) + } + this.rects.push(rect) + }) + } + this.scale = function(index, _duration, transform) { + if(!this.data){ + return; + } + let data=this.data; + let time=data[0][0] + let $self=this; + let timeScale=xScale(time); + + if(!timeScale){ + return; + } + if(this.group){ + this.group.attr('transform','translate('+timeScale+',0)') + if(chart._type == CHART_TYPE.BAR){ + if(state == 'single'){ + this.rects.forEach((rect,i)=>{ + rect.attr('x',xScale1(0)) + .attr('width',xScale.bandwidth()) + }) + }else{ + this.rects.forEach((rect,i)=>{ + rect.attr('x',xScale1(i)) + .attr('width',xScale1.bandwidth()) + }) + } + }else{ + this.rects.forEach((rect,i)=>{ + rect.attr('x',xScale1(0)) + .attr('width',xScale.bandwidth()) + }) + } + } + } +} +export function Line(chart) { + this.group = null; + this.path = null; + let state = 'multi'//区分是显示单条还是全部显示 + let dataset=chart.datas; + let svg=chart.svg; + let xScale=chart.xScale; + let yScale=chart.yScale; + let lineColor=chart.colors; + let legends=chart.options.legends; + let singleFlag=legends.find(item=>{return item.isGray == true}) + const dispatch=chart.dispatch; + + this.init = function(id) { + let arr = dataset[id]; + let legend=chart.options.legends[id]; + this.group = svg.append("g"); + let $self=this; + let line = d3.line() + .x(function(d, i) { + return xScale(d[0]); + }) + .y(function(d) { + return yScale(d[1]); + }) + .curve(d3.curveCatmullRom.alpha(0.3)); //折线曲度 + + let areaForStack = d3.area() + .x(function(d, i) { + return xScale(d[0]); + }) + // .y0(chart.height - chart._foot_height) + .y0(function(d,i){ + if(id==0){ + return chart.options.height - chart._foot_height + }else{ + if(singleFlag){ + return chart.options.height - chart._foot_height + }else{ + return yScale(dataset[id-1][i][1]) + } + } + }) + .y1(function(d) { + return yScale(d[1]) + }) + .curve(d3.curveCatmullRom.alpha(0.3)); //折线曲度 + + let areaForNormal=d3.area() + .x(function(d, i) { + return xScale(d[0]); + }) + .y0(chart.options.height - chart._foot_height) + .y1(function(d) { + return yScale(d[1]) + }) + .curve(d3.curveCatmullRom.alpha(0.3)); //折线曲度 + //添加折线 + this.path = this.group.append("path") + .attr("clip-path","url(#"+chart._clipSelector+")") + .attr("d", line(arr)) + .attr('class','event-echo-unit chart-line') + .style("fill", 'none') + .style("stroke-width", 1) + .style("stroke", legends[id].isGray?'none':lineColor[id]) + .style("stroke-opacity", 0.9) + .on('legend-single-show',function(d,i,group){ + let event=d3.event; + state='single' + let name=event.detail?event.detail.name:"" + if(legend.name != name){ + $self.group + .transition() + .duration(chart.options.duration) + .style('opacity','0') + legend.isGray=true; + }else{ + $self.group.transition() + .duration(chart.options.duration).style('opacity','1') + legend.isGray=false; + if(chart.currentTransform){ + $self.scale(id,chart.options.duration,chart.currentTransform) + }else{ + $self.group.select('.chart-area').attr('d',areaForNormal(arr)) + } + } + }) + .on('legend-all-show',function(){ + let event=d3.event; + state='multi' + $self.group.transition() + .duration(chart.options.duration).style('opacity','1') + chart.options.legends.forEach(item=>{ + item.isGray=false; + }) + if(chart.currentTransform){ + $self.scale(id,chart.options.duration,chart.currentTransform) + }else{ + $self.group.select('.chart-area').attr('d',areaForStack(arr)) + } + }) + if(chart._type==CHART_TYPE.AREA||chart._type == CHART_TYPE.STACK_AREA){ + this.area=this.group.append('path') + .attr("clip-path", "url(#"+chart._clipSelector+")") + .attr('class','chart-area') + .style('fill',legends[id].isGray?'none':lineColor[id]) + .style("stroke", 'none') + .style('opacity','.1') + if(chart._type == CHART_TYPE.AREA){ + this.area.attr('d',areaForNormal(arr)) + }else{ + this.area.attr('d',areaForStack(arr)) + } + } + }; + + this.scale = function(id, _duration, transform) { + + let arr = dataset[id]; + + let line = d3.line() + .x(function(d, i) { + return transform.applyX(xScale(d[0])) + }) + .y(function(d) { + return yScale(d[1]); + }) + let areaForNormal=d3.area() + .x(function(d, i) { + return transform.applyX(xScale(d[0])) + }) + .y0(chart.options.height - chart._foot_height) + .y1(function(d) { + return yScale(d[1]) + }) + + let areaForStack=d3.area() + .x(function(d, i) { + return transform.applyX(xScale(d[0])) + }) + .y0(function(d,i){ + if(id==0){ + return chart.options.height - chart._foot_height + }else{ + return yScale(dataset[id-1][i][1]) + } + }) + .y1(function(d) { + return yScale(d[1]) + }) + + //添加折线 + this.group.select(".chart-line") + .attr("d", line(arr)) + .style("fill", "none") + .style("stroke-width", 1) + .style("stroke", legends[id].isGray?'none':lineColor[id]) + .style("stroke-opacity", 0.9); + if(chart._type == CHART_TYPE.AREA||chart._type == CHART_TYPE.STACK_AREA){ + let area=this.group.select(".chart-area") + .style('fill',legends[id].isGray?'none':lineColor[id]) + .style("stroke", 'none') + .style('opacity','.1') + if(state == 'single'){ + area.attr("d", areaForNormal(arr)) + }else if(state == 'multi'){ + if(chart._type == CHART_TYPE.STACK_AREA) { + area.attr("d", areaForStack(arr)) + }else { + area.attr("d", areaForNormal(arr)) + } + } + } + } +} + +export function tooltipFormatter(target,params){ + target.selectAll('div') + .data(params) + .enter() + .append('div') + .html(function(d,i){ + if(!d.legend.isGray){ + return `
+
${d.legend.alias?d.legend.alias:d.legend.name}:
+
${d.value}
+
` + } + }) +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Util_20200812163450.js b/.history/nezha-fronted/src/components/charts/d3/d3Util_20200812163450.js new file mode 100644 index 000000000..8c23cf68e --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Util_20200812163450.js @@ -0,0 +1,341 @@ +import * as d3 from "d3"; +import i18n from "../../common/i18n"; +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; + +export function CHART_TYPE(){} +CHART_TYPE.LINE='line' +CHART_TYPE.AREA='area' +CHART_TYPE.STACK_AREA='stackArea' +CHART_TYPE.BAR='bar' +CHART_TYPE.STACK_BAR='stackBar' + +export function Bar(chart){ + this.group=null; + let dataset=chart.datas; + let svg=chart.svg; + let xScale=chart.xScale; + let xScale1=chart.xScale1; + let yScale=chart.yScale; + let colors=chart.colors; + let legends=chart.options.legends; + let singleFlag=legends.find(item=>{return item.isGray==true}) + let state='multi'; + let colorScale=d3.scaleOrdinal() + .domain(chart.options.height - chart._foot_height,chart._head_height) + .range(colors) + + this.init=function(index){ + /*let data=dataset.map((item,i)=>{ + return item[index]; + })*/ + let data=dataset[index] + let time=data[0][0] + let $self=this; + let timeScale=xScale(time); + if(!timeScale){ + return; + } + this.data=data; + this.group=svg.append('g').attr("clip-path","url(#"+chart._clipSelector+")") + .append('g') + .attr('transform','translate('+timeScale+',0)') + this.rects=[]; + data.forEach((d,i)=>{ + let rect=this.group.append('g').attr('fill',legends[i].isGray?'none':colors[i]) + .append('rect') + .attr('class','event-echo-unit') + .attr('y',yScale(d[1])) + .on('legend-single-show',function(){ + state='single' + let legend=chart.options.legends[i]; + let event=d3.event; + let name=event.detail?event.detail.name:"" + if(legend.name == name){ + if(chart._type == CHART_TYPE.BAR){ + rect.transition().duration(chart.options.duration) + .attr('x',xScale1(0)) + .attr('width',xScale.bandwidth()) + .attr('fill',colors[i]) + }else{ + rect.transition().duration(chart.options.duration) + .attr('fill',colors[i]) + .attr('height', yScale(chart.minMax.min) - yScale(d[1])) + } + + legend.isGray=false; + }else{ + if(chart._type == CHART_TYPE.BAR){ + rect.attr('fill','none').attr('x',xScale1(i)).attr('width',xScale1.bandwidth()) + }else{ + rect.attr('fill','none') + } + legend.isGray=true; + } + }) + .on('legend-all-show',function(){ + state='multi' + if(chart._type == CHART_TYPE.BAR){ + rect.transition().duration(chart.options.duration) + .attr('fill',colors[i]).attr('x',xScale1(i)).attr('width',xScale1.bandwidth()) + }else{ + rect.transition().duration(chart.options.duration) + .attr('fill',colors[i]) + .attr('height',function(){ + if(i==0){ + return yScale(chart.minMax.min) - yScale(d[1]) + }else{ + let before=data[i-1]; + return yScale(before[1]) - yScale(d[1]) + } + }) + } + chart.options.legends.forEach(item=>{item.isGray=false}) + }) + + if(chart._type==CHART_TYPE.BAR){ + rect.attr('x',xScale1 (i) ) + .attr('width',xScale1.bandwidth()==0?0.1:xScale1.bandwidth()) + .attr('height', yScale(chart.minMax.min) - yScale(d[1])) + }else{ + rect.attr('width',xScale.bandwidth()) + .attr('height',function(){ + if(i==0){ + return yScale(chart.minMax.min) - yScale(d[1]) + }else{ + if(singleFlag){ + return yScale(chart.minMax.min) - yScale(d[1]) + }else{ + let before=data[i-1]; + return yScale(before[1]) - yScale(d[1]) + } + } + }) + } + this.rects.push(rect) + }) + } + this.scale = function(index, _duration, transform) { + if(!this.data){ + return; + } + let data=this.data; + let time=data[0][0] + let $self=this; + let timeScale=xScale(time); + + if(!timeScale){ + return; + } + if(this.group){ + this.group.attr('transform','translate('+timeScale+',0)') + if(chart._type == CHART_TYPE.BAR){ + if(state == 'single'){ + this.rects.forEach((rect,i)=>{ + rect.attr('x',xScale1(0)) + .attr('width',xScale.bandwidth()) + }) + }else{ + this.rects.forEach((rect,i)=>{ + rect.attr('x',xScale1(i)) + .attr('width',xScale1.bandwidth()) + }) + } + }else{ + this.rects.forEach((rect,i)=>{ + rect.attr('x',xScale1(0)) + .attr('width',xScale.bandwidth()) + }) + } + } + } +} +export function Line(chart) { + this.group = null; + this.path = null; + let state = 'multi'//区分是显示单条还是全部显示 + let dataset=chart.datas; + let svg=chart.svg; + let xScale=chart.xScale; + let yScale=chart.yScale; + let lineColor=chart.colors; + let legends=chart.options.legends; + let singleFlag=legends.find(item=>{return item.isGray == true}) + const dispatch=chart.dispatch; + + this.init = function(id) { + let arr = dataset[id]; + let legend=chart.options.legends[id]; + this.group = svg.append("g"); + let $self=this; + let line = d3.line() + .x(function(d, i) { + return xScale(d[0]); + }) + .y(function(d) { + return yScale(d[1]); + }) + .curve(d3.curveCatmullRom.alpha(0.3)); //折线曲度 + + let areaForStack = d3.area() + .x(function(d, i) { + return xScale(d[0]); + }) + // .y0(chart.height - chart._foot_height) + .y0(function(d,i){ + if(id==0){ + return chart.options.height - chart._foot_height + }else{ + if(singleFlag){ + return chart.options.height - chart._foot_height + }else{ + return yScale(dataset[id-1][i][1]) + } + } + }) + .y1(function(d) { + return yScale(d[1]) + }) + .curve(d3.curveCatmullRom.alpha(0.3)); //折线曲度 + + let areaForNormal=d3.area() + .x(function(d, i) { + return xScale(d[0]); + }) + .y0(chart.options.height - chart._foot_height) + .y1(function(d) { + return yScale(d[1]) + }) + .curve(d3.curveCatmullRom.alpha(0.3)); //折线曲度 + //添加折线 + this.path = this.group.append("path") + .attr("clip-path","url(#"+chart._clipSelector+")") + .attr("d", line(arr)) + .attr('class','event-echo-unit chart-line') + .style("fill", 'none') + .style("stroke-width", 1) + .style("stroke", legends[id].isGray?'none':lineColor[id]) + .style("stroke-opacity", 0.9) + .on('legend-single-show',function(d,i,group){ + let event=d3.event; + state='single' + let name=event.detail?event.detail.name:"" + if(legend.name != name){ + $self.group + .transition() + .duration(chart.options.duration) + .style('opacity','0') + legend.isGray=true; + }else{ + $self.group.transition() + .duration(chart.options.duration).style('opacity','1') + legend.isGray=false; + if(chart.currentTransform){ + $self.scale(id,chart.options.duration,chart.currentTransform) + }else{ + $self.group.select('.chart-area').attr('d',areaForNormal(arr)) + } + } + }) + .on('legend-all-show',function(){ + let event=d3.event; + state='multi' + $self.group.transition() + .duration(chart.options.duration).style('opacity','1') + chart.options.legends.forEach(item=>{ + item.isGray=false; + }) + if(chart.currentTransform){ + $self.scale(id,chart.options.duration,chart.currentTransform) + }else{ + $self.group.select('.chart-area').attr('d',areaForStack(arr)) + } + }) + if(chart._type==CHART_TYPE.AREA||chart._type == CHART_TYPE.STACK_AREA){ + this.area=this.group.append('path') + .attr("clip-path", "url(#"+chart._clipSelector+")") + .attr('class','chart-area') + .style('fill',legends[id].isGray?'none':lineColor[id]) + .style("stroke", 'none') + .style('opacity','.1') + if(chart._type == CHART_TYPE.AREA){ + this.area.attr('d',areaForNormal(arr)) + }else{ + this.area.attr('d',areaForStack(arr)) + } + } + }; + + this.scale = function(id, _duration, transform) { + + let arr = dataset[id]; + + let line = d3.line() + .x(function(d, i) { + return transform.applyX(xScale(d[0])) + }) + .y(function(d) { + return yScale(d[1]); + }) + let areaForNormal=d3.area() + .x(function(d, i) { + return transform.applyX(xScale(d[0])) + }) + .y0(chart.options.height - chart._foot_height) + .y1(function(d) { + return yScale(d[1]) + }) + + let areaForStack=d3.area() + .x(function(d, i) { + return transform.applyX(xScale(d[0])) + }) + .y0(function(d,i){ + if(id==0){ + return chart.options.height - chart._foot_height + }else{ + return yScale(dataset[id-1][i][1]) + } + }) + .y1(function(d) { + return yScale(d[1]) + }) + + //添加折线 + this.group.select(".chart-line") + .attr("d", line(arr)) + .style("fill", "none") + .style("stroke-width", 1) + .style("stroke", legends[id].isGray?'none':lineColor[id]) + .style("stroke-opacity", 0.9); + if(chart._type == CHART_TYPE.AREA||chart._type == CHART_TYPE.STACK_AREA){ + let area=this.group.select(".chart-area") + .style('fill',legends[id].isGray?'none':lineColor[id]) + .style("stroke", 'none') + .style('opacity','.1') + if(state == 'single'){ + area.attr("d", areaForNormal(arr)) + }else if(state == 'multi'){ + if(chart._type == CHART_TYPE.STACK_AREA) { + area.attr("d", areaForStack(arr)) + }else { + area.attr("d", areaForNormal(arr)) + } + } + } + } +} + +export function tooltipFormatter(target,params){ + target.selectAll('div') + .data(params) + .enter() + .append('div') + .html(function(d,i){ + if(!d.legend.isGray){ + return `
+
${d.legend.alias?d.legend.alias:d.legend.name}:
+
${d.value}
+
` + } + }) +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Util_20200812163454.js b/.history/nezha-fronted/src/components/charts/d3/d3Util_20200812163454.js new file mode 100644 index 000000000..d86786284 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Util_20200812163454.js @@ -0,0 +1,341 @@ +import * as d3 from "d3"; +import i18n from "../../common/i18n"; +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; + +export function CHART_TYPE(){} +CHART_TYPE.LINE='line' +CHART_TYPE.AREA='area' +CHART_TYPE.STACK_AREA='stackArea' +CHART_TYPE.BAR='bar' +CHART_TYPE.STACK_BAR='stackBar' + +export function Bar(chart){ + this.group=null; + let dataset=chart.datas; + let svg=chart.svg; + let xScale=chart.xScale; + let xScale1=chart.xScale1; + let yScale=chart.yScale; + let colors=chart.colors; + let legends=chart.options.legends; + let singleFlag=legends.find(item=>{return item.isGray==true}) + let state='multi'; + let colorScale=d3.scaleOrdinal() + .domain(chart.options.height - chart._foot_height,chart._head_height) + .range(colors) + + this.init=function(index){ + /*let data=dataset.map((item,i)=>{ + return item[index]; + })*/ + let data=dataset[index] + let time=data[0][0] + let $self=this; + let timeScale=xScale(time); + if(!timeScale){ + return; + } + this.data=data; + this.group=svg.append('g').attr("clip-path","url(#"+chart._clipSelector+")") + .append('g') + .attr('transform','translate('+timeScale+',0)') + this.rects=[]; + data.forEach((d,i)=>{ + let rect=this.group.append('g').attr('fill',legends[i].isGray?'none':colors[i]) + .append('rect') + .attr('class','event-echo-unit') + .attr('y',yScale(d[1])) + .on('legend-single-show',function(){ + state='single' + let legend=chart.options.legends[i]; + let event=d3.event; + let name=event.detail?event.detail.name:"" + if(legend.name == name){ + if(chart._type == CHART_TYPE.BAR){ + rect.transition().duration(chart.options.duration) + .attr('x',xScale1(0)) + .attr('width',xScale.bandwidth()) + .attr('fill',colors[i]) + }else{ + rect.transition().duration(chart.options.duration) + .attr('fill',colors[i]) + .attr('height', yScale(chart.minMax.min) - yScale(d[1])) + } + + legend.isGray=false; + }else{ + if(chart._type == CHART_TYPE.BAR){ + rect.attr('fill','none').attr('x',xScale1(i)).attr('width',xScale1.bandwidth()) + }else{ + rect.attr('fill','none') + } + legend.isGray=true; + } + }) + .on('legend-all-show',function(){ + state='multi' + if(chart._type == CHART_TYPE.BAR){ + rect.transition().duration(chart.options.duration) + .attr('fill',colors[i]).attr('x',xScale1(i)).attr('width',xScale1.bandwidth()) + }else{ + rect.transition().duration(chart.options.duration) + .attr('fill',colors[i]) + .attr('height',function(){ + if(i==0){ + return yScale(chart.minMax.min) - yScale(d[1]) + }else{ + let before=data[i-1]; + return yScale(before[1]) - yScale(d[1]) + } + }) + } + chart.options.legends.forEach(item=>{item.isGray=false}) + }) + + if(chart._type==CHART_TYPE.BAR){ + rect.attr('x',xScale1 (i) ) + .attr('width',xScale1.bandwidth()<=0?0.1:xScale1.bandwidth()) + .attr('height', yScale(chart.minMax.min) - yScale(d[1])) + }else{ + rect.attr('width',xScale.bandwidth()) + .attr('height',function(){ + if(i==0){ + return yScale(chart.minMax.min) - yScale(d[1]) + }else{ + if(singleFlag){ + return yScale(chart.minMax.min) - yScale(d[1]) + }else{ + let before=data[i-1]; + return yScale(before[1]) - yScale(d[1]) + } + } + }) + } + this.rects.push(rect) + }) + } + this.scale = function(index, _duration, transform) { + if(!this.data){ + return; + } + let data=this.data; + let time=data[0][0] + let $self=this; + let timeScale=xScale(time); + + if(!timeScale){ + return; + } + if(this.group){ + this.group.attr('transform','translate('+timeScale+',0)') + if(chart._type == CHART_TYPE.BAR){ + if(state == 'single'){ + this.rects.forEach((rect,i)=>{ + rect.attr('x',xScale1(0)) + .attr('width',xScale.bandwidth()) + }) + }else{ + this.rects.forEach((rect,i)=>{ + rect.attr('x',xScale1(i)) + .attr('width',xScale1.bandwidth()) + }) + } + }else{ + this.rects.forEach((rect,i)=>{ + rect.attr('x',xScale1(0)) + .attr('width',xScale.bandwidth()) + }) + } + } + } +} +export function Line(chart) { + this.group = null; + this.path = null; + let state = 'multi'//区分是显示单条还是全部显示 + let dataset=chart.datas; + let svg=chart.svg; + let xScale=chart.xScale; + let yScale=chart.yScale; + let lineColor=chart.colors; + let legends=chart.options.legends; + let singleFlag=legends.find(item=>{return item.isGray == true}) + const dispatch=chart.dispatch; + + this.init = function(id) { + let arr = dataset[id]; + let legend=chart.options.legends[id]; + this.group = svg.append("g"); + let $self=this; + let line = d3.line() + .x(function(d, i) { + return xScale(d[0]); + }) + .y(function(d) { + return yScale(d[1]); + }) + .curve(d3.curveCatmullRom.alpha(0.3)); //折线曲度 + + let areaForStack = d3.area() + .x(function(d, i) { + return xScale(d[0]); + }) + // .y0(chart.height - chart._foot_height) + .y0(function(d,i){ + if(id==0){ + return chart.options.height - chart._foot_height + }else{ + if(singleFlag){ + return chart.options.height - chart._foot_height + }else{ + return yScale(dataset[id-1][i][1]) + } + } + }) + .y1(function(d) { + return yScale(d[1]) + }) + .curve(d3.curveCatmullRom.alpha(0.3)); //折线曲度 + + let areaForNormal=d3.area() + .x(function(d, i) { + return xScale(d[0]); + }) + .y0(chart.options.height - chart._foot_height) + .y1(function(d) { + return yScale(d[1]) + }) + .curve(d3.curveCatmullRom.alpha(0.3)); //折线曲度 + //添加折线 + this.path = this.group.append("path") + .attr("clip-path","url(#"+chart._clipSelector+")") + .attr("d", line(arr)) + .attr('class','event-echo-unit chart-line') + .style("fill", 'none') + .style("stroke-width", 1) + .style("stroke", legends[id].isGray?'none':lineColor[id]) + .style("stroke-opacity", 0.9) + .on('legend-single-show',function(d,i,group){ + let event=d3.event; + state='single' + let name=event.detail?event.detail.name:"" + if(legend.name != name){ + $self.group + .transition() + .duration(chart.options.duration) + .style('opacity','0') + legend.isGray=true; + }else{ + $self.group.transition() + .duration(chart.options.duration).style('opacity','1') + legend.isGray=false; + if(chart.currentTransform){ + $self.scale(id,chart.options.duration,chart.currentTransform) + }else{ + $self.group.select('.chart-area').attr('d',areaForNormal(arr)) + } + } + }) + .on('legend-all-show',function(){ + let event=d3.event; + state='multi' + $self.group.transition() + .duration(chart.options.duration).style('opacity','1') + chart.options.legends.forEach(item=>{ + item.isGray=false; + }) + if(chart.currentTransform){ + $self.scale(id,chart.options.duration,chart.currentTransform) + }else{ + $self.group.select('.chart-area').attr('d',areaForStack(arr)) + } + }) + if(chart._type==CHART_TYPE.AREA||chart._type == CHART_TYPE.STACK_AREA){ + this.area=this.group.append('path') + .attr("clip-path", "url(#"+chart._clipSelector+")") + .attr('class','chart-area') + .style('fill',legends[id].isGray?'none':lineColor[id]) + .style("stroke", 'none') + .style('opacity','.1') + if(chart._type == CHART_TYPE.AREA){ + this.area.attr('d',areaForNormal(arr)) + }else{ + this.area.attr('d',areaForStack(arr)) + } + } + }; + + this.scale = function(id, _duration, transform) { + + let arr = dataset[id]; + + let line = d3.line() + .x(function(d, i) { + return transform.applyX(xScale(d[0])) + }) + .y(function(d) { + return yScale(d[1]); + }) + let areaForNormal=d3.area() + .x(function(d, i) { + return transform.applyX(xScale(d[0])) + }) + .y0(chart.options.height - chart._foot_height) + .y1(function(d) { + return yScale(d[1]) + }) + + let areaForStack=d3.area() + .x(function(d, i) { + return transform.applyX(xScale(d[0])) + }) + .y0(function(d,i){ + if(id==0){ + return chart.options.height - chart._foot_height + }else{ + return yScale(dataset[id-1][i][1]) + } + }) + .y1(function(d) { + return yScale(d[1]) + }) + + //添加折线 + this.group.select(".chart-line") + .attr("d", line(arr)) + .style("fill", "none") + .style("stroke-width", 1) + .style("stroke", legends[id].isGray?'none':lineColor[id]) + .style("stroke-opacity", 0.9); + if(chart._type == CHART_TYPE.AREA||chart._type == CHART_TYPE.STACK_AREA){ + let area=this.group.select(".chart-area") + .style('fill',legends[id].isGray?'none':lineColor[id]) + .style("stroke", 'none') + .style('opacity','.1') + if(state == 'single'){ + area.attr("d", areaForNormal(arr)) + }else if(state == 'multi'){ + if(chart._type == CHART_TYPE.STACK_AREA) { + area.attr("d", areaForStack(arr)) + }else { + area.attr("d", areaForNormal(arr)) + } + } + } + } +} + +export function tooltipFormatter(target,params){ + target.selectAll('div') + .data(params) + .enter() + .append('div') + .html(function(d,i){ + if(!d.legend.isGray){ + return `
+
${d.legend.alias?d.legend.alias:d.legend.name}:
+
${d.value}
+
` + } + }) +} diff --git a/.history/nezha-fronted/src/components/charts/d3/d3Util_20200812163725.js b/.history/nezha-fronted/src/components/charts/d3/d3Util_20200812163725.js new file mode 100644 index 000000000..c6de62b18 --- /dev/null +++ b/.history/nezha-fronted/src/components/charts/d3/d3Util_20200812163725.js @@ -0,0 +1,341 @@ +import * as d3 from "d3"; +import i18n from "../../common/i18n"; +import {randomcolor} from "../../common/js/radomcolor/randomcolor"; + +export function CHART_TYPE(){} +CHART_TYPE.LINE='line' +CHART_TYPE.AREA='area' +CHART_TYPE.STACK_AREA='stackArea' +CHART_TYPE.BAR='bar' +CHART_TYPE.STACK_BAR='stackBar' + +export function Bar(chart){ + this.group=null; + let dataset=chart.datas; + let svg=chart.svg; + let xScale=chart.xScale; + let xScale1=chart.xScale1; + let yScale=chart.yScale; + let colors=chart.colors; + let legends=chart.options.legends; + let singleFlag=legends.find(item=>{return item.isGray==true}) + let state='multi'; + let colorScale=d3.scaleOrdinal() + .domain(chart.options.height - chart._foot_height,chart._head_height) + .range(colors) + + this.init=function(index){ + /*let data=dataset.map((item,i)=>{ + return item[index]; + })*/ + let data=dataset[index] + let time=data[0][0] + let $self=this; + let timeScale=xScale(time); + if(!timeScale){ + return; + } + this.data=data; + this.group=svg.append('g').attr("clip-path","url(#"+chart._clipSelector+")") + .append('g') + .attr('transform','translate('+timeScale+',0)') + this.rects=[]; + data.forEach((d,i)=>{ + let rect=this.group.append('g').attr('fill',legends[i].isGray?'none':colors[i]) + .append('rect') + .attr('class','event-echo-unit') + .attr('y',yScale(d[1])) + .on('legend-single-show',function(){ + state='single' + let legend=chart.options.legends[i]; + let event=d3.event; + let name=event.detail?event.detail.name:"" + if(legend.name == name){ + if(chart._type == CHART_TYPE.BAR){ + rect.transition().duration(chart.options.duration) + .attr('x',xScale1(0)) + .attr('width',xScale.bandwidth()) + .attr('fill',colors[i]) + }else{ + rect.transition().duration(chart.options.duration) + .attr('fill',colors[i]) + .attr('height', yScale(chart.minMax.min) - yScale(d[1])) + } + + legend.isGray=false; + }else{ + if(chart._type == CHART_TYPE.BAR){ + rect.attr('fill','none').attr('x',xScale1(i)).attr('width',xScale1.bandwidth()) + }else{ + rect.attr('fill','none') + } + legend.isGray=true; + } + }) + .on('legend-all-show',function(){ + state='multi' + if(chart._type == CHART_TYPE.BAR){ + rect.transition().duration(chart.options.duration) + .attr('fill',colors[i]).attr('x',xScale1(i)).attr('width',xScale1.bandwidth()) + }else{ + rect.transition().duration(chart.options.duration) + .attr('fill',colors[i]) + .attr('height',function(){ + if(i==0){ + return yScale(chart.minMax.min) - yScale(d[1]) + }else{ + let before=data[i-1]; + return yScale(before[1]) - yScale(d[1]) + } + }) + } + chart.options.legends.forEach(item=>{item.isGray=false}) + }) + + if(chart._type==CHART_TYPE.BAR){ + rect.attr('x',xScale1 (i) ) + .attr('width',xScale1.bandwidth()<=0?0.1:xScale1.bandwidth()) + .attr('height', yScale(chart.minMax.min) - yScale(d[1])) + }else{ + rect.attr('width',xScale.bandwidth()) + .attr('height',function(){ + if(i==0){ + return yScale(chart.minMax.min) - yScale(d[1]) + }else{ + if(singleFlag){ + return yScale(chart.minMax.min) - yScale(d[1]) + }else{ + let before=data[i-1]; + return yScale(before[1]) - yScale(d[1]) + } + } + }) + } + this.rects.push(rect) + }) + } + this.scale = function(index, _duration, transform) { + if(!this.data){ + return; + } + let data=this.data; + let time=data[0][0] + let $self=this; + let timeScale=xScale(time); + + if(!timeScale){ + return; + } + if(this.group){ + this.group.attr('transform','translate('+timeScale+',0)') + if(chart._type == CHART_TYPE.BAR){ + if(state == 'single'){ + this.rects.forEach((rect,i)=>{ + rect.attr('x',xScale1(0)) + .attr('width',xScale.bandwidth()) + }) + }else{ + this.rects.forEach((rect,i)=>{ + rect.attr('x',xScale1(i)) + .attr('width',xScale1.bandwidth()<=0?0.1:xScale1.bandwidth()) + }) + } + }else{ + this.rects.forEach((rect,i)=>{ + rect.attr('x',xScale1(0)) + .attr('width',xScale.bandwidth()) + }) + } + } + } +} +export function Line(chart) { + this.group = null; + this.path = null; + let state = 'multi'//区分是显示单条还是全部显示 + let dataset=chart.datas; + let svg=chart.svg; + let xScale=chart.xScale; + let yScale=chart.yScale; + let lineColor=chart.colors; + let legends=chart.options.legends; + let singleFlag=legends.find(item=>{return item.isGray == true}) + const dispatch=chart.dispatch; + + this.init = function(id) { + let arr = dataset[id]; + let legend=chart.options.legends[id]; + this.group = svg.append("g"); + let $self=this; + let line = d3.line() + .x(function(d, i) { + return xScale(d[0]); + }) + .y(function(d) { + return yScale(d[1]); + }) + .curve(d3.curveCatmullRom.alpha(0.3)); //折线曲度 + + let areaForStack = d3.area() + .x(function(d, i) { + return xScale(d[0]); + }) + // .y0(chart.height - chart._foot_height) + .y0(function(d,i){ + if(id==0){ + return chart.options.height - chart._foot_height + }else{ + if(singleFlag){ + return chart.options.height - chart._foot_height + }else{ + return yScale(dataset[id-1][i][1]) + } + } + }) + .y1(function(d) { + return yScale(d[1]) + }) + .curve(d3.curveCatmullRom.alpha(0.3)); //折线曲度 + + let areaForNormal=d3.area() + .x(function(d, i) { + return xScale(d[0]); + }) + .y0(chart.options.height - chart._foot_height) + .y1(function(d) { + return yScale(d[1]) + }) + .curve(d3.curveCatmullRom.alpha(0.3)); //折线曲度 + //添加折线 + this.path = this.group.append("path") + .attr("clip-path","url(#"+chart._clipSelector+")") + .attr("d", line(arr)) + .attr('class','event-echo-unit chart-line') + .style("fill", 'none') + .style("stroke-width", 1) + .style("stroke", legends[id].isGray?'none':lineColor[id]) + .style("stroke-opacity", 0.9) + .on('legend-single-show',function(d,i,group){ + let event=d3.event; + state='single' + let name=event.detail?event.detail.name:"" + if(legend.name != name){ + $self.group + .transition() + .duration(chart.options.duration) + .style('opacity','0') + legend.isGray=true; + }else{ + $self.group.transition() + .duration(chart.options.duration).style('opacity','1') + legend.isGray=false; + if(chart.currentTransform){ + $self.scale(id,chart.options.duration,chart.currentTransform) + }else{ + $self.group.select('.chart-area').attr('d',areaForNormal(arr)) + } + } + }) + .on('legend-all-show',function(){ + let event=d3.event; + state='multi' + $self.group.transition() + .duration(chart.options.duration).style('opacity','1') + chart.options.legends.forEach(item=>{ + item.isGray=false; + }) + if(chart.currentTransform){ + $self.scale(id,chart.options.duration,chart.currentTransform) + }else{ + $self.group.select('.chart-area').attr('d',areaForStack(arr)) + } + }) + if(chart._type==CHART_TYPE.AREA||chart._type == CHART_TYPE.STACK_AREA){ + this.area=this.group.append('path') + .attr("clip-path", "url(#"+chart._clipSelector+")") + .attr('class','chart-area') + .style('fill',legends[id].isGray?'none':lineColor[id]) + .style("stroke", 'none') + .style('opacity','.1') + if(chart._type == CHART_TYPE.AREA){ + this.area.attr('d',areaForNormal(arr)) + }else{ + this.area.attr('d',areaForStack(arr)) + } + } + }; + + this.scale = function(id, _duration, transform) { + + let arr = dataset[id]; + + let line = d3.line() + .x(function(d, i) { + return transform.applyX(xScale(d[0])) + }) + .y(function(d) { + return yScale(d[1]); + }) + let areaForNormal=d3.area() + .x(function(d, i) { + return transform.applyX(xScale(d[0])) + }) + .y0(chart.options.height - chart._foot_height) + .y1(function(d) { + return yScale(d[1]) + }) + + let areaForStack=d3.area() + .x(function(d, i) { + return transform.applyX(xScale(d[0])) + }) + .y0(function(d,i){ + if(id==0){ + return chart.options.height - chart._foot_height + }else{ + return yScale(dataset[id-1][i][1]) + } + }) + .y1(function(d) { + return yScale(d[1]) + }) + + //添加折线 + this.group.select(".chart-line") + .attr("d", line(arr)) + .style("fill", "none") + .style("stroke-width", 1) + .style("stroke", legends[id].isGray?'none':lineColor[id]) + .style("stroke-opacity", 0.9); + if(chart._type == CHART_TYPE.AREA||chart._type == CHART_TYPE.STACK_AREA){ + let area=this.group.select(".chart-area") + .style('fill',legends[id].isGray?'none':lineColor[id]) + .style("stroke", 'none') + .style('opacity','.1') + if(state == 'single'){ + area.attr("d", areaForNormal(arr)) + }else if(state == 'multi'){ + if(chart._type == CHART_TYPE.STACK_AREA) { + area.attr("d", areaForStack(arr)) + }else { + area.attr("d", areaForNormal(arr)) + } + } + } + } +} + +export function tooltipFormatter(target,params){ + target.selectAll('div') + .data(params) + .enter() + .append('div') + .html(function(d,i){ + if(!d.legend.isGray){ + return `
+
${d.legend.alias?d.legend.alias:d.legend.name}:
+
${d.value}
+
` + } + }) +} diff --git a/.history/nezha-fronted/src/components/common/leftMenu_20200915192236.vue b/.history/nezha-fronted/src/components/common/leftMenu_20200915192236.vue new file mode 100644 index 000000000..5883df0c5 --- /dev/null +++ b/.history/nezha-fronted/src/components/common/leftMenu_20200915192236.vue @@ -0,0 +1,746 @@ + + + + + + diff --git a/.history/nezha-fronted/src/components/common/leftMenu_20200916094704.vue b/.history/nezha-fronted/src/components/common/leftMenu_20200916094704.vue new file mode 100644 index 000000000..d549150f5 --- /dev/null +++ b/.history/nezha-fronted/src/components/common/leftMenu_20200916094704.vue @@ -0,0 +1,746 @@ + + + + + + diff --git a/.history/nezha-fronted/src/components/common/leftMenu_20200916094813.vue b/.history/nezha-fronted/src/components/common/leftMenu_20200916094813.vue new file mode 100644 index 000000000..d324ec8da --- /dev/null +++ b/.history/nezha-fronted/src/components/common/leftMenu_20200916094813.vue @@ -0,0 +1,746 @@ + + + + + + diff --git a/.history/nezha-fronted/src/components/common/leftMenu_20200916095123.vue b/.history/nezha-fronted/src/components/common/leftMenu_20200916095123.vue new file mode 100644 index 000000000..ad2111118 --- /dev/null +++ b/.history/nezha-fronted/src/components/common/leftMenu_20200916095123.vue @@ -0,0 +1,751 @@ + + + + + + diff --git a/.history/nezha-fronted/src/components/common/leftMenu_20200916095129.vue b/.history/nezha-fronted/src/components/common/leftMenu_20200916095129.vue new file mode 100644 index 000000000..90b2dc8e7 --- /dev/null +++ b/.history/nezha-fronted/src/components/common/leftMenu_20200916095129.vue @@ -0,0 +1,751 @@ + + + + + + diff --git a/.history/nezha-fronted/src/components/common/leftMenu_20200916095131.vue b/.history/nezha-fronted/src/components/common/leftMenu_20200916095131.vue new file mode 100644 index 000000000..f0347a0b9 --- /dev/null +++ b/.history/nezha-fronted/src/components/common/leftMenu_20200916095131.vue @@ -0,0 +1,751 @@ + + + + + + diff --git a/.history/nezha-fronted/src/components/common/leftMenu_20200916095134.vue b/.history/nezha-fronted/src/components/common/leftMenu_20200916095134.vue new file mode 100644 index 000000000..4084cd7ea --- /dev/null +++ b/.history/nezha-fronted/src/components/common/leftMenu_20200916095134.vue @@ -0,0 +1,751 @@ + + + + + + diff --git a/.history/nezha-fronted/src/components/common/leftMenu_20200916095136.vue b/.history/nezha-fronted/src/components/common/leftMenu_20200916095136.vue new file mode 100644 index 000000000..b0d95ea10 --- /dev/null +++ b/.history/nezha-fronted/src/components/common/leftMenu_20200916095136.vue @@ -0,0 +1,751 @@ + + + + + + diff --git a/.history/nezha-fronted/src/components/common/leftMenu_20200916095139.vue b/.history/nezha-fronted/src/components/common/leftMenu_20200916095139.vue new file mode 100644 index 000000000..8e9cd308a --- /dev/null +++ b/.history/nezha-fronted/src/components/common/leftMenu_20200916095139.vue @@ -0,0 +1,751 @@ + + + + + + diff --git a/.history/nezha-fronted/src/components/common/leftMenu_20200916095141.vue b/.history/nezha-fronted/src/components/common/leftMenu_20200916095141.vue new file mode 100644 index 000000000..425e8f69e --- /dev/null +++ b/.history/nezha-fronted/src/components/common/leftMenu_20200916095141.vue @@ -0,0 +1,751 @@ + + + + + + diff --git a/.history/nezha-fronted/src/components/common/leftMenu_20200916095151.vue b/.history/nezha-fronted/src/components/common/leftMenu_20200916095151.vue new file mode 100644 index 000000000..dd2e6c0fb --- /dev/null +++ b/.history/nezha-fronted/src/components/common/leftMenu_20200916095151.vue @@ -0,0 +1,751 @@ + + + + + + diff --git a/.history/nezha-fronted/src/components/common/leftMenu_20200916095156.vue b/.history/nezha-fronted/src/components/common/leftMenu_20200916095156.vue new file mode 100644 index 000000000..e76564de4 --- /dev/null +++ b/.history/nezha-fronted/src/components/common/leftMenu_20200916095156.vue @@ -0,0 +1,751 @@ + + + + + + diff --git a/.history/nezha-fronted/src/components/common/leftMenu_20200916095202.vue b/.history/nezha-fronted/src/components/common/leftMenu_20200916095202.vue new file mode 100644 index 000000000..f3781024d --- /dev/null +++ b/.history/nezha-fronted/src/components/common/leftMenu_20200916095202.vue @@ -0,0 +1,751 @@ + + + + + + diff --git a/.history/nezha-fronted/src/components/common/leftMenu_20200916095205.vue b/.history/nezha-fronted/src/components/common/leftMenu_20200916095205.vue new file mode 100644 index 000000000..50bc19db6 --- /dev/null +++ b/.history/nezha-fronted/src/components/common/leftMenu_20200916095205.vue @@ -0,0 +1,751 @@ + + + + + + diff --git a/.history/nezha-fronted/src/components/common/leftMenu_20200916095211.vue b/.history/nezha-fronted/src/components/common/leftMenu_20200916095211.vue new file mode 100644 index 000000000..49a22bc76 --- /dev/null +++ b/.history/nezha-fronted/src/components/common/leftMenu_20200916095211.vue @@ -0,0 +1,751 @@ + + + + + + diff --git a/.history/nezha-fronted/src/components/common/leftMenu_20200916095214.vue b/.history/nezha-fronted/src/components/common/leftMenu_20200916095214.vue new file mode 100644 index 000000000..49a22bc76 --- /dev/null +++ b/.history/nezha-fronted/src/components/common/leftMenu_20200916095214.vue @@ -0,0 +1,751 @@ + + + + + + diff --git a/.history/nezha-fronted/src/components/common/leftMenu_20200916095353.vue b/.history/nezha-fronted/src/components/common/leftMenu_20200916095353.vue new file mode 100644 index 000000000..66bd35b43 --- /dev/null +++ b/.history/nezha-fronted/src/components/common/leftMenu_20200916095353.vue @@ -0,0 +1,750 @@ + + + + + + diff --git a/.history/nezha-fronted/src/components/common/leftMenu_20200916095941.vue b/.history/nezha-fronted/src/components/common/leftMenu_20200916095941.vue new file mode 100644 index 000000000..cbcdb8e56 --- /dev/null +++ b/.history/nezha-fronted/src/components/common/leftMenu_20200916095941.vue @@ -0,0 +1,751 @@ + + + + + + diff --git a/.history/nezha-fronted/src/components/common/leftMenu_20200916095943.vue b/.history/nezha-fronted/src/components/common/leftMenu_20200916095943.vue new file mode 100644 index 000000000..0f9213b4f --- /dev/null +++ b/.history/nezha-fronted/src/components/common/leftMenu_20200916095943.vue @@ -0,0 +1,751 @@ + + + + + + diff --git a/.history/nezha-fronted/src/components/common/leftMenu_20200916095947.vue b/.history/nezha-fronted/src/components/common/leftMenu_20200916095947.vue new file mode 100644 index 000000000..7c38c27c1 --- /dev/null +++ b/.history/nezha-fronted/src/components/common/leftMenu_20200916095947.vue @@ -0,0 +1,751 @@ + + + + + + diff --git a/.history/nezha-fronted/src/components/common/leftMenu_20200916100004.vue b/.history/nezha-fronted/src/components/common/leftMenu_20200916100004.vue new file mode 100644 index 000000000..945231662 --- /dev/null +++ b/.history/nezha-fronted/src/components/common/leftMenu_20200916100004.vue @@ -0,0 +1,751 @@ + + + + + + diff --git a/.history/nezha-fronted/src/components/common/leftMenu_20200916100006.vue b/.history/nezha-fronted/src/components/common/leftMenu_20200916100006.vue new file mode 100644 index 000000000..5640db6df --- /dev/null +++ b/.history/nezha-fronted/src/components/common/leftMenu_20200916100006.vue @@ -0,0 +1,751 @@ + + + + + + diff --git a/.history/nezha-fronted/src/components/common/leftMenu_20200916100007.vue b/.history/nezha-fronted/src/components/common/leftMenu_20200916100007.vue new file mode 100644 index 000000000..df9765350 --- /dev/null +++ b/.history/nezha-fronted/src/components/common/leftMenu_20200916100007.vue @@ -0,0 +1,751 @@ + + + + + + diff --git a/.history/nezha-fronted/src/components/common/leftMenu_20200916100014.vue b/.history/nezha-fronted/src/components/common/leftMenu_20200916100014.vue new file mode 100644 index 000000000..10253cfc2 --- /dev/null +++ b/.history/nezha-fronted/src/components/common/leftMenu_20200916100014.vue @@ -0,0 +1,751 @@ + + + + + + diff --git a/.history/nezha-fronted/src/components/common/leftMenu_20200916100015.vue b/.history/nezha-fronted/src/components/common/leftMenu_20200916100015.vue new file mode 100644 index 000000000..10253cfc2 --- /dev/null +++ b/.history/nezha-fronted/src/components/common/leftMenu_20200916100015.vue @@ -0,0 +1,751 @@ + + + + + + diff --git a/.history/nezha-fronted/src/components/common/leftMenu_20200916100210.vue b/.history/nezha-fronted/src/components/common/leftMenu_20200916100210.vue new file mode 100644 index 000000000..4bfa918fb --- /dev/null +++ b/.history/nezha-fronted/src/components/common/leftMenu_20200916100210.vue @@ -0,0 +1,751 @@ + + + + + + diff --git a/.history/nezha-fronted/src/components/common/leftMenu_20200916100228.vue b/.history/nezha-fronted/src/components/common/leftMenu_20200916100228.vue new file mode 100644 index 000000000..21f6c1896 --- /dev/null +++ b/.history/nezha-fronted/src/components/common/leftMenu_20200916100228.vue @@ -0,0 +1,752 @@ + + + + + + diff --git a/.history/nezha-fronted/src/components/common/leftMenu_20200916100233.vue b/.history/nezha-fronted/src/components/common/leftMenu_20200916100233.vue new file mode 100644 index 000000000..63152493b --- /dev/null +++ b/.history/nezha-fronted/src/components/common/leftMenu_20200916100233.vue @@ -0,0 +1,752 @@ + + + + + + diff --git a/.history/nezha-fronted/src/components/common/leftMenu_20200916100234.vue b/.history/nezha-fronted/src/components/common/leftMenu_20200916100234.vue new file mode 100644 index 000000000..ded122002 --- /dev/null +++ b/.history/nezha-fronted/src/components/common/leftMenu_20200916100234.vue @@ -0,0 +1,752 @@ + + + + + + diff --git a/.history/nezha-fronted/src/components/common/leftMenu_20200916100237.vue b/.history/nezha-fronted/src/components/common/leftMenu_20200916100237.vue new file mode 100644 index 000000000..cb0127d53 --- /dev/null +++ b/.history/nezha-fronted/src/components/common/leftMenu_20200916100237.vue @@ -0,0 +1,752 @@ + + + + + + diff --git a/.history/nezha-fronted/src/components/common/leftMenu_20200916100240.vue b/.history/nezha-fronted/src/components/common/leftMenu_20200916100240.vue new file mode 100644 index 000000000..dddeb4f6d --- /dev/null +++ b/.history/nezha-fronted/src/components/common/leftMenu_20200916100240.vue @@ -0,0 +1,752 @@ + + + + + + diff --git a/.history/nezha-fronted/src/components/common/leftMenu_20200916100241.vue b/.history/nezha-fronted/src/components/common/leftMenu_20200916100241.vue new file mode 100644 index 000000000..80e36f606 --- /dev/null +++ b/.history/nezha-fronted/src/components/common/leftMenu_20200916100241.vue @@ -0,0 +1,752 @@ + + + + + + diff --git a/.history/nezha-fronted/src/components/common/leftMenu_20200916100243.vue b/.history/nezha-fronted/src/components/common/leftMenu_20200916100243.vue new file mode 100644 index 000000000..c7a4fbb57 --- /dev/null +++ b/.history/nezha-fronted/src/components/common/leftMenu_20200916100243.vue @@ -0,0 +1,752 @@ + + + + + + diff --git a/.history/nezha-fronted/src/components/common/leftMenu_20200916100422.vue b/.history/nezha-fronted/src/components/common/leftMenu_20200916100422.vue new file mode 100644 index 000000000..096ace504 --- /dev/null +++ b/.history/nezha-fronted/src/components/common/leftMenu_20200916100422.vue @@ -0,0 +1,752 @@ + + + + + + diff --git a/.history/nezha-fronted/src/components/common/leftMenu_20200916100606.vue b/.history/nezha-fronted/src/components/common/leftMenu_20200916100606.vue new file mode 100644 index 000000000..a0b5818f2 --- /dev/null +++ b/.history/nezha-fronted/src/components/common/leftMenu_20200916100606.vue @@ -0,0 +1,752 @@ + + + + + + diff --git a/.history/nezha-fronted/src/components/page/asset/assetAddUnit_20200109174241.vue b/.history/nezha-fronted/src/components/page/asset/assetAddUnit_20200109174241.vue new file mode 100644 index 000000000..948dc4a5f --- /dev/null +++ b/.history/nezha-fronted/src/components/page/asset/assetAddUnit_20200109174241.vue @@ -0,0 +1,1479 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/asset/assetAddUnit_20200110100141.vue b/.history/nezha-fronted/src/components/page/asset/assetAddUnit_20200110100141.vue new file mode 100644 index 000000000..52bc802ab --- /dev/null +++ b/.history/nezha-fronted/src/components/page/asset/assetAddUnit_20200110100141.vue @@ -0,0 +1,1479 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/asset/asset_20200915191245.vue b/.history/nezha-fronted/src/components/page/asset/asset_20200915191245.vue new file mode 100644 index 000000000..36f3a8bc3 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/asset/asset_20200915191245.vue @@ -0,0 +1,793 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/asset/asset_20200916095227.vue b/.history/nezha-fronted/src/components/page/asset/asset_20200916095227.vue new file mode 100644 index 000000000..27ac1b420 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/asset/asset_20200916095227.vue @@ -0,0 +1,792 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191454.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191454.vue new file mode 100644 index 000000000..d498fff9a --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191454.vue @@ -0,0 +1,72 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191738.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191738.vue new file mode 100644 index 000000000..a17a47641 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191738.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191743.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191743.vue new file mode 100644 index 000000000..c3f454b84 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191743.vue @@ -0,0 +1,52 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191745.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191745.vue new file mode 100644 index 000000000..804f88527 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191745.vue @@ -0,0 +1,52 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191751.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191751.vue new file mode 100644 index 000000000..80fa0a32b --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191751.vue @@ -0,0 +1,51 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191754.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191754.vue new file mode 100644 index 000000000..5b419694b --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191754.vue @@ -0,0 +1,50 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191806.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191806.vue new file mode 100644 index 000000000..c1b868fd3 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191806.vue @@ -0,0 +1,50 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191810.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191810.vue new file mode 100644 index 000000000..e2a5226e6 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191810.vue @@ -0,0 +1,50 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191811.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191811.vue new file mode 100644 index 000000000..8126b90f2 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191811.vue @@ -0,0 +1,50 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191813.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191813.vue new file mode 100644 index 000000000..99cb7362f --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191813.vue @@ -0,0 +1,50 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191814.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191814.vue new file mode 100644 index 000000000..03ba3a692 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191814.vue @@ -0,0 +1,50 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191815.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191815.vue new file mode 100644 index 000000000..ccbb60916 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191815.vue @@ -0,0 +1,50 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191824.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191824.vue new file mode 100644 index 000000000..c01c9eaa0 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191824.vue @@ -0,0 +1,56 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191843.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191843.vue new file mode 100644 index 000000000..0a4e6ce94 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191843.vue @@ -0,0 +1,56 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191846.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191846.vue new file mode 100644 index 000000000..4c9399381 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191846.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191856.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191856.vue new file mode 100644 index 000000000..b67a850f9 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191856.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191859.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191859.vue new file mode 100644 index 000000000..4c9399381 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191859.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191912.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191912.vue new file mode 100644 index 000000000..2c88cd127 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191912.vue @@ -0,0 +1,51 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191914.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191914.vue new file mode 100644 index 000000000..fd6311334 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191914.vue @@ -0,0 +1,51 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191918.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191918.vue new file mode 100644 index 000000000..0c684ae50 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191918.vue @@ -0,0 +1,51 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191921.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191921.vue new file mode 100644 index 000000000..0c684ae50 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609191921.vue @@ -0,0 +1,51 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192625.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192625.vue new file mode 100644 index 000000000..06a7c9286 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192625.vue @@ -0,0 +1,51 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192834.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192834.vue new file mode 100644 index 000000000..1e6dd855b --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192834.vue @@ -0,0 +1,50 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192842.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192842.vue new file mode 100644 index 000000000..1e6dd855b --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192842.vue @@ -0,0 +1,50 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192844.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192844.vue new file mode 100644 index 000000000..be1b187be --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192844.vue @@ -0,0 +1,49 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192851.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192851.vue new file mode 100644 index 000000000..2151fb843 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192851.vue @@ -0,0 +1,50 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192855.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192855.vue new file mode 100644 index 000000000..a5d568912 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192855.vue @@ -0,0 +1,50 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192858.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192858.vue new file mode 100644 index 000000000..1c953a619 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192858.vue @@ -0,0 +1,50 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192901.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192901.vue new file mode 100644 index 000000000..eb4e67157 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192901.vue @@ -0,0 +1,50 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192904.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192904.vue new file mode 100644 index 000000000..0babd209a --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192904.vue @@ -0,0 +1,50 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192912.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192912.vue new file mode 100644 index 000000000..932a1e517 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192912.vue @@ -0,0 +1,50 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192937.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192937.vue new file mode 100644 index 000000000..791b65b5c --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192937.vue @@ -0,0 +1,50 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192939.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192939.vue new file mode 100644 index 000000000..c80a1556b --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192939.vue @@ -0,0 +1,52 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192944.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192944.vue new file mode 100644 index 000000000..881f6e01c --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192944.vue @@ -0,0 +1,52 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192947.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192947.vue new file mode 100644 index 000000000..0e2e96e0c --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192947.vue @@ -0,0 +1,52 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192950.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192950.vue new file mode 100644 index 000000000..6697ed5fb --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192950.vue @@ -0,0 +1,52 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192952.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192952.vue new file mode 100644 index 000000000..522f009b5 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192952.vue @@ -0,0 +1,52 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192958.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192958.vue new file mode 100644 index 000000000..17fd9c4b1 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609192958.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193000.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193000.vue new file mode 100644 index 000000000..70987f448 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193000.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193043.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193043.vue new file mode 100644 index 000000000..afa76748c --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193043.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193046.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193046.vue new file mode 100644 index 000000000..c3a598c2d --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193046.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193135.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193135.vue new file mode 100644 index 000000000..a945257ad --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193135.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193147.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193147.vue new file mode 100644 index 000000000..17fd9c4b1 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193147.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193151.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193151.vue new file mode 100644 index 000000000..0a189371c --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193151.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193154.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193154.vue new file mode 100644 index 000000000..aa2911ef4 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193154.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193155.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193155.vue new file mode 100644 index 000000000..eb6d0f82f --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193155.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193226.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193226.vue new file mode 100644 index 000000000..aa2b499e4 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193226.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193234.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193234.vue new file mode 100644 index 000000000..eb6d0f82f --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193234.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193235.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193235.vue new file mode 100644 index 000000000..eb6d0f82f --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193235.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193244.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193244.vue new file mode 100644 index 000000000..9cbc18e8b --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193244.vue @@ -0,0 +1,55 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193250.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193250.vue new file mode 100644 index 000000000..8347e8e82 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193250.vue @@ -0,0 +1,55 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193254.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193254.vue new file mode 100644 index 000000000..d9df9b2c2 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193254.vue @@ -0,0 +1,55 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193338.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193338.vue new file mode 100644 index 000000000..289aa192f --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193338.vue @@ -0,0 +1,55 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193343.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193343.vue new file mode 100644 index 000000000..e15c4f021 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193343.vue @@ -0,0 +1,55 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193344.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193344.vue new file mode 100644 index 000000000..38287b6d9 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193344.vue @@ -0,0 +1,55 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193350.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193350.vue new file mode 100644 index 000000000..b70d9c8c0 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193350.vue @@ -0,0 +1,55 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193352.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193352.vue new file mode 100644 index 000000000..5898d33cd --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193352.vue @@ -0,0 +1,55 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193354.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193354.vue new file mode 100644 index 000000000..248e131d6 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193354.vue @@ -0,0 +1,55 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193355.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193355.vue new file mode 100644 index 000000000..f18866056 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193355.vue @@ -0,0 +1,55 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193357.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193357.vue new file mode 100644 index 000000000..afe3e8013 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193357.vue @@ -0,0 +1,55 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193358.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193358.vue new file mode 100644 index 000000000..bcd277059 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193358.vue @@ -0,0 +1,55 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193400.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193400.vue new file mode 100644 index 000000000..58aaa34a9 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193400.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193405.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193405.vue new file mode 100644 index 000000000..58aaa34a9 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193405.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193408.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193408.vue new file mode 100644 index 000000000..07357e5ed --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193408.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193410.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193410.vue new file mode 100644 index 000000000..063050c2a --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193410.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193413.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193413.vue new file mode 100644 index 000000000..da9e433b1 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193413.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193416.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193416.vue new file mode 100644 index 000000000..22f8ec019 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193416.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193438.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193438.vue new file mode 100644 index 000000000..9dad40a71 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193438.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193443.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193443.vue new file mode 100644 index 000000000..737d2cd38 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193443.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193448.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193448.vue new file mode 100644 index 000000000..f1b943a51 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193448.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193451.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193451.vue new file mode 100644 index 000000000..dd0b437a2 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193451.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193452.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193452.vue new file mode 100644 index 000000000..e3276f94b --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193452.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193455.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193455.vue new file mode 100644 index 000000000..a8deafb03 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193455.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193515.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193515.vue new file mode 100644 index 000000000..99a31b293 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193515.vue @@ -0,0 +1,58 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193520.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193520.vue new file mode 100644 index 000000000..94f82db77 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193520.vue @@ -0,0 +1,58 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193521.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193521.vue new file mode 100644 index 000000000..8b77b0666 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193521.vue @@ -0,0 +1,58 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193548.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193548.vue new file mode 100644 index 000000000..c553e9833 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193548.vue @@ -0,0 +1,58 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193616.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193616.vue new file mode 100644 index 000000000..2a0d9f08a --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193616.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193618.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193618.vue new file mode 100644 index 000000000..1bcde94dd --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193618.vue @@ -0,0 +1,58 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193622.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193622.vue new file mode 100644 index 000000000..118c1768d --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193622.vue @@ -0,0 +1,58 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193627.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193627.vue new file mode 100644 index 000000000..4830d9e9c --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193627.vue @@ -0,0 +1,58 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193707.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193707.vue new file mode 100644 index 000000000..0ee23d6eb --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193707.vue @@ -0,0 +1,58 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193709.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193709.vue new file mode 100644 index 000000000..0ee23d6eb --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193709.vue @@ -0,0 +1,58 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193744.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193744.vue new file mode 100644 index 000000000..bffdef4a0 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193744.vue @@ -0,0 +1,59 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193750.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193750.vue new file mode 100644 index 000000000..5e2270685 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193750.vue @@ -0,0 +1,59 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193753.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193753.vue new file mode 100644 index 000000000..f542663b4 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193753.vue @@ -0,0 +1,59 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193754.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193754.vue new file mode 100644 index 000000000..fc71bd416 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609193754.vue @@ -0,0 +1,59 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609194242.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609194242.vue new file mode 100644 index 000000000..41e2b2fc7 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609194242.vue @@ -0,0 +1,59 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609194244.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609194244.vue new file mode 100644 index 000000000..ded9e9768 --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200609194244.vue @@ -0,0 +1,59 @@ + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200622181933.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200622181933.vue new file mode 100644 index 000000000..5a181166a --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200622181933.vue @@ -0,0 +1,854 @@ + + + + + + diff --git a/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200622182033.vue b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200622182033.vue new file mode 100644 index 000000000..fdc2406dc --- /dev/null +++ b/.history/nezha-fronted/src/components/page/dashboard/explore/editor_20200622182033.vue @@ -0,0 +1,841 @@ + + + + + + diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 000000000..e7e9d11d4 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,2 @@ +# Default ignored files +/workspace.xml diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 000000000..28a804d89 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 000000000..382ade5b5 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/nezha-fronted.iml b/.idea/nezha-fronted.iml new file mode 100644 index 000000000..c956989b2 --- /dev/null +++ b/.idea/nezha-fronted.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 000000000..94a25f7f4 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/nezha-fronted/src/components/common/exportXLSX.vue b/nezha-fronted/src/components/common/exportXLSX.vue index 351e221ac..4723a3cbd 100644 --- a/nezha-fronted/src/components/common/exportXLSX.vue +++ b/nezha-fronted/src/components/common/exportXLSX.vue @@ -135,6 +135,8 @@ url = "/endpoint/cancelImport"; } else if (this.importUrl.indexOf("rule") > -1) { url = "/alert/rule/cancelImport"; + } else if(this.importUrl.indexOf("panel") > -1){ + url = "/panel/cancelImport"; } this.$delete(url + '?seq='+this.importResult.seq).then(response=>{ if(response.code == 200 ){ @@ -186,6 +188,8 @@ url = "/asset/template"; } else if (this.importUrl.indexOf("rule") > -1) { url = "/alert/rule/template"; + } else if (this.importUrl.indexOf('panel') > -1){ + url = "/panel/template"; } let param={language:language} diff --git a/nezha-fronted/src/components/common/leftMenu.vue b/nezha-fronted/src/components/common/leftMenu.vue index 3c7f1f554..a0b5818f2 100644 --- a/nezha-fronted/src/components/common/leftMenu.vue +++ b/nezha-fronted/src/components/common/leftMenu.vue @@ -106,7 +106,7 @@ Tag - + @@ -538,11 +538,6 @@ return "--"; } }, - flushData() { - Promise.all([this.getLeftMenuList()]).then(response => { - this.getTableData(); - }); - }, closeAllPop() { this.$refs.idcConfigBox.forEach((item) => { item.show(false); @@ -624,31 +619,18 @@ this.$set(this.searchLabel, "orderBy", orderBy); this.getTableData(); }, - // 获取左侧菜单数据 - getLeftMenuList(){ - return new Promise(resolve => { - this.$get('asset/filter').then(response => { - if (response.code === 200) { - //dc - this.dcData = response.data.dc; - // AssetType - this.assetTypeData = response.data.assetType; - // vendor - this.vendorData = response.data.vendor; - // ping - this.pingData = response.data.ping.map(item => { - item.label = item.name; - item.value = item.status; - return item; - }); - } - resolve(); - }); - }); - }, initEvent() { bus.$on("asset-filter-change", (column, content) => { - this.pageObj[column] = content; + if(column == 'multiParam'){ + let $self=this; + if(content instanceof Array && content.length>0){ + content.forEach(item=>{ + $self.pageObj[item.key] = item.value; + }) + } + }else{ + this.pageObj[column] = content; + } this.getTableData(); }); }, diff --git a/nezha-fronted/src/components/page/config/util.vue b/nezha-fronted/src/components/page/config/util.vue new file mode 100644 index 000000000..0c0e6d088 --- /dev/null +++ b/nezha-fronted/src/components/page/config/util.vue @@ -0,0 +1,60 @@ + + diff --git a/nezha-fronted/src/components/page/dashboard/panel.vue b/nezha-fronted/src/components/page/dashboard/panel.vue index dbc4bc4a1..d67f0dbb7 100644 --- a/nezha-fronted/src/components/page/dashboard/panel.vue +++ b/nezha-fronted/src/components/page/dashboard/panel.vue @@ -50,10 +50,20 @@ - + + + @@ -83,6 +93,7 @@ import timePicker from '../../common/timePicker' import draggable from 'vuedraggable' import pickTime from "../../common/pickTime"; + import exportXLSX from "../../common/exportXLSX"; export default { name: "panel", data() { @@ -162,6 +173,7 @@ 'time-picker':timePicker, draggable, 'pick-time':pickTime, + 'export-excel':exportXLSX, }, methods: { //刷新 diff --git a/nezha-fronted/static/ueditor-1.4.3.3/.editorconfig b/nezha-fronted/static/ueditor-1.4.3.3/.editorconfig new file mode 100644 index 000000000..fa31fcbec --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/.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/nezha-fronted/static/ueditor-1.4.3.3/.gitignore b/nezha-fronted/static/ueditor-1.4.3.3/.gitignore new file mode 100644 index 000000000..8260c4f7d --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/.gitignore @@ -0,0 +1,192 @@ +############### +# 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 diff --git a/nezha-fronted/static/ueditor-1.4.3.3/Gruntfile.js b/nezha-fronted/static/ueditor-1.4.3.3/Gruntfile.js new file mode 100644 index 000000000..ff2cf9eaa --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/Gruntfile.js @@ -0,0 +1,272 @@ +'use strict'; + +module.exports = function (grunt) { + + var fs = require("fs"), + Util = { + + jsBasePath: '_src/', + parseBasePath: '_parse/', + cssBasePath: 'themes/default/_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 + "ueditor.css"), + filepath = null, + pattern = /@import\s+([^;]+)*;/g, + src = []; + + while (filepath = pattern.exec(sources)) { + src.push(this.cssBasePath + filepath[ 1 ].replace(/'|"/g, "")); + } + + return src; + + } + + }, + packageJson = grunt.file.readJSON('package.json'), + server = grunt.option('server') || 'php', + encode = grunt.option('encode') || 'utf8', + disDir = "dist/", + banner = '/*!\n * UEditor\n * version: ' + packageJson.name + '\n * build: <%= new Date() %>\n */\n\n'; + + //init + (function () { + + server = typeof server === "string" ? server.toLowerCase() : 'php'; + encode = typeof encode === "string" ? encode.toLowerCase() : 'utf8'; + + disDir = 'dist/' + encode + '-' + server + '/'; + + })(); + + grunt.initConfig({ + pkg: packageJson, + concat: { + js: { + options: { + banner: banner + '(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: banner + '(function(){\n\n', + footer: '\n\n})();\n' + }, + src: Util.fetchScripts("ueditor.parse.js", Util.parseBasePath), + dest: disDir + packageJson.name + '.parse.js' + }, + css: { + src: Util.fetchStyles(), + dest: disDir + 'themes/default/css/ueditor.css' + } + }, + cssmin: { + options: { + banner: banner + }, + files: { + expand: true, + cwd: disDir + 'themes/default/css/', + src: ['*.css', '!*.min.css'], + dest: disDir + 'themes/default/css/', + ext: '.min.css' + } + }, + uglify: { + options: { + banner: banner + }, + dest: { + src: disDir + '<%= pkg.name %>.all.js', + dest: disDir + '<%= pkg.name %>.all.min.js' + }, + parse: { + src: disDir + '<%= pkg.name %>.parse.js', + dest: disDir + '<%= pkg.name %>.parse.min.js' + } + }, + copy: { + base: { + files: [ + { + + src: [ '*.html', 'themes/iframe.css', 'themes/default/dialogbase.css', 'themes/default/images/**', 'dialogs/**', 'lang/**', 'third-party/**' ], + dest: disDir + + } + ] + }, + demo: { + files: [ + { + src: '_examples/completeDemo.html', + dest: disDir + 'index.html' + } + ] + }, + php: { + + expand: true, + src: 'php/**', + dest: disDir + + }, + asp: { + + expand: true, + src: 'asp/**', + dest: disDir + + }, + jsp: { + + expand: true, + src: 'jsp/**', + dest: disDir + + }, + net: { + + expand: true, + src: 'net/**', + dest: disDir + + } + }, + transcoding: { + + options: { + charset: encode + }, + src: [disDir + '**/*.html', disDir + '**/*.js', disDir + '**/*.css', disDir + '**/*.json', disDir + '**/*.jsp', disDir + '**/*.asp'] + + }, + replace: { + + fileEncode: { + src: [ disDir + '**/*.html', disDir + 'dialogs/**/*.js', disDir + '**/*.css', disDir + '**/*.php', disDir + '**/*.jsp', disDir + '**/*.ashx', disDir + '**/*.asp' ], + 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' + } + ] + }, + gbkasp: { + src: [ disDir + 'asp/*.asp' ], + overwrite: true, + replacements: [ + { + from: /65001/gi, + to: '936' + } + ] + } + + }, + clean: { + build: { + src: [ + disDir + "jsp/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('default', 'UEditor build', function () { + + var tasks = [ 'concat', 'cssmin', 'uglify', 'copy:base', 'copy:' + server, 'copy:demo', 'replace:demo', 'clean' ]; + + if (encode === 'gbk') { + tasks.push('replace:fileEncode'); + if (server === 'asp') { + tasks.push('replace:gbkasp'); + } + } + + tasks.push('transcoding'); + + //config修改 + updateConfigFile(); + + grunt.task.run(tasks); + + }); + + + function updateConfigFile() { + + var filename = 'ueditor.config.js', + file = grunt.file.read(filename), + path = server + "/", + suffix = server === "net" ? ".ashx" : "." + server; + + file = file.replace(/php\//ig, path).replace(/\.php/ig, suffix); + + 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/nezha-fronted/static/ueditor-1.4.3.3/LICENSE b/nezha-fronted/static/ueditor-1.4.3.3/LICENSE new file mode 100644 index 000000000..e84721923 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2013 ueditor + +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. \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/README.md b/nezha-fronted/static/ueditor-1.4.3.3/README.md new file mode 100644 index 000000000..b452f4330 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/README.md @@ -0,0 +1,90 @@ +Get Started +===== + +## ueditor富文本编辑器介绍 + +UEditor是由百度web前端研发部开发所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点,开源基于MIT协议,允许自由使用和修改代码。 + +## 入门部署和体验 ## + +### 第一步:下载编辑器 ### + +到官网下载ueditor最新版:[[官网地址]](http://ueditor.baidu.com/website/download.html#ueditor "官网下载地址") + +### 第二步:创建demo文件 ### +解压下载的包,在解压后的目录创建demo.html文件,填入下面的html代码 + +```html + + + + + ueditor demo + + + + + + + + + + + + +``` + +### 第三步:在浏览器打开demo.html ### + +如果看到了下面这样的编辑器,恭喜你,初次部署成功! + +![部署成功](http://fex.baidu.com/ueditor/doc/images/demo.png) + +### 自定义的参数 + +编辑器有很多可自定义的参数项,在实例化的时候可以传入给编辑器: +```javascript +var ue = UE.getEditor('container', { + autoHeight: false +}); +``` + +配置项也可以通过ueditor.config.js文件修改,具体的配置方法请看[前端配置项说明](http://fex.baidu.com/ueditor/#start-config1.4 前端配置项说明.md) + +### 设置和读取编辑器的内容 + +通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 文档") + +## 相关链接 ## + +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 github 地址:[http://github.com/fex-team/ueditor](http://github.com/fex-team/ueditor "ueditor github 地址") + +## 详细文档 + +ueditor 文档:[http://fex.baidu.com/ueditor/](http://fex.baidu.com/ueditor/) + + + +## 联系我们 ## + +email:[ueditor@baidu.com](mailto://email:ueditor@baidu.com "发邮件给ueditor开发组") +issue:[github issue](http://github.com/fex-team/ueditor/issues "ueditor 论坛") diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_examples/addCustomizeButton.js b/nezha-fronted/static/ueditor-1.4.3.3/_examples/addCustomizeButton.js new file mode 100644 index 000000000..13185ea17 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_examples/addCustomizeButton.js @@ -0,0 +1,38 @@ +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是那个编辑器实例上的,默认是页面上所有的编辑器都会添加这个按钮*/); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_examples/addCustomizeCombox.js b/nezha-fronted/static/ueditor-1.4.3.3/_examples/addCustomizeCombox.js new file mode 100644 index 000000000..fc272abce --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_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/nezha-fronted/static/ueditor-1.4.3.3/_examples/addCustomizeDialog.js b/nezha-fronted/static/ueditor-1.4.3.3/_examples/addCustomizeDialog.js new file mode 100644 index 000000000..6b8655556 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_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/nezha-fronted/static/ueditor-1.4.3.3/_examples/charts.html b/nezha-fronted/static/ueditor-1.4.3.3/_examples/charts.html new file mode 100644 index 000000000..db0c000d8 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_examples/charts.html @@ -0,0 +1,71 @@ + + + + 图表demo + + + + + + + + + + +
+ +
+ + + \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_examples/completeDemo.html b/nezha-fronted/static/ueditor-1.4.3.3/_examples/completeDemo.html new file mode 100644 index 000000000..ba45acf62 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_examples/completeDemo.html @@ -0,0 +1,175 @@ + + + + 完整demo + + + + + + + + + + +
+

完整demo

+ +
+
+
+ + + + + + + + + + + +
+
+ + + + + + + +
+ +
+ + +
+ +
+
+ + +
+ + + + \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_examples/customPluginDemo.html b/nezha-fronted/static/ueditor-1.4.3.3/_examples/customPluginDemo.html new file mode 100644 index 000000000..d6109f92e --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_examples/customPluginDemo.html @@ -0,0 +1,54 @@ + + + + + + + + + + +

UEditor自定义插件

+ + + + + + + + + diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_examples/customToolbarDemo.html b/nezha-fronted/static/ueditor-1.4.3.3/_examples/customToolbarDemo.html new file mode 100644 index 000000000..c3aca5bfb --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_examples/customToolbarDemo.html @@ -0,0 +1,105 @@ + + + + + + + + + + +

UEditor自定义toolbar

+
+
+
+ + + + + + + + +
+
+
+
+ + + \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_examples/customizeDialogPage.html b/nezha-fronted/static/ueditor-1.4.3.3/_examples/customizeDialogPage.html new file mode 100644 index 000000000..84c1cc2aa --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_examples/customizeDialogPage.html @@ -0,0 +1,25 @@ + + + + + + + +
+

测试页面

+
+ + + + + + \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_examples/customizeToolbarUIDemo.html b/nezha-fronted/static/ueditor-1.4.3.3/_examples/customizeToolbarUIDemo.html new file mode 100644 index 000000000..cec1f030a --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_examples/customizeToolbarUIDemo.html @@ -0,0 +1,43 @@ + + + + 完整demo + + + + + + + + + + + + + + + + +
+

二次开发demo

+ +
+ + + \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_examples/editor_api.js b/nezha-fronted/static/ueditor-1.4.3.3/_examples/editor_api.js new file mode 100644 index 000000000..faf9412cf --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_examples/editor_api.js @@ -0,0 +1,129 @@ +/** + * 开发版本的文件导入 + */ +(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', + '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/nezha-fronted/static/ueditor-1.4.3.3/_examples/filterRuleDemo.html b/nezha-fronted/static/ueditor-1.4.3.3/_examples/filterRuleDemo.html new file mode 100644 index 000000000..b9bc8baa7 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_examples/filterRuleDemo.html @@ -0,0 +1,151 @@ + + + + 过滤规则定制化 + + + + + + +

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

+
+ +
+ + + + + \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_examples/highlightDemo.html b/nezha-fronted/static/ueditor-1.4.3.3/_examples/highlightDemo.html new file mode 100644 index 000000000..650569124 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_examples/highlightDemo.html @@ -0,0 +1,39 @@ + + + + + + + + + + + + + +

代码高亮演示

+

获得编辑器实例

+
+
+        UE.getEditor('myEditor');
+    
+
+ + + + + + + + + diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_examples/index.html b/nezha-fronted/static/ueditor-1.4.3.3/_examples/index.html new file mode 100644 index 000000000..a5a434711 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_examples/index.html @@ -0,0 +1,118 @@ + + + + + + + + +

UEditor各种实例演示

+

基础示例

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

应用展示

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

二次开发

+ +

高级案例

+ + + + \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_examples/jqueryCompleteDemo.html b/nezha-fronted/static/ueditor-1.4.3.3/_examples/jqueryCompleteDemo.html new file mode 100644 index 000000000..dac705032 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_examples/jqueryCompleteDemo.html @@ -0,0 +1,43 @@ + + + + 使用jquery的完整demo + + + + + + + +
+ + +
+ + \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_examples/jqueryValidation.html b/nezha-fronted/static/ueditor-1.4.3.3/_examples/jqueryValidation.html new file mode 100644 index 000000000..fa08e3a52 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_examples/jqueryValidation.html @@ -0,0 +1,63 @@ + + + + + Ueditor在jquery validation下的验证 + + + + + + + + + + + +
+

Ueditor在jquery validation下的验证

+ + + + +
+ + + + +
+ +
+ + \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_examples/multiDemo.html b/nezha-fronted/static/ueditor-1.4.3.3/_examples/multiDemo.html new file mode 100644 index 000000000..47a65cc7e --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_examples/multiDemo.html @@ -0,0 +1,43 @@ + + + + + + + + + +

UEditor多实例

+ + + + + + + + + + + + diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_examples/multiEditorWithOneInstance.html b/nezha-fronted/static/ueditor-1.4.3.3/_examples/multiEditorWithOneInstance.html new file mode 100644 index 000000000..44d1da264 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_examples/multiEditorWithOneInstance.html @@ -0,0 +1,60 @@ + + + + + + + + + + + +

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

+ + + + + + + + + + + + + +
+ 编辑区域一 +
+ 编辑区域二 + 内容2
+ 编辑区域三 + 内容3
+ + + + diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_examples/renderInTable.html b/nezha-fronted/static/ueditor-1.4.3.3/_examples/renderInTable.html new file mode 100644 index 000000000..ae86a1088 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_examples/renderInTable.html @@ -0,0 +1,26 @@ + + + + + + + 表格内实例化编辑器实例 + + + +
+
+ + + + + + + +
表格标题
标题内容
中国
+
+ + + \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_examples/resetDemo.html b/nezha-fronted/static/ueditor-1.4.3.3/_examples/resetDemo.html new file mode 100644 index 000000000..34d56a98f --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_examples/resetDemo.html @@ -0,0 +1,52 @@ + + + + + + 重置编辑器 + + + + + +

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

+
+

+

+ + + \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_examples/sectiondemo.html b/nezha-fronted/static/ueditor-1.4.3.3/_examples/sectiondemo.html new file mode 100644 index 000000000..f62554e6f --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_examples/sectiondemo.html @@ -0,0 +1,181 @@ + + + + 目录大纲demo + + + + + + + + +
+

目录大纲demo

+
+
+
目录:
+
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_examples/server/getContent.ashx b/nezha-fronted/static/ueditor-1.4.3.3/_examples/server/getContent.ashx new file mode 100644 index 000000000..d6104df59 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_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/nezha-fronted/static/ueditor-1.4.3.3/_examples/server/getContent.asp b/nezha-fronted/static/ueditor-1.4.3.3/_examples/server/getContent.asp new file mode 100644 index 000000000..fa4cb6216 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_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/nezha-fronted/static/ueditor-1.4.3.3/_examples/server/getContent.jsp b/nezha-fronted/static/ueditor-1.4.3.3/_examples/server/getContent.jsp new file mode 100644 index 000000000..1ea45081a --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_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/nezha-fronted/static/ueditor-1.4.3.3/_examples/server/getContent.php b/nezha-fronted/static/ueditor-1.4.3.3/_examples/server/getContent.php new file mode 100644 index 000000000..67778486b --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_examples/server/getContent.php @@ -0,0 +1,19 @@ + + + +".htmlspecialchars_decode($content).""; diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_examples/setWidthHeightDemo.html b/nezha-fronted/static/ueditor-1.4.3.3/_examples/setWidthHeightDemo.html new file mode 100644 index 000000000..b02162507 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_examples/setWidthHeightDemo.html @@ -0,0 +1,43 @@ + + + + + + + + + + + + + +

UEditor设置宽高demo

+

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

+

容器给定编辑器的宽高

+ + + +
+

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

+ + +

没有工具栏的编辑器

+
+ + + + diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_examples/simpleDemo.html b/nezha-fronted/static/ueditor-1.4.3.3/_examples/simpleDemo.html new file mode 100644 index 000000000..881a59c74 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_examples/simpleDemo.html @@ -0,0 +1,36 @@ + + + + + + + + + + +

UEditor简单功能

+ + + + + + + + + diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_examples/sortableDemo.html b/nezha-fronted/static/ueditor-1.4.3.3/_examples/sortableDemo.html new file mode 100644 index 000000000..ee7d33f6f --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_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/nezha-fronted/static/ueditor-1.4.3.3/_examples/submitFormDemo.html b/nezha-fronted/static/ueditor-1.4.3.3/_examples/submitFormDemo.html new file mode 100644 index 000000000..c2694eecb --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_examples/submitFormDemo.html @@ -0,0 +1,54 @@ + + + + + + + + + + + +

UEditor提交示例

+
+ + +
+

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

+ + + + + + + diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_examples/textareaDemo.html b/nezha-fronted/static/ueditor-1.4.3.3/_examples/textareaDemo.html new file mode 100644 index 000000000..7b0a08b6c --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_examples/textareaDemo.html @@ -0,0 +1,34 @@ + + + + + + + + + + + + +

文本域渲染编辑器

+ + + +
+ + + + + + + diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_examples/uparsedemo.html b/nezha-fronted/static/ueditor-1.4.3.3/_examples/uparsedemo.html new file mode 100644 index 000000000..3bd561367 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_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/nezha-fronted/static/ueditor-1.4.3.3/_parse/background.js b/nezha-fronted/static/ueditor-1.4.3.3/_parse/background.js new file mode 100644 index 000000000..acc8008ef --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_parse/background.js @@ -0,0 +1,16 @@ +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); +}); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_parse/charts.js b/nezha-fronted/static/ueditor-1.4.3.3/_parse/charts.js new file mode 100644 index 000000000..c1339aee2 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_parse/charts.js @@ -0,0 +1,337 @@ +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; + + } + +}); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_parse/insertcode.js b/nezha-fronted/static/ueditor-1.4.3.3/_parse/insertcode.js new file mode 100644 index 000000000..e34b9bc55 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_parse/insertcode.js @@ -0,0 +1,42 @@ +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); + } + }); + } + } + +}); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_parse/list.js b/nezha-fronted/static/ueditor-1.4.3.3/_parse/list.js new file mode 100644 index 000000000..f28b2c221 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_parse/list.js @@ -0,0 +1,94 @@ +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 : 'http://bs.baidu.com/listicon/', + 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;}li{clear:both;}'+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}'); + } + } + }); + } + + +}); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_parse/parse.js b/nezha-fronted/static/ueditor-1.4.3.3/_parse/parse.js new file mode 100644 index 000000000..fe1275507 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_parse/parse.js @@ -0,0 +1,327 @@ +(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/nezha-fronted/static/ueditor-1.4.3.3/_parse/table.js b/nezha-fronted/static/ueditor-1.4.3.3/_parse/table.js new file mode 100644 index 000000000..3e24f313d --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_parse/table.js @@ -0,0 +1,161 @@ +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{ background:white; 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;}', + 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 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"); + } + } + } +}); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_parse/video.js b/nezha-fronted/static/ueditor-1.4.3.3/_parse/video.js new file mode 100644 index 000000000..da8ff80eb --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_parse/video.js @@ -0,0 +1,34 @@ +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(); + }); + } + + } +}); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_src/adapter/autosave.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/adapter/autosave.js new file mode 100644 index 000000000..1923aa874 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/adapter/autosave.js @@ -0,0 +1,18 @@ +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/nezha-fronted/static/ueditor-1.4.3.3/_src/adapter/editor.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/adapter/editor.js new file mode 100644 index 000000000..f0dfb77ef --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/adapter/editor.js @@ -0,0 +1,858 @@ +///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/ig.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("http://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 = []; + 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'; + } + if (baidu.editor.ui[toolbarItem]) { + toolbarItemUi = new baidu.editor.ui[toolbarItem](editor); + } + + //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(UE._customizeUI,function(obj,key){ + var itemUI,index; + if(obj.id && obj.id != editor.key){ + return false; + } + itemUI = obj.execFn.call(editor,editor,key); + if(itemUI){ + index = obj.index; + if(index === undefined){ + index = toolbarUi.items.length; + } + toolbarUi.add(itemUI,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/ueditor.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/ig.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) { + UE._customizeUI[name] = { + id : editorId, + execFn:fn, + index:index + }; + }) + + } + +})(); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_src/adapter/editorui.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/adapter/editorui.js new file mode 100644 index 000000000..965b8b40d --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/adapter/editorui.js @@ -0,0 +1,854 @@ +//ui跟编辑器的适配層 +//那个按钮弹出是dialog,是下拉筐等都是在这个js中配置 +//自己写的ui也要在这里配置,放到baidu.editor.ui下边,当编辑器实例化的时候会根据ueditor.config中的toolbars找到相应的进行实例化 +(function () { + var utils = baidu.editor.utils; + var editorui = baidu.editor.ui; + var _Dialog = editorui.Dialog; + editorui.buttons = {}; + + 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 + "<\/" + ck.tag + ">" + + '
'; + } + }); + })(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/nezha-fronted/static/ueditor-1.4.3.3/_src/adapter/message.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/adapter/message.js new file mode 100644 index 000000000..37c9193a3 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/adapter/message.js @@ -0,0 +1,58 @@ +UE.registerUI('message', function(editor) { + + var editorui = baidu.editor.ui; + var Message = editorui.Message; + var holder; + var _messageItems = []; + var me = editor; + + 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(){ + 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/nezha-fronted/static/ueditor-1.4.3.3/_src/api.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/api.js new file mode 100644 index 000000000..bb206ca62 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_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 + */ \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_src/core/Editor.defaultoptions.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/core/Editor.defaultoptions.js new file mode 100644 index 000000000..18a7132aa --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/core/Editor.defaultoptions.js @@ -0,0 +1,31 @@ +//维护编辑器一下默认的不在插件中的配置项 +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 + 'lang/', + theme: 'default', + themePath: _url + 'themes/', + allHtmlEnabled: false, + scaleEnabled: false, + tableNativeEditInFF: false, + autoSyncData : true, + fileNameFormat: '{time}{rand:6}' + } +}; \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_src/core/Editor.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/core/Editor.js new file mode 100644 index 000000000..cb5c629ff --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/core/Editor.js @@ -0,0 +1,1527 @@ +/** + * 编辑器主类,包含编辑器提供的大部分公用接口 + * @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.textarea) { + if (utils.isString(editor.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); + } + }, + + /** + * 该方法是提供给插件里面使用,设置配置项默认值 + * @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 ? '' : '') + + '' + + ''; + 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, + result, + cmd = me.commands[cmdName] || UE.commands[cmdName]; + if (!cmd || !cmd.execCommand) { + return null; + } + if (!cmd.notNeedUndo && !me.__hasEnterExecCommand) { + me.__hasEnterExecCommand = true; + if (me.queryCommandState.apply(me,arguments) != -1) { + me.fireEvent('saveScene'); + me.fireEvent.apply(me, ['beforeexeccommand', cmdName].concat(arguments)); + result = this._callCmdFn('execCommand', arguments); + //保存场景时,做了内容对比,再看是否进行contentchange触发,这里多触发了一次,去掉 +// (!cmd.ignoreContentChange && !me._ignoreContentChange) && me.fireEvent('contentchange'); + me.fireEvent.apply(me, ['afterexeccommand', cmdName].concat(arguments)); + me.fireEvent('saveScene'); + } + me.__hasEnterExecCommand = false; + } else { + result = this._callCmdFn('execCommand', arguments); + (!me.__hasEnterExecCommand && !cmd.ignoreContentChange && !me._ignoreContentChange) && me.fireEvent('contentchange') + } + (!me.__hasEnterExecCommand && !cmd.ignoreContentChange && !me._ignoreContentChange) && me._selectionChange(); + return result; + }, + + /** + * 根据传入的command命令,查选编辑器当前的选区,返回命令的状态 + * @method queryCommandState + * @param { String } cmdName 需要查询的命令名称 + * @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 ''; + } + } + }; + utils.inherits(Editor, EventBase); +})(); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_src/core/EventBase.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/core/EventBase.js new file mode 100644 index 000000000..0b77406fc --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/core/EventBase.js @@ -0,0 +1,167 @@ +/** + * 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/nezha-fronted/static/ueditor-1.4.3.3/_src/core/Range.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/core/Range.js new file mode 100644 index 000000000..8e331b30b --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/core/Range.js @@ -0,0 +1,1845 @@ +/** + * 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); + 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 + * + * + * + * + * + * + * + * + * ``` + */ + + /** + * 遍历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); + } + }; +})(); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_src/core/Selection.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/core/Selection.js new file mode 100644 index 000000000..7c7db300b --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/core/Selection.js @@ -0,0 +1,389 @@ +/** + * 选集 + * @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'](); + } + }; +})(); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_src/core/ajax.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/core/ajax.js new file mode 100644 index 000000000..6a1bad9d9 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/core/ajax.js @@ -0,0 +1,262 @@ +/** + * @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: 'ueditor' + * }, + * + * //请求成功后的回调, 该回调接受当前的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/nezha-fronted/static/ueditor-1.4.3.3/_src/core/browser.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/core/browser.js new file mode 100644 index 000000000..b82b77fda --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/core/browser.js @@ -0,0 +1,258 @@ +/** + * 浏览器判断模块 + * @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.]+)/.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; \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_src/core/domUtils.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/core/domUtils.js new file mode 100644 index 000000000..fcfb50a03 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/core/domUtils.js @@ -0,0 +1,2413 @@ +/** + * 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'); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_src/core/dtd.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/core/dtd.js new file mode 100644 index 000000000..3b44634ca --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/core/dtd.js @@ -0,0 +1,179 @@ +///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( _({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,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 + }); +})(); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_src/core/filternode.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/core/filternode.js new file mode 100644 index 000000000..6189f4391 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/core/filternode.js @@ -0,0 +1,130 @@ +/** + * 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; + } +}(); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_src/core/filterword.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/core/filterword.js new file mode 100644 index 000000000..287e0cc24 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/core/filterword.js @@ -0,0 +1,189 @@ +/** + * 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=)/ig.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( //ig, "" ) + //转换图片 + .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/ig, 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, + 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?'':' ')+']*<\/?(\\w+)\\s*(?:[^>]*)>[\\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/nezha-fronted/static/ueditor-1.4.3.3/_src/core/keymap.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/core/keymap.js new file mode 100644 index 000000000..a6a8b9e4f --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_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 +}; \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_src/core/loadconfig.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/core/loadconfig.js new file mode 100644 index 000000000..530097173 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/core/loadconfig.js @@ -0,0 +1,66 @@ +(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/nezha-fronted/static/ueditor-1.4.3.3/_src/core/localstorage.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/core/localstorage.js new file mode 100644 index 000000000..4e0db3cd4 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/core/localstorage.js @@ -0,0 +1,140 @@ +//存储媒介封装 +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/nezha-fronted/static/ueditor-1.4.3.3/_src/core/node.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/core/node.js new file mode 100644 index 000000000..8177aba54 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/core/node.js @@ -0,0 +1,754 @@ +/** + * 编辑器模拟的节点类 + * @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('<\/' + node.tagName + '>'); + } + + } + + 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/nezha-fronted/static/ueditor-1.4.3.3/_src/core/plugin.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/core/plugin.js new file mode 100644 index 000000000..ec6b5e570 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/core/plugin.js @@ -0,0 +1,81 @@ +/** + * 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) + } + } + } +}(); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_src/core/utils.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/core/utils.js new file mode 100644 index 000000000..1117d0c4e --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/core/utils.js @@ -0,0 +1,1210 @@ +/** + * 工具函数包 + * @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|quot|gt|#39|nbsp|#\d+);)?/g, function (a, b) { + if (b) { + return a; + } else { + return { + '<':'<', + '&':'&', + '"':'"', + '>':'>', + "'":''' + }[a] + } + + }) : ''; + }, + /** + * 将url中的html字符转义, 仅转义 ', ", <, > 四个字符 + * @param { String } str 需要转义的字符串 + * @param { RegExp } reg 自定义的正则 + * @return { String } 转义后的字符串 + */ + unhtmlForUrl:function (str, reg) { + return str ? str.replace(reg || /[<">']/g, function (a) { + 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)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 ueditor.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 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(''); + } + } + }; + } + + })() + +}; +/** + * 判断给定的对象是否是字符串 + * @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/nezha-fronted/static/ueditor-1.4.3.3/_src/editor.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/editor.js new file mode 100644 index 000000000..153de0bf7 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/editor.js @@ -0,0 +1,21 @@ +UEDITOR_CONFIG = window.UEDITOR_CONFIG || {}; + +var baidu = window.baidu || {}; + +window.baidu = baidu; + +window.UE = baidu.editor = window.UE || {}; + +UE.plugins = {}; + +UE.commands = {}; + +UE.instants = {}; + +UE.I18N = {}; + +UE._customizeUI = {}; + +UE.version = "1.4.3"; + +var dom = UE.dom = {}; \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/anchor.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/anchor.js new file mode 100644 index 000000000..5fcaabf62 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/anchor.js @@ -0,0 +1,85 @@ +/** + * 锚点插件,为UEditor提供插入锚点支持 + * @file + * @since 1.2.6.1 + */ +UE.plugin.register('anchor', function (){ + + return { + bindEvents:{ + 'ready':function(){ + utils.cssRule('anchor', + '.anchorclass{background: url(\'' + + this.options.themePath + + this.options.theme +'/images/anchor.gif\') no-repeat scroll left center transparent;cursor: auto;display: inline-block;height: 16px;width: 15px;}', + this.document); + } + }, + outputRule: function(root){ + utils.each(root.getNodesByTagName('img'),function(a){ + var val; + if(val = a.getAttr('anchorname')){ + a.tagName = 'a'; + a.setAttr({ + anchorname : '', + name : val, + 'class' : '' + }) + } + }) + }, + inputRule:function(root){ + utils.each(root.getNodesByTagName('a'),function(a){ + var val; + if((val = a.getAttr('name')) && !a.getAttr('href')){ + a.tagName = 'img'; + a.setAttr({ + anchorname :a.getAttr('name'), + 'class' : 'anchorclass' + }); + a.setAttr('name') + + } + }) + + }, + commands:{ + /** + * 插入锚点 + * @command anchor + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } name 锚点名称字符串 + * @example + * ```javascript + * //editor 是编辑器实例 + * editor.execCommand('anchor', 'anchor1'); + * ``` + */ + 'anchor':{ + execCommand:function (cmd, name) { + var range = this.selection.getRange(),img = range.getClosedNode(); + if (img && img.getAttribute('anchorname')) { + if (name) { + img.setAttribute('anchorname', name); + } else { + range.setStartBefore(img).setCursor(); + domUtils.remove(img); + } + } else { + if (name) { + //只在选区的开始插入 + var anchor = this.document.createElement('img'); + range.collapse(true); + domUtils.setAttributes(anchor,{ + 'anchorname':name, + 'class':'anchorclass' + }); + range.insertNode(anchor).setStartAfter(anchor).setCursor(false,true); + } + } + } + } + } + } +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/autofloat.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/autofloat.js new file mode 100644 index 000000000..f23ace24d --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/autofloat.js @@ -0,0 +1,135 @@ +///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); + }); + + me.addListener('ready', function(){ + if(checkHasUI(me)){ + //加载了ui组件,但在new时,没有加载ui,导致编辑器实例上没有ui类,所以这里做判断 + if(!me.ui){ + return; + } + getPosition = uiUtils.getClientRect; + toolbarBox = me.ui.getDom('toolbarbox'); + orgTop = getPosition(toolbarBox).top; + bakCssText = toolbarBox.style.cssText; + placeHolder.style.height = toolbarBox.offsetHeight + 'px'; + if(LteIE6){ + fixIE6FixedPos(); + } + domUtils.on(window, ['scroll','resize'], updateFloating); + me.addListener('keydown', defer_updateFloating); + + me.addListener('beforefullscreenchange', function (t, enabled){ + if (enabled) { + unsetFloating(); + } + }); + me.addListener('fullscreenchanged', function (t, enabled){ + if (!enabled) { + updateFloating(); + } + }); + me.addListener('sourcemodechanged', function (t, enabled){ + setTimeout(function (){ + updateFloating(); + },0); + }); + me.addListener("clearDoc",function(){ + setTimeout(function(){ + updateFloating(); + },0); + + }) + } + }); +}; diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/autoheight.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/autoheight.js new file mode 100644 index 000000000..f684c2c4b --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/autoheight.js @@ -0,0 +1,115 @@ +///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 () { + 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); + + }); + //修复内容过多时,回到顶部,顶部内容被工具栏遮挡问题 + var lastScrollY; + window.onscroll = function(){ + if(lastScrollY === null){ + lastScrollY = this.scrollY + }else if(this.scrollY == 0 && lastScrollY != 0){ + me.window.scrollTo(0,0); + lastScrollY = null; + } + } + }); + + +}; + diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/autolink.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/autolink.js new file mode 100644 index 000000000..7197aae6a --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/autolink.js @@ -0,0 +1,177 @@ +///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?:\/\/)/ig.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) + } + } + + } + + + }); + } +); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/autosave.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/autosave.js new file mode 100644 index 000000000..cea38ee79 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/autosave.js @@ -0,0 +1,129 @@ +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 + }, + 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 ( !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 ) { + me.body.innerHTML = me.getPreferences( saveKey ) || '

    '+domUtils.fillHtml+'

    '; + me.focus(true); + } + }, + queryCommandState: function () { + return saveKey ? ( me.getPreferences( saveKey ) === null ? -1 : 0 ) : -1; + }, + notNeedUndo: true, + ignoreContentChange:true + } + } + } + +}); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/autosubmit.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/autosubmit.js new file mode 100644 index 000000000..a6b7a0faf --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_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(); + } + } + } + } + } +}); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/autotypeset.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/autotypeset.js new file mode 100644 index 000000000..76b0b72c3 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/autotypeset.js @@ -0,0 +1,321 @@ +/** + * 自动排版 + * @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/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/autoupload.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/autoupload.js new file mode 100644 index 000000000..75d5169b5 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/autoupload.js @@ -0,0 +1,179 @@ +/** + * @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) { + loader.setAttribute('src', link); + loader.setAttribute('_src', link); + loader.setAttribute('title', data.title || ''); + loader.setAttribute('alt', data.original || ''); + loader.removeAttribute('id'); + domUtils.removeClasses(loader, 'loadingclass'); + } + }; + } 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:{ + //插入粘贴板的图片,拖放插入图片 + 'ready':function(e){ + var me = this; + if(window.FormData && window.FileReader) { + domUtils.on(me.body, 'paste drop', 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(); + } + + }); + //取消拖放图片时出现的文字光标位置提示 + domUtils.on(me.body, 'dragover', function (e) { + if(e.dataTransfer.types[0] == 'Files') { + 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); + } + } + } + } +}); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/background.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/background.js new file mode 100644 index 000000000..92b41801c --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/background.js @@ -0,0 +1,107 @@ +/** + * 背景插件,为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(/"|\(|\)/ig, ""); + } else { + url = su != "none" ? su.replace(/url\("?|"?\)/ig, "") : ""; + } + 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 + } + } + } +}); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/basestyle.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/basestyle.js new file mode 100644 index 000000000..78499dc76 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/basestyle.js @@ -0,0 +1,148 @@ +/** + * 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/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/blockquote.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/blockquote.js new file mode 100644 index 000000000..9f71f9e17 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/blockquote.js @@ -0,0 +1,172 @@ +/** + * 添加引用 + * @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/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/catchremoteimage.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/catchremoteimage.js new file mode 100644 index 000000000..5b32930dd --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/catchremoteimage.js @@ -0,0 +1,106 @@ +///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 = [], + imgs = domUtils.getElementsByTagName(me.document, "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; + } + var src = ci.getAttribute("_src") || ci.src || ""; + if (/^(https?|ftp):/i.test(src) && !test(src, catcherLocalDomain)) { + remoteImages.push(src); + } + } + + 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; + + for (i = 0; ci = imgs[i++];) { + oldSrc = ci.getAttribute("_src") || ci.src || ""; + for (j = 0; cj = list[j++];) { + if (oldSrc == cj.source && cj.state == "SUCCESS") { //抓取失败时不做替换处理 + newSrc = catcherUrlPrefix + cj.url; + domUtils.setAttributes(ci, { + "src": newSrc, + "_src": newSrc + }); + break; + } + } + } + me.fireEvent('catchremotesuccess') + }, + //回调失败,本次请求超时 + 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); + } + + }); +}; \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/charts.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/charts.js new file mode 100644 index 000000000..562ee436d --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/charts.js @@ -0,0 +1,142 @@ +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; + + } + +}); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/cleardoc.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/cleardoc.js new file mode 100644 index 000000000..8daebe8ca --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/cleardoc.js @@ -0,0 +1,37 @@ +/** + * 清空文档插件 + * @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/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/contextmenu.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/contextmenu.js new file mode 100644 index 000000000..0ddd9c7ad --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/contextmenu.js @@ -0,0 +1,496 @@ +///import core +///commands 右键菜单 +///commandsName ContextMenu +///commandsTitle 右键菜单 +/** + * 右键菜单 + * @function + * @name baidu.editor.plugins.contextmenu + * @author zhanyi + */ + +UE.plugins['contextmenu'] = function () { + var me = this; + me.setOpt('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/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/convertcase.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/convertcase.js new file mode 100644 index 000000000..4ae6a1dcc --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/convertcase.js @@ -0,0 +1,56 @@ +/** + * 大小写转换 + * @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/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/copy.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/copy.js new file mode 100644 index 000000000..6e267a435 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/copy.js @@ -0,0 +1,69 @@ +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 (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(); + }); + } + + 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/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/customstyle.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/customstyle.js new file mode 100644 index 000000000..57cb2abb9 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/customstyle.js @@ -0,0 +1,146 @@ +/** + * 自定义样式 + * @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(); + + + } + } + } + }); +}; \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/defaultfilter.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/defaultfilter.js new file mode 100644 index 000000000..65eb91110 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/defaultfilter.js @@ -0,0 +1,228 @@ +///import core +///plugin 编辑器默认的过滤转换机制 + +UE.plugins['defaultfilter'] = function () { + var me = this; + me.setOpt({ + 'allowDivTransToP':true, + 'disabledTableInTable':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) + } + break; + case 'img': + if (val = node.getAttr('_src')) { + node.setAttr({ + 'src': node.getAttr('_src'), + '_src': '' + }) + } + + + } + } + + }) + + + }); +}; diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/directionality.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/directionality.js new file mode 100644 index 000000000..c7fd8ba80 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/directionality.js @@ -0,0 +1,121 @@ +/** + * 设置文字输入的方向的插件 + * @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/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/dragdrop.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/dragdrop.js new file mode 100644 index 000000000..2e3424203 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/dragdrop.js @@ -0,0 +1,56 @@ +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/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/elementpath.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/elementpath.js new file mode 100644 index 000000000..c67c35171 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/elementpath.js @@ -0,0 +1,43 @@ +/** + * 选取路径命令 + * @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/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/enterkey.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/enterkey.js new file mode 100644 index 000000000..53d2be736 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/enterkey.js @@ -0,0 +1,175 @@ +///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/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/fiximgclick.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/fiximgclick.js new file mode 100644 index 000000000..658347c9e --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/fiximgclick.js @@ -0,0 +1,315 @@ +///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); + + domUtils.setStyles(resizer, { + 'width': target.width + 'px', + 'height': target.height + 'px', + 'left': iframePos.x + imgPos.x - me.editor.document.body.scrollLeft - editorPos.x - parseInt(resizer.style.borderLeftWidth) + 'px', + 'top': iframePos.y + imgPos.y - me.editor.document.body.scrollTop - editorPos.y - parseInt(resizer.style.borderTopWidth) + 'px' + }); + } + } + })(); + + return function () { + var me = this, + imageScale; + + me.setOpt('imageScaleEnabled', true); + + if ( !browser.ie && me.options.imageScaleEnabled) { + me.addListener('click', function (type, e) { + + 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(); + } + }); + } + } +})(); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/font.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/font.js new file mode 100644 index 000000000..e70d77af2 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/font.js @@ -0,0 +1,524 @@ +/** + * 字体颜色,背景色,字号,字体,下划线,删除线 + * @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){ + var start = rng.startContainer.childNodes[rng.startOffset]; + if(start && domUtils.isTagNode(start,'span')){ + var bk = rng.createBookmark(); + utils.each(domUtils.getElementsByTagName(start, 'span'), function (span) { + if (!span.parentNode || domUtils.isBookmarkNode(span))return; + if(cmdName == 'backcolor' && domUtils.getComputedStyle(span,'background-color').toLowerCase() === value){ + return; + } + domUtils.removeStyle(span,needSetChild[cmdName]); + if(span.style.cssText.replace(/^\s+$/,'').length == 0){ + domUtils.remove(span,true) + } + }); + rng.moveToBookmark(bk) + } + } + } + + } + 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]); + } +}; \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/formatmatch.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/formatmatch.js new file mode 100644 index 000000000..828b3a6c9 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/formatmatch.js @@ -0,0 +1,137 @@ +/** + * 格式刷,只格式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/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/horizontal.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/horizontal.js new file mode 100644 index 000000000..1a4d7769f --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/horizontal.js @@ -0,0 +1,104 @@ +/** + * 插入分割线插件 + * @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/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/iframe.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/iframe.js new file mode 100644 index 000000000..ce3a6b971 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/iframe.js @@ -0,0 +1,19 @@ +///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/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/image.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/image.js new file mode 100644 index 000000000..1cd07cb2d --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/image.js @@ -0,0 +1,273 @@ +/** + * 图片插入、排版插件 + * @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') { + pN = img.parentNode; + domUtils.setStyle(img, 'float', ''); + domUtils.removeAttributes(img,'align'); + tmpNode = img; + while (pN && domUtils.getChildCount(pN, function (node) { + return !domUtils.isBr(node) && !domUtils.isWhitespace(node); + }) == 1 + && (dtd.$inline[pN.tagName] || pN.tagName == 'A')) { + tmpNode = pN; + pN = pN.parentNode; + } + range.setStartBefore(tmpNode).setCursor(false); + pN = me.document.createElement('div'); + pN.appendChild(tmpNode); + domUtils.setStyle(tmpNode, 'float', ''); + + me.execCommand('insertHtml', '

    ' + pN.innerHTML + '

    '); + + tmpNode = me.document.getElementById('_img_parent_tmp'); + tmpNode.removeAttribute('id'); + tmpNode = tmpNode.firstChild; + range.selectNode(tmpNode).select(); + //去掉后边多余的元素 + next = tmpNode.parentNode.nextSibling; + if (next && domUtils.isEmptyNode(next)) { + domUtils.remove(next); + } + + } + + break; + } + + } + } + }, + queryCommandValue:function () { + var range = this.selection.getRange(), + startNode, floatStyle; + if (range.collapsed) { + return 'none'; + } + startNode = range.getClosedNode(); + if (startNode && startNode.nodeType == 1 && startNode.tagName == 'IMG') { + floatStyle = domUtils.getComputedStyle(startNode, 'float') || startNode.getAttribute('align'); + + 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; + } + + function unhtmlData(imgCi) { + + utils.each('width,height,border,hspace,vspace'.split(','), function (item) { + + if (imgCi[item]) { + imgCi[item] = parseInt(imgCi[item], 10) || 0; + } + }); + + utils.each('src,_src'.split(','), function (item) { + + if (imgCi[item]) { + imgCi[item] = utils.unhtmlForUrl(imgCi[item]); + } + }); + utils.each('title,alt'.split(','), function (item) { + + if (imgCi[item]) { + imgCi[item] = utils.unhtml(imgCi[item]); + } + }); + } + + 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) { + unhtmlData(ci); + + str = '' + ci.alt + ''; + if (ci['floatStyle'] == 'center') { + str = '

    ' + str + '

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

    '; + html.push(str); + } + } + + me.execCommand('insertHtml', html.join('')); + } + + me.fireEvent('afterinsertimage', opt) + } +}; diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/indent.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/indent.js new file mode 100644 index 000000000..0afadada8 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/indent.js @@ -0,0 +1,27 @@ +/** + * 首行缩进 + * @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/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/insertcode.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/insertcode.js new file mode 100644 index 000000000..2155fd6b3 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/insertcode.js @@ -0,0 +1,540 @@ +/** + * 插入代码插件 + * @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/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/insertfile.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/insertfile.js new file mode 100644 index 000000000..b4d685e22 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/insertfile.js @@ -0,0 +1,69 @@ +/** + * 插入附件 + */ +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]; + + 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); + } + } + } + } +}); + + diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/inserthtml.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/inserthtml.js new file mode 100644 index 000000000..7063692a5 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/inserthtml.js @@ -0,0 +1,255 @@ +/** + * 插入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/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/insertparagraph.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/insertparagraph.js new file mode 100644 index 000000000..ad2ad2756 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/insertparagraph.js @@ -0,0 +1,44 @@ +/** + * 插入段落 + * @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/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/justify.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/justify.js new file mode 100644 index 000000000..8663ea864 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/justify.js @@ -0,0 +1,114 @@ +/** + * 段落格式 + * @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/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/keystrokes.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/keystrokes.js new file mode 100644 index 000000000..b82e75d36 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/keystrokes.js @@ -0,0 +1,214 @@ +/* 处理特殊键的兼容性问题 */ +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; + } + } + } + }); + 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() + } + + } + } + + + }) +}; \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/lineheight.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/lineheight.js new file mode 100644 index 000000000..b89c5fb9b --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/lineheight.js @@ -0,0 +1,48 @@ +/** + * 设置行内间距 + * @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.]*/ig,""); + } + } + }; +}; + + diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/link.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/link.js new file mode 100644 index 000000000..0519c8a9f --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/link.js @@ -0,0 +1,174 @@ +/** + * 超链接 + * @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:'ueditor.baidu.com', + * title:'ueditor', + * 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; + } + }; +}; \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/list.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/list.js new file mode 100644 index 000000000..6b8cf40f6 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/list.js @@ -0,0 +1,1246 @@ +/** + * 有序列表,无序列表插件 + * @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; + } + }; +}; + diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/music.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/music.js new file mode 100644 index 000000000..287d56239 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/music.js @@ -0,0 +1,79 @@ +/** + * 插入音乐命令 + * @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; + } + } + } + } +}); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/pagebreak.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/pagebreak.js new file mode 100644 index 000000000..b21850908 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/pagebreak.js @@ -0,0 +1,160 @@ +/** + * 分页功能插件 + * @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); + + } + + } + }; +}; \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/paragraph.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/paragraph.js new file mode 100644 index 000000000..64b5f2867 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/paragraph.js @@ -0,0 +1,170 @@ +/** + * 段落样式 + * @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/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/paste.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/paste.js new file mode 100644 index 000000000..04aa52e86 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/paste.js @@ -0,0 +1,305 @@ +///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')); + } + } + } +}; + diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/preview.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/preview.js new file mode 100644 index 000000000..712a7f56c --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/preview.js @@ -0,0 +1,28 @@ +/** + * 预览 + * @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/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/print.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/print.js new file mode 100644 index 000000000..597e23ffe --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/print.js @@ -0,0 +1,23 @@ +/** + * 打印 + * @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/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/puretxtpaste.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/puretxtpaste.js new file mode 100644 index 000000000..e016f88de --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/puretxtpaste.js @@ -0,0 +1,98 @@ +/** + * 纯文本粘贴插件 + * @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 + }; +}; \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/removeformat.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/removeformat.js new file mode 100644 index 000000000..2b8601183 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/removeformat.js @@ -0,0 +1,182 @@ +/** + * 清除格式 + * @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 + 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/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/rowspacing.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/rowspacing.js new file mode 100644 index 000000000..3dca5b188 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/rowspacing.js @@ -0,0 +1,46 @@ +/** + * 段前段后间距插件 + * @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/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/scrawl.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/scrawl.js new file mode 100644 index 000000000..b7e17a3a6 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_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/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/searchreplace.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/searchreplace.js new file mode 100644 index 000000000..f1504c1c3 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/searchreplace.js @@ -0,0 +1,193 @@ +///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}; + + function findTextInString(textContent,opt,currentIndex){ + var str = opt.searchStr; + if(opt.dir == -1){ + textContent = textContent.split('').reverse().join(''); + str = str.split('').reverse().join(''); + currentIndex = textContent.length - currentIndex; + + } + var reg = new RegExp(str,'g' + (opt.casesensitive ? '' : 'i')),match; + + while(match = reg.exec(textContent)){ + if(match.index >= currentIndex){ + return opt.dir == -1 ? textContent.length - match.index - opt.searchStr.length : match.index; + } + } + 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 = node.nodeType == 3 ? node.nodeValue : node[browser.ie ? 'innerText' : 'textContent']; + 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 ? (node.nodeType == 3 ? node.nodeValue : node[browser.ie ? 'innerText' : 'textContent']).length : 0; + } + + } + } + function findNTextInBlockElm(node,index,str){ + var currentIndex = 0, + currentNode = node.firstChild, + currentNodeLength = 0, + result; + while(currentNode){ + if(currentNode.nodeType == 3){ + currentNodeLength = currentNode.nodeValue.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 = currentNode[browser.ie ? 'innerText' : 'textContent'].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 = 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 = startBlockNode[browser.ie ? 'innerText' : 'textContent'].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){ + + 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++; + } + if(num){ + me.fireEvent('saveScene'); + } + }else{ + if(opt.replaceStr !== undefined){ + me.fireEvent('saveScene'); + } + if(searchReplace(this,opt)){ + num++ + } + if(num){ + me.fireEvent('saveScene'); + } + + } + + return num; + }, + notNeedUndo:1 + } + } + } +}); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/section.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/section.js new file mode 100644 index 000000000..07f206e78 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/section.js @@ -0,0 +1,269 @@ +/** + * 目录大纲支持插件 + * @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 + } + } + } +}); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/selectall.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/selectall.js new file mode 100644 index 000000000..04bbaf81b --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_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/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/serverparam.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/serverparam.js new file mode 100644 index 000000000..6dbc9e041 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/serverparam.js @@ -0,0 +1,107 @@ +/** + * 服务器提交的额外参数列表设置插件 + * @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, true); + } else if (utils.isFunction(key)){ //传入函数,添加列表项 + utils.extend(serverParam, key(), true); + } + }, + queryCommandValue: function(){ + return serverParam || {}; + } + } + } + } +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/shortcutmenu.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/shortcutmenu.js new file mode 100644 index 000000000..400b10e83 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/shortcutmenu.js @@ -0,0 +1,79 @@ +///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/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/simpleupload.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/simpleupload.js new file mode 100644 index 000000000..f706d4417 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/simpleupload.js @@ -0,0 +1,172 @@ +/** + * @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); + loader.setAttribute('src', link); + loader.setAttribute('_src', link); + loader.setAttribute('title', json.title || ''); + loader.setAttribute('alt', json.original || ''); + loader.removeAttribute('id'); + domUtils.removeClasses(loader, 'loadingclass'); + } 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; + } + } + } + } +}); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/snapscreen.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/snapscreen.js new file mode 100644 index 000000000..150644188 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/snapscreen.js @@ -0,0 +1,101 @@ +/** + * 截屏插件,为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(/[&]+/ig, '&'); + } + 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/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/source.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/source.js new file mode 100644 index 000000000..8503af617 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/source.js @@ -0,0 +1,300 @@ +/** + * 源码编辑插件 + * @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; + } + }; + }, + 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; + } + }; + } + }; + + UE.plugins['source'] = function (){ + var me = this; + var opt = this.options; + var sourceMode = false; + var sourceEditor; + var orgSetContent; + 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 ? '' : '
    ')+'

    '; + }; + } else { + me.iframe.style.cssText = bakCssText; + var cont = sourceEditor.getContent() || '

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

    '; + //处理掉block节点前后的空格,有可能会误命中,暂时不考虑 + cont = cont.replace(new RegExp('[\\r\\t\\n ]*<\/?(\\w+)\\s*(?:[^>]*)>','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; + 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" + }); + + }); + } + + }; + +})(); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/table.action.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/table.action.js new file mode 100644 index 000000000..7b54cadc9 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/table.action.js @@ -0,0 +1,1875 @@ +/** + * 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/default/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 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 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\))/ig.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/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/table.cmds.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/table.cmds.js new file mode 100644 index 000000000..c9f12fab5 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/table.cmds.js @@ -0,0 +1,936 @@ +/** + * 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/ig.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/ig.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/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/table.core.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/table.core.js new file mode 100644 index 000000000..ecfa51976 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/table.core.js @@ -0,0 +1,1140 @@ +/** + * 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, + caption = start && domUtils.findParentByTagName(start, 'caption', true), + table = caption ? caption.parentNode : tr && tr.parentNode.parentNode; + + 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, + 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); + } + } 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) { + } +})(); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/table.sort.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/table.sort.js new file mode 100644 index 000000000..12030043e --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/table.sort.js @@ -0,0 +1,165 @@ +/** + * 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; i1 || 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/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/template.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/template.js new file mode 100644 index 000000000..c3d13c5aa --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/template.js @@ -0,0 +1,39 @@ +///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/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/time.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/time.js new file mode 100644 index 000000000..3fdfd62c3 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/time.js @@ -0,0 +1,50 @@ +/** + * 插入时间和日期 + * @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/ig, hh).replace(/ii/ig, ii).replace(/ss/ig, 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/ig, yyyy).replace(/yy/ig, yy).replace(/mm/ig, mm).replace(/dd/ig, dd); + } + + this.execCommand('insertHtml',cmd == "time" ? formatTime(date, format):formatDate(date, format) ); + } +}; diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/undo.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/undo.js new file mode 100644 index 000000000..93dd94839 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/undo.js @@ -0,0 +1,298 @@ +/** + * 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 + '|<\/hr>', '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/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/video.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/video.js new file mode 100644 index 000000000..08654d7d5 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/video.js @@ -0,0 +1,161 @@ +/** + * 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){ + + url = utils.unhtmlForUrl(url); + align = utils.unhtml(align); + classname = utils.unhtml(classname); + + width = parseInt(width, 10) || 0; + height = parseInt(height, 10) || 0; + + 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]; + var html = [],id = 'tmpVedio', cl; + for(var i=0,vi,len = videoObjs.length;ihttp://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; + } + } + } + } +}); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/wordcount.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/wordcount.js new file mode 100644 index 000000000..57ef20fbf --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/wordcount.js @@ -0,0 +1,33 @@ +///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/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/wordimage.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/wordimage.js new file mode 100644 index 000000000..5772d163c --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/wordimage.js @@ -0,0 +1,53 @@ +///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/default/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' + }) + } + }) + } + } +}); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/xssFilter.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/plugins/xssFilter.js new file mode 100644 index 000000000..39665eff1 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_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/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/autotypesetbutton.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/autotypesetbutton.js new file mode 100644 index 000000000..3cd67db8f --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/autotypesetbutton.js @@ -0,0 +1,138 @@ +///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/ig.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/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/autotypesetpicker.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/autotypesetpicker.js new file mode 100644 index 000000000..09ec296eb --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/autotypesetpicker.js @@ -0,0 +1,66 @@ +///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/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/breakline.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/breakline.js new file mode 100644 index 000000000..4ccb5fc21 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/breakline.js @@ -0,0 +1,19 @@ +(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/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/button.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/button.js new file mode 100644 index 000000000..6b7b7c674 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/button.js @@ -0,0 +1,69 @@ +///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-default .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/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/cellalignpicker.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/cellalignpicker.js new file mode 100644 index 000000000..c243644ea --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/cellalignpicker.js @@ -0,0 +1,96 @@ +///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'); + + 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/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/colorbutton.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/colorbutton.js new file mode 100644 index 000000000..b834f5111 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/colorbutton.js @@ -0,0 +1,60 @@ +///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/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/colorpicker.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/colorpicker.js new file mode 100644 index 000000000..73bd46b29 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/colorpicker.js @@ -0,0 +1,74 @@ +///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':'')+''; + } + html += i<70 ? '':''; + } + html += '
    '+editor.getLang("themeColor")+'
    '+editor.getLang("standardColor")+'
    '; + return html; + } +})(); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/combox.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/combox.js new file mode 100644 index 000000000..a7aa06ba4 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/combox.js @@ -0,0 +1,96 @@ +///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 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' + 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'; + }, + 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/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/menu.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/menu.js new file mode 100644 index 000000000..7e947b0a2 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/menu.js @@ -0,0 +1,276 @@ +///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/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/menubutton.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/menubutton.js new file mode 100644 index 000000000..a627d4dfe --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/menubutton.js @@ -0,0 +1,40 @@ +///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' + + '
    ×
    ' + + '
    ' + + ' ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + ''; + }, + 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/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/multiMenu.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/multiMenu.js new file mode 100644 index 000000000..05ed55d06 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/multiMenu.js @@ -0,0 +1,39 @@ +///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/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/pastepicker.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/pastepicker.js new file mode 100644 index 000000000..0676fa054 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/pastepicker.js @@ -0,0 +1,66 @@ +///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/ig.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/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/popup.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/popup.js new file mode 100644 index 000000000..3bccb06cd --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/popup.js @@ -0,0 +1,257 @@ +///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/ig.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/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/separator.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/separator.js new file mode 100644 index 000000000..0041c8d58 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/separator.js @@ -0,0 +1,19 @@ +(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/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/shortcutmenu.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/shortcutmenu.js new file mode 100644 index 000000000..9b71bd2fd --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/shortcutmenu.js @@ -0,0 +1,232 @@ +(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/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/splitbutton.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/splitbutton.js new file mode 100644 index 000000000..cbc7f1171 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/splitbutton.js @@ -0,0 +1,87 @@ +///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/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/stateful.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/stateful.js new file mode 100644 index 000000000..43d610fbb --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/stateful.js @@ -0,0 +1,108 @@ +(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/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/tablebutton.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/tablebutton.js new file mode 100644 index 000000000..4ce1c63ce --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/tablebutton.js @@ -0,0 +1,37 @@ +///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/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/tablepicker.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/tablepicker.js new file mode 100644 index 000000000..bf1c250a3 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/tablepicker.js @@ -0,0 +1,83 @@ +///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/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/toolbar.js b/nezha-fronted/static/ueditor-1.4.3.3/_src/ui/toolbar.js new file mode 100644 index 000000000..f7f2b8655 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_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' + + buff.join('') + + '' + }, + postRender: function (){ + var box = this.getDom(); + for (var i=0; i
    dd

    "); +// equal(editor.getContent(), "


    dd

    ", 'hasContents判断不为空'); +// equal(editor.getContent("", function () { +// return false +// }), "", '为空'); +// setTimeout(function () { +// UE.delEditor('test1'); +// setTimeout(function () { +// start(); +// }, 50); +// }, 100); +// }, 50); +//}); +//test('', function () { +// stop(); +//}); +test('contentchange在命令调用时的触发机制', function () { + var editor = te.obj[1]; + var container = te.dom[0]; + + $(container).css('width', '500px').css('height', '500px').css('border', '1px solid #ccc'); + editor.render(container); + editor.ready(function () { + editor.commands['test1'] = { + execCommand: function () { + editor.body.innerHTML = '1123'; + } + }; + var count = 0; + editor.on('contentchange', function () { + count++; + }); + + editor.commands['test'] = { + execCommand: function () { + editor.execCommand('test1') + }, + ignoreContentChange: true + }; + setTimeout(function () { + editor.execCommand('test1'); + equals(count, 1); + count = 0; + editor.execCommand('test'); + equals(count, 0); + start(); + }, 200); + + }); + stop(); +}); + +test("initialStyle", function () { + if(ua.browser.gecko)return;//todo 1.4.0 + var div = document.body.appendChild(document.createElement('div')); + div.id = 'ue'; + var editor = UE.getEditor('ue', {initialStyle: "body{font-family: arial black;}.testCss{ color: rgb(192, 0, 0); }", initialContent: "

    测试样式,红色,字体: arial black

    ", autoHeightEnabled: false}); + editor.ready(function () { + equal(ua.formatColor(ua.getComputedStyle(editor.body.firstChild.firstChild).color), '#c00000', 'initialStyle中设置的class样式有效'); + ok(/arial black/.test(ua.getComputedStyle(editor.body.firstChild.firstChild).fontFamily), 'initialStyle中设置的body样式有效'); + setTimeout(function () { + UE.delEditor('ue'); + te.dom.push(document.getElementById('ue')); + start(); + }, 200); + }); + stop(); +}); + +test("autoSyncData:true,textarea容器(由setcontent触发的)", function () { + var div = document.body.appendChild(document.createElement('div')); + div.innerHTML = '
    '; + equal(document.getElementById('form').childNodes.length, 1, 'form里只有一个子节点'); + var editor_a = UE.getEditor('myEditor', {autoHeightEnabled: false}); + stop(); + editor_a.ready(function () { + equal(document.getElementById('form').childNodes.length, 2, 'form里有2个子节点'); + editor_a.setContent('

    设置内容autoSyncData 1

    '); + setTimeout(function () { + var form = document.getElementById('form'); + equal(form.childNodes.length, 2, '失去焦点,form里多了textarea'); + equal(form.lastChild.tagName.toLowerCase(), 'textarea', '失去焦点,form里多了textarea'); + equal(form.lastChild.value, '

    设置内容autoSyncData 1

    ', 'textarea内容正确'); + setTimeout(function () { + UE.delEditor('myEditor'); + document.getElementById('form').parentNode.removeChild(document.getElementById('form')); + document.getElementById('test1') && te.dom.push(document.getElementById('test1')); + start(); + }, 200); + }, 100); + }); +}); +test("autoSyncData:true(由blur触发的)", function () { + //todo ie8里事件触发有问题,暂用手动测 + if (ua.browser.ie > 8 || !ua.browser.ie) { + var div = document.body.appendChild(document.createElement('div')); + div.innerHTML = '
    '; + var editor_a = UE.getEditor('myEditor', {autoHeightEnabled: false}); + stop(); + editor_a.ready(function () { + editor_a.body.innerHTML = '

    设置内容autoSyncData 2

    '; + equal(document.getElementsByTagName('textarea').length, 0, '内容空没有textarea'); + ua.blur(editor_a.body); + stop(); + setTimeout(function () { + var form = document.getElementById('form'); + equal(form.childNodes.length, 2, '失去焦点,form里多了textarea'); + equal(form.lastChild.tagName.toLowerCase(), 'textarea', '失去焦点,form里多了textarea'); + equal(form.lastChild.value, '

    设置内容autoSyncData 2

    ', 'textarea内容正确'); + UE.delEditor('myEditor'); + form.parentNode.removeChild(form); + start(); + }, 200); + }); + } +}); +test("sync", function () { + var div = document.body.appendChild(document.createElement('div')); + div.innerHTML = '
    '; + var editor_a = UE.getEditor('myEditor', {autoHeightEnabled: false}); + stop(); + editor_a.ready(function () { + editor_a.body.innerHTML = '

    hello

    '; + editor_a.sync("form"); + setTimeout(function () { + var form = document.getElementById('form'); + equal(form.lastChild.value, '

    hello

    ', '同步内容正确'); + div = form.parentNode; + UE.delEditor('myEditor'); + div.parentNode.removeChild(div); + start(); + }, 100); + }); +}); +test("hide,show", function () { + var editor = te.obj[1]; + var container = te.dom[0]; + $(container).css('width', '500px').css('height', '500px').css('border', '1px solid #ccc'); + editor.render(container); + editor.ready(function () { + equal(editor.body.getElementsByTagName('span').length, 0, '初始没有书签'); + editor.hide(); + setTimeout(function () { + equal($(editor.container).css('display'), 'none', '隐藏编辑器'); + equal(editor.body.getElementsByTagName('span').length, 1, '插入书签'); + ok(/_baidu_bookmark_start/.test(editor.body.getElementsByTagName('span')[0].id), '书签'); + editor.show(); + setTimeout(function () { + equal($(te.dom[0]).css('display'), 'block', '显示编辑器'); + var br = ua.browser.ie ? '' : '
    '; + equal(ua.getChildHTML(editor.body), '

    tool

    ', '删除书签'); + start(); + }, 50); + }, 50); + }); + stop(); +}); + +test("_setDefaultContent--focus", function () { + var editor = te.obj[1]; + var container = te.dom[0]; + $(container).css('width', '500px').css('height', '500px').css('border', '1px solid #ccc'); + editor.render(container); + editor.ready(function () { + editor._setDefaultContent('hello'); + editor.fireEvent('focus'); + setTimeout(function () { + var br = ua.browser.ie ? '' : '
    '; + equal(ua.getChildHTML(editor.body), '

    ' + br + '

    ', 'focus'); + start(); + }, 50); + }); + stop(); +}); + +test("_setDefaultContent--firstBeforeExecCommand", function () { + var editor = te.obj[1]; + var container = te.dom[0]; + $(container).css('width', '500px').css('height', '500px').css('border', '1px solid #ccc'); + editor.render(container); + editor.ready(function () { + editor._setDefaultContent('hello'); + editor.fireEvent('firstBeforeExecCommand'); + setTimeout(function () { + var br = ua.browser.ie ? '' : '
    '; + equal(ua.getChildHTML(editor.body), '

    ' + br + '

    ', 'firstBeforeExecCommand'); + start(); + }, 50); + }); + stop(); +}); +test("setDisabled,setEnabled", function () { + var editor = te.obj[1]; + var container = te.dom[0]; + $(container).css('width', '500px').css('height', '500px').css('border', '1px solid #ccc'); + editor.render(container); + editor.ready(function () { + editor.setContent('

    欢迎使用ueditor!

    '); + editor.focus(); + setTimeout(function () { + var startContainer = editor.selection.getRange().startContainer.outerHTML; + var startOffset = editor.selection.getRange().startOffset; + var collapse = editor.selection.getRange().collapsed; + editor.setDisabled(); + setTimeout(function () { + equal(editor.body.contentEditable, 'false', 'setDisabled'); + equal(editor.body.firstChild.firstChild.tagName.toLowerCase(), 'span', '插入书签'); + equal($(editor.body.firstChild.firstChild).css('display'), 'none', '检查style'); + equal($(editor.body.firstChild.firstChild).css('line-height'), '0px', '检查style'); + ok(/_baidu_bookmark_start/.test(editor.body.firstChild.firstChild.id), '书签');///_baidu_bookmark_start/.test() + editor.setEnabled(); + setTimeout(function () { + equal(editor.body.contentEditable, 'true', 'setEnabled'); + equal(ua.getChildHTML(editor.body), '

    欢迎使用ueditor!

    ', '内容恢复'); + if (!ua.browser.ie || ua.browser.ie < 9) {// ie9,10改range 之后,ie9,10这里的前后range不一致,focus时是text,setEnabled后是p + equal(editor.selection.getRange().startContainer.outerHTML, startContainer, '检查range'); + } + equal(editor.selection.getRange().startOffset, startOffset, '检查range'); + equal(editor.selection.getRange().collapsed, collapse, '检查range'); + start(); + }, 50); + }, 50); + }, 50); + }); + stop(); +}); +test("render-- element", function () { + var editor = new baidu.editor.Editor({'UEDITOR_HOME_URL': '../../../', 'autoFloatEnabled': false}); + var div = document.body.appendChild(document.createElement('div')); + equal(div.innerHTML, "", "before render"); + editor.render(div); + equal(div.firstChild.tagName.toLocaleLowerCase(), 'iframe', 'check iframe'); + ok(/ueditor_/.test(div.firstChild.id), 'check iframe id'); + te.dom.push(div); +}); + +test("render-- elementid", function () { + var editor = te.obj[1]; + var div = te.dom[0]; + editor.render(div.id); + equal(div.firstChild.tagName.toLocaleLowerCase(), 'iframe', 'check iframe'); + ok(/ueditor_/.test(div.firstChild.id), 'check iframe id'); +}); + +test("render-- options", function () { + var options = {'initialContent': 'xxx
    xxx

    ', 'UEDITOR_HOME_URL': '../../../', autoClearinitialContent: false, 'autoFloatEnabled': false}; + var editor = new baidu.editor.Editor(options); + + var div = document.body.appendChild(document.createElement('div')); + editor.render(div); + /*会自动用p标签包围*/ + var space = baidu.editor.browser.ie ? ' ' : '
    '; + //策略变化,自1.2.6,div 标签都会被过滤 + stop(); + editor.ready(function () { + equal(ua.getChildHTML(editor.body), '

    xxx

    xxx

    ' + space + '

    ', 'check initialContent'); + te.dom.push(div); + start(); + }); +}); + +test('destroy', function () { +// var editor = new baidu.editor.Editor( {'autoFloatEnabled':false} ); + var editor = new UE.ui.Editor({'autoFloatEnabled': false}); + editor.key = 'ed'; + var div = document.body.appendChild(document.createElement('div')); + div.id = 'ed'; + editor.render(div); + editor.ready(function () { + setTimeout(function () { + editor.destroy(); + equal(document.getElementById('ed').tagName.toLowerCase(), 'textarea', '容器被删掉了'); + document.getElementById('ed') && te.dom.push(document.getElementById('ed')); + start(); + }, 200); + + }); + stop(); +}); + +//test( "setup--ready event", function() { +// //todo +//} ); +// +test("testBindshortcutKeys", function () { + var editor = te.obj[1]; + var container = te.dom[0]; + $(container).css('width', '500px').css('height', '500px').css('border', '1px solid #ccc'); + editor.render(container); + expect(1); + editor.ready(function () { + editor.addshortcutkey({ + "testBindshortcutKeys": "ctrl+67"//^C + }); + editor.commands["testbindshortcutkeys"] = { + execCommand: function (cmdName) { + ok(1, '') + }, + queryCommandState: function () { + return 0; + } + } + ua.keydown(editor.body, {keyCode: 67, ctrlKey: true}); + setTimeout(function () { + start(); + }, 200); + }); + stop(); +}); +test("getContent--转换空格,nbsp与空格相间显示", function () { + var editor = te.obj[1]; + var div = te.dom[0]; + editor.render(div); + stop(); + editor.ready(function () { + setTimeout(function () { + editor.focus(); + var innerHTML = '
    x x x    x    
    '; + editor.setContent(innerHTML); + equal(editor.getContent(), '

    x  x   x    x     

    ', "转换空格,nbsp与空格相间显示,原nbsp不变"); + setTimeout(function () { +// UE.delEditor('test1'); + start(); + }, 100); + }, 100); + }); +}); + +test('getContent--参数为函数', function () { + var editor = te.obj[1]; + var div = te.dom[0]; + editor.render(div); + stop(); + editor.ready(function () { + editor.focus(); + editor.setContent("


    dd

    "); + equal(editor.getContent(), "


    dd

    ", 'hasContents判断不为空'); + equal(editor.getContent(function () { + return false + }), "", '为空'); + setTimeout(function () { +// UE.delEditor('test1'); + setTimeout(function () { + start(); + }, 50); + }, 100); + }); +}); + +test('getContent--2个参数,第一个参数为参数为函数', function () { + var editor = te.obj[1]; + var div = te.dom[0]; + editor.render(div); + stop(); + editor.ready(function () { + editor.focus(); + editor.setContent("


    dd

    "); + equal(editor.getContent(), "


    dd

    ", 'hasContents判断不为空'); + equal(editor.getContent("", function () { + return false + }), "", '为空'); + setTimeout(function () { +// UE.delEditor('test1'); +// setTimeout(function () { + start(); +// }, 50); + }, 100); + }); +}); + +/*ie自动把左边的空格去掉,所以就不测这个了*/ +//test( "getContent--空格不会被去掉", function() { +// var editor = te.obj[1]; +// var div = te.dom[0]; +// editor.render( div ); +// editor.focus(); +// var innerHTML = '你好 '; +// editor.setContent( innerHTML ); +// equal( editor.getContent().toLowerCase(), '

    你好

    ', "删除不可见字符" ); +//} ); +test("setContent", function () { + var editor = te.obj[1]; + var container = te.dom[0]; + $(container).css('width', '500px').css('height', '500px').css('border', '1px solid #ccc'); + editor.render(container); + stop(); + editor.ready(function () { + editor.focus(); + expect(2); + editor.addListener("beforesetcontent", function () { + ok(true, "beforesetcontent"); + }); + editor.addListener("aftersetcontent", function () { + ok(true, "aftersetcontent"); + }); + var html = 'xxem
    xxxx
    '; + editor.setContent(html); + var div_new = document.createElement('div'); + div_new.innerHTML = '

    xxem

    xxxx
    '; + var div2 = document.createElement('div'); + div2.innerHTML = editor.body.innerHTML; + ua.haveSameAllChildAttribs(div2, div_new, 'check contents'); + start(); + }); +}); + +test("setContent 追加", function () { + var editor = te.obj[1]; + var container = te.dom[0]; + $(container).css('width', '500px').css('height', '500px').css('border', '1px solid #ccc'); + editor.render(container); + stop(); + editor.ready(function () { + editor.focus(); + expect(2); + editor.addListener("beforesetcontent", function () { + ok(true, "beforesetcontent"); + }); + editor.addListener("aftersetcontent", function () { + ok(true, "aftersetcontent"); + }); + var html = 'xxem
    xxxx
    '; + editor.setContent(html); + var div_new = document.createElement('div'); + div_new.innerHTML = '

    xxem

    xxxx
    '; + var div2 = document.createElement('div'); + div2.innerHTML = editor.body.innerHTML; + ua.haveSameAllChildAttribs(div2, div_new, 'check contents'); + start(); + }, 50); +}); +//test( "focus", function() { +// var editor = te.obj[1]; +// expect( 1 ); +// /*设置onfocus事件,必须同步处理,否则在ie下onfocus会在用例执行结束后才会触发*/ +// stop(); +// editor.window.onfocus = function() { +// ok( true, 'onfocus event dispatched' ); +// start(); +// }; +// editor.focus(); +//} ); +test("focus(false)", function () { + var editor = te.obj[1]; + var container = te.dom[0]; + $(container).css('width', '500px').css('height', '500px').css('border', '1px solid #ccc'); + editor.render(container); + stop(); + editor.ready(function () { + editor.setContent("

    hello1

    hello2

    "); + setTimeout(function () { + editor.focus(false); + setTimeout(function () { + + var range = editor.selection.getRange(); + equal(range.startOffset, 0, "focus(false)焦点在最前面"); + equal(range.endOffset, 0, "focus(false)焦点在最前面"); + if (ua.browser.gecko||ua.browser.webkit) { + equal(range.startContainer, editor.body.firstChild, "focus(false)焦点在最前面"); + equal(range.collapsed, true, "focus(false)焦点在最前面"); + } + else { + equal(range.startContainer, editor.body.firstChild.firstChild, "focus(false)焦点在最前面"); + equal(range.endContainer, editor.body.firstChild.firstChild, "focus(false)焦点在最前面"); + } + start(); + }, 200); + }, 100); + }); +}); + +test("focus(true)", function () { + var editor = te.obj[1]; + var container = te.dom[0]; + $(container).css('width', '500px').css('height', '500px').css('border', '1px solid #ccc'); + editor.render(container); + stop(); + editor.ready(function () { + editor.setContent("

    hello1

    hello2

    "); + setTimeout(function () { + + editor.focus(true); + setTimeout(function () { + + if (ua.browser.gecko||ua.browser.webkit) { + equal(editor.selection.getRange().startContainer, editor.body.lastChild, "focus( true)焦点在最后面"); + equal(editor.selection.getRange().endContainer, editor.body.lastChild, "focus( true)焦点在最后面"); + equal(editor.selection.getRange().startOffset, editor.body.lastChild.childNodes.length, "focus( true)焦点在最后面"); + equal(editor.selection.getRange().endOffset, editor.body.lastChild.childNodes.length, "focus( true)焦点在最后面"); + } + else { + equal(editor.selection.getRange().startContainer, editor.body.lastChild.lastChild, "focus( true)焦点在最后面"); + equal(editor.selection.getRange().endContainer, editor.body.lastChild.lastChild, "focus( true)焦点在最后面"); + equal(editor.selection.getRange().startOffset, editor.body.lastChild.lastChild.length, "focus( true)焦点在最后面"); + equal(editor.selection.getRange().endOffset, editor.body.lastChild.lastChild.length, "focus( true)焦点在最后面"); + } + start(); + }, 200); + }, 100); + + }); +}); + +test("isFocus()", function () { + var editor = te.obj[1]; + var container = te.dom[0]; + $(container).css('width', '500px').css('height', '500px').css('border', '1px solid #ccc'); + editor.render(container); + stop(); + editor.ready(function () { + editor.focus(); + setTimeout(function () { + ok(editor.isFocus()); + start(); + }, 200); + }); +}); + +test("blur()", function () { + var editor = te.obj[1]; + var container = te.dom[0]; + $(container).css('width', '500px').css('height', '500px').css('border', '1px solid #ccc'); + editor.render(container); + stop(); + editor.ready(function () { + editor.focus(); + ok(editor.isFocus()); + editor.blur(); + ok(!editor.isFocus()); + editor.blur();//多次使用不报错 + ok(!editor.isFocus()); + start(); + }); +}); +test("_initEvents,_proxyDomEvent--click", function () { + var editor = te.obj[1]; + var container = te.dom[0]; + $(container).css('width', '500px').css('height', '500px').css('border', '1px solid #ccc'); + editor.render(container); + stop(); + editor.ready(function () { + editor.focus(); + expect(1); + stop(); + editor.addListener('click', function () { + ok(true, 'click event dispatched'); + start(); + }); + ua.click(editor.document); + }); +}); + +//test("_initEvents,_proxyDomEvent--focus", function() { +// var editor = te.obj[1]; +// +// expect(1); stop(); +// editor.addListener('focus', function() { +// ok(true, 'focus event dispatched'); +// start(); +// }); +// editor.setContent("

    hello1

    hello2

    "); +// editor.focus(); +//}); + +////TODO +//test( "_selectionChange--测试event是否被触发", function() { +// var editor = te.obj[1]; +// var div = te.dom[0]; +// editor.render( div ); +// editor.focus(); +// expect( 2 ); +// stop(); +// editor.addListener( 'beforeselectionchange', function() { +// ok( true, 'before selection change' ); +// } ); +// editor.addListener( 'selectionchange', function() { +// ok( true, 'selection changed' ); +// } ); +// +// ua.mousedown( editor.document, {clientX:0,clientY:0} ); +// setTimeout( function() { +// ua.mouseup( editor.document, {clientX:0,clientY:0} ); +// }, 50 ); +// +// /*_selectionChange有一定的延时才会触发,所以需要等一会*/ +// setTimeout( function() { +// start(); +// }, 200 ); +//} ); + +//test("_selectionChange--fillData", function() { +// var editor = te.obj[1]; +// var div = te.dom[0]; +// editor.focus(); +// //TODO fillData干嘛用的 +//}); + +/*按钮高亮、正常和灰色*/ +test("queryCommandState", function () { + var editor = te.obj[1]; + var container = te.dom[0]; + $(container).css('width', '500px').css('height', '500px').css('border', '1px solid #ccc'); + editor.render(container); + stop(); + editor.ready(function () { + editor.focus(); + editor.setContent("

    xxxxxx

    "); + var p = editor.document.getElementsByTagName('p')[0]; + var r = new baidu.editor.dom.Range(editor.document); + r.setStart(p.firstChild, 0).setEnd(p.firstChild, 1).select(); + equal(editor.queryCommandState('bold'), 1, '加粗状态为1'); + r.setStart(p, 1).setEnd(p, 2).select(); + setTimeout(function () { + equal(editor.queryCommandState('bold'), 0, '加粗状态为0'); + start(); + }, 100); + }); +}); +test("queryCommandValue", function () { + var editor = te.obj[1]; + var container = te.dom[0]; + $(container).css('width', '500px').css('height', '500px').css('border', '1px solid #ccc'); + editor.render(container); + stop(); + editor.ready(function () { + editor.focus(); + editor.setContent('

    xxx

    '); + var range = new baidu.editor.dom.Range(editor.document); + var p = editor.document.getElementsByTagName("p")[0]; + range.selectNode(p).select(); + equal(editor.queryCommandValue('justify'), 'left', 'text align is left'); + start(); + }); +}); +test("execCommand", function () { + var editor = te.obj[1]; + var container = te.dom[0]; + $(container).css('width', '500px').css('height', '500px').css('border', '1px solid #ccc'); + editor.render(container); + stop(); + editor.ready(function () { + editor.focus(); + editor.setContent("

    xx

    xxx

    "); + var doc = editor.document; + var range = new baidu.editor.dom.Range(doc); + var p = doc.getElementsByTagName('p')[1]; + range.setStart(p, 0).setEnd(p, 1).select(); + editor.execCommand('justify', 'right'); + equal($(p).css('text-align'), 'right', 'execCommand align'); + /*给span加style不会重复添加span*/ + range.selectNode(p).select(); + editor.execCommand("forecolor", "red"); + /*span发生了变化,需要重新获取*/ + + var span = doc.getElementsByTagName('span')[0]; + equal(span.style['color'], 'red', 'check execCommand color'); + var div_new = document.createElement('div'); + div_new.innerHTML = '

    xx

    xxx

    '; + + var div1 = document.createElement('div'); + div1.innerHTML = editor.body.innerHTML; + ok(ua.haveSameAllChildAttribs(div_new, div1), 'check style'); + start(); + }); +}); + +test("hasContents", function () { + var editor = te.obj[1]; + var container = te.dom[0]; + $(container).css('width', '500px').css('height', '500px').css('border', '1px solid #ccc'); + editor.render(container); + stop(); + editor.ready(function () { + editor.focus(); + editor.setContent(''); + ok(!editor.hasContents(), "have't content"); + editor.setContent("xxx"); + ok(editor.hasContents(), "has contents"); + editor.setContent('


    '); + ok(!editor.hasContents(), '空p认为是空'); + start(); + }); +}); +//test( "hasContents--只有空格", function() { +// var editor = te.obj[1]; +// editor.focus(); +// editor.setContent( ' ' ); +// ok( editor.hasContents(), "空格不被过滤" ); +// editor.setContent( "

    \t\n

    " ); +// ok( editor.hasContents(), "空格不过滤" ); +//} ); + +/*参数是对原有认为是空的标签的一个扩展,即原来的dtd认为br为空,加上这个参数可以认为br存在时body也不是空*/ +test("hasContents--有参数", function () { + var editor = te.obj[1]; + var container = te.dom[0]; + $(container).css('width', '500px').css('height', '500px').css('border', '1px solid #ccc'); + editor.render(container); + stop(); + editor.ready(function () { + editor.focus(); + editor.setContent('

    你好

    1. ddd

    '); + ok(editor.hasContents(['ol', 'li', 'table']), "有ol和li"); + ok(editor.hasContents(['td', 'li', 'table']), "有li"); + editor.setContent('


    '); + ok(!editor.hasContents(['']), "为空"); + ok(editor.hasContents(['br']), "不为空"); + start(); + }); +}); +//test( 'getContentTxt--文本前后中间有空格', function() { +// var editor = te.obj[1]; +// editor.focus(); +// editor.setContent( '你 好\t\n' ); +// equal( editor.getContentTxt(), '你 好\t\n' ) +// equal( editor.getContentTxt().length, 3, '3个字符,空格不会被过滤' ) +//} ); + +test('trace 1964 getPlainTxt--得到有格式的编辑器的纯文本内容', function () { + var editor = te.obj[1]; + var container = te.dom[0]; + $(container).css('width', '500px').css('height', '500px').css('border', '1px solid #ccc'); + editor.render(container); + stop(); + editor.ready(function () { + editor.focus(); + editor.setContent('

     

      hell\no
    hello

    '); + var html = (ua.browser.ie > 0 && ua.browser.ie < 9) ? "\n hell o\nhello\n" : "\n hello\nhello\n"; + equal(editor.getPlainTxt(), html, '得到编辑器的纯文本内容,但会保留段落格式'); + start(); + }); +}); + +test('getContentTxt--文本前后的空格,&nbs p转成空格', function () { + var editor = te.obj[1]; + var container = te.dom[0]; + $(container).css('width', '500px').css('height', '500px').css('border', '1px solid #ccc'); + editor.render(container); + + stop(); + editor.ready(function () { + editor.focus(); + editor.setContent('  你 好   '); + equal(editor.getContentTxt(), ' 你 好 '); + equal(editor.getContentTxt().length, 8, '8个字符,空格不被过滤'); + + start(); + }); +}); +test('getAllHtml', function () { + var editor = te.obj[1]; + var container = te.dom[0]; + $(container).css('width', '500px').css('height', '500px').css('border', '1px solid #ccc'); + editor.render(container); + stop(); + editor.ready(function () { + editor.focus(); + var html = editor.getAllHtml(); + ok(/iframe.css/.test(html), '引入样式'); + + start(); + }); +}); +test('2个实例采用2个配置文件', function () { + var head = document.getElementsByTagName('head')[0]; + var script = document.createElement('script'); + script.type = 'text/javascript'; + script.src = '../../editor_config.js'; + head.appendChild(script); + expect(6); + stop(); + /*动态加载js需要时间,用这个ueditor.config.js覆盖默认的配置文件*/ + setTimeout(function () { + var div1 = document.body.appendChild(document.createElement('div')); + div1.id = 'div1'; + div1.style.height = '200px'; + var div2 = document.body.appendChild(document.createElement('div')); + div2.id = 'div2'; + var editor1 = UE.getEditor('div1', {'UEDITOR_HOME_URL': '../../../', 'initialContent': '欢迎使用ueditor', 'autoFloatEnabled': false}); + editor1.ready(function () { + var editor2 = UE.getEditor('div2', UEDITOR_CONFIG2); + editor2.ready(function () { + //1.2.6 高度是iframe容器的高度 + equal(editor1.ui.getDom('iframeholder').style.height, '200px', '编辑器高度为200px'); + equal(editor2.ui.getDom('iframeholder').style.height, '400px', '自定义div高度为400px'); + var html = UEDITOR_CONFIG2.initialContent; + ua.checkHTMLSameStyle(html, editor2.document, editor2.body.firstChild, '初始内容为自定制的'); + equal(editor2.options.enterTag, 'br', 'enterTag is br'); + html = '欢迎使用ueditor'; + equal(html, editor1.body.firstChild.innerHTML, '内容和ueditor.config一致'); + equal(editor1.options.enterTag, 'p', 'enterTag is p'); + setTimeout(function () { + UE.delEditor('div1'); + UE.delEditor('div2'); + document.getElementById('div1') && te.dom.push(document.getElementById('div1')); + document.getElementById('div2') && te.dom.push(document.getElementById('div2')); + start(); + }, 500); + }); + }); + }, 300); +}); +test('绑定事件', function () { + document.onmouseup = function (event) { + ok(true, "mouseup is fired"); + }; + document.onmousedown = function (event) { + ok(true, "mousedown is fired"); + }; + document.onmouseover = function (event) { + ok(true, "mouseover is fired"); + }; + document.onkeydown = function (event) { + ok(true, "keydown is fired"); + }; + document.onkeyup = function (event) { + ok(true, "keyup is fired"); + }; + var editor = new baidu.editor.Editor({'autoFloatEnabled': false}); + var div = document.body.appendChild(document.createElement('div')); + editor.render(div); + expect(5); + editor.ready(function () { + setTimeout(function () { + editor.focus(); + ua.mousedown(document.body); + ua.mouseup(document.body); + ua.mouseover(document.body); + ua.keydown(document.body, {'keyCode': 13}); + ua.keyup(document.body, {'keyCode': 13}); + setTimeout(function () { + document.getElementById('div') && te.dom.push(document.getElementById('div')); + start(); + }, 1000); + }, 50); + }); + stop(); +}); +////.fireMouseEvent(target, "contextmenu", options); +//test('dragover',function(){ +// var editor = new baidu.editor.Editor({'autoFloatEnabled':false}); +// var div = document.body.appendChild(document.createElement('div')); +// editor.render(div); +// editor.ready(function(){ +// editor.focus(); +// ua.fireMouseEvent(document.body, "dragover"); +// setTimeout(function(){ +// expect(5); +// start(); +// },100); +// }); +//}); + + diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/core/EventBase.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/core/EventBase.js new file mode 100644 index 000000000..d9181fbff --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/core/EventBase.js @@ -0,0 +1,194 @@ +module( "EventBase" ); + +test( "addListener,fireEvent", function() { + var editor = te.obj[1]; + var div = te.dom[0]; + expect(6); + editor.render(div); + stop(); + editor.ready(function () { + editor.focus(); + + editor.addListener("event1", function () { + ok(true, "listener1 is fired"); + }); + editor.addListener("event2", function () { + ok(true, "listener2 is fired"); + }); + editor.fireEvent("event1"); + editor.fireEvent("event2"); + + editor.fireEvent("event1 event2"); + var fun = function (type) { + ok(true, type + " is fired"); + }; + editor.addListener("event3 event4 ", fun); + editor.fireEvent("event3 event4 "); + start(); + }); +} ); +test( "on,trigger", function() { + var editor = te.obj[1]; + var div = te.dom[0]; + expect(6); + editor.render(div); + stop(); + editor.ready(function () { + editor.focus(); + + editor.on("event1", function () { + ok(true, "listener1 is fired"); + }); + editor.on("event2", function () { + ok(true, "listener2 is fired"); + }); + editor.trigger("event1"); + editor.trigger("event2"); + + editor.trigger("event1 event2"); + var fun = function (type) { + ok(true, type + " is fired"); + }; + editor.on("event3 event4 ", fun); + editor.trigger("event3 event4 "); + start(); + }); +} ); +test( "addListener,fireEvent --同一个侦听器绑定多个事件", function() { + var editor = te.obj[1]; + var div = te.dom[0]; + editor.render( div ); + expect( 2 ); + stop(); + editor.ready(function () { + editor.focus(); + editor.addListener( "event1", function() { + ok( true, "listener1 is fired" ); + } ); + editor.addListener( "event1", function() { + ok( true, "listener2 is fired" ); + } ); + editor.fireEvent( "event1" ); + start(); + }); +} ); +test( "on,trigger --同一个侦听器绑定多个事件", function() { + var editor = te.obj[1]; + var div = te.dom[0]; + editor.render( div ); + expect( 2 ); + stop(); + editor.ready(function () { + editor.focus(); + editor.on( "event1", function() { + ok( true, "listener1 is fired" ); + } ); + editor.on( "event1", function() { + ok( true, "listener2 is fired" ); + } ); + editor.trigger( "event1" ); + start(); + }); +} ); +test( "removeListener", function() { + var editor = te.obj[1]; + var div = te.dom[0]; + editor.render( div); + expect(3); + stop(); + editor.ready(function () { + editor.focus(); + function fun1() { + ok(true, "listener1 is fired"); + } + + function fun2() { + ok(true, "listener2 is fired"); + } + + editor.addListener("event1", fun1); + editor.addListener("event1", fun2); + editor.fireEvent("event1"); + + editor.removeListener("event1", fun1); + editor.fireEvent("event1"); + + function fun(type) { + ok(true, type + " is fired"); + } + + editor.addListener("event3 event4 ", fun); + editor.removeListener("event3 event4 ", fun); + editor.fireEvent("event3 event4 "); + start(); + }); +} ); + +test( "off", function() { + var editor = te.obj[1]; + var div = te.dom[0]; + editor.render( div); + expect(3); + stop(); + editor.ready(function () { + editor.focus(); + function fun1() { + ok(true, "listener1 is fired"); + } + + function fun2() { + ok(true, "listener2 is fired"); + } + + editor.on("event1", fun1); + editor.on("event1", fun2); + editor.trigger("event1"); + + editor.off("event1", fun1); + editor.trigger("event1"); + + function fun(type) { + ok(true, type + " is fired"); + } + + editor.on("event3 event4 ", fun); + editor.off("event3 event4 ", fun); + editor.trigger("event3 event4 "); + start(); + }); +} ); +test( "fireEvent--nolisteners", function() { + var editor = te.obj[1]; + var div = te.dom[0]; + editor.render(div); + stop(); + editor.ready(function () { + editor.focus(); + function fun1() { + ok(true, "listener1 is fired"); + } + + editor.fireEvent("event1");//no listener is fired + editor.addListener("event1", fun1); + editor.fireEvent("event1");//listener1 and listener2 are both fired + start(); + }); +} ); + +test( "trigger--nolisteners", function() { + var editor = te.obj[1]; + var div = te.dom[0]; + editor.render(div); + stop(); + editor.ready(function () { + editor.focus(); + function fun1() { + ok(true, "listener1 is fired"); + } + + editor.trigger("event1");//no listener is fired + editor.on("event1", fun1); + editor.trigger("event1");//listener1 and listener2 are both fired + start(); + }); +} ); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/core/Range.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/core/Range.js new file mode 100644 index 000000000..668287bf7 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/core/Range.js @@ -0,0 +1,1582 @@ +module('core.Range'); + +var checkBookmark = function (bookmark, pre, latter, id) { + same(bookmark['start'], pre, '检查start返回值'); + same(bookmark['end'], latter, '检查end返回值'); + equal(bookmark['id'], id, '检查id'); +}; + +test('init', function () { + expect(6); + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + ua.checkResult(range, null, null, null, null, true, 'for init range'); + same(range.document, document, 'check current document of range'); +}); + + +test('setStart/startEnd 自闭合元素', function () { + var range = new baidu.editor.dom.Range(document); + var div = te.dom[2]; + var img = document.createElement('img'); + div.appendChild(img); + range.setStart(img, 0); + ua.checkResult(range, div, div, 0, 0, true, "endContainer is null"); + range.setEnd(img, 0); + ua.checkResult(range, div, div, 0, 1, false, "startContainer is not null"); + range.startContainer = null; + range.setEnd(img, 0); + ua.checkResult(range, div, div, 1, 1, true, "startContainer is null"); + range.setStart(img, 0); + ua.checkResult(range, div, div, 0, 1, false, "endContainer is not null"); +}); + +test('setStart/startEnd--nodeType不为1', function () { + var range = new baidu.editor.dom.Range(document); + var div = te.dom[2]; + var text = document.createTextNode("text"); + div.appendChild(text); + range.setStart(text, 0); + ua.checkResult(range, text, text, 0, 0, true, "endContainer is null"); + range.setEnd(text, 1); + ua.checkResult(range, text, text, 0, 1, false, "startContainer is not null"); +}); + +test('setStart/setEnd--nodeType为1', function () { + var range = new baidu.editor.dom.Range(document); + var div = te.dom[2]; + range.setStart(div, 0); + ua.checkResult(range, div, div, 0, 0, true, "endContainer is null"); + range.setEnd(div, 1); + ua.checkResult(range, div, div, 0, 1, false, "startContainer is not null"); +}); +/* + * 测的内容比较多,updateCollapse,setEndPoint,setStart,setEnd,collapse + * 因为updateCollapse和setEndPoint无法通过Range对象获取, 必须间接调用验证 + */ +test('setStartAfter,setStartBefore', function () { + var div = te.dom[2]; + div.innerHTML = ''; + var span = div.firstChild; + var a = div.lastChild; + var range = new baidu.editor.dom.Range(document); + range.setStartAfter(a); + equal(range.startOffset, 2, 'check startOffset for setStartAfter--boundary testing'); + range.setStartAfter(span); + equal(range.startOffset, 1, 'check startOffset for setStartAfter'); + range.setStartBefore(span); + equal(range.startOffset, 0, 'check startOffset for setStartBefore--boundary testing'); + range.setStartBefore(a); + equal(range.startOffset, 1, 'check startOffset for setStartBefore'); + var txtNode = document.createTextNode("text"); + div.innerHTML = ""; + div.appendChild(txtNode); + range.setStartBefore(txtNode); + equal(range.startOffset, 0, 'check startOffset in text node'); +}); + +test('setEndAfter,setEndBefore', function () { + var div = te.dom[2]; + div.innerHTML = ''; + var span = div.firstChild; + var a = div.lastChild; + var range = new baidu.editor.dom.Range(document); + range.setEndAfter(a); + equal(range.endOffset, 2, 'check startOffset for setEndAfter--boundary testing'); + range.setEndAfter(span); + equal(range.endOffset, 1, 'check startOffset for setEndAfter'); + range.setEndBefore(span); + equal(range.endOffset, 0, 'check startOffset for setEndBefore--boundary testing'); + range.setEndBefore(a); + equal(range.endOffset, 1, 'check startOffset for setEndBefore'); +}); + +/* 校验collapse方法 */ +test('collapse', function () { + var text = document.createTextNode('TextNode'); + te.dom[2].appendChild(text); + var range = new baidu.editor.dom.Range(document); + range.setStart(text, 1); +// ua.checkResult(range.endContainer,range.startContainer,0) + ok(range.collapsed, 'check collapse method true--setStart'); + equal(range.startContainer, range.endContainer, 'compare startContainer and endContainer--setStart'); + range.startContainer = null; + range.setEnd(text, 0); + equal(range.startContainer, range.endContainer, 'compare startContainer and endContainer--setEnd'); + equal(range.startOffset, range.endOffset, 'compare startOffset and endOffset--setEnd'); + ok(range.collapsed, 'check collapsed is true--setEnd'); + var img = document.createElement("img"); + range.insertNode(img).selectNode(img); + equal(range.startContainer, range.endContainer, "img startContainer and endContainer is same,but startOffset and endOffset is not same"); +}); + +//TODO 空节点
    + +test('selectNode', function () { + var div = te.dom[2]; + div.innerHTML = "text!"; + div.id = 'div_id'; + var range = new baidu.editor.dom.Range(document); + range.selectNode(div); + var index = ua.getIndex(div); + ua.checkResult(range, document.body, document.body, index, index + 1, false, 'check selectNode'); +}); + +test('selectNode--空节点', function () { + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + range.selectNode(div); + var index = ua.getIndex(div); + ua.checkResult(range, document.body, document.body, index, index + 1, false, 'check selectNode'); +}); + +test('selectNode--空文本节点', function () { + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + var textNode = document.createTextNode(''); + div.appendChild(textNode); + range.selectNode(div); + var index = ua.getIndex(div); + ua.checkResult(range, document.body, document.body, index, index + 1, false, 'check selectNode'); +}); + +test('selectNodeContents', function () { + expect(15); + var div = te.dom[2]; + div.innerHTML = '
    text
    '; + var text = div.firstChild.firstChild; + var range = new baidu.editor.dom.Range(document); + range = range.selectNodeContents(div); + ua.checkResult(range, div, div, 0, 2, false, 'selectNodeContents'); + /*textNode*/ + range = range.selectNodeContents((text)); + ua.checkResult(range, text, text, 0, 4, false, 'selectNodeContents for textNode'); + div.innerHTML = 'xxxxxxxxx'; + range = new baidu.editor.dom.Range(document); + range = range.selectNodeContents(div.firstChild); + ua.checkResult(range, div.firstChild, div.firstChild, 0, 3, false, 'selectNodeContents'); + +}); + + +test('cloneRange', function () { + expect(5); + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + div.innerHTML = '
    cloneRange
    '; + range.setStart(div, 0); + range.setEnd(div, 1); + var cloneRange = range.cloneRange(range); + ua.checkResult(range, cloneRange.startContainer, cloneRange.endContainer, + cloneRange.startOffset, cloneRange.endOffset, false, 'cloneRange'); +}); + + +/*循环缩进子节点,直到子节点元素类型不为1或为自闭合元素*/ +test('shrinkBoundary--not ignore end', function () { + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); +// $('#test').css('background','red'); + div.innerHTML = '
    div1_text
    a_text
    span_textdiv3_text
    '; + + var a = div.firstChild.nextSibling; + var div_2 = div.lastChild; + range.setStart(div, 1).setEnd(div, 3); + range.shrinkBoundary(); + ua.checkResult(range, a, div_2, 0, 2, false, 'shrinkBoundary--not ignore end'); +}); + +test('shrinkBoundary--ignoreEnd', function () { + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + div.innerHTML = "

    p_text

    "; + var div_child = div.firstChild; + var p = div_child.firstChild; + range.setStart(div_child, 0).setEnd(div_child, 0); + //TODO + range.shrinkBoundary(true); + ua.checkResult(range, p, p, 0, 0, true, '检查前后闭合是否一致'); +}); +test('shrinkBonudaryl', function () { + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + div.innerHTML = 'xxxxxxxxxxx'; + /*ignoreEnd=true*/ + range.selectNodeContents(div).shrinkBoundary(true); + + var i = div.firstChild.firstChild; + ua.checkResult(range, i, div, 0, 1, false, 'shrinkBoundary--ignoreEnd'); + /*ignoreEnd = null*/ + var b = div.firstChild; + range.selectNodeContents(div).shrinkBoundary(); + ua.checkResult(range, i, b, 0, b.childNodes.length, false, 'shrinkBoundary--not ignoreEnd'); + + div.innerHTML = 'xxxxssss'; + var u = div.getElementsByTagName('u')[0]; + range.selectNode(div.getElementsByTagName('b')[0]).shrinkBoundary(); + ua.checkResult(range, u, u, 0, 0, true, '初始startContainer和endContainer相同'); + + div.innerHTML = '
    sssss
    '; + var td = div.getElementsByTagName('td')[0]; + var table = div.firstChild; + range.setStart(table, 0).setEnd(table.getElementsByTagName('tr')[0], 1).shrinkBoundary(); + ua.checkResult(range, td, td, 0, 1, false, '初始startContainer和endContainer不同'); + + div.innerHTML = ''; + range.setStart(div, 0).setEnd(div, 1).shrinkBoundary(); + ua.checkResult(range, div, div, 0, 1, false, '子节点为自闭合元素,未能进入函数内部的逻辑'); + + div.innerHTML = 'text'; + var text = div.firstChild; + range.setStart(text, 1).setEnd(text, 4).shrinkBoundary(); + ua.checkResult(range, text, text, 1, 4, false, '节点为文本节点,未能进入函数内部的逻辑'); + + range.setStart(div, 0).setEnd(div, 1).shrinkBoundary(); + ua.checkResult(range, div, div, 0, 1, false, '子节点为文本节点,未能进入函数内部的逻辑'); + + range.setStart(div, 0).setEnd(div, 0).shrinkBoundary(); + ua.checkResult(range, div, div, 0, 0, true, '元素collapsed'); + + range.setStart(div, 0).setEnd(text, 4).shrinkBoundary(); + ua.checkResult(range, div, text, 0, 4, false, 'endContainer为文本节点'); +}); + + +/*调整边界,针对TextNode*/ +test('txtToElmBoundary', function () { + var div = te.dom[2]; + div.innerHTML = 'text_node'; + var range = new baidu.editor.dom.Range(document); + var text = div.firstChild; + /*endOffset大于text的长度*/ + range.setStart(text, 0).setEnd(text, 10); + range.txtToElmBoundary(); + ua.checkResult(range, div, div, 0, 1, false, 'endOffset大于text的长度'); + /*endOffset小于text的长度*/ + range.setStart(text, 1).setEnd(text, 4).txtToElmBoundary(); + ua.checkResult(range, text, text, 1, 4, false, 'endOffset小于text长度'); + range.setStart(text, 1).setEnd(text, 10).txtToElmBoundary(); + ua.checkResult(range, text, div, 1, 1, false, 'startOffset不为0,endOffset大于text长度'); + /*startOffset和endOffset都大于text长度*/ + range.setStart(text, 10).setEnd(text, 11).txtToElmBoundary(); + ua.checkResult(range, div, div, 1, 1, true, 'endOffset和startOffset大于text长度'); + /*startOffset和endOffset都等于0*/ + range.setStart(text, 0).setEnd(text, 0).txtToElmBoundary(); + ua.checkResult(range, text, text, 0, 0, true, 'startOffset和endOffset为0'); +}); + +/*切分文本节点*/ +test('trimBonudary', function () { + var div = te.dom[2]; + div.innerHTML = '
    td_xxxxu_text
    '; + var range = new baidu.editor.dom.Range(document); + var td = div.getElementsByTagName('td')[0]; + var td_text = td.firstChild; + /*startOffset为0,在第一个孩子节点前插入*/ + range.setStart(td_text, 0).setEnd(td_text, 5); + + range.trimBoundary(); + ua.checkResult(range, td, td, 0, 1, false, '切分文本节点'); + /*text_node被切分为2个文本节点*/ + equal(td_text.data, "td_xx", "check text of tr"); + + var u = div.getElementsByTagName('u')[0]; + var u_text = u.firstChild; + + /*startOffset=0 && collapsed=true,则不对后面的文本节点进行操作*/ + range.setStart(u_text, 0).setEnd(u_text, 0); + range.trimBoundary(); + ua.checkResult(range, u, u, 0, 0, true, 'startOffset=endOffset=0'); + + /*endOffset大于text的长度,从左边切'*/ + range.setStart(u_text, 3).setEnd(u_text, 10); + range.trimBoundary().select(); + ua.checkResult(range, u, u, 1, 2, false, 'endOffset大于text的长度'); + equal(u_text.data, 'u_t', '从左边切分textNode'); + + /*endOffset大小于text的长度,从中间切'*/ + range.setStart(u_text, 1).setEnd(u_text, 2); + range.trimBoundary(); + ua.checkResult(range, u, u, 1, 2, false, 'endOffset小于text的长度'); + equal(u_text.data, 'u', '从中间切分textNode'); + + div.innerHTML = '123456'; + range.setStart(div.firstChild, 2).setEnd(div.firstChild, 4).trimBoundary(true); + ua.checkResult(range, div, div.lastChild, 1, 2, false, 'ignoreEnd'); +}); + +/*前面尽可能往右边跳,后面尽可能往左边跳*/ +test('adjustmentBoundary--startContainer为文本节点', function () { + var range = new baidu.editor.dom.Range(document); + var div = te.dom[2]; + div.innerHTML = 'div_text

    span_text

    div_text2

    p_textem_text

    '; + var span_text = document.getElementById('span').firstChild; + var p = document.getElementById('p'); + range.setStart(span_text, 9).setEnd(p, 0); + range.adjustmentBoundary(); + ua.checkResult(range, div, div, 2, 3, false, 'startContainer为文本节点'); + +}); + +//TODO +test('adjustmentBoundary--非文本节点', function () { + var range = new baidu.editor.dom.Range(document); + var div = te.dom[2]; + div.innerHTML = 'div_text

    span_text

    div_text2

    p_textem_text

    '; + var span = document.getElementById('span'); + var p = document.getElementById('p'); + range.setStart(span, 1).setEnd(p, 0); + range.adjustmentBoundary(); + ua.checkResult(range, div, div, 2, 3, false, 'startContainer为非文本节点'); + +}); + +test('getCommonAncestor--初始startContainer和endContainer相同', function () { + var range = new baidu.editor.dom.Range(document); + var div = te.dom[2]; + div.innerHTML = "div_text

    span_text

    div_text2"; + range.setStart(div, 0).setEnd(div, 1); + /*--初始startContainer和endContainer相同*/ + var ancestor = range.getCommonAncestor(); + same(ancestor, div, '祖先节点为startContainer'); + /*文本节点*/ + var span = div.getElementsByTagName('span')[0]; + range.setStart(span.firstChild, 0).setEnd(span.firstChild, 4); + ancestor = range.getCommonAncestor(); + same(ancestor, span.firstChild, "文本节点的祖先节点"); + /*忽略文本节点*/ + ancestor = range.getCommonAncestor(true, true); + same(ancestor, span, "文本节点的祖先节点--忽略文本节点"); + + range.setStart(div, 1).setEnd(div, 2); + ancestor = range.getCommonAncestor(true, true); + same(ancestor, span.parentNode, "文本节点的祖先节点--includeSelf=true"); + range.setStart(div, 1).setEnd(div, 2); + ancestor = range.getCommonAncestor(false, true); + same(ancestor, div, "文本节点的祖先节点--includeSelf=false"); +}); + + +test('getCommonAncestor--初始startContainer和endContainer不同', function () { + var range = new baidu.editor.dom.Range(document); + var div = te.dom[2]; + div.innerHTML = "div_text

    span_text

    div_text2"; + var span = div.getElementsByTagName('span')[0]; + range.setStart(div, 0).setEnd(span, 1); + /*--初始startContainer和endContainer相同*/ + var ancestor = range.getCommonAncestor(); + same(ancestor, div, 'startContainer是endContainer的祖先'); + + range.setStart(div.firstChild, 0).setEnd(span, 1); + ancestor = range.getCommonAncestor(); + same(ancestor, div, 'startContainer和endContainer是兄弟'); +}); + +test('selectNodeContents', function () { + var div = te.dom[2]; + div.innerHTML = 'xxxxdiv_text'; + var range = new baidu.editor.dom.Range(document); + /*选中非文本节点*/ + range.selectNodeContents(div); + ua.checkResult(range, div, div, 0, 2, false, 'selectNodeContents'); + /*选中文本节点*/ + range.selectNodeContents(div.lastChild); + ua.checkResult(range, div.lastChild, div.lastChild, 0, 8, false, 'selectNodeContents--'); +}); + +test('cloneContents', function () { + var div = te.dom[2]; + div.innerHTML = 'b_textdiv_text'; +// div.innerHTML = '

    first strong strong second em strong.

    bar

    some textem textmore text

    1abc
    34

    textabcspan

    '; + var range = new baidu.editor.dom.Range(document); + var b = div.firstChild; + range.setStart(b, 1).setEnd(div, 1); + var frag = range.cloneContents(); + /*类型:xxxx||div_text("|"表示切的位置)*/ + equal(ua.getHTML(frag), '', ' 只选中一个b标签,插入空文本节点'); + + /*类型:t|_extdiv|_text("|"表示切的位置)*/ + range.setStart(b.firstChild, 1).setEnd(b.nextSibling, 3); + frag = range.cloneContents(); + equal(ua.getHTML(frag), '_textdiv', '从文本节点中间切'); + /*类型:|b_t|extdiv_text("|"表示切的位置)*/ + range.setStart(div, 0).setEnd(b.firstChild, 3); + frag = range.cloneContents(); + equal(ua.getHTML(frag), 'b_t', '选中文本的前半部分'); + /*类型:b|_textdiv_text|("|"表示切的位置)*/ + range.setStart(b.firstChild, 1).setEnd(div, 2); + frag = range.cloneContents(); + equal(ua.getHTML(frag), '_textdiv_text', '选中文本的前半部分'); + /*类型:xxxx|xxxxc22c|("|"表示切的位置)*/ + div.innerHTML = 'xxxxxxxxc22c'; + range.setStart(div.firstChild, 1).setEnd(div.lastChild, 1); + equals(ua.getHTML(range.cloneContents()), 'xxxxc22c'); +}); + +/*startContainer和endContainer为文本节点,补全后面之类的标签*/ +test('cloneContents--补全后面的标签', function () { + var div = te.dom[2]; + var r = new baidu.editor.dom.Range(document); + div.innerHTML = '

    first strong strong second em strong.

    bar

    some textem textmore text

    1abc
    34

    textabcspan

    '; + var first = document.getElementById('first').firstChild; + var two = document.getElementById('two').firstChild; + r.setStart(first, 1).setEnd(two, 2); + ua.checkSameHtml(ua.getHTML(r.cloneContents()), '

    irst strong strong second em strong.

    bar

    some textem textmore text

    1ab
    '); + ua.checkResult(r, first, two, 1, 2, false, 'cloneContents--补全后面的标签'); +}); + +/*startContainer和endContainer为文本节点,层级各不相同,补全前面 的之类的标签*/ +test('cloneContents--补全前面的标签', function () { + var div = te.dom[2]; + var r = new baidu.editor.dom.Range(document); + div.innerHTML = '

    first strong strong second em strong.

    bar

    some textem textmore text

    1abc
    34

    textabcspan

    '; + var last = document.getElementById('last').firstChild; + var two = document.getElementById('two').firstChild; + r.setStart(two, 1); + r.setEnd(last, 2); + ua.checkSameHtml(ua.getHTML(r.cloneContents()), '
    bc
    34

    te

    '); + ua.checkResult(r, two, last, 1, 2, false, 'cloneContents--补全前面的标签'); +}); + +/*startContainer和endContainer为文本节点,为兄弟节点*/ +test('cloneContents--切的部分为兄弟节点', function () { + var div = te.dom[2]; + var r = new baidu.editor.dom.Range(document); + div.innerHTML = '

    first strong strong second em strong.

    bar

    some textem textmore text

    1abc
    34

    textabcspan

    '; + var first = document.getElementById('first'); + + r.setStart(first.firstChild, 1).setEnd(first.lastChild, 4); + /*strong前面有空格*/ + ua.checkSameHtml(ua.getHTML(r.cloneContents()), 'irst strong strong second em str'); + ua.checkResult(r, first.firstChild, first.lastChild, 1, 4, false, 'cloneContents--startContainer和endContainer为兄弟节点'); +}); + + +test('cloneContents--切同一个文本节点', function () { + var div = te.dom[2]; + var r = new baidu.editor.dom.Range(document); + div.innerHTML = '

    first strong strong second em strong.

    bar

    some textem textmore text

    1abc
    34

    textabcspan

    '; + var first = document.getElementById('first').firstChild; + + r.setStart(first, 1).setEnd(first, 4); + equals(ua.getHTML(r.cloneContents()), 'irs'); + ua.checkResult(r, first, first, 1, 4, false, 'cloneContents--切同一个文本节点'); +}); + +/*startContainer和endContainer的nodeType=1*/ +test('cloneContents--startContainer和endContainer为非文本节点', function () { + var div = te.dom[2]; + var r = new baidu.editor.dom.Range(document); + div.innerHTML = '

    first strong strong second em strong.

    bar

    some textem textmore text

    1abc
    34

    textabcspan

    '; + var first = document.getElementById('first'); + var last = document.getElementById('last'); + r.setStart(first, 0).setEnd(last, 0); + ua.checkSameHtml(ua.getHTML(r.cloneContents()), '

    first strong strong second em strong.

    bar

    some textem textmore text

    1abc
    34

    '); + ua.checkResult(r, first, last, 0, 0, false, 'cloneContents--开始和结束位置都是文本'); + + r.setStart(first, 1).setEnd(last, 1); + ua.checkSameHtml(ua.getHTML(r.cloneContents()), '

    strong strong second em strong.

    bar

    some textem textmore text

    1abc
    34

    textabc

    '); + ua.checkResult(r, first, last, 1, 1, false, 'cloneContents--开始位置有注释'); +}); + + +test('cloneContents--完整切掉一个节点', function () { + var div = te.dom[2]; + var r = new baidu.editor.dom.Range(document); + div.innerHTML = '

    first strong strong second em strong.

    bar

    some textem textmore text

    1abc
    34

    textabcspan

    '; + var first = document.getElementById('first'); + r.setStart(div, 0).setEnd(div, div.childNodes.length - 1); + ua.checkSameHtml(ua.getHTML(r.cloneContents()), '

    first strong strong second em strong.

    bar

    some textem textmore text

    1abc
    34
    '); + ua.checkResult(r, div, div, 0, div.childNodes.length - 1, false, 'cloneContents--完整切掉一个节点'); +}); + +test('cloneContents--startContainer和endContainer节点类型不同', function () { + var div = te.dom[2]; + var r = new baidu.editor.dom.Range(document); + div.innerHTML = '

    first strong strong second em strong.

    bar

    some textem textmore text

    1abc
    34

    textabcspan

    '; + var first = document.getElementById('first'); + var last = document.getElementById('last'); + r.setStart(first, 0).setEnd(last.firstChild, 1); + ua.checkSameHtml(ua.getHTML(r.cloneContents()), '

    first strong strong second em strong.

    bar

    some textem textmore text

    1abc
    34

    t

    '); + ua.checkResult(r, first, last.firstChild, 0, 1, false, 'cloneContents--startContainer的nodeType=1,endContainer为文本节点'); + + r.setStart(first.firstChild, 1).setEnd(last, 0); + ua.checkSameHtml(ua.getHTML(r.cloneContents()), '

    irst strong strong second em strong.

    bar

    some textem textmore text

    1abc
    34

    '); + ua.checkResult(r, first.firstChild, last, 1, 0, false, 'cloneContents--endContainer为文本节点,startContainer的nodeType=1'); +}); + + +test('cloneContents--endContainer为em', function () { + var div = te.dom[2]; + var r = new baidu.editor.dom.Range(document); + div.innerHTML = '

    first strong strong second em strong.

    bar

    some textem textmore text

    1abc
    34

    textabcspan

    '; + var traverse = document.getElementById('traverse'); + r.setStart(div, 0).setEnd(traverse, 1); + equals(ua.getHTML(r.cloneContents()), '

    first strong strong second em strong.

    bar

    some text

    '); + ua.checkResult(r, div, traverse, 0, 1, false, 'cloneContents--startContainer的nodeType=1,endContainer为b'); + r.setStart(div, 0).setEnd(traverse, 2); + equals(ua.getHTML(r.cloneContents()), '

    first strong strong second em strong.

    bar

    some textem text

    '); + ua.checkResult(r, div, traverse, 0, 2, false, 'cloneContents--startContainer的nodeType=1,endContainer为em'); +}); + + +test('cloneContents--元素闭合', function () { + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + div.innerHTML = '

    p_text

    '; +// if ( baidu.editor.browser.gecko ) { + + var text = div.firstChild.firstChild; + range.setStart(text, 1).setEnd(text, 1); + equals(ua.getHTML(range.cloneContents()), 'null', '元素闭合直接返回null'); + ua.checkResult(range, text, text, 1, 1, true, 'cloneContents--startContainer的nodeType=1,endContainer为em'); + var p = div.firstChild; + range.setStart(p, 1).setEnd(p, 1); + equals(ua.getHTML(range.cloneContents()), 'null', '元素闭合直接返回null'); + ua.checkResult(range, p, p, 1, 1, true, 'cloneContents--startContainer的nodeType=1,endContainer为em'); +}); + + +test('cloneContents--自闭合元素', function () { + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + div.innerHTML = 'b_texti_textxxx'; + var b = div.firstChild; + range.setStart(b.firstChild, 2).setEnd(b, b.childNodes.length); + /*只能获得而不是的标签*/ + equal(ua.getHTML(range.cloneContents()), 'texti_text'); + ua.checkResult(range, b.firstChild, b, 2, b.childNodes.length, false, '选中结束位置为自闭合元素-1'); + + var i = b.firstChild.nextSibling; + range.setStart(i, 1).setEnd(b, b.childNodes.length); + equal(ua.getHTML(range.cloneContents()), ''); + ua.checkResult(range, i, b, 1, b.childNodes.length, false, '选中结束位置为自闭合元素-2'); + + range.setStart(i.firstChild, 2).setEnd(div, 2); + equal(ua.getHTML(range.cloneContents()), 'textxxx'); + ua.checkResult(range, i.firstChild, div, 2, 2, false, '选中结束位置为自闭合元素-3'); + + div.innerHTML = 'xxxxxxxi_Textxxx'; + var i_text = document.getElementById('ii').firstChild; + range.setStart(div, 0).setEnd(i_text, 2); + equals(ua.getHTML(range.cloneContents()), 'xxxxxxxi_'); + ua.checkResult(range, div, i_text, 0, 2, false, '选中结束位置为自闭合元素-4'); +}); + +test('deleteContents--删除空', function () { + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + div.innerHTML = '

    p_text

    '; + var p_text = div.firstChild.firstChild; + range.setStart(p_text, 2).setEnd(p_text, 2); + range.deleteContents(); + ua.checkResult(range, p_text, p_text, 2, 2, true, '删除空'); + equal(ua.getHTML(div), '

    p_text

    ', 'div的innerHTML没有改变 '); +}); + +test('deleteContents--删除相邻节点之间的内容', function () { + var div = te.dom[2]; + var html = '

    first strong strong second em strong.

    bar

    some textem textmore text

    1abc
    34

    textabcspan

    '; + div.innerHTML = html; + var r = new baidu.editor.dom.Range(document); + var two = document.getElementById('two'); + var last = document.getElementById('last'); + r.setStart(two, 1).setEnd(last, 2); + r.deleteContents(); + ua.checkSameHtml(ua.getHTML(div), '

    first strong strong second em strong.

    bar

    some textem textmore text

    1abc

    '); + + ua.checkResult(r, div, div, 4, 4, true, '删除相邻节点的内容'); +}); + + +test('deleteContents--删除子节点', function () { + var div = te.dom[2]; + var html = '

    first strong strong second em strong.

    bar

    some textem textmore text

    1abc
    34

    textabcspan

    '; + div.innerHTML = html; + var r = new baidu.editor.dom.Range(document); + + r.setStart(div, 0).setEnd(div, 2); + r.deleteContents(); + ua.checkSameHtml(ua.getHTML(r.startContainer), '

    some textem textmore text

    1abc
    34

    textabcspan

    '); + + ua.checkResult(r, div, div, 0, 0, true, '删除子节点的内容'); +}); + + +test('deleteContents--删除同一文本节点内容', function () { + var div = te.dom[2]; + var html = '

    first strong strong second em strong.

    bar

    some textem textmore text

    1abc
    34

    textabcspan

    '; + div.innerHTML = html; + var r = new baidu.editor.dom.Range(document); + var p = div.firstChild; + var strong_text = document.getElementById('strong').firstChild; + r.setStart(strong_text, 0).setEnd(strong_text, 2); + r.deleteContents(); + equals(ua.getHTML(r.startContainer), 'rong'); + + ua.checkSameHtml(ua.getHTML(div), '

    first strong rong second em strong.

    bar

    some textem textmore text

    1abc
    34

    textabcspan

    '); + ua.checkResult(r, strong_text, strong_text, 0, 0, true, '删除子节点的内容'); +}); + +test('deleteContents--startContainer是endContainer父亲', function () { + var div = te.dom[2]; + var r = new baidu.editor.dom.Range(document); + div.innerHTML = '

    first strong strong second em strong.

    bar

    some textem textmore text

    1abc
    34

    textabcspan

    '; + r.setStart(div, 0); + r.setEnd(document.getElementById('traverse'), 2); + r.deleteContents(); + ua.checkSameHtml(ua.getHTML(div), '

    more text

    1abc
    34

    textabcspan

    '); + ua.checkResult(r, div, div, 0, 0, true, 'startContainer是endContainer父亲'); +}); + +test('deleteContents--startContainer和endContainer为不同文本节点', function () { + var div = te.dom[2]; + var html = '

    first strong strong second em strong.

    bar

    some textem textmore text

    1abc
    34

    textabcspan

    '; + div.innerHTML = html; + var r = new baidu.editor.dom.Range(document); + var first = document.getElementById('first'); + r.setStart(first.firstChild, 1).setEnd(first.lastChild, 4); + var p = div.firstChild; + r.deleteContents(); + equals(ua.getHTML(r.startContainer), '

    fong.

    '); + ua.checkResult(r, p, p, 1, 1, true, 'startContainer和endContainer为文本节点内容'); + ua.checkSameHtml(ua.getHTML(div), '

    fong.

    bar

    some textem textmore text

    1abc
    34

    textabcspan

    '); + equals(ua.getHTML(r.endContainer), '

    fong.

    '); +}); + + +test('deleteContents--startContainer是endContainer后代', function () { + var div = te.dom[2]; + var html = '

    first strong strong second em strong.

    bar

    some textem textmore text

    1abc
    34

    textabcspan

    '; + div.innerHTML = html; + var r = new baidu.editor.dom.Range(document); + var em = document.getElementById('em'); + r.setStart(em, 1).setEnd(div, 3); + r.deleteContents(); + ua.checkSameHtml(ua.getHTML(r.startContainer), '

    first strong strong second em

    1abc
    34

    textabcspan

    '); + ua.checkResult(r, div, div, 1, 1, true, 'startContainer是endContainer后代'); +}); + +test('deleteContents--startContainer是文本,endContainer的nodeType=1', function () { + var div = te.dom[2]; + var html = '

    first strong strong second em strong.

    bar

    some textem textmore text

    1abc
    34

    textabcspan

    '; + div.innerHTML = html; + var r = new baidu.editor.dom.Range(document); + var em = document.getElementById('em').firstChild; + var two = document.getElementById('two'); + r.setStart(em, 1).setEnd(two, 0); + r.deleteContents(); + ua.checkSameHtml(ua.getHTML(r.startContainer), '

    first strong strong second e

    abc
    34

    textabcspan

    '); + ua.checkResult(r, div, div, 1, 1, true, 'startContainer是文本,endContainer的nodeType=1'); +}); + + +/*startContainer和endContainer为文本节点,补全后面
    之类的标签*/ +test('extractContents--补全后面的标签', function () { + var div = te.dom[2]; + var r = new baidu.editor.dom.Range(document); + div.innerHTML = '

    first strong strong second em strong.

    bar

    some textem textmore text

    1abc
    34

    textabcspan

    '; + var first = document.getElementById('first').firstChild; + var two = document.getElementById('two').firstChild; + r.setStart(first, 1).setEnd(two, 2); + ua.checkSameHtml(ua.getHTML(r.extractContents()), '

    irst strong strong second em strong.

    bar

    some textem textmore text

    1ab
    '); + ua.checkSameHtml(ua.getHTML(r.startContainer), '

    f

    c
    34

    textabcspan

    '); + ua.checkResult(r, div, div, 1, 1, true, 'startContainer--补全后面的标签'); +}); + +/*startContainer和endContainer为文本节点,层级各不相同,补全前面 的之类的标签*/ +test('extractContents--补全前面的标签', function () { + var div = te.dom[2]; + var r = new baidu.editor.dom.Range(document); + div.innerHTML = '

    first strong strong second em strong.

    bar

    some textem textmore text

    1abc
    34

    textabcspan

    '; + var last = document.getElementById('last').firstChild; + var two = document.getElementById('two').firstChild; + r.setStart(two, 1).setEnd(last, 2); + ua.checkSameHtml(ua.getHTML(r.extractContents()), '
    bc
    34

    te

    '); + ua.checkSameHtml(ua.getHTML(r.startContainer), '

    first strong strong second em strong.

    bar

    some textem textmore text

    1a

    xtabcspan

    '); + ua.checkResult(r, div, div, 4, 4, true, 'startContainer--补全前面的标签'); +}); + +/*startContainer和endContainer为文本节点,为兄弟节点*/ +test('extractContents--切的部分为兄弟节点', function () { + var div = te.dom[2]; + var r = new baidu.editor.dom.Range(document); + div.innerHTML = '

    first strong strong second em strong.

    bar

    some textem textmore text

    1abc
    34

    textabcspan

    '; + var first = document.getElementById('first'); + + r.setStart(first.firstChild, 1).setEnd(first.lastChild, 4); + /*strong前面有空格*/ + ua.checkSameHtml(ua.getHTML(r.extractContents()), 'irst strong strong second em str'); + ua.checkSameHtml(ua.getHTML(r.startContainer), '

    fong.

    ', 'check startContainer html'); + ua.checkResult(r, first, first, 1, 1, true, 'startContainer--startContainer和endContainer为兄弟节点'); +}); + + +test('extractContents--切同一个文本节点', function () { + var div = te.dom[2]; + var r = new baidu.editor.dom.Range(document); + div.innerHTML = '

    first strong strong second em strong.

    bar

    some textem textmore text

    1abc
    34

    textabcspan

    '; + var first = document.getElementById('first').firstChild; + + r.setStart(first, 1).setEnd(first, 4); + equals(ua.getHTML(r.extractContents()), 'irs'); + equal(ua.getHTML(r.startContainer), 'ft'); + ua.checkResult(r, first, first, 1, 1, true, 'startContainer--切同一个文本节点'); +}); + +/*startContainer和endContainer的nodeType=1*/ +test('extractContents--startContainer和endContainer为非文本节点', function () { + var div = te.dom[2]; + var r = new baidu.editor.dom.Range(document); + div.innerHTML = '

    first strong strong second em strong.

    bar

    some textem textmore text

    1abc
    34

    textabcspan

    '; + var first = document.getElementById('first'); + var last = document.getElementById('last'); + r.setStart(first, 0).setEnd(last, 0); + ua.checkSameHtml(ua.getHTML(r.extractContents()), '

    first strong strong second em strong.

    bar

    some textem textmore text

    1abc
    34

    '); + ua.checkSameHtml(ua.getHTML(r.startContainer), '

    textabcspan

    '); + ua.checkResult(r, div, div, 1, 1, true, 'cloneContents--开始和结束位置都是文本'); + + div.innerHTML = '

    first strong strong second em strong.

    bar

    some textem textmore text

    1abc
    34

    textabcspan

    '; + first = document.getElementById('first'); + last = document.getElementById('last'); + r.setStart(first, 2).setEnd(last, 1); + ua.checkSameHtml(ua.getHTML(r.extractContents()), '

    strong strong second em strong.

    bar

    some textem textmore text

    1abc
    34

    textabc

    ', '检查得到的contents'); + + ua.checkSameHtml(ua.getHTML(r.startContainer), '

    first

    span

    ', '检查切除后'); + ua.checkResult(r, div, div, 1, 1, true, 'extractContents--开始位置有注释'); +}); + + +test('extractContents--完整切掉一个节点', function () { + var div = te.dom[2]; + var r = new baidu.editor.dom.Range(document); + div.innerHTML = '

    first strong strong second em strong.

    bar

    some textem textmore text

    1abc
    34

    textabcspan

    '; + var first = document.getElementById('first'); + r.setStart(div, 0).setEnd(div, div.childNodes.length - 1); + ua.checkSameHtml(ua.getHTML(r.extractContents()), '

    first strong strong second em strong.

    bar

    some textem textmore text

    1abc
    34
    '); + ua.checkSameHtml(ua.getHTML(r.startContainer), '

    textabcspan

    '); + ua.checkResult(r, div, div, 0, 0, true, 'extractContents--完整切掉一个节点'); +}); + +test('extractContents--元素闭合', function () { + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + div.innerHTML = '

    p_text

    '; + var text = div.firstChild.firstChild; + range.setStart(text, 1).setEnd(text, 1); + equals(ua.getHTML(range.extractContents()), 'null', '元素闭合直接返回null'); + equal(ua.getHTML(range.startContainer), 'p_text'); + ua.checkResult(range, text, text, 1, 1, true, 'extractContents--startContainer的nodeType=1,endContainer为em'); + var p = div.firstChild; + range.setStart(p, 1).setEnd(p, 1); + equals(ua.getHTML(range.extractContents()), 'null', '元素闭合直接返回null'); + equal(ua.getHTML(range.startContainer), '

    p_text

    '); + ua.checkResult(range, p, p, 1, 1, true, 'extractContents--startContainer的nodeType=1,endContainer为em'); +}); + + +test('extractContents--自闭合元素', function () { + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + var inner = 'b_texti_textxxx'; + div.innerHTML = inner; + var b = div.firstChild; + + div.innerHTML = inner; + b = div.firstChild; + range.setStart(b.firstChild, 2).setEnd(b, b.childNodes.length); + /*只能获得而不是的标签*/ + equal(ua.getHTML(range.extractContents()), 'texti_text', '获取带有的内容'); + equal(ua.getHTML(range.startContainer), 'b_', '检查切除元素后'); + ua.checkResult(range, b, b, 1, 1, true, '选中结束位置为自闭合元素'); +}); + +test('extractContents', function () { + function trans(range) { + return { + startContainer:range.startContainer.id, + startOffset:range.startOffset, + endContainer:range.endContainer.id, + endOffset:range.endOffset + }; + } + + var div = te.dom[2]; + + var range = new baidu.editor.dom.Range(document); + div.innerHTML = '

    first strong strong second em strong.

    bar

    some textem textmore text

    1abc
    34

    textabcspan

    '; + var r = range; + + div.innerHTML = '

    first strong strong second em strong.

    bar

    some textem textmore text

    1abc
    34

    textabcspan

    '; + + r.setStart(document.getElementById('test'), 0); + r.setEnd(document.getElementById('traverse'), 2); + + ua.checkSameHtml(ua.getHTML(r.extractContents()), '

    first strong strong second em strong.

    bar

    some textem text

    '); + ua.checkSameHtml(ua.getHTML(r.startContainer), '

    more text

    1abc
    34

    textabcspan

    '); + equals(r.startOffset, 0); + equals(r.endContainer.nodeType, 1); + equals(r.endOffset, 0); + ua.checkSameHtml(ua.getHTML(r.endContainer), '

    more text

    1abc
    34

    textabcspan

    '); + ua.checkSameHtml(ua.getHTML(document.getElementById('test')), '

    more text

    1abc
    34

    textabcspan

    '); + equals(r.collapsed, true); +}); + +/*只要邻居节点不是块元素就左扩或右扩*/ +test('enlarge--文本节点左边扩到body', function () { + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + div.innerHTML = '

    first strong strong second em strong.

    bar

    some textem textmore text

    1abc
    34

    textabc

    div_text

    '; + var first = document.getElementById('first').firstChild; + var last = document.getElementById('last').firstChild; + range.setStart(first, 1).setEnd(last, 2); + range.enlarge(true); + /*左边的文本节点是左边第一个节点,所以一直左扩直到body,右边的文本节点右边有兄弟,因此只扩到第一个块元素祖先*/ + ua.checkResult(range, document.body, div, ua.getIndex(div), 5, false, '左边扩到body'); + +}); + +test('enlarge--文本节点右边扩到body', function () { + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + div.innerHTML = '

    xxx

    first strong strong second em strong.

    bar

    some textem textmore text

    1abc
    34

    textabcspan

    '; + var strong = document.getElementById('strong').firstChild; + var span = document.getElementById('last').lastChild.firstChild; + range.setStart(strong, 1).setEnd(span, 2); + range.enlarge(true); + /*右边的文本节点是右边最后一个节点,所以一直右扩直到body,左边的文本节点左边边有块元素兄弟,因此只扩到第一个块元素祖先*/ + ua.checkResult(range, div.firstChild, document.body, 1, ua.getIndex(div) + 1, false, '右边扩到body'); + +}); + +test('enlarge--文本节点左右边扩到body', function () { + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + div.innerHTML = '

    first strong strong second em strong.

    bar

    some textem textmore text

    1abc
    34

    textabcspan

    '; + var first = document.getElementById('first').firstChild; + var span = document.getElementById('last').lastChild.firstChild; + range.setStart(first, 1).setEnd(span, 2); + range.enlarge(true); + /*右边的文本节点是右边最后一个节点,所以一直右扩直到body,左边的文本节点是左边第一个节点,所以一直左扩直到body*/ + ua.checkResult(range, document.body, document.body, ua.getIndex(div), ua.getIndex(div) + 1, false, '左右边扩到body'); + +}); + +test('enlarge--startContainer和endContainer的nodeType为1', function () { + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + div.innerHTML = '

    first strongstrong second em strong.

    bar

    some textem textmore text

    1abc
    34

    textabcspan

    '; + range.setStart(div, 0).setEnd(div, 2); + range.enlarge(true); + ua.checkResult(range, document.body, div, ua.getIndex(div), 2, false, '左边扩到块元素父节点,右边扩到body'); + +}); + +test('enlarge--左边非块元素节点', function () { + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + div.innerHTML = '

    first strong strong second em strong.

    bar

    some textem textmore text

    1abc
    34

    textabcspan

    '; + var strong = document.getElementById('strong'); + var table = div.getElementsByTagName('table')[0]; + range.setStart(strong, 0).setEnd(table, 1); + range.enlarge(true); + ua.checkResult(range, document.body, div, ua.getIndex(div), 4, false, '左边扩到块元素父节点,右边扩到父节点'); + +}); + +test('enlarge--左右属于同一非块元素节点', function () { + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + div.innerHTML = '

    first strong strong second em strong.

    bar

    some textem textmore text

    1abc
    34

    textabcspan

    '; + var strong = document.getElementById('strong'); + range.setStart(strong, 0).setEnd(strong, 1); + range.enlarge(true); + ua.checkResult(range, document.body, div, ua.getIndex(div), 1, false, '左边扩到body'); + + /*文本节点*/ + var strong_text = strong.firstChild; + range.setStart(strong_text, 2).setEnd(strong_text, 3); + range.enlarge(true); + ua.checkResult(range, document.body, div, ua.getIndex(div), 1, false, '左右均扩到第一个块元素祖先节点'); +}); + +test('enlarge--isBlock为null', function () { + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + div.innerHTML = 'xxxxxxxxxxxxx'; + + range.selectNodeContents(div.getElementsByTagName('i')[0]); + range.enlarge(); + ua.checkResult(range, div, div.lastChild, 1, 1, false, 'isBlock为null'); + +}); + +test('enlarge--stopFn', function () { + var div = te.dom[2]; + var stopFn = function (container) { + if (container.tagName.toLowerCase() == 'table') + return true; + return false; + }; + var range = new baidu.editor.dom.Range(document); + div.innerHTML = '

    first strong strong second em strong.

    bar

    some textem textmore text

    1abc
    34

    textabcspan

    '; + var strong = document.getElementById('strong'); + var table = div.getElementsByTagName('table')[0]; + range.setStart(strong, 0).setEnd(table, 1); + range.enlarge(true, stopFn); + ua.checkResult(range, document.body, table, ua.getIndex(div), 1, false, '左边扩到块元素父节点,右边不扩(stopFn为false)'); + +}); + + +//test( 'enlarge--闭合特殊情况,有歧义', function() { +// var div = te.dom[2]; +// var range = new baidu.editor.dom.Range( document ); +// div.innerHTML = '

    p_text

    '; +// var p = div.firstChild; +// range.setStart( p.firstChild, 0 ).setEnd( p.firstChild, 3 ).trimBoundary(); +// range.setStart( p, 1 ).setEnd( p, 1 ); +// range.enlarge( true ); +// +// //TODO +//} ); + +test('enlarge--闭合', function () { + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + div.innerHTML = 'xxx

    xxxxx

    xxxxxxxxxxxxxxxxx|xxx

    bbbbb

    xx'; + range.setStart(div.getElementsByTagName('b')[0], 2).collapse(true); + + range.enlarge(true); + ua.checkResult(range, div, div, 2, 6, false, "初始为闭合,文本父节点为非块元素"); + + div.innerHTML = '
    xxxx
    '; + range.setStart(div.firstChild.nextSibling, 2).collapse(true) + range.enlarge(true); + ua.checkResult(range, div, div, 1, 2, false, "初始为闭合,文本父节点为块元素"); +}); + + +test('insertNode--文本中插入', function () { + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + div.innerHTML = 'div_text1

    p_text

    xxxem_textxxxxxxxxxxx|xxx

    bbbbb

    text2_div'; + var p_text = div.firstChild.nextSibling.firstChild; + range.setStart(p_text, 1).setEnd(p_text, 2); + /*插入块元素*/ + var new_div = document.createElement('div'); + range.insertNode(new_div); + + ua.checkResult(range, p_text.parentNode, new_div.nextSibling, 1, 1, false, '插入div'); + + /*插入文本节点,原来闭合*/ + var em_text = div.getElementsByTagName('em')[0].firstChild; + range.setStart(em_text, 0).setEnd(em_text, 0); + range.insertNode(document.createTextNode('new_text')); + ua.checkResult(range, em_text.parentNode, em_text.parentNode, 0, 1, false, '闭合情况下插入文本'); + /*插入inline元素*/ + range.setStart(div.firstChild, 1).setEnd(div.lastChild, 1); + range.insertNode(document.createElement('i')); + ua.checkResult(range, div, div.lastChild, 1, 1, false, '插入inline元素'); +}); + +test('inserNode--块元素中插入', function () { + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + div.innerHTML = 'div_text1

    p_text

    xxxem_textxxxxxxxxxxx|xxx

    bbbbb

    text2_div'; +// var p_text = div.firstChild.nextSibling.firstChild; + range.setStart(div, 1).setEnd(div.lastChild, 2); + /*插入块元素*/ + var new_div = document.createElement('div'); + range.insertNode(new_div); + + ua.checkResult(range, div, div.lastChild, 1, 2, false, '插入div'); + +}); + +test('insertNode--插入的节点为endContainer孩子', function () { + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + div.innerHTML = 'xxx

    xxxxx

    xxxxxxxxxxxxxxxxx|xxx

    bbbbb

    xx'; + var length = div.childNodes.length; + range.setStart(div, 1).setEnd(div, length); + var new_div = document.createElement('div'); + new_div.innerHTML = 'xxxx
    div_text
    i_textem_textxxxx'; + range.insertNode(new_div); + ua.checkResult(range, div, div, 1, length + 1, false, '插入节点为endContainer的孩子'); + equal(ua.getHTML(div), '
    xxx
    xxxx
    div_text
    i_textem_textxxxx

    xxxxx

    xxxxxxxxxxxxxxxxx|xxx

    bbbbb

    xx
    ') +}); + +test('insertNode--插入的fragment为endContainer孩子', function () { + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + var frag = document.createDocumentFragment(); + + div.innerHTML = 'xxx

    xxxxx

    xxxxxxxxxxxxxxxxx|xxx

    bbbbb

    xx'; + var length = div.childNodes.length; + range.setStart(div, 1).setEnd(div, div.childNodes.length); + var new_div = document.createElement('div'); + frag.appendChild(new_div); + frag.appendChild(document.createTextNode('text')); + frag.appendChild(document.createElement('span')); + range.insertNode(frag); + ua.checkResult(range, div, div, 1, length + 3, false, '插入fragment为endContainer的孩子'); + equal(ua.getHTML(div), '
    xxx
    text

    xxxxx

    xxxxxxxxxxxxxxxxx|xxx

    bbbbb

    xx
    ', '比较innerHTML'); +}); + +test('createBookmark/moveToBookmark--元素不闭合', function () { + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + div.innerHTML = 'first_texti_textxxxxxxxspan_text

    em_textp_text

    '; + var bookmark = range.selectNode(div).createBookmark(); + ua.checkResult(range, document.body, document.body, ua.getIndex(div), ua.getIndex(div) + 1, false, "元素不闭合,创建书签"); + ok(/_baidu_bookmark_start_/.test(div.previousSibling.id), '检查div的前一个兄弟'); + ok(/_baidu_bookmark_end_/.test(div.nextSibling.id), '检查div的后一个兄弟'); + /*moveToBookmark*/ + range.moveToBookmark(bookmark); + ua.checkResult(range, document.body, document.body, ua.getIndex(div), ua.getIndex(div) + 1, false, "元素不闭合,删除书签"); + ok(!/_baidu_bookmark_start_/.test(div.previousSibling.id), '检查div的前面书签是否被删除'); + + range.setStart(div, 2).setEnd(div, 3); + var bookmark = range.createBookmark(true); + ua.checkResult(range, div, div, 3, 4, false, "元素不闭合,插入span"); + var preId = document.getElementById('span').previousSibling.id; + var latterId = document.getElementById('span').nextSibling.id; + var reg = /_baidu_bookmark_start_/; + ok(/_baidu_bookmark_start_/.test(preId), '检查前面span的id'); + ok(/_baidu_bookmark_end_/.test(latterId), '检查后面span的id'); + checkBookmark(bookmark, preId, latterId, true); + + range.moveToBookmark(bookmark); + ua.checkResult(range, div, div, 2, 3, false, 'moveToBookmark'); + equal(ua.getHTML(div), '
    first_texti_textxxxxxxxspan_text

    em_textp_text

    '); + +}); + +test('createBookmark/moveToBookmark--span嵌套', function () { + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + div.innerHTML = 'first_texti_textxxxxxxxspan_text

    em_textp_text

    '; + var span = document.getElementById('span'); + range.setStart(span, 0).setEnd(span, 1); + var bookmark = range.createBookmark(); + var pre = span.firstChild; + var latter = span.lastChild; + ua.checkResult(range, span, span, 1, 2, false, 'span嵌套'); + ok(/_baidu_bookmark_start_/.test(pre.id), '检查前面span的id'); + ok(/_baidu_bookmark_end_/.test(latter.id), '检查后面span的id'); + checkBookmark(bookmark, pre, latter, undefined); +}); + +test('createBookmark/moveToBookmark--元素闭合', function () { + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + div.innerHTML = 'first_texti_textxxxxxxxspan_text

    em_textp_text

    '; + var em_text = document.getElementById('em').firstChild; + var em = em_text.parentNode; + range.setStart(em_text, 1).setEnd(em_text, 1); + var bookmark = range.createBookmark(true, true); + ua.checkResult(range, em, em, 2, 2, true, '元素闭合'); + var pre = em.firstChild.nextSibling; + checkBookmark(bookmark, pre.id, null, true); + equal('_baidu_bookmark_start_', pre.id, '检查前面span的id'); + +}); + + +test('getClosedNode', function () { + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + div.innerHTML = 'xxxxxxxxxx'; + range.setStart(div, 2).setEnd(div, 3); + same(range.getClosedNode(), div.lastChild.previousSibling, 'check result is img'); + + range.setStart(div, 2).collapse(true); + equal(range.getClosedNode(), null, 'check null return result'); + + range.setStart(div, 0).setEnd(div, 1); + equal(range.getClosedNode(), null, 'get null result'); + +}); + +test('applyInlineStyle--strong', function () { + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + div.innerHTML = 'div_text'; + range.setStart(div, 0).setEnd(div, 1); + + range.applyInlineStyle('strong'); + equals(ua.getHTML(div), '
    div_text
    '); +}); + +test('applyInlineStyle--双重strong', function () { + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + div.innerHTML = 'div_text'; + + div.innerHTML = 'div_textstrong_text'; + range.setStart(div.firstChild, 3); + range.setEnd(div.firstChild.nextSibling.firstChild, 3); + + range.applyInlineStyle('strong'); + equals(ua.getHTML(div), '
    div_textstrong_text
    ', '同一个块元素父标签双重加粗'); + + div.innerHTML = 'xx

    xxbbbbxxx

    xx

    aaaaaaa

    '; + range.setStartBefore(div.firstChild.nextSibling.firstChild); + range.setEndAfter(div.lastChild.firstChild.firstChild); + + range.applyInlineStyle('strong'); + equals(ua.getHTML(div), '
    xx

    xxbbbbxxx

    xx

    aaaaaaa

    ', '跨块元素的加粗'); +}); + +test('applyInlineStyle--span放在em外面', function () { + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + div.innerHTML = '
    div_text
    '; + range.setStart(div, 0).setEnd(div, 1); + range.applyInlineStyle('span', {style:'font-size:12px'}); + var span = div.firstChild.firstChild; + equal($(span.firstChild).css('font-size'), '12px', 'check style'); +}); + +test('applyInlineStyle--span', function () { + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + div.innerHTML = 'div_text'; + range.setStart(div, 0).setEnd(div, 1); + range.applyInlineStyle('span', {style:'font-size:12px'}); + var span = div.firstChild; + equal($(span).css('font-size'), '12px', 'check style'); + equal(span.firstChild.data, 'div_text', 'check innerHTML'); +}); + +test('applyInlineStyle--span元素闭合', function () { + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + div.innerHTML = 'div_text'; + range.setStart(div, 0).setEnd(div, 0); + range.applyInlineStyle('span', {style:'font-size:12px'}); + equal(ua.getHTML(div), '
    div_text
    '); +}); + +//TODO +test('applyInlineStyle-双重span', function () { + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + + div.innerHTML = 'div_text'; + var span = div.firstChild; + range.setStart(span.firstChild, 0).setEnd(span.firstChild, 4); + range.applyInlineStyle('span', {style:'color:red'}); + + var div_new = document.createElement('div'); + div_new.id = 'test'; + //1.2.6.1开启span套 span,调整 +// div_new.innerHTML = 'div_text'; + div_new.innerHTML = 'div_text'; + ok(ua.haveSameAllChildAttribs(div, div_new), 'check style'); +}); + + +test('applyInlineStyle--b', function () { + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + div.innerHTML = '
    • li_text
    • bbbb
    '; + var li_text = div.firstChild.firstChild; + range.setStart(li_text, 0).setEnd(div, 1); + range.applyInlineStyle('b'); + equals(ua.getHTML(div), '
    • li_text
    • bbbb
    '); + + div.innerHTML = '
    • li_text
    • bbbb
    '; + li_text = div.firstChild.firstChild.firstChild; + range.setStart(li_text, 1).setEnd(li_text, 3); + range.applyInlineStyle('b'); + equal(ua.getHTML(div), '
    • li_text
    • bbbb
    '); + +}); + +test('applyInlineStyle-b元素闭合', function () { + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + div.innerHTML = '
    • li_text
    • bbbb
    '; + var li_text = div.firstChild.firstChild; + range.setStart(li_text, 1).setEnd(li_text, 1); + range.applyInlineStyle('b'); + equals(ua.getHTML(div), '
    • li_text
    • bbbb
    '); + +}); + +test('applyInlineStyle-b有属性', function () { + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + div.innerHTML = '

    1234

    '; + range.setStart(div, 0).setEnd(div.firstChild, 4); + range.applyInlineStyle('b', {title:'b_title', id:'b_id'}); + var b = div.firstChild.firstChild; + same(b, document.getElementById('b_id'), '插入带有属性的b'); + equal($(b).attr('title'), 'b_title', 'check title'); + equal(b.innerHTML, '1234', 'check innerHTML'); + equal(div.childNodes.length, 1, 'check child count'); +}); + +test('applyInlineStyle--b放在Inline元素外面', function () { + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + div.innerHTML = '

    123456789

    123456789

    '; + + range.setStart(div, 0).setEnd(div, 2); + range.applyInlineStyle('b'); + equals(ua.getHTML(div), '

    123456789

    123456789

    ', 'Inline element on multiple selected elements with various childnodes'); + + div.innerHTML = '

    x1234y

    '; + var span = document.getElementById('span'); + range.setStart(span.firstChild, 0).setEnd(span.firstChild, 4); + range.applyInlineStyle('b'); + equals(ua.getHTML(div), '

    x1234y

    ', '多个嵌套Inline element'); +}); + +test('applyInlinestyle--b没有文字', function () { + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + div.innerHTML = '



    '; + range.setStart(div, 0).setEnd(div, 1); + range.applyInlineStyle('b'); + equals(ua.getHTML(div), '



    ', '空表格'); + ua.checkResult(range, div, div, 0, 1, false, '对空表格进行b'); + //todo ie6下不知道为啥strong用不上去 +// div.innerHTML = ''; +// var ie6 = (baidu.editor.browser.ie == 6); +// if ( ie6 ) { +// div.appendChild( document.createTextNode( '\u200B' ) ); +// div.appendChild( document.createTextNode( '\u200B' ) ); +// } +// else { +// div.appendChild( document.createTextNode( '\ufeff' ) ); +// div.appendChild( document.createTextNode( '\ufeff' ) ); +// } +// range.setStart(div,0).setEnd( div, 1 ); +// range.applyInlineStyle( 'strong' ); +// equals( div.getElementsByTagName( 'strong' ).length, 1 ); +// if ( ie6 ) +// equal( div.innerHTML.toLowerCase(), '\u200B\u200B', 'div has no text' ); +// else +// equal( div.innerHTML.toLowerCase(), '\ufeff\ufeff', 'div has no text' ); +}); + +test('applyInlineStyle-双重b', function () { + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + div.innerHTML = '

    b_text

    '; + var b_text = div.firstChild.firstChild.firstChild; + range.setStart(b_text, 1).setEnd(b_text, 2); + range.applyInlineStyle('b'); + equals(div.innerHTML.toLowerCase(), '

    b_text

    ', '文本双重b'); + + + div.innerHTML = '

    a1234b

    '; + range.setStart(div.getElementsByTagName('em')[0].firstChild, 0); + range.setEnd(div.getElementsByTagName('em')[0].firstChild, 4); + + range.applyInlineStyle('b'); + equals(div.innerHTML.toLowerCase(), '

    a1234b

    ', '双重b+多个inline元素'); + + // Inline element merged with parent and child + div.innerHTML = '

    a123456b

    '; + + range.setStart(div.getElementsByTagName('b')[0].firstChild, 1); + range.setEnd(div.getElementsByTagName('b')[0].lastChild, 1); + range.applyInlineStyle('b'); + equals(div.innerHTML.toLowerCase(), '

    a123456b

    ', '去掉嵌套的b'); +}); + +test('applyInlineStyle--多个style', function () { + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + div.innerHTML = 'xxxx'; + range.setStart(div, 0).setEnd(div, 1); + + range.applyInlineStyle('i').applyInlineStyle('span', {style:'color:red'}).applyInlineStyle('span', {style:'font-size:12px'}); + //1.2.6.1 span能套i +// var span = div.firstChild.firstChild; + var span = div.firstChild; + equal(span.style['color'], 'red', 'check color'); + equal($(span).css('font-size'), '12px', 'check font size'); + //1.2.6.1 span能套i + equal(span.innerHTML.toLowerCase(), 'xxxx', 'check innerHTML including u'); + +}); + +test('applyInlineStyle--MergeToParent', function () { + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + div.innerHTML = '1234568910'; + range.setStart(div.firstChild, 0).setEnd(div.childNodes[1], 1).select(); + range.applyInlineStyle('strong', {style:'font-size:24px'}); + var html = '1234568910'; + ua.checkSameHtml(div.innerHTML, html); +}); +test('trace1583:applyInlineStyle--MergeToChild', function () { + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + div.innerHTML = '​123456789'; + + var span = div.getElementsByTagName('span')[1]; + range.setStart(span.firstChild, 2).setEnd(span.firstChild, 4).select(); + range.applyInlineStyle('span', {style:'font-size:24px'}); + var html = '123456789'; + ua.checkHTMLSameStyle(html, document, div, 'MergeToChild'); +}); + +test('applyInlineStyle--选区包含部分兄弟', function () { + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + div.innerHTML = 'xxxxspan_text'; + range.setStart(div, 0).setEnd(div.firstChild.nextSibling, 0); + range.applyInlineStyle('u'); + equal(div.innerHTML.toLowerCase(), 'xxxxspan_text', 'check innerHTML including u'); + +}); + +test('removeInlineStyle--删除父节点b', function () { + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + div.innerHTML = 'xxxx'; + range.setStart(div, 0).setEnd(div, 1); + range.removeInlineStyle('b'); + equals(div.innerHTML, 'xxxx', '删除b'); +}); + +test('removeInlineStyle--删除祖先b', function () { + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + div.innerHTML = "xxxx"; + var i = div.firstChild.firstChild; + range.setStart(i, 0).setEnd(i, 1); + range.removeInlineStyle('b'); + equals(div.innerHTML.toLowerCase(), 'xxxx'); + ua.checkResult(range, div, div, 0, 1, false, '删除祖先b'); +}); + +test('removeInlineStyle--删除部分b', function () { + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + div.innerHTML = "i_textspan_text"; + var b = div.firstChild; + range.setStart(b, 0).setEnd(b.firstChild.firstChild, 3); + range.removeInlineStyle('b'); + equals(div.innerHTML.toLowerCase(), 'i_textspan_text', '检查html'); + ua.checkResult(range, div, div, 0, 1, false, '删除部分b'); +}); + + +test('removeInlineStyle--删除多个b', function () { + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + div.innerHTML = "
     
    xxxxxx
    xxxxxx
    "; + range.setStart(div, 0).setEnd(div, 1); + range.removeInlineStyle('b'); + equals(ua.getHTML(div), '
     
    xxxxxx
    xxxxxx
    '); + + div.innerHTML = 'xxxxxbbbbbbccccc'; + range.setStart(div.getElementsByTagName('b')[0], 0); + range.setEndAfter(div.getElementsByTagName('b')[2].firstChild); + range.removeInlineStyle('b'); + equals(div.innerHTML.toLowerCase(), 'xxxxxbbbbbbccccc'); + +}); + +test('removeInlineStyle--删除不同层文本的样式', function () { + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + div.innerHTML = "xxxb_textb2_text"; + range.setStart(div, 0).setEnd(div, 1); + var b1 = div.firstChild.nextSibling; + var b2 = b1.nextSibling.firstChild; + range.setStart(b1.firstChild, 2).setEnd(b2.firstChild, 2); + range.removeInlineStyle('b'); + equals(div.innerHTML.toLowerCase(), 'xxxb_textb2_text'); + + ua.checkResult(range, div, div.lastChild, 2, 1, false, 'check startContainer等'); +}); + +test('removeInlineStyle--删除部分文本样式,需要切分文本节点', function () { + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + div.innerHTML = 'xxxu_text'; + range.setStart(div.firstChild, 2).setEnd(div.getElementsByTagName('u')[0].firstChild, 2); + range.removeInlineStyle('u'); + equals(ua.getHTML(div), '
    xxxu_text
    ', 'u为父亲节点'); + ua.checkResult(range, div, document.getElementById('i'), 1, 1, false, '检查startOffset等'); + + div.innerHTML = 'xxxu_text'; + range.setStart(div.firstChild, 2).setEnd(div.getElementsByTagName('u')[0].firstChild, 2); + range.removeInlineStyle('i'); + /*不能避免产生相同id元素。。。*/ + equals(ua.getHTML(div), '
    xxxu_text
    ', 'i为祖先节点'); + ua.checkResult(range, div, div.getElementsByTagName('b')[0], 1, 1, false, ''); + + div.innerHTML = "xxxxbbbbbxxxx"; + range.setStart(div.getElementsByTagName('u')[0].firstChild, 2).setEnd(div.getElementsByTagName('u')[1].firstChild, 2); + range.removeInlineStyle('u'); + equals(div.innerHTML.toLowerCase(), 'xxxxbbbbbxxxx', '开始和结束位置都有u'); + + div.innerHTML = "xxxxbbbbbxxxx"; + range.setStart(div.getElementsByTagName('u')[0].firstChild, 2).setEnd(div.getElementsByTagName('u')[1].firstChild, 2); + range.removeInlineStyle('b'); + equals(div.innerHTML.toLowerCase(), 'xxxxbbbbbxxxx', '删除部分文本节点的祖先节点的样式'); + ua.checkResult(range, div, div, 1, 4, false, '删除部分节点的祖先样式后'); + +}); + +/*闭合情况挪到basestyle中去做了,在这里不做任何处理*/ +test('removeInlineStyle--删除闭合元素的样式', function () { + var div = te.dom[2]; + var range = new baidu.editor.dom.Range(document); + div.innerHTML = "b_text"; + range.setStart(div.firstChild.firstChild.firstChild, 2).collapse(true); + range.removeInlineStyle('b'); + equals(div.innerHTML.toLowerCase(), 'b_text'); +}); + + +test('b节点取range', function () { + var div = te.dom[2]; + var editor = new baidu.editor.Editor({'autoFloatEnabled':false}); + stop(); + editor.render(div); + editor.ready(function () { + var range = new baidu.editor.dom.Range(editor.document); + editor.setContent('

    hellohello1hello2

    '); + range.setStart(editor.body.firstChild.lastChild, 0).collapse(1).select(); + range = editor.selection.getRange(); + if ((ua.browser.ie &&ua.browser.ie < 9) || ua.browser.webkit) + ua.checkResult(range, editor.body.firstChild.lastChild.previousSibling, editor.body.firstChild.lastChild.previousSibling, 1, 1, true, '节点后--check range'); + else if(ua.browser.ie &&ua.browser.ie > 8) + ua.checkResult(range, editor.body.firstChild, editor.body.firstChild, 3, 3, true, '节点后--check range'); + else + ua.checkResult(range, editor.body.firstChild.lastChild.previousSibling, editor.body.firstChild.lastChild.previousSibling, 0, 0, true, '节点后--check range'); + + range.setStart(editor.body.firstChild.firstChild.nextSibling, 0).collapse(1); + range.select(); + range = editor.selection.getRange(); + if (ua.browser.webkit) + ua.checkResult(range, editor.body.firstChild.firstChild.nextSibling.firstChild, editor.body.firstChild.firstChild.nextSibling.firstChild, 1, 1, true, '节点内文本节点前--check range'); + else if (ua.browser.ie&&ua.browser.ie < 9) + ua.checkResult(range, editor.body.firstChild.childNodes[1].childNodes[1], editor.body.firstChild.childNodes[1].childNodes[1], 0, 0, true, '节点内文本节点前--check range'); + else if(ua.browser.ie &&ua.browser.ie > 8) + ua.checkResult(range, editor.body.firstChild.childNodes[1], editor.body.firstChild.childNodes[1], 1, 1, true, '节点后--check range'); + else + ua.checkResult(range, editor.body.firstChild.firstChild.nextSibling.firstChild, editor.body.firstChild.firstChild.nextSibling.firstChild, 0, 0, true, '节点内文本节点前--check range'); + + range.setStart(editor.body.firstChild.childNodes[1], 0).collapse(1).select(); + range = editor.selection.getRange(); + if (ua.browser.webkit) + ua.checkResult(range, editor.body.firstChild.childNodes[1].firstChild, editor.body.firstChild.childNodes[1].firstChild, 1, 1, true, 'b节点--check range'); + else if (ua.browser.ie&&ua.browser.ie < 9) + ua.checkResult(range, editor.body.firstChild.childNodes[1].childNodes[1], editor.body.firstChild.childNodes[1].childNodes[1], 0, 0, true, '节点内文本节点前--check range'); + else if(ua.browser.ie &&ua.browser.ie > 8) + ua.checkResult(range, editor.body.firstChild.childNodes[1], editor.body.firstChild.childNodes[1], 1, 1, true, '节点后--check range'); + else + ua.checkResult(range, editor.body.firstChild.childNodes[1].firstChild, editor.body.firstChild.childNodes[1].firstChild, 0, 0, true, 'b节点--check range'); + start(); + }); +}); + +test('文本节点中间取range', function () { + var div = te.dom[2]; + var editor = new baidu.editor.Editor({'autoFloatEnabled':false}); + stop(); + editor.render(div); + editor.ready(function () { + var range = new baidu.editor.dom.Range(editor.document); + editor.setContent('

    hello2

    '); + range.setStart(editor.body.firstChild.firstChild, 2).collapse(1).select(); + range = editor.selection.getRange(); + if (ua.browser.ie&&ua.browser.ie < 9) + ua.checkResult(range, editor.body.firstChild.lastChild, editor.body.firstChild.lastChild, 0, 0, true, 'check range'); + else if(ua.browser.ie &&ua.browser.ie > 8) + ua.checkResult(range, editor.body.firstChild, editor.body.firstChild, 2, 2, true, 'check range'); + else + ua.checkResult(range, editor.body.firstChild.lastChild, editor.body.firstChild.lastChild, 2, 2, true, 'check range'); + start(); + }); +}); + +//test( 'select--closedNode', function() { +// var div = te.dom[2]; +// var range = new baidu.editor.dom.Range( document ); +// div.innerHTML = 'div_textspan_textdiv2_textem_text'; +//// range.setStart(div.getElementsBytagName('img'),0).setEnd(div.) +//// var span = div.firstChild.nextSibling; +//// range.setStart(span,1).setEnd(div,4); +//// range.select(); +//// +//// ua.checkResult(range,span,div,1,4,false,'check range'); +//// range.insertNode(document.createTextNode('aa')); +//// var selection = new baidu.editor.dom.Selection( document ); +//// var nativeRange = selection.getRange(); +// //TODO +//} ); + +test('range.createAddress,range.moveAddress', function () { + function equalRange(rngA, rngB) { + return rngA.startContainer === rngB.startContainer && rngA.startOffset === rngB.startOffset + && rngA.endContainer === rngB.endContainer && rngA.endOffset === rngB.endOffset + + } + + var div = te.dom[0]; + var rng = new UE.dom.Range(document); + div.innerHTML = 'xxxx'; + var addr = rng.setStart(div.firstChild, 0).collapse(true).createAddress(true); + var rng1 = new UE.dom.Range(document); + rng1.moveToAddress(addr); + ok(equalRange(rng, rng1)); + div.innerHTML = 'aaa'; + div.appendChild(document.createTextNode('aaa')); + div.appendChild(document.createTextNode('aaa')); + addr = rng.setStart(div.lastChild, 0).setEnd(div.lastChild, div.lastChild.nodeValue.length).createAddress(); + rng1.moveToAddress(addr); + ok(equalRange(rng, rng1)); + addr = rng.setStart(div.lastChild, 0).setEnd(div.lastChild, div.lastChild.nodeValue.length).createAddress(false, true); + div.innerHTML = 'aaaaaabbb'; + rng1.moveToAddress(addr); + equal(rng1.cloneContents().firstChild.nodeValue, 'bbb'); + div.innerHTML = 'aaaaaabbbsss'; + addr = rng.setStartAfter(div.firstChild.nextSibling.firstChild).collapse(true).createAddress(false); + rng1.moveToAddress(addr); + ok(equalRange(rng, rng1)) + div.innerHTML = ''; + div.appendChild(document.createTextNode(domUtils.fillChar)); + div.appendChild(document.createTextNode('aaa')); + addr = rng.setStartAtLast(div).collapse(true).createAddress(false, true); + div.innerHTML = 'aaa'; + rng1.moveToAddress(addr); + rng.setStartAtLast(div).collapse(true); + ok(equalRange(rng, rng1)); + div.innerHTML = 'aaasss'; + div.appendChild(document.createTextNode(domUtils.fillChar)); + addr = rng.setStartAtLast(div).collapse(true).createAddress(false, true); + div.innerHTML = 'aaasss'; + rng1.moveToAddress(addr); + rng.setStartAtLast(div).collapse(true); + ok(equalRange(rng, rng1)); + div.innerHTML = 'aaa'; + div.appendChild(document.createTextNode(domUtils.fillChar)); + div.appendChild(document.createTextNode('aaa')); + //空节点有占位 + addr = rng.setStart(div.firstChild.nextSibling, 0).collapse(true).createAddress(false, true); + div.innerHTML = 'aaaaaa'; + rng1.moveToAddress(addr); + rng.setStart(div.firstChild, 3).collapse(true); + ok(equalRange(rng, rng1)); +}); + +test('equals', function () { + var div = te.dom[2]; + var rng = new UE.dom.Range(document); + div.innerHTML = 'xxxx'; + rng.setStart(div.firstChild, 0).collapse(true); + var rng2 = rng.cloneRange(); + ok(rng.equals(rng2)) +}); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/core/Selection.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/core/Selection.js new file mode 100644 index 000000000..472522517 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/core/Selection.js @@ -0,0 +1,199 @@ +module("core.Selection"); + +/* + * 因为编辑器是必定会放在一个iframe中,所以在测试的过程中我们也放在iframe中测试,以防一些他们没有做容错处理导致的问题出现 + * */ + +//test( 'getRange--简单', function() { +// stop(); +// /*防止frame没有加载好导致无法取到document*/ +// setTimeout( function() { +// var doc = te.dom[1].contentWindow.document; +// var range = new baidu.editor.dom.Range( doc ); +// var div = doc.createElement( 'div' ); +// doc.body.appendChild( div ); +// div.innerHTML = 'firstsecond'; +// /*必须调用select函数,否则这个选择不会映射到浏览器上,导致selection得到的rangeCount为0 +// * select后会把文本节点切开 +// * */ +// range.setStart( div.firstChild, 0 ).setEnd( div.lastChild, 1 ).select(); +// var selection = new baidu.editor.dom.Selection( doc ); +// var nativeRange = selection.getRange(); +// var sc = nativeRange.startContainer; +// var so = nativeRange.startOffset; +// var ec = nativeRange.endContainer; +// var eo = nativeRange.endOffset; +// /*sc和ec的位置有多个,只能无奈地穷举*/ +// // ok( (sc === div) && so == 0 , 'check startContainer/offset' ); (ec === div) && eo == 2 ||好像这种情况在浏览器中不会遇到 +// ok( (sc === div.firstChild.firstChild) && so == 0 || (sc === div) && so == 0 || (sc === div.firstChild) && so == 0, 'check startContainer/offset' ); +// ok( (ec === div.firstChild.nextSibling) && eo == 1 || (ec === div.lastChild) && eo == 0, 'check endContainer/offset' ); +// equal( nativeRange.collapsed, false, 'check collapse status' ); +// start(); +// }, 20 ); +//} ); +// +//test( 'getText', function() { +// stop(); +// setTimeout( function() { +// var doc = te.dom[1].contentWindow.document; +// var range = new baidu.editor.dom.Range( doc ); +// var div = doc.createElement( 'div' ); +// doc.body.appendChild( div ); +// div.innerHTML = 'spanTextfirstsecond'; +// +// range.setStart( div.firstChild, 0 ).setEnd( div.lastChild, 1 ).select(); +// var selection = new baidu.editor.dom.Selection( doc ); +// +// var text = selection.getText(); +// equal( text, 'spanTextfirsts', 'check getText function' ); +// start(); +// }, 20 ); +//} ); +// +// +//test( 'getstart--文本', function() { +// stop(); +// setTimeout( function() { +// var doc = te.dom[1].contentWindow.document; +// var range = new baidu.editor.dom.Range( doc ); +// var div = doc.createElement( 'div' ); +// doc.body.appendChild( div ); +// div.innerHTML = 'emspanTextfirstsecond'; +// +// range.setStart( div.firstChild.lastChild.lastChild.firstChild, 0 ).setEnd( div.lastChild, 1 ).select(); +// var selection = new baidu.editor.dom.Selection( doc ); +// var startNode = selection.getStart(); +// /*textNode*/ +// ok( startNode === div.firstChild.lastChild.lastChild, 'check startNode' ); +// start(); +// }, 20 ); +//} ); +// +//test( 'getstart--边界情况', function() { +// stop(); +// setTimeout( function() { +// var doc = te.dom[1].contentWindow.document; +// var range = new baidu.editor.dom.Range( doc ); +// var div = doc.createElement( 'div' ); +// doc.body.appendChild( div ); +// div.innerHTML = 'emspanTextfirstsecond'; +// +// range.setStart( div.firstChild.lastChild, 0 ).collapse().select(); +// var selection = new baidu.editor.dom.Selection( doc ); +// var startNode = selection.getStart(); +// /*边界情况,ie下好像会尽量贴文本,因此startNode为em*/ +// ok( startNode === div.firstChild.lastChild || startNode === div.firstChild, 'check startNode' ); +// start(); +// }, 20 ); +//} ); + +test('getRange--闭合选区的边界情况', function () { + var div_new = document.createElement('div'); + document.body.appendChild(div_new); + var editor = new baidu.editor.Editor({'autoFloatEnabled': false}); + stop(); + setTimeout(function () { + editor.render(div_new); + editor.ready(function () { + setTimeout(function () { + var range = new baidu.editor.dom.Range(editor.document); + editor.setContent('

    xxx

    '); + range.setStart(editor.body.firstChild.firstChild, 0).collapse(true).select(); + range = editor.selection.getRange(); + var strong = editor.body.firstChild.firstChild; + /*startContainer:ie is xxx,others are strong.firstChild*/ + if(ua.browser.ie>8){ + ok(( range.startContainer === strong) && range.startOffset === 1, 'startContainer是xxx左边的占位符或者xxx'); + } + + else{ + ok(range.startContainer.nodeType == 3, 'startContainer是文本节点'); + + ok(( range.startContainer === strong.firstChild) && strong.firstChild.length == 1 || (range.startContainer.nodeValue.length == 3 && range.startContainer === strong.lastChild), 'startContainer是xxx左边的占位符或者xxx'); + } + + ua.manualDeleteFillData(editor.body); + range.setStart(editor.body.firstChild.firstChild, 1).collapse(true).select(); + /*去掉占位符*/ + range = editor.selection.getRange(); + /*可能为(strong,1)或者(xxx,3)*/ + ok(( range.startContainer === strong) || ( range.startContainer === strong.lastChild) && strong.lastChild.length == 1 || (range.startContainer.nodeValue.length == 3 && range.startContainer === strong.firstChild), 'startContainer是xxx或者xxx右边的占位符'); +// ok( range.startContainer.nodeType == 1 ? range.startContainer.tagName.toLowerCase() == 'strong' && range.startOffset == 1 : range.startContainer.data == 'xxx' && range.startOffset == 3, 'strong,1或xxx,3' ); + + ua.manualDeleteFillData(editor.body); + /*p,0*/ + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + range = editor.selection.getRange(); + /*startContainer:ie is xxx,ff is p, chrome is strong*/ +// ok( ( range.startContainer === strong.parentNode.firstChild)&& strong.parentNode.firstChild.length == 1 || (range.startContainer.nodeValue.length == 3 && range.startContainer === strong.firstChild.nextSibling), 'startContainer是第一个占位符或者xxx' ); +// ua.manualDeleteFillData( editor.body ); +// range.setStart( editor.body.firstChild, 1 ).collapse( true ).select(); +// equal( range.startContainer.tagName.toLowerCase(), 'p', 'p,1' ); + + + te.dom.push(div_new); + te.obj.push(editor); + start(); + }, 50); + }); + }, 50); +}); + +//test( '不闭合选区的边界情况', function () { +// +//} ); +// +test('trace 1742 isFocus', function () { + if (!ua.browser.opera) { + var div1 = document.createElement('div'); + var div2 = document.createElement('div'); + document.body.appendChild(div1); + document.body.appendChild(div2); + var editor1 = new UE.Editor({'initialContent': 'hello', 'autoFloatEnabled': false}); + var editor2 = new UE.Editor({'initialContent': 'hello', 'autoFloatEnabled': false}); + editor1.render(div1); + stop(); + editor1.ready(function () { + editor2.render(div2); + editor2.ready(function () { + editor1.focus(); + ok(editor1.selection.isFocus(), '设editor内容是 editor1 is focused'); + ok(!editor2.selection.isFocus(), '设editor内容是 editor2 is not focused'); + editor2.focus(); + ok(editor2.selection.isFocus(), '设editor内容是 editor2 is focused'); + ok(!editor1.selection.isFocus(), '设editor内容是 editor1 is not focused'); + div1.parentNode.removeChild(div1); + div2.parentNode.removeChild(div2); + + var div3 = document.createElement('div'); + var div4 = document.createElement('div'); + document.body.appendChild(div3); + document.body.appendChild(div4); + var editor3 = new UE.Editor({'initialContent': '

    hello

    ', 'autoFloatEnabled': false}); + var editor4 = new UE.Editor({'initialContent': '

    hello

    ', 'autoFloatEnabled': false}); + editor3.render(div3); + editor3.ready(function () { + editor4.render(div4); + editor4.ready(function () { + editor3.focus(); + ok(editor3.selection.isFocus(), '设editor内容是

    editor1 is focused'); + ok(!editor4.selection.isFocus(), '设editor内容是

    editor2 is not focused'); + editor4.focus(); + ok(editor4.selection.isFocus(), '设editor内容是

    editor2 is focused'); + ok(!editor3.selection.isFocus(), '设editor内容是

    editor1 is not focused'); + setTimeout(function () { + div3.parentNode.removeChild(div3); + div4.parentNode.removeChild(div4); + start(); + }, 50); + }); + }); + }); + }); + } +}); + + + + + diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/core/ajax.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/core/ajax.js new file mode 100644 index 000000000..3f79b316a --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/core/ajax.js @@ -0,0 +1,271 @@ +module('core.ajax'); +var ajax_request_baseurl = upath + 'ajax.php'; + + +test("post请求,无数据", function () { + UE.ajax.request(ajax_request_baseurl, { + onsuccess: function (xhr) { + equals(xhr.responseText, "", "post请求,无数据"); + start(); + }, + onerror: function () { + ok(false, 'fail to send ajax request'); + start(); + } + }); + stop(); +}); + +test("get请求,无数据,url中有数据", function () { + UE.ajax.request(ajax_request_baseurl + "?get1=ueditor&get2=baidu", { + method: 'GET', + onsuccess: function (xhr) { + equals(xhr.responseText, "get1='ueditor'&get2='baidu'", "post请求,数据放在url中传递"); + start(); + }, + onerror: function () { + ok(false, 'fail to send ajax request'); + start(); + } + }); + stop(); +}); + + +test("get请求,有数据,url中有数据", function () { + UE.ajax.request(ajax_request_baseurl + "?get1=ueditor&get2=baidu", { + method: 'GET', + content: "img1=http://www.baidu.com&img2=http://ueditor.baidu.com", + onsuccess: function (xhr) { + equals(xhr.responseText, "get1='ueditor'&get2='baidu'&img1=http://www.baidu.com&img2=http://ueditor.baidu.com", "post请求,数据放在url中传递"); + start(); + }, + onerror: function () { + ok(false, 'fail to send ajax request'); + start(); + } + }); + stop(); +}); + +test("get请求,有data字段,无数据,url中有数据", function () { + UE.ajax.request(ajax_request_baseurl + "?get1=ueditor&get2=baidu", { + method: 'GET', + data: { + img1: 'http://www.baidu.com', img2: 'http://www.google.com' + }, + onsuccess: function (xhr) { + equals(xhr.responseText, "get1='ueditor'&get2='baidu'&img1='http://www.baidu.com'&img2='http://www.google.com'", "post请求,数据放在url中传递"); + start(); + }, + onerror: function () { + ok(false, 'fail to send ajax request'); + start(); + } + }); + stop(); +}); + +test("post请求,有data字段", function () { + UE.ajax.request(ajax_request_baseurl, { + data: { + img1: 'http://www.baidu.com', img2: 'http://www.google.com' + }, + onsuccess: function (xhr) { + equals(xhr.responseText, "img1='http://www.baidu.com'&img2='http://www.google.com'", "post请求,有data字段"); + start(); + }, + onerror: function () { + ok(false, 'fail to send ajax request'); + start(); + } + }); + stop(); +}); + +test("post请求,没有data字段,有其他数据", function () { + UE.ajax.request(ajax_request_baseurl, { + content: "img1=http://www.baidu.com&img2=http://ueditor.baidu.com", + onsuccess: function (xhr) { + equals(xhr.responseText, "img1=http://www.baidu.com&img2=http://ueditor.baidu.com", "没有data字段,有其他数据"); + start(); + }, + onerror: function () { + ok(false, 'fail to send ajax request'); + start(); + } + }); + stop(); +}); + +test("post请求,有data字段,有其他数据", function () { + UE.ajax.request(ajax_request_baseurl, { + data: { + img1: 'http://www.baidu.com', img2: 'http://www.google.com' + }, + content: "i1=http://www.baidu.com&i2=http://ueditor.baidu.com", + onsuccess: function (xhr) { + equals(xhr.responseText, "img1='http://www.baidu.com'&img2='http://www.google.com'&i1=http://www.baidu.com&i2=http://ueditor.baidu.com", "有data字段,有其他数据"); + start(); + }, + onerror: function () { + ok(false, 'fail to send ajax request'); + start(); + } + }); + stop(); +}); + +test("get请求,有data字段,有其他数据", function () { + UE.ajax.request(ajax_request_baseurl, { + method: 'GET', + data: { + get1: 'http://www.baidu.com', get2: 'http://www.google.com' + }, + content: "i1=http://www.baidu.com&i2=http://ueditor.baidu.com", + onsuccess: function (xhr) { + equals(xhr.responseText, "get1='http://www.baidu.com'&get2='http://www.google.com'&i1=http://www.baidu.com&i2=http://ueditor.baidu.com", "有data字段,有其他数据"); + start(); + }, + onerror: function () { + ok(false, 'fail to send ajax request'); + start(); + } + }); + stop(); +}); + + +test("并发多个post请求", function () { + + UE.ajax.request(ajax_request_baseurl, { + data: { + img1: 'http://ueditor.baidu.com', img2: 'http://www.google.com' + }, + content: "i1=http://www.baidu.com&i2=http://ueditor.baidu.com", + onsuccess: function (xhr) { + equals(xhr.responseText, "img1='http://ueditor.baidu.com'&img2='http://www.google.com'&i1=http://www.baidu.com&i2=http://ueditor.baidu.com", "有data字段,有其他数据"); + }, + onerror: function () { + ok(false, 'fail to send ajax request'); + } + }); + + UE.ajax.request(ajax_request_baseurl, { + data: { + img1: 'http://map.baidu.com', img2: 'http://www.google.com' + }, + content: "p1=http://www.baidu.com&p2=http://ueditor.baidu.com", + onsuccess: function (xhr) { + equals(xhr.responseText, "img1='http://map.baidu.com'&img2='http://www.google.com'&p1=http://www.baidu.com&p2=http://ueditor.baidu.com", "有data字段,有其他数据"); + start(); + }, + onerror: function () { + ok(false, 'fail to send ajax request'); + start(); + } + }); + stop(); +}); + +test("jsonp请求,无数据", function () { + + UE.ajax.request(ajax_request_baseurl, { + dataType: 'jsonp', + onsuccess: function (r) { + notDeepEqual(r, null, '返回内容不为空'); + notEqual(r.callback, null, '返回内容有callback参数'); + start(); + }, + onerror: function () { + ok(false, 'fail to send jsonp request'); + start(); + } + }); + stop(); + +}); + +test("jsonp请求,无数据,url上有数据", function () { + + UE.ajax.request(ajax_request_baseurl + '?get1=getcontent1&get2=getcontent2', { + dataType: 'jsonp', + onsuccess: function (r) { + equal(r.get1, 'getcontent1', 'url上的参数1正常'); + equal(r.get2, 'getcontent2', 'url上的参数2正常'); + start(); + }, + onerror: function () { + ok(false, 'fail to send jsonp request'); + start(); + } + }); + stop(); + +}); + +test("jsonp请求,有数据,url上有数据", function () { + + UE.ajax.request(ajax_request_baseurl + '?get1=getcontent1&get2=getcontent2', { + key1: 'keycontent1', + key2: 'keycontent2', + dataType: 'jsonp', + onsuccess: function (r) { + equal(r.get1, 'getcontent1', 'url上的参数1正常'); + equal(r.get2, 'getcontent2', 'url上的参数2正常'); + equal(r.key1, 'keycontent1', '数据上的参数1正常'); + equal(r.key2, 'keycontent2', '数据上的参数2正常'); + start(); + }, + onerror: function () { + ok(false, 'fail to send jsonp request'); + start(); + } + }); + stop(); + +}); + +test("jsonp请求,有数据,data上有数据,url上有数据", function () { + + UE.ajax.request(ajax_request_baseurl + '?get1=getcontent1&get2=getcontent2', { + key1: 'keycontent1', + key2: 'keycontent2', + data: { + 'datakey1': 'datakeycontent1', + 'datakey2': 'datakeycontent2' + }, + dataType: 'jsonp', + onsuccess: function (r) { + equal(r.get1, 'getcontent1', 'url上的参数1正常'); + equal(r.get2, 'getcontent2', 'url上的参数2正常'); + equal(r.key1, 'keycontent1', '数据上的参数1正常'); + equal(r.key2, 'keycontent2', '数据上的参数2正常'); + equal(r.datakey1, 'datakeycontent1', 'data数据上的参数1正常'); + equal(r.datakey2, 'datakeycontent2', 'data数据上的参数2正常'); + start(); + }, + onerror: function () { + ok(false, 'fail to send jsonp request'); + start(); + } + }); + stop(); + +}); + +test("通过getJSONP方法发送jsonp请求", function () { + + UE.ajax.getJSONP(ajax_request_baseurl + '?get1=getcontent1&get2=getcontent2', { + 'datakey1': 'datakeycontent1', + 'datakey2': 'datakeycontent2' + }, function (r) { + equal(r.get1, 'getcontent1', 'url上的参数1正常'); + equal(r.get2, 'getcontent2', 'url上的参数2正常'); + equal(r.datakey1, 'datakeycontent1', 'data数据上的参数1正常'); + equal(r.datakey2, 'datakeycontent2', 'data数据上的参数2正常'); + start(); + }); + stop(); + +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/core/ajax.php b/nezha-fronted/static/ueditor-1.4.3.3/_test/core/ajax.php new file mode 100644 index 000000000..b4595d629 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/core/ajax.php @@ -0,0 +1,57 @@ + \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/core/browser.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/core/browser.js new file mode 100644 index 000000000..3ef272fae --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/core/browser.js @@ -0,0 +1,72 @@ +module( "core.browser" ); + + +test( 'browser', function() { + var browser = baidu.editor.browser; + /*ie*/ + if ( browser.ie ) { + ok( ua.browser.ie, 'is ie' ); + var version = ua.browser.ie; + if ( browser.version < 7 ) { + ok( browser.ie6Compat, 'ie6 compat mode' ); + equal( version, browser.version, 'check ie version' ); + } + if ( browser.version == 7 ) { + ok( browser.ie7Compat, 'ie7 compat mode' ); + equal( version, browser.version, 'check ie version' ); + ok( browser.isCompatible, 'is compatible' ); + } + switch ( document.documentMode ) { + case 7: + ok( browser.ie7Compat, 'ie7 document Mode' ); + equal( version, browser.version, 'check ie version' ); + ok( browser.isCompatible, 'is compatible' ); + break; + case 8: + ok( browser.ie8Compat, 'ie8 document Mode' ); + equal( version, browser.version, 'check ie version' ); + ok( browser.isCompatible, 'is compatible' ); + break; + case 9: + ok( browser.ie9Compat, 'ie9 document Mode' ); + equal( version, browser.version, 'check ie version' ); + ok( browser.isCompatible, 'is compatible' ); + break; + case 11: + ok( browser.ie11Compat, 'ie11 document Mode' ); + equal( version, browser.version, 'check ie version' ); + ok( browser.isCompatible, 'is compatible' ); + break; + } + } + /*opera*/ + if ( browser.opera ) { + ok( ua.browser.opera, 'is opera' ); + equal( browser.version, ua.browser.opera, 'check opera version' ); + } + /*webKit*/ + if ( browser.webkit ) { + ok( ua.browser.webkit, 'is webkit' ); + equal( browser.webkit, ua.browser.webkit>0, 'check webkit version' ); + } + /*gecko*/ + if ( browser.gecko ) { + ok( ua.browser.gecko, 'is gecko' ); + equal( browser.gecko, !!ua.browser.gecko, 'check gecko version' ); + } +// /*air*/ +// if ( browser.air ) { +// ok( ua.browser.air, 'is air' ); +// equal( browser.air, ua.browser.air>0, 'check air version' ); +// } +// /*mac*/ +// if ( browser.mac ) { +// ok( ua.browser.air, 'is air' ); +// equal( ua.browser.os, 'macintosh', 'check air version' ); +// } + /*quirks*/ + if ( browser.quirks ) { + equal( document.compatMode, 'BackCompat', 'is quirks mode' ); + equal( browser.version, 6, 'ie version is 6' ); + } +} ); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/core/domUtils.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/core/domUtils.js new file mode 100644 index 000000000..2293e1718 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/core/domUtils.js @@ -0,0 +1,1718 @@ +module( 'core.domUtils' ); + +test( 'isBoundaryNode--node是firstChild',function(){ + + if(ua.browser.ie){ +// var body = te.dom[1].contentDocument.appendChild(document.createElement('body')); +// var div = body.appendChild(document.createElement('div')); + var div = te.dom[2]; + }else{ + var div = te.dom[1].contentWindow.document.firstChild.lastChild.appendChild(document.createElement('div')); + } + div.innerHTML = "sssaaa

    ppp

    "; + var node = div.firstChild.nextSibling; + equal( domUtils.isBoundaryNode(node, "firstChild"), 0 ); + equal( domUtils.isBoundaryNode(node, "lastChild"), 0 ); + node = div.firstChild.firstChild; + if(ua.browser.ie){ + equal( domUtils.isBoundaryNode(node, "firstChild"), 0 ); + }else{ + equal( domUtils.isBoundaryNode(node, "firstChild"), 1 ); + } + equal( domUtils.isBoundaryNode(node, "lastChild"), 0 ); + node = div.firstChild.nextSibling.nextSibling; + equal( domUtils.isBoundaryNode(node, "firstChild"), 0 ); + equal( domUtils.isBoundaryNode(node, "lastChild"), 1 ); +} ); + +test( 'getPosition--A和B是同一个节点', function() { + var div = te.dom[2]; + div.innerHTML = "spanbbbxxx"; + var span_text = div.firstChild.firstChild; + var domUtils = te.obj[3]; + equal( domUtils.getPosition( span_text, span_text ), 0, 'identical node' ); +} ); + + +test( 'getPosition--A和B是兄弟节点', function() { + var div = te.dom[2]; + div.innerHTML = "spanbbbxxx"; + var span_text = div.firstChild.firstChild; + var div_text = div.lastChild; + var domUtils = te.obj[3]; + /*span_text在div_text前面*/ + equal( domUtils.getPosition( span_text, div_text ), domUtils.POSITION_PRECEDING, 'preceding node' ); + /*div_text在span_text后面*/ + equal( domUtils.getPosition( div_text, span_text ), domUtils.POSITION_FOLLOWING, 'following node' ); +} ); + + +test( 'getPosition--A是B的祖先', function() { + var div = te.dom[2]; + div.innerHTML = "spanbbbxxx"; + var span_text = div.firstChild.firstChild; + var domUtils = te.obj[3]; + /*A是B的祖先*/ + equal( domUtils.getPosition( div, span_text ), domUtils.POSITION_CONTAINS + domUtils.POSITION_PRECEDING, 'preceding node' ); + /*A是B的子孙*/ + equal( domUtils.getPosition( span_text, div ), domUtils.POSITION_IS_CONTAINED + domUtils.POSITION_FOLLOWING, 'following node' ); +} ); + +test( 'getPosition--A和B在不同dom树上', function() { + stop(); + expect( 1 ); + var div = te.dom[2]; + div.innerHTML = "spanbbbxxx"; + var iframe = te.dom[1]; + setTimeout( function() { + var frame_doc = iframe.contentWindow.document || iframe.contentDocument; + var frame_div = frame_doc.createElement( 'div' ); + frame_doc.body.appendChild( frame_div ); + var domUtils = te.obj[3]; + /*A和B在不同dom树上*/ + equal( domUtils.getPosition( div, frame_div ) & 1, 1, 'A和B不在同一个dom树上' ); + start(); + }, 50 ); + +} ); + +test( 'getNodeIndex', function() { + var div = te.dom[2]; + var domUtils = te.obj[3]; + div.innerHTML = 'dddddxxxxx


    dddd

    '; + var comment = div.firstChild.nextSibling.nextSibling; + equal( domUtils.getNodeIndex( comment ), 2, 'check commnet index' ); + var td_text = document.getElementById( 'table' ).firstChild.firstChild.firstChild; + equal( domUtils.getNodeIndex( td_text ), 0, 'check textNode index' ); + equal( domUtils.getNodeIndex( div.firstChild ), 0, 'check strong label index' ); + equal( domUtils.getNodeIndex( (document.getElementById( 'p' )) ), 5, 'check p label index' ); +} ); + +test( 'findParent--body', function() { + var domUtils = te.obj[3]; + equal( domUtils.findParent( document.body ), null, 'find parent for body' ); +} ); + +/*找符合条件的上一个节点,如果条件为空则找父节点*/ +test( 'findParent--tester为空', function() { + var domUtils = te.obj[3]; + var div = te.dom[2]; + div.innerHTML = 'dddddspanxxxxx


    dddd

    '; + var span_text = document.getElementById( 'span' ).firstChild; + same( domUtils.findParent( span_text ), span_text.parentNode, 'find parent' ); +} ); + +test( 'findParent--tester不为空', function() { + var domUtils = te.obj[3]; + var div = te.dom[2]; + div.innerHTML = 'dddddspanxxxxx


    dddd

    '; + var span_text = document.getElementById( 'span' ).firstChild; + var div1 = domUtils.findParent( span_text, function( node ) { + if ( node.id == "test" ) + return true; + return false; + } ); + same( div1, div, 'find parent' ); +} ); + + +/*不考虑includeSelf的时候取body的parent的情况*/ +test( 'findParentByTagName--body', function() { + var domUtils = te.obj[3]; + var div = te.dom[2]; + same( domUtils.findParentByTagName( document.body, 'body' ), null, 'parent is self' ); +} ); + + +test( 'findParentByTagName--tagName为字符串', function() { + var domUtils = te.obj[3]; + var div = te.dom[2]; + div.innerHTML = 'dddddspanxxxxx


    dddd

    '; + var br = document.getElementById( 'p' ).firstChild; + same( domUtils.findParentByTagName( br, 'div' ), div, 'tagName为字符串' ); + same( domUtils.findParentByTagName( br, 'em' ), null, 'tagName为字符串返回null' ); +} ); + +test( 'findParentByTagName--tagName为字符串数组', function() { + var domUtils = te.obj[3]; + var div = te.dom[2]; + div.innerHTML = 'dddddspanxxxxx


    dddd

    '; + var br = document.getElementById( 'p' ).firstChild; + var tagName = ['em','p','div']; + same( domUtils.findParentByTagName( br, tagName ), document.getElementById( 'p' ), 'tagName为字符串数组,找出第一个符合条件的父节点' ); +} ); + + +test( 'findParentByTagName--文本节点', function() { + var domUtils = te.obj[3]; + var div = te.dom[2]; + div.innerHTML = 'dddddspanxxxxx


    dddd

    '; + var span_text = document.getElementById( 'span' ).firstChild; + var tagName = ['em','p','div']; + same( domUtils.findParentByTagName( span_text, tagName ), div, '文本节点' ); +} ); + +test( 'findParents', function() { + var domUtils = te.obj[3]; + var div = te.dom[2]; + div.innerHTML = 'dddddspanxxxxx


    dddd

    '; + var span_text = document.getElementById( 'span' ).firstChild; + /*includeSelf*/ + var parents = domUtils.findParents( span_text, true ); + equal( parents.length, 4, 'check parent count' ); + same( parents[0], document.body, 'first parent is body' ); + same( parents[1], div, 'second parent is div' ); + same( parents[2], span_text.parentNode, 'third parent is span' ); + same( parents[3], span_text, 'last parent is self' ); + /*不逆序存放祖先节点,closerFirst=false*/ + parents = domUtils.findParents( span_text, false, null, true ); + equal( parents.length, 3, 'check parent count' ); + same( parents[0], span_text.parentNode, 'first parent is span' ); + same( parents[1], div, 'second parent is div' ); + same( parents[2], document.body, 'last parent is body' ); +} ); + + +test( 'findParents--tester', function() { + var domUtils = te.obj[3]; + var div = te.dom[2]; + div.innerHTML = '


    dddd

    '; + var img = document.getElementById( 'img' ); + var parents = domUtils.findParents( img, false, function( node ) { + if ( node.tagName.toLowerCase() == 'div' || node.tagName.toLowerCase() == 'body' ) + return false; + return true; + } ); + equal( parents.length, 1, 'check parent count' ); + same( parents[0], div.firstChild.firstChild, 'first parent is p' ); +} ); + +test( 'insertAfter', function() { + var domUtils = te.obj[3]; + var div = te.dom[2]; + var textNode = document.createTextNode( 'text' ); + domUtils.insertAfter( div, textNode ); + te.dom.push( textNode ); + equal( textNode, div.nextSibling, 'insertAfter' ); +} ); + +test( 'remove--not keep children', function() { + var domUtils = te.obj[3]; + var div = te.dom[2]; + div.innerHTML = "

    xxxxxxxxxxx

    xxxx
    "; + var text = div.firstChild.firstChild; + var p = div.firstChild; + /*删除文本节点*/ + var node = domUtils.remove( text ); + equal( ua.getChildHTML( div ), '

    xxxxxxxx

    xxxx
    ' ); + same( text, node, 'check removed textNode' ); + /*删除有孩子的节点*/ + node = domUtils.remove( p ); + equal( ua.getChildHTML( div ), '
    xxxx
    ' ); + same( node, p, 'check removed p' ); +} ); + +test( 'remove-- keep children', function() { + var domUtils = te.obj[3]; + var div = te.dom[2]; + div.innerHTML = '

    xxxxxxxxxxx

    xxxx
    '; + var text = div.firstChild.firstChild; + var p = div.firstChild; + /*删除文本节点*/ + var node = domUtils.remove( text, true ); + equal( ua.getChildHTML( div ), '

    xxxxxxxx

    xxxx
    ' ); + same( text, node, 'check removed textNode' ); + /*删除有孩子的节点*/ + node = domUtils.remove( p, true ); + equal( ua.getChildHTML( div ), 'xxxxxxxx
    xxxx
    ' ); + same( node.id, p.id, 'check removed p' ); +} ); + +test( 'getNextDomNode--没有filter', function() { + var domUtils = te.obj[3]; + var div = te.dom[2]; + div.innerHTML = '

    p_textxxxxxxxx

    xxxx
    '; + var p = div.firstChild; + /*直接查找兄弟节点*/ + same( domUtils.getNextDomNode( p ), div.lastChild, '后兄弟节点' ); +// same( domUtils.getPreviousDomNode( divChild ), p, '前一个兄弟节点' ); + /*startFromChild=true,查找孩子结点*/ + equal( domUtils.getNextDomNode( p, true ).data, 'p_text', 'text node' ); +// equal( domUtils.getPreviousDomNode( p, true ), p.lastChild, 'text node' ); +} ); + + +test( 'getNextDomNode--有filter', function() { + var domUtils = te.obj[3]; + var div = te.dom[2]; + div.innerHTML = '
    xxxxxxxx

    xx

    xxxx
    '; + document.body.insertBefore( document.createElement( 'span' ), div ); + var span = div.firstChild.firstChild; + var filter = function( node ) { + if ( $( node ).css( 'display' ) == 'block' ) + return false; + return true; + }; + same( domUtils.getNextDomNode( span, false, filter ), div.firstChild.lastChild, '找到第一个不为block元素的兄弟节点' ); +// same( domUtils.getPreviousDomNode( div, true, filter ), div.previousSibling, '孩子中没有block元素,则找父亲的previousSibling节点' ); + te.obj.push( div.previousSibling ); +} ); +test( 'getNextDomNode-没有兄弟或孩子', function() { + var domUtils = te.obj[3]; + var div = te.dom[2]; + div.innerHTML = '

    p_textxxxxxxxx

    xxxx
    '; + var p = div.firstChild; + /*直接查找兄弟节点*/ +// same( domUtils.getPreviousDomNode( p ), div.previousSibling, '前面木有兄弟' ); + same( domUtils.getNextDomNode( div.lastChild ), div.nextSibling, '后面木有兄弟' ); +} ); + +test( 'isBookmarkNode', function() { + var domUtils = te.obj[3]; + var div = te.dom[2]; + var range = te.obj[2]; + div.innerHTML = 'xxxxxxxx
    xxxx
    '; + range.setStart( div, 0 ).setEnd( div, 1 ); + range.createBookmark(); + ok( domUtils.isBookmarkNode( div.firstChild ), 'is BookmarkNode' ); + ok( !domUtils.isBookmarkNode( div.firstChild.nextSibling ), 'not BookmarkNode' ); + +} ); + +test( 'getWindow', function() { + var div = te.dom[2]; + var domUtils = te.obj[3]; + var w = domUtils.getWindow( div ); + ok( w === self.window, 'check window' ); +} ); + +test( 'getWindow--iframe', function() { + var f = te.dom[1]; + var domUtils = te.obj[3]; + expect( 1 ); + var frame_doc = f.contentWindow.document || f.contentDocument; + stop(); + setTimeout( function() { + var frame_div = frame_doc.createElement( 'div' ); + frame_doc.body.appendChild( frame_div ); + var w = domUtils.getWindow( frame_div ); + ok( f.contentWindow === w, 'same window' ); + start(); + } ); + +} ); + +test( 'getCommonAncestor--body', function() { + var div = te.dom[2]; + var domUtils = te.obj[3]; + equal( domUtils.getCommonAncestor( div, document.body ).tagName.toLocaleLowerCase(), 'body', '第二个参数是body' ); + equal( domUtils.getCommonAncestor( document.body, div ).tagName.toLocaleLowerCase(), 'body', '第一个参数是body' ); +} ); + +test( 'getCommonAncestor--自己', function() { + var div = te.dom[2]; + var domUtils = te.obj[3]; + same( domUtils.getCommonAncestor( div, div ), div, '自己和自己的公共祖先' ); + +} ); + +test( 'getCommonAncestor--兄弟节点', function() { + var div = te.dom[2]; + var domUtils = te.obj[3]; + div.innerHTML = 'xxxx

    dddd

    '; + var span_text = div.firstChild.firstChild; + var td = document.getElementById( 'td' ); + same( domUtils.getCommonAncestor( span_text, td ), div, '兄弟节点' ); +} ); + +test( 'getCommonAncestor--不在一个dom树', function() { + stop(); + expect( 1 ); + var div = te.dom[2]; + var f = te.dom[1]; + setTimeout( function() { + var domUtils = te.obj[3]; + var frame_doc = f.contentWindow.document || f.contentDocument; + var frame_div = frame_doc.createElement( 'div' ); + frame_doc.body.appendChild( frame_div ); + same( domUtils.getCommonAncestor( frame_div, div ), null, '不在一个dom树' ); + start(); + }, 50 ); + +} ); + +test( 'isWhitespace', function() { + var div = te.dom[2]; + var domUtils = te.obj[3]; + div.innerHTML = "aaa\ufeff\u200B\t\t\n\r"; + ok( !domUtils.isWhitespace( div.firstChild ), 'not whiteSpace' ); + div.innerHTML = baidu.editor.browser.ie && baidu.editor.browser.version == '6' ? '\ufeff' : '\u200B' + '\t\t\n\r'; + ok( domUtils.isWhitespace( div.firstChild ), 'is whiteSpace' ); +} ); + +test( 'isEmptyInlineElement', function() { + var div = te.dom[2]; + var domUtils = te.obj[3]; + div.innerHTML = '\n\rxxxx'; + var b1 = div.firstChild.firstChild; + ok( !domUtils.isEmptyInlineElement( b1 ), 'not empty inline' ); + ok( domUtils.isEmptyInlineElement( b1.firstChild.firstChild ), 'is emtpy inline element' ); +} ); + +test( 'isEmptyInlineElement-nodeType!=1', function() { + var div = te.dom[2]; + var domUtils = te.obj[3]; + div.innerHTML = '\n\r\ufeff\u200Bxxxx'; + ok( !domUtils.isEmptyInlineElement( div.firstChild.firstChild.firstChild ), 'textNode not inline element' ); +} ); + +test( 'isEmptyInlineElement-block element', function() { + var div = te.dom[2]; + var domUtils = te.obj[3]; + div.innerHTML = '\n\rxxxx'; + ok( !domUtils.isEmptyInlineElement( div ), 'not inline element' ); +} ); + + +test( 'clearEmptySibling', function() { + var div = te.dom[2]; + var domUtils = te.obj[3]; + div.innerHTML = '

    xxxxxxxx

    '; + var text = div.firstChild.firstChild; + /*没有空sibling*/ + domUtils.clearEmptySibling( text ); + equal( ua.getChildHTML( div ), '

    xxxxxxxx

    ', '没有空sibling' ); + var span = text.nextSibling; + domUtils.clearEmptySibling( span ); + equal( ua.getChildHTML( div ), '

    xxxxxxxx

    ' ); + /*左边有空sibling*/ + domUtils.clearEmptySibling( span.lastChild ); + equal( ua.getChildHTML( div ), '

    xxxxxxxx

    ', '左边有空sibling' ); + /*左右边有空sibling*/ + div.innerHTML = '

    \n\t\n\t\rxxxx

    '; + domUtils.clearEmptySibling( div.firstChild.lastChild.previousSibling ); + + //TODO 有空白文本的时候是否需要删除 + equal( div.innerHTML.toLocaleLowerCase(), '

    xxxx

    ', '左右边有空sibling' ); + /*左右多个连续的空inline sibling*/ + div.innerHTML = '\t\t
    '; + var div_new = document.getElementById( 'div' ); + domUtils.clearEmptySibling( div_new ); + equal( ua.getChildHTML( div ), '
    ', '连续空inline sibling' ); + /*左右边有空块元素*/ + div.innerHTML = '

    xxxx
    '; + domUtils.clearEmptySibling( div.firstChild.firstChild.nextSibling ); + equal( ua.getChildHTML( div ), '

    xxxx
    ', '左右边有空块元素' ); +} ); + +/*不能误删bookmark*/ +test( 'clearEmptySibling--bookmark', function() { + var div = te.dom[2]; + var domUtils = te.obj[3]; + var r = te.obj[2]; + div.innerHTML = 'link'; + var a = div.firstChild.firstChild; + var link = a.firstChild; + r.selectNode( link ); + r.createBookmark(); + /*bookmark节点*/ + domUtils.clearEmptySibling( link ); + ok( /_baidu_bookmark_end/.test( link.nextSibling.id ), '右边的bookmark sibling没有删掉' ); + ok( /_baidu_bookmark_start/.test( link.previousSibling.id ), '左边的bookmark sibling没有删掉' ); +} ); + +test( 'clearEmptySibling--ignoreNext/ignorePrevious', function() { + var div = te.dom[2]; + var domUtils = te.obj[3]; + /*ignoreNext*/ + div.innerHTML = '

    \n\t\n\t\rxxxx

    '; + domUtils.clearEmptySibling( div.firstChild.lastChild.previousSibling, true ); + equal( div.innerHTML.toLocaleLowerCase(), '

    xxxx

    ', 'ignore next' ); + /*ignorePrevious*/ + div.innerHTML = '

    \n\t\n\t\rxxxx

    '; + domUtils.clearEmptySibling( div.firstChild.lastChild.previousSibling, false, true ); + equal( ua.getChildHTML( div ), '

    xxxx

    ', 'ignore next' ); + /*ignorePrevious&&ignoreNext*/ + div.innerHTML = '

    \n\t\n\t\rxxxx

    '; + domUtils.clearEmptySibling( div.firstChild.lastChild.previousSibling, true, true ); + equal( ua.getChildHTML( div ), '

    xxxx

    ', 'ignore next&&previous' ); +} ); + +test( 'split--offset正常', function() { + var div = te.dom[2]; + var domUtils = te.obj[3]; + div.innerHTML = 'span >'; + var span = div.firstChild; + domUtils.split( span.firstChild, 2 ); + equal( span.childNodes.length, 2, 'check child count' ); + equal( span.childNodes[0].data, 'sp', 'check firstChild' ); + equal( span.childNodes[1].data, 'an', 'check secondChild' ); +} ); + +test( 'split--offset=0', function() { + var div = te.dom[2]; + var domUtils = te.obj[3]; + div.innerHTML = 'span >'; + var span = div.firstChild; + domUtils.split( span.firstChild, 0 ); + equal( span.childNodes.length, 2, 'check child count' ); + equal( span.childNodes[0].data, '', 'check firstChild' ); + equal( span.childNodes[1].data, 'span', 'check secondChild' ); +} ); + +test( 'split--offset=data.length', function() { + var div = te.dom[2]; + var domUtils = te.obj[3]; + div.innerHTML = 'span >'; + var span = div.firstChild; + domUtils.split( span.firstChild, 4 ); + equal( span.childNodes.length, 2, 'check child count' ); + equal( span.childNodes[0].data, 'span', 'check firstChild' ); + equal( span.childNodes[1].data, '', 'check secondChild' ); +} ); + +/*求相对视窗的位置而不是实际位置*/ +//test( 'getXY', function() { +// var div = te.dom[2]; +// var domUtils = te.obj[3]; +// equal( domUtils.getXY( div )['x'], ua.findPosition( div )[0] - document.documentElement.scrollLeft, 'check X' ); +// equal( domUtils.getXY( div )['y'], ua.findPosition( div )[1] - document.documentElement.scrollTop, 'check Y' ); +// +//} ); + + +test( 'on--跨iframe加载', function() { + expect( 1 ); + var domUtils = te.obj[3]; + var op = { + onafterstart : function( f ) { + domUtils.on( f, 'load', function() { + ok( true, 'on load of iframe success' ); + } ); + }, + ontest : function() { + this.finish(); + } + }; + ua.frameExt( op ); +} ); + + +test( 'on- 给不同的dom元素绑定相同的事件', function() { + var domUtils = te.obj[3]; + expect( 2 ); + var div2 = document.body.appendChild( document.createElement( 'div' ) ); + div2.id = 'test2'; + te.dom.push( div2 ); + var handle = function( e ) { + ok( true, e.type + ' event triggered' ); + }; + domUtils.on( te.dom[2], 'mouseover', handle); + domUtils.on( te.dom[1], 'mouseover', handle ); + + ua.mouseover( te.dom[2] ); + ua.mouseover( te.dom[1] ); +} ); +test( 'on-多事件的字符串参数', function() { + var domUtils = te.obj[3]; + expect( 2 ); + var div2 = document.body.appendChild( document.createElement( 'div' ) ); + div2.id = 'test2'; + te.dom.push( div2 ); + var handle = function( e ) { + ok( true, e.type + ' event triggered' ); + }; + domUtils.on( te.dom[2], 'mouseover mousedown', handle); + + + ua.mouseover( te.dom[2] ); + ua.mousedown( te.dom[2] ); +} ); +test( 'un- 给不同的dom元素绑定相同的事件,解除一个,另一个仍然有效', function() { + var domUtils = te.obj[3]; + expect( 1 ); + var div2 = document.body.appendChild( document.createElement( 'div' ) ); + div2.id = 'test2'; + te.dom.push( div2 ); + var handle = function( e ) { + ok( true, e.type + ' event triggered' ); + }; + domUtils.on( te.dom[2], 'mouseover', handle); + domUtils.on( te.dom[1], 'mouseover', handle ); + domUtils.un( te.dom[2],'mouseover', handle ); + ua.mouseover( te.dom[2] ); + ua.mouseover( te.dom[1] ); +} ); +test( 'un-多事件的字符串参数', function() { + var domUtils = te.obj[3]; + expect( 0 ); + var div2 = document.body.appendChild( document.createElement( 'div' ) ); + div2.id = 'test2'; + te.dom.push( div2 ); + var handle = function( e ) { + ok( false, e.type + ' 没有注销' ); + }; + domUtils.on( te.dom[2], 'mouseover mousedown', handle); + + domUtils.un(te.dom[2],'mouseover mousedown',handle); + ua.mouseover( te.dom[2] ); + ua.mousedown( te.dom[2] ); + stop(); + setTimeout(function(){start()},2000) +} ); + +/*绑定多个事件*/ +test( 'on', function() { + var domUtils = te.obj[3]; + expect( 2 ); + domUtils.on( te.dom[2], ['mouseover','keypress'], function( e ) { + ok( true, e.type + ' event triggered' ); + } ); + ua.mouseover( te.dom[2] ); + ua.keypress( te.dom[2] ); +} ); +test( "test case sensitive", function() { + var div = te.dom[2]; + var domUtils = te.obj[3]; + if ( ua.browser.ie ) { + ok( true, 'IE下不支持诸如DOMNodeInserted等mutation事件' ); + return; + } + // ok(false, 'TODO: 添加大小写敏感事件的on绑定和un取消用例,比如DOMMouseScroll'); + expect( 2 ); + domUtils.on( div, 'DOMNodeInserted', function() { + ok( true, '用DOMNodeInserted测试大小写敏感事件的on绑定' ); + domUtils.un( div, 'DOMNodeInserted' ); + } ); + div.appendChild( document.createElement( 'div' ) ); + div.appendChild( document.createElement( 'div' ) ); +} ); + +test( "un--取消注册unload事件", function() { + expect( 1 ); + var domUtils = te.obj[3]; + var div = te.dom[2]; + var handle_a = function() { + ok( true, "check unload" ); + }; + domUtils.on( div, "click", handle_a ); + /* 直接调用ua提供的接口跨浏览器接口,屏蔽浏览器之间的差异 */ + ua.click( div ); + domUtils.un( div, "click", handle_a ); + ua.click( div ); +} ); + + +test( "un--同一个回调注册多个事件,后面事件会将第一个事件dhandler覆盖掉", function() { + expect( 1 ); + var domUtils = te.obj[3]; + var div = te.dom[2]; + var handle_a = function() { + ok( true, "应当只会执行一次" ); + }; + /* 直接调用ua提供的接口跨浏览器接口,屏蔽浏览器之间的差异 */ + domUtils.on( div, "click", handle_a ); + domUtils.on(div,'dbclick',handle_a); + ua.click( div ); + domUtils.un( div, "click", handle_a ); + ua.click( div ); +} ); + +test( "un--同一个回调同一个事件注册2次", function() { + expect( 1 ); + var domUtils = te.obj[3]; + var div = te.dom[2]; + var handle_a = function() { + ok( true, "check unload" ); + }; + /* 直接调用ua提供的接口跨浏览器接口,屏蔽浏览器之间的差异 */ + domUtils.on( div, "click", handle_a ); + domUtils.on(div,'click',handle_a); + ua.click( div ); + domUtils.un( div, "click", handle_a ); + ua.click( div ); +} ); + +test( "un--同一个事件取消注册三次", function() { + expect( 1 ); + var domUtils = te.obj[3]; + var div = te.dom[2]; + var handle_a = function() { + ok( true, "check unload" ); + }; + /* 直接调用ua提供的接口跨浏览器接口,屏蔽浏览器之间的差异 */ + domUtils.on( div, "click", handle_a ); + ua.click( div ); + domUtils.un( div, "click", handle_a ); + domUtils.un( div, "click", handle_a ); + domUtils.un( div, "click", handle_a ); + ua.click( div ); +} ); + +/** * 跨frame on然后un */ +test( "window resize", function() { + expect( 1 ); + var domUtils = te.obj[3]; + ua.frameExt( { + onafterstart : function( f ) { + $( f ).css( 'width', 200 ); + }, + ontest : function( w, f ) { + var op = this; + var fn = function() { + ok( true ); + }; + domUtils.on( w, 'resize', fn ); + $( f ).css( 'width', 220 ); + /* 貌似通过jquery触发窗体变化会存在延时 */ + setTimeout( function() { + domUtils.un( w, 'resize', fn ); + $( f ).css( 'width', 240 ); + setTimeout( op.finish, 100 ); + }, 500 ); + } } ); +} ); + + +test( 'isSameElement--compare with self', function() { + var div = te.dom[2]; + var domUtils = te.obj[3]; + $( div ).attr( 'name', 'div_name' ).attr( 'class', 'div_class' ).css( 'background-color', 'red' ).css( 'border', '1px' ).css( 'font-size', '12px' ).css( 'height', '12px' ).css( 'width', '20px' ); + ok( domUtils.isSameElement( div, div ), 'compare with self' ); +} ); + +test( 'isSameElement--tagName不一样', function() { + var div = te.dom[2]; + var domUtils = te.obj[3]; + div.appendChild( document.createElement( 'span' ) ); + $( div ).attr( 'name', 'div_name' ).attr( 'class', 'div_class' ).css( 'background-color', 'red' ).css( 'border', '1px' ).css( 'font-size', '12px' ).css( 'height', '12px' ).css( 'width', '20px' ); + ok( !domUtils.isSameElement( div, div.firstChild ), 'different tagName' ); +} ); + +//TODO 目前的判断有问题,ie下手动创建的img会自动添加一个complete属性,导致比较结果为false,因此不对img进行比较 +test( 'isSameElement--img的src和宽高比较', function() { + var div = te.dom[2]; + var domUtils = te.obj[3]; + div.innerHTML = ''; + + var span = document.createElement( 'span' ); + span.setAttribute( 'src', 'http://img.baidu.com/hi/jx2/j_0001.gif' ); + span.setAttribute( 'height', '51' ); + span.setAttribute( 'width', '50' ); + div.appendChild( span ); + ok( domUtils.isSameElement( div.firstChild, div.lastChild ), '手动创建的img的src和宽高比较' ); +} ); + +test( 'isSameElement--两种元素的样式通过不同方式设置', function() { + var div = te.dom[2]; + var domUtils = te.obj[3]; + $( div ).attr( 'name', 'div_name' ).attr( 'class', 'div_class' ).css( 'background-color', 'red' ).css( 'border', '1px' ).css( 'font-size', '12px' ).css( 'height', '12px' ).css( 'width', '20px' ); + var div_new = document.createElement( 'div' ); + document.body.appendChild( div_new ); + te.dom.push( div_new ); + div_new.innerHTML = '
    '; + ok( domUtils.isSameElement( div_new.firstChild, div ), 'is sameElement' ); + /*防止前后顺序引起的问题*/ + ok( domUtils.isSameElement( div, div_new.firstChild ), 'is sameElement' ); +} ); + +test( 'isSameElement--A比B多一个属性', function() { + var div = te.dom[2]; + var domUtils = te.obj[3]; + div.innerHTML = ''; + var div_new = document.createElement( 'div' ); + document.body.appendChild( div_new ); + te.dom.push( div_new ); + div_new.innerHTML = ''; + ok( !domUtils.isSameElement( div_new.firstChild, div ), 'A and B is not sameElement' ); + ok( ! domUtils.isSameElement( div, div_new.firstChild ), 'B and A is not sameElement' ); +} ); + +test( 'isSameElement--img的属性比较', function() { + var div = te.dom[2]; + var domUtils = te.obj[3]; +// var editor = new baidu.editor.Editor(); +// editor.render(div); + div.innerHTML = 'hello'; + var div1 = document.createElement( 'div' ); + var html = ''; + div1.innerHTML = html; + ok( domUtils.isSameElement( div.firstChild, div1.firstChild ), '属性一致' ) +} ); + +/*暂时不会对颜色不同表达方式做转换*/ +//test( 'isSameElement--style描述方式不同', function() { +// var div = te.dom[2]; +// var domUtils = te.obj[3]; +// $( div ).attr( 'name', 'div_name' ).attr( 'class', 'div_class' ).css( 'background-color', 'red' ).css( 'border', '1px' ).css( 'font-size', '12px' ).css( 'height', '12px' ).css( 'width', '20px' ); +// var div_new = document.createElement( 'div' ); +// document.body.appendChild( div_new ); +// te.dom.push( div_new ); +// div_new.innerHTML = '
    '; +// ok( domUtils.isSameElement( div_new.firstChild, div ), 'A and B are sameElement' ); +// div_new.innerHTML = '
    '; +// ok( domUtils.isSameElement( div, div_new.firstChild ), 'B and A sameElement' ); +//} ); + +test( 'isSameElement--A比B多一个style属性', function() { + var div = te.dom[2]; + var domUtils = te.obj[3]; + $( div ).attr( 'name', 'div_name' ).attr( 'class', 'div_class' ).css( 'background-color', 'red' ).css( 'border', '1px' ).css( 'font-size', '12px' ).css( 'height', '12px' ).css( 'width', '20px' ); + var div_new = document.createElement( 'div' ); + document.body.appendChild( div_new ); + te.dom.push( div_new ); + div_new.innerHTML = '
    '; + ok( !domUtils.isSameElement( div_new.firstChild, div ), 'A and B is not sameElement' ); + ok( ! domUtils.isSameElement( div, div_new.firstChild ), 'B and A is not sameElement' ); +} ); + +//test( 'isRedundantSpan--非span', function() { +// var div = te.dom[2]; +// var domUtils = te.obj[3]; +// div.innerHTML = 'text'; +// ok( !domUtils.isRedundantSpan( div ), 'not span' ); +// ok( !domUtils.isRedundantSpan( div.firstChild ), 'text node is not span' ); +//} ); +// +//test( 'isRedundentSpan', function() { +// var div = te.dom[2]; +// var domUtils = te.obj[3]; +// div.innerHTML = ''; +// ok( domUtils.isRedundantSpan( div.firstChild ), 'is redundentSapn' ); +// ok( !domUtils.isRedundantSpan( div.lastChild ), 'is not redundentSpan' ); +// var span = document.createElement( 'span' ); +// div.appendChild( span ); +// ok( domUtils.isRedundantSpan( span ), 'is redundent span' ); +//} ); + +/*rd说实际应用情况会按照固定的方式设置样式,因此不考虑兼容rgb(255,0,0),#ff0000,red这三者的差别*/ +test( 'isSameStyle', function() { + var div = te.dom[2]; + var domUtils = te.obj[3]; + /*分号,空格*/ + div.innerHTML = ''; + ok( domUtils.isSameStyle( div.firstChild, div.lastChild ), 'have same style' ); +} ); + +test( 'isSameStyle--float', function() { + var div = te.dom[2]; + var domUtils = te.obj[3]; + /*分号,空格*/ + div.innerHTML = ''; + ok( domUtils.isSameStyle( div.firstChild, div.lastChild ), 'have same style' ); + div.firstChild.style.cssText = "float:left;font-size:12px;background-color:red"; + ok( ! domUtils.isSameStyle( div.firstChild, div.lastChild ), 'have differtnt style' ); +} ); + + +test( 'isBlockElm', function() { + var div = te.dom[2]; + var domUtils = te.obj[3]; + /*isindex,noframes是特例,在这里不做验证*/ + var blockElms = ['address','blockquote','center','dir','div','dl','fieldset','form','h1','h2','h3','h4','h5','h6','hr','menu','ol','p','pre','table','ul']; + var k = blockElms.length; + while ( k ) { + var elm = document.createElement( blockElms[k - 1] ); + div.appendChild( elm ); + ok( domUtils.isBlockElm( elm ), elm.tagName + ' is block elm' ); + k--; + } + blockElms = ['a','abbr','acronym','b','bdo','big','br','cite','code','dfn','em','font','i','img','input','kbd','label','q','s','samp','select','small','span','strike','strong','sub','sp','textarea','tt','u','noscript' ]; + k = blockElms.length; + while ( k ) { + var elm = document.createElement( blockElms[k - 1] ); + div.appendChild( elm ); + ok( !domUtils.isBlockElm( elm ), elm.tagName + ' is not block elm' ); + k--; + } +} ); + +test( 'isbody', function() { + var domUtils = te.obj[3]; + ok( domUtils.isBody( document.body ), 'is body' ); +} ); + +/*parent参数是 node的直接父亲*/ +test( 'breakParent--一级祖先', function() { + var div = te.dom[2]; + var domUtils = baidu.editor.dom.domUtils; + div.innerHTML = '

    xxxxuitext

    xxxx
    '; + var br = div.firstChild.lastChild; + var returnNode = domUtils.breakParent( br, div.firstChild ); + equal( ua.getChildHTML( div ), '

    xxxxuitext


    xxxx
    ' ); + equal( returnNode.tagName.toLowerCase(), 'br', 'check return value' ); +} ); + +/*parent参数是 node的祖先节点*/ +test( 'breakParent--二级祖先', function() { + var div = te.dom[2]; + var domUtils = baidu.editor.dom.domUtils; + div.innerHTML = '

    xxxxuitext

    xxxx
    '; + domUtils.breakParent( div.firstChild.firstChild.firstChild, div.firstChild ); + equal( ua.getChildHTML( div ), '

    xxxx

    uitext

    xxxx
    ' ); +} ); +/*bookMark已在clearEmptySibling中验证*/ +test( 'isEmptyInlineElement', function() { + var div = te.dom[2]; + var domUtils = baidu.editor.dom.domUtils; + div.innerHTML = '

    xxxxuitext

    xxxx
    '; + var p = div.firstChild; + /*非空元素*/ + ok( !domUtils.isEmptyInlineElement( p ), 'is not empty' ); + /*空inline元素*/ + ok( domUtils.isEmptyInlineElement( p.firstChild ), 'u is empty' ); + ok( domUtils.isEmptyInlineElement( p.firstChild.firstChild ), 'em is empty' ); + /*块元素*/ + ok( !domUtils.isEmptyInlineElement( p.lastChild ), 'empty div is not inline' ); +} ); + +test( 'trimWhiteTextNode', function() { + var div = te.dom[2]; + var domUtils = baidu.editor.dom.domUtils; + div.innerHTML = '\n\t

    xxxxuitext

    xxxx
    '; + domUtils.trimWhiteTextNode( div ); + equal( ua.getChildHTML( div ), '

    xxxxuitext

    xxxx
    ', 'trim white textnode' ); +} ); + +/*适用于inline节点*/ +test( 'mergeChild--span', function() { + var div = te.dom[2]; + var domUtils = baidu.editor.dom.domUtils; + + var div_new = document.createElement( 'div' ); + div_new.id = 'test'; + div.innerHTML = 'span_1span_2'; + domUtils.mergeChild( div.firstChild.firstChild ); + /*span套span则进行合并*/ + div_new.innerHTML = 'span_1'; + div_new.firstChild.firstChild.appendChild( document.createTextNode( 'span_2' ) ); + ok( ua.haveSameAllChildAttribs( div, div_new ), 'span套span则合并' ); + + div.innerHTML = '

    span_1span_2

    '; + domUtils.mergeChild( div.firstChild.firstChild ); + /*父节点style比子节点多,删去子节点*/ + div_new.innerHTML = '

    span_1

    ' || ua.getChildHTML( div ) == '

    span_1span_2

    '; + div_new.firstChild.firstChild.appendChild( document.createTextNode( 'dpan_2' ) ); + ok( ua.haveSameAllChildAttribs( div, div_new ), '父节点style比子节点多' ); + /*子节点style比父节点多,则不作调整*/ + div.innerHTML = '

    span_1span_2

    '; + var span = div.firstChild.firstChild; + domUtils.mergeChild( span ); + /*创建一个div,div的innerHTML与预期的结果相同,比较div_new与div的所有属性,从而判断style为预期结果*/ + var div_new = document.createElement( 'div' ); + div_new.id = 'test'; + div_new.innerHTML = '

    span_1span_2

    '; + ok( ua.haveSameAllChildAttribs( div, div_new ), '子节点style比父节点多' ); + + /*多个子节点和兄弟节点,有的子节点style比父节点多,有的少,有的不同*/ + div.innerHTML = '

    span_1span_2span_3span_4

    '; + domUtils.mergeChild( div.firstChild.firstChild ); + div_new.innerHTML = '

    span_2span_3span_4

    '; + var span1 = div_new.firstChild.firstChild; + span1.insertBefore( document.createTextNode( 'span_1' ), span1.firstChild ); + ok( ua.haveSameAllChildAttribs( div, div_new ), '多个子节点和兄弟节点,有的子节点style比父节点多,有的少,有的不同' ); +} ); + + +test( 'mergeChild--非span', function() { + var div = te.dom[2]; + var domUtils = baidu.editor.dom.domUtils; + /*父节点和子节点属性不同*/ + div.innerHTML = 'b1b2'; + var div_new = document.createElement( 'div' ); + div_new.id = 'test'; + div_new.innerHTML = 'b1b2'; + domUtils.mergeChild( div.firstChild ); + ok( ua.haveSameAllChildAttribs( div, div_new ), '父节点和子节点属性不同,则不操作' ); + /*父节点和子节点属性相同*/ + div.innerHTML = 'b1b2'; + var div_new = document.createElement( 'div' ); + div_new.id = 'test'; + div_new.innerHTML = 'b1'; + domUtils.mergeChild( div.firstChild ); + div_new.firstChild.appendChild( document.createTextNode( 'b2' ) ); + ok( ua.haveSameAllChildAttribs( div, div_new ), '父节点和子节点属性相同,则删子节点' ); +} ); +test( 'mergeChild--span--attrs', function() { + var div = te.dom[2]; + var domUtils = baidu.editor.dom.domUtils; + var div_new = document.createElement( 'div' ); + div_new.id = 'test'; + div.innerHTML = 'span_1span_2'; + var html = 'span_1span_2'; + domUtils.mergeChild( div.firstChild ,'span',{style:'background-color:red'}); + ua.checkSameHtml(div.innerHTML,html,'mergeChild-给子节点中的span添加样式'); +} ); +test( 'getElementsByTagName', function() { + var div = te.dom[2]; + var domUtils = baidu.editor.dom.domUtils; + div.innerHTML = '

    xxxxuitext

    xxxx

    xxxx

    '; + var elms = domUtils.getElementsByTagName( div, 'p' ); + equal( elms.length, 2, 'check elem count' ); + equal( elms[0].innerHTML.toLowerCase(), 'xxxxuitext
    ', 'check first p' ); + equal( elms[1].innerHTML, 'xxxx', 'check second p' ); +} ); + +test( 'mergeToParent--一个span孩子', function() { + var div = te.dom[2]; + var domUtils = baidu.editor.dom.domUtils; + div.innerHTML = ''; + domUtils.mergeToParent( div.firstChild.firstChild ); + var div_new = document.createElement( 'div' ); + div_new.innerHTML = ''; + ok( ua.haveSameAllChildAttribs( div, div_new ), 'mergeTo parent' ); +} ); + +test( 'mergeToParent--一个span孩子,孩子css样式与父节点相同', function() { + var div = te.dom[2]; + var domUtils = baidu.editor.dom.domUtils; + div.innerHTML = 'xxxxx'; + domUtils.mergeToParent( div.firstChild.firstChild ); + var div_new = document.createElement( 'div' ); + div_new.innerHTML = 'xxxxx'; + ok( ua.haveSameAllChildAttribs( div, div_new ), 'mergeTo parent,删除样式相同的子节点' ); +} ); + +test( 'mergeToParent--多个span孩子,祖先节点不可被合并', function() { + var div = te.dom[2]; + var domUtils = baidu.editor.dom.domUtils; + div.innerHTML = ''; + domUtils.mergeToParent( div.firstChild.firstChild ); + var div_new = document.createElement( 'div' ); + div_new.innerHTML = ''; + ok( ua.haveSameAllChildAttribs( div, div_new ), 'mergeTo parent--多个span孩子,' ); +} ); + +//test( 'mergeToParent--a', function() { +// var div = te.dom[2]; +// var domUtils = baidu.editor.dom.domUtils; +// div.innerHTML = 'www.baidu.com'; +// +// +//} ); + + +test( 'mergeToParent--其他inline节点', function() { + var div = te.dom[2]; + var domUtils = baidu.editor.dom.domUtils; + div.innerHTML = 'xxxxxxxxxxxxxxxxxxx'; + var i = document.getElementById( 'secondI' ); + domUtils.mergeToParent( i.firstChild ); + ok( ua.getChildHTML( div ), 'xxxxxxxxxxxxxxxxxxx' ); + domUtils.mergeToParent( i ); + ok( ua.getChildHTML( div ), 'xxxxxxxxxxxxxxxxxxx' ); +} ); + +/*合并兄弟节点中有相同属性包括style的节点*/ +test( 'mergeSibling--左边没有兄弟', function() { + var div = te.dom[2]; + var domUtils = baidu.editor.dom.domUtils; + div.innerHTML = 'b1b2b3'; + domUtils.mergeSibling( div.firstChild ); + ok( ua.getChildHTML( div ), 'b1b2b3' ); +} ); + +test( 'mergeSibling--右边没有兄弟', function() { + var div = te.dom[2]; + var domUtils = baidu.editor.dom.domUtils; + div.innerHTML = 'b1b2b3'; + domUtils.mergeSibling( div.lastChild ); + ok( ua.getChildHTML( div ), 'b1b2b3' ); +} ); + + +test( 'mergeSibling--兄弟节点没有孩子', function() { + var div = te.dom[2]; + var domUtils = baidu.editor.dom.domUtils; + div.innerHTML = 'b2b3'; + domUtils.mergeSibling( div.firstChild.nextSibling ); + ok( ua.getChildHTML( div ), 'b2b3' ); +} ); + + +test( 'trace 3983 unselectable--检查赋值是否成功', function() { + var div = te.dom[2]; + var domUtils = baidu.editor.dom.domUtils; + div.innerHTML = '

    xxxxxxxxxxx

    dddd

    aaaa

    '; + debugger + domUtils.unSelectable( div ); + if ( UE.browser.gecko || UE.browser.webkit || (UE.browser.ie &&UE.browser.version>8) ) { + equal( div.style.MozUserSelect || div.style.KhtmlUserSelect || div.style.MSUserSelect, 'none', 'webkit or gecko unselectable' ); + } else { + equal( div.unselectable, 'on', '检查unselectable属性' ); + for ( var i = 0,ci; ci = div.all[i++]; ) { + equal( ci.unselectable, 'on', '检查子节点unselectable属性' ); + } + } +} ); + +test( 'unselectable--检查是否真的不能选中', function() { + var div = te.dom[2]; + var domUtils = baidu.editor.dom.domUtils; + div.innerHTML = '

    xxx

    '; + //TODO ie下如何选中文本节点需要重新想一想,用程序选择文本貌似不会考虑unselectable属性,都是可以选中的 + if ( ! ua.browser.ie && !ua.browser.opera) { +// var rng = document.body.createTextRange(); +// domUtils.unselectable( div ); +// rng.moveToElementText( div ) +// /*开始位置处向前移动一个字符,结束位置处向后移动一个字符*/ +// rng.moveEnd( 'character', 1 ); +// rng.moveStart( 'character', -1 ); +// rng.select(); +// equal( rng.text, '', 'after unselectable' ); +// } else { + var r = te.obj[2]; + r.selectNode( div.firstChild ).select(); + equal( ua.getSelectedText(), 'xxx', 'before unselectable' ); + /*禁止选中*/ + domUtils.unSelectable( div ); + r.selectNode( div.firstChild ).select(); + equal( ua.getSelectedText(), '', 'after unselectable' ); + } +} ); + +/*不支持第二个参数为字符串,必须为数组*/ +//test( 'removeAttributes--删除一个属性', function() { +// var div = te.dom[2]; +// div.innerHTML = '
    '; +// var domUtils = baidu.editor.dom.domUtils; +// domUtils.removeAttributes( div.firstChild, 'class' ); +// equal( ua.getChildHTML( div ), '
    ' ); +//} ); + +test( 'removeAttributes--删除多个属性,包括style', function() { + var div = te.dom[2]; + div.innerHTML = '
    '; + var domUtils = baidu.editor.dom.domUtils; + /*诡异模式下className可以删除,而非诡异模式下不能删除*/ + domUtils.removeAttributes( div.firstChild, ['class','name','style'] ); + equal( ua.getChildHTML( div ), '
    ' ); +} ); + +test( 'setAttributes--设置class,style', function() { + var div = te.dom[2]; + var domUtils = baidu.editor.dom.domUtils; + div.innerHTML = '
    '; + domUtils.setAttributes( div.firstChild, {'class':'div_class','id':'div_id','style':'color:red;font-size:12px;'} ); + var div_new = document.createElement( 'div' ); + div_new.id = 'test'; + div_new.innerHTML = '
    '; + ok( ua.haveSameAllChildAttribs( div, div_new ), 'check attributes' ); +} ); +test( 'setAttributes--设置innerHTML,value', function() { + var div = te.dom[2]; + var domUtils = baidu.editor.dom.domUtils; + div.innerHTML = '
    '; + domUtils.setAttributes( div.firstChild, {'innerHTML':'setAttributes_test','id':'div_id','value':'abcd'} ); + var div_new = document.createElement( 'div' ); + div_new.id = 'test'; + div_new.innerHTML = '
    setAttributes_test
    '; + div_new.firstChild.value="abcd"; + ok( ua.haveSameAllChildAttribs( div, div_new ), 'check attributes' ); +} ); +test( 'getComputedStyle', function() { + var div = te.dom[2]; + var domUtils = baidu.editor.dom.domUtils; + div.innerHTML = '
    '; + equal( domUtils.getComputedStyle( div.firstChild, 'font-size' ), '12px' ); + equal( domUtils.getComputedStyle( div.firstChild, 'display' ), 'block' ); + equal( domUtils.getComputedStyle( div.lastChild, 'display' ), 'inline' ); + equal( domUtils.getComputedStyle( div.firstChild, 'width' ),div.firstChild.offsetWidth + 'px'); + div.innerHTML = '
    '; + equal( domUtils.getComputedStyle( div.firstChild, 'width' ),'30px'); +} ); + +test( 'getComputedStyle--获取默认的背景色', function() { + var div = te.dom[2]; + var domUtils = baidu.editor.dom.domUtils; + div.innerHTML = '
    hello
    '; + /*chrome下不作特殊处理得到的结果是rgba(0,0,0,0),处理后是结果是“”*/ + var result = baidu.editor.browser.webkit ? "" : "transparent"; + equal( domUtils.getComputedStyle( div, 'background-color' ), result, '默认背景色为透明色' ); +} ); + +test( 'getComputedStyle-border', function() { + var div = te.dom[2]; + var domUtils = baidu.editor.dom.domUtils; + div.innerHTML = '
    '; + equal( domUtils.getComputedStyle( div.firstChild, 'border-width' ), '5px' ); + equal( domUtils.getComputedStyle( div.lastChild, 'border-style' ), 'solid' ); + equal( domUtils.getComputedStyle( div.lastChild, 'border-color' ), 'red' ); +} ); +//修复ie下的一个bug,如果在body上强制设了字体大小,h1的字体大小就会继承body的字体,而没有办法取到真是的字体大小 +test( 'getComputedStyle-在body上设置字体大小,检查h1字体大小', function() { + var domUtils = baidu.editor.dom.domUtils; + var editor = new baidu.editor.Editor({'autoFloatEnabled':false}); + var div = document.body.appendChild( document.createElement( 'div' ) ); + editor.render( div ); + stop(); + editor.ready(function(){ + var body = editor.body; + var range = new baidu.editor.dom.Range( editor.document ); + var h1 = body.appendChild( editor.document.createElement( 'h1' ) ); +// editor.body.style['fontSize'] = '10px'; +// h1的字体大小不是10px + var fontSize = (ua.browser.ie&&ua.browser.ie<9)?'33px':'32px';//todo 1.2.7 trace 3588 + equal( domUtils.getComputedStyle( h1, 'font-size' ), fontSize, 'body的fontSize属性不应当覆盖p的fontSize属性' ); + te.dom.push(div); +// editor.setContent( '

    这是h2的文本这是一个超链接

    ' ); + start(); + }); +} ); + +/*不支持一个class的删除,必须为一个数组*/ +//test( 'removeClasses--一个class', function() { +// var div = te.dom[2]; +// var domUtils = baidu.editor.dom.domUtils; +// div.innerHTML = '
    '; +// domUtils.removeClasses( div.firstChild, 'div_class' ); +// ok( ua.getChildHTML( div ) == '
    ' || ua.getChildHTML( div ) == '
    ' ); +//} ); + +test( 'removeClasses--多个class', function() { + var div = te.dom[2]; + var domUtils = baidu.editor.dom.domUtils; + div.innerHTML = '
    '; + var divChild = div.firstChild; + domUtils.removeClasses( divChild, ['div_class2' ,'div_class3','div_class'] ); + equal( $.trim( divChild.className ), "", 'check className' ); + equal( $( divChild ).attr( 'name' ), 'div_name', 'check name' ); + equal( $( divChild ).css( 'font-size' ), '12px', 'check font-size' ); + equal( $( divChild ).css( 'font-size' ), '12px', 'check font-size' ); + equal( divChild.style[ 'color'], 'red', 'check red' ); +} ); + +test( 'removeClasses--class包含”-“', function() { + var div = te.dom[2]; + var domUtils = baidu.editor.dom.domUtils; + div.innerHTML = '
    '; + var divChild = div.firstChild; + domUtils.removeClasses( divChild, ['b-b'] ); + equal( $.trim( divChild.className ), "b-b-a", 'check className' ); + equal( $( divChild ).attr( 'name' ), 'div_name', 'check name' ); + equal( $( divChild ).css( 'font-size' ), '12px', 'check font-size' ); + equal( divChild.style[ 'color'], 'red', 'check red' ); + div.innerHTML = '
    '; + domUtils.removeClasses( div.firstChild, ' b-b-a b-b' ); + equal(div.firstChild.className,'') +} ); + +test( 'removeStyle--style不为空', function() { + var div = te.dom[2]; + var domUtils = baidu.editor.dom.domUtils; + div.innerHTML = '
    '; + domUtils.removeStyle( div.firstChild, 'font-size' ); + var div_new = document.createElement( 'div' ); + div_new.id = 'test'; + div_new.innerHTML = '
    '; + ok( ua.haveSameAllChildAttribs( div, div_new ), 'check removed style' ); + +} ); +test( 'removeStyle--style不为空', function() { + var div = te.dom[2]; + var domUtils = baidu.editor.dom.domUtils; + div.innerHTML = '
    '; + domUtils.removeStyle( div.firstChild, 'border-left' ); + var div_new = document.createElement( 'div' ); + div_new.id = 'test'; + div_new.innerHTML = '
    '; + ok( ua.haveSameAllChildAttribs( div, div_new ), 'check removed style' ); + +} ); +test( 'removeStyle--style为空', function() { + var div = te.dom[2]; + var domUtils = baidu.editor.dom.domUtils; + div.innerHTML = '
    '; + domUtils.removeStyle( div.firstChild, 'color' ); + equal( ua.getChildHTML( div ), '
    ', ' style为空' ); +} ); + +test( 'hasClass', function() { + var div = te.dom[2]; + var domUtils = baidu.editor.dom.domUtils; + div.innerHTML = '
    '; + var divChild = div.firstChild; + ok( domUtils.hasClass( divChild, 'div_class3' ), '有这个class' ); + ok( !domUtils.hasClass( divChild, 'div' ), '木有这个class' ); + div.firstChild.className = 'a b c'; + ok(domUtils.hasClass(div.firstChild,'b c a')) +} ); + +test( 'addClass', function() { + var div = te.dom[2]; + var domUtils = baidu.editor.dom.domUtils; + div.innerHTML = '
    '; + domUtils.addClass(div.firstChild,'div_class div_class2 div_class3'); + equal(utils.trim(div.firstChild.className),div.firstChild.className,'判断是否有前后空格'); + domUtils.addClass(div.firstChild,'div_class4'); + equal(div.firstChild.className,'div_class div_class2 div_class3 div_class4','增加class4'); + domUtils.addClass(div.firstChild,'div_class4'); + equal(div.firstChild.className,'div_class div_class2 div_class3 div_class4','再增加class4'); +} ); + +test( "preventDefault", function() { + expect( 1 ); + var div = te.dom[2]; + var domUtils = baidu.editor.dom.domUtils; + /*img用来撑大页面*/ + var img = document.createElement( 'img' ); + img.src = upath + 'test.jpg'; + img.style.height = "2000px"; + div.appendChild( img ); + document.body.appendChild( div ); + var a = document.createElement( 'a' ); + a.setAttribute( "href", "#" ); + a.innerHTML = 'ToTop'; + a.target = '_self'; + document.body.appendChild( a ); + window.scrollTo( 0, document.body.scrollHeight ); + +// UserAction.beforedispatch = function( e ) { +// e = e || window.event; +// domUtils.preventDefault( e ); +// }; + a.onclick = function( e ) { + domUtils.preventDefault( e ); + } + UserAction.click( a ); + var top = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0; + ok( top != 0, "preventDefault" ); + document.body.removeChild( a ); +} ); + +test( 'getStyle--color is red', function() { + var div = te.dom[2]; + var domUtils = baidu.editor.dom.domUtils; + div.innerHTML = '
    '; + equal( domUtils.getStyle( div.firstChild, 'color' ), 'red', 'check color' ); + equal( domUtils.getStyle( div.firstChild, 'font-size' ), '12px', 'check font size' ); + equal( domUtils.getStyle( div.firstChild, 'top' ), '13px', 'check top' ); +} ); + +test( 'getStyle--color is rgb', function() { + var div = te.dom[2]; + var domUtils = baidu.editor.dom.domUtils; + div.innerHTML = '
    '; + equal( domUtils.getStyle( div.firstChild, 'color' ), '#FF0000', 'check color' ); + equal( domUtils.getStyle( div.firstChild, 'font-size' ), '12px', 'check font size' ); + equal( domUtils.getStyle( div.firstChild, 'top' ), '13px', 'check top' ); +} ); + +test( 'getStyle--color is #ff0000', function() { + var div = te.dom[2]; + var domUtils = baidu.editor.dom.domUtils; + div.innerHTML = '
    '; + equal( domUtils.getStyle( div.firstChild, 'color' ).toUpperCase(), '#FF0000', 'check color' ); + equal( domUtils.getStyle( div.firstChild, 'font-size' ), '12px', 'check font size' ); + equal( domUtils.getStyle( div.firstChild, 'top' ), '13px', 'check top' ); +} ); + + +//test( 'getStyle--border', function() { +// var div = te.dom[2]; +// div.innerHTML = '
    '; +//} ); +test( 'removeDirtyAttr', function() { + var div = te.dom[2]; + var domUtils = baidu.editor.dom.domUtils; + div.innerHTML = '
    xxx
    xx'; + $( div ).attr( '_moz_dirty', 'xxxx' ); + for ( var i = 0,ci,nodes = div.getElementsByTagName( '*' ); ci = nodes[i++]; ) { + $( ci ).attr( '_moz_dirty', 'xxx' ); + } + domUtils.removeDirtyAttr( div ); + + for ( var i = 0,ci,nodes = div.getElementsByTagName( '*' ); ci = nodes[i++]; ) { + equal( $( ci ).attr( '_moz_dirty' ), undefined, 'check dirty attr ' ); + } + equal( $( div ).attr( '_moz_dirty' ), undefined, 'check dirty attr' ); +} ); + +test( 'getChildCount', function() { + var div = te.dom[2]; + var domUtils = baidu.editor.dom.domUtils; + div.innerHTML = '

    xxx

    xxxxxxxxxx
    '; + var divChild = div.firstChild; + equal( domUtils.getChildCount( div ), 1, 'one childNode' ); + equal( domUtils.getChildCount( divChild ), 5, '5 childs' ); + equal( domUtils.getChildCount( divChild.firstChild.firstChild ), 2, 'inline span' ); + equal( domUtils.getChildCount( divChild.lastChild ), 0, 'text node have no child' ); + equal( domUtils.getChildCount( divChild.lastChild.previousSibling ), 0, 'img have no child' ); + +} ); + +test( 'setStyle', function() { + var div = te.dom[2]; + var domUtils = baidu.editor.dom.domUtils; + div.innerHTML = '

    '; + /*修改float值*/ + domUtils.setStyle( div.firstChild, 'float', 'right' ); + equal( $( div.firstChild ).css( 'float' ), 'right', '浮动方式改为了right' ); + domUtils.setStyle( div.firstChild.firstChild, 'text-indent', '10px' ); + equal( $( div.firstChild.lastChild ).css( 'text-indent' ), '10px', '设置了缩进样式' ); +} ); + +test( 'setStyles', function() { + var div = te.dom[2]; + var domUtils = baidu.editor.dom.domUtils; + div.innerHTML = '

    '; + /*修改float值*/ + domUtils.setStyles( div.firstChild, {'float':'right','text-align':'center'} ); + equal( $( div.firstChild ).css( 'float' ), 'right', '浮动方式改为了right' ); + equal( $( div.firstChild.lastChild ).css( 'text-align' ), 'center', '设置了对齐方式样式' ); +} ); + +//zhuwenxuan add +//test( 'clearReduent', function() { +// var div = te.dom[2]; +// var domUtils = baidu.editor.dom.domUtils; +// //没有内容 +// div.innerHTML = '
    '; +// document.body.appendChild(div); +// domUtils.clearReduent(div,["i","b"]); +// ok( "
    ",div.innerHTML ); +// //有内容 +// div.innerHTML = '
    ddd
    '; +// domUtils.clearReduent(div,["i","b"]); +// ok( "
    ddd
    ",div.innerHTML ); +// div.innerHTML = '
    ddd
    '; +// domUtils.clearReduent(div,["i","b"]); +// ok( "
    ddd
    ",div.innerHTML ); +//} ); + + +//zhuwenxuan add +test( 'isEmptyNode', function() { + var div = te.dom[2]; + var domUtils = baidu.editor.dom.domUtils; + div.innerHTML = " \t\t\n\r"; + ok(domUtils.isEmptyNode(div)); + div.innerHTML = '
    dasdf
    '; + equal(false,domUtils.isEmptyNode(div)); +} ); + +//zhuwenxuan add +test( 'clearSelectedArr', function() { + var domUtils = baidu.editor.dom.domUtils; + var div = te.dom[2]; + var span = document.createElement("span"); + div.className = "aaa"; + span.className = "span"; + document.body.appendChild(div); + document.body.appendChild(span); + var arr = []; + arr.push(div); + arr.push(span); + domUtils.clearSelectedArr(arr); + equal("",div.className); + equal("",span.className); +} ); + + +//zhuwenxuan add +test( 'isBr', function() { + var domUtils = baidu.editor.dom.domUtils; + var div = te.dom[2]; + div.innerHTML = "
    "; + equal(true,domUtils.isBr(div.firstChild)); +} ); + +//zhuwenxuan add +test( 'isFillChar', function() { + var domUtils = baidu.editor.dom.domUtils; + var div = te.dom[2]; + domUtils.fillNode(document,div); + if(ua.browser.ie){ + ok(domUtils.isFillChar(div.lastChild)); + } + var node = document.createTextNode(domUtils.fillChar + 'sdfsdf'); + ok(domUtils.isFillChar(node,true)); + ok(!domUtils.isFillChar(node)); + node = document.createTextNode(domUtils.fillChar +domUtils.fillChar); + ok(domUtils.isFillChar(node,true)); + ok(domUtils.isFillChar(node)) +} ); + + +//zhuwenxuan add +test( 'isStartInblock', function() { + var domUtils = baidu.editor.dom.domUtils; + var div = te.dom[2]; + var range = new baidu.editor.dom.Range( document ); + domUtils.fillNode(document,div); + range.setStart(div,0); + ok(domUtils.isStartInblock(range)); + div.innerHTML = "asdfasdf"; + range.setStart(div,2); + equal(0,domUtils.isStartInblock(range)) +} ); + +//zhuwenxuan add +test( 'isEmptyBlock', function() { + var domUtils = baidu.editor.dom.domUtils; + var div = te.dom[2]; + domUtils.fillNode(document,div); + ok(domUtils.isEmptyBlock(div)); + var span = document.createElement("span"); + equal(1,domUtils.isEmptyBlock(span)); + span.innerHTML = "asdf"; + equal(0,domUtils.isEmptyBlock(span)); +} ); + +//zhuwenxuan add +test( 'fillNode', function() { + var domUtils = baidu.editor.dom.domUtils; + var div = te.dom[2]; + domUtils.fillNode(document,div); + ok(div.innerHTML.length>0); +} ); + +//zhuwenxuan add +test( 'moveChild', function() { + var domUtils = baidu.editor.dom.domUtils; + var div = te.dom[2]; + div.innerHTML = "div child"; + var p = document.createElement("p"); + domUtils.moveChild(div,p); + equal("div child",p.innerHTML); + p.innerHTML = ""; + div.innerHTML = "asdf"; + domUtils.moveChild(div,p); + equal("asdf",p.innerHTML.toLowerCase()); +} ); + +test( 'hasNoAttributes', function() { + var domUtils = baidu.editor.dom.domUtils; + var div = te.dom[2]; + div.innerHTML = "sdf"; + + ok(domUtils.hasNoAttributes(div.firstChild)); + div.firstChild.style.cssText = 'font-size:12px'; + ok(!domUtils.hasNoAttributes(div.firstChild)); + domUtils.removeAttributes(div.firstChild,['style']); + ok(domUtils.hasNoAttributes(div.firstChild)); + div.innerHTML = 'sf'; + ok(!domUtils.hasNoAttributes(div.firstChild)); + +} ); +test( 'isTagNode', function() { + var domUtils = baidu.editor.dom.domUtils; + var div = te.dom[2]; + div.innerHTML = "

    sdf

    "; + ok(domUtils.isTagNode(div.firstChild,"p")); + ok(domUtils.isTagNode(div.firstChild.firstChild,"span")); +} ); +test( 'filterNodelist', function() { + var div = te.dom[2]; + div.innerHTML = ''; + var arr = domUtils.filterNodeList(div.getElementsByTagName('*'),'i span'); + equals(arr.tagName,"SPAN"); + arr = domUtils.filterNodeList(div.getElementsByTagName('*'),'i'); + equals(arr.tagName,'I'); + arr = domUtils.filterNodeList(div.getElementsByTagName('*'),function(n){ + return n.tagName == 'SPAN' + }); + equals(arr.tagName,'SPAN'); + arr = domUtils.filterNodeList(div.getElementsByTagName('*'),function(n){ + return n.tagName == 'SPAN' + },true); + equals(arr.length,2) +} ); + +test('inNodeEndBoundary',function(){ + var div = te.dom[2]; + div.innerHTML = "spanaasp"; + var range = te.obj[2]; + range.setStart(div.firstChild.lastChild.firstChild,2).collapse(1).select(); + range.createBookmark(); + ok(domUtils.isInNodeEndBoundary(range,div.firstChild),'firstchild.lastchild边界'); + range.setStart(div.firstChild.firstChild.firstChild,4).collapse(1).select(); + range.createBookmark(); + ok(!domUtils.isInNodeEndBoundary(range,div.firstChild),'firstchild.firstchild边界'); + range.setStart(div.lastChild.firstChild,2).collapse(1).select(); + range.createBookmark(); + ok(domUtils.isInNodeEndBoundary(range,div),'lastchild边界'); +}); + +//test( '闭合选区,标签边界', function() { +// var domUtils = baidu.editor.dom.domUtils; +// var div = te.dom[2]; +// var editor = new baidu.editor.ui.Editor({autoFloatEnabled:true}); +// editor.render( div ); +// var range = new baidu.editor.dom.Range( editor.document ); +// editor.setContent( 'a_text1a_text2' ); +// var a = editor.body.firstChild.firstChild; +// range.setStart( a, 0 ).collapse( 1 ).select(); +// same( domUtils.findTagNamesInSelection( range, ['h2','a','p'] ), a, '选区位置为(a,0)' ); +// range.setStart( a, 1 ).collapse( 1 ).select(); +// same( domUtils.findTagNamesInSelection( range, ['h2','a','p'] ), a, '选区位置为(a,1)' ); +// +// range.setStart( a.parentNode, 1 ).collapse( 1 ).select(); +// same( domUtils.findTagNamesInSelection( range, ['h2','a','p'] ), a.parentNode, '选区位置为(p,1)' ); +// same( domUtils.findTagNamesInSelection( range, ['h2','a'] ), null, '选区位置为(p,1),但是不符合查找的条件' ); +//} ); + +//test( '文本闭合选区中查找是否包含特定的标签列表', function() { +// var domUtils = baidu.editor.dom.domUtils; +// var editor = new baidu.editor.ui.Editor({autoFloatEnabled:true}); +// var div = te.dom[2]; +// editor.render( div ); +// var range = new baidu.editor.dom.Range( editor.document ); +// var body = editor.body; +// +// editor.setContent( '

    我是测试的header:h2

    xx乐乐乐乐x我是标签

    ' ); +// var expectH2 = editor.document.getElementById( 'tt-h2' ), +// expectA = editor.document.getElementById( 'tt-a' ); +// +// //闭合情况下,文本节点里 +// var textH2 = body.firstChild.firstChild; +// range.setStart( textH2, 2 ).collapse( true ).select(); +// ok( expectH2 === domUtils.findTagNamesInSelection( range, ['h2', 'a', 'h3'] ), '闭合情况下,cursor在h2中,tag顺序:[h2, a, h3]' ); +// range.setStart( textH2, 0 ).collapse( true ).select(); +// ok( expectH2 === domUtils.findTagNamesInSelection( range, ['h2', 'a', 'h3'] ), '闭合情况下,cursor在h2的左边界,tag顺序:[h2, a, h3]' ); +// range.setStart( textH2, 14 ).collapse( true ).select(); +// ok( expectH2 === domUtils.findTagNamesInSelection( range, ['h2', 'a', 'h3'] ), '闭合情况下,cursor在h2的右边界,tag顺序:[h2, a, h3]' ); +// +// var p = editor.document.getElementsByTagName('p')[0]; +// var textA = p.lastChild.firstChild; +// range.setStart( textA, 2 ).collapse( true ).select(); +// ok( expectA === domUtils.findTagNamesInSelection( range, ['h2', 'a', 'h3'] ), '闭合情况下,cursor在a中,tag顺序:[h2, a, h3]' ); +// range.setStart( textA, 0 ).collapse( true ).select(); +// ok( expectA === domUtils.findTagNamesInSelection( range, ['h2', 'a', 'h3'] ), '闭合情况下,cursor在a的左边界,tag顺序:[h2, a, h3]' ); +// range.setStart( textA, 4 ).collapse( true ).select(); +// ok( expectA === domUtils.findTagNamesInSelection( range, ['h2', 'a', 'h3'] ), '闭合情况下,cursor在a的右边界,tag顺序:[h2, a, h3]' ); +// +// var textStrong = p.firstChild.firstChild; +// range.setStart( textStrong, 2 ).collapse( true ).select(); +// ok( null == domUtils.findTagNamesInSelection( range, ['h2', 'a', 'h3'] ), '闭合情况下,cursor在p中,tag顺序:[h2, a, h3]' ); +// range.setStart( textStrong, 0 ).collapse( true ).select(); +// ok( null == domUtils.findTagNamesInSelection( range, ['h2', 'a', 'h3'] ), '闭合情况下,cursor在p的左边界,tag顺序:[h2, a, h3]' ); +// range.setStart( textStrong, 7 ).collapse( true ).select(); +// ok( null == domUtils.findTagNamesInSelection( range, ['h2', 'a', 'h3'] ), '闭合情况下,cursor在p的右边界,tag顺序:[h2, a, h3]' ); +//} ); + + +//test( '不闭合选区中查找,如果包含,则返回第一个dom节点', function() { +// var domUtils = baidu.editor.dom.domUtils; +// var editor = new baidu.editor.ui.Editor({autoFloatEnabled:true}); +// var div = te.dom[2]; +// editor.render( div ); +// var range = new baidu.editor.dom.Range( editor.document ); +// var body = editor.body; +// +// editor.setContent( '

    我是测试的header:h2

    xx乐乐乐乐x我是标签

    ' ); +// var expectH2 = editor.document.getElementById( 'tt-h2' ), +// expectA = editor.document.getElementById( 'tt-a' ); +// var textH2 = body.firstChild.firstChild; +// range.setStart( textH2, 3 ).setEnd( textH2, 9 ).select(); +// ok( expectH2 === domUtils.findTagNamesInSelection( range, ['h2', 'a', 'h3'] ), '选中单个节点的一部分:tag顺序:[h2, a, h3]' ); +// ok( expectH2 === domUtils.findTagNamesInSelection( range, ['a', 'h2', 'h3'] ), '选中单个节点的一部分:tag顺序:[a, h2, h3]' ); +// +// range.setStart( textH2, 0 ).setEnd( textH2, 14 ).select(); +// ok( expectH2 === domUtils.findTagNamesInSelection( range, ['h2', 'a', 'h3'] ), '选中单个节点的全部:tag顺序:[h2, a, h3]' ); +// ok( expectH2 === domUtils.findTagNamesInSelection( range, ['a', 'h2', 'h3'] ), '选中单个节点的全部:tag顺序:[a, h2, h3]' ); +// +// var p = editor.document.getElementsByTagName('p')[0]; +// range.setStart( textH2, 0 ).setEnd(p.lastChild.firstChild, 3 ).select(); +// ok( expectH2 === domUtils.findTagNamesInSelection( range, ['h2', 'a', 'h3'] ), '跨节点选中:tag顺序:[h2, a, h3]' ); +// ok( expectA === domUtils.findTagNamesInSelection( range, ['a', 'h2', 'h3'] ), '跨节点选中:tag顺序:[a, h2, h3]' ); +//} ); + +//test( '不闭合选区,选区包含前半个半个标签', function() { +// var domUtils = baidu.editor.dom.domUtils; +// var editor = new baidu.editor.ui.Editor({autoFloatEnabled:true}); +// var div = te.dom[2]; +// editor.render( div ); +// var body = editor.body; +// var range = new baidu.editor.dom.Range( editor.document ); +// editor.setContent( '

    这是h2的文本这是一个超链接

    ' ); +// var a = body.firstChild.lastChild; +// range.setStart( body, 0 ).setEnd( a.firstChild, 3 ).select(); +// same( domUtils.findTagNamesInSelection( range, ['a','h2','body','p'] ), a, '选择h2和a的前半部分标签,找到第一个为a' ); +// /*调换查找的数组中元素的顺序*/ +// same( domUtils.findTagNamesInSelection( range, ['h2','a','body','p'] ), body.firstChild, '选择h2和a的前半部分标签,找到第一个为h2' ); +//} ); + +//test( '不闭合选区,选区包含后半个标签', function() { +// var domUtils = baidu.editor.dom.domUtils; +// var editor = new baidu.editor.ui.Editor({autoFloatEnabled:true}); +// var div = te.dom[2]; +// editor.render( div ); +// var body = editor.body; +// var range = new baidu.editor.dom.Range( editor.document ); +// editor.setContent( '

    这是h2的文本这是一个超链接

    ' ); +// var a = body.firstChild.lastChild; +// range.setStart( a.firstChild, 3 ).setEnd( body, 1 ).select(); +// same( domUtils.findTagNamesInSelection( range, ['a','h2','body','p'] ), a, '选择h2和a的后部分标签,找到第一个为a' ); +// /*调换查找的数组中元素的顺序*/ +// same( domUtils.findTagNamesInSelection( range, ['h2','a','body','p'] ), body.firstChild, '选择h2和a的后部分标签,找到第一个为h2' ); +//} ); + +//test( '不闭合选区,选区包含2个相同的标签', function() { +// var domUtils = baidu.editor.dom.domUtils; +// var editor = new baidu.editor.ui.Editor({autoFloatEnabled:true}); +// var div = te.dom[2]; +// editor.render( div ); +// var body = editor.body; +// var range = new baidu.editor.dom.Range( editor.document ); +// editor.setContent( '

    a_text1a_tex2

    ' ); +// var a = body.firstChild.firstChild; +// range.setStart( body.firstChild, 0 ).setEnd( body.firstChild, 2 ).select(); +// same( domUtils.findTagNamesInSelection( range, ['a'] ), a, '选区包含2个完整的a,选择第一个a' ); +// +// range.setStart( body.firstChild, 0 ).setEnd( body.firstChild, 2 ).select(); +// same( domUtils.findTagNamesInSelection( range, ['p','a'] ), body.firstChild, '选区包含2个完整的a,选择p' ); +// +// range.setStart( a, 0 ).setEnd( a.nextSibling, 1 ).select(); +// same( domUtils.findTagNamesInSelection( range, ['a'] ), a, '选区包含2个不完整的a,选择第一个a' ); +//} ); + +//test( '不闭合选区,选区紧挨着标签边界', function() { +// var domUtils = baidu.editor.dom.domUtils; +// var editor = new baidu.editor.ui.Editor({autoFloatEnabled:true}); +// var div = te.dom[2]; +// editor.render( div ); +// var body = editor.body; +// var range = new baidu.editor.dom.Range( editor.document ); +// editor.setContent( '

    a_text1a_text3a_tex2

    ' ); +// range.selectNode( body.firstChild.childNodes[1] ).select(); +// same( domUtils.findTagNamesInSelection( range, ['a'] ), null, '选区紧挨着a边缘,找a返回null' ); +// +// same( domUtils.findTagNamesInSelection( range, ['a','p'] ), body.firstChild, '选区紧挨着a边缘,找p返回p' ); +//} ); + +//test( '不闭合选区,多节点,压力测试', function() { +// var domUtils = baidu.editor.dom.domUtils; +// var editor = new baidu.editor.ui.Editor({autoFloatEnabled:true}); +// var div = te.dom[2]; +// editor.render( div ); +// var body = editor.body; +// var range = new baidu.editor.dom.Range( editor.document ); +// editor.setContent( '

    我是p里的文本textTD2

    textTD1
    1. 我是列表1

      我是p里的文本textTD2

    2. 我是li 2里的文本textTD2

      TextEM1我是列表2里的文本

    ' ); +// var span = editor.document.getElementById( 'spanID' ); +// range.selectNode( span.firstChild ).select(); +// same(domUtils.findTagNamesInSelection(range,['div','pre','a','h1','h2','h3','h4','h5','h6','h7','table']),body.getElementsByTagName('table')[0],'深节点'); +//} ); + +//test( 'control range中查找是否包含特定的标签列表', function() { +// var domUtils = baidu.editor.dom.domUtils; +// var editor = new baidu.editor.ui.Editor({autoFloatEnabled:true}); +// var div = te.dom[2]; +// editor.render( div ); +// var range = new baidu.editor.dom.Range( editor.document ); +// +// editor.setContent( 'test_

    xx乐乐乐乐x我是标签

    ' ); +// var expectH2 = editor.document.getElementById( 'tt-h2' ), +// expectA = editor.document.getElementById( 'tt-a' ), +// expectSpan = editor.document.getElementById( 'tt-span' ); +// +// +// range.setStart(expectH2, 0).setEnd(expectA, 0).select(); +// ok( expectA === domUtils.findTagNamesInSelection( range, ['a', 'img', 'h3'] ), 'tag顺序:[a, img, h3]' ); +// ok( expectH2 === domUtils.findTagNamesInSelection( range, ['img', 'a', 'h3'] ), 'tag顺序:[img, a, h3]' ); +// +// +// range.setStart(expectSpan, 0).setEnd(expectH2, 1).select(); +// ok( expectH2 === domUtils.findTagNamesInSelection( range, ['a', 'img', 'h3'] ), 'tag顺序:[a, img, h3]' ); +// ok( expectH2 === domUtils.findTagNamesInSelection( range, ['img', 'a', 'h3'] ), 'tag顺序:[img, a, h3]' ); +//} ); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/core/filternode.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/core/filternode.js new file mode 100644 index 000000000..18f620dc3 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/core/filternode.js @@ -0,0 +1,178 @@ +module( 'core.filternode' ); + +test( '过滤掉整个标签', function() { + var uNode = UE.uNode; + var node = uNode.createElement('

    sdfsdf

    sdf
    '); + UE.filterNode(node,{ + 'p':{}, + 'b':'-' + }); + equals(node.toHtml().replace(/[ ]+>/g,'>'),'

    sdf

    sdf
    ','保留p,过滤b'); + + node.innerHTML('

    sdfs





    '); + UE.filterNode(node,{ + 'p':{}, + 'br':'-' + }); + equals(node.toHtml().replace(/[ ]+>/g,'>'),'

    sdfs

    ','保留p,过滤br'); +}); + +test( '过滤标签全部属性', function() { + var uNode = UE.uNode; + var node = uNode.createElement('

    sdfsdf

    sdf
    '); + node.innerHTML('

    sdfssdfs

    sdfasdf
    '); + UE.filterNode(node,{ + 'p':{$:{}} + }); + equals(node.toHtml().replace(/[ ]+>/g,'>'),'

    sdfssdfs

    sdfasdf
    ','过滤p全部属性'); + + node.innerHTML('
    asdlkfj
    '); + UE.filterNode(node,{ + 'h6':function(node){ + node.tagName = 'p'; + node.setAttr(); + }, + '-':'b i', + 'p':{} + }); + equals(node.toHtml().replace(/[ ]+>/g,'>'),'

    asd

    ','同时过滤多个标签属性'); +}); + +test( '过滤标签部分属性', function() { + var uNode = UE.uNode; + var node = uNode.createElement('

    sdfsdf

    sdf
    '); + node.innerHTML('

    sdfasdf
    '); + UE.filterNode(node,{ + 'p':{$:{ + style:['color'] + }}, + 'td':{} + }); + equals(node.toHtml().replace(/[ ]+>/g,'>'),'

    sdfasdf
    ','保留p的color属性'); + + node.innerHTML('

    sdfssdfs

    '); + UE.filterNode(node,{ + 'p':{$:{ + style:['line-height'] + }}, + 'span':{$:{}}, + 'strong':'-' + }); + equals(node.toHtml().replace(/[ ]+>/g,'>'),'

    sdfs

    ','过滤span全部属性,保留p部分属性,过滤strong标签'); + + node.innerHTML('

    sdfssdfssdfssdfs

    '); + UE.filterNode(node,{ + 'p':{}, + 'u':{$:{ + 'class':['ad'] + }}, + 'sub':{$:{}}, + 'i':'-' + }); + equals(node.toHtml().replace(/[ ]+>/g,'>'),'

    sdfssdfs

    ','过滤sub全部属性,保留u部分属性,过滤i标签'); +}); + +test( '标签替换过滤', function() { + var uNode = UE.uNode; + var node = uNode.createElement('

    sdfsdf

    sdf
    '); + node.innerHTML('

    sdfssdfs

    sdfasdf
    '); + UE.filterNode(node,{ + 'p':{$:{ + style:['color'] + }}, + 'tr':function(node){ + node.tagName = 'p'; + node.setAttr(); + }, + 'td':function(node){ + node.parentNode.removeChild(node,true) + } + }); + equals(node.toHtml().replace(/[ ]+>/g,'>'),'

    sdfssdfs

    sdfasdf
    ','tr替换为p,过滤掉td'); + + node.innerHTML('
    aldkfj
    adf
    lkj
    '); + UE.filterNode(node,{ + 'img':{$:{ + src:[''] + }}, + 'table':{}, + 'tbody':{}, + 'tr':{$:{}}, + 'td':{$:{}}, + 'th':function(node){ + var txt = !!node.innerText(); + if(txt){ + node.parentNode.insertAfter(UE.uNode.createText('    '),node); + } + node.parentNode.removeChild(node,node.innerText()) + } + }); + ua.checkSameHtml(node.toHtml().replace(/[ ]+>/g,'>'),'
    aldkfjadf    
    lkj
    ','th按文本内容替换,保留img部分属性'); +}); + +test( '保留标签全部属性', function() { + var uNode = UE.uNode; + var node = uNode.createElement('

    sdfsdf

    sdf
    '); + node.innerHTML('
    1. sdf
      • a
      • b
      • c
    2. jkl
    '); + UE.filterNode(node,{ + 'ol':{}, + 'ul':{$:{}}, + 'li':{} + }); + equals(node.toHtml().replace(/[ ]+>/g,'>'),'
    1. sdf
      • a
      • b
      • c
    2. jkl
    ','保留ol、li全部属性,过滤ul全部属性'); +}); + +test( '过滤规则为空', function() { + var uNode = UE.uNode; + var node = uNode.createElement('

    sdfsdf

    sdf
    '); + node.innerHTML('

    asd

    sdfasdf
    '); + UE.filterNode(node,{}); + equals(node.toHtml().replace(/[ ]+>/g,'>'),'

    asd

    sdfasdf
    ','过滤规则为空'); +}); + +test( '特殊规则过滤', function() { + var uNode = UE.uNode; + var node = uNode.createElement('

    sdf

    sdf
    '); + node.innerHTML(''); + UE.filterNode(node,{ + 'b':'-' + }); + equals(node.toHtml().replace(/[ ]+>/g,'>'),'
    ','过滤规则中包含html中不存在的标签'); + + node.innerHTML('

    '); + UE.filterNode(node,{ + 'p':{} + }); + equals(node.toHtml().replace(/[ ]+>/g,'>'),'

    ','innerHTML中包含注释'); +}); + +test( '只有white list--滤除属性', function () { + var uNode = UE.uNode; + var node = uNode.createElement('

    sdf

    sdf
    '); + node.innerHTML('
    hellotable

    hellodiv

    hellospan'); + UE.filterNode(node,{ + div:{ + $:{ + id:{}, + 'class':{} + } + }, + table:{}, + span:{} + }); + ua.checkSameHtml(node.toHtml().replace(/[ ]+>/g,'>'), '
    hellotable
    hellodiv
    hellospan
    ', '滤除属性'); +} ); + +test( '只有black list', function () { + var uNode = UE.uNode; + var node = uNode.createElement('

    sdf

    sdf
    '); + node.innerHTML('
    hello1hello2
    '); + UE.filterNode(node,{ + span:'-', + em:'-', + '#comment':'-', + script:'-', + style:'-' + }); + equals(node.toHtml().replace(/[ ]+>/g,'>'),'
    hello2
    ','过滤规则中包含html中不存在的标签'); +} ); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/core/filterword.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/core/filterword.js new file mode 100644 index 000000000..f9395bfcd --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/core/filterword.js @@ -0,0 +1,41 @@ +module( "core.filterword" ); + + +test( "office2010 word", function () { + stop(); + ua.readTxt('test1_1.txt',function(str){ + var txt = '

    欢迎使用ueditor!

    欢迎使用ueditor!

    欢迎使用ueditor!

    欢迎使用ueditor!

    欢迎使用ueditor!

    欢迎使用ueditor!

    欢迎使用ueditor!

    欢迎使用ueditor!

    1. 欢迎使用ueditor!

    2. 欢迎使用ueditor!

    l 欢迎使用ueditor!

    l 欢迎使用ueditor!

    '; + equal(UE.filterWord(str),txt,'字体、字号、颜色、基本样式、列表'); + ua.readTxt('test1_2.txt',function(str){ + txt ='

    欢迎使用ueditor!

    欢迎使用ueditor!

    欢迎使用ueditor!

    欢迎使用ueditor!

    欢迎使用ueditor!

    欢迎使用ueditor!

    '; + equal(UE.filterWord(str),txt,'段落样式、word样式、缩进'); + ua.readTxt('test1_3.txt',function(str){ + txt = '

    欢迎使用ueditor!

     

     

     

     

    欢迎使用ueditor!

    www.baidu.com

    '; + equal(UE.filterWord(str),txt,'表格、图片、超链接'); + start(); + }); + }); + }); +} ); + +test( "wps word", function () { + stop(); + ua.readTxt('test2_1.txt',function(str){ + var txt='

    欢迎使用ueditor!

    欢迎使用ueditor!

    欢迎使用ueditor!

    欢迎使用ueditor!

    欢迎使用ueditor!

    欢迎使用ueditor!

    欢迎使用ueditor!

    一、欢迎使用ueditor!

    二、欢迎使用ueditor!

    l 欢迎使用ueditor!

    l 欢迎使用ueditor!

    '; + equal(UE.filterWord(str),txt,'字体、字号、颜色、基本样式、列表'); + ua.readTxt('test2_2.txt',function(str){ + txt= '

    欢迎使用ueditor!

    欢迎使用ueditor!

    欢迎使用ueditor!

    欢迎使用ueditor!

    欢迎使用ueditor!

    欢迎使用ueditor!

    '; + equal(UE.filterWord(str),txt,'缩进、段落样式、word样式'); + ua.readTxt('test2_3.txt',function(str){ + txt='

    欢迎使用ueditor!

    欢迎使用ueditor!

    www.baidu.com

    '; + equal(UE.filterWord(str),txt,'表格、图片、超链接'); + start(); + }); + }); + }); +} ); +test( "word 补充 ", function () { + var str = '

    '; + var txt = '

    '; + ua.checkSameHtml(UE.filterWord(str),txt,'word 补充'); +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/core/htmlparser.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/core/htmlparser.js new file mode 100644 index 000000000..5840f5815 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/core/htmlparser.js @@ -0,0 +1,209 @@ +/** + * Created with JetBrains PhpStorm. + * User: luqiong + * Date: 13-3-14 + * Time: 下午2:31 + * To change this template use File | Settings | File Templates. + */ +module( 'core.htmlparser' ); + +test( '普通标签处理', function() { + var root = UE.htmlparser('sdfsdfsdfsf'); + equals(root.toHtml(),'sdfsdfsdfsf','单个普通标签'); + root = UE.htmlparser('sdfsdfsdsdfsdfsf'); + equals(root.toHtml(),'sdfsdfsdsdfsdfsf','多个普通标签'); + root = UE.htmlparser('sdf'); + ua.checkSameHtml(root.toHtml(),'sdf','添加属性的标签'); + root = UE.htmlparser(''); + ua.checkSameHtml(root.toHtml(),'','img标签'); +}); + +test( '特殊标签处理', function() { + var root = UE.htmlparser('sdf'); + ua.checkSameHtml(root.toHtml(),'sdf','包含注释'); + root = UE.htmlparser(''); + equals(root.toHtml().replace(/[ ]+>/g,'>'),'','script标签'); + root = UE.htmlparser('


    '); + equals(root.toHtml().replace(/[ ]+>/g,'>'),'


    ','br标签'); + root = UE.htmlparser('
  • sdfsdfsdf
  • sdfsdfsdfsdf'); + equals(root.toHtml(),'
    • sdfsdfsdf
    • sdfsdfsdfsdf
    ','以文本结束的html'); +}); + +//test( '补全不完整table', function() {//TODO 1.2.6 +// var root = UE.htmlparser('

    '); +// equals(root.toHtml(),'

    ','td完整,补全table'); +// root = UE.htmlparser('

    sdfsdfsdf

    '); +// equals(root.toHtml(),'

    sdfsdfsdf

    ','td不完整,补全table'); +// root = UE.htmlparser('' + '\n\r' + ''); +// equals(root.toHtml(),'
    ','包含\n,补全table'); +// root = UE.htmlparser(''); +// equals( root.toHtml().toLowerCase(), '
    ', '--不补孩子' ); +// /*补parent*/ +// root = UE.htmlparser('hello'); +// equals( root.toHtml().toLowerCase(), '
    '); +// equals( root.toHtml().toLowerCase(), '
    ', '
    --补父亲' ); +// /*补parent和child*/ +// root = UE.htmlparser('
    hello
    ', 'hello--补父亲不补孩子' ); +// +// root = UE.htmlparser('123'); +// equals( root.toHtml().toLowerCase(), '
    123
    ', '123--文本放在table里' ); +// +// root = UE.htmlparser('123'); +// equals( root.toHtml().toLowerCase(), '123
    ', '123' ); +// +// root = UE.htmlparser('123'); +// equals( root.toHtml().toLowerCase(), '
    123
    ', '123' ); +// +// root = UE.htmlparser('123'); +// equals( root.toHtml().toLowerCase(), '
    123
    ', '123' ); +// +// /*补充为2个td*/ +//// root = UE.htmlparser('123'); +//// equals( root.toHtml().toLowerCase(), '
    123
    ', '123--tr和td之间有文字' );//TODO 1.2.6 +// +// root = UE.htmlparser('123'); +// equals( root.toHtml().toLowerCase(), '
    123
    ', '123' ); +// +// root = UE.htmlparser('123'); +// equals( root.toHtml().toLowerCase(), '
    123
    ', '123' ); +// +// /*补2个table*/ +//// root = UE.htmlparser('123132'); +//// equals( root.toHtml().toLowerCase(), '
    123
    132
    ', '123132--补全2个table' );//TODO 1.2.6 +// +// /*开标签、文本与闭标签混合*/ +//// root = UE.htmlparser('123'); +//// equals( root.toHtml().toLowerCase(), '
    123', '123--tr和td之间有文字' );//TODO 1.2.6 +// +//// root = UE.htmlparser('123'); +//// equals( root.toHtml().toLowerCase(), '
    123', '123--td闭标签后面有文字' );//TODO 1.2.6 +// +// root = UE.htmlparser('123'); +// equals( root.toHtml().toLowerCase(), '123
    ', '123' ); +// +// root = UE.htmlparser('123'); +// equals( root.toHtml().toLowerCase(), '
    123
    ', '123' ); +// +// root = UE.htmlparser('123'); +// equals( root.toHtml().toLowerCase(), '123
    ', '123' ); +// /*闭标签、文本与闭标签混合*/ +// root = UE.htmlparser('123'); +// equals( root.toHtml().toLowerCase(), '123', '123' ); +// +// root = UE.htmlparser('123'); +// equals( root.toHtml().toLowerCase(), '123', '123' ); +// +// root = UE.htmlparser('123'); +// equals( root.toHtml().toLowerCase(), '123
    ', '123', '123' ); +// +// /*补前面的标签*/ +// root = UE.htmlparser('123'); +// equals( root.toHtml().toLowerCase(), '123', '123' ); +// +// root = UE.htmlparser('123'); +// equals( root.toHtml().toLowerCase(), '123', '123' ); +// /*补全tr前面的标签*/ +// root = UE.htmlparser('123'); +// equals( root.toHtml().toLowerCase(), '123', '123--删除tr前后的标签,前面有文本' ); +// /*补全table前面的标签*/ +// root = UE.htmlparser('123'); +// equals( root.toHtml().toLowerCase(), '123', '123--删除table前后的标签,前面有文本' ); +// /*复杂结构*/ +// root = UE.htmlparser('456'); +// equals( root.toHtml().toLowerCase(), '
    123
    123
    456
    ', '456' ); +// +// root = UE.htmlparser(''); +// equals( root.toHtml().toLowerCase(), '
    123
    hello1hello2
    hello1hello2
    ', '解析hello1hello2' ); +// +// root = UE.htmlparser(''); +// equals( root.toHtml().toLowerCase(), '
    hello1hello2
    hello1hello2
    ', '解析' ); +// +// root = UE.htmlparser('
    hello1hello2
    123'); +// equals( root.toHtml().toLowerCase(), '
    123', '123' ); +//}); + +test( '补全不完整li', function() { + var root = UE.htmlparser('
    1. sdf
    2. sdfsdf
    '); + equals(root.toHtml().replace(/[ ]+>/g,'>'),'
    1. sdf
    2. sdfsdf
    ','补全u,em'); + root = UE.htmlparser('
    1. sdf
      • a
      • b
      • c
    2. jkl
    '); + equals(root.toHtml().replace(/[ ]+>/g,'>'),'
    1. sdf
      • a
      • b
      • c
    2. jkl
    ','补全li'); + root = UE.htmlparser('
  • 123'); + equals(root.toHtml().replace(/[ ]+>/g,'>'), '
    • 123
    ', '
  • 123--补全li的parent--ul,前面有文本' ); + /*补ul的child*/ + root = UE.htmlparser('
      123'); + equals(root.toHtml().replace(/[ ]+>/g,'>'), '
      • 123
      ', '
        123--补全ul的child--li,前面有文本' ); + /*补li开始标签*/ + root = UE.htmlparser('123'); + equals(root.toHtml().replace(/[ ]+>/g,'>'), '123', '123--删掉标签' ); +}); + +test( '属性引号问题', function() { + var root = UE.htmlparser(''); + equals(root.toHtml().replace(/[ ]+>/g,'>'),''); + root = UE.htmlparser(""); + equals(root.toHtml().replace(/[ ]+>/g,'>'),''); + root = UE.htmlparser(''); + equals(root.toHtml().replace(/[ ]+>/g,'>'),''); +}); + +test( '大小写', function() { + var root = UE.htmlparser('

  • '); + equals(root.toHtml().replace(/[ ]+>/g,'>'),'

    '); + root = UE.htmlparser('
    1. sdf
    2. sdfsdf
    '); + equals(root.toHtml().replace(/[ ]+>/g,'>'),'
    1. sdf
    2. sdfsdf
    ','补全u,em'); + root = UE.htmlparser(''); + equals(root.toHtml().replace(/[ ]+>/g,'>'),''); +}); + +test( '裸字', function() { + var root = UE.htmlparser('sdfasdfasdf'); + equals(root.toHtml().replace(/[ ]+>/g,'>'),'sdfasdfasdf'); +}); + +test( '只有结束标签的情况', function() { + var root = UE.htmlparser('

    hello1

    hello2

    '); + equals(root.toHtml().replace(/[ ]+>/g,'>'),'

    hello1

    hello2

    '); +}); + +test( '开始标签与后面文本的空格过滤,其他不过滤inline节点之间的空格,过滤block节点之间的空格', function () { + /*inline节点之间的空格要留着*/ + var root = UE.htmlparser('baidu hello '); + equals(root.toHtml().replace(/[ ]+>/g,'>'),'baidu hello '); + root = UE.htmlparser(' hello he llo2 hello '); + equals(root.toHtml().replace(/[ ]+>/g,'>'),' hello he llo2 hello ' ); + /*block节点之间的空格不要留着 这个太纠结,不必了。会把ol拆开,后面的变成ul*/ +// html = '
    1. li_test
    2. li test2
    '; +// node = serialize.parseHTML( html ); +// node = serialize.filter( node ); +// equal( serialize.toHTML( node ), '
    1. li_test 
    2. li test2 
     ' ); +} ); + +/*特殊字符需要转义*/ +test( '文本包含特殊字符,如尖括号', function () { + var root = UE.htmlparser(''); + equals(root.toHtml().replace(/[ ]+>/g,'>'),'<td  hello', '字符转义' ); +} ); + +test( 'br', function () { + var root = UE.htmlparser('
    '); + equals(root.toHtml().replace(/[ ]+>/g,'>'),'
    ', '对br不操作'); + root = UE.htmlparser('
    '); + equals(root.toHtml().replace(/[ ]+>/g,'>'),'
    ', '补充br后面的斜杠'); +} ); + +/*考察标签之间嵌套关系*/ +test( '复杂标签嵌套', function() { + var root = UE.htmlparser('hello1

    hello2

    hello3

    hello4'); + equals(root.toHtml().replace(/[ ]+>/g,'>'),'hello1

    hello2

    hello3

    hello4

    '); +} ); + +test( 'trace 1727:过滤超链接后面的空格', function () { + var root = UE.htmlparser('baidu ddd'); + equals(root.toHtml().replace(/[ ]+>/g,'>'),'baidu  ddd','过滤超链接后面的空格'); +} ); + +//test( '转换img标签', function () { +// var root = UE.htmlparser(''); +// var spa=ua.browser.ie==6?' orgSrc="'+te.obj[1].options.UEDITOR_HOME_URL+'themes/default/images/spacer.gif"':''; +// equals(root.toHtml().replace(/[ ]+>/g,'>'), '' , '转换img标签'); +//} ); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/core/localstorage.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/core/localstorage.js new file mode 100644 index 000000000..000dc7e97 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/core/localstorage.js @@ -0,0 +1,46 @@ +module("core.localstorage"); + +test('用 UE.LocalStorage 对字符串做保存/读取/删除操作', function () { + + var str = '1234567890-=!@#$%^&*()_+qwertyuiopasdfghjklzxcvbnm,./<>?;\':"[]\\{}|'; + UE.LocalStorage.saveLocalData('test_string1', str); + equal(UE.LocalStorage.getLocalData('test_string1'), str, "保存内容,并读取内容"); + + UE.LocalStorage.saveLocalData('test_string2', str); + UE.LocalStorage.removeItem('test_string2'); + equal(UE.LocalStorage.getLocalData('test_string2'), undefined, "保存内容,并删除内容"); + +}); + +test('偏好设置相关方法setPreferencesue、getPreferences、removePreferences', function () { + + var editor = te.obj[1]; + + var str = '1234567890-=!@#$%^&*()_+qwertyuiopasdfghjklzxcvbnm,./<>?;\':"[]\\{}|'; + editor.setPreferences('test_string', str); + equal(editor.getPreferences('test_string'), str, "保存字符串,并读取内容"); + + var obj = { + nul: null, + boo1: true, + boo2: false, + str: 'aaa', + arr: [1, '2', 'a'], + obj: {k1:1, k2:'2', k3:'a'} + }; + editor.setPreferences('test_object', obj); + same(editor.getPreferences('test_object'), obj, "保存键值对象,并读取内容"); + + editor.setPreferences('test_boolean', true); + equal(editor.getPreferences('test_boolean'), true, "保存布尔值,并读取内容"); + + var arr = [1, '2', 'a']; + editor.setPreferences('test_string', arr); + same(editor.getPreferences('test_string'), arr, "保存数组,并读取内容"); + + var tmpStr = 'string_content'; + editor.setPreferences('test_delete', tmpStr); + editor.removePreferences('test_delete'); + equal(editor.getPreferences('test_delete'), undefined, "保存字符串,并删除内容"); + +}); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/core/node.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/core/node.js new file mode 100644 index 000000000..a77e2f8ed --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/core/node.js @@ -0,0 +1,218 @@ +module( 'core.node' ); + +test( 'createElement', function() { + var uNode = UE.uNode; + var node = uNode.createElement('div'); + equals(node.tagName,'div','空div ——tagname'); + equals(node.type,'element','空div ——节点类型'); + node = uNode.createElement('
    sdfadf
    '); + equals(node.tagName,'div','非空div——tagname'); + equals(node.children[0].data,'sdfadf','非空div——数据内容'); +}); + +test( 'getNodeById', function() { + var uNode = UE.uNode; + var node = uNode.createElement('
    sdfadf
    '); + node = node.getNodeById('bb'); + equals(node.getAttr('id'),'bb','获取标签id'); + node = uNode.createElement('
    sdfadf
    '); + node = node.getNodeById('cc'); + equals(node.getAttr('id'),'cc','获取标签id'); +}); + +test( 'getNodesByTagName', function() { + var uNode = UE.uNode; + var node = uNode.createElement('
    sdfadf
    '); + var nodelist = node.getNodesByTagName('div'); + equals(nodelist.length,2,'div节点列表长度'); + equals(node.innerHTML().replace(/[ ]+>/g,'>'),'
    sdfadf','innerHTML内容'); +}); + +test( 'innerHTML', function() { + var uNode = UE.uNode; + var node = uNode.createElement('
    sdfadf
    '); + node.innerHTML('
    '); + var nodelist =node.getNodesByTagName('div'); + equals(nodelist.length,3,'div节点列表长度'); + for(var i= 0,ci;ci=nodelist[i++];){ + ci.tagName = 'p'; + } + equals(node.innerHTML(),'

    ','innerHTML内容'); + node = uNode.createElement('
    '); + node.innerHTML('asdf'); + equals(node.innerHTML(),'asdf','innerHTML内容'); +}); + +test( 'innerText', function() { + var tmp = new UE.uNode.createElement('area'); + tmp.innerHTML('

    '); + equals(tmp.innerText(),tmp,'标签类型特殊'); + tmp = new UE.uNode.createText(''); + tmp.innerHTML('

    '); + equals(tmp.innerText(),tmp,'对象类型不为element'); + var uNode = UE.uNode; + var node = uNode.createElement('
    sdfadf
    '); + node.innerHTML('

    dfsdfsdfeeesdf

    '); + equals(node.innerText(),'dfsdfsdfeeesdf','获取标签中纯文本'); + node.innerText('sdf'); + equals(node.innerHTML(),'sdf','设置文本节点'); +}); + +test( 'getData', function() { + var tmp = new UE.uNode.createElement('div'); + equals(tmp.getData(),'','element元素'); + tmp = new UE.uNode.createText('askdj'); + equals(tmp.getData(),"askdj",'其他类型'); +}); + +test( 'appendChild && insertBefore', function() { + var uNode = UE.uNode; + var node = uNode.createElement('
    sdfadf
    '); + node.innerHTML('

    '); + equals(node.innerHTML().replace(/[ ]+>/g,'>'),'

    ','补全html标签'); + var tmp = uNode.createElement('div'); + node.appendChild(tmp); + equals(node.innerHTML().replace(/[ ]+>/g,'>'),'

    ','appendChild'); + node.insertBefore(tmp,node.firstChild()); + equals(node.innerHTML().replace(/[ ]+>/g,'>'),'

    ','insertBefore'); + node.appendChild(tmp); + equals(node.innerHTML().replace(/[ ]+>/g,'>'),'

    ','appendChild'); +}); + +test( 'replaceChild && setAttr', function() { + var uNode = UE.uNode; + var node = uNode.createElement('
    sdfadf
    '); + node.innerHTML('

    '); + var tmp = uNode.createElement('p'); + tmp.setAttr({'class':'test','id':'aa'}); + node.insertBefore(tmp,node.lastChild()); + equals(node.innerHTML().replace(/[ ]+>/g,'>'),'

    ','setAttr不为空'); + node.replaceChild(uNode.createElement('div'),tmp); + equals(node.innerHTML().replace(/[ ]+>/g,'>'),'

    ','replaceChild'); + + node.removeChild(node.lastChild(),true); + tmp = uNode.createElement('p'); + tmp.setAttr(); + node.insertAfter(tmp,node.lastChild()); + equals(node.innerHTML().replace(/[ ]+>/g,'>'),'

    ','setAttr为空'); + node.innerHTML('

    '); + tmp = uNode.createElement('div'); + node.appendChild(tmp); + node.replaceChild(node.firstChild(),tmp); + equals(node.innerHTML().replace(/[ ]+>/g,'>'),'

    ','replaceChild'); +}); + +test( 'insertAfter', function() { + var uNode = UE.uNode; + var node = uNode.createElement('
    sdfadf
    '); + node.innerHTML('

    '); + var tmp = uNode.createElement('div'); + node.appendChild(tmp); + node.insertAfter(tmp,node.firstChild()); + equals(node.innerHTML().replace(/[ ]+>/g,'>'),'

    ','在第一个子节点后插入'); +}); + +test( 'getStyle', function() { + var uNode = UE.uNode; + var node = uNode.createElement('div'); + node.innerHTML('
    '); + node = node.firstChild(); + equals(node.getStyle(''),'','空cssStyle'); + node.innerHTML('
    '); + node = node.firstChild(); + equals(node.getStyle('border'),'1px solid #ccc','有border,取border样式'); + node.innerHTML('
    '); + node = node.firstChild(); + equals(node.getStyle('color'),'','无color样式,取color样式'); + node.innerHTML('
    '); + node = node.firstChild(); + equals(node.getStyle('color'),'#ccc','有2个样式,取其一'); +}); + +test( 'setStyle', function() { + var uNode = UE.uNode; + var node = uNode.createElement('div'); + node.innerHTML('
    '); + node = node.firstChild(); + node.setStyle('border','2px solid #ccc'); + equals(node.getAttr('style'),'border:2px solid #ccc;color:#ccc','修改样式中的一个'); + node.setStyle({ + 'font':'12px', + 'background':'#ccc' + }); + equals(node.getAttr('style'),'background:#ccc;font:12px;border:2px solid #ccc;color:#ccc','添加新样式'); + node.setStyle({ + 'font':'', + 'background':'', + 'border':'', + 'color':'' + }); + equals(node.getAttr('style'),undefined,'清空样式'); + node.setStyle('border',''); + equals(node.getAttr('style'),"border:<script>alert("")</script>;",'脚本'); + equals(node.toHtml(),'
    ','脚本转html'); + node.innerHTML('
    asdfasdfsdf
    '); + node.removeChild(node.firstChild(),true); + equals(node.toHtml(),'
    asdfasdfsdf
    ','移除子节点'); + node.innerHTML('
    '); + node.firstChild().setStyle('border'); + equals(node.firstChild().toHtml(),'
    ','删除分号'); + node.innerHTML('
    '); + equals(node.firstChild().toHtml(),'
    '); + + node.innerHTML('
    '); + node.firstChild().setStyle('border'); + + equals(node.firstChild().toHtml(),'
    '); + node.innerHTML('
    '); + node.firstChild().setStyle('border'); + equals(node.firstChild().toHtml(),'
    '); + node.firstChild().setStyle('color'); + equals(node.firstChild().toHtml(),'
    '); + node.firstChild().setStyle('background-color'); + equals(node.firstChild().toHtml(),'
    '); +}); + +test( 'getIndex', function() { + var uNode = UE.uNode; + var node = uNode.createElement('div'); + node.innerHTML('
    asdfasdfsdf
    ') + node.removeChild(node.firstChild(),true); + var tmp = new UE.uNode.createElement('div'); + node.appendChild(tmp); + equals(tmp.getIndex(),2,'节点索引'); +}); + +test( 'traversal', function() { + var uNode = UE.uNode; + var node = uNode.createElement('div'); + node.innerHTML('
    asdfasdfsdf
    ') + var count = 0; + node.traversal(function(node){ + count++; + }); + equals(count,4); + count = 0; + node.traversal(function(node){ + if(node.type == 'text'){ + count++ + } + }); + equals(count,2); + node.traversal(function(node){ + if(node.type == 'text'){ + + node.parentNode.removeChild(node) + } + }); + equals(node.toHtml(),'
    '); + node.innerHTML('
    asdfasdfsdf
    '); + node.traversal(function(node){ + if(node.type == 'text'){ + var span = uNode.createElement('span'); + node.parentNode.insertBefore(span,node); + span.appendChild(node); + } + }); + equals(node.toHtml(),'
    asdfasdfsdf
    '); +}); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/core/plugin.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/core/plugin.js new file mode 100644 index 000000000..e10ba98fc --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/core/plugin.js @@ -0,0 +1,30 @@ +module( 'core.plugin' ); + +test( 'register', function() { + UE.plugin.register('test',function(){ + this.testplugin = true; + }); + $('
    ').appendTo(document.body); + var editor = UE.getEditor('ue'); + stop(); + editor.ready(function () { + ok(this.testplugin); + editor.destroy(); + $('#ue').remove() + start(); + }); +}); +test( 'load', function() { + UE.plugin.register('test',function(){ + this.testplugin = true; + }); + $('
    ').appendTo(document.body); + var editor = UE.getEditor('ue',{ + test:false + }); + stop(); + editor.ready(function () { +// ok(!this.testplugin); todo + start(); + }); +}); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/core/tools.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/core/tools.js new file mode 100644 index 000000000..3be2d871b --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/core/tools.js @@ -0,0 +1,50 @@ +(function () { + function mySetup() { + for (var config in window.UEDITOR_CONFIG) { + if (typeof(window.UEDITOR_CONFIG[config]) == 'string') + window.UEDITOR_CONFIG[config] = window.UEDITOR_CONFIG[config].replace('_test/tools/br/', ''); + } + + var div = document.body.appendChild(document.createElement('div')); + div.id = 'test1'; + var utils = baidu.editor.utils; + var editor = new baidu.editor.Editor({'UEDITOR_HOME_URL':'../../../', 'autoFloatEnabled':false,initialContent:'tool'}); + var iframe = document.createElement('iframe'); + document.body.appendChild(iframe); + iframe.id = 'iframe'; + var range = new baidu.editor.dom.Range(document); + var domUtils = baidu.editor.dom.domUtils; + var div_dom = document.body.appendChild(document.createElement('div')); + div_dom.id = 'test'; + te.dom.push(div); + te.dom.push(iframe); + te.dom.push(div_dom); + te.obj.push(utils); + te.obj.push(editor); + te.obj.push(range); + te.obj.push(domUtils); + } + var _d = function () { + + if (te) { + if (te.dom && te.dom.length) { + for (var i = 0; i < te.dom.length; i++) { + if (te.dom[i] && te.dom[i].parentNode) + te.dom[i].parentNode.removeChild(te.dom[i]); + } + + } + } + te.dom = []; + te.obj = []; + }; + var s = QUnit.testStart, d = QUnit.testDone; + QUnit.testStart = function () { + s.apply(this, arguments); + mySetup(); + }; + QUnit.testDone = function () { + _d(); + d.apply(this, arguments); + }; +})() \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/core/utils.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/core/utils.js new file mode 100644 index 000000000..5d98adba1 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/core/utils.js @@ -0,0 +1,547 @@ +module("core.utils"); + +test('cssRule', function () { + var utils = te.obj[0]; + utils.cssRule('test1', '.test{width:300px;}'); + var style = utils.cssRule('test1'); + ok(/^\.test/.test(style)); + utils.cssRule('test1', ''); + style = utils.cssRule('test1'); + ok(!style); + var div = te.dom[2]; + div.innerHTML = 'sdfsdf'; + utils.cssRule('style_test', '.test{display:block}'); + utils.cssRule('style_test', '.test{font-size:48px}'); + var block = UE.dom.domUtils.getComputedStyle(div.firstChild, 'display'); + equals(block, 'inline'); + //删除样式 + utils.cssRule('style_test', ''); + equals(UE.dom.domUtils.getComputedStyle(div.firstChild, 'font-size'), '16px'); +}); + +test("makeInstance", function () { + var utils = te.obj[0]; + var obj = { + s: 1, + str: "makeInstance" + }, str = "makeInstance"; + var ins = utils.makeInstance(obj); + var ins1 = utils.makeInstance(str); + equals(ins.s, 1, "ins.s"); + equals(ins.str, "makeInstance", "ins.str"); + same(ins1, {}, "null"); + same(utils.makeInstance(null), {}, "null"); +}); +test("isArray--普通对象", function () { + var utils = te.obj[0]; + var arr = [ '1', '2' ], ob = {}, str = "array", fun = function () { + }; + var div = te.dom[0]; + ok(utils.isArray(arr), 'arr is a array'); + ok(!utils.isArray(ob), 'ob is not a array'); + ok(!utils.isArray(str), 'str is not a array'); + ok(!utils.isArray(fun), 'fun is not a array'); + ok(!utils.isArray(null), 'null is not a array'); + ok(!utils.isArray(div), 'dom element is not a array'); +}); + +test("isArray--类数组对象", function () { + var utils = te.obj[0]; + var arrayLike = { + 0: '0', + 1: '1', + 2: '2', + length: 3 + }; + var div = te.dom[0]; + div.innerHTML = 'xxxxx

    '; + ok(!utils.isArray(arrayLike), '类数组对象不是数组'); + ok(!utils.isArray(div.childNodes), 'nodeList 不是数组'); + +}); + +test("inherits", function () { + var utils = te.obj[0]; + var superClass = function () { + }; + var subClass = function () { + }; + expect(4); + var index = 0; + superClass.prototype.name = "superClass"; + superClass.prototype.methodSuper = function () { + ok(true, "method in superClass is called"); + }; + superClass.prototype.method = function () { + ok(false, "I am in superClass"); + }; + subClass.prototype.name = "subClass"; + subClass.prototype.methodSub = function () { + ok(true, "method in subClass is called"); + }; + subClass.prototype.method = function () { + ok(true, "I am in subClass"); + }; + utils.inherits(subClass, superClass); + var sub = new subClass(); + /*子类自己的名字,父类的被覆盖*/ + equal(sub.name, "subClass", "the name of subClass"); + /*从父类中继承的方法*/ + sub.methodSuper(); + /*子类自己的方法*/ + sub.methodSub(); + /*覆盖父类中的method方法*/ + sub.method(); +}); + + +test("bind", function () { + var utils = te.obj[0]; + var first_object = { num: 4 }; + var second_object = { num: 2 }; + + function multiply(mult) { + return this.num * mult; + } + + var first_multiply = utils.bind(multiply, first_object); + equal(first_multiply(5), 20, "first_object"); // returns 4 * 5 + var second_multiply = utils.bind(multiply, second_object); + equal(second_multiply(5), 10, "second_object"); +}); + +test('defer--一个defer', function () { + var utils = te.obj[0]; + var delay = 100; + expect(1); + stop(); + /*defer返回一个闭包,算defer不准,chrome下会 相差300多ms,没办法判断延时是否准确*/ + var stime = +new Date(); + utils.defer(function () { + ok(1, '检查回调函数是否触发'); + start(); + }, delay)(); +}); + +test('defer--多个defer', function () { + var utils = te.obj[0]; + var delay = 40; + stop(); + expect(2); + utils.defer(function () { + ok(true, '第一个触发'); + }, delay)(); + + utils.defer(function () { + ok(true, '第二个触发'); + start(); + }, delay)(); +}); + +/*若互斥,则前一个注册的setTimeout事件被删除*/ +test('defer--考虑互斥', function () { + var utils = te.obj[0]; + var delay = 20; + stop(); + expect(1); + /*exclusion=true*/ + var defer = utils.defer(function () { + ok(1, '检查回调函数是否在规定的时间内触发'); + }, delay, true); + defer(); + //第一个defer会被删掉 + defer(); + setTimeout(function () { + start(); + }, 100); +}); + +test("extend--true", function () { + var utils = te.obj[0]; + var obj1 = {a: 3, b: "str", fun: function () { + ok(true, "fun"); + }, n: null}; + var obj2 = {a: 2, c: 1}; + utils.extend(obj2, obj1, true); + equal(obj2.a, 2, "obj2 a"); + equal(obj2.b, "str", "obj2 str"); + equal(obj2.c, 1, "obj2 c"); + obj2.fun(); + equal(obj2.n, null, "obj2 n null"); +}); +test("extend--false", function () { + var utils = te.obj[0]; + var obj1 = {a: 3, b: "str", fun: function () { + ok(true, "fun"); + }, n: null}; + var obj2 = {a: 2, c: 1}; + utils.extend(obj2, obj1, false); + equal(obj2.a, 3, "obj2 a"); + equal(obj2.b, "str", "obj2 str"); + equal(obj2.c, 1, "obj2 c"); + obj2.fun(); + equal(obj2.n, null, "obj2 n null"); +}); +test('indexOf', function () { + var utils = te.obj[0]; + var s = [ 1, 2, 3, 4, 5 ]; + equals(utils.indexOf(s, 3), 2); + equals(utils.indexOf(s, 6), -1); + equals(utils.indexOf(s, 5), 4); + equals(utils.indexOf(s, 3, 3), -1); + equals(utils.indexOf(s, 3, 3), -1); +}); +test('removeItem&&itemexist', function () { + var utils = te.obj[0]; + var s = [ 1, 2, 3, 4, 5 , 4, 3]; + equal(s[5], 4, "before remove 4"); + utils.removeItem(s, 4); + equal(s.length, 5, "4 be removed"); + equal(s[4], 3, "4 be removed"); +}); + +test('removeItem&&itemnotexist', function () { + var utils = te.obj[0]; + var s = [ 1, 2, 3, 4, 5 , 4]; + utils.removeItem(s, 6); + equal(s.length, 6, "itemnotexist"); +}); + +test("trim", function () { + var utils = te.obj[0]; + var s = ' sss '; + equals(utils.trim(s), 'sss', "两端有空格"); + s = " xxx "; + equal(utils.trim(s), ' xxx', "包含 ");// 不能被捕获 + s = "string"; + equal(utils.trim(s), "string", '没有 和空格'); +}); +test('listToMap', function () { + var utils = te.obj[0]; + var s = "listToMap"; + var re = utils.listToMap(s); + equal(re.listToMap, 1, "listToMap"); +}); +test('list,To,Map', function () { + var utils = te.obj[0]; + var s = "list,To,Map"; + var re = utils.listToMap(s); + equal(re.list, 1, "list"); + equal(re.To, 1, "list"); + equal(re.Map, 1, "Map"); +}); +test('listToMap ""', function () { + var utils = te.obj[0]; + var s = ""; + var re = utils.listToMap(s); + equal(re.toString(), {}, "{}"); +}); +test('listToMap null', function () { + var utils = te.obj[0]; + var s = null; + var re = utils.listToMap(s); + equal(re.toString(), {}, "{}"); +}); +test('listToMap numstring', function () { + var utils = te.obj[0]; + var s = "123333"; + var re = utils.listToMap(s); + equal(re[123333], 1, "num"); +}); +test('unhtml 字符转义', function () { + var utils = te.obj[0]; + var str = '

    "as&cd"

    '; + var str_html = utils.unhtml(str); + equal(str_html, '<p>"as&cd"</p>', '转义字符成功'); + str = 'border:<script>alert("")</script>"' + equal(utils.unhtml(str), 'border:<script>alert("")</script>"', '转义字符成功'); + str = "'"; + equal(utils.unhtml('比如小这个汉字的unicode编码'), '比如小这个汉字的unicode编码'); + equal(utils.unhtml('比如&#<23567;这个汉字的unicode编码<>'), '比如&#<23567;这个汉字的unicode编码<>') +}); +test('html 反转义', function () { + var utils = te.obj[0]; + var str_html = '<p>"as&cd"</p>'; + var str = utils.html(str_html); + equal(str, '

    "as&cd"

    ', '反转义成功'); +}); +test('unhtml null ""', function () { + var utils = te.obj[0]; + var s = null; + equal(utils.unhtml(s), "", "unhtml null"); + s = ''; + equal(utils.unhtml(s), "", "unhtml null"); +}); +test('cssStyleToDomStyle', function () { + var utils = te.obj[0]; + equal(utils.cssStyleToDomStyle("cssFloat").toLowerCase(), "cssfloat", "cssFloat"); + if (ua.browser.ie && ua.browser.ie < 9) { + equal(utils.cssStyleToDomStyle("float").toLowerCase(), "stylefloat", "float"); + } else { + equal(utils.cssStyleToDomStyle("float").toLowerCase(), "cssfloat", "float"); + } + equal(utils.cssStyleToDomStyle("styleFloat").toLowerCase(), "stylefloat", "styleFloat"); +}); + +//zhuwenxuan add +test("isEmptyObject", function () { + var utils = te.obj[0]; + var obj = { + n: 1 + }; + equal(false, utils.isEmptyObject(obj)); + equal(true, utils.isEmptyObject([])); + equal(true, utils.isEmptyObject("")); +}); +//dong +test("fixColor", function () { + var utils = te.obj[0]; + equal('#953734', utils.fixColor("color", 'rgb(149, 55, 52)'), 'fixColor'); +}); +test("sort", function () { + var utils = te.obj[0]; + same(["a", "df", "sdf", "asdf"], utils.sort(['a', 'asdf', 'df', 'sdf'], function (a, b) { + if (a.length > b.length) + return 1; + else return 0; + }), 'sort'); +}); +test("domReady", function () { + var utils = te.obj[0]; + expect(1); + utils.domReady(function () { + ok(1, 'domReady') + }); +}); +test('4个padding属性', function () { +// var css = 'padding-bottom:0px; margin:0px 0px 20px; padding-left:0px; padding-right:4px; padding-top:0px'; + /*上下相同,左右相同*/ + var css = 'padding-bottom:3px;padding-left:2px;padding-right:2px;padding-top:3px'; + var result = UE.utils.optCss(css); + equal(result, 'padding:3px 2px;', '上下相同,左右相同'); + /*上下不同,左右相同*/ + css = 'padding-bottom:2px;padding-left:2px;padding-right:2px;padding-top:3px'; + result = UE.utils.optCss(css); + equal(result, 'padding:3px 2px 2px;', '上下不同,左右相同'); + /*只有2个属性*/ + css = 'padding-bottom:2px;padding-left:2px;'; + result = UE.utils.optCss(css); + equal(result, 'padding-bottom:2px;padding-left:2px;', '2个属性就不合'); +}); + +test('4个margin属性', function () { + /*上下相同,左右相同*/ + var css = 'margin-bottom:3px;margin-left:2px;margin-right:2px;margin-top:3px'; + var result = UE.utils.optCss(css); + equal(result, 'margin:3px 2px;', '上下相同,左右相同'); + css = 'margin-bottom:2px;margin-left:2px;margin-right:2px;margin-top:2px'; + result = UE.utils.optCss(css); + equal(result, 'margin:2px;', '全相同'); + /*上下不同,左右相同*/ + css = 'margin-bottom:2px;margin-left:2px;margin-right:2px;margin-top:3px'; + result = UE.utils.optCss(css); + equal(result, 'margin:3px 2px 2px;', '上下不同,左右相同'); + /*只有1个属性*/ + css = 'margin-top:2px;'; + result = UE.utils.optCss(css); + equal(result, 'margin-top:2px;', '1个属性就不合'); +}); + +test('合并;的问题', function () { + equal(UE.utils.optCss('font-size:12px;";<dssdfs>;;'), 'font-size:12px;";<dssdfs>;', ''); +}); +//test( '合并border相关属性', function () { +//// var css = 'border-width:thin medium;' + //只有border-width +//// 'border-top-color:red;border-bottom-color:red;border-left-color:red;' + //3个分属性相同,不应当合 +//// 'border-right-style:hidden;border-bottom-style:hidden;border-left-style:hidden;border-top-style:hidden'; //4个分属性相同,应当合 +//// var result = UE.utils.optCss( css ); +//// equal( result, 'border-width:thin medium;border-top-color:red;border-bottom-color:red;border-left-color:red;border-style:hidden' ); +//// /*border属性, border不能分别定义4个边框的宽度,颜色和样式, +//// 只能统一定义,不可以对四个边设置不同的值,和margin与padding是不同的(后两者可以分别定义四个边的值).*/ +//// css = 'border-top:2px hidden red;border-right:2px hidden red'; +//// result = UE.utils.optCss(css ); +//// equal(result,css,'border2个属性不合'); +//// /*4个属性都相同,合*/ +//// css = 'border-top:2px hidden red;border-right:2px hidden red;border-left:2px hidden red;border-bottom:2px hidden red'; +//// result = UE.utils.optCss(css ); +//// equal(result,'border:2px hidden red;','4个属性都相同,合'); +//// /*4个属性不同,不合*/ +//// css = 'border-top:2px hidden red;border-right:3px hidden red;border-left:2px hidden red;border-bottom:2px hidden red'; +//// result = UE.utils.optCss(css ); +//// equal(result,'border:2px hidden red;','4个属性不同,不合'); +// var css = 'border-image:initial;' +//} ) ; +// +test('margin,border,padding属性混杂', function () { + var css = 'margin-bottom:3px;margin-left:2px;margin-right:2px;margin-top:3px;padding:4px;border-image:initial;border-top-color:red;'; + var result = UE.utils.optCss(css); + equal(result, 'padding:4px;border-top-color:red;margin:3px 2px;', 'margin,border,padding属性混同'); + +}); + +test('each 遍历方法', function () { + var div = te.dom[0]; + div.innerHTML = ''; + UE.utils.each(div.getElementsByTagName('span'), function (node, i) { + equal(node.tagName, 'SPAN', '遍历nodelist'); + }); + var count = 0; + UE.utils.each(div.getElementsByTagName('span'), function (node, i) { + count++; + if (node.id == 'a') + return false + }); + equal(count, 3); + UE.utils.each(['a', 'b'], function (v, i) { + equal(v, ['a', 'b'][i], '遍历数组'); + }); + UE.utils.each({a: 1, b: 2}, function (v, k) { + equal(v, {a: 1, b: 2}[k], '遍历对象'); + }); +}); +test('clone 转换', function () { + var obj = {a: 1}; + var obj1 = UE.utils.clone({a: 1}); + obj.a = 2; + equal(obj1.a, 1); + obj = { + a: { + b: 1 + }, + c: [1, 2] + } + obj1 = UE.utils.clone(obj); + obj.a.b = 2; + equal(obj1.a.b, 1); + obj.c[1] = 3; + equal(obj1.c[1], 2); + + +}); +test('transUnitToPx 转换', function () { + equal(UE.utils.transUnitToPx('20pt'), '27px'); + equal(UE.utils.transUnitToPx('0pt'), '0'); +}); + +test('RegExp', function () { + var reg = new RegExp(".*"); + equal(ok(utils.isRegExp(reg), 'reg is a RegExp')); +}); + +test('isDate', function () { + var date = new Date(); + equal(ok(utils.isDate(date), 'date is a Date')); +}); + +test('isCrossDomainUrl', function () { + + var l = location; + + ok(!utils.isCrossDomainUrl(location.href), 'location.href 不跨域'); + + if (l.port == '') { + ok(!utils.isCrossDomainUrl(l.protocol + '//' + l.hostname + ':80/ueditor/'), '本地没端口,80端口不跨域'); + } + + if (l.port == '80') { + ok(!utils.isCrossDomainUrl(l.protocol + '//' + l.hostname + '/ueditor/'), '本地没80端口,无端口不跨域'); + } + + if (l.protocol == 'http:') { + ok(utils.isCrossDomainUrl('https://' + l.host + '/ueditor/'), '本地http协议,https协议跨域'); + } else { + ok(utils.isCrossDomainUrl('http://' + l.host + '/ueditor/'), '本地不是http协议,http协议跨域'); + } + + ok(utils.isCrossDomainUrl(l.protocol + '//www.baidu.com' + ':' + l.port), '域名不一致跨域'); + +}); + +test('formatUrl', function () { + + var url1 = 'http://localhost/a.html?&key1=value1&&key2=value2&&&&&&&&&key3=value3&#hash'; + var url2 = 'http://localhost/a.html?&key1=value1&&key2=value2&&&&&&&&&key3=value3&'; + + equal(utils.formatUrl(url1), 'http://localhost/a.html?key1=value1&key2=value2&key3=value3#hash', '格式化url'); + equal(utils.formatUrl(url2), 'http://localhost/a.html?key1=value1&key2=value2&key3=value3', '格式化url'); + +}); + +test('str2json', function () { + + same(utils.str2json('{"a":11,"b":"22","c":"cc","d":[1,"2","a",{"a":"aa"}],"e":{"k1":1,"k2":"2","k3":"a","k4":{"a":"aa"}}}'), + {"a": 11, "b": "22", "c": "cc", "d": [1, "2", "a", {"a": "aa"}], "e": {"k1": 1, "k2": "2", "k3": "a", "k4": {"a": "aa"}}}, + '字符串转json对象'); + +}); + +test('json2str', function () { + + equal(utils.json2str({"a": 11, "b": "22", "c": "cc", "d": [1, "2", "a", {"a": "aa"}], "e": {"k1": 1, "k2": "2", "k3": "a", "k4": {"a": "aa"}}}), + '{"a":11,"b":"22","c":"cc","d":[1,"2","a",{"a":"aa"}],"e":{"k1":1,"k2":"2","k3":"a","k4":{"a":"aa"}}}', + 'json对象转字符串'); + +}); +test('json2str 不使用原生方法', function () { + stop(); + var j = window.JSON; + var flag = 0; + ua.readFile("../../../_test/coverage/core/utils.js", function (s) { + if(s===null)flag = 1; + window.JSON = null; + eval(s); + equal(utils.json2str({"a": 11, "b": "22", "c": "cc", "d": [1, "2", "a", {"a": "aa"}], "e": {"k1": 1, "k2": "2", "k3": "a", "k4": {"a": "aa"}}}), + '{"a":11,"b":"22","c":"cc","d":[1,"2","a",{"a":"aa"}],"e":{"k1":1,"k2":"2","k3":"a","k4":{"a":"aa"}}}', + 'json对象转字符串'); + + window.JSON = j; + + }); + if(flag){ + ua.readFile("../../../_src/core/utils.js", function (s) { + window.JSON = null; + eval(s); + equal(utils.json2str({"a": 11, "b": "22", "c": "cc", "d": [1, "2", "a", {"a": "aa"}], "e": {"k1": 1, "k2": "2", "k3": "a", "k4": {"a": "aa"}}}), + '{"a":11,"b":"22","c":"cc","d":[1,"2","a",{"a":"aa"}],"e":{"k1":1,"k2":"2","k3":"a","k4":{"a":"aa"}}}', + 'json对象转字符串'); + + window.JSON = j; + + }); + } + + setTimeout(function(){start();},50); +}); + +test('clearEmptyAttrs', function () { + var utils = te.obj[0]; + var ob = utils.clearEmptyAttrs({a: 1, b: ''}); + ok(!ob.hasOwnProperty('b'), 'clearEmptyAttrs'); +}); +test('serializeParam', function () { + + equal(utils.serializeParam({ + key1: 'value1', + key2: 'value2', + key3: 33, + key4: '44', + key5: true, + key6: null, + key7: undefined, + key8: [11, 22, '33', 'aa', true, null] + }), + 'key1=value1&' + + 'key2=value2&' + + 'key3=33&' + + 'key4=44&' + + 'key5=true&' + + 'key7=undefined&' + + 'key8[]=11&' + + 'key8[]=22&' + + 'key8[]=33&' + + 'key8[]=aa&' + + 'key8[]=true&' + + 'key8[]=null', + '序列化obj对象为GET请求字符串'); + +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/api.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/api.js new file mode 100644 index 000000000..a1593ffd2 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/api.js @@ -0,0 +1,43 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['api.js']) { + _$jscoverage['api.js'] = []; +} +_$jscoverage['api.js'].source = ["/**"," * 该文件定义了API文档所使用到的本地函数的说明"," * @file"," * @module Native"," */","","/**"," * 辅助接口说明"," * @module Native"," * @unfile"," */","","/**"," * 原生String对象, 字符串"," * @class String"," */","","/**"," * 原生Function对象, 函数"," * @class Function"," */","","/**"," * 原生Object对象, 普通对象"," * @class Object"," */","","/**"," * 原生Boolean对象, 布尔值"," * @class Boolean"," */","","/**"," * 原生Number对象, 数值"," * @class Number"," */","","/**"," * 原生NULL对象, 空"," * @class NULL"," */","","/**"," * 原生Array对象, 数组"," * @class Array"," */","","/**"," * 浏览器DOMNode, dom节点"," * @class Node"," */","","/**"," * 浏览器DOMElement, dom元素"," * @class Element"," */"]; diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/commands.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/commands.js new file mode 100644 index 000000000..9bd1f4b23 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/commands.js @@ -0,0 +1,43 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['commands.js']) { + _$jscoverage['commands.js'] = []; +} +_$jscoverage['commands.js'].source = ["//本文件非编辑器核心文件,仅适用于生成对应的命令接口文档","/**"," * @file"," * @name 编辑器命令接口"," * @short Commands"," * @desc"," *"," * UEditor中执行命令的统一调用格式为"," * <code>editor.execCommand(\"cmdName\"[,opt]);</code>"," *"," *"," * 检测当前命令是否可用的方法是"," * <code>editor.queryCommandState(\"cmdName\");</code>"," *"," *"," * 部分命令可以返回命令值,其格式为"," * <code>editor.queryCommandValue(\"cmdName\");</code>"," */","/**"," * 插入锚点"," * @name anchor"," * @grammar editor.execCommand(\"anchor\",\"name\"); //锚点的名字"," */","/**"," * 为当前选中文字添加粗体效果"," * @name bold"," * @grammar editor.execCommand(\"bold\");"," */","/**"," * 为当前选中文字添加斜体效果"," * @name italic"," * @grammar editor.execCommand(\"italic\");"," */","/**"," * 为当前选中文字添加下划线效果"," * @name underline"," * @grammar editor.execCommand(\"underline\");"," */","","","/**"," * 为当前选中文字添加删除线效果"," * @name strikethrough"," * @grammar editor.execCommand(\"strikethrough\");"," */","/**"," * 将当前选中文字转换成上标"," * @name superscript"," * @grammar editor.execCommand(\"superscript\");"," */","/**"," * 将当前选中文字转换成下标"," * @name subscript"," * @grammar editor.execCommand(\"subscript\");"," */","/**"," * 为当前选中文字添加颜色"," * @name foreColor"," * @grammar editor.execCommand(\"foreColor\",\"#ffffff\");"," */","/**"," * 为当前选中文字添加背景颜色"," * @name backColor"," * @grammar editor.execCommand(\"backColor\",\"#dddddd\");"," */","/**"," * 设置当前选中文字的字体"," * @name fontFamily"," * @grammar editor.execCommand(\"fontFamily\",\"微软雅黑,Microsoft YaHei\");"," */","/**"," * 设置当前选中文字的字号"," * @name fontSize"," * @grammar editor.execCommand(\"fontSize\",\"32px\");"," */","/**"," * 设置当前选区的段落格式,如p,h1,h2,h3,..."," * @name paragraph"," * @grammar editor.execCommand(\"paragraph\",\"h1\");"," */","/**"," * 将当前选区变换成有序或者无序列表"," * @name insert(Un)OrderedList"," * @grammar editor.execCommand(\"insertOrderedList\");"," */","/**"," * 设置当前选区的行间距"," * @name lineHeight"," * @grammar editor.execCommand(\"lineHeight\");"," */","/**"," * 设置当前选区中的字体对齐方式"," * @name justify"," * @grammar editor.execCommand(\"justify\",align); //align可为Left,Right,Center,Justify"," */","/**"," * 将当前选中文字中的字母转换成大写"," * @name toUppercase"," * @grammar editor.execCommand(\"toUppercase\");"," */","/**"," * 将当前选中文字中的字母转换成小写"," * @name toLowercase"," * @grammar editor.execCommand(\"toLowercase\");"," */","/**"," * 为当前选区所在的块级元素添加引用标记"," * @name blockquote"," * @grammar editor.execCommand(\"blockquote\");"," */","/**"," * 设置当前选区所在块级元素的文字输入方向"," * @name directionality"," * @grammar editor.execCommand(\"directionality\",dir); //dir可为LTR,RTL"," */","/**"," * 清除当前选中文字上的所有样式或者指定样式"," * @name removeFormat"," * @grammar editor.execCommand(\"removeFormat\") //根据ueditor.config.js里的removeFormatTags,removeFormatAttributes两个属性作为规则"," * @grammar editor.execCommand(\"removeFormat\",tags,style); //清除指定tags上的指定style"," * @example"," * editor.execCommand(\"removeFormat\",'span,a','color,background-color')"," */","/**"," * 切换纯文本粘贴模式"," * @name pastePlain"," * @grammar ue.execCommand(\"pastePlain\");"," */","/**"," * 开启格式刷功能"," * @name formatMatch"," * @grammar editor.execCommand(\"formatMatch\");"," */","/**"," * 清空文档"," * @name clearDoc"," * @grammar editor.execCommand(\"clearDoc\");"," */","/**"," * 删除当前选中文本"," * @name delete"," * @grammar editor.execCommand(\"delete\");"," */","/**"," * 全部选择"," * @name selectAll"," * @grammar editor.execCommand(\"selectAll\");"," */","/**"," * 撤销操作"," * @name undo"," * @grammar editor.execCommand(\"undo\");"," */","/**"," * 恢复操作"," * @name redo"," * @grammar editor.execCommand(\"redo\");"," */","/**"," * 对整个编辑文档进行自动排版"," * @name autoTypeset"," * @grammar editor.execCommand(\"autoTypeset\");"," */","/**"," * 在当前选区位置插入一段html代码,最基本功能。大部分其他插入命令都会调用此命令完成最后的插入"," * @name insertHtml"," * @grammar editor.execCommand(\"insertHtml\",\"欢迎使用UEditor!\")"," */","/**"," * 在当前选区位置插入一个超链接"," * @name link"," * @grammar editor.execCommand(\"link\",linkObj);"," * @example"," * editor.execCommand(\"link\",{"," * href: \"http://ueditor.baidu.com\", //超链地址,必选"," * _src: \"http://ueditor.baidu.com\", //UE内部使用参数,与href保持一致即可,可选"," * target: \"_self\", //目标窗口,可选"," * textValue: \"UEditor\", //链接显示文本,可选"," * title: \"百度开源富文本编辑器UEditor官网\" //标题,可选"," * })"," */","/**"," * 在当前选区位置插入一个图片"," * @name insertImage"," * @grammar editor.execCommand(\"insertImage\",imageObj);"," * @example"," * editor.execCommand(\"insertImage\",{"," * src: \"http://ueditor.baidu.com/logo.jpg\", //图片链接地址,必选"," * _src: \"http://ueditor.baidu.com/logo.jpg\", //UE内部使用参数,与src保持一致即可,可选"," * width: 300, //图片显示宽度,可选"," * height: 400, //图片显示高度,可选"," * border: 2, //图片边框,可选"," * hspace: 5, //图片左右边距,可选"," * vspace: 2, //图片上下边距,可选"," * alt: 'UEditor-logo', //图片替换文字,可选"," * title: \"百度开源富文本编辑器UEditor官网\" //图片标题,可选"," * })"," */","/**"," * 在当前选区位置插入一个视频"," * @name insertVideo"," * @grammar editor.execCommand(\"insertVideo\",videoObj);"," * @example"," * editor.execCommand(\"insertVideo\",{"," * url: \"http://youku.com/id?id=1233122\", //视频地址,必选"," * width: 420, //视频宽度,可选"," * height: 280, //视频高度,可选"," * align: \"none\" //对齐方式,支持right,left,center,none ,可选"," * })"," */","/**"," * 在当前选区位置插入一个日期或者时间"," * @name date|time"," * @grammar editor.execCommand(\"date\");"," */","/**"," * 在当前选区位置插入一个分页符标记"," * @name pageBreak"," * @grammar editor.execCommand(\"pageBreak\");"," */","/**"," * 切换源码编辑模式和富文本编辑模式"," * @name source"," * @grammar editor.execCommand(\"source\");"," */","/**"," * IE下进入截屏模式"," * @name snapScreen"," * @grammar editor.execCommand(\"snapScreen\");"," */","/**"," * 插入表格"," * @name insertTable"," * @grammar editor.execCommand(\"insertTable\",rows,cols);"," */","","/**"," * 查找替换"," * @name searchreplace"," * @grammar editor.execCommand(\"searchreplace\",opt);"," * @desc"," * opt是个json对象,属性如下"," * * ''all'' true表示查找整个文档,false表示从上次的位置开始查找,默认是false"," * * ''casesensitive'' 大小写铭感,true是铭感,默认是false"," * * ''dir'' 1表示从前往后查,-1表示从后往前"," * * ''searchStr'' 查找的字符串"," * * ''replaceStr'' 替换用的字符串"," */","","","","","","","","",""]; diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/core/Editor.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/core/Editor.js new file mode 100644 index 000000000..524c2e45b --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/core/Editor.js @@ -0,0 +1,1492 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['core/Editor.js']) { + _$jscoverage['core/Editor.js'] = []; + _$jscoverage['core/Editor.js'][22] = 0; + _$jscoverage['core/Editor.js'][23] = 0; + _$jscoverage['core/Editor.js'][32] = 0; + _$jscoverage['core/Editor.js'][33] = 0; + _$jscoverage['core/Editor.js'][34] = 0; + _$jscoverage['core/Editor.js'][35] = 0; + _$jscoverage['core/Editor.js'][36] = 0; + _$jscoverage['core/Editor.js'][37] = 0; + _$jscoverage['core/Editor.js'][38] = 0; + _$jscoverage['core/Editor.js'][39] = 0; + _$jscoverage['core/Editor.js'][43] = 0; + _$jscoverage['core/Editor.js'][46] = 0; + _$jscoverage['core/Editor.js'][47] = 0; + _$jscoverage['core/Editor.js'][53] = 0; + _$jscoverage['core/Editor.js'][55] = 0; + _$jscoverage['core/Editor.js'][66] = 0; + _$jscoverage['core/Editor.js'][68] = 0; + _$jscoverage['core/Editor.js'][69] = 0; + _$jscoverage['core/Editor.js'][71] = 0; + _$jscoverage['core/Editor.js'][73] = 0; + _$jscoverage['core/Editor.js'][82] = 0; + _$jscoverage['core/Editor.js'][83] = 0; + _$jscoverage['core/Editor.js'][84] = 0; + _$jscoverage['core/Editor.js'][135] = 0; + _$jscoverage['core/Editor.js'][136] = 0; + _$jscoverage['core/Editor.js'][137] = 0; + _$jscoverage['core/Editor.js'][138] = 0; + _$jscoverage['core/Editor.js'][139] = 0; + _$jscoverage['core/Editor.js'][140] = 0; + _$jscoverage['core/Editor.js'][141] = 0; + _$jscoverage['core/Editor.js'][142] = 0; + _$jscoverage['core/Editor.js'][143] = 0; + _$jscoverage['core/Editor.js'][145] = 0; + _$jscoverage['core/Editor.js'][171] = 0; + _$jscoverage['core/Editor.js'][173] = 0; + _$jscoverage['core/Editor.js'][174] = 0; + _$jscoverage['core/Editor.js'][176] = 0; + _$jscoverage['core/Editor.js'][182] = 0; + _$jscoverage['core/Editor.js'][186] = 0; + _$jscoverage['core/Editor.js'][188] = 0; + _$jscoverage['core/Editor.js'][205] = 0; + _$jscoverage['core/Editor.js'][206] = 0; + _$jscoverage['core/Editor.js'][207] = 0; + _$jscoverage['core/Editor.js'][238] = 0; + _$jscoverage['core/Editor.js'][239] = 0; + _$jscoverage['core/Editor.js'][240] = 0; + _$jscoverage['core/Editor.js'][242] = 0; + _$jscoverage['core/Editor.js'][244] = 0; + _$jscoverage['core/Editor.js'][258] = 0; + _$jscoverage['core/Editor.js'][259] = 0; + _$jscoverage['core/Editor.js'][260] = 0; + _$jscoverage['core/Editor.js'][261] = 0; + _$jscoverage['core/Editor.js'][262] = 0; + _$jscoverage['core/Editor.js'][263] = 0; + _$jscoverage['core/Editor.js'][264] = 0; + _$jscoverage['core/Editor.js'][266] = 0; + _$jscoverage['core/Editor.js'][269] = 0; + _$jscoverage['core/Editor.js'][270] = 0; + _$jscoverage['core/Editor.js'][271] = 0; + _$jscoverage['core/Editor.js'][272] = 0; + _$jscoverage['core/Editor.js'][273] = 0; + _$jscoverage['core/Editor.js'][274] = 0; + _$jscoverage['core/Editor.js'][275] = 0; + _$jscoverage['core/Editor.js'][277] = 0; + _$jscoverage['core/Editor.js'][278] = 0; + _$jscoverage['core/Editor.js'][279] = 0; + _$jscoverage['core/Editor.js'][282] = 0; + _$jscoverage['core/Editor.js'][299] = 0; + _$jscoverage['core/Editor.js'][302] = 0; + _$jscoverage['core/Editor.js'][304] = 0; + _$jscoverage['core/Editor.js'][305] = 0; + _$jscoverage['core/Editor.js'][307] = 0; + _$jscoverage['core/Editor.js'][308] = 0; + _$jscoverage['core/Editor.js'][309] = 0; + _$jscoverage['core/Editor.js'][311] = 0; + _$jscoverage['core/Editor.js'][313] = 0; + _$jscoverage['core/Editor.js'][314] = 0; + _$jscoverage['core/Editor.js'][316] = 0; + _$jscoverage['core/Editor.js'][319] = 0; + _$jscoverage['core/Editor.js'][321] = 0; + _$jscoverage['core/Editor.js'][324] = 0; + _$jscoverage['core/Editor.js'][326] = 0; + _$jscoverage['core/Editor.js'][342] = 0; + _$jscoverage['core/Editor.js'][350] = 0; + _$jscoverage['core/Editor.js'][352] = 0; + _$jscoverage['core/Editor.js'][353] = 0; + _$jscoverage['core/Editor.js'][354] = 0; + _$jscoverage['core/Editor.js'][355] = 0; + _$jscoverage['core/Editor.js'][357] = 0; + _$jscoverage['core/Editor.js'][358] = 0; + _$jscoverage['core/Editor.js'][359] = 0; + _$jscoverage['core/Editor.js'][373] = 0; + _$jscoverage['core/Editor.js'][375] = 0; + _$jscoverage['core/Editor.js'][376] = 0; + _$jscoverage['core/Editor.js'][377] = 0; + _$jscoverage['core/Editor.js'][378] = 0; + _$jscoverage['core/Editor.js'][380] = 0; + _$jscoverage['core/Editor.js'][382] = 0; + _$jscoverage['core/Editor.js'][383] = 0; + _$jscoverage['core/Editor.js'][384] = 0; + _$jscoverage['core/Editor.js'][385] = 0; + _$jscoverage['core/Editor.js'][386] = 0; + _$jscoverage['core/Editor.js'][388] = 0; + _$jscoverage['core/Editor.js'][390] = 0; + _$jscoverage['core/Editor.js'][391] = 0; + _$jscoverage['core/Editor.js'][392] = 0; + _$jscoverage['core/Editor.js'][394] = 0; + _$jscoverage['core/Editor.js'][396] = 0; + _$jscoverage['core/Editor.js'][397] = 0; + _$jscoverage['core/Editor.js'][398] = 0; + _$jscoverage['core/Editor.js'][399] = 0; + _$jscoverage['core/Editor.js'][400] = 0; + _$jscoverage['core/Editor.js'][401] = 0; + _$jscoverage['core/Editor.js'][404] = 0; + _$jscoverage['core/Editor.js'][405] = 0; + _$jscoverage['core/Editor.js'][408] = 0; + _$jscoverage['core/Editor.js'][411] = 0; + _$jscoverage['core/Editor.js'][412] = 0; + _$jscoverage['core/Editor.js'][413] = 0; + _$jscoverage['core/Editor.js'][414] = 0; + _$jscoverage['core/Editor.js'][415] = 0; + _$jscoverage['core/Editor.js'][416] = 0; + _$jscoverage['core/Editor.js'][418] = 0; + _$jscoverage['core/Editor.js'][420] = 0; + _$jscoverage['core/Editor.js'][425] = 0; + _$jscoverage['core/Editor.js'][426] = 0; + _$jscoverage['core/Editor.js'][429] = 0; + _$jscoverage['core/Editor.js'][430] = 0; + _$jscoverage['core/Editor.js'][431] = 0; + _$jscoverage['core/Editor.js'][433] = 0; + _$jscoverage['core/Editor.js'][436] = 0; + _$jscoverage['core/Editor.js'][437] = 0; + _$jscoverage['core/Editor.js'][439] = 0; + _$jscoverage['core/Editor.js'][440] = 0; + _$jscoverage['core/Editor.js'][443] = 0; + _$jscoverage['core/Editor.js'][444] = 0; + _$jscoverage['core/Editor.js'][447] = 0; + _$jscoverage['core/Editor.js'][448] = 0; + _$jscoverage['core/Editor.js'][451] = 0; + _$jscoverage['core/Editor.js'][452] = 0; + _$jscoverage['core/Editor.js'][458] = 0; + _$jscoverage['core/Editor.js'][459] = 0; + _$jscoverage['core/Editor.js'][460] = 0; + _$jscoverage['core/Editor.js'][461] = 0; + _$jscoverage['core/Editor.js'][462] = 0; + _$jscoverage['core/Editor.js'][463] = 0; + _$jscoverage['core/Editor.js'][465] = 0; + _$jscoverage['core/Editor.js'][466] = 0; + _$jscoverage['core/Editor.js'][467] = 0; + _$jscoverage['core/Editor.js'][468] = 0; + _$jscoverage['core/Editor.js'][469] = 0; + _$jscoverage['core/Editor.js'][471] = 0; + _$jscoverage['core/Editor.js'][475] = 0; + _$jscoverage['core/Editor.js'][476] = 0; + _$jscoverage['core/Editor.js'][483] = 0; + _$jscoverage['core/Editor.js'][485] = 0; + _$jscoverage['core/Editor.js'][486] = 0; + _$jscoverage['core/Editor.js'][487] = 0; + _$jscoverage['core/Editor.js'][489] = 0; + _$jscoverage['core/Editor.js'][490] = 0; + _$jscoverage['core/Editor.js'][493] = 0; + _$jscoverage['core/Editor.js'][494] = 0; + _$jscoverage['core/Editor.js'][515] = 0; + _$jscoverage['core/Editor.js'][518] = 0; + _$jscoverage['core/Editor.js'][520] = 0; + _$jscoverage['core/Editor.js'][533] = 0; + _$jscoverage['core/Editor.js'][534] = 0; + _$jscoverage['core/Editor.js'][536] = 0; + _$jscoverage['core/Editor.js'][538] = 0; + _$jscoverage['core/Editor.js'][564] = 0; + _$jscoverage['core/Editor.js'][565] = 0; + _$jscoverage['core/Editor.js'][566] = 0; + _$jscoverage['core/Editor.js'][568] = 0; + _$jscoverage['core/Editor.js'][570] = 0; + _$jscoverage['core/Editor.js'][579] = 0; + _$jscoverage['core/Editor.js'][580] = 0; + _$jscoverage['core/Editor.js'][581] = 0; + _$jscoverage['core/Editor.js'][582] = 0; + _$jscoverage['core/Editor.js'][583] = 0; + _$jscoverage['core/Editor.js'][584] = 0; + _$jscoverage['core/Editor.js'][585] = 0; + _$jscoverage['core/Editor.js'][586] = 0; + _$jscoverage['core/Editor.js'][587] = 0; + _$jscoverage['core/Editor.js'][588] = 0; + _$jscoverage['core/Editor.js'][594] = 0; + _$jscoverage['core/Editor.js'][595] = 0; + _$jscoverage['core/Editor.js'][596] = 0; + _$jscoverage['core/Editor.js'][635] = 0; + _$jscoverage['core/Editor.js'][636] = 0; + _$jscoverage['core/Editor.js'][637] = 0; + _$jscoverage['core/Editor.js'][638] = 0; + _$jscoverage['core/Editor.js'][640] = 0; + _$jscoverage['core/Editor.js'][641] = 0; + _$jscoverage['core/Editor.js'][643] = 0; + _$jscoverage['core/Editor.js'][644] = 0; + _$jscoverage['core/Editor.js'][645] = 0; + _$jscoverage['core/Editor.js'][646] = 0; + _$jscoverage['core/Editor.js'][647] = 0; + _$jscoverage['core/Editor.js'][660] = 0; + _$jscoverage['core/Editor.js'][663] = 0; + _$jscoverage['core/Editor.js'][664] = 0; + _$jscoverage['core/Editor.js'][665] = 0; + _$jscoverage['core/Editor.js'][666] = 0; + _$jscoverage['core/Editor.js'][667] = 0; + _$jscoverage['core/Editor.js'][669] = 0; + _$jscoverage['core/Editor.js'][670] = 0; + _$jscoverage['core/Editor.js'][674] = 0; + _$jscoverage['core/Editor.js'][689] = 0; + _$jscoverage['core/Editor.js'][691] = 0; + _$jscoverage['core/Editor.js'][695] = 0; + _$jscoverage['core/Editor.js'][698] = 0; + _$jscoverage['core/Editor.js'][711] = 0; + _$jscoverage['core/Editor.js'][713] = 0; + _$jscoverage['core/Editor.js'][755] = 0; + _$jscoverage['core/Editor.js'][757] = 0; + _$jscoverage['core/Editor.js'][758] = 0; + _$jscoverage['core/Editor.js'][759] = 0; + _$jscoverage['core/Editor.js'][760] = 0; + _$jscoverage['core/Editor.js'][763] = 0; + _$jscoverage['core/Editor.js'][766] = 0; + _$jscoverage['core/Editor.js'][767] = 0; + _$jscoverage['core/Editor.js'][771] = 0; + _$jscoverage['core/Editor.js'][773] = 0; + _$jscoverage['core/Editor.js'][774] = 0; + _$jscoverage['core/Editor.js'][779] = 0; + _$jscoverage['core/Editor.js'][782] = 0; + _$jscoverage['core/Editor.js'][783] = 0; + _$jscoverage['core/Editor.js'][784] = 0; + _$jscoverage['core/Editor.js'][785] = 0; + _$jscoverage['core/Editor.js'][786] = 0; + _$jscoverage['core/Editor.js'][787] = 0; + _$jscoverage['core/Editor.js'][789] = 0; + _$jscoverage['core/Editor.js'][790] = 0; + _$jscoverage['core/Editor.js'][791] = 0; + _$jscoverage['core/Editor.js'][792] = 0; + _$jscoverage['core/Editor.js'][794] = 0; + _$jscoverage['core/Editor.js'][795] = 0; + _$jscoverage['core/Editor.js'][798] = 0; + _$jscoverage['core/Editor.js'][802] = 0; + _$jscoverage['core/Editor.js'][803] = 0; + _$jscoverage['core/Editor.js'][805] = 0; + _$jscoverage['core/Editor.js'][807] = 0; + _$jscoverage['core/Editor.js'][809] = 0; + _$jscoverage['core/Editor.js'][810] = 0; + _$jscoverage['core/Editor.js'][811] = 0; + _$jscoverage['core/Editor.js'][813] = 0; + _$jscoverage['core/Editor.js'][814] = 0; + _$jscoverage['core/Editor.js'][837] = 0; + _$jscoverage['core/Editor.js'][838] = 0; + _$jscoverage['core/Editor.js'][840] = 0; + _$jscoverage['core/Editor.js'][841] = 0; + _$jscoverage['core/Editor.js'][843] = 0; + _$jscoverage['core/Editor.js'][845] = 0; + _$jscoverage['core/Editor.js'][856] = 0; + _$jscoverage['core/Editor.js'][859] = 0; + _$jscoverage['core/Editor.js'][860] = 0; + _$jscoverage['core/Editor.js'][861] = 0; + _$jscoverage['core/Editor.js'][862] = 0; + _$jscoverage['core/Editor.js'][864] = 0; + _$jscoverage['core/Editor.js'][865] = 0; + _$jscoverage['core/Editor.js'][867] = 0; + _$jscoverage['core/Editor.js'][868] = 0; + _$jscoverage['core/Editor.js'][921] = 0; + _$jscoverage['core/Editor.js'][929] = 0; + _$jscoverage['core/Editor.js'][936] = 0; + _$jscoverage['core/Editor.js'][937] = 0; + _$jscoverage['core/Editor.js'][938] = 0; + _$jscoverage['core/Editor.js'][939] = 0; + _$jscoverage['core/Editor.js'][940] = 0; + _$jscoverage['core/Editor.js'][941] = 0; + _$jscoverage['core/Editor.js'][942] = 0; + _$jscoverage['core/Editor.js'][943] = 0; + _$jscoverage['core/Editor.js'][946] = 0; + _$jscoverage['core/Editor.js'][947] = 0; + _$jscoverage['core/Editor.js'][948] = 0; + _$jscoverage['core/Editor.js'][949] = 0; + _$jscoverage['core/Editor.js'][953] = 0; + _$jscoverage['core/Editor.js'][954] = 0; + _$jscoverage['core/Editor.js'][955] = 0; + _$jscoverage['core/Editor.js'][956] = 0; + _$jscoverage['core/Editor.js'][957] = 0; + _$jscoverage['core/Editor.js'][959] = 0; + _$jscoverage['core/Editor.js'][962] = 0; + _$jscoverage['core/Editor.js'][963] = 0; + _$jscoverage['core/Editor.js'][964] = 0; + _$jscoverage['core/Editor.js'][965] = 0; + _$jscoverage['core/Editor.js'][966] = 0; + _$jscoverage['core/Editor.js'][969] = 0; + _$jscoverage['core/Editor.js'][970] = 0; + _$jscoverage['core/Editor.js'][971] = 0; + _$jscoverage['core/Editor.js'][973] = 0; + _$jscoverage['core/Editor.js'][974] = 0; + _$jscoverage['core/Editor.js'][976] = 0; + _$jscoverage['core/Editor.js'][977] = 0; + _$jscoverage['core/Editor.js'][978] = 0; + _$jscoverage['core/Editor.js'][992] = 0; + _$jscoverage['core/Editor.js'][994] = 0; + _$jscoverage['core/Editor.js'][995] = 0; + _$jscoverage['core/Editor.js'][997] = 0; + _$jscoverage['core/Editor.js'][998] = 0; + _$jscoverage['core/Editor.js'][999] = 0; + _$jscoverage['core/Editor.js'][1000] = 0; + _$jscoverage['core/Editor.js'][1014] = 0; + _$jscoverage['core/Editor.js'][1015] = 0; + _$jscoverage['core/Editor.js'][1018] = 0; + _$jscoverage['core/Editor.js'][1019] = 0; + _$jscoverage['core/Editor.js'][1021] = 0; + _$jscoverage['core/Editor.js'][1022] = 0; + _$jscoverage['core/Editor.js'][1023] = 0; + _$jscoverage['core/Editor.js'][1024] = 0; + _$jscoverage['core/Editor.js'][1025] = 0; + _$jscoverage['core/Editor.js'][1026] = 0; + _$jscoverage['core/Editor.js'][1027] = 0; + _$jscoverage['core/Editor.js'][1029] = 0; + _$jscoverage['core/Editor.js'][1031] = 0; + _$jscoverage['core/Editor.js'][1032] = 0; + _$jscoverage['core/Editor.js'][1034] = 0; + _$jscoverage['core/Editor.js'][1035] = 0; + _$jscoverage['core/Editor.js'][1051] = 0; + _$jscoverage['core/Editor.js'][1062] = 0; + _$jscoverage['core/Editor.js'][1088] = 0; + _$jscoverage['core/Editor.js'][1089] = 0; + _$jscoverage['core/Editor.js'][1090] = 0; + _$jscoverage['core/Editor.js'][1091] = 0; + _$jscoverage['core/Editor.js'][1095] = 0; + _$jscoverage['core/Editor.js'][1096] = 0; + _$jscoverage['core/Editor.js'][1099] = 0; + _$jscoverage['core/Editor.js'][1100] = 0; + _$jscoverage['core/Editor.js'][1101] = 0; + _$jscoverage['core/Editor.js'][1102] = 0; + _$jscoverage['core/Editor.js'][1103] = 0; + _$jscoverage['core/Editor.js'][1104] = 0; + _$jscoverage['core/Editor.js'][1108] = 0; + _$jscoverage['core/Editor.js'][1121] = 0; + _$jscoverage['core/Editor.js'][1133] = 0; + _$jscoverage['core/Editor.js'][1134] = 0; + _$jscoverage['core/Editor.js'][1135] = 0; + _$jscoverage['core/Editor.js'][1136] = 0; + _$jscoverage['core/Editor.js'][1138] = 0; + _$jscoverage['core/Editor.js'][1139] = 0; + _$jscoverage['core/Editor.js'][1140] = 0; + _$jscoverage['core/Editor.js'][1142] = 0; + _$jscoverage['core/Editor.js'][1144] = 0; + _$jscoverage['core/Editor.js'][1145] = 0; + _$jscoverage['core/Editor.js'][1146] = 0; + _$jscoverage['core/Editor.js'][1147] = 0; + _$jscoverage['core/Editor.js'][1149] = 0; + _$jscoverage['core/Editor.js'][1164] = 0; + _$jscoverage['core/Editor.js'][1191] = 0; + _$jscoverage['core/Editor.js'][1192] = 0; + _$jscoverage['core/Editor.js'][1193] = 0; + _$jscoverage['core/Editor.js'][1194] = 0; + _$jscoverage['core/Editor.js'][1195] = 0; + _$jscoverage['core/Editor.js'][1197] = 0; + _$jscoverage['core/Editor.js'][1198] = 0; + _$jscoverage['core/Editor.js'][1199] = 0; + _$jscoverage['core/Editor.js'][1200] = 0; + _$jscoverage['core/Editor.js'][1201] = 0; + _$jscoverage['core/Editor.js'][1203] = 0; + _$jscoverage['core/Editor.js'][1205] = 0; + _$jscoverage['core/Editor.js'][1236] = 0; + _$jscoverage['core/Editor.js'][1246] = 0; + _$jscoverage['core/Editor.js'][1247] = 0; + _$jscoverage['core/Editor.js'][1248] = 0; + _$jscoverage['core/Editor.js'][1249] = 0; + _$jscoverage['core/Editor.js'][1250] = 0; + _$jscoverage['core/Editor.js'][1251] = 0; + _$jscoverage['core/Editor.js'][1252] = 0; + _$jscoverage['core/Editor.js'][1253] = 0; + _$jscoverage['core/Editor.js'][1258] = 0; + _$jscoverage['core/Editor.js'][1259] = 0; + _$jscoverage['core/Editor.js'][1260] = 0; + _$jscoverage['core/Editor.js'][1262] = 0; + _$jscoverage['core/Editor.js'][1272] = 0; + _$jscoverage['core/Editor.js'][1273] = 0; + _$jscoverage['core/Editor.js'][1275] = 0; + _$jscoverage['core/Editor.js'][1276] = 0; + _$jscoverage['core/Editor.js'][1277] = 0; + _$jscoverage['core/Editor.js'][1279] = 0; + _$jscoverage['core/Editor.js'][1282] = 0; + _$jscoverage['core/Editor.js'][1283] = 0; + _$jscoverage['core/Editor.js'][1285] = 0; + _$jscoverage['core/Editor.js'][1299] = 0; + _$jscoverage['core/Editor.js'][1308] = 0; + _$jscoverage['core/Editor.js'][1309] = 0; + _$jscoverage['core/Editor.js'][1310] = 0; + _$jscoverage['core/Editor.js'][1312] = 0; + _$jscoverage['core/Editor.js'][1325] = 0; + _$jscoverage['core/Editor.js'][1339] = 0; + _$jscoverage['core/Editor.js'][1340] = 0; + _$jscoverage['core/Editor.js'][1341] = 0; + _$jscoverage['core/Editor.js'][1343] = 0; + _$jscoverage['core/Editor.js'][1344] = 0; + _$jscoverage['core/Editor.js'][1345] = 0; + _$jscoverage['core/Editor.js'][1346] = 0; + _$jscoverage['core/Editor.js'][1348] = 0; + _$jscoverage['core/Editor.js'][1385] = 0; + _$jscoverage['core/Editor.js'][1386] = 0; + _$jscoverage['core/Editor.js'][1387] = 0; + _$jscoverage['core/Editor.js'][1388] = 0; + _$jscoverage['core/Editor.js'][1389] = 0; + _$jscoverage['core/Editor.js'][1390] = 0; + _$jscoverage['core/Editor.js'][1393] = 0; + _$jscoverage['core/Editor.js'][1410] = 0; + _$jscoverage['core/Editor.js'][1424] = 0; + _$jscoverage['core/Editor.js'][1425] = 0; + _$jscoverage['core/Editor.js'][1443] = 0; + _$jscoverage['core/Editor.js'][1457] = 0; + _$jscoverage['core/Editor.js'][1458] = 0; + _$jscoverage['core/Editor.js'][1462] = 0; +} +_$jscoverage['core/Editor.js'].source = ["/**"," * 编辑器主类,包含编辑器提供的大部分公用接口"," * @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.textarea) {"," if (utils.isString(editor.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.value = editor.hasContents() ?"," (editor.options.allHtmlEnabled ? editor.getAllHtml() : editor.getContent(null, null, true)) :"," ''"," }",""," /**"," * 初始化插件"," * @private"," * @method loadPlugins"," * @param { UE.Editor } editor 编辑器事例"," */"," function loadPlugins(me) {"," //初始化插件"," for (var pi in UE.plugins) {"," UE.plugins[pi].call(me);"," }"," me.langIsReady = true;",""," me.fireEvent(\"langReady\");"," }",""," /**"," * 获取语言包里面的第一个"," * @private"," * @method checkCurLang"," * @param { KeyValueMap } I18N 编辑器事例"," */"," function checkCurLang(I18N) {"," for (var lang in I18N) {"," return lang"," }"," }","",""," /**"," * 编辑器准备就绪后会触发该事件"," * @module UE"," * @class Editor"," * @event ready"," * @example"," * ```javascript"," * editor.addListener( 'ready', function( editor ) {"," * editor.execCommand( 'focus' );"," * } );"," * ```"," */",""," /**"," * 每当编辑器内部选区发生改变后, 将触发该事件"," * @event selectionchange"," * @warning 该事件的触发非常频繁,不建议在该事件的处理过程中做重量级的处理"," * @example"," * ```javascript"," * editor.addListener( 'selectionchange', function( editor ) {"," * console.log('选区发生改变');"," * }"," */",""," /**"," * 以默认参数构建一个编辑器实例"," * @constructor"," * @example"," * ```javascript"," * var editor = new UE.Editor();"," * editor.execCommand('blod');"," * ```"," * @see UE.Config"," */",""," /**"," * 以给定的参数集合创建一个编辑器对象,对于未指定的参数,将应用默认参数。"," * @constructor"," * @param { KeyValueMap } 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({"," isShow: true,"," initialContent: '',"," initialStyle: '',"," autoClearinitialContent: false,"," iframeCssUrl: me.options.UEDITOR_HOME_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: me.options.UEDITOR_HOME_URL + 'lang/',"," theme: 'default',"," themePath: me.options.UEDITOR_HOME_URL + 'themes/',"," allHtmlEnabled: false,"," scaleEnabled: false,"," tableNativeEditInFF: false,"," autoSyncData: true"," });",""," if (!utils.isEmptyObject(UE.I18N)) {"," //修改默认的语言类型"," me.options.lang = checkCurLang(UE.I18N);"," loadPlugins(me)"," } else {"," utils.loadFile(document, {"," src: me.options.langPath + me.options.lang + \"/\" + me.options.lang + \".js\","," tag: \"script\","," type: \"text/javascript\","," defer: \"defer\""," }, function () {"," loadPlugins(me)"," });"," }",""," UE.instants['ueditorInstant' + me.uid] = me;"," };"," Editor.prototype = {","",""," /**"," * 编辑器对外提供的监听ready事件的接口, 通过调用该方法,达到的效果与监听ready事件是一致的"," * @method ready"," * @param { Function } fn 编辑器ready之后所执行的回调, 如果在注册事件之前编辑器已经ready,将会"," * 立即触发该回调。"," * @see UE.Editor.event:ready"," * @example"," * ```javascript"," * editor.ready( function( editor ) {"," * editor.setContent('初始化完毕');"," * } );"," * ```"," */"," ready: function (fn) {"," var me = this;"," if (fn) {"," me.isReady ? fn.apply(me) : me.addListener('ready', fn);"," }"," },","",""," /**"," * 该方法是提供给插件里面使用,以key,value的方式设置插件内用到的配置项默认值"," * @method setOpt"," * @warning 在config文件里面有定义参数key或者用户实例化的时候有传入参数key,该方法设置的key参数值无效"," * @warning 该方法仅供编辑器插件内部和编辑器初始化时调用,其他地方不能调用。"," * @param { String } key 编辑器的可接受的选项名称"," * @param { * } val 该选项可接受的值"," * @example"," * ```javascript"," * editor.setOpt( 'initContent', '欢迎使用编辑器' );"," * ```"," */",""," /**"," * 该方法是提供给插件里面使用,以{key:value}集合的方式设置插件内用到的配置项默认值"," * @method setOpt"," * @warning 在config文件里面有定义参数key或者用户实例化的时候有传入参数key,该方法设置的key参数值无效"," * @warning 该方法仅供编辑器插件内部和编辑器初始化时调用,其他地方不能调用。"," * @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);"," },","",""," /**"," * 销毁编辑器实例对象"," * @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"," * @warning 必须且只能调用一次"," */",""," /**"," * 渲染编辑器的DOM到指定容器"," * @method render"," * @param { Element } containerDom 直接指定容器对象"," * @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 ? '' : '<!DOCTYPE html>') +"," '<html xmlns=\\'http://www.w3.org/1999/xhtml\\' class=\\'view\\' ><head>' +"," '<style type=\\'text/css\\'>' +"," //设置四周的留边"," '.view{padding:0;word-wrap:break-word;cursor:text;height:90%;}\\n' +"," //设置默认字体和字号"," //font-family不能呢随便改,在safari下fillchar会有解析问题"," 'body{margin:8px;font-family:sans-serif;font-size:16px;}' +"," //设置段落间距"," 'p{margin:5px 0;}</style>' +"," ( options.iframeCssUrl ? '<link rel=\\'stylesheet\\' type=\\'text/css\\' href=\\'' + utils.unhtml(options.iframeCssUrl) + '\\'/>' : '' ) +"," (options.initialStyle ? '<style>' + options.initialStyle + '</style>' : '') +"," '</head><body class=\\'view\\' ></body>' +"," '<script type=\\'text/javascript\\' ' + (ie ? 'defer=\\'defer\\'' : '' ) + ' id=\\'_initialScript\\'>' +"," 'setTimeout(function(){window.parent.UE.instants[\\'ueditorInstant' + me.uid + '\\']._setup(document);},0);' +"," 'var _tmpScript = document.getElementById(\\'_initialScript\\');_tmpScript.parentNode.removeChild(_tmpScript);</script></html>';"," container.appendChild(domUtils.createElement(document, 'iframe', {"," id: 'ueditor_' + me.uid,"," width: \"100%\","," height: \"100%\","," frameborder: \"0\","," 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;"," 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 = '<p>' + (browser.ie ? '' : '<br/>') + '</p>';"," }"," //如果要求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) {","// domUtils.on(me.body,browser.ie ? 'resizestart' : 'resize', function( evt ) {","// domUtils.preventDefault(evt)","// });"," }"," me._bindshortcutKeys();"," me.isReady = 1;"," me.fireEvent('ready');"," options.onready && options.onready.call(me);"," if (!browser.ie) {"," 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里,为提交数据做准备,主要用于是手动提交的情况"," * 后台取得数据的键值,使用你容器上的name属性,如果没有就使用参数里的textarea项"," * @method sync"," * @example"," * ```javascript"," * editor.sync();"," * form.sumbit(); //form变量已经指向了form元素"," * ```"," */",""," /**"," * 根据传入的formId,在页面上查找要同步数据的表单,若找到,就同步编辑内容到找到的form里,为提交数据做准备,主要用于是手动提交的情况"," * 后台取得数据的键值,使用你容器上的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"," * @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';"," },",""," /**"," * 这个接口是为插件扩展提供的接口,主要是为新添加的插件,如果需要添加快捷键,所提供的接口"," * @method addshortcutkey"," * @param { KeyValueMap } 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"," * var content = editor.getContent();"," * ```"," */",""," /**"," * 获取编辑器的内容。 可以通过参数定义编辑器内置的判空规则"," * @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);"," 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 ? '<link rel=\"stylesheet\" type=\"text/css\" href=\"' + si.href + '\" />' : '<style>' + si.cssText + '</style>');"," });"," utils.each(me.document.getElementsByTagName('script'), function (si) {"," headHtmlForIE9 += si.outerHTML;"," });",""," }"," return '<html><head>' + (me.options.charset ? '<meta http-equiv=\"Content-Type\" content=\"text/html; charset=' + me.options.charset + '\"/>' : '')"," + (headHtmlForIE9 || me.document.getElementsByTagName('head')[0].innerHTML) + headHtml.join('\\n') + '</head>'"," + '<body ' + (ie && browser.version < 9 ? 'class=\"view\"' : '') + '>' + me.getContent(null, null, true) + '</body></html>';"," },",""," /**"," * 得到编辑器的纯文本内容,但会保留段落格式"," * @method getPlainTxt"," * @return { String } 编辑器带段落格式的纯文本内容字符串"," * @example"," * ```javascript"," * editor.getPlainTxt();"," * ```"," */"," getPlainTxt: function () {"," var reg = new RegExp(domUtils.fillChar, 'g'),"," html = this.body.innerHTML.replace(/[\\n\\r]/g, '');//ie要先去了\\n在处理"," html = html.replace(/<(p|div)[^>]*>(<br\\/?>|&nbsp;)<\\/\\1>/gi, '\\n')"," .replace(/<br\\/?>/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(/&nbsp;/g, ' ');"," },",""," /**"," * 获取编辑器中的纯文本内容,没有段落格式"," * @method getContentTxt"," * @return { String } 编辑器不带段落格式的纯文本内容字符串"," * @example"," * ```javascript"," * editor.getContentTxt();"," * ```"," */"," 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内容"," * @example"," * ```javascript"," * editor.getContent('<p>test</p>');"," * ```"," */",""," /**"," * 设置编辑器的内容,可修改编辑器当前的html内容"," * @method setContent"," * @warning 通过该方法插入的内容,是经过编辑器内置的过滤规则进行过滤后得到的内容"," * @warning 该方法会出发selectionchange事件"," * @param { String } html 要插入的html内容"," * @param { Boolean } isAppendTo 若传入true,不清空原来的内容,在最后插入内容,否则,清空内容再插入"," * @example"," * ```javascript"," * //假设设置前的编辑器内容是 <p>old text</p>"," * editor.getContent('<p>new text</p>', true); //插入的结果是<p>old text</p><p>new text</p>"," * ```"," */",""," /**"," * 设置编辑器的内容,可修改编辑器当前的html内容"," * @method setContent"," * @warning 通过该方法插入的内容,是经过编辑器内置的过滤规则进行过滤后得到的内容"," * @param { String } html 要插入的html内容"," * @param { Boolean } isAppendTo 若传入true,不清空原来的内容,在最后插入内容,否则,清空内容再插入"," * @param { Boolean } notFireSelectionchange 若传入true,执行该函数过程不触发编辑器的selectionchange事件"," * @example"," * ```javascript"," * editor.getContent('<p>new text</p>', false, true);"," * ```"," */"," 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 = '<p>' + (browser.ie ? '&nbsp;' : '<br/>') + '</p>' + 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) {"," rng.setStartAtLast(me.body.lastChild).setCursor(false, true);"," } else {"," rng.select(true);"," }"," this.fireEvent('focus');"," } catch (e) {"," }"," },",""," /**"," * 初始化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(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);"," });","// //处理拖拽","// //ie ff不能从外边拖入","// //chrome只针对从外边拖入的内容过滤","// var innerDrag = 0, source = browser.ie ? me.body : me.document, dragoverHandler;","// domUtils.on(source, 'dragstart', function () {","// innerDrag = 1;","// });","// domUtils.on(source, browser.webkit ? 'dragover' : 'drop', function () {","// return browser.webkit ?","// function () {","// clearTimeout(dragoverHandler);","// dragoverHandler = setTimeout(function () {","// if (!innerDrag) {","// var sel = me.selection,","// range = sel.getRange();","// if (range) {","// var common = range.getCommonAncestor();","// if (common && me.serialize) {","// var f = me.serialize,","// node =","// f.filter(","// f.transformInput(","// f.parseHTML(","// f.word(common.innerHTML)","// )","// )","// );","// common.innerHTML = f.toHTML(node);","// }","// }","// }","// innerDrag = 0;","// }, 200);","// } :","// function (e) {","// if (!innerDrag) {","// e.preventDefault ? e.preventDefault() : (e.returnValue = false);","// }","// innerDrag = 0;","// }","// }());"," },",""," /**"," * 触发事件代理"," * @method _proxyDomEvent"," * @private"," * @return { * } fireEvent的返回值"," * @see UE.EventBase:fireEvent(String)"," */"," _proxyDomEvent: function (evt) {"," return this.fireEvent(evt.type.replace(/^on/, ''), evt);"," },"," /**"," * 变化选区"," * @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.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"," * @return { * } 返回命令函数运行的返回值"," * @example"," * ```javascript"," * editor.execCommand(cmdName);"," * ```"," */"," execCommand: function (cmdName) {"," cmdName = cmdName.toLowerCase();"," var me = this,"," result,"," cmd = me.commands[cmdName] || UE.commands[cmdName];"," if (!cmd || !cmd.execCommand) {"," return null;"," }"," if (!cmd.notNeedUndo && !me.__hasEnterExecCommand) {"," me.__hasEnterExecCommand = true;"," if (me.queryCommandState.apply(me, arguments) != -1) {"," me.fireEvent('beforeexeccommand', cmdName);"," result = this._callCmdFn('execCommand', arguments);"," !me._ignoreContentChange && me.fireEvent('contentchange');"," me.fireEvent('afterexeccommand', cmdName);"," }"," me.__hasEnterExecCommand = false;"," } else {"," result = this._callCmdFn('execCommand', arguments);"," !me._ignoreContentChange && me.fireEvent('contentchange')"," }"," !me._ignoreContentChange && me._selectionChange();"," return result;"," },",""," /**"," * 根据传入的command命令,查选编辑器当前的选区,返回命令的状态"," * @method queryCommandState"," * @return { Number } number 返回放前命令的状态"," * 返回 -1 当前命令不可用"," * 返回 0 当前命令可用"," * 返回 1 当前命令已经执行过了"," * @example"," * ```javascript"," * editor.queryCommandState(cmdName) => (-1|0|1)"," * ```"," */"," queryCommandState: function (cmdName) {"," return this._callCmdFn('queryCommandState', arguments);"," },",""," /**"," * 根据传入的command命令,查选编辑器当前的选区,根据命令返回相关的值"," * @method queryCommandValue"," * @remind 只有部分插件有此方法"," * @return { * } 返回每个命令特定的当前状态值"," * @grammar editor.queryCommandValue(cmdName) => {*}"," */"," 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 此方法会清空编辑器内容,清空回退列表"," * @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;"," }"," me.fireEvent('selectionchange');"," }"," },",""," /**"," * 设置当前编辑区域可以编辑"," * @method enable"," * @return { * } 返回setEnabled方法的返回值"," * @example"," * ```javascript"," * editor.enable()"," * ```"," * @see UE.Editor:setEnabled()"," */"," 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.queryCommandState = function (type) {"," if (utils.indexOf(except, type) != -1) {"," return me.bkqueryCommandState.apply(me, arguments);"," }"," return -1;"," };"," me.fireEvent('selectionchange');"," }"," },",""," /** 设置当前编辑区域不可编辑"," * @method disable"," * @see UE.Editor:setEnabled()"," */",""," /** 设置当前编辑区域不可编辑,except中的命令除外"," * @method disable"," * @param { String } except 例外命令的字符串"," * @remind 即使设置了disable,此处配置的例外命令仍然可以执行"," * @example"," * ```javascript"," * editor.disable('bold'); //禁用工具栏中除加粗之外的所有功能"," * ```"," * @see UE.Editor:setEnabled(String)"," */",""," /** 设置当前编辑区域不可编辑,except中的命令除外"," * @method disable"," * @param { Array } except 字符串数组,数组中的命令仍然可以执行"," * @remind 即使设置了disable,此处配置的例外命令仍然可以执行"," * @example"," * ```javascript"," * editor.disable(['bold','insertimage']); //禁用工具栏中除加粗和插入图片之外的所有功能"," * ```"," * @see UE.Editor:setEnabled(Array)"," */"," 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 = '<p>' + (ie ? '' : '<br/>') + '</p>';"," me.removeListener('firstBeforeExecCommand focus', clear);"," setTimeout(function () {"," me.focus();"," me._selectionChange();"," }, 0)"," }"," }",""," return function (cont) {"," var me = this;"," me.body.innerHTML = '<p id=\"initContent\">' + cont + '</p>';",""," me.addListener('firstBeforeExecCommand focus', clear);"," }"," }(),",""," /**"," * 显示编辑器,show方法的兼容版本"," * @method setShow"," * @private"," */"," 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 = '';"," }"," },",""," /**"," * 显示编辑器"," * @method show"," * @example"," * ```javascript"," * editor.show()"," * ```"," * @see UE.Editor:setShow(String)"," */"," show: function () {"," return this.setShow();"," },",""," /**"," * 隐藏编辑器,hide方法的兼容版本"," * @method setHide"," * @private"," */"," setHide: function () {"," var me = this;"," if (!me.lastBk) {"," me.lastBk = me.selection.getRange().createBookmark(true);"," }"," me.container.style.display = 'none'"," },",""," /**"," * 隐藏编辑器"," * @method hide"," * @example"," * ```javascript"," * editor.hide()"," * ```"," * @see UE.Editor:setHide()"," */"," hide: function () {"," return this.setHide();"," },",""," /**"," * 根据指定的路径,获取对应的语言资源"," * @method getLang"," * @param { String } path 路径根据的是lang目录下的语言文件的路径结构"," * @return { KeyValueMap | 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"," * editor.getContentLength()"," * ```"," */",""," /**"," * 计算编辑器当前存文本内容的长度"," * @method getContentLength"," * @param { Boolean } ingoneHtml 传入true时,只按照纯文本来计算"," * @return { Number } 返回计算的长度,内容中有hr/img/iframe标签,长度加1"," * @example"," * ```javascript"," * editor.getContentLength(true)"," * ```"," */",""," /**"," * 计算编辑器当前内容的长度"," * @method getContentLength"," * @param { Boolean } ingoneHtml 传入true时,只按照纯文本来计算"," * @param { Array } tagNames 忽略html代码时,遇到数组里的标签,长度加1"," * @return { Number } 返回计算的长度,内容中有hr/img/iframe标签或者参数tagNames中的标签,长度加1"," * @remind 当ingoneHtml为false,第二个参数不作用"," * @example"," * ```javascript"," * editor.getContentLength(true, ['em','strong'])"," * ```"," */"," 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);"," * ```"," */"," 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);"," * ```"," */"," filterOutputRule: function (root) {"," for (var i = 0, ci; ci = this.outputRules[i++];) {"," ci.call(this, root)"," }"," }"," };"," utils.inherits(Editor, EventBase);","})();"]; +_$jscoverage['core/Editor.js'][22]++; +(function () { + _$jscoverage['core/Editor.js'][23]++; + var uid = 0, _selectionChangeTimer; + _$jscoverage['core/Editor.js'][32]++; + function setValue(form, editor) { + _$jscoverage['core/Editor.js'][33]++; + var textarea; + _$jscoverage['core/Editor.js'][34]++; + if (editor.textarea) { + _$jscoverage['core/Editor.js'][35]++; + if (utils.isString(editor.textarea)) { + _$jscoverage['core/Editor.js'][36]++; + for (var i = 0, ti, tis = domUtils.getElementsByTagName(form, "textarea"); (ti = tis[(i++)]);) { + _$jscoverage['core/Editor.js'][37]++; + if ((ti.id == ("ueditor_textarea_" + editor.options.textarea))) { + _$jscoverage['core/Editor.js'][38]++; + textarea = ti; + _$jscoverage['core/Editor.js'][39]++; + break; + } +} + } + else { + _$jscoverage['core/Editor.js'][43]++; + textarea = editor.textarea; + } + } + _$jscoverage['core/Editor.js'][46]++; + if ((! textarea)) { + _$jscoverage['core/Editor.js'][47]++; + form.appendChild((textarea = domUtils.createElement(document, "textarea", {"name": editor.options.textarea, "id": ("ueditor_textarea_" + editor.options.textarea), "style": "display:none"}))); + _$jscoverage['core/Editor.js'][53]++; + editor.textarea = textarea; + } + _$jscoverage['core/Editor.js'][55]++; + textarea.value = (editor.hasContents()? (editor.options.allHtmlEnabled? editor.getAllHtml(): editor.getContent(null, null, true)): ""); +} + _$jscoverage['core/Editor.js'][66]++; + function loadPlugins(me) { + _$jscoverage['core/Editor.js'][68]++; + for (var pi in UE.plugins) { + _$jscoverage['core/Editor.js'][69]++; + UE.plugins[pi].call(me); +} + _$jscoverage['core/Editor.js'][71]++; + me.langIsReady = true; + _$jscoverage['core/Editor.js'][73]++; + me.fireEvent("langReady"); +} + _$jscoverage['core/Editor.js'][82]++; + function checkCurLang(I18N) { + _$jscoverage['core/Editor.js'][83]++; + for (var lang in I18N) { + _$jscoverage['core/Editor.js'][84]++; + return lang; +} +} + _$jscoverage['core/Editor.js'][135]++; + var Editor = (UE.Editor = (function (options) { + _$jscoverage['core/Editor.js'][136]++; + var me = this; + _$jscoverage['core/Editor.js'][137]++; + me.uid = (uid++); + _$jscoverage['core/Editor.js'][138]++; + EventBase.call(me); + _$jscoverage['core/Editor.js'][139]++; + me.commands = {}; + _$jscoverage['core/Editor.js'][140]++; + me.options = utils.extend(utils.clone((options || {})), UEDITOR_CONFIG, true); + _$jscoverage['core/Editor.js'][141]++; + me.shortcutkeys = {}; + _$jscoverage['core/Editor.js'][142]++; + me.inputRules = []; + _$jscoverage['core/Editor.js'][143]++; + me.outputRules = []; + _$jscoverage['core/Editor.js'][145]++; + me.setOpt({isShow: true, initialContent: "", initialStyle: "", autoClearinitialContent: false, iframeCssUrl: (me.options.UEDITOR_HOME_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: (me.options.UEDITOR_HOME_URL + "lang/"), theme: "default", themePath: (me.options.UEDITOR_HOME_URL + "themes/"), allHtmlEnabled: false, scaleEnabled: false, tableNativeEditInFF: false, autoSyncData: true}); + _$jscoverage['core/Editor.js'][171]++; + if ((! utils.isEmptyObject(UE.I18N))) { + _$jscoverage['core/Editor.js'][173]++; + me.options.lang = checkCurLang(UE.I18N); + _$jscoverage['core/Editor.js'][174]++; + loadPlugins(me); + } + else { + _$jscoverage['core/Editor.js'][176]++; + utils.loadFile(document, {src: (me.options.langPath + me.options.lang + "/" + me.options.lang + ".js"), tag: "script", type: "text/javascript", defer: "defer"}, (function () { + _$jscoverage['core/Editor.js'][182]++; + loadPlugins(me); +})); + } + _$jscoverage['core/Editor.js'][186]++; + UE.instants[("ueditorInstant" + me.uid)] = me; +})); + _$jscoverage['core/Editor.js'][188]++; + Editor.prototype = {ready: (function (fn) { + _$jscoverage['core/Editor.js'][205]++; + var me = this; + _$jscoverage['core/Editor.js'][206]++; + if (fn) { + _$jscoverage['core/Editor.js'][207]++; + (me.isReady? fn.apply(me): me.addListener("ready", fn)); + } +}), setOpt: (function (key, val) { + _$jscoverage['core/Editor.js'][238]++; + var obj = {}; + _$jscoverage['core/Editor.js'][239]++; + if (utils.isString(key)) { + _$jscoverage['core/Editor.js'][240]++; + obj[key] = val; + } + else { + _$jscoverage['core/Editor.js'][242]++; + obj = key; + } + _$jscoverage['core/Editor.js'][244]++; + utils.extend(this.options, obj, true); +}), destroy: (function () { + _$jscoverage['core/Editor.js'][258]++; + var me = this; + _$jscoverage['core/Editor.js'][259]++; + me.fireEvent("destroy"); + _$jscoverage['core/Editor.js'][260]++; + var container = me.container.parentNode; + _$jscoverage['core/Editor.js'][261]++; + var textarea = me.textarea; + _$jscoverage['core/Editor.js'][262]++; + if ((! textarea)) { + _$jscoverage['core/Editor.js'][263]++; + textarea = document.createElement("textarea"); + _$jscoverage['core/Editor.js'][264]++; + container.parentNode.insertBefore(textarea, container); + } + else { + _$jscoverage['core/Editor.js'][266]++; + textarea.style.display = ""; + } + _$jscoverage['core/Editor.js'][269]++; + textarea.style.width = (me.iframe.offsetWidth + "px"); + _$jscoverage['core/Editor.js'][270]++; + textarea.style.height = (me.iframe.offsetHeight + "px"); + _$jscoverage['core/Editor.js'][271]++; + textarea.value = me.getContent(); + _$jscoverage['core/Editor.js'][272]++; + textarea.id = me.key; + _$jscoverage['core/Editor.js'][273]++; + container.innerHTML = ""; + _$jscoverage['core/Editor.js'][274]++; + domUtils.remove(container); + _$jscoverage['core/Editor.js'][275]++; + var key = me.key; + _$jscoverage['core/Editor.js'][277]++; + for (var p in me) { + _$jscoverage['core/Editor.js'][278]++; + if (me.hasOwnProperty(p)) { + _$jscoverage['core/Editor.js'][279]++; + (delete this[p]); + } +} + _$jscoverage['core/Editor.js'][282]++; + UE.delEditor(key); +}), render: (function (container) { + _$jscoverage['core/Editor.js'][299]++; + var me = this, options = me.options, getStyleValue = (function (attr) { + _$jscoverage['core/Editor.js'][302]++; + return parseInt(domUtils.getComputedStyle(container, attr)); +}); + _$jscoverage['core/Editor.js'][304]++; + if (utils.isString(container)) { + _$jscoverage['core/Editor.js'][305]++; + container = document.getElementById(container); + } + _$jscoverage['core/Editor.js'][307]++; + if (container) { + _$jscoverage['core/Editor.js'][308]++; + if (options.initialFrameWidth) { + _$jscoverage['core/Editor.js'][309]++; + options.minFrameWidth = options.initialFrameWidth; + } + else { + _$jscoverage['core/Editor.js'][311]++; + options.minFrameWidth = (options.initialFrameWidth = container.offsetWidth); + } + _$jscoverage['core/Editor.js'][313]++; + if (options.initialFrameHeight) { + _$jscoverage['core/Editor.js'][314]++; + options.minFrameHeight = options.initialFrameHeight; + } + else { + _$jscoverage['core/Editor.js'][316]++; + options.initialFrameHeight = (options.minFrameHeight = container.offsetHeight); + } + _$jscoverage['core/Editor.js'][319]++; + container.style.width = (/%$/.test(options.initialFrameWidth)? "100%": ((options.initialFrameWidth - getStyleValue("padding-left") - getStyleValue("padding-right")) + "px")); + _$jscoverage['core/Editor.js'][321]++; + container.style.height = (/%$/.test(options.initialFrameHeight)? "100%": ((options.initialFrameHeight - getStyleValue("padding-top") - getStyleValue("padding-bottom")) + "px")); + _$jscoverage['core/Editor.js'][324]++; + container.style.zIndex = options.zIndex; + _$jscoverage['core/Editor.js'][326]++; + var html = (((ie && (browser.version < 9))? "": "") + "" + "" + (options.iframeCssUrl? (""): "") + (options.initialStyle? (""): "") + "" + ""); + _$jscoverage['core/Editor.js'][342]++; + container.appendChild(domUtils.createElement(document, "iframe", {id: ("ueditor_" + me.uid), width: "100%", height: "100%", frameborder: "0", src: ("javascript:void(function(){document.open();" + ((options.customDomain && (document.domain != location.hostname))? ("document.domain=\"" + document.domain + "\";"): "") + "document.write(\"" + html + "\");document.close();}())")})); + _$jscoverage['core/Editor.js'][350]++; + container.style.overflow = "hidden"; + _$jscoverage['core/Editor.js'][352]++; + setTimeout((function () { + _$jscoverage['core/Editor.js'][353]++; + if (/%$/.test(options.initialFrameWidth)) { + _$jscoverage['core/Editor.js'][354]++; + options.minFrameWidth = (options.initialFrameWidth = container.offsetWidth); + _$jscoverage['core/Editor.js'][355]++; + container.style.width = (options.initialFrameWidth + "px"); + } + _$jscoverage['core/Editor.js'][357]++; + if (/%$/.test(options.initialFrameHeight)) { + _$jscoverage['core/Editor.js'][358]++; + options.minFrameHeight = (options.initialFrameHeight = container.offsetHeight); + _$jscoverage['core/Editor.js'][359]++; + container.style.height = (options.initialFrameHeight + "px"); + } +})); + } +}), _setup: (function (doc) { + _$jscoverage['core/Editor.js'][373]++; + var me = this, options = me.options; + _$jscoverage['core/Editor.js'][375]++; + if (ie) { + _$jscoverage['core/Editor.js'][376]++; + doc.body.disabled = true; + _$jscoverage['core/Editor.js'][377]++; + doc.body.contentEditable = true; + _$jscoverage['core/Editor.js'][378]++; + doc.body.disabled = false; + } + else { + _$jscoverage['core/Editor.js'][380]++; + doc.body.contentEditable = true; + } + _$jscoverage['core/Editor.js'][382]++; + doc.body.spellcheck = false; + _$jscoverage['core/Editor.js'][383]++; + me.document = doc; + _$jscoverage['core/Editor.js'][384]++; + me.window = (doc.defaultView || doc.parentWindow); + _$jscoverage['core/Editor.js'][385]++; + me.iframe = me.window.frameElement; + _$jscoverage['core/Editor.js'][386]++; + me.body = doc.body; + _$jscoverage['core/Editor.js'][388]++; + me.selection = new (dom.Selection)(doc); + _$jscoverage['core/Editor.js'][390]++; + var geckoSel; + _$jscoverage['core/Editor.js'][391]++; + if ((browser.gecko && (geckoSel = this.selection.getNative()))) { + _$jscoverage['core/Editor.js'][392]++; + geckoSel.removeAllRanges(); + } + _$jscoverage['core/Editor.js'][394]++; + this._initEvents(); + _$jscoverage['core/Editor.js'][396]++; + for (var form = this.iframe.parentNode; (! domUtils.isBody(form)); (form = form.parentNode)) { + _$jscoverage['core/Editor.js'][397]++; + if ((form.tagName == "FORM")) { + _$jscoverage['core/Editor.js'][398]++; + me.form = form; + _$jscoverage['core/Editor.js'][399]++; + if (me.options.autoSyncData) { + _$jscoverage['core/Editor.js'][400]++; + domUtils.on(me.window, "blur", (function () { + _$jscoverage['core/Editor.js'][401]++; + setValue(form, me); +})); + } + else { + _$jscoverage['core/Editor.js'][404]++; + domUtils.on(form, "submit", (function () { + _$jscoverage['core/Editor.js'][405]++; + setValue(this, me); +})); + } + _$jscoverage['core/Editor.js'][408]++; + break; + } +} + _$jscoverage['core/Editor.js'][411]++; + if (options.initialContent) { + _$jscoverage['core/Editor.js'][412]++; + if (options.autoClearinitialContent) { + _$jscoverage['core/Editor.js'][413]++; + var oldExecCommand = me.execCommand; + _$jscoverage['core/Editor.js'][414]++; + me.execCommand = (function () { + _$jscoverage['core/Editor.js'][415]++; + me.fireEvent("firstBeforeExecCommand"); + _$jscoverage['core/Editor.js'][416]++; + return oldExecCommand.apply(me, arguments); +}); + _$jscoverage['core/Editor.js'][418]++; + this._setDefaultContent(options.initialContent); + } + else { + _$jscoverage['core/Editor.js'][420]++; + this.setContent(options.initialContent, false, true); + } + } + _$jscoverage['core/Editor.js'][425]++; + if (domUtils.isEmptyNode(me.body)) { + _$jscoverage['core/Editor.js'][426]++; + me.body.innerHTML = ("

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

    "); + } + _$jscoverage['core/Editor.js'][429]++; + if (options.focus) { + _$jscoverage['core/Editor.js'][430]++; + setTimeout((function () { + _$jscoverage['core/Editor.js'][431]++; + me.focus(me.options.focusInEnd); + _$jscoverage['core/Editor.js'][433]++; + ((! me.options.autoClearinitialContent) && me._selectionChange()); +}), 0); + } + _$jscoverage['core/Editor.js'][436]++; + if ((! me.container)) { + _$jscoverage['core/Editor.js'][437]++; + me.container = this.iframe.parentNode; + } + _$jscoverage['core/Editor.js'][439]++; + if ((options.fullscreen && me.ui)) { + _$jscoverage['core/Editor.js'][440]++; + me.ui.setFullScreen(true); + } + _$jscoverage['core/Editor.js'][443]++; + try { + _$jscoverage['core/Editor.js'][444]++; + me.document.execCommand("2D-position", false, false); + } + catch (e) { + } + _$jscoverage['core/Editor.js'][447]++; + try { + _$jscoverage['core/Editor.js'][448]++; + me.document.execCommand("enableInlineTableEditing", false, false); + } + catch (e) { + } + _$jscoverage['core/Editor.js'][451]++; + try { + _$jscoverage['core/Editor.js'][452]++; + me.document.execCommand("enableObjectResizing", false, false); + } + catch (e) { + } + _$jscoverage['core/Editor.js'][458]++; + me._bindshortcutKeys(); + _$jscoverage['core/Editor.js'][459]++; + me.isReady = 1; + _$jscoverage['core/Editor.js'][460]++; + me.fireEvent("ready"); + _$jscoverage['core/Editor.js'][461]++; + (options.onready && options.onready.call(me)); + _$jscoverage['core/Editor.js'][462]++; + if ((! browser.ie)) { + _$jscoverage['core/Editor.js'][463]++; + domUtils.on(me.window, ["blur", "focus"], (function (e) { + _$jscoverage['core/Editor.js'][465]++; + if ((e.type == "blur")) { + _$jscoverage['core/Editor.js'][466]++; + me._bakRange = me.selection.getRange(); + _$jscoverage['core/Editor.js'][467]++; + try { + _$jscoverage['core/Editor.js'][468]++; + me._bakNativeRange = me.selection.getNative().getRangeAt(0); + _$jscoverage['core/Editor.js'][469]++; + me.selection.getNative().removeAllRanges(); + } + catch (e) { + _$jscoverage['core/Editor.js'][471]++; + me._bakNativeRange = null; + } + } + else { + _$jscoverage['core/Editor.js'][475]++; + try { + _$jscoverage['core/Editor.js'][476]++; + (me._bakRange && me._bakRange.select()); + } + catch (e) { + } + } +})); + } + _$jscoverage['core/Editor.js'][483]++; + if ((browser.gecko && (browser.version <= 10902))) { + _$jscoverage['core/Editor.js'][485]++; + me.body.contentEditable = false; + _$jscoverage['core/Editor.js'][486]++; + setTimeout((function () { + _$jscoverage['core/Editor.js'][487]++; + me.body.contentEditable = true; +}), 100); + _$jscoverage['core/Editor.js'][489]++; + setInterval((function () { + _$jscoverage['core/Editor.js'][490]++; + me.body.style.height = ((me.iframe.offsetHeight - 20) + "px"); +}), 100); + } + _$jscoverage['core/Editor.js'][493]++; + ((! options.isShow) && me.setHide()); + _$jscoverage['core/Editor.js'][494]++; + (options.readonly && me.setDisabled()); +}), sync: (function (formId) { + _$jscoverage['core/Editor.js'][515]++; + var me = this, form = (formId? document.getElementById(formId): domUtils.findParent(me.iframe.parentNode, (function (node) { + _$jscoverage['core/Editor.js'][518]++; + return (node.tagName == "FORM"); +}), true)); + _$jscoverage['core/Editor.js'][520]++; + (form && setValue(form, me)); +}), setHeight: (function (height, notSetHeight) { + _$jscoverage['core/Editor.js'][533]++; + if ((height !== parseInt(this.iframe.parentNode.style.height))) { + _$jscoverage['core/Editor.js'][534]++; + this.iframe.parentNode.style.height = (height + "px"); + } + _$jscoverage['core/Editor.js'][536]++; + ((! notSetHeight) && (this.options.minFrameHeight = (this.options.initialFrameHeight = height))); + _$jscoverage['core/Editor.js'][538]++; + this.body.style.height = (height + "px"); +}), addshortcutkey: (function (cmd, keys) { + _$jscoverage['core/Editor.js'][564]++; + var obj = {}; + _$jscoverage['core/Editor.js'][565]++; + if (keys) { + _$jscoverage['core/Editor.js'][566]++; + obj[cmd] = keys; + } + else { + _$jscoverage['core/Editor.js'][568]++; + obj = cmd; + } + _$jscoverage['core/Editor.js'][570]++; + utils.extend(this.shortcutkeys, obj); +}), _bindshortcutKeys: (function () { + _$jscoverage['core/Editor.js'][579]++; + var me = this, shortcutkeys = this.shortcutkeys; + _$jscoverage['core/Editor.js'][580]++; + me.addListener("keydown", (function (type, e) { + _$jscoverage['core/Editor.js'][581]++; + var keyCode = (e.keyCode || e.which); + _$jscoverage['core/Editor.js'][582]++; + for (var i in shortcutkeys) { + _$jscoverage['core/Editor.js'][583]++; + var tmp = shortcutkeys[i].split(","); + _$jscoverage['core/Editor.js'][584]++; + for (var t = 0, ti; (ti = tmp[(t++)]);) { + _$jscoverage['core/Editor.js'][585]++; + ti = ti.split(":"); + _$jscoverage['core/Editor.js'][586]++; + var key = ti[0], param = ti[1]; + _$jscoverage['core/Editor.js'][587]++; + if ((/^(ctrl)(\+shift)?\+(\d+)$/.test(key.toLowerCase()) || /^(\d+)$/.test(key))) { + _$jscoverage['core/Editor.js'][588]++; + if (((((RegExp.$1 == "ctrl")? (e.ctrlKey || e.metaKey): 0) && ((RegExp.$2 != "")? e[(RegExp.$2.slice(1) + "Key")]: 1) && (keyCode == RegExp.$3)) || (keyCode == RegExp.$1))) { + _$jscoverage['core/Editor.js'][594]++; + if ((me.queryCommandState(i, param) != -1)) { + _$jscoverage['core/Editor.js'][595]++; + me.execCommand(i, param); + } + _$jscoverage['core/Editor.js'][596]++; + domUtils.preventDefault(e); + } + } +} +} +})); +}), getContent: (function (cmd, fn, notSetCursor, ignoreBlank, formatter) { + _$jscoverage['core/Editor.js'][635]++; + var me = this; + _$jscoverage['core/Editor.js'][636]++; + if ((cmd && utils.isFunction(cmd))) { + _$jscoverage['core/Editor.js'][637]++; + fn = cmd; + _$jscoverage['core/Editor.js'][638]++; + cmd = ""; + } + _$jscoverage['core/Editor.js'][640]++; + if ((fn? (! fn()): (! this.hasContents()))) { + _$jscoverage['core/Editor.js'][641]++; + return ""; + } + _$jscoverage['core/Editor.js'][643]++; + me.fireEvent("beforegetcontent"); + _$jscoverage['core/Editor.js'][644]++; + var root = UE.htmlparser(me.body.innerHTML, ignoreBlank); + _$jscoverage['core/Editor.js'][645]++; + me.filterOutputRule(root); + _$jscoverage['core/Editor.js'][646]++; + me.fireEvent("aftergetcontent", cmd); + _$jscoverage['core/Editor.js'][647]++; + return root.toHtml(formatter); +}), getAllHtml: (function () { + _$jscoverage['core/Editor.js'][660]++; + var me = this, headHtml = [], html = ""; + _$jscoverage['core/Editor.js'][663]++; + me.fireEvent("getAllHtml", headHtml); + _$jscoverage['core/Editor.js'][664]++; + if ((browser.ie && (browser.version > 8))) { + _$jscoverage['core/Editor.js'][665]++; + var headHtmlForIE9 = ""; + _$jscoverage['core/Editor.js'][666]++; + utils.each(me.document.styleSheets, (function (si) { + _$jscoverage['core/Editor.js'][667]++; + headHtmlForIE9 += (si.href? (""): ("")); +})); + _$jscoverage['core/Editor.js'][669]++; + utils.each(me.document.getElementsByTagName("script"), (function (si) { + _$jscoverage['core/Editor.js'][670]++; + headHtmlForIE9 += si.outerHTML; +})); + } + _$jscoverage['core/Editor.js'][674]++; + return ("" + (me.options.charset? (""): "") + (headHtmlForIE9 || me.document.getElementsByTagName("head")[0].innerHTML) + headHtml.join("\n") + "" + "" + me.getContent(null, null, true) + ""); +}), getPlainTxt: (function () { + _$jscoverage['core/Editor.js'][689]++; + var reg = new RegExp(domUtils.fillChar, "g"), html = this.body.innerHTML.replace(/[\n\r]/g, ""); + _$jscoverage['core/Editor.js'][691]++; + html = html.replace(/<(p|div)[^>]*>(| )<\/\1>/gi, "\n").replace(//gi, "\n").replace(/<[^>/]+>/g, "").replace(/(\n)?<\/([^>]+)>/g, (function (a, b, c) { + _$jscoverage['core/Editor.js'][695]++; + return (dtd.$block[c]? "\n": (b? b: "")); +})); + _$jscoverage['core/Editor.js'][698]++; + return html.replace(reg, "").replace(/\u00a0/g, " ").replace(/ /g, " "); +}), getContentTxt: (function () { + _$jscoverage['core/Editor.js'][711]++; + var reg = new RegExp(domUtils.fillChar, "g"); + _$jscoverage['core/Editor.js'][713]++; + return this.body[(browser.ie? "innerText": "textContent")].replace(reg, "").replace(/\u00a0/g, " "); +}), setContent: (function (html, isAppendTo, notFireSelectionchange) { + _$jscoverage['core/Editor.js'][755]++; + var me = this; + _$jscoverage['core/Editor.js'][757]++; + me.fireEvent("beforesetcontent", html); + _$jscoverage['core/Editor.js'][758]++; + var root = UE.htmlparser(html); + _$jscoverage['core/Editor.js'][759]++; + me.filterInputRule(root); + _$jscoverage['core/Editor.js'][760]++; + html = root.toHtml(); + _$jscoverage['core/Editor.js'][763]++; + me.body.innerHTML = ((isAppendTo? me.body.innerHTML: "") + html); + _$jscoverage['core/Editor.js'][766]++; + function isCdataDiv(node) { + _$jscoverage['core/Editor.js'][767]++; + return ((node.tagName == "DIV") && node.getAttribute("cdata_tag")); +} + _$jscoverage['core/Editor.js'][771]++; + if ((me.options.enterTag == "p")) { + _$jscoverage['core/Editor.js'][773]++; + var child = this.body.firstChild, tmpNode; + _$jscoverage['core/Editor.js'][774]++; + if (((! child) || ((child.nodeType == 1) && (dtd.$cdata[child.tagName] || isCdataDiv(child) || domUtils.isCustomeNode(child)) && (child === this.body.lastChild)))) { + _$jscoverage['core/Editor.js'][779]++; + this.body.innerHTML = ("

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

    " + this.body.innerHTML); + } + else { + _$jscoverage['core/Editor.js'][782]++; + var p = me.document.createElement("p"); + _$jscoverage['core/Editor.js'][783]++; + while (child) { + _$jscoverage['core/Editor.js'][784]++; + while ((child && ((child.nodeType == 3) || ((child.nodeType == 1) && dtd.p[child.tagName] && (! dtd.$cdata[child.tagName]))))) { + _$jscoverage['core/Editor.js'][785]++; + tmpNode = child.nextSibling; + _$jscoverage['core/Editor.js'][786]++; + p.appendChild(child); + _$jscoverage['core/Editor.js'][787]++; + child = tmpNode; +} + _$jscoverage['core/Editor.js'][789]++; + if (p.firstChild) { + _$jscoverage['core/Editor.js'][790]++; + if ((! child)) { + _$jscoverage['core/Editor.js'][791]++; + me.body.appendChild(p); + _$jscoverage['core/Editor.js'][792]++; + break; + } + else { + _$jscoverage['core/Editor.js'][794]++; + child.parentNode.insertBefore(p, child); + _$jscoverage['core/Editor.js'][795]++; + p = me.document.createElement("p"); + } + } + _$jscoverage['core/Editor.js'][798]++; + child = child.nextSibling; +} + } + } + _$jscoverage['core/Editor.js'][802]++; + me.fireEvent("aftersetcontent"); + _$jscoverage['core/Editor.js'][803]++; + me.fireEvent("contentchange"); + _$jscoverage['core/Editor.js'][805]++; + ((! notFireSelectionchange) && me._selectionChange()); + _$jscoverage['core/Editor.js'][807]++; + me._bakRange = (me._bakIERange = (me._bakNativeRange = null)); + _$jscoverage['core/Editor.js'][809]++; + var geckoSel; + _$jscoverage['core/Editor.js'][810]++; + if ((browser.gecko && (geckoSel = this.selection.getNative()))) { + _$jscoverage['core/Editor.js'][811]++; + geckoSel.removeAllRanges(); + } + _$jscoverage['core/Editor.js'][813]++; + if (me.options.autoSyncData) { + _$jscoverage['core/Editor.js'][814]++; + (me.form && setValue(me.form, me)); + } +}), focus: (function (toEnd) { + _$jscoverage['core/Editor.js'][837]++; + try { + _$jscoverage['core/Editor.js'][838]++; + var me = this, rng = me.selection.getRange(); + _$jscoverage['core/Editor.js'][840]++; + if (toEnd) { + _$jscoverage['core/Editor.js'][841]++; + rng.setStartAtLast(me.body.lastChild).setCursor(false, true); + } + else { + _$jscoverage['core/Editor.js'][843]++; + rng.select(true); + } + _$jscoverage['core/Editor.js'][845]++; + this.fireEvent("focus"); + } + catch (e) { + } +}), _initEvents: (function () { + _$jscoverage['core/Editor.js'][856]++; + var me = this, doc = me.document, win = me.window; + _$jscoverage['core/Editor.js'][859]++; + me._proxyDomEvent = utils.bind(me._proxyDomEvent, me); + _$jscoverage['core/Editor.js'][860]++; + domUtils.on(doc, ["click", "contextmenu", "mousedown", "keydown", "keyup", "keypress", "mouseup", "mouseover", "mouseout", "selectstart"], me._proxyDomEvent); + _$jscoverage['core/Editor.js'][861]++; + domUtils.on(win, ["focus", "blur"], me._proxyDomEvent); + _$jscoverage['core/Editor.js'][862]++; + domUtils.on(doc, ["mouseup", "keydown"], (function (evt) { + _$jscoverage['core/Editor.js'][864]++; + if (((evt.type == "keydown") && (evt.ctrlKey || evt.metaKey || evt.shiftKey || evt.altKey))) { + _$jscoverage['core/Editor.js'][865]++; + return; + } + _$jscoverage['core/Editor.js'][867]++; + if ((evt.button == 2)) { + _$jscoverage['core/Editor.js'][867]++; + return; + } + _$jscoverage['core/Editor.js'][868]++; + me._selectionChange(250, evt); +})); +}), _proxyDomEvent: (function (evt) { + _$jscoverage['core/Editor.js'][921]++; + return this.fireEvent(evt.type.replace(/^on/, ""), evt); +}), _selectionChange: (function (delay, evt) { + _$jscoverage['core/Editor.js'][929]++; + var me = this; + _$jscoverage['core/Editor.js'][936]++; + var hackForMouseUp = false; + _$jscoverage['core/Editor.js'][937]++; + var mouseX, mouseY; + _$jscoverage['core/Editor.js'][938]++; + if ((browser.ie && (browser.version < 9) && evt && (evt.type == "mouseup"))) { + _$jscoverage['core/Editor.js'][939]++; + var range = this.selection.getRange(); + _$jscoverage['core/Editor.js'][940]++; + if ((! range.collapsed)) { + _$jscoverage['core/Editor.js'][941]++; + hackForMouseUp = true; + _$jscoverage['core/Editor.js'][942]++; + mouseX = evt.clientX; + _$jscoverage['core/Editor.js'][943]++; + mouseY = evt.clientY; + } + } + _$jscoverage['core/Editor.js'][946]++; + clearTimeout(_selectionChangeTimer); + _$jscoverage['core/Editor.js'][947]++; + _selectionChangeTimer = setTimeout((function () { + _$jscoverage['core/Editor.js'][948]++; + if ((! me.selection.getNative())) { + _$jscoverage['core/Editor.js'][949]++; + return; + } + _$jscoverage['core/Editor.js'][953]++; + var ieRange; + _$jscoverage['core/Editor.js'][954]++; + if ((hackForMouseUp && (me.selection.getNative().type == "None"))) { + _$jscoverage['core/Editor.js'][955]++; + ieRange = me.document.body.createTextRange(); + _$jscoverage['core/Editor.js'][956]++; + try { + _$jscoverage['core/Editor.js'][957]++; + ieRange.moveToPoint(mouseX, mouseY); + } + catch (ex) { + _$jscoverage['core/Editor.js'][959]++; + ieRange = null; + } + } + _$jscoverage['core/Editor.js'][962]++; + var bakGetIERange; + _$jscoverage['core/Editor.js'][963]++; + if (ieRange) { + _$jscoverage['core/Editor.js'][964]++; + bakGetIERange = me.selection.getIERange; + _$jscoverage['core/Editor.js'][965]++; + me.selection.getIERange = (function () { + _$jscoverage['core/Editor.js'][966]++; + return ieRange; +}); + } + _$jscoverage['core/Editor.js'][969]++; + me.selection.cache(); + _$jscoverage['core/Editor.js'][970]++; + if (bakGetIERange) { + _$jscoverage['core/Editor.js'][971]++; + me.selection.getIERange = bakGetIERange; + } + _$jscoverage['core/Editor.js'][973]++; + if ((me.selection._cachedRange && me.selection._cachedStartElement)) { + _$jscoverage['core/Editor.js'][974]++; + me.fireEvent("beforeselectionchange"); + _$jscoverage['core/Editor.js'][976]++; + me.fireEvent("selectionchange", (! (! evt))); + _$jscoverage['core/Editor.js'][977]++; + me.fireEvent("afterselectionchange"); + _$jscoverage['core/Editor.js'][978]++; + me.selection.clear(); + } +}), (delay || 50)); +}), _callCmdFn: (function (fnName, args) { + _$jscoverage['core/Editor.js'][992]++; + var cmdName = args[0].toLowerCase(), cmd, cmdFn; + _$jscoverage['core/Editor.js'][994]++; + cmd = (this.commands[cmdName] || UE.commands[cmdName]); + _$jscoverage['core/Editor.js'][995]++; + cmdFn = (cmd && cmd[fnName]); + _$jscoverage['core/Editor.js'][997]++; + if ((((! cmd) || (! cmdFn)) && (fnName == "queryCommandState"))) { + _$jscoverage['core/Editor.js'][998]++; + return 0; + } + else { + _$jscoverage['core/Editor.js'][999]++; + if (cmdFn) { + _$jscoverage['core/Editor.js'][1000]++; + return cmdFn.apply(this, args); + } + } +}), execCommand: (function (cmdName) { + _$jscoverage['core/Editor.js'][1014]++; + cmdName = cmdName.toLowerCase(); + _$jscoverage['core/Editor.js'][1015]++; + var me = this, result, cmd = (me.commands[cmdName] || UE.commands[cmdName]); + _$jscoverage['core/Editor.js'][1018]++; + if (((! cmd) || (! cmd.execCommand))) { + _$jscoverage['core/Editor.js'][1019]++; + return null; + } + _$jscoverage['core/Editor.js'][1021]++; + if (((! cmd.notNeedUndo) && (! me.__hasEnterExecCommand))) { + _$jscoverage['core/Editor.js'][1022]++; + me.__hasEnterExecCommand = true; + _$jscoverage['core/Editor.js'][1023]++; + if ((me.queryCommandState.apply(me, arguments) != -1)) { + _$jscoverage['core/Editor.js'][1024]++; + me.fireEvent("beforeexeccommand", cmdName); + _$jscoverage['core/Editor.js'][1025]++; + result = this._callCmdFn("execCommand", arguments); + _$jscoverage['core/Editor.js'][1026]++; + ((! me._ignoreContentChange) && me.fireEvent("contentchange")); + _$jscoverage['core/Editor.js'][1027]++; + me.fireEvent("afterexeccommand", cmdName); + } + _$jscoverage['core/Editor.js'][1029]++; + me.__hasEnterExecCommand = false; + } + else { + _$jscoverage['core/Editor.js'][1031]++; + result = this._callCmdFn("execCommand", arguments); + _$jscoverage['core/Editor.js'][1032]++; + ((! me._ignoreContentChange) && me.fireEvent("contentchange")); + } + _$jscoverage['core/Editor.js'][1034]++; + ((! me._ignoreContentChange) && me._selectionChange()); + _$jscoverage['core/Editor.js'][1035]++; + return result; +}), queryCommandState: (function (cmdName) { + _$jscoverage['core/Editor.js'][1051]++; + return this._callCmdFn("queryCommandState", arguments); +}), queryCommandValue: (function (cmdName) { + _$jscoverage['core/Editor.js'][1062]++; + return this._callCmdFn("queryCommandValue", arguments); +}), hasContents: (function (tags) { + _$jscoverage['core/Editor.js'][1088]++; + if (tags) { + _$jscoverage['core/Editor.js'][1089]++; + for (var i = 0, ci; (ci = tags[(i++)]);) { + _$jscoverage['core/Editor.js'][1090]++; + if ((this.document.getElementsByTagName(ci).length > 0)) { + _$jscoverage['core/Editor.js'][1091]++; + return true; + } +} + } + _$jscoverage['core/Editor.js'][1095]++; + if ((! domUtils.isEmptyBlock(this.body))) { + _$jscoverage['core/Editor.js'][1096]++; + return true; + } + _$jscoverage['core/Editor.js'][1099]++; + tags = ["div"]; + _$jscoverage['core/Editor.js'][1100]++; + for (i = 0; (ci = tags[(i++)]);) { + _$jscoverage['core/Editor.js'][1101]++; + var nodes = domUtils.getElementsByTagName(this.document, ci); + _$jscoverage['core/Editor.js'][1102]++; + for (var n = 0, cn; (cn = nodes[(n++)]);) { + _$jscoverage['core/Editor.js'][1103]++; + if (domUtils.isCustomeNode(cn)) { + _$jscoverage['core/Editor.js'][1104]++; + return true; + } +} +} + _$jscoverage['core/Editor.js'][1108]++; + return false; +}), reset: (function () { + _$jscoverage['core/Editor.js'][1121]++; + this.fireEvent("reset"); +}), setEnabled: (function () { + _$jscoverage['core/Editor.js'][1133]++; + var me = this, range; + _$jscoverage['core/Editor.js'][1134]++; + if ((me.body.contentEditable == "false")) { + _$jscoverage['core/Editor.js'][1135]++; + me.body.contentEditable = true; + _$jscoverage['core/Editor.js'][1136]++; + range = me.selection.getRange(); + _$jscoverage['core/Editor.js'][1138]++; + try { + _$jscoverage['core/Editor.js'][1139]++; + range.moveToBookmark(me.lastBk); + _$jscoverage['core/Editor.js'][1140]++; + (delete me.lastBk); + } + catch (e) { + _$jscoverage['core/Editor.js'][1142]++; + range.setStartAtFirst(me.body).collapse(true); + } + _$jscoverage['core/Editor.js'][1144]++; + range.select(true); + _$jscoverage['core/Editor.js'][1145]++; + if (me.bkqueryCommandState) { + _$jscoverage['core/Editor.js'][1146]++; + me.queryCommandState = me.bkqueryCommandState; + _$jscoverage['core/Editor.js'][1147]++; + (delete me.bkqueryCommandState); + } + _$jscoverage['core/Editor.js'][1149]++; + me.fireEvent("selectionchange"); + } +}), enable: (function () { + _$jscoverage['core/Editor.js'][1164]++; + return this.setEnabled(); +}), setDisabled: (function (except) { + _$jscoverage['core/Editor.js'][1191]++; + var me = this; + _$jscoverage['core/Editor.js'][1192]++; + except = (except? (utils.isArray(except)? except: [except]): []); + _$jscoverage['core/Editor.js'][1193]++; + if ((me.body.contentEditable == "true")) { + _$jscoverage['core/Editor.js'][1194]++; + if ((! me.lastBk)) { + _$jscoverage['core/Editor.js'][1195]++; + me.lastBk = me.selection.getRange().createBookmark(true); + } + _$jscoverage['core/Editor.js'][1197]++; + me.body.contentEditable = false; + _$jscoverage['core/Editor.js'][1198]++; + me.bkqueryCommandState = me.queryCommandState; + _$jscoverage['core/Editor.js'][1199]++; + me.queryCommandState = (function (type) { + _$jscoverage['core/Editor.js'][1200]++; + if ((utils.indexOf(except, type) != -1)) { + _$jscoverage['core/Editor.js'][1201]++; + return me.bkqueryCommandState.apply(me, arguments); + } + _$jscoverage['core/Editor.js'][1203]++; + return -1; +}); + _$jscoverage['core/Editor.js'][1205]++; + me.fireEvent("selectionchange"); + } +}), disable: (function (except) { + _$jscoverage['core/Editor.js'][1236]++; + return this.setDisabled(except); +}), _setDefaultContent: (function () { + _$jscoverage['core/Editor.js'][1246]++; + function clear() { + _$jscoverage['core/Editor.js'][1247]++; + var me = this; + _$jscoverage['core/Editor.js'][1248]++; + if (me.document.getElementById("initContent")) { + _$jscoverage['core/Editor.js'][1249]++; + me.body.innerHTML = ("

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

    "); + _$jscoverage['core/Editor.js'][1250]++; + me.removeListener("firstBeforeExecCommand focus", clear); + _$jscoverage['core/Editor.js'][1251]++; + setTimeout((function () { + _$jscoverage['core/Editor.js'][1252]++; + me.focus(); + _$jscoverage['core/Editor.js'][1253]++; + me._selectionChange(); +}), 0); + } +} + _$jscoverage['core/Editor.js'][1258]++; + return (function (cont) { + _$jscoverage['core/Editor.js'][1259]++; + var me = this; + _$jscoverage['core/Editor.js'][1260]++; + me.body.innerHTML = ("

    " + cont + "

    "); + _$jscoverage['core/Editor.js'][1262]++; + me.addListener("firstBeforeExecCommand focus", clear); +}); +})(), setShow: (function () { + _$jscoverage['core/Editor.js'][1272]++; + var me = this, range = me.selection.getRange(); + _$jscoverage['core/Editor.js'][1273]++; + if ((me.container.style.display == "none")) { + _$jscoverage['core/Editor.js'][1275]++; + try { + _$jscoverage['core/Editor.js'][1276]++; + range.moveToBookmark(me.lastBk); + _$jscoverage['core/Editor.js'][1277]++; + (delete me.lastBk); + } + catch (e) { + _$jscoverage['core/Editor.js'][1279]++; + range.setStartAtFirst(me.body).collapse(true); + } + _$jscoverage['core/Editor.js'][1282]++; + setTimeout((function () { + _$jscoverage['core/Editor.js'][1283]++; + range.select(true); +}), 100); + _$jscoverage['core/Editor.js'][1285]++; + me.container.style.display = ""; + } +}), show: (function () { + _$jscoverage['core/Editor.js'][1299]++; + return this.setShow(); +}), setHide: (function () { + _$jscoverage['core/Editor.js'][1308]++; + var me = this; + _$jscoverage['core/Editor.js'][1309]++; + if ((! me.lastBk)) { + _$jscoverage['core/Editor.js'][1310]++; + me.lastBk = me.selection.getRange().createBookmark(true); + } + _$jscoverage['core/Editor.js'][1312]++; + me.container.style.display = "none"; +}), hide: (function () { + _$jscoverage['core/Editor.js'][1325]++; + return this.setHide(); +}), getLang: (function (path) { + _$jscoverage['core/Editor.js'][1339]++; + var lang = UE.I18N[this.options.lang]; + _$jscoverage['core/Editor.js'][1340]++; + if ((! lang)) { + _$jscoverage['core/Editor.js'][1341]++; + throw Error("not import language file"); + } + _$jscoverage['core/Editor.js'][1343]++; + path = (path || "").split("."); + _$jscoverage['core/Editor.js'][1344]++; + for (var i = 0, ci; (ci = path[(i++)]);) { + _$jscoverage['core/Editor.js'][1345]++; + lang = lang[ci]; + _$jscoverage['core/Editor.js'][1346]++; + if ((! lang)) { + _$jscoverage['core/Editor.js'][1346]++; + break; + } +} + _$jscoverage['core/Editor.js'][1348]++; + return lang; +}), getContentLength: (function (ingoneHtml, tagNames) { + _$jscoverage['core/Editor.js'][1385]++; + var count = this.getContent(false, false, true).length; + _$jscoverage['core/Editor.js'][1386]++; + if (ingoneHtml) { + _$jscoverage['core/Editor.js'][1387]++; + tagNames = (tagNames || []).concat(["hr", "img", "iframe"]); + _$jscoverage['core/Editor.js'][1388]++; + count = this.getContentTxt().replace(/[\t\r\n]+/g, "").length; + _$jscoverage['core/Editor.js'][1389]++; + for (var i = 0, ci; (ci = tagNames[(i++)]);) { + _$jscoverage['core/Editor.js'][1390]++; + count += this.document.getElementsByTagName(ci).length; +} + } + _$jscoverage['core/Editor.js'][1393]++; + return count; +}), addInputRule: (function (rule) { + _$jscoverage['core/Editor.js'][1410]++; + this.inputRules.push(rule); +}), filterInputRule: (function (root) { + _$jscoverage['core/Editor.js'][1424]++; + for (var i = 0, ci; (ci = this.inputRules[(i++)]);) { + _$jscoverage['core/Editor.js'][1425]++; + ci.call(this, root); +} +}), addOutputRule: (function (rule) { + _$jscoverage['core/Editor.js'][1443]++; + this.outputRules.push(rule); +}), filterOutputRule: (function (root) { + _$jscoverage['core/Editor.js'][1457]++; + for (var i = 0, ci; (ci = this.outputRules[(i++)]);) { + _$jscoverage['core/Editor.js'][1458]++; + ci.call(this, root); +} +})}; + _$jscoverage['core/Editor.js'][1462]++; + utils.inherits(Editor, EventBase); +})(); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/core/EventBase.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/core/EventBase.js new file mode 100644 index 000000000..1c090257d --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/core/EventBase.js @@ -0,0 +1,143 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['core/EventBase.js']) { + _$jscoverage['core/EventBase.js'] = []; + _$jscoverage['core/EventBase.js'][32] = 0; + _$jscoverage['core/EventBase.js'][35] = 0; + _$jscoverage['core/EventBase.js'][61] = 0; + _$jscoverage['core/EventBase.js'][62] = 0; + _$jscoverage['core/EventBase.js'][63] = 0; + _$jscoverage['core/EventBase.js'][80] = 0; + _$jscoverage['core/EventBase.js'][81] = 0; + _$jscoverage['core/EventBase.js'][82] = 0; + _$jscoverage['core/EventBase.js'][110] = 0; + _$jscoverage['core/EventBase.js'][111] = 0; + _$jscoverage['core/EventBase.js'][112] = 0; + _$jscoverage['core/EventBase.js'][113] = 0; + _$jscoverage['core/EventBase.js'][115] = 0; + _$jscoverage['core/EventBase.js'][116] = 0; + _$jscoverage['core/EventBase.js'][117] = 0; + _$jscoverage['core/EventBase.js'][118] = 0; + _$jscoverage['core/EventBase.js'][119] = 0; + _$jscoverage['core/EventBase.js'][120] = 0; + _$jscoverage['core/EventBase.js'][121] = 0; + _$jscoverage['core/EventBase.js'][123] = 0; + _$jscoverage['core/EventBase.js'][124] = 0; + _$jscoverage['core/EventBase.js'][128] = 0; + _$jscoverage['core/EventBase.js'][129] = 0; + _$jscoverage['core/EventBase.js'][132] = 0; + _$jscoverage['core/EventBase.js'][148] = 0; + _$jscoverage['core/EventBase.js'][149] = 0; + _$jscoverage['core/EventBase.js'][150] = 0; + _$jscoverage['core/EventBase.js'][151] = 0; +} +_$jscoverage['core/EventBase.js'].source = ["/**"," * 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(' ');"," for (var i = 0, ti; ti = types[i++];) {"," getListener(this, ti, true).push(listener);"," }"," },","",""," /**"," * 移除事件监听器"," * @method removeListener"," * @param { String } types 移除的事件名称,同时移除多个事件使用空格分隔"," * @param { Function } fn 移除监听事件的函数引用"," * @example"," * ```javascript"," * //changeCallback为方法体"," * editor.removeListener(\"selectionchange\",changeCallback);"," * ```"," */"," removeListener: function (types, listener) {"," types = utils.trim(types).split(' ');"," 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 可选参数,可以传入一个或多个参数,会传给事件触发的回调函数"," * @example"," * ```javascript"," * editor.fireEvent(\"selectionchange\");"," * ```"," */"," 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] = [] ) ) );","}"]; +_$jscoverage['core/EventBase.js'][32]++; +var EventBase = (UE.EventBase = (function () { +})); +_$jscoverage['core/EventBase.js'][35]++; +EventBase.prototype = {addListener: (function (types, listener) { + _$jscoverage['core/EventBase.js'][61]++; + types = utils.trim(types).split(" "); + _$jscoverage['core/EventBase.js'][62]++; + for (var i = 0, ti; (ti = types[(i++)]);) { + _$jscoverage['core/EventBase.js'][63]++; + getListener(this, ti, true).push(listener); +} +}), removeListener: (function (types, listener) { + _$jscoverage['core/EventBase.js'][80]++; + types = utils.trim(types).split(" "); + _$jscoverage['core/EventBase.js'][81]++; + for (var i = 0, ti; (ti = types[(i++)]);) { + _$jscoverage['core/EventBase.js'][82]++; + utils.removeItem((getListener(this, ti) || []), listener); +} +}), fireEvent: (function () { + _$jscoverage['core/EventBase.js'][110]++; + var types = arguments[0]; + _$jscoverage['core/EventBase.js'][111]++; + types = utils.trim(types).split(" "); + _$jscoverage['core/EventBase.js'][112]++; + for (var i = 0, ti; (ti = types[(i++)]);) { + _$jscoverage['core/EventBase.js'][113]++; + var listeners = getListener(this, ti), r, t, k; + _$jscoverage['core/EventBase.js'][115]++; + if (listeners) { + _$jscoverage['core/EventBase.js'][116]++; + k = listeners.length; + _$jscoverage['core/EventBase.js'][117]++; + while ((k--)) { + _$jscoverage['core/EventBase.js'][118]++; + if ((! listeners[k])) { + _$jscoverage['core/EventBase.js'][118]++; + continue; + } + _$jscoverage['core/EventBase.js'][119]++; + t = listeners[k].apply(this, arguments); + _$jscoverage['core/EventBase.js'][120]++; + if ((t === true)) { + _$jscoverage['core/EventBase.js'][121]++; + return t; + } + _$jscoverage['core/EventBase.js'][123]++; + if ((t !== undefined)) { + _$jscoverage['core/EventBase.js'][124]++; + r = t; + } +} + } + _$jscoverage['core/EventBase.js'][128]++; + if ((t = this[("on" + ti.toLowerCase())])) { + _$jscoverage['core/EventBase.js'][129]++; + r = t.apply(this, arguments); + } +} + _$jscoverage['core/EventBase.js'][132]++; + return r; +})}; +_$jscoverage['core/EventBase.js'][148]++; +function getListener(obj, type, force) { + _$jscoverage['core/EventBase.js'][149]++; + var allListeners; + _$jscoverage['core/EventBase.js'][150]++; + type = type.toLowerCase(); + _$jscoverage['core/EventBase.js'][151]++; + return ((allListeners = (obj.__allListeners || (force && (obj.__allListeners = {})))) && (allListeners[type] || (force && (allListeners[type] = [])))); +} diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/core/Range.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/core/Range.js new file mode 100644 index 000000000..21bb7e05d --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/core/Range.js @@ -0,0 +1,1888 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['core/Range.js']) { + _$jscoverage['core/Range.js'] = []; + _$jscoverage['core/Range.js'][22] = 0; + _$jscoverage['core/Range.js'][23] = 0; + _$jscoverage['core/Range.js'][31] = 0; + _$jscoverage['core/Range.js'][32] = 0; + _$jscoverage['core/Range.js'][38] = 0; + _$jscoverage['core/Range.js'][39] = 0; + _$jscoverage['core/Range.js'][41] = 0; + _$jscoverage['core/Range.js'][43] = 0; + _$jscoverage['core/Range.js'][44] = 0; + _$jscoverage['core/Range.js'][45] = 0; + _$jscoverage['core/Range.js'][47] = 0; + _$jscoverage['core/Range.js'][48] = 0; + _$jscoverage['core/Range.js'][49] = 0; + _$jscoverage['core/Range.js'][50] = 0; + _$jscoverage['core/Range.js'][51] = 0; + _$jscoverage['core/Range.js'][54] = 0; + _$jscoverage['core/Range.js'][55] = 0; + _$jscoverage['core/Range.js'][56] = 0; + _$jscoverage['core/Range.js'][57] = 0; + _$jscoverage['core/Range.js'][60] = 0; + _$jscoverage['core/Range.js'][61] = 0; + _$jscoverage['core/Range.js'][64] = 0; + _$jscoverage['core/Range.js'][67] = 0; + _$jscoverage['core/Range.js'][74] = 0; + _$jscoverage['core/Range.js'][75] = 0; + _$jscoverage['core/Range.js'][77] = 0; + _$jscoverage['core/Range.js'][78] = 0; + _$jscoverage['core/Range.js'][80] = 0; + _$jscoverage['core/Range.js'][81] = 0; + _$jscoverage['core/Range.js'][83] = 0; + _$jscoverage['core/Range.js'][84] = 0; + _$jscoverage['core/Range.js'][85] = 0; + _$jscoverage['core/Range.js'][87] = 0; + _$jscoverage['core/Range.js'][89] = 0; + _$jscoverage['core/Range.js'][91] = 0; + _$jscoverage['core/Range.js'][92] = 0; + _$jscoverage['core/Range.js'][94] = 0; + _$jscoverage['core/Range.js'][95] = 0; + _$jscoverage['core/Range.js'][96] = 0; + _$jscoverage['core/Range.js'][97] = 0; + _$jscoverage['core/Range.js'][98] = 0; + _$jscoverage['core/Range.js'][99] = 0; + _$jscoverage['core/Range.js'][101] = 0; + _$jscoverage['core/Range.js'][102] = 0; + _$jscoverage['core/Range.js'][105] = 0; + _$jscoverage['core/Range.js'][109] = 0; + _$jscoverage['core/Range.js'][110] = 0; + _$jscoverage['core/Range.js'][112] = 0; + _$jscoverage['core/Range.js'][113] = 0; + _$jscoverage['core/Range.js'][114] = 0; + _$jscoverage['core/Range.js'][116] = 0; + _$jscoverage['core/Range.js'][117] = 0; + _$jscoverage['core/Range.js'][118] = 0; + _$jscoverage['core/Range.js'][120] = 0; + _$jscoverage['core/Range.js'][122] = 0; + _$jscoverage['core/Range.js'][123] = 0; + _$jscoverage['core/Range.js'][124] = 0; + _$jscoverage['core/Range.js'][125] = 0; + _$jscoverage['core/Range.js'][127] = 0; + _$jscoverage['core/Range.js'][128] = 0; + _$jscoverage['core/Range.js'][129] = 0; + _$jscoverage['core/Range.js'][130] = 0; + _$jscoverage['core/Range.js'][131] = 0; + _$jscoverage['core/Range.js'][133] = 0; + _$jscoverage['core/Range.js'][134] = 0; + _$jscoverage['core/Range.js'][138] = 0; + _$jscoverage['core/Range.js'][139] = 0; + _$jscoverage['core/Range.js'][142] = 0; + _$jscoverage['core/Range.js'][143] = 0; + _$jscoverage['core/Range.js'][144] = 0; + _$jscoverage['core/Range.js'][145] = 0; + _$jscoverage['core/Range.js'][147] = 0; + _$jscoverage['core/Range.js'][148] = 0; + _$jscoverage['core/Range.js'][149] = 0; + _$jscoverage['core/Range.js'][152] = 0; + _$jscoverage['core/Range.js'][154] = 0; + _$jscoverage['core/Range.js'][155] = 0; + _$jscoverage['core/Range.js'][157] = 0; + _$jscoverage['core/Range.js'][158] = 0; + _$jscoverage['core/Range.js'][159] = 0; + _$jscoverage['core/Range.js'][193] = 0; + _$jscoverage['core/Range.js'][194] = 0; + _$jscoverage['core/Range.js'][195] = 0; + _$jscoverage['core/Range.js'][199] = 0; + _$jscoverage['core/Range.js'][200] = 0; + _$jscoverage['core/Range.js'][208] = 0; + _$jscoverage['core/Range.js'][209] = 0; + _$jscoverage['core/Range.js'][210] = 0; + _$jscoverage['core/Range.js'][211] = 0; + _$jscoverage['core/Range.js'][212] = 0; + _$jscoverage['core/Range.js'][213] = 0; + _$jscoverage['core/Range.js'][214] = 0; + _$jscoverage['core/Range.js'][218] = 0; + _$jscoverage['core/Range.js'][219] = 0; + _$jscoverage['core/Range.js'][220] = 0; + _$jscoverage['core/Range.js'][223] = 0; + _$jscoverage['core/Range.js'][235] = 0; + _$jscoverage['core/Range.js'][236] = 0; + _$jscoverage['core/Range.js'][237] = 0; + _$jscoverage['core/Range.js'][238] = 0; + _$jscoverage['core/Range.js'][239] = 0; + _$jscoverage['core/Range.js'][240] = 0; + _$jscoverage['core/Range.js'][241] = 0; + _$jscoverage['core/Range.js'][245] = 0; + _$jscoverage['core/Range.js'][263] = 0; + _$jscoverage['core/Range.js'][294] = 0; + _$jscoverage['core/Range.js'][295] = 0; + _$jscoverage['core/Range.js'][296] = 0; + _$jscoverage['core/Range.js'][298] = 0; + _$jscoverage['core/Range.js'][299] = 0; + _$jscoverage['core/Range.js'][300] = 0; + _$jscoverage['core/Range.js'][301] = 0; + _$jscoverage['core/Range.js'][302] = 0; + _$jscoverage['core/Range.js'][305] = 0; + _$jscoverage['core/Range.js'][338] = 0; + _$jscoverage['core/Range.js'][373] = 0; + _$jscoverage['core/Range.js'][407] = 0; + _$jscoverage['core/Range.js'][440] = 0; + _$jscoverage['core/Range.js'][473] = 0; + _$jscoverage['core/Range.js'][504] = 0; + _$jscoverage['core/Range.js'][535] = 0; + _$jscoverage['core/Range.js'][568] = 0; + _$jscoverage['core/Range.js'][602] = 0; + _$jscoverage['core/Range.js'][633] = 0; + _$jscoverage['core/Range.js'][665] = 0; + _$jscoverage['core/Range.js'][691] = 0; + _$jscoverage['core/Range.js'][720] = 0; + _$jscoverage['core/Range.js'][750] = 0; + _$jscoverage['core/Range.js'][751] = 0; + _$jscoverage['core/Range.js'][824] = 0; + _$jscoverage['core/Range.js'][825] = 0; + _$jscoverage['core/Range.js'][826] = 0; + _$jscoverage['core/Range.js'][827] = 0; + _$jscoverage['core/Range.js'][829] = 0; + _$jscoverage['core/Range.js'][830] = 0; + _$jscoverage['core/Range.js'][832] = 0; + _$jscoverage['core/Range.js'][833] = 0; + _$jscoverage['core/Range.js'][880] = 0; + _$jscoverage['core/Range.js'][882] = 0; + _$jscoverage['core/Range.js'][883] = 0; + _$jscoverage['core/Range.js'][885] = 0; + _$jscoverage['core/Range.js'][888] = 0; + _$jscoverage['core/Range.js'][890] = 0; + _$jscoverage['core/Range.js'][891] = 0; + _$jscoverage['core/Range.js'][893] = 0; + _$jscoverage['core/Range.js'][894] = 0; + _$jscoverage['core/Range.js'][898] = 0; + _$jscoverage['core/Range.js'][901] = 0; + _$jscoverage['core/Range.js'][1043] = 0; + _$jscoverage['core/Range.js'][1046] = 0; + _$jscoverage['core/Range.js'][1047] = 0; + _$jscoverage['core/Range.js'][1048] = 0; + _$jscoverage['core/Range.js'][1049] = 0; + _$jscoverage['core/Range.js'][1050] = 0; + _$jscoverage['core/Range.js'][1053] = 0; + _$jscoverage['core/Range.js'][1055] = 0; + _$jscoverage['core/Range.js'][1132] = 0; + _$jscoverage['core/Range.js'][1133] = 0; + _$jscoverage['core/Range.js'][1137] = 0; + _$jscoverage['core/Range.js'][1138] = 0; + _$jscoverage['core/Range.js'][1139] = 0; + _$jscoverage['core/Range.js'][1141] = 0; + _$jscoverage['core/Range.js'][1142] = 0; + _$jscoverage['core/Range.js'][1144] = 0; + _$jscoverage['core/Range.js'][1146] = 0; + _$jscoverage['core/Range.js'][1147] = 0; + _$jscoverage['core/Range.js'][1148] = 0; + _$jscoverage['core/Range.js'][1149] = 0; + _$jscoverage['core/Range.js'][1151] = 0; + _$jscoverage['core/Range.js'][1154] = 0; + _$jscoverage['core/Range.js'][1155] = 0; + _$jscoverage['core/Range.js'][1158] = 0; + _$jscoverage['core/Range.js'][1159] = 0; + _$jscoverage['core/Range.js'][1160] = 0; + _$jscoverage['core/Range.js'][1161] = 0; + _$jscoverage['core/Range.js'][1162] = 0; + _$jscoverage['core/Range.js'][1163] = 0; + _$jscoverage['core/Range.js'][1165] = 0; + _$jscoverage['core/Range.js'][1166] = 0; + _$jscoverage['core/Range.js'][1170] = 0; + _$jscoverage['core/Range.js'][1302] = 0; + _$jscoverage['core/Range.js'][1303] = 0; + _$jscoverage['core/Range.js'][1305] = 0; + _$jscoverage['core/Range.js'][1306] = 0; + _$jscoverage['core/Range.js'][1307] = 0; + _$jscoverage['core/Range.js'][1308] = 0; + _$jscoverage['core/Range.js'][1310] = 0; + _$jscoverage['core/Range.js'][1311] = 0; + _$jscoverage['core/Range.js'][1312] = 0; + _$jscoverage['core/Range.js'][1318] = 0; + _$jscoverage['core/Range.js'][1319] = 0; + _$jscoverage['core/Range.js'][1320] = 0; + _$jscoverage['core/Range.js'][1322] = 0; + _$jscoverage['core/Range.js'][1361] = 0; + _$jscoverage['core/Range.js'][1362] = 0; + _$jscoverage['core/Range.js'][1363] = 0; + _$jscoverage['core/Range.js'][1364] = 0; + _$jscoverage['core/Range.js'][1366] = 0; + _$jscoverage['core/Range.js'][1367] = 0; + _$jscoverage['core/Range.js'][1369] = 0; + _$jscoverage['core/Range.js'][1370] = 0; + _$jscoverage['core/Range.js'][1371] = 0; + _$jscoverage['core/Range.js'][1373] = 0; + _$jscoverage['core/Range.js'][1375] = 0; + _$jscoverage['core/Range.js'][1376] = 0; + _$jscoverage['core/Range.js'][1378] = 0; + _$jscoverage['core/Range.js'][1397] = 0; + _$jscoverage['core/Range.js'][1410] = 0; + _$jscoverage['core/Range.js'][1412] = 0; + _$jscoverage['core/Range.js'][1413] = 0; + _$jscoverage['core/Range.js'][1414] = 0; + _$jscoverage['core/Range.js'][1416] = 0; + _$jscoverage['core/Range.js'][1417] = 0; + _$jscoverage['core/Range.js'][1418] = 0; + _$jscoverage['core/Range.js'][1420] = 0; + _$jscoverage['core/Range.js'][1421] = 0; + _$jscoverage['core/Range.js'][1422] = 0; + _$jscoverage['core/Range.js'][1424] = 0; + _$jscoverage['core/Range.js'][1425] = 0; + _$jscoverage['core/Range.js'][1440] = 0; + _$jscoverage['core/Range.js'][1442] = 0; + _$jscoverage['core/Range.js'][1443] = 0; + _$jscoverage['core/Range.js'][1444] = 0; + _$jscoverage['core/Range.js'][1445] = 0; + _$jscoverage['core/Range.js'][1446] = 0; + _$jscoverage['core/Range.js'][1448] = 0; + _$jscoverage['core/Range.js'][1450] = 0; + _$jscoverage['core/Range.js'][1511] = 0; + _$jscoverage['core/Range.js'][1513] = 0; + _$jscoverage['core/Range.js'][1514] = 0; + _$jscoverage['core/Range.js'][1515] = 0; + _$jscoverage['core/Range.js'][1516] = 0; + _$jscoverage['core/Range.js'][1517] = 0; + _$jscoverage['core/Range.js'][1519] = 0; + _$jscoverage['core/Range.js'][1520] = 0; + _$jscoverage['core/Range.js'][1523] = 0; + _$jscoverage['core/Range.js'][1525] = 0; + _$jscoverage['core/Range.js'][1526] = 0; + _$jscoverage['core/Range.js'][1527] = 0; + _$jscoverage['core/Range.js'][1528] = 0; + _$jscoverage['core/Range.js'][1529] = 0; + _$jscoverage['core/Range.js'][1531] = 0; + _$jscoverage['core/Range.js'][1532] = 0; + _$jscoverage['core/Range.js'][1534] = 0; + _$jscoverage['core/Range.js'][1535] = 0; + _$jscoverage['core/Range.js'][1537] = 0; + _$jscoverage['core/Range.js'][1538] = 0; + _$jscoverage['core/Range.js'][1539] = 0; + _$jscoverage['core/Range.js'][1540] = 0; + _$jscoverage['core/Range.js'][1542] = 0; + _$jscoverage['core/Range.js'][1544] = 0; + _$jscoverage['core/Range.js'][1546] = 0; + _$jscoverage['core/Range.js'][1548] = 0; + _$jscoverage['core/Range.js'][1549] = 0; + _$jscoverage['core/Range.js'][1550] = 0; + _$jscoverage['core/Range.js'][1551] = 0; + _$jscoverage['core/Range.js'][1552] = 0; + _$jscoverage['core/Range.js'][1554] = 0; + _$jscoverage['core/Range.js'][1555] = 0; + _$jscoverage['core/Range.js'][1557] = 0; + _$jscoverage['core/Range.js'][1558] = 0; + _$jscoverage['core/Range.js'][1560] = 0; + _$jscoverage['core/Range.js'][1561] = 0; + _$jscoverage['core/Range.js'][1563] = 0; + _$jscoverage['core/Range.js'][1567] = 0; + _$jscoverage['core/Range.js'][1568] = 0; + _$jscoverage['core/Range.js'][1569] = 0; + _$jscoverage['core/Range.js'][1570] = 0; + _$jscoverage['core/Range.js'][1572] = 0; + _$jscoverage['core/Range.js'][1573] = 0; + _$jscoverage['core/Range.js'][1575] = 0; + _$jscoverage['core/Range.js'][1577] = 0; + _$jscoverage['core/Range.js'][1578] = 0; + _$jscoverage['core/Range.js'][1579] = 0; + _$jscoverage['core/Range.js'][1581] = 0; + _$jscoverage['core/Range.js'][1582] = 0; + _$jscoverage['core/Range.js'][1584] = 0; + _$jscoverage['core/Range.js'][1587] = 0; + _$jscoverage['core/Range.js'][1597] = 0; + _$jscoverage['core/Range.js'][1598] = 0; + _$jscoverage['core/Range.js'][1603] = 0; + _$jscoverage['core/Range.js'][1605] = 0; + _$jscoverage['core/Range.js'][1608] = 0; + _$jscoverage['core/Range.js'][1611] = 0; + _$jscoverage['core/Range.js'][1624] = 0; + _$jscoverage['core/Range.js'][1625] = 0; + _$jscoverage['core/Range.js'][1627] = 0; + _$jscoverage['core/Range.js'][1629] = 0; + _$jscoverage['core/Range.js'][1632] = 0; + _$jscoverage['core/Range.js'][1638] = 0; + _$jscoverage['core/Range.js'][1639] = 0; + _$jscoverage['core/Range.js'][1640] = 0; + _$jscoverage['core/Range.js'][1641] = 0; + _$jscoverage['core/Range.js'][1642] = 0; + _$jscoverage['core/Range.js'][1643] = 0; + _$jscoverage['core/Range.js'][1644] = 0; + _$jscoverage['core/Range.js'][1645] = 0; + _$jscoverage['core/Range.js'][1648] = 0; + _$jscoverage['core/Range.js'][1649] = 0; + _$jscoverage['core/Range.js'][1650] = 0; + _$jscoverage['core/Range.js'][1651] = 0; + _$jscoverage['core/Range.js'][1652] = 0; + _$jscoverage['core/Range.js'][1653] = 0; + _$jscoverage['core/Range.js'][1654] = 0; + _$jscoverage['core/Range.js'][1656] = 0; + _$jscoverage['core/Range.js'][1658] = 0; + _$jscoverage['core/Range.js'][1660] = 0; + _$jscoverage['core/Range.js'][1661] = 0; + _$jscoverage['core/Range.js'][1663] = 0; + _$jscoverage['core/Range.js'][1664] = 0; + _$jscoverage['core/Range.js'][1666] = 0; + _$jscoverage['core/Range.js'][1667] = 0; + _$jscoverage['core/Range.js'][1668] = 0; + _$jscoverage['core/Range.js'][1669] = 0; + _$jscoverage['core/Range.js'][1670] = 0; + _$jscoverage['core/Range.js'][1672] = 0; + _$jscoverage['core/Range.js'][1673] = 0; + _$jscoverage['core/Range.js'][1676] = 0; + _$jscoverage['core/Range.js'][1677] = 0; + _$jscoverage['core/Range.js'][1678] = 0; + _$jscoverage['core/Range.js'][1679] = 0; + _$jscoverage['core/Range.js'][1680] = 0; + _$jscoverage['core/Range.js'][1683] = 0; + _$jscoverage['core/Range.js'][1686] = 0; + _$jscoverage['core/Range.js'][1696] = 0; + _$jscoverage['core/Range.js'][1697] = 0; + _$jscoverage['core/Range.js'][1698] = 0; + _$jscoverage['core/Range.js'][1699] = 0; + _$jscoverage['core/Range.js'][1700] = 0; + _$jscoverage['core/Range.js'][1701] = 0; + _$jscoverage['core/Range.js'][1702] = 0; + _$jscoverage['core/Range.js'][1703] = 0; + _$jscoverage['core/Range.js'][1705] = 0; + _$jscoverage['core/Range.js'][1706] = 0; + _$jscoverage['core/Range.js'][1707] = 0; + _$jscoverage['core/Range.js'][1710] = 0; + _$jscoverage['core/Range.js'][1712] = 0; + _$jscoverage['core/Range.js'][1713] = 0; + _$jscoverage['core/Range.js'][1714] = 0; + _$jscoverage['core/Range.js'][1715] = 0; + _$jscoverage['core/Range.js'][1717] = 0; + _$jscoverage['core/Range.js'][1718] = 0; + _$jscoverage['core/Range.js'][1719] = 0; + _$jscoverage['core/Range.js'][1722] = 0; + _$jscoverage['core/Range.js'][1724] = 0; + _$jscoverage['core/Range.js'][1727] = 0; + _$jscoverage['core/Range.js'][1728] = 0; + _$jscoverage['core/Range.js'][1729] = 0; + _$jscoverage['core/Range.js'][1730] = 0; + _$jscoverage['core/Range.js'][1731] = 0; + _$jscoverage['core/Range.js'][1732] = 0; + _$jscoverage['core/Range.js'][1734] = 0; + _$jscoverage['core/Range.js'][1735] = 0; + _$jscoverage['core/Range.js'][1736] = 0; + _$jscoverage['core/Range.js'][1737] = 0; + _$jscoverage['core/Range.js'][1738] = 0; + _$jscoverage['core/Range.js'][1739] = 0; + _$jscoverage['core/Range.js'][1741] = 0; + _$jscoverage['core/Range.js'][1742] = 0; + _$jscoverage['core/Range.js'][1744] = 0; + _$jscoverage['core/Range.js'][1745] = 0; + _$jscoverage['core/Range.js'][1746] = 0; + _$jscoverage['core/Range.js'][1748] = 0; + _$jscoverage['core/Range.js'][1749] = 0; + _$jscoverage['core/Range.js'][1751] = 0; + _$jscoverage['core/Range.js'][1753] = 0; + _$jscoverage['core/Range.js'][1783] = 0; + _$jscoverage['core/Range.js'][1784] = 0; + _$jscoverage['core/Range.js'][1785] = 0; + _$jscoverage['core/Range.js'][1786] = 0; + _$jscoverage['core/Range.js'][1787] = 0; + _$jscoverage['core/Range.js'][1788] = 0; + _$jscoverage['core/Range.js'][1789] = 0; + _$jscoverage['core/Range.js'][1793] = 0; + _$jscoverage['core/Range.js'][1802] = 0; + _$jscoverage['core/Range.js'][1803] = 0; + _$jscoverage['core/Range.js'][1804] = 0; + _$jscoverage['core/Range.js'][1805] = 0; + _$jscoverage['core/Range.js'][1806] = 0; + _$jscoverage['core/Range.js'][1807] = 0; + _$jscoverage['core/Range.js'][1808] = 0; + _$jscoverage['core/Range.js'][1809] = 0; + _$jscoverage['core/Range.js'][1810] = 0; + _$jscoverage['core/Range.js'][1812] = 0; + _$jscoverage['core/Range.js'][1814] = 0; + _$jscoverage['core/Range.js'][1817] = 0; + _$jscoverage['core/Range.js'][1818] = 0; + _$jscoverage['core/Range.js'][1819] = 0; + _$jscoverage['core/Range.js'][1820] = 0; + _$jscoverage['core/Range.js'][1821] = 0; + _$jscoverage['core/Range.js'][1822] = 0; + _$jscoverage['core/Range.js'][1823] = 0; + _$jscoverage['core/Range.js'][1824] = 0; + _$jscoverage['core/Range.js'][1826] = 0; + _$jscoverage['core/Range.js'][1828] = 0; + _$jscoverage['core/Range.js'][1830] = 0; + _$jscoverage['core/Range.js'][1831] = 0; + _$jscoverage['core/Range.js'][1832] = 0; + _$jscoverage['core/Range.js'][1834] = 0; + _$jscoverage['core/Range.js'][1835] = 0; + _$jscoverage['core/Range.js'][1836] = 0; + _$jscoverage['core/Range.js'][1837] = 0; + _$jscoverage['core/Range.js'][1838] = 0; + _$jscoverage['core/Range.js'][1839] = 0; + _$jscoverage['core/Range.js'][1842] = 0; + _$jscoverage['core/Range.js'][1843] = 0; + _$jscoverage['core/Range.js'][1845] = 0; + _$jscoverage['core/Range.js'][1846] = 0; + _$jscoverage['core/Range.js'][1849] = 0; + _$jscoverage['core/Range.js'][1851] = 0; + _$jscoverage['core/Range.js'][1853] = 0; + _$jscoverage['core/Range.js'][1854] = 0; + _$jscoverage['core/Range.js'][1855] = 0; + _$jscoverage['core/Range.js'][1858] = 0; + _$jscoverage['core/Range.js'][1859] = 0; + _$jscoverage['core/Range.js'][1861] = 0; + _$jscoverage['core/Range.js'][1866] = 0; + _$jscoverage['core/Range.js'][1867] = 0; + _$jscoverage['core/Range.js'][1868] = 0; + _$jscoverage['core/Range.js'][1871] = 0; + _$jscoverage['core/Range.js'][1883] = 0; + _$jscoverage['core/Range.js'][1884] = 0; + _$jscoverage['core/Range.js'][1885] = 0; + _$jscoverage['core/Range.js'][1888] = 0; + _$jscoverage['core/Range.js'][1895] = 0; + _$jscoverage['core/Range.js'][1897] = 0; + _$jscoverage['core/Range.js'][1898] = 0; + _$jscoverage['core/Range.js'][1899] = 0; + _$jscoverage['core/Range.js'][1900] = 0; + _$jscoverage['core/Range.js'][1901] = 0; + _$jscoverage['core/Range.js'][1902] = 0; + _$jscoverage['core/Range.js'][1905] = 0; + _$jscoverage['core/Range.js'][1906] = 0; + _$jscoverage['core/Range.js'][1907] = 0; + _$jscoverage['core/Range.js'][1908] = 0; + _$jscoverage['core/Range.js'][1910] = 0; + _$jscoverage['core/Range.js'][1911] = 0; + _$jscoverage['core/Range.js'][1912] = 0; + _$jscoverage['core/Range.js'][1916] = 0; + _$jscoverage['core/Range.js'][1917] = 0; + _$jscoverage['core/Range.js'][1918] = 0; + _$jscoverage['core/Range.js'][1920] = 0; + _$jscoverage['core/Range.js'][1923] = 0; + _$jscoverage['core/Range.js'][1928] = 0; + _$jscoverage['core/Range.js'][1929] = 0; + _$jscoverage['core/Range.js'][1930] = 0; + _$jscoverage['core/Range.js'][1931] = 0; + _$jscoverage['core/Range.js'][1933] = 0; + _$jscoverage['core/Range.js'][1951] = 0; + _$jscoverage['core/Range.js'][1952] = 0; + _$jscoverage['core/Range.js'][1955] = 0; + _$jscoverage['core/Range.js'][1956] = 0; + _$jscoverage['core/Range.js'][1957] = 0; + _$jscoverage['core/Range.js'][1958] = 0; + _$jscoverage['core/Range.js'][1959] = 0; + _$jscoverage['core/Range.js'][1967] = 0; + _$jscoverage['core/Range.js'][1968] = 0; + _$jscoverage['core/Range.js'][1971] = 0; + _$jscoverage['core/Range.js'][1973] = 0; + _$jscoverage['core/Range.js'][2000] = 0; + _$jscoverage['core/Range.js'][2002] = 0; + _$jscoverage['core/Range.js'][2003] = 0; + _$jscoverage['core/Range.js'][2004] = 0; + _$jscoverage['core/Range.js'][2006] = 0; + _$jscoverage['core/Range.js'][2007] = 0; + _$jscoverage['core/Range.js'][2009] = 0; + _$jscoverage['core/Range.js'][2011] = 0; + _$jscoverage['core/Range.js'][2012] = 0; + _$jscoverage['core/Range.js'][2013] = 0; + _$jscoverage['core/Range.js'][2014] = 0; + _$jscoverage['core/Range.js'][2015] = 0; + _$jscoverage['core/Range.js'][2016] = 0; + _$jscoverage['core/Range.js'][2018] = 0; + _$jscoverage['core/Range.js'][2020] = 0; + _$jscoverage['core/Range.js'][2021] = 0; + _$jscoverage['core/Range.js'][2022] = 0; + _$jscoverage['core/Range.js'][2024] = 0; + _$jscoverage['core/Range.js'][2025] = 0; + _$jscoverage['core/Range.js'][2026] = 0; + _$jscoverage['core/Range.js'][2027] = 0; + _$jscoverage['core/Range.js'][2028] = 0; + _$jscoverage['core/Range.js'][2029] = 0; + _$jscoverage['core/Range.js'][2031] = 0; + _$jscoverage['core/Range.js'][2032] = 0; + _$jscoverage['core/Range.js'][2033] = 0; + _$jscoverage['core/Range.js'][2034] = 0; + _$jscoverage['core/Range.js'][2037] = 0; + _$jscoverage['core/Range.js'][2044] = 0; + _$jscoverage['core/Range.js'][2046] = 0; + _$jscoverage['core/Range.js'][2047] = 0; + _$jscoverage['core/Range.js'][2049] = 0; + _$jscoverage['core/Range.js'][2050] = 0; + _$jscoverage['core/Range.js'][2052] = 0; + _$jscoverage['core/Range.js'][2053] = 0; + _$jscoverage['core/Range.js'][2054] = 0; + _$jscoverage['core/Range.js'][2056] = 0; + _$jscoverage['core/Range.js'][2085] = 0; + _$jscoverage['core/Range.js'][2086] = 0; + _$jscoverage['core/Range.js'][2087] = 0; + _$jscoverage['core/Range.js'][2089] = 0; + _$jscoverage['core/Range.js'][2090] = 0; + _$jscoverage['core/Range.js'][2091] = 0; + _$jscoverage['core/Range.js'][2092] = 0; + _$jscoverage['core/Range.js'][2093] = 0; + _$jscoverage['core/Range.js'][2094] = 0; + _$jscoverage['core/Range.js'][2095] = 0; + _$jscoverage['core/Range.js'][2098] = 0; + _$jscoverage['core/Range.js'][2099] = 0; + _$jscoverage['core/Range.js'][2100] = 0; + _$jscoverage['core/Range.js'][2102] = 0; + _$jscoverage['core/Range.js'][2105] = 0; + _$jscoverage['core/Range.js'][2106] = 0; + _$jscoverage['core/Range.js'][2108] = 0; + _$jscoverage['core/Range.js'][2112] = 0; + _$jscoverage['core/Range.js'][2113] = 0; + _$jscoverage['core/Range.js'][2114] = 0; + _$jscoverage['core/Range.js'][2214] = 0; + _$jscoverage['core/Range.js'][2215] = 0; + _$jscoverage['core/Range.js'][2216] = 0; + _$jscoverage['core/Range.js'][2219] = 0; + _$jscoverage['core/Range.js'][2220] = 0; + _$jscoverage['core/Range.js'][2221] = 0; + _$jscoverage['core/Range.js'][2222] = 0; + _$jscoverage['core/Range.js'][2224] = 0; +} +_$jscoverage['core/Range.js'].source = ["/**"," * Range封装"," * @file"," * @module UE.dom"," * @class Range"," * @since 1.2.6.1"," */","","/**"," * dom操作封装"," * @unfile"," * @module UE.dom"," */","","/**"," * Range实现类,本类是UEditor底层核心类,统一w3cRange和ieRange之间的差异,包括接口和属性"," * @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"," */",""," /**"," * @property { Node } startContainer 当前Range的开始边界的容器节点, 可以是一个元素节点或者是文本节点"," */",""," /**"," * @property { Node } startOffset 当前Range的开始边界容器节点的偏移量, 如果是元素节点,"," * 该值就是childNodes中的第几个节点, 如果是文本节点就是文本内容的第几个字符"," */",""," /**"," * @property { Node } endContainer 当前Range的结束边界的容器节点, 可以是一个元素节点或者是文本节点"," */",""," /**"," * @property { Node } endOffset 当前Range的结束边界容器节点的偏移量, 如果是元素节点,"," * 该值就是childNodes中的第几个节点, 如果是文本节点就是文本内容的第几个字符"," */",""," /**"," * @property { Boolean } collapsed 当前Range是否是闭合的"," */",""," /**"," * @property { Document } document 当前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"," * <!-- 被选中的内容 -->"," * <div>123</div><div>456</div>"," *"," * <script>"," * //output: 2"," * console.log( range.cloneContents().childNodes.length );"," * </script>"," * ```"," */"," cloneContents:function () {"," return this.collapsed ? null : execContentsAction(this, 0);"," },",""," /**"," * 删除当前选区范围中的所有内容"," * @method deleteContents"," * @remind 执行完该操作后, 当前Range对象变成了闭合状态"," * @remind 执行该操作会引起当前Range对象的其他属性的变化"," * @return { UE.dom.Range } 当前操作的Range对象"," * @example"," * ```html"," * <body>"," * <!-- 选区开始 -->"," * <div></div>"," * <span></span>"," * <!-- 选区结束 -->"," * </body>"," *"," * <script>"," * //output: 5"," * console.log( document.body.childNodes.length );"," *"," * //执行删除选区内容操作"," * range.deleteContents();"," *"," * //output: 2"," * console.log( document.body.childNodes.length );"," * </script>"," * ```"," */"," 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"," * <body>"," * <!-- 选区开始 -->"," * <div></div>"," * <span></span>"," * <!-- 选区结束 -->"," * </body>"," * <script>"," * //output: 5"," * console.log( document.body.childNodes.length );"," *"," * //执行选区内容提取"," * var contents = range.extractContents();"," *"," * //output: 2"," * console.log( document.body.childNodes.length );"," *"," * //output: 3"," * console.log( contents.childNodes.length );"," *"," * </script>"," */"," extractContents:function () {"," return this.collapsed ? null : execContentsAction(this, 2);"," },",""," /**"," * 设置Range的开始位置"," * @method setStart"," * @remind 如果容器节点是元素节点,那么offset指的是其子元素中索引为offset的元素,"," * 如果是文本节点,那么offset指的是其文本内容的第offset个字符"," * @param { Node } node 将被设为当前选区开始边界容器的节点对象"," * @param { int } offset 开始容器的偏移量"," * @return { UE.dom.Range } 当前range对象"," * @example"," * ```html"," * <body>"," * <div id=\"test\"></div>"," * <!-- 选区开始 -->"," * <span></span>"," * <a></a>"," * <!-- 选区结束 -->"," * </body>"," *"," * <script>"," *"," * //output: SPAN"," * console.log( range.startContainer.tagName );"," *"," * range.setStart( document.getElementById( \"test\" ), 0 );"," *"," * //output: DIV"," * console.log( range.startContainer.tagName );"," *"," * </script>"," * ```"," */"," 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对象"," * @example"," * ```html"," * <body>"," * <!-- 选区开始 -->"," * <span></span>"," * <a></a>"," * <!-- 选区结束 -->"," * <div id=\"test\"></div>"," * </body>"," *"," * <script>"," *"," * //output: A"," * console.log( range.endContainer.tagName );"," *"," * range.setEnd( document.getElementById( \"test\" ), 0 );"," *"," * //output: DIV"," * console.log( range.endContainer.tagName );"," *"," * </script>"," * ```"," */"," setEnd:function (node, offset) {"," return setEndPoint(false, node, offset, this);"," },",""," /**"," * 将Range开始位置设置到node节点之后"," * @method setStartAfter"," * @param { Node } node 当前选区开始边界之前的节点"," * @see UE.dom.Range:setStart(Node,int)"," * @return { UE.dom.Range } 当前range对象"," * @example"," * ```html"," * <body>"," * <div id=\"test\"></div>"," * <span></span>"," * <!-- 选区开始 -->"," * <a></a>"," * <!-- 选区结束 -->"," * </body>"," *"," * <script>"," *"," * //output: A"," * console.log( range.startContainer.tagName );"," *"," * range.setStartAfter( document.getElementById( \"test\" ) );"," *"," * //output: SPAN"," * console.log( range.startContainer.tagName );"," *"," * </script>"," * ```"," */"," setStartAfter:function (node) {"," return this.setStart(node.parentNode, domUtils.getNodeIndex(node) + 1);"," },",""," /**"," * 将Range开始位置设置到node节点之前"," * @method setStartBefore"," * @param { Node } node 新的选区开始位置在该节点之前"," * @see UE.dom.Range:setStart(Node,int)"," * @return { UE.dom.Range } 当前range对象"," * @example"," * ```html"," * <body>"," * <span></span>"," * <div id=\"test\"></div>"," * <!-- 选区开始 -->"," * <a></a>"," * <!-- 选区结束 -->"," * </body>"," *"," * <script>"," *"," * //output: A"," * console.log( range.startContainer.tagName );"," *"," * range.setStartBefore( document.getElementById( \"test\" ) );"," *"," * //output: SPAN"," * console.log( range.startContainer.tagName );"," *"," * </script>"," * ```"," */"," setStartBefore:function (node) {"," return this.setStart(node.parentNode, domUtils.getNodeIndex(node));"," },",""," /**"," * 将Range结束位置设置到node节点之后"," * @method setEndAfter"," * @param { Node } node 目标节点"," * @see UE.dom.Range:setStart(Node,int)"," * @return { UE.dom.Range } 当前range对象"," * @example"," * ```html"," * <body>"," * <!-- 选区开始 -->"," * <a></a>"," * <!-- 选区结束 -->"," * <span></span>"," * <div id=\"test\"></div>"," *"," * <script>"," * //output: A"," * console.log( range.endContainer.tagName );"," *"," * range.setEndAfter( document.getElementById( \"test\" ) );"," *"," * //output: DIV"," * console.log( range.endContainer.tagName );"," * </script>"," * </body>"," * ```"," */"," setEndAfter:function (node) {"," return this.setEnd(node.parentNode, domUtils.getNodeIndex(node) + 1);"," },",""," /**"," * 将Range结束位置设置到node节点之前"," * @method setEndBefore"," * @param { Node } node 目标节点"," * @see UE.dom.Range:setStart(Node,int)"," * @return { UE.dom.Range } 当前range对象"," * @example"," * ```html"," * <body>"," * <!-- 选区开始 -->"," * <a></a>"," * <!-- 选区结束 -->"," * <span></span>"," * <div id=\"test\"></div>"," *"," * <script>"," * //output: A"," * console.log( range.endContainer.tagName );"," *"," * range.setEndBefore( document.getElementById( \"test\" ) );"," *"," * //output: SPAN"," * console.log( range.endContainer.tagName );"," * </script>"," * </body>"," * ```"," */"," setEndBefore:function (node) {"," return this.setEnd(node.parentNode, domUtils.getNodeIndex(node));"," },",""," /**"," * 设置Range的开始位置设置到node节点内的第一个节点处"," * @method setStartAtFirst"," * @param { Node } node 目标节点"," * @see UE.dom.Range:setStart(Node,int)"," * @return { UE.dom.Range } 当前range对象"," * @example"," * ```html"," * <body>"," * <div id=\"test\">"," * <i></i>"," * <!-- 选区开始 -->"," * <a></a>"," * <!-- 选区结束 -->"," * <span></span>"," * </div>"," *"," * <script>"," * //output: '<a></a>'"," * console.log( range.cloneContents() );"," *"," * range.setStartAtFirst( document.getElementById(\"test\") );"," *"," * //output: '<i></i><a></a>'"," * console.log( range.cloneContents() );"," * </script>"," * </body>"," * ```"," */"," setStartAtFirst:function (node) {"," return this.setStart(node, 0);"," },",""," /**"," * 设置Range的开始位置设置到node节点内的最后一个节点处"," * @method setStartAtLast"," * @param { Node } node 目标节点"," * @see UE.dom.Range:setStart(Node,int)"," * @return { UE.dom.Range } 当前range对象"," * @example"," * ```html"," * <body>"," * <div id=\"test\">"," * <i></i>"," * <!-- 选区开始 -->"," * <a></a>"," * <!-- 选区结束 -->"," * <span></span>"," * </div>"," *"," * <script>"," * //output: <a></a>"," * console.log( range.cloneContents() );"," *"," * range.setStartAtLast( document.body );"," *"," * //选区已经闭合, 输出空字符串"," * //output: ''"," * console.log( range.cloneContents() );"," * </script>"," * </body>"," * ```"," */"," setStartAtLast:function (node) {"," return this.setStart(node, node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length);"," },",""," /**"," * 设置Range的结束位置设置到node节点内的第一个节点处"," * @method setEndAtFirst"," * @param { Node } node 目标节点"," * @see UE.dom.Range:setStart(Node,int)"," * @return { UE.dom.Range } 当前range对象"," * @example"," * ```html"," * <body>"," * <!-- 选区开始 -->"," * <a></a>"," * <!-- 选区结束 -->"," * <span></span>"," * <div id=\"test\"></div>"," *"," * <script>"," * //output: '<a></a>'"," * console.log( range.cloneContents() );"," *"," * range.setEndAtFirst( document.getElementById(\"test\") );"," *"," * //output: '<a></a><div></div>'"," * console.log( range.cloneContents() );"," * </script>"," * </body>"," * ```"," */"," setEndAtFirst:function (node) {"," return this.setEnd(node, 0);"," },",""," /**"," * 设置Range的结束位置设置到node节点内的最后一个节点处"," * @method setEndAtLast"," * @param { Node } node 目标节点"," * @see UE.dom.Range:setStart(Node,int)"," * @return { UE.dom.Range } 当前range对象"," * @example"," * ```html"," * <body>"," * <div id=\"test\">"," * <!-- 选区开始 -->"," * <a></a>"," * <!-- 选区结束 -->"," * <span></span>"," * </div>"," *"," * <script>"," * //output: '<a></a>'"," * console.log( range.cloneContents() );"," *"," * range.setEndAtLast( document.getElementById(\"test\") );"," *"," * //output: '<a></a><span></span>'"," * console.log( range.cloneContents() );"," * </script>"," * </body>"," * ```"," */"," setEndAtLast:function (node) {"," return this.setEnd(node, node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length);"," },",""," /**"," * 选中一个节点, 并返回包含这个节点的range对象"," * @method selectNode"," * @param { Node } node 需要选中的节点"," * @return { UE.dom.Range } 当前range对象, 但是选区已经改变, 包含了当前选择的节点对象"," * @example"," * ```html"," * <body>"," *"," * <div id=\"test\"></div>"," *"," * <script>"," *"," * range.selectNode( document.getElementById(\"test\") );"," *"," * //output: '<div id=\"test\"></div>'"," * console.log( range.cloneContents() );"," *"," * </script>"," * </body>"," * ```"," */"," selectNode:function (node) {"," return this.setStartBefore(node).setEndAfter(node);"," },",""," /**"," * 选中给定节点内部的所有节点, 并返回包含这个节点内容的range对象"," * @method selectNodeContents"," * @param { Node } node 目标节点, 当前range将包含该节点内的所有节点"," * @return { UE.dom.Range } 当前range对象, 包含了当前选择的节点对象的所有子节点"," * @example"," * ```html"," * <body>"," *"," * <div id=\"test\">"," * <a></a>"," * <i></i>"," * </div>"," *"," * <script>"," *"," * range.selectNodeContents( document.getElementById(\"test\") );"," *"," * //output: '<a></a><i></i>'"," * console.log( range.cloneContents() );"," *"," * </script>"," * </body>"," * ```"," */"," selectNodeContents:function (node) {"," return this.setStart(node, 0).setEndAtLast(node);"," },",""," /**"," * clone当前Range对象"," * @method cloneRange"," * @return { UE.dom.Range } 当前range对象的一个副本"," * @example"," * ```html"," * <body>"," *"," * <div id=\"test\">"," * <!-- 选区开始 -->"," * <a></a>"," * <i></i>"," * <!-- 选区结束 -->"," * </div>"," *"," * <script>"," *"," * var cloneRange = range.cloneRange();"," *"," * //output: '<a></a><i></i>'"," * console.log( cloneRange.cloneContents() );"," *"," * </script>"," * </body>"," * ```"," */"," 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"," * <body>"," *"," * <div id=\"test\">"," * <!-- 选区开始 -->"," * <a></a>"," * <i></i>"," * <!-- 选区结束 -->"," * </div>"," *"," * <script>"," *"," * //output: '<a></a><i></i>'"," * console.log( range.cloneContents() );"," * //output: 1"," * console.log( range.startOffset );"," *"," * range.collapse();"," *"," * //output: ''"," * console.log( range.cloneContents() );"," * //output: 3"," * console.log( range.startOffset );"," *"," * </script>"," * </body>"," * ```"," */",""," /**"," * 闭合当前选区,根据给定的toStart参数项决定是向尾部闭合还是向前闭合,"," * 如果toStart的值为true,则闭合到首部, 反之,则闭合到尾部"," * @method collapse"," * @param { Boolean } toStart 是否向前闭合选区"," * @return { UE.dom.Range } 当前range对象"," * @example"," * ```html"," * <body>"," *"," * <div id=\"test\">"," * <!-- 选区开始 -->"," * <a></a>"," * <i></i>"," * <!-- 选区结束 -->"," * </div>"," *"," * <script>"," *"," * //output: '<a></a><i></i>'"," * console.log( range.cloneContents() );"," * //output: 1"," * console.log( range.startOffset );"," *"," * range.collapse();"," *"," * //output: ''"," * console.log( range.cloneContents() );"," * //output: 3"," * console.log( range.startOffset );"," *"," * </script>"," * </body>"," * ```"," */"," 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的边界,使其\"收缩\"到最小的位置"," * @name shrinkBoundary"," * @grammar range.shrinkBoundary() => Range //range开始位置和结束位置都调整,参见<code><a href=\"#adjustmentboundary\">adjustmentBoundary</a></code>"," * @grammar range.shrinkBoundary(true) => Range //仅调整开始位置,忽略结束位置"," * @example"," * <b>xx[</b>xxxxx] ==> <b>xx</b>[xxxxx]"," * <b>x[xx</b><i>]xxx</i> ==> <b>x[xx]</b><i>xxx</i>"," * [<b><i>xxxx</i>xxxxxxx</b>] ==> <b><i>[xxxx</i>xxxxxxx]</b>"," */"," /**"," * 调整range的开始位置和结束位置,使其\"收缩\"到最小的位置"," * @method shrinkBoundary"," * @return { UE.dom.Range } 当前range对象"," * @example"," * ```html"," * <body>"," *"," * <div id=\"test\">"," * <!-- 选区开始 -->"," * <a></a>"," * <i></i>"," * <!-- 选区结束 -->"," * </div>"," *"," * <script>"," *"," * //output: '<a></a><i></i>'"," * console.log( range.cloneContents() );"," * //output: 1"," * console.log( range.startOffset );"," *"," * range.collapse();"," *"," * //output: ''"," * console.log( range.cloneContents() );"," * //output: 3"," * console.log( range.startOffset );"," *"," * </script>"," * </body>"," * ```"," */"," 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;"," },",""," /**"," * 获取当前选区所包含的所有节点的公共祖先节点,"," * 返回的公共祖先节点一定不是range自身的容器节点, 但有可能是一个文本节点"," * @method getCommonAncestor"," * @return { Node } 当前range对象内所有节点的公共祖先节点"," * @example"," * ```html"," * <body>"," *"," * <div id=\"test\">"," * <!-- 选区开始 -->"," * <a></a>"," * <i></i>"," * <!-- 选区结束 -->"," * </div>"," *"," * <script>"," *"," * var ancestorNode = range.getCommonAncestor();"," *"," * //output: 'DIV'"," * console.log( ancestorNode.tagName );"," *"," * </script>"," *"," * </body>"," * ```"," * @example"," * ```html"," * <body>"," *"," * <div id=\"test\">"," * <span>"," * <!-- 选区开始 -->"," * <a></a>"," * </span>"," * <span>"," * <i></i>"," * <!-- 选区结束 -->"," * </span>"," * </div>"," *"," * <script>"," *"," * var ancestorNode = range.getCommonAncestor();"," *"," * //output: 'DIV'"," * console.log( ancestorNode.tagName );"," *"," * </script>"," *"," * </body>"," * ```"," */",""," /**"," * 获取当前选区所包含的所有节点的公共祖先节点, 可以根据给定的参数 includeSelf 决定获取到"," * 的公共祖先节点是否可以是当前选区的startContainer或endContainer节点, 如果 includeSelf"," * 的取值为true, 则返回的节点可以是自身的容器节点, 否则, 则不能是容器节点"," * @method getCommonAncestor"," * @param { Boolean } includeSelf 是否允许获取到的公共祖先节点是当前range对象的容器节点"," * @return { Node } 当前range对象内所有节点的公共祖先节点"," * @see UE.dom.Range:getCommonAncestor()"," * @example"," * ```html"," * <body>"," *"," * <!-- 选区开始 -->"," * <div id=\"test\">"," * <a></a>"," * <i></i>"," * </div>"," * <!-- 选区结束 -->"," *"," * <script>"," *"," * var ancestorNode = range.getCommonAncestor( true );"," *"," * //output: 'DIV'"," * console.log( ancestorNode.tagName );"," *"," * ancestorNode = range.getCommonAncestor( false );"," *"," * //output: BODY"," * console.log( ancestorNode.tagName );"," *"," * </script>"," *"," * </body>"," * ```"," */",""," /**"," * 获取当前选区所包含的所有节点的公共祖先节点, 可以根据给定的参数 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"," * <body>"," *"," * <div id=\"test\">"," * <span>"," * 我是一个"," * <!-- 选区开始 -->"," * 文本"," * <!-- 选区结束 -->"," * 内容"," * </span>"," * </div>"," *"," * <script>"," *"," * var ancestorNode = range.getCommonAncestor( true, false );"," *"," * //output: 3"," * console.log( ancestorNode.nodeType );"," * //output: SPAN"," * console.log( ancestorNode.parentNode.tagName );"," *"," * ancestorNode = range.getCommonAncestor( true, true );"," *"," * //output: 1"," * console.log( ancestorNode.nodeType );"," * //output: SPAN"," * console.log( ancestorNode.tagName );"," *"," * </script>"," *"," * </body>"," * ```"," */"," 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"," * @return { UE.dom.Range } 当前range对象"," * @example"," * ```html"," *"," * <body>"," * <div>"," * 你好"," * <!-- 选区开始 -->"," * 我是一段文本, 我旁边的注释内容其实是不存在的,仅仅是为了描述一下选区的边界"," * <!-- 选区结束 -->"," * 到这里文本结束了"," * </div>"," *"," * <script>"," *"," * //output: 3"," * console.log( range.startContainer.nodeType );"," * //output: 3"," * console.log( range.endContainer.nodeType );"," *"," * range.trimBoundary();"," *"," * //output: 1"," * console.log( range.startContainer.nodeType );"," * //output: 1"," * console.log( range.endContainer.nodeType );"," *"," * </script>"," * </body>"," *"," * ```"," */",""," /**"," * 调整当前Range的开始和结束边界容器,如果是容器节点是文本节点,就调整到包含该文本节点的父节点上,"," * 可以根据 ignoreEnd 参数的值决定是否调整对结束边界的调整"," * @method trimBoundary"," * @param { Boolean } ignoreEnd 是否忽略对结束边界的调整"," * @return { UE.dom.Range } 当前range对象"," * @example"," * ```html"," *"," * <body>"," * <div>"," * 你好"," * <!-- 选区开始 -->"," * 我是一段文本, 我旁边的注释内容其实是不存在的,仅仅是为了描述一下选区的边界"," * <!-- 选区结束 -->"," * 到这里文本结束了"," * </div>"," *"," * <script>"," *"," * //output: 3"," * console.log( range.startContainer.nodeType );"," * //output: 3"," * console.log( range.endContainer.nodeType );"," *"," * range.trimBoundary( true );"," *"," * //output: 1"," * console.log( range.startContainer.nodeType );"," * //output: 3"," * console.log( range.endContainer.nodeType );"," *"," * </script>"," * </body>"," *"," * ```"," */"," 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"," * @return { UE.dom.Range } 当前range对象"," * @example"," * ```html"," *"," * <body>"," * <div>"," * <!-- 选区开始 -->"," * 你好,我是一段文本, 我旁边的注释内容其实是不存在的,仅仅是为了描述一下选区的边界"," * <!-- 选区结束 -->"," * 到这里文本结束了"," * </div>"," *"," * <script>"," *"," * //output: 3"," * console.log( range.startContainer.nodeType );"," * //output: 3"," * console.log( range.endContainer.nodeType );"," *"," * range.txtToElmBoundary();"," *"," * //output: 1"," * console.log( range.startContainer.nodeType );"," * //output: 3"," * console.log( range.endContainer.nodeType );"," *"," * </script>"," * </body>"," *"," * ```"," * @example"," * ```html"," *"," * <body>"," * <div>"," * <!-- 选区开始 -->"," * 你好,我是一段文本, 我旁边的注释内容其实是不存在的,仅仅是为了描述一下选区的边界"," * 到这里文本结束了"," * <!-- 选区结束 -->"," * </div>"," *"," * <script>"," *"," * //output: 3"," * console.log( range.startContainer.nodeType );"," * //output: 3"," * console.log( range.endContainer.nodeType );"," *"," * range.txtToElmBoundary();"," *"," * //output: 1"," * console.log( range.startContainer.nodeType );"," * //output: 1"," * console.log( range.endContainer.nodeType );"," *"," * </script>"," * </body>"," *"," * ```"," */",""," /**"," * 如果选区在文本的边界上,就扩展选区到文本的父节点上, 如果当前选区是闭合的, 则根据参数项"," * ignoreCollapsed 的值决定是否执行该调整"," * @method txtToElmBoundary"," * @param { Boolean } ignoreCollapsed 是否忽略选区的闭合状态, 如果该参数取值为true, 则"," * 不论选区是否闭合, 都会执行该操作, 反之, 则不会对闭合的选区执行该操作"," * @return { UE.dom.Range } 当前range对象"," * @example"," * ```html"," *"," * <body>"," * <div>"," * 你好,我是一段文本, 我旁边的注释内容其实是不存在的,仅仅是为了描述一下选区的边界"," * <!-- 选区开始 --><!-- 选区结束 -->"," * 到这里文本结束了"," * </div>"," *"," * <script>"," *"," * //output: 3"," * console.log( range.startContainer.nodeType );"," * //output: 3"," * console.log( range.endContainer.nodeType );"," *"," * range.txtToElmBoundary( true );"," *"," * //output: 1"," * console.log( range.startContainer.nodeType );"," * //output: 1"," * console.log( range.endContainer.nodeType );"," *"," * </script>"," * </body>"," *"," * ```"," * @example"," * ```html"," *"," * <body>"," * <div>"," * 你好,我是一段文本, 我旁边的注释内容其实是不存在的,仅仅是为了描述一下选区的边界"," * <!-- 选区开始 --><!-- 选区结束 -->"," * 到这里文本结束了"," * </div>"," *"," * <script>"," *"," * //output: 3"," * console.log( range.startContainer.nodeType );"," * //output: 3"," * console.log( range.endContainer.nodeType );"," *"," * range.txtToElmBoundary( false );"," *"," * //output: 3"," * console.log( range.startContainer.nodeType );"," * //output: 3"," * console.log( range.endContainer.nodeType );"," *"," * </script>"," * </body>"," *"," * ```"," */"," 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 } 需要插入的节点"," * @return { UE.dom.Range } 当前range对象"," * @example"," * ```html"," * <body>"," *"," * <div id=\"test\">"," * <!-- 选区开始 -->"," * <span></span>"," * <i></i>"," * <!-- 选区结束 -->"," * </div>"," *"," * <script>"," *"," *"," * var newNode = document.createElement('div');"," * newNode.id = 'ueditor';"," *"," * //output: <span></span><i></i>"," * console.log( range.cloneContents() );"," *"," * range.insertNode( newNode );"," *"," * //output: <div id=\"ueditor\"></div><span></span><i></i>"," * console.log( range.cloneContents() );"," *"," * </script>"," *"," * </body>"," * ```"," */"," 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 { KeyValueMap } 返回一个书签记录键值对, 其包含的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 } 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"," * @return { UE.dom.Range } 当前range对象"," * @example"," * ```html"," *"," * <body>"," * <div>"," * <span>"," * <b>a<!-- 选区开始 -->b</b>"," * cdef"," * <!-- 选区结束 -->"," * </span>"," * </div>"," *"," * <script>"," *"," * range.enlarge();"," *"," * //output: <span><b>ab</b>cdef</span>"," * console.log( enlarge.cloneContents() );"," *"," * </script>"," * </body>"," * ```"," */",""," /**"," * 调整range的边界,使其\"放大\"到最近的父节点,根据参数 toBlock 的取值, 可以"," * 要求扩大之后的父节点是block节点"," * @method enlarge"," * @param { Boolean } toBlock 是否要求扩大之后的父节点必须是block节点"," * @return { UE.dom.Range } 当前range对象"," * @example"," * ```html"," *"," * <body>"," * <div>"," * <span>"," * <b>a<!-- 选区开始 -->b</b>"," * cdef"," * <!-- 选区结束 -->"," * </span>"," * </div>"," *"," * <script>"," *"," * range.enlarge( true );"," *"," * //output: <div><span><b>ab</b>cdef</span></div>"," * console.log( enlarge.cloneContents() );"," *"," * </script>"," * </body>"," * ```"," */"," 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;"," },",""," /**"," * 调整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标签"," * @name applyInlineStyle"," * @grammar range.applyInlineStyle(tagName) => Range //tagName为需要添加的样式标签名"," * @grammar range.applyInlineStyle(tagName,attrs) => Range //attrs为属性json对象"," * @desc"," * <code type=\"html\"><p>xxxx[xxxx]x</p> ==> range.applyInlineStyle(\"strong\") ==> <p>xxxx[<strong>xxxx</strong>]x</p>"," * <p>xx[dd<strong>yyyy</strong>]x</p> ==> range.applyInlineStyle(\"strong\") ==> <p>xx[<strong>ddyyyy</strong>]x</p>"," * <p>xxxx[xxxx]x</p> ==> range.applyInlineStyle(\"strong\",{\"style\":\"font-size:12px\"}) ==> <p>xxxx[<strong style=\"font-size:12px\">xxxx</strong>]x</p></code>"," */"," 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);"," 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);"," },"," /*"," * 对当前range选中的节点,去掉给定的标签节点,但标签中的内容保留,主要用于处理inline元素"," * @name removeInlineStyle"," * @grammar range.removeInlineStyle(tagNames) => Range //tagNames 为需要去掉的样式标签名,支持\"b\"或者[\"b\",\"i\",\"u\"]"," * @desc"," * <code type=\"html\">xx[x<span>xxx<em>yyy</em>zz]z</span> => range.removeInlineStyle([\"em\"]) => xx[x<span>xxxyyyzz]z</span></code>"," */"," 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"," * @example"," * ```html"," * <body>"," * <div>"," * <!-- 选区开始 -->"," * <a></a>"," * <span><img></span>"," * <i></i>"," * <!-- 选区结束 -->"," * </div>"," *"," * <script>"," *"," * var node = range.getCloseNode();"," *"," * //output: IMG"," * console.log( node.tagName );"," *"," * </script>"," * </body>"," * ```"," */"," 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;"," },",""," /**"," * 选中当前选区"," * @method select"," * @return { UE.dom.Range } 返回当前Range对象"," */"," 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) {"," //使用<span>|x<span>固定住光标"," 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);","// }","//"," //处理光标落在文本节点的情况"," //处理以下的情况"," //<b>|xxxx</b>"," //<b>xxxx</b>|xxxx"," //xxxx<b>|</b>"," 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 = '&nbsp;';"," me.cloneRange().insertNode(span);"," domUtils.scrollToView(span, win, offset);"," domUtils.remove(span);"," return me;"," },"," /**"," * 判断当前选区内容是否占位符"," * @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"," * @return { Boolean } 返回开始和结束的位置"," * @example"," * ```html"," * <body>"," * <p>"," * aaaa"," * <em>"," * <!-- 选区开始 -->"," * bbbb"," * <!-- 选区结束 -->"," * </em>"," * </p>"," *"," * <script>"," * //output: {startAddress:[0,1,0,0],endAddress:[0,1,0,4]}"," * console.log( range.createAddress() );"," * </script>"," * </body>"," * ```"," */"," 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"," * @return { Boolean } 返回开始和结束的位置"," * @example"," * ```html"," * <body>"," * <p>"," * aaaa"," * <em>"," * <!-- 选区开始 -->"," * bbbb"," * <!-- 选区结束 -->"," * </em>"," * </p>"," *"," * <script>"," * var range = editor.selection.getRange();"," * range.moveToAddress({startAddress:[0,1,0,0],endAddress:[0,1,0,4]});"," * range.select();"," * //output: 'bbbb'"," * console.log(editor.selection.getText());"," * </script>"," * </body>"," * ```"," */"," 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"," *"," * <body>"," *"," * <!-- 选区开始 -->"," * <span></span>"," * <a></a>"," * <!-- 选区结束 -->"," * </body>"," *"," * <script>"," *"," * //output: <span></span><a></a>"," * console.log( range.cloneContents() );"," *"," * range.traversal( function ( node ) {"," *"," * if ( node.nodeType === 1 ) {"," * node.className = \"test\";"," * }"," *"," * } );"," *"," * //output: <span class=\"test\"></span><a class=\"test\"></a>"," * console.log( range.cloneContents() );"," *"," * </script>"," * ```"," */",""," /**"," * 遍历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"," *"," * <body>"," *"," * <!-- 选区开始 -->"," * <span></span>"," * <a></a>"," * <!-- 选区结束 -->"," * </body>"," *"," * <script>"," *"," * //output: <span></span><a></a>"," * console.log( range.cloneContents() );"," *"," * range.traversal( function ( node ) {"," *"," * node.className = \"test\";"," *"," * }, function ( node ) {"," * return node.nodeType === 1;"," * } );"," *"," * //output: <span class=\"test\"></span><a class=\"test\"></a>"," * console.log( range.cloneContents() );"," *"," * </script>"," * ```"," */"," 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);"," }"," };","})();"]; +_$jscoverage['core/Range.js'][22]++; +(function () { + _$jscoverage['core/Range.js'][23]++; + var guid = 0, fillChar = domUtils.fillChar, fillData; + _$jscoverage['core/Range.js'][31]++; + function updateCollapse(range) { + _$jscoverage['core/Range.js'][32]++; + range.collapsed = (range.startContainer && range.endContainer && (range.startContainer === range.endContainer) && (range.startOffset == range.endOffset)); +} + _$jscoverage['core/Range.js'][38]++; + function selectOneNode(rng) { + _$jscoverage['core/Range.js'][39]++; + return ((! rng.collapsed) && (rng.startContainer.nodeType == 1) && (rng.startContainer === rng.endContainer) && ((rng.endOffset - rng.startOffset) == 1)); +} + _$jscoverage['core/Range.js'][41]++; + function setEndPoint(toStart, node, offset, range) { + _$jscoverage['core/Range.js'][43]++; + if (((node.nodeType == 1) && (dtd.$empty[node.tagName] || dtd.$nonChild[node.tagName]))) { + _$jscoverage['core/Range.js'][44]++; + offset = (domUtils.getNodeIndex(node) + (toStart? 0: 1)); + _$jscoverage['core/Range.js'][45]++; + node = node.parentNode; + } + _$jscoverage['core/Range.js'][47]++; + if (toStart) { + _$jscoverage['core/Range.js'][48]++; + range.startContainer = node; + _$jscoverage['core/Range.js'][49]++; + range.startOffset = offset; + _$jscoverage['core/Range.js'][50]++; + if ((! range.endContainer)) { + _$jscoverage['core/Range.js'][51]++; + range.collapse(true); + } + } + else { + _$jscoverage['core/Range.js'][54]++; + range.endContainer = node; + _$jscoverage['core/Range.js'][55]++; + range.endOffset = offset; + _$jscoverage['core/Range.js'][56]++; + if ((! range.startContainer)) { + _$jscoverage['core/Range.js'][57]++; + range.collapse(false); + } + } + _$jscoverage['core/Range.js'][60]++; + updateCollapse(range); + _$jscoverage['core/Range.js'][61]++; + return range; +} + _$jscoverage['core/Range.js'][64]++; + function execContentsAction(range, action) { + _$jscoverage['core/Range.js'][67]++; + var start = range.startContainer, end = range.endContainer, startOffset = range.startOffset, endOffset = range.endOffset, doc = range.document, frag = doc.createDocumentFragment(), tmpStart, tmpEnd; + _$jscoverage['core/Range.js'][74]++; + if ((start.nodeType == 1)) { + _$jscoverage['core/Range.js'][75]++; + start = (start.childNodes[startOffset] || (tmpStart = start.appendChild(doc.createTextNode("")))); + } + _$jscoverage['core/Range.js'][77]++; + if ((end.nodeType == 1)) { + _$jscoverage['core/Range.js'][78]++; + end = (end.childNodes[endOffset] || (tmpEnd = end.appendChild(doc.createTextNode("")))); + } + _$jscoverage['core/Range.js'][80]++; + if (((start === end) && (start.nodeType == 3))) { + _$jscoverage['core/Range.js'][81]++; + frag.appendChild(doc.createTextNode(start.substringData(startOffset, (endOffset - startOffset)))); + _$jscoverage['core/Range.js'][83]++; + if (action) { + _$jscoverage['core/Range.js'][84]++; + start.deleteData(startOffset, (endOffset - startOffset)); + _$jscoverage['core/Range.js'][85]++; + range.collapse(true); + } + _$jscoverage['core/Range.js'][87]++; + return frag; + } + _$jscoverage['core/Range.js'][89]++; + var current, currentLevel, clone = frag, startParents = domUtils.findParents(start, true), endParents = domUtils.findParents(end, true); + _$jscoverage['core/Range.js'][91]++; + for (var i = 0; (startParents[i] == endParents[i]);) { + _$jscoverage['core/Range.js'][92]++; + (i++); +} + _$jscoverage['core/Range.js'][94]++; + for (var j = i, si; (si = startParents[j]); (j++)) { + _$jscoverage['core/Range.js'][95]++; + current = si.nextSibling; + _$jscoverage['core/Range.js'][96]++; + if ((si == start)) { + _$jscoverage['core/Range.js'][97]++; + if ((! tmpStart)) { + _$jscoverage['core/Range.js'][98]++; + if ((range.startContainer.nodeType == 3)) { + _$jscoverage['core/Range.js'][99]++; + clone.appendChild(doc.createTextNode(start.nodeValue.slice(startOffset))); + _$jscoverage['core/Range.js'][101]++; + if (action) { + _$jscoverage['core/Range.js'][102]++; + start.deleteData(startOffset, (start.nodeValue.length - startOffset)); + } + } + else { + _$jscoverage['core/Range.js'][105]++; + clone.appendChild(((! action)? start.cloneNode(true): start)); + } + } + } + else { + _$jscoverage['core/Range.js'][109]++; + currentLevel = si.cloneNode(false); + _$jscoverage['core/Range.js'][110]++; + clone.appendChild(currentLevel); + } + _$jscoverage['core/Range.js'][112]++; + while (current) { + _$jscoverage['core/Range.js'][113]++; + if (((current === end) || (current === endParents[j]))) { + _$jscoverage['core/Range.js'][114]++; + break; + } + _$jscoverage['core/Range.js'][116]++; + si = current.nextSibling; + _$jscoverage['core/Range.js'][117]++; + clone.appendChild(((! action)? current.cloneNode(true): current)); + _$jscoverage['core/Range.js'][118]++; + current = si; +} + _$jscoverage['core/Range.js'][120]++; + clone = currentLevel; +} + _$jscoverage['core/Range.js'][122]++; + clone = frag; + _$jscoverage['core/Range.js'][123]++; + if ((! startParents[i])) { + _$jscoverage['core/Range.js'][124]++; + clone.appendChild(startParents[(i - 1)].cloneNode(false)); + _$jscoverage['core/Range.js'][125]++; + clone = clone.firstChild; + } + _$jscoverage['core/Range.js'][127]++; + for (var j = i, ei; (ei = endParents[j]); (j++)) { + _$jscoverage['core/Range.js'][128]++; + current = ei.previousSibling; + _$jscoverage['core/Range.js'][129]++; + if ((ei == end)) { + _$jscoverage['core/Range.js'][130]++; + if (((! tmpEnd) && (range.endContainer.nodeType == 3))) { + _$jscoverage['core/Range.js'][131]++; + clone.appendChild(doc.createTextNode(end.substringData(0, endOffset))); + _$jscoverage['core/Range.js'][133]++; + if (action) { + _$jscoverage['core/Range.js'][134]++; + end.deleteData(0, endOffset); + } + } + } + else { + _$jscoverage['core/Range.js'][138]++; + currentLevel = ei.cloneNode(false); + _$jscoverage['core/Range.js'][139]++; + clone.appendChild(currentLevel); + } + _$jscoverage['core/Range.js'][142]++; + if (((j != i) || (! startParents[i]))) { + _$jscoverage['core/Range.js'][143]++; + while (current) { + _$jscoverage['core/Range.js'][144]++; + if ((current === start)) { + _$jscoverage['core/Range.js'][145]++; + break; + } + _$jscoverage['core/Range.js'][147]++; + ei = current.previousSibling; + _$jscoverage['core/Range.js'][148]++; + clone.insertBefore(((! action)? current.cloneNode(true): current), clone.firstChild); + _$jscoverage['core/Range.js'][149]++; + current = ei; +} + } + _$jscoverage['core/Range.js'][152]++; + clone = currentLevel; +} + _$jscoverage['core/Range.js'][154]++; + if (action) { + _$jscoverage['core/Range.js'][155]++; + range.setStartBefore(((! endParents[i])? endParents[(i - 1)]: ((! startParents[i])? startParents[(i - 1)]: endParents[i]))).collapse(true); + } + _$jscoverage['core/Range.js'][157]++; + (tmpStart && domUtils.remove(tmpStart)); + _$jscoverage['core/Range.js'][158]++; + (tmpEnd && domUtils.remove(tmpEnd)); + _$jscoverage['core/Range.js'][159]++; + return frag; +} + _$jscoverage['core/Range.js'][193]++; + var Range = (dom.Range = (function (document) { + _$jscoverage['core/Range.js'][194]++; + var me = this; + _$jscoverage['core/Range.js'][195]++; + me.startContainer = (me.startOffset = (me.endContainer = (me.endOffset = null))); + _$jscoverage['core/Range.js'][199]++; + me.document = document; + _$jscoverage['core/Range.js'][200]++; + me.collapsed = true; +})); + _$jscoverage['core/Range.js'][208]++; + function removeFillData(doc, excludeNode) { + _$jscoverage['core/Range.js'][209]++; + try { + _$jscoverage['core/Range.js'][210]++; + if ((fillData && domUtils.inDoc(fillData, doc))) { + _$jscoverage['core/Range.js'][211]++; + if ((! fillData.nodeValue.replace(fillCharReg, "").length)) { + _$jscoverage['core/Range.js'][212]++; + var tmpNode = fillData.parentNode; + _$jscoverage['core/Range.js'][213]++; + domUtils.remove(fillData); + _$jscoverage['core/Range.js'][214]++; + while ((tmpNode && domUtils.isEmptyInlineElement(tmpNode) && (browser.safari? (! (domUtils.getPosition(tmpNode, excludeNode) & domUtils.POSITION_CONTAINS)): (! tmpNode.contains(excludeNode))))) { + _$jscoverage['core/Range.js'][218]++; + fillData = tmpNode.parentNode; + _$jscoverage['core/Range.js'][219]++; + domUtils.remove(tmpNode); + _$jscoverage['core/Range.js'][220]++; + tmpNode = fillData; +} + } + else { + _$jscoverage['core/Range.js'][223]++; + fillData.nodeValue = fillData.nodeValue.replace(fillCharReg, ""); + } + } + } + catch (e) { + } +} + _$jscoverage['core/Range.js'][235]++; + function mergeSibling(node, dir) { + _$jscoverage['core/Range.js'][236]++; + var tmpNode; + _$jscoverage['core/Range.js'][237]++; + node = node[dir]; + _$jscoverage['core/Range.js'][238]++; + while ((node && domUtils.isFillChar(node))) { + _$jscoverage['core/Range.js'][239]++; + tmpNode = node[dir]; + _$jscoverage['core/Range.js'][240]++; + domUtils.remove(node); + _$jscoverage['core/Range.js'][241]++; + node = tmpNode; +} +} + _$jscoverage['core/Range.js'][245]++; + Range.prototype = {cloneContents: (function () { + _$jscoverage['core/Range.js'][263]++; + return (this.collapsed? null: execContentsAction(this, 0)); +}), deleteContents: (function () { + _$jscoverage['core/Range.js'][294]++; + var txt; + _$jscoverage['core/Range.js'][295]++; + if ((! this.collapsed)) { + _$jscoverage['core/Range.js'][296]++; + execContentsAction(this, 1); + } + _$jscoverage['core/Range.js'][298]++; + if (browser.webkit) { + _$jscoverage['core/Range.js'][299]++; + txt = this.startContainer; + _$jscoverage['core/Range.js'][300]++; + if (((txt.nodeType == 3) && (! txt.nodeValue.length))) { + _$jscoverage['core/Range.js'][301]++; + this.setStartBefore(txt).collapse(true); + _$jscoverage['core/Range.js'][302]++; + domUtils.remove(txt); + } + } + _$jscoverage['core/Range.js'][305]++; + return this; +}), extractContents: (function () { + _$jscoverage['core/Range.js'][338]++; + return (this.collapsed? null: execContentsAction(this, 2)); +}), setStart: (function (node, offset) { + _$jscoverage['core/Range.js'][373]++; + return setEndPoint(true, node, offset, this); +}), setEnd: (function (node, offset) { + _$jscoverage['core/Range.js'][407]++; + return setEndPoint(false, node, offset, this); +}), setStartAfter: (function (node) { + _$jscoverage['core/Range.js'][440]++; + return this.setStart(node.parentNode, (domUtils.getNodeIndex(node) + 1)); +}), setStartBefore: (function (node) { + _$jscoverage['core/Range.js'][473]++; + return this.setStart(node.parentNode, domUtils.getNodeIndex(node)); +}), setEndAfter: (function (node) { + _$jscoverage['core/Range.js'][504]++; + return this.setEnd(node.parentNode, (domUtils.getNodeIndex(node) + 1)); +}), setEndBefore: (function (node) { + _$jscoverage['core/Range.js'][535]++; + return this.setEnd(node.parentNode, domUtils.getNodeIndex(node)); +}), setStartAtFirst: (function (node) { + _$jscoverage['core/Range.js'][568]++; + return this.setStart(node, 0); +}), setStartAtLast: (function (node) { + _$jscoverage['core/Range.js'][602]++; + return this.setStart(node, ((node.nodeType == 3)? node.nodeValue.length: node.childNodes.length)); +}), setEndAtFirst: (function (node) { + _$jscoverage['core/Range.js'][633]++; + return this.setEnd(node, 0); +}), setEndAtLast: (function (node) { + _$jscoverage['core/Range.js'][665]++; + return this.setEnd(node, ((node.nodeType == 3)? node.nodeValue.length: node.childNodes.length)); +}), selectNode: (function (node) { + _$jscoverage['core/Range.js'][691]++; + return this.setStartBefore(node).setEndAfter(node); +}), selectNodeContents: (function (node) { + _$jscoverage['core/Range.js'][720]++; + return this.setStart(node, 0).setEndAtLast(node); +}), cloneRange: (function () { + _$jscoverage['core/Range.js'][750]++; + var me = this; + _$jscoverage['core/Range.js'][751]++; + return new Range(me.document).setStart(me.startContainer, me.startOffset).setEnd(me.endContainer, me.endOffset); +}), collapse: (function (toStart) { + _$jscoverage['core/Range.js'][824]++; + var me = this; + _$jscoverage['core/Range.js'][825]++; + if (toStart) { + _$jscoverage['core/Range.js'][826]++; + me.endContainer = me.startContainer; + _$jscoverage['core/Range.js'][827]++; + me.endOffset = me.startOffset; + } + else { + _$jscoverage['core/Range.js'][829]++; + me.startContainer = me.endContainer; + _$jscoverage['core/Range.js'][830]++; + me.startOffset = me.endOffset; + } + _$jscoverage['core/Range.js'][832]++; + me.collapsed = true; + _$jscoverage['core/Range.js'][833]++; + return me; +}), shrinkBoundary: (function (ignoreEnd) { + _$jscoverage['core/Range.js'][880]++; + var me = this, child, collapsed = me.collapsed; + _$jscoverage['core/Range.js'][882]++; + function check(node) { + _$jscoverage['core/Range.js'][883]++; + return ((node.nodeType == 1) && (! domUtils.isBookmarkNode(node)) && (! dtd.$empty[node.tagName]) && (! dtd.$nonChild[node.tagName])); +} + _$jscoverage['core/Range.js'][885]++; + while (((me.startContainer.nodeType == 1) && (child = me.startContainer.childNodes[me.startOffset]) && check(child))) { + _$jscoverage['core/Range.js'][888]++; + me.setStart(child, 0); +} + _$jscoverage['core/Range.js'][890]++; + if (collapsed) { + _$jscoverage['core/Range.js'][891]++; + return me.collapse(true); + } + _$jscoverage['core/Range.js'][893]++; + if ((! ignoreEnd)) { + _$jscoverage['core/Range.js'][894]++; + while (((me.endContainer.nodeType == 1) && (me.endOffset > 0) && (child = me.endContainer.childNodes[(me.endOffset - 1)]) && check(child))) { + _$jscoverage['core/Range.js'][898]++; + me.setEnd(child, child.childNodes.length); +} + } + _$jscoverage['core/Range.js'][901]++; + return me; +}), getCommonAncestor: (function (includeSelf, ignoreTextNode) { + _$jscoverage['core/Range.js'][1043]++; + var me = this, start = me.startContainer, end = me.endContainer; + _$jscoverage['core/Range.js'][1046]++; + if ((start === end)) { + _$jscoverage['core/Range.js'][1047]++; + if ((includeSelf && selectOneNode(this))) { + _$jscoverage['core/Range.js'][1048]++; + start = start.childNodes[me.startOffset]; + _$jscoverage['core/Range.js'][1049]++; + if ((start.nodeType == 1)) { + _$jscoverage['core/Range.js'][1050]++; + return start; + } + } + _$jscoverage['core/Range.js'][1053]++; + return ((ignoreTextNode && (start.nodeType == 3))? start.parentNode: start); + } + _$jscoverage['core/Range.js'][1055]++; + return domUtils.getCommonAncestor(start, end); +}), trimBoundary: (function (ignoreEnd) { + _$jscoverage['core/Range.js'][1132]++; + this.txtToElmBoundary(); + _$jscoverage['core/Range.js'][1133]++; + var start = this.startContainer, offset = this.startOffset, collapsed = this.collapsed, end = this.endContainer; + _$jscoverage['core/Range.js'][1137]++; + if ((start.nodeType == 3)) { + _$jscoverage['core/Range.js'][1138]++; + if ((offset == 0)) { + _$jscoverage['core/Range.js'][1139]++; + this.setStartBefore(start); + } + else { + _$jscoverage['core/Range.js'][1141]++; + if ((offset >= start.nodeValue.length)) { + _$jscoverage['core/Range.js'][1142]++; + this.setStartAfter(start); + } + else { + _$jscoverage['core/Range.js'][1144]++; + var textNode = domUtils.split(start, offset); + _$jscoverage['core/Range.js'][1146]++; + if ((start === end)) { + _$jscoverage['core/Range.js'][1147]++; + this.setEnd(textNode, (this.endOffset - offset)); + } + else { + _$jscoverage['core/Range.js'][1148]++; + if ((start.parentNode === end)) { + _$jscoverage['core/Range.js'][1149]++; + this.endOffset += 1; + } + } + _$jscoverage['core/Range.js'][1151]++; + this.setStartBefore(textNode); + } + } + _$jscoverage['core/Range.js'][1154]++; + if (collapsed) { + _$jscoverage['core/Range.js'][1155]++; + return this.collapse(true); + } + } + _$jscoverage['core/Range.js'][1158]++; + if ((! ignoreEnd)) { + _$jscoverage['core/Range.js'][1159]++; + offset = this.endOffset; + _$jscoverage['core/Range.js'][1160]++; + end = this.endContainer; + _$jscoverage['core/Range.js'][1161]++; + if ((end.nodeType == 3)) { + _$jscoverage['core/Range.js'][1162]++; + if ((offset == 0)) { + _$jscoverage['core/Range.js'][1163]++; + this.setEndBefore(end); + } + else { + _$jscoverage['core/Range.js'][1165]++; + ((offset < end.nodeValue.length) && domUtils.split(end, offset)); + _$jscoverage['core/Range.js'][1166]++; + this.setEndAfter(end); + } + } + } + _$jscoverage['core/Range.js'][1170]++; + return this; +}), txtToElmBoundary: (function (ignoreCollapsed) { + _$jscoverage['core/Range.js'][1302]++; + function adjust(r, c) { + _$jscoverage['core/Range.js'][1303]++; + var container = r[(c + "Container")], offset = r[(c + "Offset")]; + _$jscoverage['core/Range.js'][1305]++; + if ((container.nodeType == 3)) { + _$jscoverage['core/Range.js'][1306]++; + if ((! offset)) { + _$jscoverage['core/Range.js'][1307]++; + (r[("set" + c.replace(/(\w)/, (function (a) { + _$jscoverage['core/Range.js'][1308]++; + return a.toUpperCase(); +})) + "Before")])(container); + } + else { + _$jscoverage['core/Range.js'][1310]++; + if ((offset >= container.nodeValue.length)) { + _$jscoverage['core/Range.js'][1311]++; + (r[("set" + c.replace(/(\w)/, (function (a) { + _$jscoverage['core/Range.js'][1312]++; + return a.toUpperCase(); +})) + "After")])(container); + } + } + } +} + _$jscoverage['core/Range.js'][1318]++; + if ((ignoreCollapsed || (! this.collapsed))) { + _$jscoverage['core/Range.js'][1319]++; + adjust(this, "start"); + _$jscoverage['core/Range.js'][1320]++; + adjust(this, "end"); + } + _$jscoverage['core/Range.js'][1322]++; + return this; +}), insertNode: (function (node) { + _$jscoverage['core/Range.js'][1361]++; + var first = node, length = 1; + _$jscoverage['core/Range.js'][1362]++; + if ((node.nodeType == 11)) { + _$jscoverage['core/Range.js'][1363]++; + first = node.firstChild; + _$jscoverage['core/Range.js'][1364]++; + length = node.childNodes.length; + } + _$jscoverage['core/Range.js'][1366]++; + this.trimBoundary(true); + _$jscoverage['core/Range.js'][1367]++; + var start = this.startContainer, offset = this.startOffset; + _$jscoverage['core/Range.js'][1369]++; + var nextNode = start.childNodes[offset]; + _$jscoverage['core/Range.js'][1370]++; + if (nextNode) { + _$jscoverage['core/Range.js'][1371]++; + start.insertBefore(node, nextNode); + } + else { + _$jscoverage['core/Range.js'][1373]++; + start.appendChild(node); + } + _$jscoverage['core/Range.js'][1375]++; + if ((first.parentNode === this.endContainer)) { + _$jscoverage['core/Range.js'][1376]++; + this.endOffset = (this.endOffset + length); + } + _$jscoverage['core/Range.js'][1378]++; + return this.setStartBefore(first); +}), setCursor: (function (toEnd, noFillData) { + _$jscoverage['core/Range.js'][1397]++; + return this.collapse((! toEnd)).select(noFillData); +}), createBookmark: (function (serialize, same) { + _$jscoverage['core/Range.js'][1410]++; + var endNode, startNode = this.document.createElement("span"); + _$jscoverage['core/Range.js'][1412]++; + startNode.style.cssText = "display:none;line-height:0px;"; + _$jscoverage['core/Range.js'][1413]++; + startNode.appendChild(this.document.createTextNode("\u200d")); + _$jscoverage['core/Range.js'][1414]++; + startNode.id = ("_baidu_bookmark_start_" + (same? "": (guid++))); + _$jscoverage['core/Range.js'][1416]++; + if ((! this.collapsed)) { + _$jscoverage['core/Range.js'][1417]++; + endNode = startNode.cloneNode(true); + _$jscoverage['core/Range.js'][1418]++; + endNode.id = ("_baidu_bookmark_end_" + (same? "": (guid++))); + } + _$jscoverage['core/Range.js'][1420]++; + this.insertNode(startNode); + _$jscoverage['core/Range.js'][1421]++; + if (endNode) { + _$jscoverage['core/Range.js'][1422]++; + this.collapse().insertNode(endNode).setEndBefore(endNode); + } + _$jscoverage['core/Range.js'][1424]++; + this.setStartAfter(startNode); + _$jscoverage['core/Range.js'][1425]++; + return ({start: (serialize? startNode.id: startNode), end: (endNode? (serialize? endNode.id: endNode): null), id: serialize}); +}), moveToBookmark: (function (bookmark) { + _$jscoverage['core/Range.js'][1440]++; + var start = (bookmark.id? this.document.getElementById(bookmark.start): bookmark.start), end = ((bookmark.end && bookmark.id)? this.document.getElementById(bookmark.end): bookmark.end); + _$jscoverage['core/Range.js'][1442]++; + this.setStartBefore(start); + _$jscoverage['core/Range.js'][1443]++; + domUtils.remove(start); + _$jscoverage['core/Range.js'][1444]++; + if (end) { + _$jscoverage['core/Range.js'][1445]++; + this.setEndBefore(end); + _$jscoverage['core/Range.js'][1446]++; + domUtils.remove(end); + } + else { + _$jscoverage['core/Range.js'][1448]++; + this.collapse(true); + } + _$jscoverage['core/Range.js'][1450]++; + return this; +}), enlarge: (function (toBlock, stopFn) { + _$jscoverage['core/Range.js'][1511]++; + var isBody = domUtils.isBody, pre, node, tmp = this.document.createTextNode(""); + _$jscoverage['core/Range.js'][1513]++; + if (toBlock) { + _$jscoverage['core/Range.js'][1514]++; + node = this.startContainer; + _$jscoverage['core/Range.js'][1515]++; + if ((node.nodeType == 1)) { + _$jscoverage['core/Range.js'][1516]++; + if (node.childNodes[this.startOffset]) { + _$jscoverage['core/Range.js'][1517]++; + pre = (node = node.childNodes[this.startOffset]); + } + else { + _$jscoverage['core/Range.js'][1519]++; + node.appendChild(tmp); + _$jscoverage['core/Range.js'][1520]++; + pre = (node = tmp); + } + } + else { + _$jscoverage['core/Range.js'][1523]++; + pre = node; + } + _$jscoverage['core/Range.js'][1525]++; + while (true) { + _$jscoverage['core/Range.js'][1526]++; + if (domUtils.isBlockElm(node)) { + _$jscoverage['core/Range.js'][1527]++; + node = pre; + _$jscoverage['core/Range.js'][1528]++; + while (((pre = node.previousSibling) && (! domUtils.isBlockElm(pre)))) { + _$jscoverage['core/Range.js'][1529]++; + node = pre; +} + _$jscoverage['core/Range.js'][1531]++; + this.setStartBefore(node); + _$jscoverage['core/Range.js'][1532]++; + break; + } + _$jscoverage['core/Range.js'][1534]++; + pre = node; + _$jscoverage['core/Range.js'][1535]++; + node = node.parentNode; +} + _$jscoverage['core/Range.js'][1537]++; + node = this.endContainer; + _$jscoverage['core/Range.js'][1538]++; + if ((node.nodeType == 1)) { + _$jscoverage['core/Range.js'][1539]++; + if ((pre = node.childNodes[this.endOffset])) { + _$jscoverage['core/Range.js'][1540]++; + node.insertBefore(tmp, pre); + } + else { + _$jscoverage['core/Range.js'][1542]++; + node.appendChild(tmp); + } + _$jscoverage['core/Range.js'][1544]++; + pre = (node = tmp); + } + else { + _$jscoverage['core/Range.js'][1546]++; + pre = node; + } + _$jscoverage['core/Range.js'][1548]++; + while (true) { + _$jscoverage['core/Range.js'][1549]++; + if (domUtils.isBlockElm(node)) { + _$jscoverage['core/Range.js'][1550]++; + node = pre; + _$jscoverage['core/Range.js'][1551]++; + while (((pre = node.nextSibling) && (! domUtils.isBlockElm(pre)))) { + _$jscoverage['core/Range.js'][1552]++; + node = pre; +} + _$jscoverage['core/Range.js'][1554]++; + this.setEndAfter(node); + _$jscoverage['core/Range.js'][1555]++; + break; + } + _$jscoverage['core/Range.js'][1557]++; + pre = node; + _$jscoverage['core/Range.js'][1558]++; + node = node.parentNode; +} + _$jscoverage['core/Range.js'][1560]++; + if ((tmp.parentNode === this.endContainer)) { + _$jscoverage['core/Range.js'][1561]++; + (this.endOffset--); + } + _$jscoverage['core/Range.js'][1563]++; + domUtils.remove(tmp); + } + _$jscoverage['core/Range.js'][1567]++; + if ((! this.collapsed)) { + _$jscoverage['core/Range.js'][1568]++; + while ((this.startOffset == 0)) { + _$jscoverage['core/Range.js'][1569]++; + if ((stopFn && stopFn(this.startContainer))) { + _$jscoverage['core/Range.js'][1570]++; + break; + } + _$jscoverage['core/Range.js'][1572]++; + if (isBody(this.startContainer)) { + _$jscoverage['core/Range.js'][1573]++; + break; + } + _$jscoverage['core/Range.js'][1575]++; + this.setStartBefore(this.startContainer); +} + _$jscoverage['core/Range.js'][1577]++; + while ((this.endOffset == ((this.endContainer.nodeType == 1)? this.endContainer.childNodes.length: this.endContainer.nodeValue.length))) { + _$jscoverage['core/Range.js'][1578]++; + if ((stopFn && stopFn(this.endContainer))) { + _$jscoverage['core/Range.js'][1579]++; + break; + } + _$jscoverage['core/Range.js'][1581]++; + if (isBody(this.endContainer)) { + _$jscoverage['core/Range.js'][1582]++; + break; + } + _$jscoverage['core/Range.js'][1584]++; + this.setEndAfter(this.endContainer); +} + } + _$jscoverage['core/Range.js'][1587]++; + return this; +}), adjustmentBoundary: (function () { + _$jscoverage['core/Range.js'][1597]++; + if ((! this.collapsed)) { + _$jscoverage['core/Range.js'][1598]++; + 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)) { + _$jscoverage['core/Range.js'][1603]++; + this.setStartAfter(this.startContainer); +} + _$jscoverage['core/Range.js'][1605]++; + while (((! domUtils.isBody(this.endContainer)) && (! this.endOffset) && this.endContainer[((this.endContainer.nodeType == 3)? "nodeValue": "childNodes")].length)) { + _$jscoverage['core/Range.js'][1608]++; + this.setEndBefore(this.endContainer); +} + } + _$jscoverage['core/Range.js'][1611]++; + return this; +}), applyInlineStyle: (function (tagName, attrs, list) { + _$jscoverage['core/Range.js'][1624]++; + if (this.collapsed) { + _$jscoverage['core/Range.js'][1624]++; + return this; + } + _$jscoverage['core/Range.js'][1625]++; + this.trimBoundary().enlarge(false, (function (node) { + _$jscoverage['core/Range.js'][1627]++; + return ((node.nodeType == 1) && domUtils.isBlockElm(node)); +})).adjustmentBoundary(); + _$jscoverage['core/Range.js'][1629]++; + var bookmark = this.createBookmark(), end = bookmark.end, filterFn = (function (node) { + _$jscoverage['core/Range.js'][1632]++; + return ((node.nodeType == 1)? (node.tagName.toLowerCase() != "br"): (! domUtils.isWhitespace(node))); +}), current = domUtils.getNextDomNode(bookmark.start, false, filterFn), node, pre, range = this.cloneRange(); + _$jscoverage['core/Range.js'][1638]++; + while ((current && (domUtils.getPosition(current, end) & domUtils.POSITION_PRECEDING))) { + _$jscoverage['core/Range.js'][1639]++; + if (((current.nodeType == 3) || dtd[tagName][current.tagName])) { + _$jscoverage['core/Range.js'][1640]++; + range.setStartBefore(current); + _$jscoverage['core/Range.js'][1641]++; + node = current; + _$jscoverage['core/Range.js'][1642]++; + while ((node && ((node.nodeType == 3) || dtd[tagName][node.tagName]) && (node !== end))) { + _$jscoverage['core/Range.js'][1643]++; + pre = node; + _$jscoverage['core/Range.js'][1644]++; + node = domUtils.getNextDomNode(node, (node.nodeType == 1), null, (function (parent) { + _$jscoverage['core/Range.js'][1645]++; + return dtd[tagName][parent.tagName]; +})); +} + _$jscoverage['core/Range.js'][1648]++; + var frag = range.setEndAfter(pre).extractContents(), elm; + _$jscoverage['core/Range.js'][1649]++; + if ((list && (list.length > 0))) { + _$jscoverage['core/Range.js'][1650]++; + var level, top; + _$jscoverage['core/Range.js'][1651]++; + top = (level = list[0].cloneNode(false)); + _$jscoverage['core/Range.js'][1652]++; + for (var i = 1, ci; (ci = list[(i++)]);) { + _$jscoverage['core/Range.js'][1653]++; + level.appendChild(ci.cloneNode(false)); + _$jscoverage['core/Range.js'][1654]++; + level = level.firstChild; +} + _$jscoverage['core/Range.js'][1656]++; + elm = level; + } + else { + _$jscoverage['core/Range.js'][1658]++; + elm = range.document.createElement(tagName); + } + _$jscoverage['core/Range.js'][1660]++; + if (attrs) { + _$jscoverage['core/Range.js'][1661]++; + domUtils.setAttributes(elm, attrs); + } + _$jscoverage['core/Range.js'][1663]++; + elm.appendChild(frag); + _$jscoverage['core/Range.js'][1664]++; + range.insertNode((list? top: elm)); + _$jscoverage['core/Range.js'][1666]++; + var aNode; + _$jscoverage['core/Range.js'][1667]++; + if (((tagName == "span") && attrs.style && /text\-decoration/.test(attrs.style) && (aNode = domUtils.findParentByTagName(elm, "a", true)))) { + _$jscoverage['core/Range.js'][1668]++; + domUtils.setAttributes(aNode, attrs); + _$jscoverage['core/Range.js'][1669]++; + domUtils.remove(elm, true); + _$jscoverage['core/Range.js'][1670]++; + elm = aNode; + } + else { + _$jscoverage['core/Range.js'][1672]++; + domUtils.mergeSibling(elm); + _$jscoverage['core/Range.js'][1673]++; + domUtils.clearEmptySibling(elm); + } + _$jscoverage['core/Range.js'][1676]++; + domUtils.mergeChild(elm, attrs); + _$jscoverage['core/Range.js'][1677]++; + current = domUtils.getNextDomNode(elm, false, filterFn); + _$jscoverage['core/Range.js'][1678]++; + domUtils.mergeToParent(elm); + _$jscoverage['core/Range.js'][1679]++; + if ((node === end)) { + _$jscoverage['core/Range.js'][1680]++; + break; + } + } + else { + _$jscoverage['core/Range.js'][1683]++; + current = domUtils.getNextDomNode(current, true, filterFn); + } +} + _$jscoverage['core/Range.js'][1686]++; + return this.moveToBookmark(bookmark); +}), removeInlineStyle: (function (tagNames) { + _$jscoverage['core/Range.js'][1696]++; + if (this.collapsed) { + _$jscoverage['core/Range.js'][1696]++; + return this; + } + _$jscoverage['core/Range.js'][1697]++; + tagNames = (utils.isArray(tagNames)? tagNames: [tagNames]); + _$jscoverage['core/Range.js'][1698]++; + this.shrinkBoundary().adjustmentBoundary(); + _$jscoverage['core/Range.js'][1699]++; + var start = this.startContainer, end = this.endContainer; + _$jscoverage['core/Range.js'][1700]++; + while (true) { + _$jscoverage['core/Range.js'][1701]++; + if ((start.nodeType == 1)) { + _$jscoverage['core/Range.js'][1702]++; + if ((utils.indexOf(tagNames, start.tagName.toLowerCase()) > -1)) { + _$jscoverage['core/Range.js'][1703]++; + break; + } + _$jscoverage['core/Range.js'][1705]++; + if ((start.tagName.toLowerCase() == "body")) { + _$jscoverage['core/Range.js'][1706]++; + start = null; + _$jscoverage['core/Range.js'][1707]++; + break; + } + } + _$jscoverage['core/Range.js'][1710]++; + start = start.parentNode; +} + _$jscoverage['core/Range.js'][1712]++; + while (true) { + _$jscoverage['core/Range.js'][1713]++; + if ((end.nodeType == 1)) { + _$jscoverage['core/Range.js'][1714]++; + if ((utils.indexOf(tagNames, end.tagName.toLowerCase()) > -1)) { + _$jscoverage['core/Range.js'][1715]++; + break; + } + _$jscoverage['core/Range.js'][1717]++; + if ((end.tagName.toLowerCase() == "body")) { + _$jscoverage['core/Range.js'][1718]++; + end = null; + _$jscoverage['core/Range.js'][1719]++; + break; + } + } + _$jscoverage['core/Range.js'][1722]++; + end = end.parentNode; +} + _$jscoverage['core/Range.js'][1724]++; + var bookmark = this.createBookmark(), frag, tmpRange; + _$jscoverage['core/Range.js'][1727]++; + if (start) { + _$jscoverage['core/Range.js'][1728]++; + tmpRange = this.cloneRange().setEndBefore(bookmark.start).setStartBefore(start); + _$jscoverage['core/Range.js'][1729]++; + frag = tmpRange.extractContents(); + _$jscoverage['core/Range.js'][1730]++; + tmpRange.insertNode(frag); + _$jscoverage['core/Range.js'][1731]++; + domUtils.clearEmptySibling(start, true); + _$jscoverage['core/Range.js'][1732]++; + start.parentNode.insertBefore(bookmark.start, start); + } + _$jscoverage['core/Range.js'][1734]++; + if (end) { + _$jscoverage['core/Range.js'][1735]++; + tmpRange = this.cloneRange().setStartAfter(bookmark.end).setEndAfter(end); + _$jscoverage['core/Range.js'][1736]++; + frag = tmpRange.extractContents(); + _$jscoverage['core/Range.js'][1737]++; + tmpRange.insertNode(frag); + _$jscoverage['core/Range.js'][1738]++; + domUtils.clearEmptySibling(end, false, true); + _$jscoverage['core/Range.js'][1739]++; + end.parentNode.insertBefore(bookmark.end, end.nextSibling); + } + _$jscoverage['core/Range.js'][1741]++; + var current = domUtils.getNextDomNode(bookmark.start, false, (function (node) { + _$jscoverage['core/Range.js'][1742]++; + return (node.nodeType == 1); +})), next; + _$jscoverage['core/Range.js'][1744]++; + while ((current && (current !== bookmark.end))) { + _$jscoverage['core/Range.js'][1745]++; + next = domUtils.getNextDomNode(current, true, (function (node) { + _$jscoverage['core/Range.js'][1746]++; + return (node.nodeType == 1); +})); + _$jscoverage['core/Range.js'][1748]++; + if ((utils.indexOf(tagNames, current.tagName.toLowerCase()) > -1)) { + _$jscoverage['core/Range.js'][1749]++; + domUtils.remove(current, true); + } + _$jscoverage['core/Range.js'][1751]++; + current = next; +} + _$jscoverage['core/Range.js'][1753]++; + return this.moveToBookmark(bookmark); +}), getClosedNode: (function () { + _$jscoverage['core/Range.js'][1783]++; + var node; + _$jscoverage['core/Range.js'][1784]++; + if ((! this.collapsed)) { + _$jscoverage['core/Range.js'][1785]++; + var range = this.cloneRange().adjustmentBoundary().shrinkBoundary(); + _$jscoverage['core/Range.js'][1786]++; + if (selectOneNode(range)) { + _$jscoverage['core/Range.js'][1787]++; + var child = range.startContainer.childNodes[range.startOffset]; + _$jscoverage['core/Range.js'][1788]++; + if ((child && (child.nodeType == 1) && (dtd.$empty[child.tagName] || dtd.$nonChild[child.tagName]))) { + _$jscoverage['core/Range.js'][1789]++; + node = child; + } + } + } + _$jscoverage['core/Range.js'][1793]++; + return node; +}), select: (browser.ie? (function (noFillData, textRange) { + _$jscoverage['core/Range.js'][1802]++; + var nativeRange; + _$jscoverage['core/Range.js'][1803]++; + if ((! this.collapsed)) { + _$jscoverage['core/Range.js'][1804]++; + this.shrinkBoundary(); + } + _$jscoverage['core/Range.js'][1805]++; + var node = this.getClosedNode(); + _$jscoverage['core/Range.js'][1806]++; + if ((node && (! textRange))) { + _$jscoverage['core/Range.js'][1807]++; + try { + _$jscoverage['core/Range.js'][1808]++; + nativeRange = this.document.body.createControlRange(); + _$jscoverage['core/Range.js'][1809]++; + nativeRange.addElement(node); + _$jscoverage['core/Range.js'][1810]++; + nativeRange.select(); + } + catch (e) { + } + _$jscoverage['core/Range.js'][1812]++; + return this; + } + _$jscoverage['core/Range.js'][1814]++; + var bookmark = this.createBookmark(), start = bookmark.start, end; + _$jscoverage['core/Range.js'][1817]++; + nativeRange = this.document.body.createTextRange(); + _$jscoverage['core/Range.js'][1818]++; + nativeRange.moveToElementText(start); + _$jscoverage['core/Range.js'][1819]++; + nativeRange.moveStart("character", 1); + _$jscoverage['core/Range.js'][1820]++; + if ((! this.collapsed)) { + _$jscoverage['core/Range.js'][1821]++; + var nativeRangeEnd = this.document.body.createTextRange(); + _$jscoverage['core/Range.js'][1822]++; + end = bookmark.end; + _$jscoverage['core/Range.js'][1823]++; + nativeRangeEnd.moveToElementText(end); + _$jscoverage['core/Range.js'][1824]++; + nativeRange.setEndPoint("EndToEnd", nativeRangeEnd); + } + else { + _$jscoverage['core/Range.js'][1826]++; + if (((! noFillData) && (this.startContainer.nodeType != 3))) { + _$jscoverage['core/Range.js'][1828]++; + var tmpText = this.document.createTextNode(fillChar), tmp = this.document.createElement("span"); + _$jscoverage['core/Range.js'][1830]++; + tmp.appendChild(this.document.createTextNode(fillChar)); + _$jscoverage['core/Range.js'][1831]++; + start.parentNode.insertBefore(tmp, start); + _$jscoverage['core/Range.js'][1832]++; + start.parentNode.insertBefore(tmpText, start); + _$jscoverage['core/Range.js'][1834]++; + removeFillData(this.document, tmpText); + _$jscoverage['core/Range.js'][1835]++; + fillData = tmpText; + _$jscoverage['core/Range.js'][1836]++; + mergeSibling(tmp, "previousSibling"); + _$jscoverage['core/Range.js'][1837]++; + mergeSibling(start, "nextSibling"); + _$jscoverage['core/Range.js'][1838]++; + nativeRange.moveStart("character", -1); + _$jscoverage['core/Range.js'][1839]++; + nativeRange.collapse(true); + } + } + _$jscoverage['core/Range.js'][1842]++; + this.moveToBookmark(bookmark); + _$jscoverage['core/Range.js'][1843]++; + (tmp && domUtils.remove(tmp)); + _$jscoverage['core/Range.js'][1845]++; + try { + _$jscoverage['core/Range.js'][1846]++; + nativeRange.select(); + } + catch (e) { + } + _$jscoverage['core/Range.js'][1849]++; + return this; +}): (function (notInsertFillData) { + _$jscoverage['core/Range.js'][1851]++; + function checkOffset(rng) { + _$jscoverage['core/Range.js'][1853]++; + function check(node, offset, dir) { + _$jscoverage['core/Range.js'][1854]++; + if (((node.nodeType == 3) && (node.nodeValue.length < offset))) { + _$jscoverage['core/Range.js'][1855]++; + rng[(dir + "Offset")] = node.nodeValue.length; + } +} + _$jscoverage['core/Range.js'][1858]++; + check(rng.startContainer, rng.startOffset, "start"); + _$jscoverage['core/Range.js'][1859]++; + check(rng.endContainer, rng.endOffset, "end"); +} + _$jscoverage['core/Range.js'][1861]++; + var win = domUtils.getWindow(this.document), sel = win.getSelection(), txtNode; + _$jscoverage['core/Range.js'][1866]++; + (browser.gecko? this.document.body.focus(): win.focus()); + _$jscoverage['core/Range.js'][1867]++; + if (sel) { + _$jscoverage['core/Range.js'][1868]++; + sel.removeAllRanges(); + _$jscoverage['core/Range.js'][1871]++; + if ((this.collapsed && (! notInsertFillData))) { + _$jscoverage['core/Range.js'][1883]++; + var start = this.startContainer, child = start; + _$jscoverage['core/Range.js'][1884]++; + if ((start.nodeType == 1)) { + _$jscoverage['core/Range.js'][1885]++; + child = start.childNodes[this.startOffset]; + } + _$jscoverage['core/Range.js'][1888]++; + if (((! ((start.nodeType == 3) && this.startOffset)) && (child? ((! child.previousSibling) || (child.previousSibling.nodeType != 3)): ((! start.lastChild) || (start.lastChild.nodeType != 3))))) { + _$jscoverage['core/Range.js'][1895]++; + txtNode = this.document.createTextNode(fillChar); + _$jscoverage['core/Range.js'][1897]++; + this.insertNode(txtNode); + _$jscoverage['core/Range.js'][1898]++; + removeFillData(this.document, txtNode); + _$jscoverage['core/Range.js'][1899]++; + mergeSibling(txtNode, "previousSibling"); + _$jscoverage['core/Range.js'][1900]++; + mergeSibling(txtNode, "nextSibling"); + _$jscoverage['core/Range.js'][1901]++; + fillData = txtNode; + _$jscoverage['core/Range.js'][1902]++; + this.setStart(txtNode, (browser.webkit? 1: 0)).collapse(true); + } + } + _$jscoverage['core/Range.js'][1905]++; + var nativeRange = this.document.createRange(); + _$jscoverage['core/Range.js'][1906]++; + if ((this.collapsed && browser.opera && (this.startContainer.nodeType == 1))) { + _$jscoverage['core/Range.js'][1907]++; + var child = this.startContainer.childNodes[this.startOffset]; + _$jscoverage['core/Range.js'][1908]++; + if ((! child)) { + _$jscoverage['core/Range.js'][1910]++; + child = this.startContainer.lastChild; + _$jscoverage['core/Range.js'][1911]++; + if ((child && domUtils.isBr(child))) { + _$jscoverage['core/Range.js'][1912]++; + this.setStartBefore(child).collapse(true); + } + } + else { + _$jscoverage['core/Range.js'][1916]++; + while ((child && domUtils.isBlockElm(child))) { + _$jscoverage['core/Range.js'][1917]++; + if (((child.nodeType == 1) && child.childNodes[0])) { + _$jscoverage['core/Range.js'][1918]++; + child = child.childNodes[0]; + } + else { + _$jscoverage['core/Range.js'][1920]++; + break; + } +} + _$jscoverage['core/Range.js'][1923]++; + (child && this.setStartBefore(child).collapse(true)); + } + } + _$jscoverage['core/Range.js'][1928]++; + checkOffset(this); + _$jscoverage['core/Range.js'][1929]++; + nativeRange.setStart(this.startContainer, this.startOffset); + _$jscoverage['core/Range.js'][1930]++; + nativeRange.setEnd(this.endContainer, this.endOffset); + _$jscoverage['core/Range.js'][1931]++; + sel.addRange(nativeRange); + } + _$jscoverage['core/Range.js'][1933]++; + return this; +})), scrollToView: (function (win, offset) { + _$jscoverage['core/Range.js'][1951]++; + win = (win? window: domUtils.getWindow(this.document)); + _$jscoverage['core/Range.js'][1952]++; + var me = this, span = me.document.createElement("span"); + _$jscoverage['core/Range.js'][1955]++; + span.innerHTML = " "; + _$jscoverage['core/Range.js'][1956]++; + me.cloneRange().insertNode(span); + _$jscoverage['core/Range.js'][1957]++; + domUtils.scrollToView(span, win, offset); + _$jscoverage['core/Range.js'][1958]++; + domUtils.remove(span); + _$jscoverage['core/Range.js'][1959]++; + return me; +}), inFillChar: (function () { + _$jscoverage['core/Range.js'][1967]++; + var start = this.startContainer; + _$jscoverage['core/Range.js'][1968]++; + if ((this.collapsed && (start.nodeType == 3) && ((start.nodeValue.replace(new RegExp(("^" + domUtils.fillChar)), "").length + 1) == start.nodeValue.length))) { + _$jscoverage['core/Range.js'][1971]++; + return true; + } + _$jscoverage['core/Range.js'][1973]++; + return false; +}), createAddress: (function (ignoreEnd, ignoreTxt) { + _$jscoverage['core/Range.js'][2000]++; + var addr = {}, me = this; + _$jscoverage['core/Range.js'][2002]++; + function getAddress(isStart) { + _$jscoverage['core/Range.js'][2003]++; + var node = (isStart? me.startContainer: me.endContainer); + _$jscoverage['core/Range.js'][2004]++; + var parents = domUtils.findParents(node, true, (function (node) { + _$jscoverage['core/Range.js'][2004]++; + return (! domUtils.isBody(node)); +})), addrs = []; + _$jscoverage['core/Range.js'][2006]++; + for (var i = 0, ci; (ci = parents[(i++)]);) { + _$jscoverage['core/Range.js'][2007]++; + addrs.push(domUtils.getNodeIndex(ci, ignoreTxt)); +} + _$jscoverage['core/Range.js'][2009]++; + var firstIndex = 0; + _$jscoverage['core/Range.js'][2011]++; + if (ignoreTxt) { + _$jscoverage['core/Range.js'][2012]++; + if ((node.nodeType == 3)) { + _$jscoverage['core/Range.js'][2013]++; + var tmpNode = node.previousSibling; + _$jscoverage['core/Range.js'][2014]++; + while ((tmpNode && (tmpNode.nodeType == 3))) { + _$jscoverage['core/Range.js'][2015]++; + firstIndex += tmpNode.nodeValue.replace(fillCharReg, "").length; + _$jscoverage['core/Range.js'][2016]++; + tmpNode = tmpNode.previousSibling; +} + _$jscoverage['core/Range.js'][2018]++; + firstIndex += (isStart? me.startOffset: me.endOffset); + } + else { + _$jscoverage['core/Range.js'][2020]++; + node = node.childNodes[(isStart? me.startOffset: me.endOffset)]; + _$jscoverage['core/Range.js'][2021]++; + if (node) { + _$jscoverage['core/Range.js'][2022]++; + firstIndex = domUtils.getNodeIndex(node, ignoreTxt); + } + else { + _$jscoverage['core/Range.js'][2024]++; + node = (isStart? me.startContainer: me.endContainer); + _$jscoverage['core/Range.js'][2025]++; + var first = node.firstChild; + _$jscoverage['core/Range.js'][2026]++; + while (first) { + _$jscoverage['core/Range.js'][2027]++; + if (domUtils.isFillChar(first)) { + _$jscoverage['core/Range.js'][2028]++; + first = first.nextSibling; + _$jscoverage['core/Range.js'][2029]++; + continue; + } + _$jscoverage['core/Range.js'][2031]++; + (firstIndex++); + _$jscoverage['core/Range.js'][2032]++; + if ((first.nodeType == 3)) { + _$jscoverage['core/Range.js'][2033]++; + while ((first && (first.nodeType == 3))) { + _$jscoverage['core/Range.js'][2034]++; + first = first.nextSibling; +} + } + else { + _$jscoverage['core/Range.js'][2037]++; + first = first.nextSibling; + } +} + } + } + } + else { + _$jscoverage['core/Range.js'][2044]++; + firstIndex = (isStart? (domUtils.isFillChar(node)? 0: me.startOffset): me.endOffset); + } + _$jscoverage['core/Range.js'][2046]++; + if ((firstIndex < 0)) { + _$jscoverage['core/Range.js'][2047]++; + firstIndex = 0; + } + _$jscoverage['core/Range.js'][2049]++; + addrs.push(firstIndex); + _$jscoverage['core/Range.js'][2050]++; + return addrs; +} + _$jscoverage['core/Range.js'][2052]++; + addr.startAddress = getAddress(true); + _$jscoverage['core/Range.js'][2053]++; + if ((! ignoreEnd)) { + _$jscoverage['core/Range.js'][2054]++; + addr.endAddress = (me.collapsed? [].concat(addr.startAddress): getAddress()); + } + _$jscoverage['core/Range.js'][2056]++; + return addr; +}), moveToAddress: (function (addr, ignoreEnd) { + _$jscoverage['core/Range.js'][2085]++; + var me = this; + _$jscoverage['core/Range.js'][2086]++; + function getNode(address, isStart) { + _$jscoverage['core/Range.js'][2087]++; + var tmpNode = me.document.body, parentNode, offset; + _$jscoverage['core/Range.js'][2089]++; + for (var i = 0, ci, l = address.length; (i < l); (i++)) { + _$jscoverage['core/Range.js'][2090]++; + ci = address[i]; + _$jscoverage['core/Range.js'][2091]++; + parentNode = tmpNode; + _$jscoverage['core/Range.js'][2092]++; + tmpNode = tmpNode.childNodes[ci]; + _$jscoverage['core/Range.js'][2093]++; + if ((! tmpNode)) { + _$jscoverage['core/Range.js'][2094]++; + offset = ci; + _$jscoverage['core/Range.js'][2095]++; + break; + } +} + _$jscoverage['core/Range.js'][2098]++; + if (isStart) { + _$jscoverage['core/Range.js'][2099]++; + if (tmpNode) { + _$jscoverage['core/Range.js'][2100]++; + me.setStartBefore(tmpNode); + } + else { + _$jscoverage['core/Range.js'][2102]++; + me.setStart(parentNode, offset); + } + } + else { + _$jscoverage['core/Range.js'][2105]++; + if (tmpNode) { + _$jscoverage['core/Range.js'][2106]++; + me.setEndBefore(tmpNode); + } + else { + _$jscoverage['core/Range.js'][2108]++; + me.setEnd(parentNode, offset); + } + } +} + _$jscoverage['core/Range.js'][2112]++; + getNode(addr.startAddress, true); + _$jscoverage['core/Range.js'][2113]++; + ((! ignoreEnd) && addr.endAddress && getNode(addr.endAddress)); + _$jscoverage['core/Range.js'][2114]++; + return me; +}), traversal: (function (doFn, filterFn) { + _$jscoverage['core/Range.js'][2214]++; + if (this.collapsed) { + _$jscoverage['core/Range.js'][2215]++; + return this; + } + _$jscoverage['core/Range.js'][2216]++; + var bookmark = this.createBookmark(), end = bookmark.end, current = domUtils.getNextDomNode(bookmark.start, false, filterFn); + _$jscoverage['core/Range.js'][2219]++; + while ((current && (current !== end) && (domUtils.getPosition(current, end) & domUtils.POSITION_PRECEDING))) { + _$jscoverage['core/Range.js'][2220]++; + var tmpNode = domUtils.getNextDomNode(current, false, filterFn); + _$jscoverage['core/Range.js'][2221]++; + doFn(current); + _$jscoverage['core/Range.js'][2222]++; + current = tmpNode; +} + _$jscoverage['core/Range.js'][2224]++; + return this.moveToBookmark(bookmark); +})}; +})(); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/core/Selection.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/core/Selection.js new file mode 100644 index 000000000..c12cc84f1 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/core/Selection.js @@ -0,0 +1,606 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['core/Selection.js']) { + _$jscoverage['core/Selection.js'] = []; + _$jscoverage['core/Selection.js'][13] = 0; + _$jscoverage['core/Selection.js'][15] = 0; + _$jscoverage['core/Selection.js'][16] = 0; + _$jscoverage['core/Selection.js'][17] = 0; + _$jscoverage['core/Selection.js'][18] = 0; + _$jscoverage['core/Selection.js'][19] = 0; + _$jscoverage['core/Selection.js'][21] = 0; + _$jscoverage['core/Selection.js'][22] = 0; + _$jscoverage['core/Selection.js'][24] = 0; + _$jscoverage['core/Selection.js'][29] = 0; + _$jscoverage['core/Selection.js'][30] = 0; + _$jscoverage['core/Selection.js'][31] = 0; + _$jscoverage['core/Selection.js'][32] = 0; + _$jscoverage['core/Selection.js'][33] = 0; + _$jscoverage['core/Selection.js'][34] = 0; + _$jscoverage['core/Selection.js'][35] = 0; + _$jscoverage['core/Selection.js'][36] = 0; + _$jscoverage['core/Selection.js'][37] = 0; + _$jscoverage['core/Selection.js'][40] = 0; + _$jscoverage['core/Selection.js'][43] = 0; + _$jscoverage['core/Selection.js'][44] = 0; + _$jscoverage['core/Selection.js'][45] = 0; + _$jscoverage['core/Selection.js'][46] = 0; + _$jscoverage['core/Selection.js'][47] = 0; + _$jscoverage['core/Selection.js'][48] = 0; + _$jscoverage['core/Selection.js'][49] = 0; + _$jscoverage['core/Selection.js'][50] = 0; + _$jscoverage['core/Selection.js'][53] = 0; + _$jscoverage['core/Selection.js'][54] = 0; + _$jscoverage['core/Selection.js'][55] = 0; + _$jscoverage['core/Selection.js'][57] = 0; + _$jscoverage['core/Selection.js'][59] = 0; + _$jscoverage['core/Selection.js'][60] = 0; + _$jscoverage['core/Selection.js'][61] = 0; + _$jscoverage['core/Selection.js'][62] = 0; + _$jscoverage['core/Selection.js'][63] = 0; + _$jscoverage['core/Selection.js'][67] = 0; + _$jscoverage['core/Selection.js'][68] = 0; + _$jscoverage['core/Selection.js'][69] = 0; + _$jscoverage['core/Selection.js'][70] = 0; + _$jscoverage['core/Selection.js'][71] = 0; + _$jscoverage['core/Selection.js'][73] = 0; + _$jscoverage['core/Selection.js'][76] = 0; + _$jscoverage['core/Selection.js'][85] = 0; + _$jscoverage['core/Selection.js'][86] = 0; + _$jscoverage['core/Selection.js'][87] = 0; + _$jscoverage['core/Selection.js'][89] = 0; + _$jscoverage['core/Selection.js'][90] = 0; + _$jscoverage['core/Selection.js'][91] = 0; + _$jscoverage['core/Selection.js'][92] = 0; + _$jscoverage['core/Selection.js'][93] = 0; + _$jscoverage['core/Selection.js'][96] = 0; + _$jscoverage['core/Selection.js'][104] = 0; + _$jscoverage['core/Selection.js'][105] = 0; + _$jscoverage['core/Selection.js'][107] = 0; + _$jscoverage['core/Selection.js'][108] = 0; + _$jscoverage['core/Selection.js'][110] = 0; + _$jscoverage['core/Selection.js'][112] = 0; + _$jscoverage['core/Selection.js'][113] = 0; + _$jscoverage['core/Selection.js'][114] = 0; + _$jscoverage['core/Selection.js'][116] = 0; + _$jscoverage['core/Selection.js'][119] = 0; + _$jscoverage['core/Selection.js'][120] = 0; + _$jscoverage['core/Selection.js'][121] = 0; + _$jscoverage['core/Selection.js'][122] = 0; + _$jscoverage['core/Selection.js'][123] = 0; + _$jscoverage['core/Selection.js'][124] = 0; + _$jscoverage['core/Selection.js'][125] = 0; + _$jscoverage['core/Selection.js'][127] = 0; + _$jscoverage['core/Selection.js'][128] = 0; + _$jscoverage['core/Selection.js'][129] = 0; + _$jscoverage['core/Selection.js'][130] = 0; + _$jscoverage['core/Selection.js'][134] = 0; + _$jscoverage['core/Selection.js'][137] = 0; + _$jscoverage['core/Selection.js'][140] = 0; + _$jscoverage['core/Selection.js'][151] = 0; + _$jscoverage['core/Selection.js'][152] = 0; + _$jscoverage['core/Selection.js'][153] = 0; + _$jscoverage['core/Selection.js'][155] = 0; + _$jscoverage['core/Selection.js'][168] = 0; + _$jscoverage['core/Selection.js'][169] = 0; + _$jscoverage['core/Selection.js'][170] = 0; + _$jscoverage['core/Selection.js'][171] = 0; + _$jscoverage['core/Selection.js'][174] = 0; + _$jscoverage['core/Selection.js'][182] = 0; + _$jscoverage['core/Selection.js'][183] = 0; + _$jscoverage['core/Selection.js'][184] = 0; + _$jscoverage['core/Selection.js'][185] = 0; + _$jscoverage['core/Selection.js'][198] = 0; + _$jscoverage['core/Selection.js'][199] = 0; + _$jscoverage['core/Selection.js'][201] = 0; + _$jscoverage['core/Selection.js'][202] = 0; + _$jscoverage['core/Selection.js'][203] = 0; + _$jscoverage['core/Selection.js'][205] = 0; + _$jscoverage['core/Selection.js'][212] = 0; + _$jscoverage['core/Selection.js'][219] = 0; + _$jscoverage['core/Selection.js'][220] = 0; + _$jscoverage['core/Selection.js'][222] = 0; + _$jscoverage['core/Selection.js'][236] = 0; + _$jscoverage['core/Selection.js'][237] = 0; + _$jscoverage['core/Selection.js'][238] = 0; + _$jscoverage['core/Selection.js'][240] = 0; + _$jscoverage['core/Selection.js'][241] = 0; + _$jscoverage['core/Selection.js'][242] = 0; + _$jscoverage['core/Selection.js'][244] = 0; + _$jscoverage['core/Selection.js'][245] = 0; + _$jscoverage['core/Selection.js'][247] = 0; + _$jscoverage['core/Selection.js'][248] = 0; + _$jscoverage['core/Selection.js'][252] = 0; + _$jscoverage['core/Selection.js'][253] = 0; + _$jscoverage['core/Selection.js'][255] = 0; + _$jscoverage['core/Selection.js'][256] = 0; + _$jscoverage['core/Selection.js'][257] = 0; + _$jscoverage['core/Selection.js'][258] = 0; + _$jscoverage['core/Selection.js'][260] = 0; + _$jscoverage['core/Selection.js'][261] = 0; + _$jscoverage['core/Selection.js'][263] = 0; + _$jscoverage['core/Selection.js'][267] = 0; + _$jscoverage['core/Selection.js'][270] = 0; + _$jscoverage['core/Selection.js'][271] = 0; + _$jscoverage['core/Selection.js'][272] = 0; + _$jscoverage['core/Selection.js'][273] = 0; + _$jscoverage['core/Selection.js'][274] = 0; + _$jscoverage['core/Selection.js'][275] = 0; + _$jscoverage['core/Selection.js'][276] = 0; + _$jscoverage['core/Selection.js'][280] = 0; + _$jscoverage['core/Selection.js'][281] = 0; + _$jscoverage['core/Selection.js'][283] = 0; + _$jscoverage['core/Selection.js'][286] = 0; + _$jscoverage['core/Selection.js'][298] = 0; + _$jscoverage['core/Selection.js'][299] = 0; + _$jscoverage['core/Selection.js'][301] = 0; + _$jscoverage['core/Selection.js'][304] = 0; + _$jscoverage['core/Selection.js'][305] = 0; + _$jscoverage['core/Selection.js'][307] = 0; + _$jscoverage['core/Selection.js'][310] = 0; + _$jscoverage['core/Selection.js'][311] = 0; + _$jscoverage['core/Selection.js'][313] = 0; + _$jscoverage['core/Selection.js'][315] = 0; + _$jscoverage['core/Selection.js'][316] = 0; + _$jscoverage['core/Selection.js'][317] = 0; + _$jscoverage['core/Selection.js'][318] = 0; + _$jscoverage['core/Selection.js'][319] = 0; + _$jscoverage['core/Selection.js'][320] = 0; + _$jscoverage['core/Selection.js'][321] = 0; + _$jscoverage['core/Selection.js'][322] = 0; + _$jscoverage['core/Selection.js'][326] = 0; + _$jscoverage['core/Selection.js'][327] = 0; + _$jscoverage['core/Selection.js'][328] = 0; + _$jscoverage['core/Selection.js'][329] = 0; + _$jscoverage['core/Selection.js'][331] = 0; + _$jscoverage['core/Selection.js'][332] = 0; + _$jscoverage['core/Selection.js'][335] = 0; + _$jscoverage['core/Selection.js'][347] = 0; + _$jscoverage['core/Selection.js'][348] = 0; + _$jscoverage['core/Selection.js'][349] = 0; + _$jscoverage['core/Selection.js'][350] = 0; + _$jscoverage['core/Selection.js'][352] = 0; + _$jscoverage['core/Selection.js'][363] = 0; +} +_$jscoverage['core/Selection.js'].source = ["/**"," * 选集"," * @file"," * @module UE.dom.Selection"," * @since 1.2.6.1"," */","","/**"," * UEditor公用空间,UEditor所有的功能都挂载在该空间下"," * @module UE"," */","","(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 ( ie ) {"," 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 = {"," /**"," * 获取原生seleciton对象"," * @method getNative"," * @return { Object } 获得selection对象"," * @example"," * ```javascript"," * editor.selection.getNative();"," * ```"," */"," getNative:function () {"," var doc = this.document;"," try {"," return !doc ? null : ie && browser.ie < 9 ? 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 {"," return browser.ie && _getIERange( this ) || !browser.ie && this.getNative().rangeCount ? true : false;"," } 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 ( ie && browser.ie < 9 ) {"," 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 = ie ? this.getIERange() : this.getRange(),"," tmpRange,"," start, tmp, parent;"," if ( ie ) {"," if ( !range ) {"," //todo 给第一个值可能会有问题"," return this.document.body.firstChild;"," }"," //control元素"," if ( range.item ){"," return range.item( 0 );"," }"," tmpRange = range.duplicate();"," //修正ie下<b>x</b>[xx] 闭合后 <b>x|</b>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.ie ? nativeSel.createRange() : nativeSel.getRangeAt( 0 );"," return browser.ie ? nativeRange.text : nativeRange.toString();"," }"," return '';"," },"," /**"," * 清除选区"," * @method clearRange"," * @example"," * ```javascript"," * editor.selection.clearRange();"," * ```"," */"," clearRange : function(){"," this.getNative()[browser.ie ? 'empty' : 'removeAllRanges']();"," }"," };","})();"]; +_$jscoverage['core/Selection.js'][13]++; +(function () { + _$jscoverage['core/Selection.js'][15]++; + function getBoundaryInformation(range, start) { + _$jscoverage['core/Selection.js'][16]++; + var getIndex = domUtils.getNodeIndex; + _$jscoverage['core/Selection.js'][17]++; + range = range.duplicate(); + _$jscoverage['core/Selection.js'][18]++; + range.collapse(start); + _$jscoverage['core/Selection.js'][19]++; + var parent = range.parentElement(); + _$jscoverage['core/Selection.js'][21]++; + if ((! parent.hasChildNodes())) { + _$jscoverage['core/Selection.js'][22]++; + return ({container: parent, offset: 0}); + } + _$jscoverage['core/Selection.js'][24]++; + var siblings = parent.children, child, testRange = range.duplicate(), startIndex = 0, endIndex = (siblings.length - 1), index = -1, distance; + _$jscoverage['core/Selection.js'][29]++; + while ((startIndex <= endIndex)) { + _$jscoverage['core/Selection.js'][30]++; + index = Math.floor(((startIndex + endIndex) / 2)); + _$jscoverage['core/Selection.js'][31]++; + child = siblings[index]; + _$jscoverage['core/Selection.js'][32]++; + testRange.moveToElementText(child); + _$jscoverage['core/Selection.js'][33]++; + var position = testRange.compareEndPoints("StartToStart", range); + _$jscoverage['core/Selection.js'][34]++; + if ((position > 0)) { + _$jscoverage['core/Selection.js'][35]++; + endIndex = (index - 1); + } + else { + _$jscoverage['core/Selection.js'][36]++; + if ((position < 0)) { + _$jscoverage['core/Selection.js'][37]++; + startIndex = (index + 1); + } + else { + _$jscoverage['core/Selection.js'][40]++; + return ({container: parent, offset: getIndex(child)}); + } + } +} + _$jscoverage['core/Selection.js'][43]++; + if ((index == -1)) { + _$jscoverage['core/Selection.js'][44]++; + testRange.moveToElementText(parent); + _$jscoverage['core/Selection.js'][45]++; + testRange.setEndPoint("StartToStart", range); + _$jscoverage['core/Selection.js'][46]++; + distance = testRange.text.replace(/(\r\n|\r)/g, "\n").length; + _$jscoverage['core/Selection.js'][47]++; + siblings = parent.childNodes; + _$jscoverage['core/Selection.js'][48]++; + if ((! distance)) { + _$jscoverage['core/Selection.js'][49]++; + child = siblings[(siblings.length - 1)]; + _$jscoverage['core/Selection.js'][50]++; + return ({container: child, offset: child.nodeValue.length}); + } + _$jscoverage['core/Selection.js'][53]++; + var i = siblings.length; + _$jscoverage['core/Selection.js'][54]++; + while ((distance > 0)) { + _$jscoverage['core/Selection.js'][55]++; + distance -= siblings[(--i)].nodeValue.length; +} + _$jscoverage['core/Selection.js'][57]++; + return ({container: siblings[i], offset: (- distance)}); + } + _$jscoverage['core/Selection.js'][59]++; + testRange.collapse((position > 0)); + _$jscoverage['core/Selection.js'][60]++; + testRange.setEndPoint(((position > 0)? "StartToStart": "EndToStart"), range); + _$jscoverage['core/Selection.js'][61]++; + distance = testRange.text.replace(/(\r\n|\r)/g, "\n").length; + _$jscoverage['core/Selection.js'][62]++; + if ((! distance)) { + _$jscoverage['core/Selection.js'][63]++; + 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)}); + } + _$jscoverage['core/Selection.js'][67]++; + while ((distance > 0)) { + _$jscoverage['core/Selection.js'][68]++; + try { + _$jscoverage['core/Selection.js'][69]++; + var pre = child; + _$jscoverage['core/Selection.js'][70]++; + child = child[((position > 0)? "previousSibling": "nextSibling")]; + _$jscoverage['core/Selection.js'][71]++; + distance -= child.nodeValue.length; + } + catch (e) { + _$jscoverage['core/Selection.js'][73]++; + return ({container: parent, offset: getIndex(pre)}); + } +} + _$jscoverage['core/Selection.js'][76]++; + return ({container: child, offset: ((position > 0)? (- distance): (child.nodeValue.length + distance))}); +} + _$jscoverage['core/Selection.js'][85]++; + function transformIERangeToRange(ieRange, range) { + _$jscoverage['core/Selection.js'][86]++; + if (ieRange.item) { + _$jscoverage['core/Selection.js'][87]++; + range.selectNode(ieRange.item(0)); + } + else { + _$jscoverage['core/Selection.js'][89]++; + var bi = getBoundaryInformation(ieRange, true); + _$jscoverage['core/Selection.js'][90]++; + range.setStart(bi.container, bi.offset); + _$jscoverage['core/Selection.js'][91]++; + if ((ieRange.compareEndPoints("StartToEnd", ieRange) != 0)) { + _$jscoverage['core/Selection.js'][92]++; + bi = getBoundaryInformation(ieRange, false); + _$jscoverage['core/Selection.js'][93]++; + range.setEnd(bi.container, bi.offset); + } + } + _$jscoverage['core/Selection.js'][96]++; + return range; +} + _$jscoverage['core/Selection.js'][104]++; + function _getIERange(sel) { + _$jscoverage['core/Selection.js'][105]++; + var ieRange; + _$jscoverage['core/Selection.js'][107]++; + try { + _$jscoverage['core/Selection.js'][108]++; + ieRange = sel.getNative().createRange(); + } + catch (e) { + _$jscoverage['core/Selection.js'][110]++; + return null; + } + _$jscoverage['core/Selection.js'][112]++; + var el = (ieRange.item? ieRange.item(0): ieRange.parentElement()); + _$jscoverage['core/Selection.js'][113]++; + if (((el.ownerDocument || el) === sel.document)) { + _$jscoverage['core/Selection.js'][114]++; + return ieRange; + } + _$jscoverage['core/Selection.js'][116]++; + return null; +} + _$jscoverage['core/Selection.js'][119]++; + var Selection = (dom.Selection = (function (doc) { + _$jscoverage['core/Selection.js'][120]++; + var me = this, iframe; + _$jscoverage['core/Selection.js'][121]++; + me.document = doc; + _$jscoverage['core/Selection.js'][122]++; + if (ie) { + _$jscoverage['core/Selection.js'][123]++; + iframe = domUtils.getWindow(doc).frameElement; + _$jscoverage['core/Selection.js'][124]++; + domUtils.on(iframe, "beforedeactivate", (function () { + _$jscoverage['core/Selection.js'][125]++; + me._bakIERange = me.getIERange(); +})); + _$jscoverage['core/Selection.js'][127]++; + domUtils.on(iframe, "activate", (function () { + _$jscoverage['core/Selection.js'][128]++; + try { + _$jscoverage['core/Selection.js'][129]++; + if (((! _getIERange(me)) && me._bakIERange)) { + _$jscoverage['core/Selection.js'][130]++; + me._bakIERange.select(); + } + } + catch (ex) { + } + _$jscoverage['core/Selection.js'][134]++; + me._bakIERange = null; +})); + } + _$jscoverage['core/Selection.js'][137]++; + iframe = (doc = null); +})); + _$jscoverage['core/Selection.js'][140]++; + Selection.prototype = {getNative: (function () { + _$jscoverage['core/Selection.js'][151]++; + var doc = this.document; + _$jscoverage['core/Selection.js'][152]++; + try { + _$jscoverage['core/Selection.js'][153]++; + return ((! doc)? null: ((ie && (browser.ie < 9))? doc.selection: domUtils.getWindow(doc).getSelection())); + } + catch (e) { + _$jscoverage['core/Selection.js'][155]++; + return null; + } +}), getIERange: (function () { + _$jscoverage['core/Selection.js'][168]++; + var ieRange = _getIERange(this); + _$jscoverage['core/Selection.js'][169]++; + if ((! ieRange)) { + _$jscoverage['core/Selection.js'][170]++; + if (this._bakIERange) { + _$jscoverage['core/Selection.js'][171]++; + return this._bakIERange; + } + } + _$jscoverage['core/Selection.js'][174]++; + return ieRange; +}), cache: (function () { + _$jscoverage['core/Selection.js'][182]++; + this.clear(); + _$jscoverage['core/Selection.js'][183]++; + this._cachedRange = this.getRange(); + _$jscoverage['core/Selection.js'][184]++; + this._cachedStartElement = this.getStart(); + _$jscoverage['core/Selection.js'][185]++; + this._cachedStartElementPath = this.getStartElementPath(); +}), getStartElementPath: (function () { + _$jscoverage['core/Selection.js'][198]++; + if (this._cachedStartElementPath) { + _$jscoverage['core/Selection.js'][199]++; + return this._cachedStartElementPath; + } + _$jscoverage['core/Selection.js'][201]++; + var start = this.getStart(); + _$jscoverage['core/Selection.js'][202]++; + if (start) { + _$jscoverage['core/Selection.js'][203]++; + return domUtils.findParents(start, true, null, true); + } + _$jscoverage['core/Selection.js'][205]++; + return []; +}), clear: (function () { + _$jscoverage['core/Selection.js'][212]++; + this._cachedStartElementPath = (this._cachedRange = (this._cachedStartElement = null)); +}), isFocus: (function () { + _$jscoverage['core/Selection.js'][219]++; + try { + _$jscoverage['core/Selection.js'][220]++; + return (((browser.ie && _getIERange(this)) || ((! browser.ie) && this.getNative().rangeCount))? true: false); + } + catch (e) { + _$jscoverage['core/Selection.js'][222]++; + return false; + } +}), getRange: (function () { + _$jscoverage['core/Selection.js'][236]++; + var me = this; + _$jscoverage['core/Selection.js'][237]++; + function optimze(range) { + _$jscoverage['core/Selection.js'][238]++; + var child = me.document.body.firstChild, collapsed = range.collapsed; + _$jscoverage['core/Selection.js'][240]++; + while ((child && child.firstChild)) { + _$jscoverage['core/Selection.js'][241]++; + range.setStart(child, 0); + _$jscoverage['core/Selection.js'][242]++; + child = child.firstChild; +} + _$jscoverage['core/Selection.js'][244]++; + if ((! range.startContainer)) { + _$jscoverage['core/Selection.js'][245]++; + range.setStart(me.document.body, 0); + } + _$jscoverage['core/Selection.js'][247]++; + if (collapsed) { + _$jscoverage['core/Selection.js'][248]++; + range.collapse(true); + } +} + _$jscoverage['core/Selection.js'][252]++; + if ((me._cachedRange != null)) { + _$jscoverage['core/Selection.js'][253]++; + return this._cachedRange; + } + _$jscoverage['core/Selection.js'][255]++; + var range = new (baidu.editor.dom.Range)(me.document); + _$jscoverage['core/Selection.js'][256]++; + if ((ie && (browser.ie < 9))) { + _$jscoverage['core/Selection.js'][257]++; + var nativeRange = me.getIERange(); + _$jscoverage['core/Selection.js'][258]++; + if (nativeRange) { + _$jscoverage['core/Selection.js'][260]++; + try { + _$jscoverage['core/Selection.js'][261]++; + transformIERangeToRange(nativeRange, range); + } + catch (e) { + _$jscoverage['core/Selection.js'][263]++; + optimze(range); + } + } + else { + _$jscoverage['core/Selection.js'][267]++; + optimze(range); + } + } + else { + _$jscoverage['core/Selection.js'][270]++; + var sel = me.getNative(); + _$jscoverage['core/Selection.js'][271]++; + if ((sel && sel.rangeCount)) { + _$jscoverage['core/Selection.js'][272]++; + var firstRange = sel.getRangeAt(0); + _$jscoverage['core/Selection.js'][273]++; + var lastRange = sel.getRangeAt((sel.rangeCount - 1)); + _$jscoverage['core/Selection.js'][274]++; + range.setStart(firstRange.startContainer, firstRange.startOffset).setEnd(lastRange.endContainer, lastRange.endOffset); + _$jscoverage['core/Selection.js'][275]++; + if ((range.collapsed && domUtils.isBody(range.startContainer) && (! range.startOffset))) { + _$jscoverage['core/Selection.js'][276]++; + optimze(range); + } + } + else { + _$jscoverage['core/Selection.js'][280]++; + if ((this._bakRange && domUtils.inDoc(this._bakRange.startContainer, this.document))) { + _$jscoverage['core/Selection.js'][281]++; + return this._bakRange; + } + _$jscoverage['core/Selection.js'][283]++; + optimze(range); + } + } + _$jscoverage['core/Selection.js'][286]++; + return (this._bakRange = range); +}), getStart: (function () { + _$jscoverage['core/Selection.js'][298]++; + if (this._cachedStartElement) { + _$jscoverage['core/Selection.js'][299]++; + return this._cachedStartElement; + } + _$jscoverage['core/Selection.js'][301]++; + var range = (ie? this.getIERange(): this.getRange()), tmpRange, start, tmp, parent; + _$jscoverage['core/Selection.js'][304]++; + if (ie) { + _$jscoverage['core/Selection.js'][305]++; + if ((! range)) { + _$jscoverage['core/Selection.js'][307]++; + return this.document.body.firstChild; + } + _$jscoverage['core/Selection.js'][310]++; + if (range.item) { + _$jscoverage['core/Selection.js'][311]++; + return range.item(0); + } + _$jscoverage['core/Selection.js'][313]++; + tmpRange = range.duplicate(); + _$jscoverage['core/Selection.js'][315]++; + ((tmpRange.text.length > 0) && tmpRange.moveStart("character", 1)); + _$jscoverage['core/Selection.js'][316]++; + tmpRange.collapse(1); + _$jscoverage['core/Selection.js'][317]++; + start = tmpRange.parentElement(); + _$jscoverage['core/Selection.js'][318]++; + parent = (tmp = range.parentElement()); + _$jscoverage['core/Selection.js'][319]++; + while ((tmp = tmp.parentNode)) { + _$jscoverage['core/Selection.js'][320]++; + if ((tmp == start)) { + _$jscoverage['core/Selection.js'][321]++; + start = parent; + _$jscoverage['core/Selection.js'][322]++; + break; + } +} + } + else { + _$jscoverage['core/Selection.js'][326]++; + range.shrinkBoundary(); + _$jscoverage['core/Selection.js'][327]++; + start = range.startContainer; + _$jscoverage['core/Selection.js'][328]++; + if (((start.nodeType == 1) && start.hasChildNodes())) { + _$jscoverage['core/Selection.js'][329]++; + start = start.childNodes[Math.min((start.childNodes.length - 1), range.startOffset)]; + } + _$jscoverage['core/Selection.js'][331]++; + if ((start.nodeType == 3)) { + _$jscoverage['core/Selection.js'][332]++; + return start.parentNode; + } + } + _$jscoverage['core/Selection.js'][335]++; + return start; +}), getText: (function () { + _$jscoverage['core/Selection.js'][347]++; + var nativeSel, nativeRange; + _$jscoverage['core/Selection.js'][348]++; + if ((this.isFocus() && (nativeSel = this.getNative()))) { + _$jscoverage['core/Selection.js'][349]++; + nativeRange = (browser.ie? nativeSel.createRange(): nativeSel.getRangeAt(0)); + _$jscoverage['core/Selection.js'][350]++; + return (browser.ie? nativeRange.text: nativeRange.toString()); + } + _$jscoverage['core/Selection.js'][352]++; + return ""; +}), clearRange: (function () { + _$jscoverage['core/Selection.js'][363]++; + (this.getNative()[(browser.ie? "empty": "removeAllRanges")])(); +})}; +})(); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/core/ajax.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/core/ajax.js new file mode 100644 index 000000000..ef9d21189 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/core/ajax.js @@ -0,0 +1,203 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['core/ajax.js']) { + _$jscoverage['core/ajax.js'] = []; + _$jscoverage['core/ajax.js'][11] = 0; + _$jscoverage['core/ajax.js'][14] = 0; + _$jscoverage['core/ajax.js'][15] = 0; + _$jscoverage['core/ajax.js'][16] = 0; + _$jscoverage['core/ajax.js'][17] = 0; + _$jscoverage['core/ajax.js'][19] = 0; + _$jscoverage['core/ajax.js'][20] = 0; + _$jscoverage['core/ajax.js'][21] = 0; + _$jscoverage['core/ajax.js'][25] = 0; + _$jscoverage['core/ajax.js'][32] = 0; + _$jscoverage['core/ajax.js'][33] = 0; + _$jscoverage['core/ajax.js'][34] = 0; + _$jscoverage['core/ajax.js'][36] = 0; + _$jscoverage['core/ajax.js'][38] = 0; + _$jscoverage['core/ajax.js'][39] = 0; + _$jscoverage['core/ajax.js'][42] = 0; + _$jscoverage['core/ajax.js'][47] = 0; + _$jscoverage['core/ajax.js'][106] = 0; + _$jscoverage['core/ajax.js'][121] = 0; + _$jscoverage['core/ajax.js'][122] = 0; + _$jscoverage['core/ajax.js'][123] = 0; + _$jscoverage['core/ajax.js'][125] = 0; + _$jscoverage['core/ajax.js'][126] = 0; + _$jscoverage['core/ajax.js'][128] = 0; + _$jscoverage['core/ajax.js'][130] = 0; + _$jscoverage['core/ajax.js'][131] = 0; + _$jscoverage['core/ajax.js'][134] = 0; + _$jscoverage['core/ajax.js'][135] = 0; + _$jscoverage['core/ajax.js'][136] = 0; + _$jscoverage['core/ajax.js'][137] = 0; + _$jscoverage['core/ajax.js'][138] = 0; + _$jscoverage['core/ajax.js'][142] = 0; + _$jscoverage['core/ajax.js'][143] = 0; + _$jscoverage['core/ajax.js'][144] = 0; + _$jscoverage['core/ajax.js'][145] = 0; + _$jscoverage['core/ajax.js'][146] = 0; + _$jscoverage['core/ajax.js'][147] = 0; + _$jscoverage['core/ajax.js'][148] = 0; + _$jscoverage['core/ajax.js'][150] = 0; + _$jscoverage['core/ajax.js'][154] = 0; + _$jscoverage['core/ajax.js'][155] = 0; + _$jscoverage['core/ajax.js'][156] = 0; + _$jscoverage['core/ajax.js'][158] = 0; +} +_$jscoverage['core/ajax.js'].source = ["/**"," * @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\") continue;"," //传递过来的对象和函数不在提交之列"," if (!((typeof json[i]).toLowerCase() == \"function\" || (typeof json[i]).toLowerCase() == \"object\")) {"," strArr.push( encodeURIComponent(i) + \"=\"+encodeURIComponent(json[i]) );"," }"," }"," return strArr.join(\"&\");",""," }","",""," return {"," /**"," * 根据给定的参数项,向指定的url发起一个ajax请求。 ajax请求完成后,会根据请求结果调用相应回调: 如果请求"," * 成功, 则调用onsuccess回调, 失败则调用 onerror 回调"," * @method request"," * @param { URLString } url ajax请求的url地址"," * @param { KeyValueMap } 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: 'ueditor'"," * },"," *"," * //请求成功后的回调, 该回调接受当前的XMLHttpRequest对象作为参数。"," * onsuccess: function ( xhr ) {"," * console.log( xhr.responseText );"," * },"," *"," * //请求失败或者超时后的回调。"," * onerror: function ( xhr ) {"," * alert( 'Ajax请求失败' );"," * }"," *"," * } );"," * ```"," */",""," /**"," * 根据给定的参数项发起一个ajax请求, 参数项里必须包含一个url地址。 ajax请求完成后,会根据请求结果调用相应回调: 如果请求"," * 成功, 则调用onsuccess回调, 失败则调用 onerror 回调。"," * @method request"," * @warning 如果在参数项里未提供一个key为“url”的地址值,则该请求将直接退出。"," * @param { KeyValueMap } ajaxOptions ajax请求选项的键值对,支持的选项如下:"," * @example"," * ```javascript"," *"," * //向sayhello.php发起一个异步的Ajax POST请求, 请求超时时间为5s, 请求完成后不执行任何回调。"," * UE.ajax.requeset( 'sayhello.php', {"," *"," * //请求的地址, 该项是必须的。"," * url: 'sayhello.php'"," *"," * } );"," * ```"," */","\t\trequest:function(url, ajaxOptions) {"," var ajaxRequest = creatAjaxRequest(),"," //是否超时"," timeIsOut = false,"," //默认参数"," defaultAjaxOptions = {"," method:\"POST\","," timeout:5000,"," async:true,"," data:{},//需要传递对象的话只能覆盖"," onsuccess:function() {"," },"," onerror:function() {"," }"," };","","\t\t\tif (typeof url === \"object\") {","\t\t\t\tajaxOptions = url;","\t\t\t\turl = ajaxOptions.url;","\t\t\t}","\t\t\tif (!ajaxRequest || !url) return;","\t\t\tvar ajaxOpts = ajaxOptions ? utils.extend(defaultAjaxOptions,ajaxOptions) : defaultAjaxOptions;","","\t\t\tvar submitStr = json2str(ajaxOpts); // { name:\"Jim\",city:\"Beijing\" } --> \"name=Jim&city=Beijing\"","\t\t\t//如果用户直接通过data参数传递json对象过来,则也要将此json对象转化为字符串","\t\t\tif (!utils.isEmptyObject(ajaxOpts.data)){"," submitStr += (submitStr? \"&\":\"\") + json2str(ajaxOpts.data);","\t\t\t}"," //超时检测"," var timerID = setTimeout(function() {"," if (ajaxRequest.readyState != 4) {"," timeIsOut = true;"," ajaxRequest.abort();"," clearTimeout(timerID);"," }"," }, ajaxOpts.timeout);","","\t\t\tvar method = ajaxOpts.method.toUpperCase();"," var str = url + (url.indexOf(\"?\")==-1?\"?\":\"&\") + (method==\"POST\"?\"\":submitStr+ \"&noCache=\" + +new Date);","\t\t\tajaxRequest.open(method, str, ajaxOpts.async);","\t\t\tajaxRequest.onreadystatechange = function() {","\t\t\t\tif (ajaxRequest.readyState == 4) {","\t\t\t\t\tif (!timeIsOut && ajaxRequest.status == 200) {","\t\t\t\t\t\tajaxOpts.onsuccess(ajaxRequest);","\t\t\t\t\t} else {","\t\t\t\t\t\tajaxOpts.onerror(ajaxRequest);","\t\t\t\t\t}","\t\t\t\t}","\t\t\t};","\t\t\tif (method == \"POST\") {","\t\t\t\tajaxRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');","\t\t\t\tajaxRequest.send(submitStr);","\t\t\t} else {","\t\t\t\tajaxRequest.send(null);","\t\t\t}","\t\t}","\t};","","","}();"]; +_$jscoverage['core/ajax.js'][11]++; +UE.ajax = (function () { + _$jscoverage['core/ajax.js'][14]++; + var fnStr = "XMLHttpRequest()"; + _$jscoverage['core/ajax.js'][15]++; + try { + _$jscoverage['core/ajax.js'][16]++; + new ActiveXObject("Msxml2.XMLHTTP"); + _$jscoverage['core/ajax.js'][17]++; + fnStr = "ActiveXObject('Msxml2.XMLHTTP')"; + } + catch (e) { + _$jscoverage['core/ajax.js'][19]++; + try { + _$jscoverage['core/ajax.js'][20]++; + new ActiveXObject("Microsoft.XMLHTTP"); + _$jscoverage['core/ajax.js'][21]++; + fnStr = "ActiveXObject('Microsoft.XMLHTTP')"; + } + catch (e) { + } + } + _$jscoverage['core/ajax.js'][25]++; + var creatAjaxRequest = new Function(("return new " + fnStr)); + _$jscoverage['core/ajax.js'][32]++; + function json2str(json) { + _$jscoverage['core/ajax.js'][33]++; + var strArr = []; + _$jscoverage['core/ajax.js'][34]++; + for (var i in json) { + _$jscoverage['core/ajax.js'][36]++; + if (((i == "method") || (i == "timeout") || (i == "async"))) { + _$jscoverage['core/ajax.js'][36]++; + continue; + } + _$jscoverage['core/ajax.js'][38]++; + if ((! (((typeof json[i]).toLowerCase() == "function") || ((typeof json[i]).toLowerCase() == "object")))) { + _$jscoverage['core/ajax.js'][39]++; + strArr.push((encodeURIComponent(i) + "=" + encodeURIComponent(json[i]))); + } +} + _$jscoverage['core/ajax.js'][42]++; + return strArr.join("&"); +} + _$jscoverage['core/ajax.js'][47]++; + return ({request: (function (url, ajaxOptions) { + _$jscoverage['core/ajax.js'][106]++; + var ajaxRequest = creatAjaxRequest(), timeIsOut = false, defaultAjaxOptions = {method: "POST", timeout: 5000, async: true, data: {}, onsuccess: (function () { +}), onerror: (function () { +})}; + _$jscoverage['core/ajax.js'][121]++; + if (((typeof url) === "object")) { + _$jscoverage['core/ajax.js'][122]++; + ajaxOptions = url; + _$jscoverage['core/ajax.js'][123]++; + url = ajaxOptions.url; + } + _$jscoverage['core/ajax.js'][125]++; + if (((! ajaxRequest) || (! url))) { + _$jscoverage['core/ajax.js'][125]++; + return; + } + _$jscoverage['core/ajax.js'][126]++; + var ajaxOpts = (ajaxOptions? utils.extend(defaultAjaxOptions, ajaxOptions): defaultAjaxOptions); + _$jscoverage['core/ajax.js'][128]++; + var submitStr = json2str(ajaxOpts); + _$jscoverage['core/ajax.js'][130]++; + if ((! utils.isEmptyObject(ajaxOpts.data))) { + _$jscoverage['core/ajax.js'][131]++; + submitStr += ((submitStr? "&": "") + json2str(ajaxOpts.data)); + } + _$jscoverage['core/ajax.js'][134]++; + var timerID = setTimeout((function () { + _$jscoverage['core/ajax.js'][135]++; + if ((ajaxRequest.readyState != 4)) { + _$jscoverage['core/ajax.js'][136]++; + timeIsOut = true; + _$jscoverage['core/ajax.js'][137]++; + ajaxRequest.abort(); + _$jscoverage['core/ajax.js'][138]++; + clearTimeout(timerID); + } +}), ajaxOpts.timeout); + _$jscoverage['core/ajax.js'][142]++; + var method = ajaxOpts.method.toUpperCase(); + _$jscoverage['core/ajax.js'][143]++; + var str = (url + ((url.indexOf("?") == -1)? "?": "&") + ((method == "POST")? "": (submitStr + "&noCache=" + (+ new Date())))); + _$jscoverage['core/ajax.js'][144]++; + ajaxRequest.open(method, str, ajaxOpts.async); + _$jscoverage['core/ajax.js'][145]++; + ajaxRequest.onreadystatechange = (function () { + _$jscoverage['core/ajax.js'][146]++; + if ((ajaxRequest.readyState == 4)) { + _$jscoverage['core/ajax.js'][147]++; + if (((! timeIsOut) && (ajaxRequest.status == 200))) { + _$jscoverage['core/ajax.js'][148]++; + ajaxOpts.onsuccess(ajaxRequest); + } + else { + _$jscoverage['core/ajax.js'][150]++; + ajaxOpts.onerror(ajaxRequest); + } + } +}); + _$jscoverage['core/ajax.js'][154]++; + if ((method == "POST")) { + _$jscoverage['core/ajax.js'][155]++; + ajaxRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); + _$jscoverage['core/ajax.js'][156]++; + ajaxRequest.send(submitStr); + } + else { + _$jscoverage['core/ajax.js'][158]++; + ajaxRequest.send(null); + } +})}); +})(); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/core/browser.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/core/browser.js new file mode 100644 index 000000000..368582eb5 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/core/browser.js @@ -0,0 +1,135 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['core/browser.js']) { + _$jscoverage['core/browser.js'] = []; + _$jscoverage['core/browser.js'][13] = 0; + _$jscoverage['core/browser.js'][14] = 0; + _$jscoverage['core/browser.js'][83] = 0; + _$jscoverage['core/browser.js'][85] = 0; + _$jscoverage['core/browser.js'][88] = 0; + _$jscoverage['core/browser.js'][89] = 0; + _$jscoverage['core/browser.js'][100] = 0; + _$jscoverage['core/browser.js'][112] = 0; + _$jscoverage['core/browser.js'][124] = 0; + _$jscoverage['core/browser.js'][136] = 0; + _$jscoverage['core/browser.js'][149] = 0; + _$jscoverage['core/browser.js'][154] = 0; + _$jscoverage['core/browser.js'][155] = 0; + _$jscoverage['core/browser.js'][156] = 0; + _$jscoverage['core/browser.js'][158] = 0; + _$jscoverage['core/browser.js'][159] = 0; + _$jscoverage['core/browser.js'][173] = 0; + _$jscoverage['core/browser.js'][174] = 0; + _$jscoverage['core/browser.js'][187] = 0; + _$jscoverage['core/browser.js'][188] = 0; + _$jscoverage['core/browser.js'][193] = 0; + _$jscoverage['core/browser.js'][194] = 0; + _$jscoverage['core/browser.js'][197] = 0; + _$jscoverage['core/browser.js'][198] = 0; + _$jscoverage['core/browser.js'][213] = 0; + _$jscoverage['core/browser.js'][224] = 0; + _$jscoverage['core/browser.js'][232] = 0; + _$jscoverage['core/browser.js'][235] = 0; +} +_$jscoverage['core/browser.js'].source = ["/**"," * 浏览器判断模块"," * @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\t\t: !!window.ActiveXObject,",""," /**"," * @property {boolean} opera 检测当前浏览器是否为Opera"," * @example"," * ```javascript"," * if ( UE.browser.opera ) {"," * console.log( '当前浏览器是Opera' );"," * }"," * ```"," */"," opera\t: ( !!opera && opera.version ),",""," /**"," * @property {boolean} webkit 检测当前浏览器是否是webkit内核的浏览器"," * @example"," * ```javascript"," * if ( UE.browser.webkit ) {"," * console.log( '当前浏览器是webkit内核浏览器' );"," * }"," * ```"," */"," webkit\t: ( agent.indexOf( ' applewebkit/' ) > -1 ),",""," /**"," * @property {boolean} mac 检测当前浏览器是否是运行在mac平台下"," * @example"," * ```javascript"," * if ( UE.browser.mac ) {"," * console.log( '当前浏览器运行在mac平台下' );"," * }"," * ```"," */"," mac\t: ( 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 );",""," var version = 0;",""," // Internet Explorer 6.0+"," if ( browser.ie ){"," version = parseFloat( agent.match( /msie (\\d+)/ )[1] );"," /**"," * @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 );",""," }",""," // 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)){"," \tbrowser.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"," * <ul>"," * <li>IE系列返回值为5,6,7,8,9,10等</li>"," * <li>gecko系列会返回10900,158900等</li>"," * <li>webkit系列会返回其build号 (如 522等)</li>"," * </ul>"," * @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;"]; +_$jscoverage['core/browser.js'][13]++; +var browser = (UE.browser = (function () { + _$jscoverage['core/browser.js'][14]++; + var agent = navigator.userAgent.toLowerCase(), opera = window.opera, browser = {ie: (! (! window.ActiveXObject)), opera: ((! (! opera)) && opera.version), webkit: (agent.indexOf(" applewebkit/") > -1), mac: (agent.indexOf("macintosh") > -1), quirks: (document.compatMode == "BackCompat")}; + _$jscoverage['core/browser.js'][83]++; + browser.gecko = ((navigator.product == "Gecko") && (! browser.webkit) && (! browser.opera)); + _$jscoverage['core/browser.js'][85]++; + var version = 0; + _$jscoverage['core/browser.js'][88]++; + if (browser.ie) { + _$jscoverage['core/browser.js'][89]++; + version = parseFloat(agent.match(/msie (\d+)/)[1]); + _$jscoverage['core/browser.js'][100]++; + browser.ie9Compat = (document.documentMode == 9); + _$jscoverage['core/browser.js'][112]++; + browser.ie8 = (! (! document.documentMode)); + _$jscoverage['core/browser.js'][124]++; + browser.ie8Compat = (document.documentMode == 8); + _$jscoverage['core/browser.js'][136]++; + browser.ie7Compat = (((version == 7) && (! document.documentMode)) || (document.documentMode == 7)); + _$jscoverage['core/browser.js'][149]++; + browser.ie6Compat = ((version < 7) || browser.quirks); + } + _$jscoverage['core/browser.js'][154]++; + if (browser.gecko) { + _$jscoverage['core/browser.js'][155]++; + var geckoRelease = agent.match(/rv:([\d\.]+)/); + _$jscoverage['core/browser.js'][156]++; + if (geckoRelease) { + _$jscoverage['core/browser.js'][158]++; + geckoRelease = geckoRelease[1].split("."); + _$jscoverage['core/browser.js'][159]++; + version = ((geckoRelease[0] * 10000) + ((geckoRelease[1] || 0) * 100) + ((geckoRelease[2] || 0) * 1)); + } + } + _$jscoverage['core/browser.js'][173]++; + if (/chrome\/(\d+\.\d)/i.test(agent)) { + _$jscoverage['core/browser.js'][174]++; + browser.chrome = (+ RegExp.$1); + } + _$jscoverage['core/browser.js'][187]++; + if ((/(\d+\.\d)?(?:\.\d)?\s+safari\/?(\d+\.\d+)?/i.test(agent) && (! /chrome/i.test(agent)))) { + _$jscoverage['core/browser.js'][188]++; + browser.safari = (+ (RegExp.$1 || RegExp.$2)); + } + _$jscoverage['core/browser.js'][193]++; + if (browser.opera) { + _$jscoverage['core/browser.js'][194]++; + version = parseFloat(opera.version()); + } + _$jscoverage['core/browser.js'][197]++; + if (browser.webkit) { + _$jscoverage['core/browser.js'][198]++; + version = parseFloat(agent.match(/ applewebkit\/(\d+)/)[1]); + } + _$jscoverage['core/browser.js'][213]++; + browser.version = version; + _$jscoverage['core/browser.js'][224]++; + 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)); + _$jscoverage['core/browser.js'][232]++; + return browser; +})()); +_$jscoverage['core/browser.js'][235]++; +var ie = browser.ie, webkit = browser.webkit, gecko = browser.gecko, opera = browser.opera; diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/core/domUtils.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/core/domUtils.js new file mode 100644 index 000000000..12f26b157 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/core/domUtils.js @@ -0,0 +1,1846 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['core/domUtils.js']) { + _$jscoverage['core/domUtils.js'] = []; + _$jscoverage['core/domUtils.js'][15] = 0; + _$jscoverage['core/domUtils.js'][16] = 0; + _$jscoverage['core/domUtils.js'][18] = 0; + _$jscoverage['core/domUtils.js'][19] = 0; + _$jscoverage['core/domUtils.js'][20] = 0; + _$jscoverage['core/domUtils.js'][21] = 0; + _$jscoverage['core/domUtils.js'][23] = 0; + _$jscoverage['core/domUtils.js'][25] = 0; + _$jscoverage['core/domUtils.js'][26] = 0; + _$jscoverage['core/domUtils.js'][28] = 0; + _$jscoverage['core/domUtils.js'][30] = 0; + _$jscoverage['core/domUtils.js'][53] = 0; + _$jscoverage['core/domUtils.js'][120] = 0; + _$jscoverage['core/domUtils.js'][122] = 0; + _$jscoverage['core/domUtils.js'][124] = 0; + _$jscoverage['core/domUtils.js'][127] = 0; + _$jscoverage['core/domUtils.js'][128] = 0; + _$jscoverage['core/domUtils.js'][130] = 0; + _$jscoverage['core/domUtils.js'][132] = 0; + _$jscoverage['core/domUtils.js'][134] = 0; + _$jscoverage['core/domUtils.js'][136] = 0; + _$jscoverage['core/domUtils.js'][137] = 0; + _$jscoverage['core/domUtils.js'][139] = 0; + _$jscoverage['core/domUtils.js'][141] = 0; + _$jscoverage['core/domUtils.js'][143] = 0; + _$jscoverage['core/domUtils.js'][145] = 0; + _$jscoverage['core/domUtils.js'][146] = 0; + _$jscoverage['core/domUtils.js'][147] = 0; + _$jscoverage['core/domUtils.js'][149] = 0; + _$jscoverage['core/domUtils.js'][151] = 0; + _$jscoverage['core/domUtils.js'][152] = 0; + _$jscoverage['core/domUtils.js'][154] = 0; + _$jscoverage['core/domUtils.js'][155] = 0; + _$jscoverage['core/domUtils.js'][156] = 0; + _$jscoverage['core/domUtils.js'][157] = 0; + _$jscoverage['core/domUtils.js'][159] = 0; + _$jscoverage['core/domUtils.js'][163] = 0; + _$jscoverage['core/domUtils.js'][181] = 0; + _$jscoverage['core/domUtils.js'][183] = 0; + _$jscoverage['core/domUtils.js'][184] = 0; + _$jscoverage['core/domUtils.js'][185] = 0; + _$jscoverage['core/domUtils.js'][186] = 0; + _$jscoverage['core/domUtils.js'][188] = 0; + _$jscoverage['core/domUtils.js'][190] = 0; + _$jscoverage['core/domUtils.js'][192] = 0; + _$jscoverage['core/domUtils.js'][217] = 0; + _$jscoverage['core/domUtils.js'][279] = 0; + _$jscoverage['core/domUtils.js'][280] = 0; + _$jscoverage['core/domUtils.js'][281] = 0; + _$jscoverage['core/domUtils.js'][282] = 0; + _$jscoverage['core/domUtils.js'][283] = 0; + _$jscoverage['core/domUtils.js'][285] = 0; + _$jscoverage['core/domUtils.js'][288] = 0; + _$jscoverage['core/domUtils.js'][350] = 0; + _$jscoverage['core/domUtils.js'][351] = 0; + _$jscoverage['core/domUtils.js'][352] = 0; + _$jscoverage['core/domUtils.js'][365] = 0; + _$jscoverage['core/domUtils.js'][366] = 0; + _$jscoverage['core/domUtils.js'][367] = 0; + _$jscoverage['core/domUtils.js'][369] = 0; + _$jscoverage['core/domUtils.js'][380] = 0; + _$jscoverage['core/domUtils.js'][420] = 0; + _$jscoverage['core/domUtils.js'][422] = 0; + _$jscoverage['core/domUtils.js'][423] = 0; + _$jscoverage['core/domUtils.js'][424] = 0; + _$jscoverage['core/domUtils.js'][425] = 0; + _$jscoverage['core/domUtils.js'][428] = 0; + _$jscoverage['core/domUtils.js'][430] = 0; + _$jscoverage['core/domUtils.js'][437] = 0; + _$jscoverage['core/domUtils.js'][456] = 0; + _$jscoverage['core/domUtils.js'][471] = 0; + _$jscoverage['core/domUtils.js'][472] = 0; + _$jscoverage['core/domUtils.js'][490] = 0; + _$jscoverage['core/domUtils.js'][491] = 0; + _$jscoverage['core/domUtils.js'][492] = 0; + _$jscoverage['core/domUtils.js'][493] = 0; + _$jscoverage['core/domUtils.js'][494] = 0; + _$jscoverage['core/domUtils.js'][495] = 0; + _$jscoverage['core/domUtils.js'][497] = 0; + _$jscoverage['core/domUtils.js'][499] = 0; + _$jscoverage['core/domUtils.js'][500] = 0; + _$jscoverage['core/domUtils.js'][501] = 0; + _$jscoverage['core/domUtils.js'][502] = 0; + _$jscoverage['core/domUtils.js'][503] = 0; + _$jscoverage['core/domUtils.js'][505] = 0; + _$jscoverage['core/domUtils.js'][506] = 0; + _$jscoverage['core/domUtils.js'][507] = 0; + _$jscoverage['core/domUtils.js'][509] = 0; + _$jscoverage['core/domUtils.js'][523] = 0; + _$jscoverage['core/domUtils.js'][524] = 0; + _$jscoverage['core/domUtils.js'][525] = 0; + _$jscoverage['core/domUtils.js'][528] = 0; + _$jscoverage['core/domUtils.js'][529] = 0; + _$jscoverage['core/domUtils.js'][530] = 0; + _$jscoverage['core/domUtils.js'][533] = 0; + _$jscoverage['core/domUtils.js'][534] = 0; + _$jscoverage['core/domUtils.js'][554] = 0; + _$jscoverage['core/domUtils.js'][555] = 0; + _$jscoverage['core/domUtils.js'][556] = 0; + _$jscoverage['core/domUtils.js'][557] = 0; + _$jscoverage['core/domUtils.js'][559] = 0; + _$jscoverage['core/domUtils.js'][561] = 0; + _$jscoverage['core/domUtils.js'][562] = 0; + _$jscoverage['core/domUtils.js'][563] = 0; + _$jscoverage['core/domUtils.js'][564] = 0; + _$jscoverage['core/domUtils.js'][566] = 0; + _$jscoverage['core/domUtils.js'][586] = 0; + _$jscoverage['core/domUtils.js'][604] = 0; + _$jscoverage['core/domUtils.js'][605] = 0; + _$jscoverage['core/domUtils.js'][606] = 0; + _$jscoverage['core/domUtils.js'][607] = 0; + _$jscoverage['core/domUtils.js'][608] = 0; + _$jscoverage['core/domUtils.js'][610] = 0; + _$jscoverage['core/domUtils.js'][641] = 0; + _$jscoverage['core/domUtils.js'][643] = 0; + _$jscoverage['core/domUtils.js'][644] = 0; + _$jscoverage['core/domUtils.js'][645] = 0; + _$jscoverage['core/domUtils.js'][646] = 0; + _$jscoverage['core/domUtils.js'][648] = 0; + _$jscoverage['core/domUtils.js'][649] = 0; + _$jscoverage['core/domUtils.js'][653] = 0; + _$jscoverage['core/domUtils.js'][654] = 0; + _$jscoverage['core/domUtils.js'][655] = 0; + _$jscoverage['core/domUtils.js'][656] = 0; + _$jscoverage['core/domUtils.js'][658] = 0; + _$jscoverage['core/domUtils.js'][659] = 0; + _$jscoverage['core/domUtils.js'][660] = 0; + _$jscoverage['core/domUtils.js'][665] = 0; + _$jscoverage['core/domUtils.js'][669] = 0; + _$jscoverage['core/domUtils.js'][700] = 0; + _$jscoverage['core/domUtils.js'][702] = 0; + _$jscoverage['core/domUtils.js'][703] = 0; + _$jscoverage['core/domUtils.js'][704] = 0; + _$jscoverage['core/domUtils.js'][705] = 0; + _$jscoverage['core/domUtils.js'][707] = 0; + _$jscoverage['core/domUtils.js'][708] = 0; + _$jscoverage['core/domUtils.js'][709] = 0; + _$jscoverage['core/domUtils.js'][711] = 0; + _$jscoverage['core/domUtils.js'][712] = 0; + _$jscoverage['core/domUtils.js'][713] = 0; + _$jscoverage['core/domUtils.js'][714] = 0; + _$jscoverage['core/domUtils.js'][716] = 0; + _$jscoverage['core/domUtils.js'][749] = 0; + _$jscoverage['core/domUtils.js'][750] = 0; + _$jscoverage['core/domUtils.js'][752] = 0; + _$jscoverage['core/domUtils.js'][754] = 0; + _$jscoverage['core/domUtils.js'][755] = 0; + _$jscoverage['core/domUtils.js'][757] = 0; + _$jscoverage['core/domUtils.js'][758] = 0; + _$jscoverage['core/domUtils.js'][759] = 0; + _$jscoverage['core/domUtils.js'][760] = 0; + _$jscoverage['core/domUtils.js'][761] = 0; + _$jscoverage['core/domUtils.js'][763] = 0; + _$jscoverage['core/domUtils.js'][764] = 0; + _$jscoverage['core/domUtils.js'][766] = 0; + _$jscoverage['core/domUtils.js'][769] = 0; + _$jscoverage['core/domUtils.js'][770] = 0; + _$jscoverage['core/domUtils.js'][771] = 0; + _$jscoverage['core/domUtils.js'][772] = 0; + _$jscoverage['core/domUtils.js'][774] = 0; + _$jscoverage['core/domUtils.js'][777] = 0; + _$jscoverage['core/domUtils.js'][779] = 0; + _$jscoverage['core/domUtils.js'][780] = 0; + _$jscoverage['core/domUtils.js'][784] = 0; + _$jscoverage['core/domUtils.js'][785] = 0; + _$jscoverage['core/domUtils.js'][786] = 0; + _$jscoverage['core/domUtils.js'][787] = 0; + _$jscoverage['core/domUtils.js'][790] = 0; + _$jscoverage['core/domUtils.js'][791] = 0; + _$jscoverage['core/domUtils.js'][794] = 0; + _$jscoverage['core/domUtils.js'][824] = 0; + _$jscoverage['core/domUtils.js'][826] = 0; + _$jscoverage['core/domUtils.js'][827] = 0; + _$jscoverage['core/domUtils.js'][828] = 0; + _$jscoverage['core/domUtils.js'][829] = 0; + _$jscoverage['core/domUtils.js'][830] = 0; + _$jscoverage['core/domUtils.js'][831] = 0; + _$jscoverage['core/domUtils.js'][832] = 0; + _$jscoverage['core/domUtils.js'][833] = 0; + _$jscoverage['core/domUtils.js'][835] = 0; + _$jscoverage['core/domUtils.js'][836] = 0; + _$jscoverage['core/domUtils.js'][839] = 0; + _$jscoverage['core/domUtils.js'][841] = 0; + _$jscoverage['core/domUtils.js'][842] = 0; + _$jscoverage['core/domUtils.js'][844] = 0; + _$jscoverage['core/domUtils.js'][845] = 0; + _$jscoverage['core/domUtils.js'][846] = 0; + _$jscoverage['core/domUtils.js'][847] = 0; + _$jscoverage['core/domUtils.js'][849] = 0; + _$jscoverage['core/domUtils.js'][850] = 0; + _$jscoverage['core/domUtils.js'][851] = 0; + _$jscoverage['core/domUtils.js'][854] = 0; + _$jscoverage['core/domUtils.js'][885] = 0; + _$jscoverage['core/domUtils.js'][900] = 0; + _$jscoverage['core/domUtils.js'][913] = 0; + _$jscoverage['core/domUtils.js'][918] = 0; + _$jscoverage['core/domUtils.js'][919] = 0; + _$jscoverage['core/domUtils.js'][920] = 0; + _$jscoverage['core/domUtils.js'][921] = 0; + _$jscoverage['core/domUtils.js'][922] = 0; + _$jscoverage['core/domUtils.js'][923] = 0; + _$jscoverage['core/domUtils.js'][924] = 0; + _$jscoverage['core/domUtils.js'][925] = 0; + _$jscoverage['core/domUtils.js'][926] = 0; + _$jscoverage['core/domUtils.js'][928] = 0; + _$jscoverage['core/domUtils.js'][929] = 0; + _$jscoverage['core/domUtils.js'][931] = 0; + _$jscoverage['core/domUtils.js'][932] = 0; + _$jscoverage['core/domUtils.js'][934] = 0; + _$jscoverage['core/domUtils.js'][935] = 0; + _$jscoverage['core/domUtils.js'][937] = 0; + _$jscoverage['core/domUtils.js'][939] = 0; + _$jscoverage['core/domUtils.js'][940] = 0; + _$jscoverage['core/domUtils.js'][941] = 0; + _$jscoverage['core/domUtils.js'][942] = 0; + _$jscoverage['core/domUtils.js'][943] = 0; + _$jscoverage['core/domUtils.js'][944] = 0; + _$jscoverage['core/domUtils.js'][958] = 0; + _$jscoverage['core/domUtils.js'][959] = 0; + _$jscoverage['core/domUtils.js'][961] = 0; + _$jscoverage['core/domUtils.js'][962] = 0; + _$jscoverage['core/domUtils.js'][964] = 0; + _$jscoverage['core/domUtils.js'][965] = 0; + _$jscoverage['core/domUtils.js'][967] = 0; + _$jscoverage['core/domUtils.js'][970] = 0; + _$jscoverage['core/domUtils.js'][972] = 0; + _$jscoverage['core/domUtils.js'][974] = 0; + _$jscoverage['core/domUtils.js'][1000] = 0; + _$jscoverage['core/domUtils.js'][1001] = 0; + _$jscoverage['core/domUtils.js'][1002] = 0; + _$jscoverage['core/domUtils.js'][1003] = 0; + _$jscoverage['core/domUtils.js'][1006] = 0; + _$jscoverage['core/domUtils.js'][1007] = 0; + _$jscoverage['core/domUtils.js'][1019] = 0; + _$jscoverage['core/domUtils.js'][1020] = 0; + _$jscoverage['core/domUtils.js'][1021] = 0; + _$jscoverage['core/domUtils.js'][1022] = 0; + _$jscoverage['core/domUtils.js'][1025] = 0; + _$jscoverage['core/domUtils.js'][1026] = 0; + _$jscoverage['core/domUtils.js'][1027] = 0; + _$jscoverage['core/domUtils.js'][1028] = 0; + _$jscoverage['core/domUtils.js'][1029] = 0; + _$jscoverage['core/domUtils.js'][1030] = 0; + _$jscoverage['core/domUtils.js'][1031] = 0; + _$jscoverage['core/domUtils.js'][1034] = 0; + _$jscoverage['core/domUtils.js'][1035] = 0; + _$jscoverage['core/domUtils.js'][1036] = 0; + _$jscoverage['core/domUtils.js'][1037] = 0; + _$jscoverage['core/domUtils.js'][1038] = 0; + _$jscoverage['core/domUtils.js'][1039] = 0; + _$jscoverage['core/domUtils.js'][1040] = 0; + _$jscoverage['core/domUtils.js'][1044] = 0; + _$jscoverage['core/domUtils.js'][1045] = 0; + _$jscoverage['core/domUtils.js'][1047] = 0; + _$jscoverage['core/domUtils.js'][1049] = 0; + _$jscoverage['core/domUtils.js'][1050] = 0; + _$jscoverage['core/domUtils.js'][1061] = 0; + _$jscoverage['core/domUtils.js'][1062] = 0; + _$jscoverage['core/domUtils.js'][1063] = 0; + _$jscoverage['core/domUtils.js'][1065] = 0; + _$jscoverage['core/domUtils.js'][1066] = 0; + _$jscoverage['core/domUtils.js'][1067] = 0; + _$jscoverage['core/domUtils.js'][1068] = 0; + _$jscoverage['core/domUtils.js'][1069] = 0; + _$jscoverage['core/domUtils.js'][1070] = 0; + _$jscoverage['core/domUtils.js'][1071] = 0; + _$jscoverage['core/domUtils.js'][1075] = 0; + _$jscoverage['core/domUtils.js'][1106] = 0; + _$jscoverage['core/domUtils.js'][1107] = 0; + _$jscoverage['core/domUtils.js'][1108] = 0; + _$jscoverage['core/domUtils.js'][1109] = 0; + _$jscoverage['core/domUtils.js'][1111] = 0; + _$jscoverage['core/domUtils.js'][1113] = 0; + _$jscoverage['core/domUtils.js'][1114] = 0; + _$jscoverage['core/domUtils.js'][1115] = 0; + _$jscoverage['core/domUtils.js'][1116] = 0; + _$jscoverage['core/domUtils.js'][1118] = 0; + _$jscoverage['core/domUtils.js'][1120] = 0; + _$jscoverage['core/domUtils.js'][1121] = 0; + _$jscoverage['core/domUtils.js'][1125] = 0; + _$jscoverage['core/domUtils.js'][1126] = 0; + _$jscoverage['core/domUtils.js'][1127] = 0; + _$jscoverage['core/domUtils.js'][1130] = 0; + _$jscoverage['core/domUtils.js'][1189] = 0; + _$jscoverage['core/domUtils.js'][1190] = 0; + _$jscoverage['core/domUtils.js'][1191] = 0; + _$jscoverage['core/domUtils.js'][1192] = 0; + _$jscoverage['core/domUtils.js'][1193] = 0; + _$jscoverage['core/domUtils.js'][1194] = 0; + _$jscoverage['core/domUtils.js'][1196] = 0; + _$jscoverage['core/domUtils.js'][1199] = 0; + _$jscoverage['core/domUtils.js'][1202] = 0; + _$jscoverage['core/domUtils.js'][1203] = 0; + _$jscoverage['core/domUtils.js'][1218] = 0; + _$jscoverage['core/domUtils.js'][1219] = 0; + _$jscoverage['core/domUtils.js'][1221] = 0; + _$jscoverage['core/domUtils.js'][1222] = 0; + _$jscoverage['core/domUtils.js'][1224] = 0; + _$jscoverage['core/domUtils.js'][1225] = 0; + _$jscoverage['core/domUtils.js'][1226] = 0; + _$jscoverage['core/domUtils.js'][1227] = 0; + _$jscoverage['core/domUtils.js'][1232] = 0; + _$jscoverage['core/domUtils.js'][1234] = 0; + _$jscoverage['core/domUtils.js'][1235] = 0; + _$jscoverage['core/domUtils.js'][1239] = 0; + _$jscoverage['core/domUtils.js'][1286] = 0; + _$jscoverage['core/domUtils.js'][1287] = 0; + _$jscoverage['core/domUtils.js'][1288] = 0; + _$jscoverage['core/domUtils.js'][1289] = 0; + _$jscoverage['core/domUtils.js'][1291] = 0; + _$jscoverage['core/domUtils.js'][1292] = 0; + _$jscoverage['core/domUtils.js'][1294] = 0; + _$jscoverage['core/domUtils.js'][1295] = 0; + _$jscoverage['core/domUtils.js'][1297] = 0; + _$jscoverage['core/domUtils.js'][1323] = 0; + _$jscoverage['core/domUtils.js'][1349] = 0; + _$jscoverage['core/domUtils.js'][1350] = 0; + _$jscoverage['core/domUtils.js'][1351] = 0; + _$jscoverage['core/domUtils.js'][1352] = 0; + _$jscoverage['core/domUtils.js'][1355] = 0; + _$jscoverage['core/domUtils.js'][1356] = 0; + _$jscoverage['core/domUtils.js'][1358] = 0; + _$jscoverage['core/domUtils.js'][1359] = 0; + _$jscoverage['core/domUtils.js'][1361] = 0; + _$jscoverage['core/domUtils.js'][1362] = 0; + _$jscoverage['core/domUtils.js'][1364] = 0; + _$jscoverage['core/domUtils.js'][1365] = 0; + _$jscoverage['core/domUtils.js'][1367] = 0; + _$jscoverage['core/domUtils.js'][1371] = 0; + _$jscoverage['core/domUtils.js'][1398] = 0; + _$jscoverage['core/domUtils.js'][1400] = 0; + _$jscoverage['core/domUtils.js'][1401] = 0; + _$jscoverage['core/domUtils.js'][1404] = 0; + _$jscoverage['core/domUtils.js'][1405] = 0; + _$jscoverage['core/domUtils.js'][1408] = 0; + _$jscoverage['core/domUtils.js'][1410] = 0; + _$jscoverage['core/domUtils.js'][1411] = 0; + _$jscoverage['core/domUtils.js'][1412] = 0; + _$jscoverage['core/domUtils.js'][1413] = 0; + _$jscoverage['core/domUtils.js'][1414] = 0; + _$jscoverage['core/domUtils.js'][1415] = 0; + _$jscoverage['core/domUtils.js'][1416] = 0; + _$jscoverage['core/domUtils.js'][1417] = 0; + _$jscoverage['core/domUtils.js'][1419] = 0; + _$jscoverage['core/domUtils.js'][1420] = 0; + _$jscoverage['core/domUtils.js'][1425] = 0; + _$jscoverage['core/domUtils.js'][1427] = 0; + _$jscoverage['core/domUtils.js'][1471] = 0; + _$jscoverage['core/domUtils.js'][1473] = 0; + _$jscoverage['core/domUtils.js'][1474] = 0; + _$jscoverage['core/domUtils.js'][1476] = 0; + _$jscoverage['core/domUtils.js'][1477] = 0; + _$jscoverage['core/domUtils.js'][1478] = 0; + _$jscoverage['core/domUtils.js'][1480] = 0; + _$jscoverage['core/domUtils.js'][1528] = 0; + _$jscoverage['core/domUtils.js'][1529] = 0; + _$jscoverage['core/domUtils.js'][1530] = 0; + _$jscoverage['core/domUtils.js'][1531] = 0; + _$jscoverage['core/domUtils.js'][1532] = 0; + _$jscoverage['core/domUtils.js'][1581] = 0; + _$jscoverage['core/domUtils.js'][1582] = 0; + _$jscoverage['core/domUtils.js'][1584] = 0; + _$jscoverage['core/domUtils.js'][1585] = 0; + _$jscoverage['core/domUtils.js'][1586] = 0; + _$jscoverage['core/domUtils.js'][1587] = 0; + _$jscoverage['core/domUtils.js'][1590] = 0; + _$jscoverage['core/domUtils.js'][1603] = 0; + _$jscoverage['core/domUtils.js'][1628] = 0; + _$jscoverage['core/domUtils.js'][1630] = 0; + _$jscoverage['core/domUtils.js'][1631] = 0; + _$jscoverage['core/domUtils.js'][1633] = 0; + _$jscoverage['core/domUtils.js'][1635] = 0; + _$jscoverage['core/domUtils.js'][1636] = 0; + _$jscoverage['core/domUtils.js'][1638] = 0; + _$jscoverage['core/domUtils.js'][1643] = 0; + _$jscoverage['core/domUtils.js'][1644] = 0; + _$jscoverage['core/domUtils.js'][1673] = 0; + _$jscoverage['core/domUtils.js'][1674] = 0; + _$jscoverage['core/domUtils.js'][1703] = 0; + _$jscoverage['core/domUtils.js'][1704] = 0; + _$jscoverage['core/domUtils.js'][1705] = 0; + _$jscoverage['core/domUtils.js'][1735] = 0; + _$jscoverage['core/domUtils.js'][1736] = 0; + _$jscoverage['core/domUtils.js'][1737] = 0; + _$jscoverage['core/domUtils.js'][1747] = 0; + _$jscoverage['core/domUtils.js'][1748] = 0; + _$jscoverage['core/domUtils.js'][1750] = 0; + _$jscoverage['core/domUtils.js'][1798] = 0; + _$jscoverage['core/domUtils.js'][1799] = 0; + _$jscoverage['core/domUtils.js'][1800] = 0; + _$jscoverage['core/domUtils.js'][1802] = 0; + _$jscoverage['core/domUtils.js'][1803] = 0; + _$jscoverage['core/domUtils.js'][1804] = 0; + _$jscoverage['core/domUtils.js'][1806] = 0; + _$jscoverage['core/domUtils.js'][1808] = 0; + _$jscoverage['core/domUtils.js'][1822] = 0; + _$jscoverage['core/domUtils.js'][1823] = 0; + _$jscoverage['core/domUtils.js'][1839] = 0; + _$jscoverage['core/domUtils.js'][1840] = 0; + _$jscoverage['core/domUtils.js'][1841] = 0; + _$jscoverage['core/domUtils.js'][1853] = 0; + _$jscoverage['core/domUtils.js'][1854] = 0; + _$jscoverage['core/domUtils.js'][1856] = 0; + _$jscoverage['core/domUtils.js'][1862] = 0; + _$jscoverage['core/domUtils.js'][1863] = 0; + _$jscoverage['core/domUtils.js'][1869] = 0; + _$jscoverage['core/domUtils.js'][1870] = 0; + _$jscoverage['core/domUtils.js'][1876] = 0; + _$jscoverage['core/domUtils.js'][1877] = 0; + _$jscoverage['core/domUtils.js'][1878] = 0; + _$jscoverage['core/domUtils.js'][1879] = 0; + _$jscoverage['core/domUtils.js'][1880] = 0; + _$jscoverage['core/domUtils.js'][1882] = 0; + _$jscoverage['core/domUtils.js'][1883] = 0; + _$jscoverage['core/domUtils.js'][1894] = 0; + _$jscoverage['core/domUtils.js'][1905] = 0; + _$jscoverage['core/domUtils.js'][1910] = 0; + _$jscoverage['core/domUtils.js'][1914] = 0; + _$jscoverage['core/domUtils.js'][1915] = 0; + _$jscoverage['core/domUtils.js'][1916] = 0; + _$jscoverage['core/domUtils.js'][1917] = 0; + _$jscoverage['core/domUtils.js'][1918] = 0; + _$jscoverage['core/domUtils.js'][1919] = 0; + _$jscoverage['core/domUtils.js'][1922] = 0; + _$jscoverage['core/domUtils.js'][1923] = 0; + _$jscoverage['core/domUtils.js'][1924] = 0; + _$jscoverage['core/domUtils.js'][1927] = 0; + _$jscoverage['core/domUtils.js'][1928] = 0; + _$jscoverage['core/domUtils.js'][1929] = 0; + _$jscoverage['core/domUtils.js'][1931] = 0; + _$jscoverage['core/domUtils.js'][1932] = 0; + _$jscoverage['core/domUtils.js'][1933] = 0; + _$jscoverage['core/domUtils.js'][1935] = 0; + _$jscoverage['core/domUtils.js'][1936] = 0; + _$jscoverage['core/domUtils.js'][1938] = 0; + _$jscoverage['core/domUtils.js'][1939] = 0; + _$jscoverage['core/domUtils.js'][1940] = 0; + _$jscoverage['core/domUtils.js'][1941] = 0; + _$jscoverage['core/domUtils.js'][1942] = 0; + _$jscoverage['core/domUtils.js'][1944] = 0; + _$jscoverage['core/domUtils.js'][1946] = 0; + _$jscoverage['core/domUtils.js'][1947] = 0; + _$jscoverage['core/domUtils.js'][1949] = 0; + _$jscoverage['core/domUtils.js'][1950] = 0; + _$jscoverage['core/domUtils.js'][1951] = 0; + _$jscoverage['core/domUtils.js'][1953] = 0; + _$jscoverage['core/domUtils.js'][1954] = 0; + _$jscoverage['core/domUtils.js'][1956] = 0; + _$jscoverage['core/domUtils.js'][1960] = 0; + _$jscoverage['core/domUtils.js'][1987] = 0; + _$jscoverage['core/domUtils.js'][1988] = 0; + _$jscoverage['core/domUtils.js'][1989] = 0; + _$jscoverage['core/domUtils.js'][1990] = 0; + _$jscoverage['core/domUtils.js'][1991] = 0; + _$jscoverage['core/domUtils.js'][1993] = 0; + _$jscoverage['core/domUtils.js'][1994] = 0; + _$jscoverage['core/domUtils.js'][1995] = 0; + _$jscoverage['core/domUtils.js'][1998] = 0; + _$jscoverage['core/domUtils.js'][2028] = 0; + _$jscoverage['core/domUtils.js'][2029] = 0; + _$jscoverage['core/domUtils.js'][2030] = 0; + _$jscoverage['core/domUtils.js'][2031] = 0; + _$jscoverage['core/domUtils.js'][2032] = 0; + _$jscoverage['core/domUtils.js'][2033] = 0; + _$jscoverage['core/domUtils.js'][2034] = 0; + _$jscoverage['core/domUtils.js'][2036] = 0; + _$jscoverage['core/domUtils.js'][2037] = 0; + _$jscoverage['core/domUtils.js'][2065] = 0; + _$jscoverage['core/domUtils.js'][2066] = 0; + _$jscoverage['core/domUtils.js'][2067] = 0; + _$jscoverage['core/domUtils.js'][2133] = 0; + _$jscoverage['core/domUtils.js'][2134] = 0; + _$jscoverage['core/domUtils.js'][2135] = 0; + _$jscoverage['core/domUtils.js'][2137] = 0; + _$jscoverage['core/domUtils.js'][2163] = 0; + _$jscoverage['core/domUtils.js'][2174] = 0; + _$jscoverage['core/domUtils.js'][2196] = 0; + _$jscoverage['core/domUtils.js'][2266] = 0; + _$jscoverage['core/domUtils.js'][2267] = 0; + _$jscoverage['core/domUtils.js'][2268] = 0; + _$jscoverage['core/domUtils.js'][2269] = 0; + _$jscoverage['core/domUtils.js'][2270] = 0; + _$jscoverage['core/domUtils.js'][2273] = 0; + _$jscoverage['core/domUtils.js'][2274] = 0; + _$jscoverage['core/domUtils.js'][2276] = 0; + _$jscoverage['core/domUtils.js'][2280] = 0; + _$jscoverage['core/domUtils.js'][2281] = 0; + _$jscoverage['core/domUtils.js'][2282] = 0; + _$jscoverage['core/domUtils.js'][2284] = 0; + _$jscoverage['core/domUtils.js'][2285] = 0; + _$jscoverage['core/domUtils.js'][2287] = 0; + _$jscoverage['core/domUtils.js'][2288] = 0; + _$jscoverage['core/domUtils.js'][2289] = 0; + _$jscoverage['core/domUtils.js'][2290] = 0; + _$jscoverage['core/domUtils.js'][2291] = 0; + _$jscoverage['core/domUtils.js'][2293] = 0; + _$jscoverage['core/domUtils.js'][2296] = 0; + _$jscoverage['core/domUtils.js'][2297] = 0; + _$jscoverage['core/domUtils.js'][2298] = 0; + _$jscoverage['core/domUtils.js'][2299] = 0; + _$jscoverage['core/domUtils.js'][2300] = 0; + _$jscoverage['core/domUtils.js'][2301] = 0; + _$jscoverage['core/domUtils.js'][2304] = 0; + _$jscoverage['core/domUtils.js'][2307] = 0; +} +_$jscoverage['core/domUtils.js'].source = ["/**"," * Dom操作工具包"," * @file"," * @module UE.dom.domUtils"," * @since 1.2.6.1"," */","","/**"," * Dom操作工具包"," * @unfile"," * @module UE.dom.domUtils"," */","","//getNode(node, 'firstChild', 'nextSibling', startFromChild, filterFn, guard);","function getNode( 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 getNode(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 ) {"," *"," * case 0:"," * console.log('元素相同');"," * break;"," * case 1:"," * console.log('两个节点在不同的文档中');"," * break;"," * case 2:"," * console.log('节点A在节点B之后');"," * break;"," * case 4;"," * console.log('节点A在节点B之前');"," * break;"," * case 8:"," * console.log('节点A被节点B包含');"," * break;"," * case 10:"," * console.log('节点A被节点B包含且节点A在节点B之后');"," * break;"," * case 16:"," * 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 } 该节点在父节点中的位置"," */",""," /**"," * 检测节点node在父节点中的索引位置, 根据给定的mergeTextNode参数决定是否要合并多个连续的文本节点为一个节点"," * @method getNodeIndex"," * @param { Node } node 需要检测的节点对象"," * @param { Boolean } ignoreTextNode 是否忽略文本节点"," * @return { Number } 该节点在父节点中的位置"," */"," 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是否在给定doc的树上,实质上是检测该节点是否在给定的dom树上"," * @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节点的祖先节点,"," * 查找的过程中不包含自身节点。"," * @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的值决定是否包含自身节点。"," * @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"," * <body>"," *"," * <div id=\"test\">"," * </div>"," *"," * <script type=\"text/javascript\">"," *"," * //output: DIV, BODY"," * var filterNode = UE.dom.domUtils.findParent( document.getElementById( \"test\" ), function ( node ) {"," *"," * console.log( node.tagName );"," * return false;"," *"," * }, true );"," *"," * </script>"," * </body>"," * ```"," */"," 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的值决定是否包含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 );"," * ```"," */",""," /**"," * 查找node的节点名为tagName的祖先节点,并且该祖先节点不满足excludeFn过滤器的过滤要求,"," * 查找过程中根据includeSelf的值决定是否包含node节点自身,"," * @method findParentByTagName"," * @param { Node } node 需要查找的节点对象"," * @param { Array } tagNames 需要查找的父节点的名称数组"," * @param { Boolean } includeSelf 查找过程是否包含node节点自身"," * @param { Function } excludeFn 查找过程中应用的过滤器, 如果该过滤器对给定的节点返回true,"," * 则该节点将被排除在查询结果之外。"," * @remind 查找过滤器excludeFn要求对不应该被匹配的节点应该返回true"," * @warning 查找的终点是到body节点为止"," * @return { Node | NULL } 如果找到符合条件的节点, 则返回该节点, 否则返回NULL"," * @example"," * ```javascript"," * var queryTarget = document.getElementsByTagName(\"div\")[0];"," *"," * //需要查找的节点和过滤器的过滤条件刚好冲突, 执行结果将永远为NULL"," * var node = UE.dom.domUtils.findParentByTagName( queryTarget, [ \"DIV\" ], false, function ( node ) {"," *"," * return node.tagName.toLowerCase() === 'div';"," *"," * } );"," * //output: true"," * console.log( queryTarget === null );"," * ```"," */"," 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的祖先节点集合"," * @name findParents"," * @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个"," */"," 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.parentNode.insertBefore(newNode, node.nextSibling);"," },",""," /**"," * 删除节点node及其下属的所有节点"," * @method remove"," * @param { Node } node 需要删除的节点对象"," * @return { Node } 返回刚删除的节点对象"," * @example"," * ```html"," * <div id=\"test\">"," * <div id=\"child\">你好</div>"," * </div>"," * <script>"," * UE.dom.domUtils.remove( document.body, false );"," * //output: false"," * console.log( document.getElementById( \"child\" ) !== null );"," * </script>"," * ```"," */",""," /**"," * 删除节点node,并根据keepChildren的值决定是否保留子节点"," * @method remove"," * @param { Node } node 需要删除的节点对象"," * @param { Boolean } keepChildren 是否需要保留子节点"," * @return { Node } 返回刚删除的节点对象"," * @example"," * ```html"," * <div id=\"test\">"," * <div id=\"child\">你好</div>"," * </div>"," * <script>"," * UE.dom.domUtils.remove( document.body, true );"," * //output: true"," * console.log( document.getElementById( \"child\" ) !== null );"," * </script>"," * ```"," */"," 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节点在dom树上的下一个节点,即多叉树遍历"," */"," getNextNode:function (node, startFromChild, filterFn, guard) {"," return getNode(node, 'firstChild', 'nextSibling', startFromChild, filterFn, guard);"," },",""," /**"," * 检测节点node是否属是UEditor定义的bookmark节点"," * @method isBookmarkNode"," * @param { Node } node 需要检测的节点对象"," * @return { Boolean } 是否是bookmark节点"," * @example"," * ```html"," * <span id=\"_baidu_bookmark_1\"></span>"," * <script>"," * var bookmarkNode = document.getElementById(\"_baidu_bookmark_1\");"," * //output: true"," * console.log( UE.dom.domUtils.isBookmarkNode( bookmarkNode ) );"," * </script>"," * ```"," */"," 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节点"," * @name clearEmptySibling"," * @grammar UE.dom.domUtils.clearEmptySibling(node)"," * @grammar UE.dom.domUtils.clearEmptySibling(node,ignoreNext) //ignoreNext指定是否忽略右边空节点"," * @grammar UE.dom.domUtils.clearEmptySibling(node,ignoreNext,ignorePre) //ignorePre指定是否忽略左边空节点"," * @example"," * <b></b><i></i>xxxx<b>bb</b> --> xxxx<b>bb</b>"," */"," 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"," * <div id=\"test\">abcdef</div>"," * <script>"," * var newNode = UE.dom.domUtils.split( document.getElementById( \"test\" ), 3 );"," * //output: def"," * console.log( newNode.nodeValue );"," * </script>"," * ```"," */"," 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"," * <div id=\"test\">"," *"," * </div>"," * <script>"," * //output: true"," * console.log( UE.dom.domUtils.isWhitespace( document.getElementById(\"test\").firstChild ) );"," * </script>"," * ```"," */"," isWhitespace:function (node) {"," return !new RegExp('[^ \\t\\n\\r' + domUtils.fillChar + ']').test(node.nodeValue);"," },",""," /**"," * 获取元素element相对于viewport的位置坐标"," * @method getXY"," * @param { Node } element 需要计算位置的节点对象"," * @return { KeyValueMap } 返回形如{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 : [type],"," 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 : [type],"," 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"," * <span style=\"font-size:12px\">ssss</span>"," * <span style=\"font-size:12px\">bbbbb</span>"," * <span style=\"font-size:13px\">ssss</span>"," * <span style=\"font-size:14px\">bbbbb</span>"," *"," * <script>"," *"," * var nodes = document.getElementsByTagName( \"span\" );"," *"," * //output: true"," * console.log( UE.dom.domUtils.isSameElement( nodes[0], nodes[1] ) );"," *"," * //output: false"," * console.log( UE.dom.domUtils.isSameElement( nodes[2], nodes[3] ) );"," *"," * </script>"," * ```"," */"," 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"," * <span style=\"font-size:12px\">ssss</span>"," * <span style=\"font-size:12px\">bbbbb</span>"," * <span style=\"font-size:13px\">ssss</span>"," * <span style=\"font-size:14px\">bbbbb</span>"," *"," * <script>"," *"," * var nodes = document.getElementsByTagName( \"span\" );"," *"," * //output: true"," * console.log( UE.dom.domUtils.isSameElement( nodes[0], nodes[1] ) );"," *"," * //output: false"," * console.log( UE.dom.domUtils.isSameElement( nodes[2], nodes[3] ) );"," *"," * </script>"," * ```"," */"," 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"," * <span id=\"test1\" style=\"display: block\"></span>"," * <span id=\"test2\"></span>"," * <div id=\"test3\" style=\"display: inline\"></div>"," *"," * <script>"," *"," * //output: true"," * console.log( UE.dom.domUtils.isBlockEle( document.getElementById(\"test1\") ) );"," *"," * //output: false"," * console.log( UE.dom.domUtils.isBlockEle( document.getElementById(\"test2\") ) );"," *"," * //output: true"," * console.log( UE.dom.domUtils.isBlockEle( document.getElementById(\"test3\") ) );"," *"," * </script>"," * ```"," */"," 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拆分成2块"," * @name breakParent"," * @grammar UE.dom.domUtils.breakParent(node,parent) => node"," * @desc"," * <code type=\"html\"><b>ooo</b>是node节点"," * <p>xxxx<b>ooo</b>xxx</p> ==> <p>xxx</p><b>ooo</b><p>xxx</p>"," * <p>xxxxx<span>xxxx<b>ooo</b>xxxxxx</span></p> => <p>xxxxx<span>xxxx</span></p><b>ooo</b><p><span>xxxxxx</span></p></code>"," */"," 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节点"," * @name isEmptyInlineElement"," * @grammar UE.dom.domUtils.isEmptyInlineElement(node) => 1|0"," * @example"," * <b><i></i></b> => 1"," * <b><i></i><u></u></b> => 1"," * <b></b> => 1"," * <b>xx<i></i></b> => 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"," * ```html"," * <div id=\"test\">"," * <div></div>"," * </div>"," *"," * <script>"," * var testNode = document.getElementById(\"test\");"," * //output: 3"," * console.log(testNode.childNodes.length);"," *"," * UE.dom.domUtils.trimWhiteTextNode( testNode );"," * //output: 1"," * console.log(testNode.childNodes.length);"," * </script>"," * ```"," */"," 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节点下相同的子节点"," * @method mergeChild"," * @example"," * <p><span style=\"font-size:12px;\">xx<span style=\"font-size:12px;\">aa</span>xx</span></p>"," * ==> UE.dom.domUtils.mergeChild(node,'span')"," * <p><span style=\"font-size:12px;\">xxaaxx</span></p>"," */"," 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的封装"," * @name getElementsByTagName"," * @grammar UE.dom.domUtils.getElementsByTagName(node,tagName) => 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"," * <div id=\"parent\">"," * <div id=\"sub\">"," * <span id=\"child\"></span>"," * </div>"," * </div>"," *"," * <script>"," *"," * var child = document.getElementById( \"child\" );"," *"," * //output: sub"," * console.log( child.parentNode.id );"," *"," * UE.dom.domUtils.mergeToParent( child );"," *"," * //output: parent"," * console.log( child.parentNode.id );"," *"," * </script>"," * ```"," */"," 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需要特殊处理 不处理这样的情况 <span stlye=\"color:#fff\">xxx<span style=\"color:#ccc\">xxx</span>xxx</span>"," 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"," * <b>xxxx</b><b id=\"test\">ooo</b><b>xxxx</b>"," *"," * <script>"," * var demoNode = document.getElementById(\"test\");"," * UE.dom.domUtils.mergeSibling( demoNode );"," * //output: xxxxoooxxxx"," * console.log( demoNode.innerHTML );"," * </script>"," * ```"," */",""," /**"," * 合并节点node的左右兄弟节点, 可以根据给定的条件选择是否忽略合并左节点。"," * @method mergeSibling"," * @param { Element } node 需要合并的目标节点"," * @param { Boolean } ignorePre 是否忽略合并左节点"," * @example"," * ```html"," * <b>xxxx</b><b id=\"test\">ooo</b><b>xxxx</b>"," *"," * <script>"," * var demoNode = document.getElementById(\"test\");"," * UE.dom.domUtils.mergeSibling( demoNode, true );"," * //output: oooxxxx"," * console.log( demoNode.innerHTML );"," * </script>"," * ```"," */",""," /**"," * 合并节点node的左右兄弟节点,可以根据给定的条件选择是否忽略合并左右节点。"," * @method mergeSibling"," * @param { Element } node 需要合并的目标节点"," * @param { Boolean } ignorePre 是否忽略合并左节点"," * @param { Boolean } ignoreNext 是否忽略合并右节点"," * @remind 如果同时忽略左右节点, 则该操作什么也不会做"," * @example"," * ```html"," * <b>xxxx</b><b id=\"test\">ooo</b><b>xxxx</b>"," *"," * <script>"," * var demoNode = document.getElementById(\"test\");"," * UE.dom.domUtils.mergeSibling( demoNode, false, true );"," * //output: xxxxooo"," * console.log( demoNode.innerHTML );"," * </script>"," * ```"," */"," 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.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.KhtmlUserSelect = 'none';"," },",""," /**"," * 删除节点node上的指定属性名称的属性"," * @method removeAttributes"," * @param { String } attrNames 可以是空格隔开的多个属性名称,该操作将会依次删除相应的属性"," * @example"," * ```html"," * <div id=\"wrap\">"," * <span style=\"font-size:14px;\" id=\"test\" name=\"followMe\">xxxxx</span>"," * </div>"," *"," * <script>"," *"," * UE.dom.domUtils.removeAttributes( document.getElementById( \"test\" ), \"id name\" );"," *"," * //output: <span style=\"font-size:14px;\">xxxxx</span>"," * console.log( document.getElementById(\"wrap\").innerHTML );"," *"," * </script>"," * ```"," */",""," /**"," * 删除节点node上的指定属性名称的属性"," * @method removeAttributes"," * @param { Array } attrNames 需要删除的属性名数组"," * @example"," * ```html"," * <div id=\"wrap\">"," * <span style=\"font-size:14px;\" id=\"test\" name=\"followMe\">xxxxx</span>"," * </div>"," *"," * <script>"," *"," * UE.dom.domUtils.removeAttributes( document.getElementById( \"test\" ), [\"id\", \"name\"] );"," *"," * //output: <span style=\"font-size:14px;\">xxxxx</span>"," * console.log( document.getElementById(\"wrap\").innerHTML );"," *"," * </script>"," * ```"," */"," 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 = '';"," !browser.ie && node.removeAttributeNode(node.getAttributeNode('style'))"," }"," node.removeAttribute(ci);"," }"," },",""," /**"," * 在doc下创建一个标签名为tag,属性为attrs的元素"," * @method createElement"," * @param { DomDocument } doc 新创建的元素属于该document节点创建"," * @param { String } tagName 需要创建的元素的标签名"," * @param { KeyValueMap } 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 { KeyValueMap } attrs 需要设置的属性名-值对"," * @return { Element } 设置属性的元素对象"," * @example"," * ```html"," * <span id=\"test\"></span>"," *"," * <script>"," *"," * var testNode = UE.dom.domUtils.setAttributes( document.getElementById( \"test\" ), {"," * id: 'demo'"," * } );"," *"," * //output: demo"," * console.log( testNode.id );"," *"," * </script>"," *"," */"," 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"," * <style type=\"text/css\">"," * #test {"," * font-size: 15px;"," * }"," * </style>"," *"," * <span id=\"test\"></span>"," *"," * <script>"," * //output: 15px"," * console.log( UE.dom.domUtils.getComputedStyle( document.getElementById( \"test\" ), 'font-size' ) );"," * </script>"," * ```"," */"," 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"," * <span id=\"test\" class=\"test1 test2 test3\">xxx</span>"," *"," * <script>"," *"," * var testNode = document.getElementById( \"test\" );"," * UE.dom.domUtils.removeClasses( testNode, \"test1 test2\" );"," *"," * //output: test3"," * console.log( testNode.className );"," *"," * </script>"," * ```"," */",""," /**"," * 删除元素element指定的className"," * @method removeClasses"," * @param { Element } ele 需要删除class的元素节点"," * @param { Array } classNames 需要删除的className数组"," * @example"," * ```html"," * <span id=\"test\" class=\"test1 test2 test3\">xxx</span>"," *"," * <script>"," *"," * var testNode = document.getElementById( \"test\" );"," * UE.dom.domUtils.removeClasses( testNode, [\"test1\", \"test2\"] );"," *"," * //output: test3"," * console.log( testNode.className );"," *"," * </script>"," * ```"," */"," 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"," * <span id=\"test\" class=\"cls1 cls2\"></span>"," *"," * <script>"," * var testNode = document.getElementById(\"test\");"," *"," * UE.dom.domUtils.addClass( testNode, \"cls2 cls3 cls4\" );"," *"," * //output: cl1 cls2 cls3 cls4"," * console.log( testNode.className );"," *"," * <script>"," * ```"," */",""," /**"," * 给元素element添加className"," * @method addClass"," * @param { Node } ele 需要增加className的元素"," * @param { Array } classNames 需要添加的className的数组"," * @remind 相同的类名不会被重复添加"," * @example"," * ```html"," * <span id=\"test\" class=\"cls1 cls2\"></span>"," *"," * <script>"," * var testNode = document.getElementById(\"test\");"," *"," * UE.dom.domUtils.addClass( testNode, [\"cls2\", \"cls3\", \"cls4\"] );"," *"," * //output: cl1 cls2 cls3 cls4"," * console.log( testNode.className );"," *"," * <script>"," * ```"," */"," addClass:function (elm, classNames) {"," if(!elm)return;"," classNames = utils.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)){"," elm.className += ' ' + ci;"," }"," }"," },",""," /**"," * 判断元素element是否包含给定的样式类名className"," * @method hasClass"," * @param { Node } ele 需要检测的元素"," * @param { String } classNames 需要检测的className, 多个className之间用空格分割"," * @return { Boolean } 元素是否包含所有给定的className"," * @example"," * ```html"," * <span id=\"test1\" class=\"cls1 cls2\"></span>"," *"," * <script>"," * var test1 = document.getElementById(\"test1\");"," *"," * //output: false"," * console.log( UE.dom.domUtils.hasClass( test1, \"cls2 cls1 cls3\" ) );"," *"," * //output: true"," * console.log( UE.dom.domUtils.hasClass( test1, \"cls2 cls1\" ) );"," * </script>"," * ```"," */",""," /**"," * 判断元素element是否包含给定的样式类名className"," * @method hasClass"," * @param { Node } ele 需要检测的元素"," * @param { Array } classNames 需要检测的className数组"," * @return { Boolean } 元素是否包含所有给定的className"," * @example"," * ```html"," * <span id=\"test1\" class=\"cls1 cls2\"></span>"," *"," * <script>"," * var test1 = document.getElementById(\"test1\");"," *"," * //output: false"," * console.log( UE.dom.domUtils.hasClass( test1, [ \"cls2\", \"cls1\", \"cls3\" ] ) );"," *"," * //output: true"," * console.log( UE.dom.domUtils.hasClass( test1, [ \"cls2\", \"cls1\" ]) );"," * </script>"," * ```"," */"," 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"," * <span id=\"test\" style=\"color: red; background: blue;\"></span>"," *"," * <script>"," *"," * var testNode = document.getElementById(\"test\");"," *"," * UE.dom.domUtils.removeStyle( testNode, 'color' );"," *"," * //output: background: blue;"," * console.log( testNode.style.cssText );"," *"," * </script>"," * ```"," */"," 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"," * <div id=\"test\" style=\"color: red;\"></div>"," *"," * <script>"," *"," * var testNode = document.getElementById( \"test\" );"," *"," * //output: red"," * console.log( UE.dom.domUtils.getStyle( testNode, \"color\" ) );"," *"," * //output: \"\""," * console.log( UE.dom.domUtils.getStyle( testNode, \"background\" ) );"," *"," * </script>"," * ```"," */"," 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"," * <div id=\"test\"></div>"," *"," * <script>"," *"," * var testNode = document.getElementById( \"test\" );"," *"," * //output: \"\""," * console.log( testNode.style.color );"," *"," * UE.dom.domUtils.setStyle( testNode, 'color', 'red' );"," * //output: \"red\""," * console.log( testNode.style.color );"," *"," * </script>"," * ```"," */"," 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 { KeyValueMap } styles 样式名值对"," * @example"," * ```html"," * <div id=\"test\"></div>"," *"," * <script>"," *"," * var testNode = document.getElementById( \"test\" );"," *"," * //output: \"\""," * console.log( testNode.style.color );"," *"," * UE.dom.domUtils.setStyles( testNode, {"," * 'color': 'red'"," * } );"," * //output: \"red\""," * console.log( testNode.style.color );"," *"," * </script>"," * ```"," */"," setStyles:function (element, styles) {"," for (var name in styles) {"," if (styles.hasOwnProperty(name)) {"," domUtils.setStyle(element, name, styles[name]);"," }"," }"," },",""," /**"," * 删除_moz_dirty属性"," * @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"," * <div id=\"test\">"," * <span></span>"," * </div>"," *"," * <script>"," *"," * //output: 3"," * console.log( UE.dom.domUtils.getChildCount( document.getElementById(\"test\") ) );"," *"," * </script>"," * ```"," */",""," /**"," * 根据给定的过滤规则, 获取符合条件的子节点的数量"," * @method getChildCount"," * @param { Element } node 需要检测的元素"," * @param { Function } fn 过滤器, 要求对符合条件的子节点返回true, 反之则要求返回false"," * @return { Number } 符合过滤条件的node元素的子节点数量"," * @example"," * ```html"," * <div id=\"test\">"," * <span></span>"," * </div>"," *"," * <script>"," *"," * //output: 1"," * console.log( UE.dom.domUtils.getChildCount( document.getElementById(\"test\"), function ( node ) {"," *"," * return node.nodeType === 1;"," *"," * } ) );"," *"," * </script>"," * ```"," */"," 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"," },",""," /**"," * 清空给定节点所有的className"," * @method clearSelectedArr"," * @param { Array } nodes 需要清空className的节点的数组集合"," * @example"," * ```javascript"," *"," * UE.dom.domUtils.clearSelectedArr( [ document.body, document.body.firstChild ] );"," *"," * ```"," */"," 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';"," },",""," /**"," * 判断给定的节点是否是一个“填充”节点"," * @method isFillChar"," * @param { Node } node 需要判断的节点"," * @param { Boolean } isInStart 是否从节点内容的开始位置匹配"," * @returns { Boolean } 节点是否是填充节点"," */"," isFillChar:function (node,isInStart) {"," return node.nodeType == 3 && !node.nodeValue.replace(new RegExp((isInStart ? '^' : '' ) + domUtils.fillChar), '').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"," * <div id=\"test\"></div>"," *"," * <script>"," * //output: true"," * console.log( UE.dom.domUtils.isEmptyBlock( document.getElementById(\"test\") ) );"," * </script>"," * ```"," */",""," /**"," * 根据指定的判断规则判断给定的元素是否是一个空元素"," * @method isEmptyBlock"," * @param { Element } node 需要判断的元素"," * @param { RegExp } reg 对内容执行判断的正则表达式对象"," * @return { Boolean } 是否是空元素"," */"," isEmptyBlock:function (node,reg) {"," if(node.nodeType != 1)"," return 0;"," reg = reg || new RegExp('[ \\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 { KeyValueMap } offset 偏移量, 形如{ left: 100, top: 50 }的一个键值对, 表示该元素将在"," * 现有的位置上向水平方向偏移offset.left的距离, 在竖直方向上偏移"," * offset.top的距离"," * @example"," * ```html"," * <div id=\"test\" style=\"top: 100px; left: 50px; position: absolute;\"></div>"," *"," * <script>"," *"," * var testNode = document.getElementById(\"test\");"," *"," * UE.dom.domUtils.setViewportOffset( testNode, {"," * left: 200,"," * top: 50"," * } );"," *"," * //output: top: 300px; left: 100px; position: absolute;"," * console.log( testNode.style.cssText );"," *"," * </script>"," * ```"," */"," 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"," * @param { DomDocument } doc 填充的节点所在的docment对象"," * @param { Node } node 需要填充的节点对象"," * @example"," * ```html"," * <div id=\"test\"></div>"," *"," * <script>"," * var testNode = document.getElementById(\"test\");"," *"," * //output: 0"," * console.log( testNode.childNodes.length );"," *"," * UE.dom.domUtils.fillNode( document, testNode );"," *"," * //output: 1"," * console.log( testNode.childNodes.length );"," *"," * </script>"," * ```"," */"," 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"," * <div id=\"test1\">"," * <span></span>"," * </div>"," * <div id=\"test2\">"," * <div></div>"," * </div>"," *"," * <script>"," *"," * var test1 = document.getElementById(\"test1\"),"," * test2 = document.getElementById(\"test2\");"," *"," * UE.dom.domUtils.moveChild( test1, test2 );"," *"," * //output: \"\"(空字符串)"," * console.log( test1.innerHTML );"," *"," * //output: \"<div></div><span></span>\""," * console.log( test2.innerHTML );"," *"," * </script>"," * ```"," */",""," /**"," * 把节点src的所有子节点移动到另一个节点tag上去, 可以通过dir参数控制附加的行为是“追加”还是“插入顶部”"," * @method moveChild"," * @param { Node } src 源节点, 该节点下的所有子节点将被移除"," * @param { Node } tag 目标节点, 从源节点移除的子节点将被附加到该节点下"," * @param { Boolean } dir 附加方式, 如果为true, 则附加进去的节点将被放到目标节点的顶部, 反之,则放到末尾"," * @example"," * ```html"," * <div id=\"test1\">"," * <span></span>"," * </div>"," * <div id=\"test2\">"," * <div></div>"," * </div>"," *"," * <script>"," *"," * var test1 = document.getElementById(\"test1\"),"," * test2 = document.getElementById(\"test2\");"," *"," * UE.dom.domUtils.moveChild( test1, test2, true );"," *"," * //output: \"\"(空字符串)"," * console.log( test1.innerHTML );"," *"," * //output: \"<span></span><div></div>\""," * console.log( test2.innerHTML );"," *"," * </script>"," * ```"," */"," 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"," * @param { Node } node 需要检测的节点对象"," * @return { Boolean } 节点是否不包含任何属性"," * @example"," * ```html"," * <div id=\"test\"><span>xxxx</span></div>"," *"," * <script>"," *"," * //output: false"," * console.log( UE.dom.domUtils.hasNoAttributes( document.getElementById(\"test\") ) );"," *"," * //output: true"," * console.log( UE.dom.domUtils.hasNoAttributes( document.getElementById(\"test\").firstChild ) );"," *"," * </script>"," * ```"," */"," hasNoAttributes:function (node) {"," return browser.ie ? /^<\\w+\\s*?>/.test(node.outerHTML) : node.attributes.length == 0;"," },",""," /**"," * 检测节点是否是UEditor所使用的辅助节点"," * @method isCustomeNode"," * @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"," * <div id=\"test\"></div>"," *"," * <script>"," *"," * //output: true"," * console.log( UE.dom.domUtils.isTagNode( document.getElementById(\"test\"), \"div\" ) );"," *"," * </script>"," * ```"," */"," isTagNode:function (node, tagName) {"," return node.nodeType == 1 && new RegExp('^' + node.tagName + '$','i').test(tagName)"," },",""," /**"," * 给定一个节点数组,在通过指定的过滤器过滤后, 获取其中满足过滤条件的第一个节点"," * @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"," },",""," 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;"," }","};","var fillCharReg = new RegExp(domUtils.fillChar, 'g');"]; +_$jscoverage['core/domUtils.js'][15]++; +function getNode(node, start, ltr, startFromChild, fn, guard) { + _$jscoverage['core/domUtils.js'][16]++; + var tmpNode = (startFromChild && node[start]), parent; + _$jscoverage['core/domUtils.js'][18]++; + ((! tmpNode) && (tmpNode = node[ltr])); + _$jscoverage['core/domUtils.js'][19]++; + while (((! tmpNode) && (parent = (parent || node).parentNode))) { + _$jscoverage['core/domUtils.js'][20]++; + if (((parent.tagName == "BODY") || (guard && (! guard(parent))))) { + _$jscoverage['core/domUtils.js'][21]++; + return null; + } + _$jscoverage['core/domUtils.js'][23]++; + tmpNode = parent[ltr]; +} + _$jscoverage['core/domUtils.js'][25]++; + if ((tmpNode && fn && (! fn(tmpNode)))) { + _$jscoverage['core/domUtils.js'][26]++; + return getNode(tmpNode, start, ltr, false, fn); + } + _$jscoverage['core/domUtils.js'][28]++; + return tmpNode; +} +_$jscoverage['core/domUtils.js'][30]++; +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"]); +_$jscoverage['core/domUtils.js'][53]++; +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, fillChar: ((ie && (browser.version == "6"))? "\ufeff": "\u200b"), keys: {8: 1, 46: 1, 16: 1, 17: 1, 18: 1, 37: 1, 38: 1, 39: 1, 40: 1, 13: 1}, getPosition: (function (nodeA, nodeB) { + _$jscoverage['core/domUtils.js'][120]++; + if ((nodeA === nodeB)) { + _$jscoverage['core/domUtils.js'][122]++; + return 0; + } + _$jscoverage['core/domUtils.js'][124]++; + var node, parentsA = [nodeA], parentsB = [nodeB]; + _$jscoverage['core/domUtils.js'][127]++; + node = nodeA; + _$jscoverage['core/domUtils.js'][128]++; + while ((node = node.parentNode)) { + _$jscoverage['core/domUtils.js'][130]++; + if ((node === nodeB)) { + _$jscoverage['core/domUtils.js'][132]++; + return 10; + } + _$jscoverage['core/domUtils.js'][134]++; + parentsA.push(node); +} + _$jscoverage['core/domUtils.js'][136]++; + node = nodeB; + _$jscoverage['core/domUtils.js'][137]++; + while ((node = node.parentNode)) { + _$jscoverage['core/domUtils.js'][139]++; + if ((node === nodeA)) { + _$jscoverage['core/domUtils.js'][141]++; + return 20; + } + _$jscoverage['core/domUtils.js'][143]++; + parentsB.push(node); +} + _$jscoverage['core/domUtils.js'][145]++; + parentsA.reverse(); + _$jscoverage['core/domUtils.js'][146]++; + parentsB.reverse(); + _$jscoverage['core/domUtils.js'][147]++; + if ((parentsA[0] !== parentsB[0])) { + _$jscoverage['core/domUtils.js'][149]++; + return 1; + } + _$jscoverage['core/domUtils.js'][151]++; + var i = -1; + _$jscoverage['core/domUtils.js'][152]++; + while (((i++), (parentsA[i] === parentsB[i]))) { +} + _$jscoverage['core/domUtils.js'][154]++; + nodeA = parentsA[i]; + _$jscoverage['core/domUtils.js'][155]++; + nodeB = parentsB[i]; + _$jscoverage['core/domUtils.js'][156]++; + while ((nodeA = nodeA.nextSibling)) { + _$jscoverage['core/domUtils.js'][157]++; + if ((nodeA === nodeB)) { + _$jscoverage['core/domUtils.js'][159]++; + return 4; + } +} + _$jscoverage['core/domUtils.js'][163]++; + return 2; +}), getNodeIndex: (function (node, ignoreTextNode) { + _$jscoverage['core/domUtils.js'][181]++; + var preNode = node, i = 0; + _$jscoverage['core/domUtils.js'][183]++; + while ((preNode = preNode.previousSibling)) { + _$jscoverage['core/domUtils.js'][184]++; + if ((ignoreTextNode && (preNode.nodeType == 3))) { + _$jscoverage['core/domUtils.js'][185]++; + if ((preNode.nodeType != preNode.nextSibling.nodeType)) { + _$jscoverage['core/domUtils.js'][186]++; + (i++); + } + _$jscoverage['core/domUtils.js'][188]++; + continue; + } + _$jscoverage['core/domUtils.js'][190]++; + (i++); +} + _$jscoverage['core/domUtils.js'][192]++; + return i; +}), inDoc: (function (node, doc) { + _$jscoverage['core/domUtils.js'][217]++; + return (domUtils.getPosition(node, doc) == 10); +}), findParent: (function (node, filterFn, includeSelf) { + _$jscoverage['core/domUtils.js'][279]++; + if ((node && (! domUtils.isBody(node)))) { + _$jscoverage['core/domUtils.js'][280]++; + node = (includeSelf? node: node.parentNode); + _$jscoverage['core/domUtils.js'][281]++; + while (node) { + _$jscoverage['core/domUtils.js'][282]++; + if (((! filterFn) || filterFn(node) || domUtils.isBody(node))) { + _$jscoverage['core/domUtils.js'][283]++; + return ((filterFn && (! filterFn(node)) && domUtils.isBody(node))? null: node); + } + _$jscoverage['core/domUtils.js'][285]++; + node = node.parentNode; +} + } + _$jscoverage['core/domUtils.js'][288]++; + return null; +}), findParentByTagName: (function (node, tagNames, includeSelf, excludeFn) { + _$jscoverage['core/domUtils.js'][350]++; + tagNames = utils.listToMap((utils.isArray(tagNames)? tagNames: [tagNames])); + _$jscoverage['core/domUtils.js'][351]++; + return domUtils.findParent(node, (function (node) { + _$jscoverage['core/domUtils.js'][352]++; + return (tagNames[node.tagName] && (! (excludeFn && excludeFn(node)))); +}), includeSelf); +}), findParents: (function (node, includeSelf, filterFn, closerFirst) { + _$jscoverage['core/domUtils.js'][365]++; + var parents = ((includeSelf && ((filterFn && filterFn(node)) || (! filterFn)))? [node]: []); + _$jscoverage['core/domUtils.js'][366]++; + while ((node = domUtils.findParent(node, filterFn))) { + _$jscoverage['core/domUtils.js'][367]++; + parents.push(node); +} + _$jscoverage['core/domUtils.js'][369]++; + return (closerFirst? parents: parents.reverse()); +}), insertAfter: (function (node, newNode) { + _$jscoverage['core/domUtils.js'][380]++; + return node.parentNode.insertBefore(newNode, node.nextSibling); +}), remove: (function (node, keepChildren) { + _$jscoverage['core/domUtils.js'][420]++; + var parent = node.parentNode, child; + _$jscoverage['core/domUtils.js'][422]++; + if (parent) { + _$jscoverage['core/domUtils.js'][423]++; + if ((keepChildren && node.hasChildNodes())) { + _$jscoverage['core/domUtils.js'][424]++; + while ((child = node.firstChild)) { + _$jscoverage['core/domUtils.js'][425]++; + parent.insertBefore(child, node); +} + } + _$jscoverage['core/domUtils.js'][428]++; + parent.removeChild(node); + } + _$jscoverage['core/domUtils.js'][430]++; + return node; +}), getNextNode: (function (node, startFromChild, filterFn, guard) { + _$jscoverage['core/domUtils.js'][437]++; + return getNode(node, "firstChild", "nextSibling", startFromChild, filterFn, guard); +}), isBookmarkNode: (function (node) { + _$jscoverage['core/domUtils.js'][456]++; + return ((node.nodeType == 1) && node.id && /^_baidu_bookmark_/i.test(node.id)); +}), getWindow: (function (node) { + _$jscoverage['core/domUtils.js'][471]++; + var doc = (node.ownerDocument || node); + _$jscoverage['core/domUtils.js'][472]++; + return (doc.defaultView || doc.parentWindow); +}), getCommonAncestor: (function (nodeA, nodeB) { + _$jscoverage['core/domUtils.js'][490]++; + if ((nodeA === nodeB)) { + _$jscoverage['core/domUtils.js'][491]++; + return nodeA; + } + _$jscoverage['core/domUtils.js'][492]++; + var parentsA = [nodeA], parentsB = [nodeB], parent = nodeA, i = -1; + _$jscoverage['core/domUtils.js'][493]++; + while ((parent = parent.parentNode)) { + _$jscoverage['core/domUtils.js'][494]++; + if ((parent === nodeB)) { + _$jscoverage['core/domUtils.js'][495]++; + return parent; + } + _$jscoverage['core/domUtils.js'][497]++; + parentsA.push(parent); +} + _$jscoverage['core/domUtils.js'][499]++; + parent = nodeB; + _$jscoverage['core/domUtils.js'][500]++; + while ((parent = parent.parentNode)) { + _$jscoverage['core/domUtils.js'][501]++; + if ((parent === nodeA)) { + _$jscoverage['core/domUtils.js'][502]++; + return parent; + } + _$jscoverage['core/domUtils.js'][503]++; + parentsB.push(parent); +} + _$jscoverage['core/domUtils.js'][505]++; + parentsA.reverse(); + _$jscoverage['core/domUtils.js'][506]++; + parentsB.reverse(); + _$jscoverage['core/domUtils.js'][507]++; + while (((i++), (parentsA[i] === parentsB[i]))) { +} + _$jscoverage['core/domUtils.js'][509]++; + return ((i == 0)? null: parentsA[(i - 1)]); +}), clearEmptySibling: (function (node, ignoreNext, ignorePre) { + _$jscoverage['core/domUtils.js'][523]++; + function clear(next, dir) { + _$jscoverage['core/domUtils.js'][524]++; + var tmpNode; + _$jscoverage['core/domUtils.js'][525]++; + while ((next && (! domUtils.isBookmarkNode(next)) && (domUtils.isEmptyInlineElement(next) || (! new RegExp(("[^\t\n\r" + domUtils.fillChar + "]")).test(next.nodeValue))))) { + _$jscoverage['core/domUtils.js'][528]++; + tmpNode = next[dir]; + _$jscoverage['core/domUtils.js'][529]++; + domUtils.remove(next); + _$jscoverage['core/domUtils.js'][530]++; + next = tmpNode; +} +} + _$jscoverage['core/domUtils.js'][533]++; + ((! ignoreNext) && clear(node.nextSibling, "nextSibling")); + _$jscoverage['core/domUtils.js'][534]++; + ((! ignorePre) && clear(node.previousSibling, "previousSibling")); +}), split: (function (node, offset) { + _$jscoverage['core/domUtils.js'][554]++; + var doc = node.ownerDocument; + _$jscoverage['core/domUtils.js'][555]++; + if ((browser.ie && (offset == node.nodeValue.length))) { + _$jscoverage['core/domUtils.js'][556]++; + var next = doc.createTextNode(""); + _$jscoverage['core/domUtils.js'][557]++; + return domUtils.insertAfter(node, next); + } + _$jscoverage['core/domUtils.js'][559]++; + var retval = node.splitText(offset); + _$jscoverage['core/domUtils.js'][561]++; + if (browser.ie8) { + _$jscoverage['core/domUtils.js'][562]++; + var tmpNode = doc.createTextNode(""); + _$jscoverage['core/domUtils.js'][563]++; + domUtils.insertAfter(retval, tmpNode); + _$jscoverage['core/domUtils.js'][564]++; + domUtils.remove(tmpNode); + } + _$jscoverage['core/domUtils.js'][566]++; + return retval; +}), isWhitespace: (function (node) { + _$jscoverage['core/domUtils.js'][586]++; + return (! new RegExp(("[^ \t\n\r" + domUtils.fillChar + "]")).test(node.nodeValue)); +}), getXY: (function (element) { + _$jscoverage['core/domUtils.js'][604]++; + var x = 0, y = 0; + _$jscoverage['core/domUtils.js'][605]++; + while (element.offsetParent) { + _$jscoverage['core/domUtils.js'][606]++; + y += element.offsetTop; + _$jscoverage['core/domUtils.js'][607]++; + x += element.offsetLeft; + _$jscoverage['core/domUtils.js'][608]++; + element = element.offsetParent; +} + _$jscoverage['core/domUtils.js'][610]++; + return ({"x": x, "y": y}); +}), on: (function (element, type, handler) { + _$jscoverage['core/domUtils.js'][641]++; + var types = (utils.isArray(type)? type: [type]), k = types.length; + _$jscoverage['core/domUtils.js'][643]++; + if (k) { + _$jscoverage['core/domUtils.js'][643]++; + while ((k--)) { + _$jscoverage['core/domUtils.js'][644]++; + type = types[k]; + _$jscoverage['core/domUtils.js'][645]++; + if (element.addEventListener) { + _$jscoverage['core/domUtils.js'][646]++; + element.addEventListener(type, handler, false); + } + else { + _$jscoverage['core/domUtils.js'][648]++; + if ((! handler._d)) { + _$jscoverage['core/domUtils.js'][649]++; + handler._d = {els: []}; + } + _$jscoverage['core/domUtils.js'][653]++; + var key = (type + handler.toString()), index = utils.indexOf(handler._d.els, element); + _$jscoverage['core/domUtils.js'][654]++; + if (((! handler._d[key]) || (index == -1))) { + _$jscoverage['core/domUtils.js'][655]++; + if ((index == -1)) { + _$jscoverage['core/domUtils.js'][656]++; + handler._d.els.push(element); + } + _$jscoverage['core/domUtils.js'][658]++; + if ((! handler._d[key])) { + _$jscoverage['core/domUtils.js'][659]++; + handler._d[key] = (function (evt) { + _$jscoverage['core/domUtils.js'][660]++; + return handler.call(evt.srcElement, (evt || window.event)); +}); + } + _$jscoverage['core/domUtils.js'][665]++; + element.attachEvent(("on" + type), handler._d[key]); + } + } +} + } + _$jscoverage['core/domUtils.js'][669]++; + element = null; +}), un: (function (element, type, handler) { + _$jscoverage['core/domUtils.js'][700]++; + var types = (utils.isArray(type)? type: [type]), k = types.length; + _$jscoverage['core/domUtils.js'][702]++; + if (k) { + _$jscoverage['core/domUtils.js'][702]++; + while ((k--)) { + _$jscoverage['core/domUtils.js'][703]++; + type = types[k]; + _$jscoverage['core/domUtils.js'][704]++; + if (element.removeEventListener) { + _$jscoverage['core/domUtils.js'][705]++; + element.removeEventListener(type, handler, false); + } + else { + _$jscoverage['core/domUtils.js'][707]++; + var key = (type + handler.toString()); + _$jscoverage['core/domUtils.js'][708]++; + try { + _$jscoverage['core/domUtils.js'][709]++; + element.detachEvent(("on" + type), (handler._d? handler._d[key]: handler)); + } + catch (e) { + } + _$jscoverage['core/domUtils.js'][711]++; + if ((handler._d && handler._d[key])) { + _$jscoverage['core/domUtils.js'][712]++; + var index = utils.indexOf(handler._d.els, element); + _$jscoverage['core/domUtils.js'][713]++; + if ((index != -1)) { + _$jscoverage['core/domUtils.js'][714]++; + handler._d.els.splice(index, 1); + } + _$jscoverage['core/domUtils.js'][716]++; + ((handler._d.els.length == 0) && (delete handler._d[key])); + } + } +} + } +}), isSameElement: (function (nodeA, nodeB) { + _$jscoverage['core/domUtils.js'][749]++; + if ((nodeA.tagName != nodeB.tagName)) { + _$jscoverage['core/domUtils.js'][750]++; + return false; + } + _$jscoverage['core/domUtils.js'][752]++; + var thisAttrs = nodeA.attributes, otherAttrs = nodeB.attributes; + _$jscoverage['core/domUtils.js'][754]++; + if (((! ie) && (thisAttrs.length != otherAttrs.length))) { + _$jscoverage['core/domUtils.js'][755]++; + return false; + } + _$jscoverage['core/domUtils.js'][757]++; + var attrA, attrB, al = 0, bl = 0; + _$jscoverage['core/domUtils.js'][758]++; + for (var i = 0; (attrA = thisAttrs[(i++)]);) { + _$jscoverage['core/domUtils.js'][759]++; + if ((attrA.nodeName == "style")) { + _$jscoverage['core/domUtils.js'][760]++; + if (attrA.specified) { + _$jscoverage['core/domUtils.js'][761]++; + (al++); + } + _$jscoverage['core/domUtils.js'][763]++; + if (domUtils.isSameStyle(nodeA, nodeB)) { + _$jscoverage['core/domUtils.js'][764]++; + continue; + } + else { + _$jscoverage['core/domUtils.js'][766]++; + return false; + } + } + _$jscoverage['core/domUtils.js'][769]++; + if (ie) { + _$jscoverage['core/domUtils.js'][770]++; + if (attrA.specified) { + _$jscoverage['core/domUtils.js'][771]++; + (al++); + _$jscoverage['core/domUtils.js'][772]++; + attrB = otherAttrs.getNamedItem(attrA.nodeName); + } + else { + _$jscoverage['core/domUtils.js'][774]++; + continue; + } + } + else { + _$jscoverage['core/domUtils.js'][777]++; + attrB = nodeB.attributes[attrA.nodeName]; + } + _$jscoverage['core/domUtils.js'][779]++; + if (((! attrB.specified) || (attrA.nodeValue != attrB.nodeValue))) { + _$jscoverage['core/domUtils.js'][780]++; + return false; + } +} + _$jscoverage['core/domUtils.js'][784]++; + if (ie) { + _$jscoverage['core/domUtils.js'][785]++; + for (i = 0; (attrB = otherAttrs[(i++)]);) { + _$jscoverage['core/domUtils.js'][786]++; + if (attrB.specified) { + _$jscoverage['core/domUtils.js'][787]++; + (bl++); + } +} + _$jscoverage['core/domUtils.js'][790]++; + if ((al != bl)) { + _$jscoverage['core/domUtils.js'][791]++; + return false; + } + } + _$jscoverage['core/domUtils.js'][794]++; + return true; +}), isSameStyle: (function (nodeA, nodeB) { + _$jscoverage['core/domUtils.js'][824]++; + var styleA = nodeA.style.cssText.replace(/( ?; ?)/g, ";").replace(/( ?: ?)/g, ":"), styleB = nodeB.style.cssText.replace(/( ?; ?)/g, ";").replace(/( ?: ?)/g, ":"); + _$jscoverage['core/domUtils.js'][826]++; + if (browser.opera) { + _$jscoverage['core/domUtils.js'][827]++; + styleA = nodeA.style; + _$jscoverage['core/domUtils.js'][828]++; + styleB = nodeB.style; + _$jscoverage['core/domUtils.js'][829]++; + if ((styleA.length != styleB.length)) { + _$jscoverage['core/domUtils.js'][830]++; + return false; + } + _$jscoverage['core/domUtils.js'][831]++; + for (var p in styleA) { + _$jscoverage['core/domUtils.js'][832]++; + if (/^(\d+|csstext)$/i.test(p)) { + _$jscoverage['core/domUtils.js'][833]++; + continue; + } + _$jscoverage['core/domUtils.js'][835]++; + if ((styleA[p] != styleB[p])) { + _$jscoverage['core/domUtils.js'][836]++; + return false; + } +} + _$jscoverage['core/domUtils.js'][839]++; + return true; + } + _$jscoverage['core/domUtils.js'][841]++; + if (((! styleA) || (! styleB))) { + _$jscoverage['core/domUtils.js'][842]++; + return (styleA == styleB); + } + _$jscoverage['core/domUtils.js'][844]++; + styleA = styleA.split(";"); + _$jscoverage['core/domUtils.js'][845]++; + styleB = styleB.split(";"); + _$jscoverage['core/domUtils.js'][846]++; + if ((styleA.length != styleB.length)) { + _$jscoverage['core/domUtils.js'][847]++; + return false; + } + _$jscoverage['core/domUtils.js'][849]++; + for (var i = 0, ci; (ci = styleA[(i++)]);) { + _$jscoverage['core/domUtils.js'][850]++; + if ((utils.indexOf(styleB, ci) == -1)) { + _$jscoverage['core/domUtils.js'][851]++; + return false; + } +} + _$jscoverage['core/domUtils.js'][854]++; + return true; +}), isBlockElm: (function (node) { + _$jscoverage['core/domUtils.js'][885]++; + return ((node.nodeType == 1) && (dtd.$block[node.tagName] || styleBlock[domUtils.getComputedStyle(node, "display")]) && (! dtd.$nonChild[node.tagName])); +}), isBody: (function (node) { + _$jscoverage['core/domUtils.js'][900]++; + return (node && (node.nodeType == 1) && (node.tagName.toLowerCase() == "body")); +}), breakParent: (function (node, parent) { + _$jscoverage['core/domUtils.js'][913]++; + var tmpNode, parentClone = node, clone = node, leftNodes, rightNodes; + _$jscoverage['core/domUtils.js'][918]++; + do { + _$jscoverage['core/domUtils.js'][919]++; + parentClone = parentClone.parentNode; + _$jscoverage['core/domUtils.js'][920]++; + if (leftNodes) { + _$jscoverage['core/domUtils.js'][921]++; + tmpNode = parentClone.cloneNode(false); + _$jscoverage['core/domUtils.js'][922]++; + tmpNode.appendChild(leftNodes); + _$jscoverage['core/domUtils.js'][923]++; + leftNodes = tmpNode; + _$jscoverage['core/domUtils.js'][924]++; + tmpNode = parentClone.cloneNode(false); + _$jscoverage['core/domUtils.js'][925]++; + tmpNode.appendChild(rightNodes); + _$jscoverage['core/domUtils.js'][926]++; + rightNodes = tmpNode; + } + else { + _$jscoverage['core/domUtils.js'][928]++; + leftNodes = parentClone.cloneNode(false); + _$jscoverage['core/domUtils.js'][929]++; + rightNodes = leftNodes.cloneNode(false); + } + _$jscoverage['core/domUtils.js'][931]++; + while ((tmpNode = clone.previousSibling)) { + _$jscoverage['core/domUtils.js'][932]++; + leftNodes.insertBefore(tmpNode, leftNodes.firstChild); +} + _$jscoverage['core/domUtils.js'][934]++; + while ((tmpNode = clone.nextSibling)) { + _$jscoverage['core/domUtils.js'][935]++; + rightNodes.appendChild(tmpNode); +} + _$jscoverage['core/domUtils.js'][937]++; + clone = parentClone; +} + while ((parent !== parentClone)); + _$jscoverage['core/domUtils.js'][939]++; + tmpNode = parent.parentNode; + _$jscoverage['core/domUtils.js'][940]++; + tmpNode.insertBefore(leftNodes, parent); + _$jscoverage['core/domUtils.js'][941]++; + tmpNode.insertBefore(rightNodes, parent); + _$jscoverage['core/domUtils.js'][942]++; + tmpNode.insertBefore(node, rightNodes); + _$jscoverage['core/domUtils.js'][943]++; + domUtils.remove(parent); + _$jscoverage['core/domUtils.js'][944]++; + return node; +}), isEmptyInlineElement: (function (node) { + _$jscoverage['core/domUtils.js'][958]++; + if (((node.nodeType != 1) || (! dtd.$removeEmpty[node.tagName]))) { + _$jscoverage['core/domUtils.js'][959]++; + return 0; + } + _$jscoverage['core/domUtils.js'][961]++; + node = node.firstChild; + _$jscoverage['core/domUtils.js'][962]++; + while (node) { + _$jscoverage['core/domUtils.js'][964]++; + if (domUtils.isBookmarkNode(node)) { + _$jscoverage['core/domUtils.js'][965]++; + return 0; + } + _$jscoverage['core/domUtils.js'][967]++; + if ((((node.nodeType == 1) && (! domUtils.isEmptyInlineElement(node))) || ((node.nodeType == 3) && (! domUtils.isWhitespace(node))))) { + _$jscoverage['core/domUtils.js'][970]++; + return 0; + } + _$jscoverage['core/domUtils.js'][972]++; + node = node.nextSibling; +} + _$jscoverage['core/domUtils.js'][974]++; + return 1; +}), trimWhiteTextNode: (function (node) { + _$jscoverage['core/domUtils.js'][1000]++; + function remove(dir) { + _$jscoverage['core/domUtils.js'][1001]++; + var child; + _$jscoverage['core/domUtils.js'][1002]++; + while (((child = node[dir]) && (child.nodeType == 3) && domUtils.isWhitespace(child))) { + _$jscoverage['core/domUtils.js'][1003]++; + node.removeChild(child); +} +} + _$jscoverage['core/domUtils.js'][1006]++; + remove("firstChild"); + _$jscoverage['core/domUtils.js'][1007]++; + remove("lastChild"); +}), mergeChild: (function (node, tagName, attrs) { + _$jscoverage['core/domUtils.js'][1019]++; + var list = domUtils.getElementsByTagName(node, node.tagName.toLowerCase()); + _$jscoverage['core/domUtils.js'][1020]++; + for (var i = 0, ci; (ci = list[(i++)]);) { + _$jscoverage['core/domUtils.js'][1021]++; + if (((! ci.parentNode) || domUtils.isBookmarkNode(ci))) { + _$jscoverage['core/domUtils.js'][1022]++; + continue; + } + _$jscoverage['core/domUtils.js'][1025]++; + if ((ci.tagName.toLowerCase() == "span")) { + _$jscoverage['core/domUtils.js'][1026]++; + if ((node === ci.parentNode)) { + _$jscoverage['core/domUtils.js'][1027]++; + domUtils.trimWhiteTextNode(node); + _$jscoverage['core/domUtils.js'][1028]++; + if ((node.childNodes.length == 1)) { + _$jscoverage['core/domUtils.js'][1029]++; + node.style.cssText = (ci.style.cssText + ";" + node.style.cssText); + _$jscoverage['core/domUtils.js'][1030]++; + domUtils.remove(ci, true); + _$jscoverage['core/domUtils.js'][1031]++; + continue; + } + } + _$jscoverage['core/domUtils.js'][1034]++; + ci.style.cssText = (node.style.cssText + ";" + ci.style.cssText); + _$jscoverage['core/domUtils.js'][1035]++; + if (attrs) { + _$jscoverage['core/domUtils.js'][1036]++; + var style = attrs.style; + _$jscoverage['core/domUtils.js'][1037]++; + if (style) { + _$jscoverage['core/domUtils.js'][1038]++; + style = style.split(";"); + _$jscoverage['core/domUtils.js'][1039]++; + for (var j = 0, s; (s = style[(j++)]);) { + _$jscoverage['core/domUtils.js'][1040]++; + ci.style[utils.cssStyleToDomStyle(s.split(":")[0])] = s.split(":")[1]; +} + } + } + _$jscoverage['core/domUtils.js'][1044]++; + if (domUtils.isSameStyle(ci, node)) { + _$jscoverage['core/domUtils.js'][1045]++; + domUtils.remove(ci, true); + } + _$jscoverage['core/domUtils.js'][1047]++; + continue; + } + _$jscoverage['core/domUtils.js'][1049]++; + if (domUtils.isSameElement(node, ci)) { + _$jscoverage['core/domUtils.js'][1050]++; + domUtils.remove(ci, true); + } +} +}), getElementsByTagName: (function (node, name, filter) { + _$jscoverage['core/domUtils.js'][1061]++; + if ((filter && utils.isString(filter))) { + _$jscoverage['core/domUtils.js'][1062]++; + var className = filter; + _$jscoverage['core/domUtils.js'][1063]++; + filter = (function (node) { + _$jscoverage['core/domUtils.js'][1063]++; + return domUtils.hasClass(node, className); +}); + } + _$jscoverage['core/domUtils.js'][1065]++; + name = utils.trim(name).replace(/[ ]{2,}/g, " ").split(" "); + _$jscoverage['core/domUtils.js'][1066]++; + var arr = []; + _$jscoverage['core/domUtils.js'][1067]++; + for (var n = 0, ni; (ni = name[(n++)]);) { + _$jscoverage['core/domUtils.js'][1068]++; + var list = node.getElementsByTagName(ni); + _$jscoverage['core/domUtils.js'][1069]++; + for (var i = 0, ci; (ci = list[(i++)]);) { + _$jscoverage['core/domUtils.js'][1070]++; + if (((! filter) || filter(ci))) { + _$jscoverage['core/domUtils.js'][1071]++; + arr.push(ci); + } +} +} + _$jscoverage['core/domUtils.js'][1075]++; + return arr; +}), mergeToParent: (function (node) { + _$jscoverage['core/domUtils.js'][1106]++; + var parent = node.parentNode; + _$jscoverage['core/domUtils.js'][1107]++; + while ((parent && dtd.$removeEmpty[parent.tagName])) { + _$jscoverage['core/domUtils.js'][1108]++; + if (((parent.tagName == node.tagName) || (parent.tagName == "A"))) { + _$jscoverage['core/domUtils.js'][1109]++; + domUtils.trimWhiteTextNode(parent); + _$jscoverage['core/domUtils.js'][1111]++; + if ((((parent.tagName == "SPAN") && (! domUtils.isSameStyle(parent, node))) || ((parent.tagName == "A") && (node.tagName == "SPAN")))) { + _$jscoverage['core/domUtils.js'][1113]++; + if (((parent.childNodes.length > 1) || (parent !== node.parentNode))) { + _$jscoverage['core/domUtils.js'][1114]++; + node.style.cssText = (parent.style.cssText + ";" + node.style.cssText); + _$jscoverage['core/domUtils.js'][1115]++; + parent = parent.parentNode; + _$jscoverage['core/domUtils.js'][1116]++; + continue; + } + else { + _$jscoverage['core/domUtils.js'][1118]++; + parent.style.cssText += (";" + node.style.cssText); + _$jscoverage['core/domUtils.js'][1120]++; + if ((parent.tagName == "A")) { + _$jscoverage['core/domUtils.js'][1121]++; + parent.style.textDecoration = "underline"; + } + } + } + _$jscoverage['core/domUtils.js'][1125]++; + if ((parent.tagName != "A")) { + _$jscoverage['core/domUtils.js'][1126]++; + ((parent === node.parentNode) && domUtils.remove(node, true)); + _$jscoverage['core/domUtils.js'][1127]++; + break; + } + } + _$jscoverage['core/domUtils.js'][1130]++; + parent = parent.parentNode; +} +}), mergeSibling: (function (node, ignorePre, ignoreNext) { + _$jscoverage['core/domUtils.js'][1189]++; + function merge(rtl, start, node) { + _$jscoverage['core/domUtils.js'][1190]++; + var next; + _$jscoverage['core/domUtils.js'][1191]++; + if (((next = node[rtl]) && (! domUtils.isBookmarkNode(next)) && (next.nodeType == 1) && domUtils.isSameElement(node, next))) { + _$jscoverage['core/domUtils.js'][1192]++; + while (next.firstChild) { + _$jscoverage['core/domUtils.js'][1193]++; + if ((start == "firstChild")) { + _$jscoverage['core/domUtils.js'][1194]++; + node.insertBefore(next.lastChild, node.firstChild); + } + else { + _$jscoverage['core/domUtils.js'][1196]++; + node.appendChild(next.firstChild); + } +} + _$jscoverage['core/domUtils.js'][1199]++; + domUtils.remove(next); + } +} + _$jscoverage['core/domUtils.js'][1202]++; + ((! ignorePre) && merge("previousSibling", "firstChild", node)); + _$jscoverage['core/domUtils.js'][1203]++; + ((! ignoreNext) && merge("nextSibling", "lastChild", node)); +}), unSelectable: ((ie || browser.opera)? (function (node) { + _$jscoverage['core/domUtils.js'][1218]++; + node.onselectstart = (function () { + _$jscoverage['core/domUtils.js'][1219]++; + return false; +}); + _$jscoverage['core/domUtils.js'][1221]++; + node.onclick = (node.onkeyup = (node.onkeydown = (function () { + _$jscoverage['core/domUtils.js'][1222]++; + return false; +}))); + _$jscoverage['core/domUtils.js'][1224]++; + node.unselectable = "on"; + _$jscoverage['core/domUtils.js'][1225]++; + node.setAttribute("unselectable", "on"); + _$jscoverage['core/domUtils.js'][1226]++; + for (var i = 0, ci; (ci = node.all[(i++)]);) { + _$jscoverage['core/domUtils.js'][1227]++; + switch (ci.tagName.toLowerCase()) { + case "iframe": + case "textarea": + case "input": + case "select": + _$jscoverage['core/domUtils.js'][1232]++; + break; + default: + _$jscoverage['core/domUtils.js'][1234]++; + ci.unselectable = "on"; + _$jscoverage['core/domUtils.js'][1235]++; + node.setAttribute("unselectable", "on"); + } +} +}): (function (node) { + _$jscoverage['core/domUtils.js'][1239]++; + node.style.MozUserSelect = (node.style.webkitUserSelect = (node.style.KhtmlUserSelect = "none")); +})), removeAttributes: (function (node, attrNames) { + _$jscoverage['core/domUtils.js'][1286]++; + attrNames = (utils.isArray(attrNames)? attrNames: utils.trim(attrNames).replace(/[ ]{2,}/g, " ").split(" ")); + _$jscoverage['core/domUtils.js'][1287]++; + for (var i = 0, ci; (ci = attrNames[(i++)]);) { + _$jscoverage['core/domUtils.js'][1288]++; + ci = (attrFix[ci] || ci); + _$jscoverage['core/domUtils.js'][1289]++; + switch (ci) { + case "className": + _$jscoverage['core/domUtils.js'][1291]++; + node[ci] = ""; + _$jscoverage['core/domUtils.js'][1292]++; + break; + case "style": + _$jscoverage['core/domUtils.js'][1294]++; + node.style.cssText = ""; + _$jscoverage['core/domUtils.js'][1295]++; + ((! browser.ie) && node.removeAttributeNode(node.getAttributeNode("style"))); + } + _$jscoverage['core/domUtils.js'][1297]++; + node.removeAttribute(ci); +} +}), createElement: (function (doc, tag, attrs) { + _$jscoverage['core/domUtils.js'][1323]++; + return domUtils.setAttributes(doc.createElement(tag), attrs); +}), setAttributes: (function (node, attrs) { + _$jscoverage['core/domUtils.js'][1349]++; + for (var attr in attrs) { + _$jscoverage['core/domUtils.js'][1350]++; + if (attrs.hasOwnProperty(attr)) { + _$jscoverage['core/domUtils.js'][1351]++; + var value = attrs[attr]; + _$jscoverage['core/domUtils.js'][1352]++; + switch (attr) { + case "class": + _$jscoverage['core/domUtils.js'][1355]++; + node.className = value; + _$jscoverage['core/domUtils.js'][1356]++; + break; + case "style": + _$jscoverage['core/domUtils.js'][1358]++; + node.style.cssText = (node.style.cssText + ";" + value); + _$jscoverage['core/domUtils.js'][1359]++; + break; + case "innerHTML": + _$jscoverage['core/domUtils.js'][1361]++; + node[attr] = value; + _$jscoverage['core/domUtils.js'][1362]++; + break; + case "value": + _$jscoverage['core/domUtils.js'][1364]++; + node.value = value; + _$jscoverage['core/domUtils.js'][1365]++; + break; + default: + _$jscoverage['core/domUtils.js'][1367]++; + node.setAttribute((attrFix[attr] || attr), value); + } + } +} + _$jscoverage['core/domUtils.js'][1371]++; + return node; +}), getComputedStyle: (function (element, styleName) { + _$jscoverage['core/domUtils.js'][1398]++; + var pros = "width height top left"; + _$jscoverage['core/domUtils.js'][1400]++; + if ((pros.indexOf(styleName) > -1)) { + _$jscoverage['core/domUtils.js'][1401]++; + return (element[("offset" + styleName.replace(/^\w/, (function (s) { + _$jscoverage['core/domUtils.js'][1401]++; + return s.toUpperCase(); +})))] + "px"); + } + _$jscoverage['core/domUtils.js'][1404]++; + if ((element.nodeType == 3)) { + _$jscoverage['core/domUtils.js'][1405]++; + element = element.parentNode; + } + _$jscoverage['core/domUtils.js'][1408]++; + if ((browser.ie && (browser.version < 9) && (styleName == "font-size") && (! element.style.fontSize) && (! dtd.$empty[element.tagName]) && (! dtd.$nonChild[element.tagName]))) { + _$jscoverage['core/domUtils.js'][1410]++; + var span = element.ownerDocument.createElement("span"); + _$jscoverage['core/domUtils.js'][1411]++; + span.style.cssText = "padding:0;border:0;font-family:simsun;"; + _$jscoverage['core/domUtils.js'][1412]++; + span.innerHTML = "."; + _$jscoverage['core/domUtils.js'][1413]++; + element.appendChild(span); + _$jscoverage['core/domUtils.js'][1414]++; + var result = span.offsetHeight; + _$jscoverage['core/domUtils.js'][1415]++; + element.removeChild(span); + _$jscoverage['core/domUtils.js'][1416]++; + span = null; + _$jscoverage['core/domUtils.js'][1417]++; + return (result + "px"); + } + _$jscoverage['core/domUtils.js'][1419]++; + try { + _$jscoverage['core/domUtils.js'][1420]++; + var value = (domUtils.getStyle(element, styleName) || (window.getComputedStyle? domUtils.getWindow(element).getComputedStyle(element, "").getPropertyValue(styleName): (element.currentStyle || element.style)[utils.cssStyleToDomStyle(styleName)])); + } + catch (e) { + _$jscoverage['core/domUtils.js'][1425]++; + return ""; + } + _$jscoverage['core/domUtils.js'][1427]++; + return utils.transUnitToPx(utils.fixColor(styleName, value)); +}), removeClasses: (function (elm, classNames) { + _$jscoverage['core/domUtils.js'][1471]++; + classNames = (utils.isArray(classNames)? classNames: utils.trim(classNames).replace(/[ ]{2,}/g, " ").split(" ")); + _$jscoverage['core/domUtils.js'][1473]++; + for (var i = 0, ci, cls = elm.className; (ci = classNames[(i++)]);) { + _$jscoverage['core/domUtils.js'][1474]++; + cls = cls.replace(new RegExp(("\\b" + ci + "\\b")), ""); +} + _$jscoverage['core/domUtils.js'][1476]++; + cls = utils.trim(cls).replace(/[ ]{2,}/g, " "); + _$jscoverage['core/domUtils.js'][1477]++; + if (cls) { + _$jscoverage['core/domUtils.js'][1478]++; + elm.className = cls; + } + else { + _$jscoverage['core/domUtils.js'][1480]++; + domUtils.removeAttributes(elm, ["class"]); + } +}), addClass: (function (elm, classNames) { + _$jscoverage['core/domUtils.js'][1528]++; + if ((! elm)) { + _$jscoverage['core/domUtils.js'][1528]++; + return; + } + _$jscoverage['core/domUtils.js'][1529]++; + classNames = utils.trim(classNames).replace(/[ ]{2,}/g, " ").split(" "); + _$jscoverage['core/domUtils.js'][1530]++; + for (var i = 0, ci, cls = elm.className; (ci = classNames[(i++)]);) { + _$jscoverage['core/domUtils.js'][1531]++; + if ((! new RegExp(("\\b" + ci + "\\b")).test(cls))) { + _$jscoverage['core/domUtils.js'][1532]++; + elm.className += (" " + ci); + } +} +}), hasClass: (function (element, className) { + _$jscoverage['core/domUtils.js'][1581]++; + if (utils.isRegExp(className)) { + _$jscoverage['core/domUtils.js'][1582]++; + return className.test(element.className); + } + _$jscoverage['core/domUtils.js'][1584]++; + className = utils.trim(className).replace(/[ ]{2,}/g, " ").split(" "); + _$jscoverage['core/domUtils.js'][1585]++; + for (var i = 0, ci, cls = element.className; (ci = className[(i++)]);) { + _$jscoverage['core/domUtils.js'][1586]++; + if ((! new RegExp(("\\b" + ci + "\\b"), "i").test(cls))) { + _$jscoverage['core/domUtils.js'][1587]++; + return false; + } +} + _$jscoverage['core/domUtils.js'][1590]++; + return ((i - 1) == className.length); +}), preventDefault: (function (evt) { + _$jscoverage['core/domUtils.js'][1603]++; + (evt.preventDefault? evt.preventDefault(): (evt.returnValue = false)); +}), removeStyle: (function (element, name) { + _$jscoverage['core/domUtils.js'][1628]++; + if (browser.ie) { + _$jscoverage['core/domUtils.js'][1630]++; + if ((name == "color")) { + _$jscoverage['core/domUtils.js'][1631]++; + name = ("(^|;)" + name); + } + _$jscoverage['core/domUtils.js'][1633]++; + element.style.cssText = element.style.cssText.replace(new RegExp((name + "[^:]*:[^;]+;?"), "ig"), ""); + } + else { + _$jscoverage['core/domUtils.js'][1635]++; + if (element.style.removeProperty) { + _$jscoverage['core/domUtils.js'][1636]++; + element.style.removeProperty(name); + } + else { + _$jscoverage['core/domUtils.js'][1638]++; + element.style.removeAttribute(utils.cssStyleToDomStyle(name)); + } + } + _$jscoverage['core/domUtils.js'][1643]++; + if ((! element.style.cssText)) { + _$jscoverage['core/domUtils.js'][1644]++; + domUtils.removeAttributes(element, ["style"]); + } +}), getStyle: (function (element, name) { + _$jscoverage['core/domUtils.js'][1673]++; + var value = element.style[utils.cssStyleToDomStyle(name)]; + _$jscoverage['core/domUtils.js'][1674]++; + return utils.fixColor(name, value); +}), setStyle: (function (element, name, value) { + _$jscoverage['core/domUtils.js'][1703]++; + element.style[utils.cssStyleToDomStyle(name)] = value; + _$jscoverage['core/domUtils.js'][1704]++; + if ((! utils.trim(element.style.cssText))) { + _$jscoverage['core/domUtils.js'][1705]++; + this.removeAttributes(element, "style"); + } +}), setStyles: (function (element, styles) { + _$jscoverage['core/domUtils.js'][1735]++; + for (var name in styles) { + _$jscoverage['core/domUtils.js'][1736]++; + if (styles.hasOwnProperty(name)) { + _$jscoverage['core/domUtils.js'][1737]++; + domUtils.setStyle(element, name, styles[name]); + } +} +}), removeDirtyAttr: (function (node) { + _$jscoverage['core/domUtils.js'][1747]++; + for (var i = 0, ci, nodes = node.getElementsByTagName("*"); (ci = nodes[(i++)]);) { + _$jscoverage['core/domUtils.js'][1748]++; + ci.removeAttribute("_moz_dirty"); +} + _$jscoverage['core/domUtils.js'][1750]++; + node.removeAttribute("_moz_dirty"); +}), getChildCount: (function (node, fn) { + _$jscoverage['core/domUtils.js'][1798]++; + var count = 0, first = node.firstChild; + _$jscoverage['core/domUtils.js'][1799]++; + fn = (fn || (function () { + _$jscoverage['core/domUtils.js'][1800]++; + return 1; +})); + _$jscoverage['core/domUtils.js'][1802]++; + while (first) { + _$jscoverage['core/domUtils.js'][1803]++; + if (fn(first)) { + _$jscoverage['core/domUtils.js'][1804]++; + (count++); + } + _$jscoverage['core/domUtils.js'][1806]++; + first = first.nextSibling; +} + _$jscoverage['core/domUtils.js'][1808]++; + return count; +}), isEmptyNode: (function (node) { + _$jscoverage['core/domUtils.js'][1822]++; + return ((! node.firstChild) || (domUtils.getChildCount(node, (function (node) { + _$jscoverage['core/domUtils.js'][1823]++; + return ((! domUtils.isBr(node)) && (! domUtils.isBookmarkNode(node)) && (! domUtils.isWhitespace(node))); +})) == 0)); +}), clearSelectedArr: (function (nodes) { + _$jscoverage['core/domUtils.js'][1839]++; + var node; + _$jscoverage['core/domUtils.js'][1840]++; + while ((node = nodes.pop())) { + _$jscoverage['core/domUtils.js'][1841]++; + domUtils.removeAttributes(node, ["class"]); +} +}), scrollToView: (function (node, win, offsetTop) { + _$jscoverage['core/domUtils.js'][1853]++; + var getViewPaneSize = (function () { + _$jscoverage['core/domUtils.js'][1854]++; + var doc = win.document, mode = (doc.compatMode == "CSS1Compat"); + _$jscoverage['core/domUtils.js'][1856]++; + return ({width: ((mode? doc.documentElement.clientWidth: doc.body.clientWidth) || 0), height: ((mode? doc.documentElement.clientHeight: doc.body.clientHeight) || 0)}); +}), getScrollPosition = (function (win) { + _$jscoverage['core/domUtils.js'][1862]++; + if (("pageXOffset" in win)) { + _$jscoverage['core/domUtils.js'][1863]++; + return ({x: (win.pageXOffset || 0), y: (win.pageYOffset || 0)}); + } + else { + _$jscoverage['core/domUtils.js'][1869]++; + var doc = win.document; + _$jscoverage['core/domUtils.js'][1870]++; + return ({x: (doc.documentElement.scrollLeft || doc.body.scrollLeft || 0), y: (doc.documentElement.scrollTop || doc.body.scrollTop || 0)}); + } +}); + _$jscoverage['core/domUtils.js'][1876]++; + var winHeight = getViewPaneSize().height, offset = ((winHeight * -1) + offsetTop); + _$jscoverage['core/domUtils.js'][1877]++; + offset += (node.offsetHeight || 0); + _$jscoverage['core/domUtils.js'][1878]++; + var elementPosition = domUtils.getXY(node); + _$jscoverage['core/domUtils.js'][1879]++; + offset += elementPosition.y; + _$jscoverage['core/domUtils.js'][1880]++; + var currentScroll = getScrollPosition(win).y; + _$jscoverage['core/domUtils.js'][1882]++; + if (((offset > currentScroll) || (offset < (currentScroll - winHeight)))) { + _$jscoverage['core/domUtils.js'][1883]++; + win.scrollTo(0, (offset + ((offset < 0)? -20: 20))); + } +}), isBr: (function (node) { + _$jscoverage['core/domUtils.js'][1894]++; + return ((node.nodeType == 1) && (node.tagName == "BR")); +}), isFillChar: (function (node, isInStart) { + _$jscoverage['core/domUtils.js'][1905]++; + return ((node.nodeType == 3) && (! node.nodeValue.replace(new RegExp(((isInStart? "^": "") + domUtils.fillChar)), "").length)); +}), isStartInblock: (function (range) { + _$jscoverage['core/domUtils.js'][1910]++; + var tmpRange = range.cloneRange(), flag = 0, start = tmpRange.startContainer, tmp; + _$jscoverage['core/domUtils.js'][1914]++; + if (((start.nodeType == 1) && start.childNodes[tmpRange.startOffset])) { + _$jscoverage['core/domUtils.js'][1915]++; + start = start.childNodes[tmpRange.startOffset]; + _$jscoverage['core/domUtils.js'][1916]++; + var pre = start.previousSibling; + _$jscoverage['core/domUtils.js'][1917]++; + while ((pre && domUtils.isFillChar(pre))) { + _$jscoverage['core/domUtils.js'][1918]++; + start = pre; + _$jscoverage['core/domUtils.js'][1919]++; + pre = pre.previousSibling; +} + } + _$jscoverage['core/domUtils.js'][1922]++; + if ((this.isFillChar(start, true) && (tmpRange.startOffset == 1))) { + _$jscoverage['core/domUtils.js'][1923]++; + tmpRange.setStartBefore(start); + _$jscoverage['core/domUtils.js'][1924]++; + start = tmpRange.startContainer; + } + _$jscoverage['core/domUtils.js'][1927]++; + while ((start && domUtils.isFillChar(start))) { + _$jscoverage['core/domUtils.js'][1928]++; + tmp = start; + _$jscoverage['core/domUtils.js'][1929]++; + start = start.previousSibling; +} + _$jscoverage['core/domUtils.js'][1931]++; + if (tmp) { + _$jscoverage['core/domUtils.js'][1932]++; + tmpRange.setStartBefore(tmp); + _$jscoverage['core/domUtils.js'][1933]++; + start = tmpRange.startContainer; + } + _$jscoverage['core/domUtils.js'][1935]++; + if (((start.nodeType == 1) && domUtils.isEmptyNode(start) && (tmpRange.startOffset == 1))) { + _$jscoverage['core/domUtils.js'][1936]++; + tmpRange.setStart(start, 0).collapse(true); + } + _$jscoverage['core/domUtils.js'][1938]++; + while ((! tmpRange.startOffset)) { + _$jscoverage['core/domUtils.js'][1939]++; + start = tmpRange.startContainer; + _$jscoverage['core/domUtils.js'][1940]++; + if ((domUtils.isBlockElm(start) || domUtils.isBody(start))) { + _$jscoverage['core/domUtils.js'][1941]++; + flag = 1; + _$jscoverage['core/domUtils.js'][1942]++; + break; + } + _$jscoverage['core/domUtils.js'][1944]++; + var pre = tmpRange.startContainer.previousSibling, tmpNode; + _$jscoverage['core/domUtils.js'][1946]++; + if ((! pre)) { + _$jscoverage['core/domUtils.js'][1947]++; + tmpRange.setStartBefore(tmpRange.startContainer); + } + else { + _$jscoverage['core/domUtils.js'][1949]++; + while ((pre && domUtils.isFillChar(pre))) { + _$jscoverage['core/domUtils.js'][1950]++; + tmpNode = pre; + _$jscoverage['core/domUtils.js'][1951]++; + pre = pre.previousSibling; +} + _$jscoverage['core/domUtils.js'][1953]++; + if (tmpNode) { + _$jscoverage['core/domUtils.js'][1954]++; + tmpRange.setStartBefore(tmpNode); + } + else { + _$jscoverage['core/domUtils.js'][1956]++; + tmpRange.setStartBefore(tmpRange.startContainer); + } + } +} + _$jscoverage['core/domUtils.js'][1960]++; + return ((flag && (! domUtils.isBody(tmpRange.startContainer)))? 1: 0); +}), isEmptyBlock: (function (node, reg) { + _$jscoverage['core/domUtils.js'][1987]++; + if ((node.nodeType != 1)) { + _$jscoverage['core/domUtils.js'][1988]++; + return 0; + } + _$jscoverage['core/domUtils.js'][1989]++; + reg = (reg || new RegExp(("[ \t\r\n" + domUtils.fillChar + "]"), "g")); + _$jscoverage['core/domUtils.js'][1990]++; + if ((node[(browser.ie? "innerText": "textContent")].replace(reg, "").length > 0)) { + _$jscoverage['core/domUtils.js'][1991]++; + return 0; + } + _$jscoverage['core/domUtils.js'][1993]++; + for (var n in dtd.$isNotEmpty) { + _$jscoverage['core/domUtils.js'][1994]++; + if (node.getElementsByTagName(n).length) { + _$jscoverage['core/domUtils.js'][1995]++; + return 0; + } +} + _$jscoverage['core/domUtils.js'][1998]++; + return 1; +}), setViewportOffset: (function (element, offset) { + _$jscoverage['core/domUtils.js'][2028]++; + var left = (parseInt(element.style.left) | 0); + _$jscoverage['core/domUtils.js'][2029]++; + var top = (parseInt(element.style.top) | 0); + _$jscoverage['core/domUtils.js'][2030]++; + var rect = element.getBoundingClientRect(); + _$jscoverage['core/domUtils.js'][2031]++; + var offsetLeft = (offset.left - rect.left); + _$jscoverage['core/domUtils.js'][2032]++; + var offsetTop = (offset.top - rect.top); + _$jscoverage['core/domUtils.js'][2033]++; + if (offsetLeft) { + _$jscoverage['core/domUtils.js'][2034]++; + element.style.left = (left + offsetLeft + "px"); + } + _$jscoverage['core/domUtils.js'][2036]++; + if (offsetTop) { + _$jscoverage['core/domUtils.js'][2037]++; + element.style.top = (top + offsetTop + "px"); + } +}), fillNode: (function (doc, node) { + _$jscoverage['core/domUtils.js'][2065]++; + var tmpNode = (browser.ie? doc.createTextNode(domUtils.fillChar): doc.createElement("br")); + _$jscoverage['core/domUtils.js'][2066]++; + node.innerHTML = ""; + _$jscoverage['core/domUtils.js'][2067]++; + node.appendChild(tmpNode); +}), moveChild: (function (src, tag, dir) { + _$jscoverage['core/domUtils.js'][2133]++; + while (src.firstChild) { + _$jscoverage['core/domUtils.js'][2134]++; + if ((dir && tag.firstChild)) { + _$jscoverage['core/domUtils.js'][2135]++; + tag.insertBefore(src.lastChild, tag.firstChild); + } + else { + _$jscoverage['core/domUtils.js'][2137]++; + tag.appendChild(src.firstChild); + } +} +}), hasNoAttributes: (function (node) { + _$jscoverage['core/domUtils.js'][2163]++; + return (browser.ie? /^<\w+\s*?>/.test(node.outerHTML): (node.attributes.length == 0)); +}), isCustomeNode: (function (node) { + _$jscoverage['core/domUtils.js'][2174]++; + return ((node.nodeType == 1) && node.getAttribute("_ue_custom_node_")); +}), isTagNode: (function (node, tagName) { + _$jscoverage['core/domUtils.js'][2196]++; + return ((node.nodeType == 1) && new RegExp(("^" + node.tagName + "$"), "i").test(tagName)); +}), filterNodeList: (function (nodelist, filter, forAll) { + _$jscoverage['core/domUtils.js'][2266]++; + var results = []; + _$jscoverage['core/domUtils.js'][2267]++; + if ((! utils.isFunction(filter))) { + _$jscoverage['core/domUtils.js'][2268]++; + var str = filter; + _$jscoverage['core/domUtils.js'][2269]++; + filter = (function (n) { + _$jscoverage['core/domUtils.js'][2270]++; + return (utils.indexOf((utils.isArray(str)? str: str.split(" ")), n.tagName.toLowerCase()) != -1); +}); + } + _$jscoverage['core/domUtils.js'][2273]++; + utils.each(nodelist, (function (n) { + _$jscoverage['core/domUtils.js'][2274]++; + (filter(n) && results.push(n)); +})); + _$jscoverage['core/domUtils.js'][2276]++; + return ((results.length == 0)? null: (((results.length == 1) || (! forAll))? results[0]: results)); +}), isInNodeEndBoundary: (function (rng, node) { + _$jscoverage['core/domUtils.js'][2280]++; + var start = rng.startContainer; + _$jscoverage['core/domUtils.js'][2281]++; + if (((start.nodeType == 3) && (rng.startOffset != start.nodeValue.length))) { + _$jscoverage['core/domUtils.js'][2282]++; + return 0; + } + _$jscoverage['core/domUtils.js'][2284]++; + if (((start.nodeType == 1) && (rng.startOffset != start.childNodes.length))) { + _$jscoverage['core/domUtils.js'][2285]++; + return 0; + } + _$jscoverage['core/domUtils.js'][2287]++; + while ((start !== node)) { + _$jscoverage['core/domUtils.js'][2288]++; + if (start.nextSibling) { + _$jscoverage['core/domUtils.js'][2289]++; + return 0; + } + _$jscoverage['core/domUtils.js'][2290]++; + ; + _$jscoverage['core/domUtils.js'][2291]++; + start = start.parentNode; +} + _$jscoverage['core/domUtils.js'][2293]++; + return 1; +}), isBoundaryNode: (function (node, dir) { + _$jscoverage['core/domUtils.js'][2296]++; + var tmp; + _$jscoverage['core/domUtils.js'][2297]++; + while ((! domUtils.isBody(node))) { + _$jscoverage['core/domUtils.js'][2298]++; + tmp = node; + _$jscoverage['core/domUtils.js'][2299]++; + node = node.parentNode; + _$jscoverage['core/domUtils.js'][2300]++; + if ((tmp !== node[dir])) { + _$jscoverage['core/domUtils.js'][2301]++; + return false; + } +} + _$jscoverage['core/domUtils.js'][2304]++; + return true; +})}); +_$jscoverage['core/domUtils.js'][2307]++; +var fillCharReg = new RegExp(domUtils.fillChar, "g"); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/core/dtd.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/core/dtd.js new file mode 100644 index 000000000..866a73c3f --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/core/dtd.js @@ -0,0 +1,73 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['core/dtd.js']) { + _$jscoverage['core/dtd.js'] = []; + _$jscoverage['core/dtd.js'][9] = 0; + _$jscoverage['core/dtd.js'][10] = 0; + _$jscoverage['core/dtd.js'][11] = 0; + _$jscoverage['core/dtd.js'][12] = 0; + _$jscoverage['core/dtd.js'][14] = 0; + _$jscoverage['core/dtd.js'][16] = 0; + _$jscoverage['core/dtd.js'][17] = 0; + _$jscoverage['core/dtd.js'][41] = 0; + _$jscoverage['core/dtd.js'][45] = 0; +} +_$jscoverage['core/dtd.js'].source = ["///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( _({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,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"," });","})();"]; +_$jscoverage['core/dtd.js'][9]++; +var dtd = (dom.dtd = (function () { + _$jscoverage['core/dtd.js'][10]++; + function _(s) { + _$jscoverage['core/dtd.js'][11]++; + for (var k in s) { + _$jscoverage['core/dtd.js'][12]++; + s[k.toUpperCase()] = s[k]; +} + _$jscoverage['core/dtd.js'][14]++; + return s; +} + _$jscoverage['core/dtd.js'][16]++; + var X = utils.extend2; + _$jscoverage['core/dtd.js'][17]++; + 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(_({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), 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}); + _$jscoverage['core/dtd.js'][41]++; + 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}); + _$jscoverage['core/dtd.js'][45]++; + return _({$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, $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, link: 1, meta: 1, param: 1, h1: 1, h2: 1, h3: 1, h4: 1, h5: 1, h6: 1}), $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}), $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, 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}); +})()); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/core/filternode.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/core/filternode.js new file mode 100644 index 000000000..5b17d9ac6 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/core/filternode.js @@ -0,0 +1,275 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['core/filternode.js']) { + _$jscoverage['core/filternode.js'] = []; + _$jscoverage['core/filternode.js'][24] = 0; + _$jscoverage['core/filternode.js'][25] = 0; + _$jscoverage['core/filternode.js'][26] = 0; + _$jscoverage['core/filternode.js'][28] = 0; + _$jscoverage['core/filternode.js'][30] = 0; + _$jscoverage['core/filternode.js'][31] = 0; + _$jscoverage['core/filternode.js'][32] = 0; + _$jscoverage['core/filternode.js'][33] = 0; + _$jscoverage['core/filternode.js'][34] = 0; + _$jscoverage['core/filternode.js'][35] = 0; + _$jscoverage['core/filternode.js'][37] = 0; + _$jscoverage['core/filternode.js'][38] = 0; + _$jscoverage['core/filternode.js'][39] = 0; + _$jscoverage['core/filternode.js'][40] = 0; + _$jscoverage['core/filternode.js'][41] = 0; + _$jscoverage['core/filternode.js'][42] = 0; + _$jscoverage['core/filternode.js'][43] = 0; + _$jscoverage['core/filternode.js'][48] = 0; + _$jscoverage['core/filternode.js'][49] = 0; + _$jscoverage['core/filternode.js'][50] = 0; + _$jscoverage['core/filternode.js'][51] = 0; + _$jscoverage['core/filternode.js'][58] = 0; + _$jscoverage['core/filternode.js'][59] = 0; + _$jscoverage['core/filternode.js'][60] = 0; + _$jscoverage['core/filternode.js'][61] = 0; + _$jscoverage['core/filternode.js'][62] = 0; + _$jscoverage['core/filternode.js'][64] = 0; + _$jscoverage['core/filternode.js'][65] = 0; + _$jscoverage['core/filternode.js'][66] = 0; + _$jscoverage['core/filternode.js'][67] = 0; + _$jscoverage['core/filternode.js'][68] = 0; + _$jscoverage['core/filternode.js'][69] = 0; + _$jscoverage['core/filternode.js'][72] = 0; + _$jscoverage['core/filternode.js'][74] = 0; + _$jscoverage['core/filternode.js'][75] = 0; + _$jscoverage['core/filternode.js'][79] = 0; + _$jscoverage['core/filternode.js'][81] = 0; + _$jscoverage['core/filternode.js'][82] = 0; + _$jscoverage['core/filternode.js'][83] = 0; + _$jscoverage['core/filternode.js'][84] = 0; + _$jscoverage['core/filternode.js'][85] = 0; + _$jscoverage['core/filternode.js'][92] = 0; + _$jscoverage['core/filternode.js'][93] = 0; + _$jscoverage['core/filternode.js'][95] = 0; + _$jscoverage['core/filternode.js'][97] = 0; + _$jscoverage['core/filternode.js'][98] = 0; + _$jscoverage['core/filternode.js'][99] = 0; + _$jscoverage['core/filternode.js'][100] = 0; + _$jscoverage['core/filternode.js'][101] = 0; + _$jscoverage['core/filternode.js'][106] = 0; + _$jscoverage['core/filternode.js'][108] = 0; + _$jscoverage['core/filternode.js'][112] = 0; + _$jscoverage['core/filternode.js'][113] = 0; + _$jscoverage['core/filternode.js'][114] = 0; + _$jscoverage['core/filternode.js'][116] = 0; + _$jscoverage['core/filternode.js'][117] = 0; + _$jscoverage['core/filternode.js'][118] = 0; + _$jscoverage['core/filternode.js'][119] = 0; + _$jscoverage['core/filternode.js'][122] = 0; + _$jscoverage['core/filternode.js'][123] = 0; + _$jscoverage['core/filternode.js'][124] = 0; + _$jscoverage['core/filternode.js'][125] = 0; + _$jscoverage['core/filternode.js'][128] = 0; +} +_$jscoverage['core/filternode.js'].source = ["/**"," * 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;"," }","}();"]; +_$jscoverage['core/filternode.js'][24]++; +var filterNode = (UE.filterNode = (function () { + _$jscoverage['core/filternode.js'][25]++; + function filterNode(node, rules) { + _$jscoverage['core/filternode.js'][26]++; + switch (node.type) { + case "text": + _$jscoverage['core/filternode.js'][28]++; + break; + case "element": + _$jscoverage['core/filternode.js'][30]++; + var val; + _$jscoverage['core/filternode.js'][31]++; + if ((val = rules[node.tagName])) { + _$jscoverage['core/filternode.js'][32]++; + if ((val === "-")) { + _$jscoverage['core/filternode.js'][33]++; + node.parentNode.removeChild(node); + } + else { + _$jscoverage['core/filternode.js'][34]++; + if (utils.isFunction(val)) { + _$jscoverage['core/filternode.js'][35]++; + var parentNode = node.parentNode, index = node.getIndex(); + _$jscoverage['core/filternode.js'][37]++; + val(node); + _$jscoverage['core/filternode.js'][38]++; + if (node.parentNode) { + _$jscoverage['core/filternode.js'][39]++; + if (node.children) { + _$jscoverage['core/filternode.js'][40]++; + for (var i = 0, ci; (ci = node.children[i]);) { + _$jscoverage['core/filternode.js'][41]++; + filterNode(ci, rules); + _$jscoverage['core/filternode.js'][42]++; + if (ci.parentNode) { + _$jscoverage['core/filternode.js'][43]++; + (i++); + } +} + } + } + else { + _$jscoverage['core/filternode.js'][48]++; + for (var i = index, ci = ci; (ci = parentNode.children[i]);) { + _$jscoverage['core/filternode.js'][49]++; + filterNode(ci, rules); + _$jscoverage['core/filternode.js'][50]++; + if (ci.parentNode) { + _$jscoverage['core/filternode.js'][51]++; + (i++); + } +} + } + } + else { + _$jscoverage['core/filternode.js'][58]++; + var attrs = val.$; + _$jscoverage['core/filternode.js'][59]++; + if ((attrs && node.attrs)) { + _$jscoverage['core/filternode.js'][60]++; + var tmpAttrs = {}, tmpVal; + _$jscoverage['core/filternode.js'][61]++; + for (var a in attrs) { + _$jscoverage['core/filternode.js'][62]++; + tmpVal = node.getAttr(a); + _$jscoverage['core/filternode.js'][64]++; + if (((a == "style") && utils.isArray(attrs[a]))) { + _$jscoverage['core/filternode.js'][65]++; + var tmpCssStyle = []; + _$jscoverage['core/filternode.js'][66]++; + utils.each(attrs[a], (function (v) { + _$jscoverage['core/filternode.js'][67]++; + var tmp; + _$jscoverage['core/filternode.js'][68]++; + if ((tmp = node.getStyle(v))) { + _$jscoverage['core/filternode.js'][69]++; + tmpCssStyle.push((v + ":" + tmp)); + } +})); + _$jscoverage['core/filternode.js'][72]++; + tmpVal = tmpCssStyle.join(";"); + } + _$jscoverage['core/filternode.js'][74]++; + if (tmpVal) { + _$jscoverage['core/filternode.js'][75]++; + tmpAttrs[a] = tmpVal; + } +} + _$jscoverage['core/filternode.js'][79]++; + node.attrs = tmpAttrs; + } + _$jscoverage['core/filternode.js'][81]++; + if (node.children) { + _$jscoverage['core/filternode.js'][82]++; + for (var i = 0, ci = ci; (ci = node.children[i]);) { + _$jscoverage['core/filternode.js'][83]++; + filterNode(ci, rules); + _$jscoverage['core/filternode.js'][84]++; + if (ci.parentNode) { + _$jscoverage['core/filternode.js'][85]++; + (i++); + } +} + } + } + } + } + else { + _$jscoverage['core/filternode.js'][92]++; + if (dtd.$cdata[node.tagName]) { + _$jscoverage['core/filternode.js'][93]++; + node.parentNode.removeChild(node); + } + else { + _$jscoverage['core/filternode.js'][95]++; + var parentNode = node.parentNode, index = node.getIndex(); + _$jscoverage['core/filternode.js'][97]++; + node.parentNode.removeChild(node, true); + _$jscoverage['core/filternode.js'][98]++; + for (var i = index, ci = ci; (ci = parentNode.children[i]);) { + _$jscoverage['core/filternode.js'][99]++; + filterNode(ci, rules); + _$jscoverage['core/filternode.js'][100]++; + if (ci.parentNode) { + _$jscoverage['core/filternode.js'][101]++; + (i++); + } +} + } + } + _$jscoverage['core/filternode.js'][106]++; + break; + case "comment": + _$jscoverage['core/filternode.js'][108]++; + node.parentNode.removeChild(node); + } +} + _$jscoverage['core/filternode.js'][112]++; + return (function (root, rules) { + _$jscoverage['core/filternode.js'][113]++; + if (utils.isEmptyObject(rules)) { + _$jscoverage['core/filternode.js'][114]++; + return root; + } + _$jscoverage['core/filternode.js'][116]++; + var val; + _$jscoverage['core/filternode.js'][117]++; + if ((val = rules["-"])) { + _$jscoverage['core/filternode.js'][118]++; + utils.each(val.split(" "), (function (k) { + _$jscoverage['core/filternode.js'][119]++; + rules[k] = "-"; +})); + } + _$jscoverage['core/filternode.js'][122]++; + for (var i = 0, ci; (ci = root.children[i]);) { + _$jscoverage['core/filternode.js'][123]++; + filterNode(ci, rules); + _$jscoverage['core/filternode.js'][124]++; + if (ci.parentNode) { + _$jscoverage['core/filternode.js'][125]++; + (i++); + } +} + _$jscoverage['core/filternode.js'][128]++; + return root; +}); +})()); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/core/filterword.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/core/filterword.js new file mode 100644 index 000000000..44e9086c6 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/core/filterword.js @@ -0,0 +1,266 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['core/filterword.js']) { + _$jscoverage['core/filterword.js'] = []; + _$jscoverage['core/filterword.js'][23] = 0; + _$jscoverage['core/filterword.js'][26] = 0; + _$jscoverage['core/filterword.js'][27] = 0; + _$jscoverage['core/filterword.js'][30] = 0; + _$jscoverage['core/filterword.js'][31] = 0; + _$jscoverage['core/filterword.js'][32] = 0; + _$jscoverage['core/filterword.js'][34] = 0; + _$jscoverage['core/filterword.js'][37] = 0; + _$jscoverage['core/filterword.js'][38] = 0; + _$jscoverage['core/filterword.js'][43] = 0; + _$jscoverage['core/filterword.js'][44] = 0; + _$jscoverage['core/filterword.js'][46] = 0; + _$jscoverage['core/filterword.js'][47] = 0; + _$jscoverage['core/filterword.js'][50] = 0; + _$jscoverage['core/filterword.js'][52] = 0; + _$jscoverage['core/filterword.js'][64] = 0; + _$jscoverage['core/filterword.js'][70] = 0; + _$jscoverage['core/filterword.js'][76] = 0; + _$jscoverage['core/filterword.js'][78] = 0; + _$jscoverage['core/filterword.js'][81] = 0; + _$jscoverage['core/filterword.js'][82] = 0; + _$jscoverage['core/filterword.js'][83] = 0; + _$jscoverage['core/filterword.js'][84] = 0; + _$jscoverage['core/filterword.js'][88] = 0; + _$jscoverage['core/filterword.js'][91] = 0; + _$jscoverage['core/filterword.js'][108] = 0; + _$jscoverage['core/filterword.js'][109] = 0; + _$jscoverage['core/filterword.js'][110] = 0; + _$jscoverage['core/filterword.js'][112] = 0; + _$jscoverage['core/filterword.js'][113] = 0; + _$jscoverage['core/filterword.js'][116] = 0; + _$jscoverage['core/filterword.js'][117] = 0; + _$jscoverage['core/filterword.js'][121] = 0; + _$jscoverage['core/filterword.js'][122] = 0; + _$jscoverage['core/filterword.js'][126] = 0; + _$jscoverage['core/filterword.js'][127] = 0; + _$jscoverage['core/filterword.js'][130] = 0; + _$jscoverage['core/filterword.js'][131] = 0; + _$jscoverage['core/filterword.js'][134] = 0; + _$jscoverage['core/filterword.js'][135] = 0; + _$jscoverage['core/filterword.js'][138] = 0; + _$jscoverage['core/filterword.js'][139] = 0; + _$jscoverage['core/filterword.js'][142] = 0; + _$jscoverage['core/filterword.js'][143] = 0; + _$jscoverage['core/filterword.js'][145] = 0; + _$jscoverage['core/filterword.js'][147] = 0; + _$jscoverage['core/filterword.js'][148] = 0; + _$jscoverage['core/filterword.js'][150] = 0; + _$jscoverage['core/filterword.js'][152] = 0; + _$jscoverage['core/filterword.js'][154] = 0; + _$jscoverage['core/filterword.js'][155] = 0; + _$jscoverage['core/filterword.js'][160] = 0; + _$jscoverage['core/filterword.js'][164] = 0; + _$jscoverage['core/filterword.js'][167] = 0; + _$jscoverage['core/filterword.js'][170] = 0; + _$jscoverage['core/filterword.js'][173] = 0; + _$jscoverage['core/filterword.js'][178] = 0; + _$jscoverage['core/filterword.js'][179] = 0; +} +_$jscoverage['core/filterword.js'].source = ["/**"," * UE过滤word的静态方法"," * @file"," */","","/**"," * UEditor公用空间,UEditor所有的功能都挂载在该空间下"," * @module UE"," */","","","/**"," * 根据传入html字符串过滤word"," * @module UE"," * @since 1.2.6.1"," * @method filterWord"," * @param { String } html html字符串"," * @example"," * ```javascript"," * UE.filterWord(html);"," * ```"," */","var filterWord = UE.filterWord = function () {",""," //是否是word过来的内容"," function isWordDocument( str ) {"," return /(class=\"?Mso|style=\"[^\"]*\\bmso\\-|w:WordDocument|<v:)/ig.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( /<!--[\\s\\S]*?-->/ig, \"\" )"," //转换图片"," .replace(/<v:shape [^>]*>[\\s\\S]*?.<\\/v:shape>/gi,function(str){"," //opera能自己解析出image所这里直接返回空"," if(browser.opera){"," return '';"," }"," try{"," 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 '<img width=\"'+ transUnit(width) +'\" height=\"'+transUnit(height) +'\" src=\"' + src + '\" />';"," } 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( /<p [^>]*class=\"?MsoHeading\"?[^>]*>(.*?)<\\/p>/gi, \"<p><strong>$1</strong></p>\" )"," //去掉多余的属性"," .replace( /\\s+(class|lang|align)\\s*=\\s*(['\"]?)([\\w-]+)\\2/ig, function(str,name,marks,val){"," //保留list的标示"," return name == 'class' && val == 'MsoListParagraph' ? str : ''"," })"," //清除多余的font/span不能匹配&nbsp;有可能是空格"," .replace( /<(font|span)[^>]*>\\s*<\\/\\1>/gi, '' )"," //处理style的问题"," .replace( /(<[a-z][^>]*)\\sstyle=([\"'])([^\\2]*?)\\2/gi, function( str, tag, tmp, style ) {"," var n = [],"," s = style.replace( /^\\s+|\\s+$/, '' )"," .replace(/&#39;/g,'\\'')"," .replace( /&quot;/gi, \"'\" )"," .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(!/<table/.test(tag))"," n[i] = name.replace( /^mso-|-alt$/g, \"\" ) + \":\" + transUnit( value );"," continue;"," case \"horiz-align\":"," n[i] = \"text-align:\" + value;"," continue;",""," case \"vert-align\":"," n[i] = \"vertical-align:\" + value;"," continue;",""," case \"font-color\":"," case \"mso-foreground\":"," n[i] = \"color:\" + value;"," continue;",""," case \"mso-background\":"," case \"mso-highlight\":"," n[i] = \"background:\" + value;"," continue;",""," case \"mso-default-height\":"," n[i] = \"min-height:\" + transUnit( value );"," continue;",""," case \"mso-default-width\":"," n[i] = \"min-width:\" + transUnit( value );"," continue;",""," case \"mso-padding-between-alt\":"," n[i] = \"border-collapse:separate;border-spacing:\" + transUnit( value );"," continue;",""," case \"text-line-through\":"," if ( (value == \"single\") || (value == \"double\") ) {"," n[i] = \"text-decoration:line-through\";"," }"," continue;"," case \"mso-zero-height\":"," if ( value == \"yes\" ) {"," n[i] = \"display:none\";"," }"," continue;"," case 'background':"," break;"," case 'margin':"," if ( !/[1-9]/.test( value ) ) {"," continue;"," }",""," }",""," if ( /^(mso|column|font-emph|lang|layout|line-break|list-image|nav|panose|punct|row|ruby|sep|size|src|tab-|table-border|text-(?:decor|trans)|top-bar|version|vnd|word-break)/.test( name )"," ||"," /text\\-indent|padding|margin/.test(name) && /\\-[\\d.]+/.test(value)"," ) {"," continue;"," }",""," n[i] = name + \":\" + parts[1];"," }"," }"," return tag + (n.length ? ' style=\"' + n.join( ';').replace(/;{2,}/g,';') + '\"' : '');"," })"," .replace(/[\\d.]+(cm|pt)/g,function(str){"," return utils.transUnitToPx(str)"," })",""," }",""," return function ( html ) {"," return (isWordDocument( html ) ? filterPasteWord( html ) : html);"," };","}();"]; +_$jscoverage['core/filterword.js'][23]++; +var filterWord = (UE.filterWord = (function () { + _$jscoverage['core/filterword.js'][26]++; + function isWordDocument(str) { + _$jscoverage['core/filterword.js'][27]++; + return /(class="?Mso|style="[^"]*\bmso\-|w:WordDocument|/gi, "").replace(/]*>[\s\S]*?.<\/v:shape>/gi, (function (str) { + _$jscoverage['core/filterword.js'][43]++; + if (browser.opera) { + _$jscoverage['core/filterword.js'][44]++; + return ""; + } + _$jscoverage['core/filterword.js'][46]++; + try { + _$jscoverage['core/filterword.js'][47]++; + 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]; + _$jscoverage['core/filterword.js'][50]++; + return (""); + } + catch (e) { + _$jscoverage['core/filterword.js'][52]++; + 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 (str, name, marks, val) { + _$jscoverage['core/filterword.js'][64]++; + return (((name == "class") && (val == "MsoListParagraph"))? str: ""); +})).replace(/<(font|span)[^>]*>\s*<\/\1>/gi, "").replace(/(<[a-z][^>]*)\sstyle=(["'])([^\2]*?)\2/gi, (function (str, tag, tmp, style) { + _$jscoverage['core/filterword.js'][70]++; + var n = [], s = style.replace(/^\s+|\s+$/, "").replace(/'/g, "'").replace(/"/gi, "'").split(/;\s*/g); + _$jscoverage['core/filterword.js'][76]++; + for (var i = 0, v; (v = s[i]); (i++)) { + _$jscoverage['core/filterword.js'][78]++; + var name, value, parts = v.split(":"); + _$jscoverage['core/filterword.js'][81]++; + if ((parts.length == 2)) { + _$jscoverage['core/filterword.js'][82]++; + name = parts[0].toLowerCase(); + _$jscoverage['core/filterword.js'][83]++; + value = parts[1].toLowerCase(); + _$jscoverage['core/filterword.js'][84]++; + if (((/^(background)\w*/.test(name) && (value.replace(/(initial|\s)/g, "").length == 0)) || (/^(margin)\w*/.test(name) && /^0\w+$/.test(value)))) { + _$jscoverage['core/filterword.js'][88]++; + continue; + } + _$jscoverage['core/filterword.js'][91]++; + 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": + case "mso-height": + case "mso-width": + case "mso-vertical-align-alt": + _$jscoverage['core/filterword.js'][108]++; + if ((! //**"," * 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等空白字符"," * @example"," * ```javascript"," * var root = UE.htmlparser('<p><b>htmlparser</b></p>', true);"," * ```"," */","","var htmlparser = UE.htmlparser =function(htmlstr,ignoreBlank){"," var re_tag =/<(?:(?:\\/([^>]+)>)|(?:!--([\\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?'':' ')+']*<\\/?(\\\\w+)\\\\s*(?:[^>]*)>[\\\\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 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()]= utils.unhtml(match[2]|| match[3]|| match[4])"," }"," elm.attrs = attrs;"," }",""," 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]){"," //start tag"," currentParent = element(currentParent, match[3].toLowerCase(), match[4]);",""," }elseif(match[1]){"," if(currentParent.type !='root'){"," 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;"," }",""," }elseif(match[2]){"," //comment"," comment(currentParent, match[2])"," }"," }catch(e){}",""," nextIndex = re_tag.lastIndex;",""," }"," //如果结束是文本,就有可能丢掉,所以这里手动判断一下"," //例如 <li>sdfsdfsdf<li>sdfsdfsdfsdf"," if(nextIndex < htmlstr.length){"," text(currentParent, htmlstr.slice(nextIndex));"," }"," return root;","};"]; +_$jscoverage['core/htmlparser.js'][25]++; +var htmlparser = (UE.htmlparser = (function (htmlstr, ignoreBlank) { + _$jscoverage['core/htmlparser.js'][26]++; + var re_tag = /<(?:(?:\/([^>]+)>)|(?:!--([\S|\s]*?)-->)|(?:([^\s\/>]+)\s*((?:(?:"[^"]*")|(?:'[^']*')|[^"'<>])*)\/?>))/g, re_attr = /([\w\-:.]+)(?:(?:\s*=\s*(?:(?:"([^"]*)")|(?:'([^']*)')|([^\s>]+)))|(?=\s|$))/g; + _$jscoverage['core/htmlparser.js'][30]++; + 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}; + _$jscoverage['core/htmlparser.js'][34]++; + htmlstr = htmlstr.replace(new RegExp(domUtils.fillChar, "g"), ""); + _$jscoverage['core/htmlparser.js'][35]++; + if ((! ignoreBlank)) { + _$jscoverage['core/htmlparser.js'][36]++; + htmlstr = htmlstr.replace(new RegExp(("[\\r\\t\\n" + (ignoreBlank? "": " ") + "]*]*)>[\\r\\t\\n" + (ignoreBlank? "": " ") + "]*"), "g"), (function (a, b) { + _$jscoverage['core/htmlparser.js'][38]++; + if ((b && allowEmptyTags[b.toLowerCase()])) { + _$jscoverage['core/htmlparser.js'][39]++; + return a.replace(/(^[\n\r]+)|([\n\r]+$)/g, ""); + } + _$jscoverage['core/htmlparser.js'][41]++; + return a.replace(new RegExp(("^[\\r\\n" + (ignoreBlank? "": " ") + "]+")), "").replace(new RegExp(("[\\r\\n" + (ignoreBlank? "": " ") + "]+$")), ""); +})); + } + _$jscoverage['core/htmlparser.js'][46]++; + 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"}; + _$jscoverage['core/htmlparser.js'][65]++; + function text(parent, data) { + _$jscoverage['core/htmlparser.js'][67]++; + if (needChild[parent.tagName]) { + _$jscoverage['core/htmlparser.js'][68]++; + var tmpNode = uNode.createElement(needChild[parent.tagName]); + _$jscoverage['core/htmlparser.js'][69]++; + parent.appendChild(tmpNode); + _$jscoverage['core/htmlparser.js'][70]++; + tmpNode.appendChild(uNode.createText(data)); + _$jscoverage['core/htmlparser.js'][71]++; + parent = tmpNode; + } + else { + _$jscoverage['core/htmlparser.js'][74]++; + parent.appendChild(uNode.createText(data)); + } +} + _$jscoverage['core/htmlparser.js'][78]++; + function element(parent, tagName, htmlattr) { + _$jscoverage['core/htmlparser.js'][79]++; + var needParentTag; + _$jscoverage['core/htmlparser.js'][80]++; + if ((needParentTag = needParentNode[tagName])) { + _$jscoverage['core/htmlparser.js'][81]++; + var tmpParent = parent, hasParent; + _$jscoverage['core/htmlparser.js'][82]++; + while ((tmpParent.type != "root")) { + _$jscoverage['core/htmlparser.js'][83]++; + if ((utils.isArray(needParentTag)? (utils.indexOf(needParentTag, tmpParent.tagName) != -1): (needParentTag == tmpParent.tagName))) { + _$jscoverage['core/htmlparser.js'][84]++; + parent = tmpParent; + _$jscoverage['core/htmlparser.js'][85]++; + hasParent = true; + _$jscoverage['core/htmlparser.js'][86]++; + break; + } + _$jscoverage['core/htmlparser.js'][88]++; + tmpParent = tmpParent.parentNode; +} + _$jscoverage['core/htmlparser.js'][90]++; + if ((! hasParent)) { + _$jscoverage['core/htmlparser.js'][91]++; + parent = element(parent, (utils.isArray(needParentTag)? needParentTag[0]: needParentTag)); + } + } + _$jscoverage['core/htmlparser.js'][97]++; + var elm = new uNode({parentNode: parent, type: "element", tagName: tagName.toLowerCase(), children: (dtd.$empty[tagName]? null: [])}); + _$jscoverage['core/htmlparser.js'][105]++; + if (htmlattr) { + _$jscoverage['core/htmlparser.js'][106]++; + var attrs = {}, match; + _$jscoverage['core/htmlparser.js'][107]++; + while ((match = re_attr.exec(htmlattr))) { + _$jscoverage['core/htmlparser.js'][108]++; + attrs[match[1].toLowerCase()] = utils.unhtml((match[2] || match[3] || match[4])); +} + _$jscoverage['core/htmlparser.js'][110]++; + elm.attrs = attrs; + } + _$jscoverage['core/htmlparser.js'][113]++; + parent.children.push(elm); + _$jscoverage['core/htmlparser.js'][115]++; + return (dtd.$empty[tagName]? parent: elm); +} + _$jscoverage['core/htmlparser.js'][118]++; + function comment(parent, data) { + _$jscoverage['core/htmlparser.js'][119]++; + parent.children.push(new uNode({type: "comment", data: data, parentNode: parent})); +} + _$jscoverage['core/htmlparser.js'][126]++; + var match, currentIndex = 0, nextIndex = 0; + _$jscoverage['core/htmlparser.js'][128]++; + var root = new uNode({type: "root", children: []}); + _$jscoverage['core/htmlparser.js'][132]++; + var currentParent = root; + _$jscoverage['core/htmlparser.js'][133]++; + while ((match = re_tag.exec(htmlstr))) { + _$jscoverage['core/htmlparser.js'][134]++; + currentIndex = match.index; + _$jscoverage['core/htmlparser.js'][135]++; + try { + _$jscoverage['core/htmlparser.js'][136]++; + if ((currentIndex > nextIndex)) { + _$jscoverage['core/htmlparser.js'][138]++; + text(currentParent, htmlstr.slice(nextIndex, currentIndex)); + } + _$jscoverage['core/htmlparser.js'][140]++; + if (match[3]) { + _$jscoverage['core/htmlparser.js'][142]++; + currentParent = element(currentParent, match[3].toLowerCase(), match[4]); + } + else { + _$jscoverage['core/htmlparser.js'][144]++; + if (match[1]) { + _$jscoverage['core/htmlparser.js'][145]++; + if ((currentParent.type != "root")) { + _$jscoverage['core/htmlparser.js'][146]++; + var tmpParent = currentParent; + _$jscoverage['core/htmlparser.js'][147]++; + while (((currentParent.type == "element") && (currentParent.tagName != match[1].toLowerCase()))) { + _$jscoverage['core/htmlparser.js'][148]++; + currentParent = currentParent.parentNode; + _$jscoverage['core/htmlparser.js'][149]++; + if ((currentParent.type == "root")) { + _$jscoverage['core/htmlparser.js'][150]++; + currentParent = tmpParent; + _$jscoverage['core/htmlparser.js'][151]++; + throw "break"; + } +} + _$jscoverage['core/htmlparser.js'][155]++; + currentParent = currentParent.parentNode; + } + } + else { + _$jscoverage['core/htmlparser.js'][158]++; + if (match[2]) { + _$jscoverage['core/htmlparser.js'][160]++; + comment(currentParent, match[2]); + } + } + } + } + catch (e) { + } + _$jscoverage['core/htmlparser.js'][164]++; + nextIndex = re_tag.lastIndex; +} + _$jscoverage['core/htmlparser.js'][169]++; + if ((nextIndex < htmlstr.length)) { + _$jscoverage['core/htmlparser.js'][170]++; + text(currentParent, htmlstr.slice(nextIndex)); + } + _$jscoverage['core/htmlparser.js'][172]++; + return root; +})); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/core/node.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/core/node.js new file mode 100644 index 000000000..3c76035f0 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/core/node.js @@ -0,0 +1,874 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['core/node.js']) { + _$jscoverage['core/node.js'] = []; + _$jscoverage['core/node.js'][15] = 0; + _$jscoverage['core/node.js'][37] = 0; + _$jscoverage['core/node.js'][38] = 0; + _$jscoverage['core/node.js'][39] = 0; + _$jscoverage['core/node.js'][40] = 0; + _$jscoverage['core/node.js'][41] = 0; + _$jscoverage['core/node.js'][42] = 0; + _$jscoverage['core/node.js'][43] = 0; + _$jscoverage['core/node.js'][45] = 0; + _$jscoverage['core/node.js'][48] = 0; + _$jscoverage['core/node.js'][49] = 0; + _$jscoverage['core/node.js'][50] = 0; + _$jscoverage['core/node.js'][53] = 0; + _$jscoverage['core/node.js'][55] = 0; + _$jscoverage['core/node.js'][56] = 0; + _$jscoverage['core/node.js'][62] = 0; + _$jscoverage['core/node.js'][63] = 0; + _$jscoverage['core/node.js'][64] = 0; + _$jscoverage['core/node.js'][66] = 0; + _$jscoverage['core/node.js'][73] = 0; + _$jscoverage['core/node.js'][74] = 0; + _$jscoverage['core/node.js'][79] = 0; + _$jscoverage['core/node.js'][80] = 0; + _$jscoverage['core/node.js'][82] = 0; + _$jscoverage['core/node.js'][84] = 0; + _$jscoverage['core/node.js'][85] = 0; + _$jscoverage['core/node.js'][86] = 0; + _$jscoverage['core/node.js'][88] = 0; + _$jscoverage['core/node.js'][90] = 0; + _$jscoverage['core/node.js'][92] = 0; + _$jscoverage['core/node.js'][93] = 0; + _$jscoverage['core/node.js'][95] = 0; + _$jscoverage['core/node.js'][96] = 0; + _$jscoverage['core/node.js'][98] = 0; + _$jscoverage['core/node.js'][100] = 0; + _$jscoverage['core/node.js'][103] = 0; + _$jscoverage['core/node.js'][104] = 0; + _$jscoverage['core/node.js'][107] = 0; + _$jscoverage['core/node.js'][108] = 0; + _$jscoverage['core/node.js'][109] = 0; + _$jscoverage['core/node.js'][110] = 0; + _$jscoverage['core/node.js'][111] = 0; + _$jscoverage['core/node.js'][112] = 0; + _$jscoverage['core/node.js'][113] = 0; + _$jscoverage['core/node.js'][115] = 0; + _$jscoverage['core/node.js'][117] = 0; + _$jscoverage['core/node.js'][122] = 0; + _$jscoverage['core/node.js'][123] = 0; + _$jscoverage['core/node.js'][124] = 0; + _$jscoverage['core/node.js'][125] = 0; + _$jscoverage['core/node.js'][129] = 0; + _$jscoverage['core/node.js'][130] = 0; + _$jscoverage['core/node.js'][131] = 0; + _$jscoverage['core/node.js'][132] = 0; + _$jscoverage['core/node.js'][133] = 0; + _$jscoverage['core/node.js'][135] = 0; + _$jscoverage['core/node.js'][138] = 0; + _$jscoverage['core/node.js'][139] = 0; + _$jscoverage['core/node.js'][141] = 0; + _$jscoverage['core/node.js'][142] = 0; + _$jscoverage['core/node.js'][143] = 0; + _$jscoverage['core/node.js'][146] = 0; + _$jscoverage['core/node.js'][151] = 0; + _$jscoverage['core/node.js'][152] = 0; + _$jscoverage['core/node.js'][155] = 0; + _$jscoverage['core/node.js'][156] = 0; + _$jscoverage['core/node.js'][157] = 0; + _$jscoverage['core/node.js'][158] = 0; + _$jscoverage['core/node.js'][160] = 0; + _$jscoverage['core/node.js'][161] = 0; + _$jscoverage['core/node.js'][162] = 0; + _$jscoverage['core/node.js'][163] = 0; + _$jscoverage['core/node.js'][169] = 0; + _$jscoverage['core/node.js'][170] = 0; + _$jscoverage['core/node.js'][171] = 0; + _$jscoverage['core/node.js'][173] = 0; + _$jscoverage['core/node.js'][174] = 0; + _$jscoverage['core/node.js'][175] = 0; + _$jscoverage['core/node.js'][180] = 0; + _$jscoverage['core/node.js'][181] = 0; + _$jscoverage['core/node.js'][182] = 0; + _$jscoverage['core/node.js'][183] = 0; + _$jscoverage['core/node.js'][185] = 0; + _$jscoverage['core/node.js'][186] = 0; + _$jscoverage['core/node.js'][187] = 0; + _$jscoverage['core/node.js'][189] = 0; + _$jscoverage['core/node.js'][193] = 0; + _$jscoverage['core/node.js'][198] = 0; + _$jscoverage['core/node.js'][221] = 0; + _$jscoverage['core/node.js'][222] = 0; + _$jscoverage['core/node.js'][223] = 0; + _$jscoverage['core/node.js'][249] = 0; + _$jscoverage['core/node.js'][250] = 0; + _$jscoverage['core/node.js'][252] = 0; + _$jscoverage['core/node.js'][253] = 0; + _$jscoverage['core/node.js'][254] = 0; + _$jscoverage['core/node.js'][255] = 0; + _$jscoverage['core/node.js'][258] = 0; + _$jscoverage['core/node.js'][259] = 0; + _$jscoverage['core/node.js'][260] = 0; + _$jscoverage['core/node.js'][261] = 0; + _$jscoverage['core/node.js'][262] = 0; + _$jscoverage['core/node.js'][264] = 0; + _$jscoverage['core/node.js'][266] = 0; + _$jscoverage['core/node.js'][270] = 0; + _$jscoverage['core/node.js'][297] = 0; + _$jscoverage['core/node.js'][298] = 0; + _$jscoverage['core/node.js'][300] = 0; + _$jscoverage['core/node.js'][301] = 0; + _$jscoverage['core/node.js'][302] = 0; + _$jscoverage['core/node.js'][303] = 0; + _$jscoverage['core/node.js'][306] = 0; + _$jscoverage['core/node.js'][307] = 0; + _$jscoverage['core/node.js'][308] = 0; + _$jscoverage['core/node.js'][310] = 0; + _$jscoverage['core/node.js'][324] = 0; + _$jscoverage['core/node.js'][325] = 0; + _$jscoverage['core/node.js'][326] = 0; + _$jscoverage['core/node.js'][342] = 0; + _$jscoverage['core/node.js'][358] = 0; + _$jscoverage['core/node.js'][371] = 0; + _$jscoverage['core/node.js'][372] = 0; + _$jscoverage['core/node.js'][373] = 0; + _$jscoverage['core/node.js'][374] = 0; + _$jscoverage['core/node.js'][390] = 0; + _$jscoverage['core/node.js'][391] = 0; + _$jscoverage['core/node.js'][392] = 0; + _$jscoverage['core/node.js'][393] = 0; + _$jscoverage['core/node.js'][410] = 0; + _$jscoverage['core/node.js'][411] = 0; + _$jscoverage['core/node.js'][412] = 0; + _$jscoverage['core/node.js'][414] = 0; + _$jscoverage['core/node.js'][415] = 0; + _$jscoverage['core/node.js'][416] = 0; + _$jscoverage['core/node.js'][417] = 0; + _$jscoverage['core/node.js'][418] = 0; + _$jscoverage['core/node.js'][419] = 0; + _$jscoverage['core/node.js'][436] = 0; + _$jscoverage['core/node.js'][437] = 0; + _$jscoverage['core/node.js'][438] = 0; + _$jscoverage['core/node.js'][440] = 0; + _$jscoverage['core/node.js'][441] = 0; + _$jscoverage['core/node.js'][443] = 0; + _$jscoverage['core/node.js'][444] = 0; + _$jscoverage['core/node.js'][445] = 0; + _$jscoverage['core/node.js'][446] = 0; + _$jscoverage['core/node.js'][449] = 0; + _$jscoverage['core/node.js'][450] = 0; + _$jscoverage['core/node.js'][451] = 0; + _$jscoverage['core/node.js'][469] = 0; + _$jscoverage['core/node.js'][470] = 0; + _$jscoverage['core/node.js'][471] = 0; + _$jscoverage['core/node.js'][473] = 0; + _$jscoverage['core/node.js'][474] = 0; + _$jscoverage['core/node.js'][475] = 0; + _$jscoverage['core/node.js'][476] = 0; + _$jscoverage['core/node.js'][477] = 0; + _$jscoverage['core/node.js'][496] = 0; + _$jscoverage['core/node.js'][497] = 0; + _$jscoverage['core/node.js'][498] = 0; + _$jscoverage['core/node.js'][500] = 0; + _$jscoverage['core/node.js'][501] = 0; + _$jscoverage['core/node.js'][502] = 0; + _$jscoverage['core/node.js'][503] = 0; + _$jscoverage['core/node.js'][504] = 0; + _$jscoverage['core/node.js'][523] = 0; + _$jscoverage['core/node.js'][524] = 0; + _$jscoverage['core/node.js'][525] = 0; + _$jscoverage['core/node.js'][526] = 0; + _$jscoverage['core/node.js'][527] = 0; + _$jscoverage['core/node.js'][528] = 0; + _$jscoverage['core/node.js'][529] = 0; + _$jscoverage['core/node.js'][530] = 0; + _$jscoverage['core/node.js'][531] = 0; + _$jscoverage['core/node.js'][535] = 0; + _$jscoverage['core/node.js'][552] = 0; + _$jscoverage['core/node.js'][567] = 0; + _$jscoverage['core/node.js'][568] = 0; + _$jscoverage['core/node.js'][569] = 0; + _$jscoverage['core/node.js'][571] = 0; + _$jscoverage['core/node.js'][572] = 0; + _$jscoverage['core/node.js'][574] = 0; + _$jscoverage['core/node.js'][575] = 0; + _$jscoverage['core/node.js'][576] = 0; + _$jscoverage['core/node.js'][577] = 0; + _$jscoverage['core/node.js'][579] = 0; + _$jscoverage['core/node.js'][583] = 0; + _$jscoverage['core/node.js'][584] = 0; + _$jscoverage['core/node.js'][586] = 0; + _$jscoverage['core/node.js'][602] = 0; + _$jscoverage['core/node.js'][603] = 0; + _$jscoverage['core/node.js'][604] = 0; + _$jscoverage['core/node.js'][605] = 0; + _$jscoverage['core/node.js'][608] = 0; + _$jscoverage['core/node.js'][622] = 0; + _$jscoverage['core/node.js'][623] = 0; + _$jscoverage['core/node.js'][624] = 0; + _$jscoverage['core/node.js'][625] = 0; + _$jscoverage['core/node.js'][626] = 0; + _$jscoverage['core/node.js'][643] = 0; + _$jscoverage['core/node.js'][644] = 0; + _$jscoverage['core/node.js'][645] = 0; + _$jscoverage['core/node.js'][646] = 0; + _$jscoverage['core/node.js'][647] = 0; + _$jscoverage['core/node.js'][648] = 0; + _$jscoverage['core/node.js'][652] = 0; + _$jscoverage['core/node.js'][666] = 0; + _$jscoverage['core/node.js'][667] = 0; + _$jscoverage['core/node.js'][668] = 0; + _$jscoverage['core/node.js'][670] = 0; + _$jscoverage['core/node.js'][671] = 0; + _$jscoverage['core/node.js'][672] = 0; + _$jscoverage['core/node.js'][673] = 0; + _$jscoverage['core/node.js'][675] = 0; + _$jscoverage['core/node.js'][689] = 0; + _$jscoverage['core/node.js'][690] = 0; + _$jscoverage['core/node.js'][691] = 0; + _$jscoverage['core/node.js'][692] = 0; + _$jscoverage['core/node.js'][693] = 0; + _$jscoverage['core/node.js'][698] = 0; + _$jscoverage['core/node.js'][699] = 0; + _$jscoverage['core/node.js'][700] = 0; + _$jscoverage['core/node.js'][702] = 0; + _$jscoverage['core/node.js'][703] = 0; + _$jscoverage['core/node.js'][704] = 0; + _$jscoverage['core/node.js'][707] = 0; + _$jscoverage['core/node.js'][709] = 0; + _$jscoverage['core/node.js'][724] = 0; + _$jscoverage['core/node.js'][725] = 0; + _$jscoverage['core/node.js'][727] = 0; +} +_$jscoverage['core/node.js'].source = ["/**"," * 编辑器模拟的节点类"," * @file"," * @module UE"," * @class uNode"," * @since 1.2.6.1"," */","","/**"," * UEditor公用空间,UEditor所有的功能都挂载在该空间下"," * @unfile"," * @module UE"," */","","(function(){",""," /**"," * 编辑器模拟的节点类"," * @unfile"," * @module UE"," * @class uNode"," */",""," /**"," * 通过一个键值对,创建一个uNode对象"," * @constructor"," * @param { KeyValueMap } 传入要创建的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 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{"," returnnew uNode({"," type:'element',"," children:[],"," tagName: html"," })"," }"," };"," uNode.createText =function(data){"," returnnew UE.uNode({"," type:'text',"," '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){"," arr.push(node.parentNode.tagName =='pre'? node.data : node.data.replace(/[ ]{2}/g,' &nbsp;'))"," }",""," function isElement(node, arr, formatter, current){"," var attrhtml ='';"," if(node.attrs){"," attrhtml =[];"," var attrs = node.attrs;"," for(var a in attrs){"," attrhtml.push(a +(attrs[a]!== undefined ?'=\"'+ 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('<\\/'+ node.tagName +'>');"," }",""," }",""," function isComment(node, arr){"," arr.push('<!--'+ node.data +'-->');"," }",""," 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();"," * ```"," */"," 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('<span>text</span>');"," * ```"," */"," innerHTML:function(htmlstr){"," if(this.type !='element'|| dtd.$empty[this.tagName]){"," returnthis;"," }"," 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;"," }"," returnthis;"," }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('<span>text</span>');"," * ```"," */"," innerText:function(textStr){"," if(this.type !='element'|| dtd.$empty[this.tagName]){"," returnthis;"," }"," if(textStr){"," if(this.children){"," for(var i =0, ci; ci =this.children[i++];){"," ci.parentNode =null;"," }"," }"," this.children =[];"," this.appendChild(uNode.createText(textStr));"," returnthis;"," }else{"," returnthis.toHtml().replace(/<[^>]+>/g,'');"," }"," },",""," /**"," * 获取当前对象的data属性"," * @method getData"," * @return { KeyValueMap } 若节点的type值是elemenet,返回空字符串,否则返回节点的data属性"," * @example"," * ```javascript"," * node.getData();"," * ```"," */"," getData:function(){"," if(this.type =='element')"," return'';"," returnthis.data"," },",""," /**"," * 获取当前节点下的第一个子节点"," * @method firstChild"," * @return { UE.uNode } 返回第一个子节点"," * @example"," * ```javascript"," * node.firstChild(); //返回第一个子节点"," * ```"," */"," firstChild:function(){","// if (this.type != 'element' || dtd.$empty[this.tagName]) {","// return this;","// }"," returnthis.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;","// }"," returnthis.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){"," returnthis.attrs &&this.attrs[attrName.toLowerCase()]"," },",""," /**"," * 设置当前节点所代表的元素属性,即设置attrs对象下的属性值"," * @method getAttr"," * @param { String } attrName 要设置的属性名称"," * @param { * } attrVal 要设置的属性值,类型视设置的属性而定"," * @return { * } 返回attrs对象下的属性值"," * @example"," * ```javascript"," * node.setAttr('title','标题');"," * ```"," */"," setAttr:function(attrName, attrVal){"," if(!attrName){"," deletethis.attrs;"," return;"," }"," if(!this.attrs){"," this.attrs ={};"," }"," if(utils.isObject(attrName)){"," for(var a in attrName){"," if(!attrName[a]){"," deletethis.attrs[a]"," }else{"," this.attrs[a.toLowerCase()]= attrName[a];"," }"," }"," }else{"," if(!attrVal){"," deletethis.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 getNodeById"," * @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(name +':([^;]+)','i');"," var match = cssStyle.match(reg);"," if(match && match[0]){"," return match[1]"," }"," 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(name +':([^;]+;?)','gi');"," cssStyle = cssStyle.replace(reg,'');"," 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);"," }"," returnthis;"," }"," }","})();"]; +_$jscoverage['core/node.js'][15]++; +(function () { + _$jscoverage['core/node.js'][37]++; + var uNode = (UE.uNode = (function (obj) { + _$jscoverage['core/node.js'][38]++; + this.type = obj.type; + _$jscoverage['core/node.js'][39]++; + this.data = obj.data; + _$jscoverage['core/node.js'][40]++; + this.tagName = obj.tagName; + _$jscoverage['core/node.js'][41]++; + this.parentNode = obj.parentNode; + _$jscoverage['core/node.js'][42]++; + this.attrs = (obj.attrs || {}); + _$jscoverage['core/node.js'][43]++; + this.children = obj.children; +})); + _$jscoverage['core/node.js'][45]++; + var indentChar = " ", breakChar = "\n"; + _$jscoverage['core/node.js'][48]++; + function insertLine(arr, current, begin) { + _$jscoverage['core/node.js'][49]++; + arr.push(breakChar); + _$jscoverage['core/node.js'][50]++; + return (current + (begin? 1: -1)); +} + _$jscoverage['core/node.js'][53]++; + function insertIndent(arr, current) { + _$jscoverage['core/node.js'][55]++; + for (var i = 0; (i < current); (i++)) { + _$jscoverage['core/node.js'][56]++; + arr.push(indentChar); +} +} + _$jscoverage['core/node.js'][62]++; + uNode.createElement = (function (html) { + _$jscoverage['core/node.js'][63]++; + if (/[<>]/.test(html)) { + _$jscoverage['core/node.js'][64]++; + return UE.htmlparser(html).children[0]; + } + else { + _$jscoverage['core/node.js'][66]++; + return new uNode({type: "element", children: [], tagName: html}); + } +}); + _$jscoverage['core/node.js'][73]++; + uNode.createText = (function (data) { + _$jscoverage['core/node.js'][74]++; + return new (UE.uNode)({type: "text", "data": utils.unhtml((data || ""))}); +}); + _$jscoverage['core/node.js'][79]++; + function nodeToHtml(node, arr, formatter, current) { + _$jscoverage['core/node.js'][80]++; + switch (node.type) { + case "root": + _$jscoverage['core/node.js'][82]++; + for (var i = 0, ci; (ci = node.children[(i++)]);) { + _$jscoverage['core/node.js'][84]++; + if ((formatter && (ci.type == "element") && (! dtd.$inlineWithA[ci.tagName]) && (i > 1))) { + _$jscoverage['core/node.js'][85]++; + insertLine(arr, current, true); + _$jscoverage['core/node.js'][86]++; + insertIndent(arr, current); + } + _$jscoverage['core/node.js'][88]++; + nodeToHtml(ci, arr, formatter, current); +} + _$jscoverage['core/node.js'][90]++; + break; + case "text": + _$jscoverage['core/node.js'][92]++; + isText(node, arr); + _$jscoverage['core/node.js'][93]++; + break; + case "element": + _$jscoverage['core/node.js'][95]++; + isElement(node, arr, formatter, current); + _$jscoverage['core/node.js'][96]++; + break; + case "comment": + _$jscoverage['core/node.js'][98]++; + isComment(node, arr, formatter); + } + _$jscoverage['core/node.js'][100]++; + return arr; +} + _$jscoverage['core/node.js'][103]++; + function isText(node, arr) { + _$jscoverage['core/node.js'][104]++; + arr.push(((node.parentNode.tagName == "pre")? node.data: node.data.replace(/[ ]{2}/g, "  "))); +} + _$jscoverage['core/node.js'][107]++; + function isElement(node, arr, formatter, current) { + _$jscoverage['core/node.js'][108]++; + var attrhtml = ""; + _$jscoverage['core/node.js'][109]++; + if (node.attrs) { + _$jscoverage['core/node.js'][110]++; + attrhtml = []; + _$jscoverage['core/node.js'][111]++; + var attrs = node.attrs; + _$jscoverage['core/node.js'][112]++; + for (var a in attrs) { + _$jscoverage['core/node.js'][113]++; + attrhtml.push((a + ((attrs[a] !== undefined)? ("=\"" + utils.unhtml(attrs[a]) + "\""): ""))); +} + _$jscoverage['core/node.js'][115]++; + attrhtml = attrhtml.join(" "); + } + _$jscoverage['core/node.js'][117]++; + arr.push(("<" + node.tagName + (attrhtml? (" " + attrhtml): "") + (dtd.$empty[node.tagName]? "/": "") + ">")); + _$jscoverage['core/node.js'][122]++; + if ((formatter && (! dtd.$inlineWithA[node.tagName]) && (node.tagName != "pre"))) { + _$jscoverage['core/node.js'][123]++; + if ((node.children && node.children.length)) { + _$jscoverage['core/node.js'][124]++; + current = insertLine(arr, current, true); + _$jscoverage['core/node.js'][125]++; + insertIndent(arr, current); + } + } + _$jscoverage['core/node.js'][129]++; + if ((node.children && node.children.length)) { + _$jscoverage['core/node.js'][130]++; + for (var i = 0, ci; (ci = node.children[(i++)]);) { + _$jscoverage['core/node.js'][131]++; + if ((formatter && (ci.type == "element") && (! dtd.$inlineWithA[ci.tagName]) && (i > 1))) { + _$jscoverage['core/node.js'][132]++; + insertLine(arr, current); + _$jscoverage['core/node.js'][133]++; + insertIndent(arr, current); + } + _$jscoverage['core/node.js'][135]++; + nodeToHtml(ci, arr, formatter, current); +} + } + _$jscoverage['core/node.js'][138]++; + if ((! dtd.$empty[node.tagName])) { + _$jscoverage['core/node.js'][139]++; + if ((formatter && (! dtd.$inlineWithA[node.tagName]) && (node.tagName != "pre"))) { + _$jscoverage['core/node.js'][141]++; + if ((node.children && node.children.length)) { + _$jscoverage['core/node.js'][142]++; + current = insertLine(arr, current); + _$jscoverage['core/node.js'][143]++; + insertIndent(arr, current); + } + } + _$jscoverage['core/node.js'][146]++; + arr.push(("")); + } +} + _$jscoverage['core/node.js'][151]++; + function isComment(node, arr) { + _$jscoverage['core/node.js'][152]++; + arr.push(("")); +} + _$jscoverage['core/node.js'][155]++; + function getNodeById(root, id) { + _$jscoverage['core/node.js'][156]++; + var node; + _$jscoverage['core/node.js'][157]++; + if (((root.type == "element") && (root.getAttr("id") == id))) { + _$jscoverage['core/node.js'][158]++; + return root; + } + _$jscoverage['core/node.js'][160]++; + if ((root.children && root.children.length)) { + _$jscoverage['core/node.js'][161]++; + for (var i = 0, ci; (ci = root.children[(i++)]);) { + _$jscoverage['core/node.js'][162]++; + if ((node = getNodeById(ci, id))) { + _$jscoverage['core/node.js'][163]++; + return node; + } +} + } +} + _$jscoverage['core/node.js'][169]++; + function getNodesByTagName(node, tagName, arr) { + _$jscoverage['core/node.js'][170]++; + if (((node.type == "element") && (node.tagName == tagName))) { + _$jscoverage['core/node.js'][171]++; + arr.push(node); + } + _$jscoverage['core/node.js'][173]++; + if ((node.children && node.children.length)) { + _$jscoverage['core/node.js'][174]++; + for (var i = 0, ci; (ci = node.children[(i++)]);) { + _$jscoverage['core/node.js'][175]++; + getNodesByTagName(ci, tagName, arr); +} + } +} + _$jscoverage['core/node.js'][180]++; + function nodeTraversal(root, fn) { + _$jscoverage['core/node.js'][181]++; + if ((root.children && root.children.length)) { + _$jscoverage['core/node.js'][182]++; + for (var i = 0, ci; (ci = root.children[i]);) { + _$jscoverage['core/node.js'][183]++; + nodeTraversal(ci, fn); + _$jscoverage['core/node.js'][185]++; + if (ci.parentNode) { + _$jscoverage['core/node.js'][186]++; + if ((ci.children && ci.children.length)) { + _$jscoverage['core/node.js'][187]++; + fn(ci); + } + _$jscoverage['core/node.js'][189]++; + if (ci.parentNode) { + _$jscoverage['core/node.js'][189]++; + (i++); + } + } +} + } + else { + _$jscoverage['core/node.js'][193]++; + fn(root); + } +} + _$jscoverage['core/node.js'][198]++; + uNode.prototype = {toHtml: (function (formatter) { + _$jscoverage['core/node.js'][221]++; + var arr = []; + _$jscoverage['core/node.js'][222]++; + nodeToHtml(this, arr, formatter, 0); + _$jscoverage['core/node.js'][223]++; + return arr.join(""); +}), innerHTML: (function (htmlstr) { + _$jscoverage['core/node.js'][249]++; + if (((this.type != "element") || dtd.$empty[this.tagName])) { + _$jscoverage['core/node.js'][250]++; + return this; + } + _$jscoverage['core/node.js'][252]++; + if (utils.isString(htmlstr)) { + _$jscoverage['core/node.js'][253]++; + if (this.children) { + _$jscoverage['core/node.js'][254]++; + for (var i = 0, ci; (ci = this.children[(i++)]);) { + _$jscoverage['core/node.js'][255]++; + ci.parentNode = null; +} + } + _$jscoverage['core/node.js'][258]++; + this.children = []; + _$jscoverage['core/node.js'][259]++; + var tmpRoot = UE.htmlparser(htmlstr); + _$jscoverage['core/node.js'][260]++; + for (var i = 0, ci = ci; (ci = tmpRoot.children[(i++)]);) { + _$jscoverage['core/node.js'][261]++; + this.children.push(ci); + _$jscoverage['core/node.js'][262]++; + ci.parentNode = this; +} + _$jscoverage['core/node.js'][264]++; + return this; + } + else { + _$jscoverage['core/node.js'][266]++; + var tmpRoot = new (UE.uNode)({type: "root", children: this.children}); + _$jscoverage['core/node.js'][270]++; + return tmpRoot.toHtml(); + } +}), innerText: (function (textStr) { + _$jscoverage['core/node.js'][297]++; + if (((this.type != "element") || dtd.$empty[this.tagName])) { + _$jscoverage['core/node.js'][298]++; + return this; + } + _$jscoverage['core/node.js'][300]++; + if (textStr) { + _$jscoverage['core/node.js'][301]++; + if (this.children) { + _$jscoverage['core/node.js'][302]++; + for (var i = 0, ci; (ci = this.children[(i++)]);) { + _$jscoverage['core/node.js'][303]++; + ci.parentNode = null; +} + } + _$jscoverage['core/node.js'][306]++; + this.children = []; + _$jscoverage['core/node.js'][307]++; + this.appendChild(uNode.createText(textStr)); + _$jscoverage['core/node.js'][308]++; + return this; + } + else { + _$jscoverage['core/node.js'][310]++; + return this.toHtml().replace(/<[^>]+>/g, ""); + } +}), getData: (function () { + _$jscoverage['core/node.js'][324]++; + if ((this.type == "element")) { + _$jscoverage['core/node.js'][325]++; + return ""; + } + _$jscoverage['core/node.js'][326]++; + return this.data; +}), firstChild: (function () { + _$jscoverage['core/node.js'][342]++; + return (this.children? this.children[0]: null); +}), lastChild: (function () { + _$jscoverage['core/node.js'][358]++; + return (this.children? this.children[(this.children.length - 1)]: null); +}), previousSibling: (function () { + _$jscoverage['core/node.js'][371]++; + var parent = this.parentNode; + _$jscoverage['core/node.js'][372]++; + for (var i = 0, ci; (ci = parent.children[i]); (i++)) { + _$jscoverage['core/node.js'][373]++; + if ((ci === this)) { + _$jscoverage['core/node.js'][374]++; + return ((i == 0)? null: parent.children[(i - 1)]); + } +} +}), nextSibling: (function () { + _$jscoverage['core/node.js'][390]++; + var parent = this.parentNode; + _$jscoverage['core/node.js'][391]++; + for (var i = 0, ci; (ci = parent.children[(i++)]);) { + _$jscoverage['core/node.js'][392]++; + if ((ci === this)) { + _$jscoverage['core/node.js'][393]++; + return parent.children[i]; + } +} +}), replaceChild: (function (target, source) { + _$jscoverage['core/node.js'][410]++; + if (this.children) { + _$jscoverage['core/node.js'][411]++; + if (target.parentNode) { + _$jscoverage['core/node.js'][412]++; + target.parentNode.removeChild(target); + } + _$jscoverage['core/node.js'][414]++; + for (var i = 0, ci; (ci = this.children[i]); (i++)) { + _$jscoverage['core/node.js'][415]++; + if ((ci === source)) { + _$jscoverage['core/node.js'][416]++; + this.children.splice(i, 1, target); + _$jscoverage['core/node.js'][417]++; + source.parentNode = null; + _$jscoverage['core/node.js'][418]++; + target.parentNode = this; + _$jscoverage['core/node.js'][419]++; + return target; + } +} + } +}), appendChild: (function (node) { + _$jscoverage['core/node.js'][436]++; + if (((this.type == "root") || ((this.type == "element") && (! dtd.$empty[this.tagName])))) { + _$jscoverage['core/node.js'][437]++; + if ((! this.children)) { + _$jscoverage['core/node.js'][438]++; + this.children = []; + } + _$jscoverage['core/node.js'][440]++; + if (node.parentNode) { + _$jscoverage['core/node.js'][441]++; + node.parentNode.removeChild(node); + } + _$jscoverage['core/node.js'][443]++; + for (var i = 0, ci; (ci = this.children[i]); (i++)) { + _$jscoverage['core/node.js'][444]++; + if ((ci === node)) { + _$jscoverage['core/node.js'][445]++; + this.children.splice(i, 1); + _$jscoverage['core/node.js'][446]++; + break; + } +} + _$jscoverage['core/node.js'][449]++; + this.children.push(node); + _$jscoverage['core/node.js'][450]++; + node.parentNode = this; + _$jscoverage['core/node.js'][451]++; + return node; + } +}), insertBefore: (function (target, source) { + _$jscoverage['core/node.js'][469]++; + if (this.children) { + _$jscoverage['core/node.js'][470]++; + if (target.parentNode) { + _$jscoverage['core/node.js'][471]++; + target.parentNode.removeChild(target); + } + _$jscoverage['core/node.js'][473]++; + for (var i = 0, ci; (ci = this.children[i]); (i++)) { + _$jscoverage['core/node.js'][474]++; + if ((ci === source)) { + _$jscoverage['core/node.js'][475]++; + this.children.splice(i, 0, target); + _$jscoverage['core/node.js'][476]++; + target.parentNode = this; + _$jscoverage['core/node.js'][477]++; + return target; + } +} + } +}), insertAfter: (function (target, source) { + _$jscoverage['core/node.js'][496]++; + if (this.children) { + _$jscoverage['core/node.js'][497]++; + if (target.parentNode) { + _$jscoverage['core/node.js'][498]++; + target.parentNode.removeChild(target); + } + _$jscoverage['core/node.js'][500]++; + for (var i = 0, ci; (ci = this.children[i]); (i++)) { + _$jscoverage['core/node.js'][501]++; + if ((ci === source)) { + _$jscoverage['core/node.js'][502]++; + this.children.splice((i + 1), 0, target); + _$jscoverage['core/node.js'][503]++; + target.parentNode = this; + _$jscoverage['core/node.js'][504]++; + return target; + } +} + } +}), removeChild: (function (node, keepChildren) { + _$jscoverage['core/node.js'][523]++; + if (this.children) { + _$jscoverage['core/node.js'][524]++; + for (var i = 0, ci; (ci = this.children[i]); (i++)) { + _$jscoverage['core/node.js'][525]++; + if ((ci === node)) { + _$jscoverage['core/node.js'][526]++; + this.children.splice(i, 1); + _$jscoverage['core/node.js'][527]++; + ci.parentNode = null; + _$jscoverage['core/node.js'][528]++; + if ((keepChildren && ci.children && ci.children.length)) { + _$jscoverage['core/node.js'][529]++; + for (var j = 0, cj; (cj = ci.children[j]); (j++)) { + _$jscoverage['core/node.js'][530]++; + this.children.splice((i + j), 0, cj); + _$jscoverage['core/node.js'][531]++; + cj.parentNode = this; +} + } + _$jscoverage['core/node.js'][535]++; + return ci; + } +} + } +}), getAttr: (function (attrName) { + _$jscoverage['core/node.js'][552]++; + return (this.attrs && this.attrs[attrName.toLowerCase()]); +}), setAttr: (function (attrName, attrVal) { + _$jscoverage['core/node.js'][567]++; + if ((! attrName)) { + _$jscoverage['core/node.js'][568]++; + (delete this.attrs); + _$jscoverage['core/node.js'][569]++; + return; + } + _$jscoverage['core/node.js'][571]++; + if ((! this.attrs)) { + _$jscoverage['core/node.js'][572]++; + this.attrs = {}; + } + _$jscoverage['core/node.js'][574]++; + if (utils.isObject(attrName)) { + _$jscoverage['core/node.js'][575]++; + for (var a in attrName) { + _$jscoverage['core/node.js'][576]++; + if ((! attrName[a])) { + _$jscoverage['core/node.js'][577]++; + (delete this.attrs[a]); + } + else { + _$jscoverage['core/node.js'][579]++; + this.attrs[a.toLowerCase()] = attrName[a]; + } +} + } + else { + _$jscoverage['core/node.js'][583]++; + if ((! attrVal)) { + _$jscoverage['core/node.js'][584]++; + (delete this.attrs[attrName]); + } + else { + _$jscoverage['core/node.js'][586]++; + this.attrs[attrName.toLowerCase()] = attrVal; + } + } +}), getIndex: (function () { + _$jscoverage['core/node.js'][602]++; + var parent = this.parentNode; + _$jscoverage['core/node.js'][603]++; + for (var i = 0, ci; (ci = parent.children[i]); (i++)) { + _$jscoverage['core/node.js'][604]++; + if ((ci === this)) { + _$jscoverage['core/node.js'][605]++; + return i; + } +} + _$jscoverage['core/node.js'][608]++; + return -1; +}), getNodeById: (function (id) { + _$jscoverage['core/node.js'][622]++; + var node; + _$jscoverage['core/node.js'][623]++; + if ((this.children && this.children.length)) { + _$jscoverage['core/node.js'][624]++; + for (var i = 0, ci; (ci = this.children[(i++)]);) { + _$jscoverage['core/node.js'][625]++; + if ((node = getNodeById(ci, id))) { + _$jscoverage['core/node.js'][626]++; + return node; + } +} + } +}), getNodesByTagName: (function (tagNames) { + _$jscoverage['core/node.js'][643]++; + tagNames = utils.trim(tagNames).replace(/[ ]{2,}/g, " ").split(" "); + _$jscoverage['core/node.js'][644]++; + var arr = [], me = this; + _$jscoverage['core/node.js'][645]++; + utils.each(tagNames, (function (tagName) { + _$jscoverage['core/node.js'][646]++; + if ((me.children && me.children.length)) { + _$jscoverage['core/node.js'][647]++; + for (var i = 0, ci; (ci = me.children[(i++)]);) { + _$jscoverage['core/node.js'][648]++; + getNodesByTagName(ci, tagName, arr); +} + } +})); + _$jscoverage['core/node.js'][652]++; + return arr; +}), getStyle: (function (name) { + _$jscoverage['core/node.js'][666]++; + var cssStyle = this.getAttr("style"); + _$jscoverage['core/node.js'][667]++; + if ((! cssStyle)) { + _$jscoverage['core/node.js'][668]++; + return ""; + } + _$jscoverage['core/node.js'][670]++; + var reg = new RegExp((name + ":([^;]+)"), "i"); + _$jscoverage['core/node.js'][671]++; + var match = cssStyle.match(reg); + _$jscoverage['core/node.js'][672]++; + if ((match && match[0])) { + _$jscoverage['core/node.js'][673]++; + return match[1]; + } + _$jscoverage['core/node.js'][675]++; + return ""; +}), setStyle: (function (name, val) { + _$jscoverage['core/node.js'][689]++; + function exec(name, val) { + _$jscoverage['core/node.js'][690]++; + var reg = new RegExp((name + ":([^;]+;?)"), "gi"); + _$jscoverage['core/node.js'][691]++; + cssStyle = cssStyle.replace(reg, ""); + _$jscoverage['core/node.js'][692]++; + if (val) { + _$jscoverage['core/node.js'][693]++; + cssStyle = (name + ":" + utils.unhtml(val) + ";" + cssStyle); + } +} + _$jscoverage['core/node.js'][698]++; + var cssStyle = this.getAttr("style"); + _$jscoverage['core/node.js'][699]++; + if ((! cssStyle)) { + _$jscoverage['core/node.js'][700]++; + cssStyle = ""; + } + _$jscoverage['core/node.js'][702]++; + if (utils.isObject(name)) { + _$jscoverage['core/node.js'][703]++; + for (var a in name) { + _$jscoverage['core/node.js'][704]++; + exec(a, name[a]); +} + } + else { + _$jscoverage['core/node.js'][707]++; + exec(name, val); + } + _$jscoverage['core/node.js'][709]++; + this.setAttr("style", utils.trim(cssStyle)); +}), traversal: (function (fn) { + _$jscoverage['core/node.js'][724]++; + if ((this.children && this.children.length)) { + _$jscoverage['core/node.js'][725]++; + nodeTraversal(this, fn); + } + _$jscoverage['core/node.js'][727]++; + return this; +})}; +})(); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/core/utils.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/core/utils.js new file mode 100644 index 000000000..b1af08e77 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/core/utils.js @@ -0,0 +1,888 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['core/utils.js']) { + _$jscoverage['core/utils.js'] = []; + _$jscoverage['core/utils.js'][14] = 0; + _$jscoverage['core/utils.js'][55] = 0; + _$jscoverage['core/utils.js'][56] = 0; + _$jscoverage['core/utils.js'][57] = 0; + _$jscoverage['core/utils.js'][58] = 0; + _$jscoverage['core/utils.js'][59] = 0; + _$jscoverage['core/utils.js'][62] = 0; + _$jscoverage['core/utils.js'][63] = 0; + _$jscoverage['core/utils.js'][64] = 0; + _$jscoverage['core/utils.js'][65] = 0; + _$jscoverage['core/utils.js'][87] = 0; + _$jscoverage['core/utils.js'][88] = 0; + _$jscoverage['core/utils.js'][89] = 0; + _$jscoverage['core/utils.js'][90] = 0; + _$jscoverage['core/utils.js'][91] = 0; + _$jscoverage['core/utils.js'][138] = 0; + _$jscoverage['core/utils.js'][139] = 0; + _$jscoverage['core/utils.js'][140] = 0; + _$jscoverage['core/utils.js'][141] = 0; + _$jscoverage['core/utils.js'][145] = 0; + _$jscoverage['core/utils.js'][172] = 0; + _$jscoverage['core/utils.js'][173] = 0; + _$jscoverage['core/utils.js'][174] = 0; + _$jscoverage['core/utils.js'][175] = 0; + _$jscoverage['core/utils.js'][176] = 0; + _$jscoverage['core/utils.js'][177] = 0; + _$jscoverage['core/utils.js'][181] = 0; + _$jscoverage['core/utils.js'][215] = 0; + _$jscoverage['core/utils.js'][217] = 0; + _$jscoverage['core/utils.js'][218] = 0; + _$jscoverage['core/utils.js'][219] = 0; + _$jscoverage['core/utils.js'][249] = 0; + _$jscoverage['core/utils.js'][250] = 0; + _$jscoverage['core/utils.js'][304] = 0; + _$jscoverage['core/utils.js'][305] = 0; + _$jscoverage['core/utils.js'][306] = 0; + _$jscoverage['core/utils.js'][307] = 0; + _$jscoverage['core/utils.js'][309] = 0; + _$jscoverage['core/utils.js'][348] = 0; + _$jscoverage['core/utils.js'][349] = 0; + _$jscoverage['core/utils.js'][350] = 0; + _$jscoverage['core/utils.js'][351] = 0; + _$jscoverage['core/utils.js'][352] = 0; + _$jscoverage['core/utils.js'][353] = 0; + _$jscoverage['core/utils.js'][356] = 0; + _$jscoverage['core/utils.js'][376] = 0; + _$jscoverage['core/utils.js'][377] = 0; + _$jscoverage['core/utils.js'][378] = 0; + _$jscoverage['core/utils.js'][379] = 0; + _$jscoverage['core/utils.js'][406] = 0; + _$jscoverage['core/utils.js'][439] = 0; + _$jscoverage['core/utils.js'][440] = 0; + _$jscoverage['core/utils.js'][441] = 0; + _$jscoverage['core/utils.js'][442] = 0; + _$jscoverage['core/utils.js'][444] = 0; + _$jscoverage['core/utils.js'][462] = 0; + _$jscoverage['core/utils.js'][463] = 0; + _$jscoverage['core/utils.js'][464] = 0; + _$jscoverage['core/utils.js'][466] = 0; + _$jscoverage['core/utils.js'][495] = 0; + _$jscoverage['core/utils.js'][496] = 0; + _$jscoverage['core/utils.js'][522] = 0; + _$jscoverage['core/utils.js'][527] = 0; + _$jscoverage['core/utils.js'][528] = 0; + _$jscoverage['core/utils.js'][529] = 0; + _$jscoverage['core/utils.js'][575] = 0; + _$jscoverage['core/utils.js'][577] = 0; + _$jscoverage['core/utils.js'][578] = 0; + _$jscoverage['core/utils.js'][579] = 0; + _$jscoverage['core/utils.js'][580] = 0; + _$jscoverage['core/utils.js'][581] = 0; + _$jscoverage['core/utils.js'][585] = 0; + _$jscoverage['core/utils.js'][590] = 0; + _$jscoverage['core/utils.js'][591] = 0; + _$jscoverage['core/utils.js'][592] = 0; + _$jscoverage['core/utils.js'][593] = 0; + _$jscoverage['core/utils.js'][594] = 0; + _$jscoverage['core/utils.js'][596] = 0; + _$jscoverage['core/utils.js'][598] = 0; + _$jscoverage['core/utils.js'][600] = 0; + _$jscoverage['core/utils.js'][605] = 0; + _$jscoverage['core/utils.js'][606] = 0; + _$jscoverage['core/utils.js'][607] = 0; + _$jscoverage['core/utils.js'][608] = 0; + _$jscoverage['core/utils.js'][609] = 0; + _$jscoverage['core/utils.js'][611] = 0; + _$jscoverage['core/utils.js'][612] = 0; + _$jscoverage['core/utils.js'][614] = 0; + _$jscoverage['core/utils.js'][615] = 0; + _$jscoverage['core/utils.js'][617] = 0; + _$jscoverage['core/utils.js'][618] = 0; + _$jscoverage['core/utils.js'][619] = 0; + _$jscoverage['core/utils.js'][620] = 0; + _$jscoverage['core/utils.js'][622] = 0; + _$jscoverage['core/utils.js'][623] = 0; + _$jscoverage['core/utils.js'][624] = 0; + _$jscoverage['core/utils.js'][625] = 0; + _$jscoverage['core/utils.js'][626] = 0; + _$jscoverage['core/utils.js'][627] = 0; + _$jscoverage['core/utils.js'][628] = 0; + _$jscoverage['core/utils.js'][631] = 0; + _$jscoverage['core/utils.js'][634] = 0; + _$jscoverage['core/utils.js'][635] = 0; + _$jscoverage['core/utils.js'][637] = 0; + _$jscoverage['core/utils.js'][672] = 0; + _$jscoverage['core/utils.js'][673] = 0; + _$jscoverage['core/utils.js'][674] = 0; + _$jscoverage['core/utils.js'][675] = 0; + _$jscoverage['core/utils.js'][687] = 0; + _$jscoverage['core/utils.js'][688] = 0; + _$jscoverage['core/utils.js'][689] = 0; + _$jscoverage['core/utils.js'][690] = 0; + _$jscoverage['core/utils.js'][691] = 0; + _$jscoverage['core/utils.js'][692] = 0; + _$jscoverage['core/utils.js'][693] = 0; + _$jscoverage['core/utils.js'][694] = 0; + _$jscoverage['core/utils.js'][696] = 0; + _$jscoverage['core/utils.js'][698] = 0; + _$jscoverage['core/utils.js'][708] = 0; + _$jscoverage['core/utils.js'][709] = 0; + _$jscoverage['core/utils.js'][710] = 0; + _$jscoverage['core/utils.js'][711] = 0; + _$jscoverage['core/utils.js'][713] = 0; + _$jscoverage['core/utils.js'][714] = 0; + _$jscoverage['core/utils.js'][715] = 0; + _$jscoverage['core/utils.js'][717] = 0; + _$jscoverage['core/utils.js'][718] = 0; + _$jscoverage['core/utils.js'][719] = 0; + _$jscoverage['core/utils.js'][721] = 0; + _$jscoverage['core/utils.js'][724] = 0; + _$jscoverage['core/utils.js'][727] = 0; + _$jscoverage['core/utils.js'][728] = 0; + _$jscoverage['core/utils.js'][729] = 0; + _$jscoverage['core/utils.js'][731] = 0; + _$jscoverage['core/utils.js'][732] = 0; + _$jscoverage['core/utils.js'][733] = 0; + _$jscoverage['core/utils.js'][734] = 0; + _$jscoverage['core/utils.js'][737] = 0; + _$jscoverage['core/utils.js'][742] = 0; + _$jscoverage['core/utils.js'][745] = 0; + _$jscoverage['core/utils.js'][746] = 0; + _$jscoverage['core/utils.js'][748] = 0; + _$jscoverage['core/utils.js'][759] = 0; + _$jscoverage['core/utils.js'][760] = 0; + _$jscoverage['core/utils.js'][761] = 0; + _$jscoverage['core/utils.js'][762] = 0; + _$jscoverage['core/utils.js'][763] = 0; + _$jscoverage['core/utils.js'][764] = 0; + _$jscoverage['core/utils.js'][765] = 0; + _$jscoverage['core/utils.js'][766] = 0; + _$jscoverage['core/utils.js'][768] = 0; + _$jscoverage['core/utils.js'][772] = 0; + _$jscoverage['core/utils.js'][792] = 0; + _$jscoverage['core/utils.js'][793] = 0; + _$jscoverage['core/utils.js'][795] = 0; + _$jscoverage['core/utils.js'][796] = 0; + _$jscoverage['core/utils.js'][797] = 0; + _$jscoverage['core/utils.js'][798] = 0; + _$jscoverage['core/utils.js'][800] = 0; + _$jscoverage['core/utils.js'][802] = 0; + _$jscoverage['core/utils.js'][803] = 0; + _$jscoverage['core/utils.js'][805] = 0; + _$jscoverage['core/utils.js'][807] = 0; + _$jscoverage['core/utils.js'][828] = 0; + _$jscoverage['core/utils.js'][830] = 0; + _$jscoverage['core/utils.js'][832] = 0; + _$jscoverage['core/utils.js'][833] = 0; + _$jscoverage['core/utils.js'][837] = 0; + _$jscoverage['core/utils.js'][838] = 0; + _$jscoverage['core/utils.js'][839] = 0; + _$jscoverage['core/utils.js'][840] = 0; + _$jscoverage['core/utils.js'][841] = 0; + _$jscoverage['core/utils.js'][842] = 0; + _$jscoverage['core/utils.js'][844] = 0; + _$jscoverage['core/utils.js'][845] = 0; + _$jscoverage['core/utils.js'][846] = 0; + _$jscoverage['core/utils.js'][847] = 0; + _$jscoverage['core/utils.js'][848] = 0; + _$jscoverage['core/utils.js'][849] = 0; + _$jscoverage['core/utils.js'][851] = 0; + _$jscoverage['core/utils.js'][852] = 0; + _$jscoverage['core/utils.js'][854] = 0; + _$jscoverage['core/utils.js'][856] = 0; + _$jscoverage['core/utils.js'][857] = 0; + _$jscoverage['core/utils.js'][860] = 0; + _$jscoverage['core/utils.js'][861] = 0; + _$jscoverage['core/utils.js'][862] = 0; + _$jscoverage['core/utils.js'][864] = 0; + _$jscoverage['core/utils.js'][865] = 0; + _$jscoverage['core/utils.js'][883] = 0; + _$jscoverage['core/utils.js'][884] = 0; + _$jscoverage['core/utils.js'][885] = 0; + _$jscoverage['core/utils.js'][886] = 0; + _$jscoverage['core/utils.js'][888] = 0; + _$jscoverage['core/utils.js'][890] = 0; + _$jscoverage['core/utils.js'][891] = 0; + _$jscoverage['core/utils.js'][892] = 0; + _$jscoverage['core/utils.js'][893] = 0; + _$jscoverage['core/utils.js'][895] = 0; + _$jscoverage['core/utils.js'][896] = 0; + _$jscoverage['core/utils.js'][898] = 0; + _$jscoverage['core/utils.js'][900] = 0; + _$jscoverage['core/utils.js'][901] = 0; + _$jscoverage['core/utils.js'][903] = 0; + _$jscoverage['core/utils.js'][905] = 0; + _$jscoverage['core/utils.js'][906] = 0; + _$jscoverage['core/utils.js'][907] = 0; + _$jscoverage['core/utils.js'][908] = 0; + _$jscoverage['core/utils.js'][909] = 0; + _$jscoverage['core/utils.js'][911] = 0; + _$jscoverage['core/utils.js'][912] = 0; + _$jscoverage['core/utils.js'][913] = 0; + _$jscoverage['core/utils.js'][915] = 0; + _$jscoverage['core/utils.js'][916] = 0; + _$jscoverage['core/utils.js'][918] = 0; + _$jscoverage['core/utils.js'][919] = 0; + _$jscoverage['core/utils.js'][921] = 0; + _$jscoverage['core/utils.js'][925] = 0; + _$jscoverage['core/utils.js'][926] = 0; + _$jscoverage['core/utils.js'][927] = 0; + _$jscoverage['core/utils.js'][928] = 0; + _$jscoverage['core/utils.js'][929] = 0; + _$jscoverage['core/utils.js'][930] = 0; + _$jscoverage['core/utils.js'][931] = 0; + _$jscoverage['core/utils.js'][935] = 0; + _$jscoverage['core/utils.js'][980] = 0; + _$jscoverage['core/utils.js'][981] = 0; + _$jscoverage['core/utils.js'][982] = 0; +} +_$jscoverage['core/utils.js'].source = ["/**"," * 工具函数包"," * @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)"," returnfalse;"," }"," }else{"," for(var key in obj){"," if(obj.hasOwnProperty(key)){"," if(iterator.call(context, obj[key], key, obj)===false)"," returnfalse;"," }"," }"," }"," },",""," /**"," * 以给定对象作为原型创建一个新对象"," * @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){"," returnfunction(){"," 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;"," returnfunction(){"," 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;"," returnfalse;"," }"," });"," 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 = '<body>&</body>';"," *"," * //output: &lt;body&gt;&amp;&lt;/body&gt;"," * console.log( UE.utils.unhtml( html ) );"," *"," * ```"," */"," unhtml:function(str, reg){"," return str ? str.replace(reg ||/[&<\">'](?:(amp|lt|quot|gt|#39|nbsp);)?/g,function(a, b){"," if(b){"," return a;"," }else{"," return{"," '<':'&lt;',"," '&':'&amp;',"," '\"':'&quot;',"," '>':'&gt;',"," \"'\":'&#39;'"," }[a]"," }",""," }):'';"," },",""," /**"," * 将str中的转义字符还原成html字符"," * @see UE.utils.unhtml(String);"," * @method html"," * @param { String } str 需要逆转义的字符串"," * @return { String } 逆转义后的字符串"," * @example"," * ```javascript"," *"," * var str = '&lt;body&gt;&amp;&lt;/body&gt;';"," *"," * //output: <body>&</body>"," * console.log( UE.utils.html( str ) );"," *"," * ```"," */"," html:function(str){"," return str ? str.replace(/&((g|l|quo)t|amp|#39);/g,function(m){"," return{"," '&lt;':'<',"," '&amp;':'&',"," '&quot;':'\"',"," '&gt;':'>',"," '&#39;':\"'\""," }[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'"," };",""," returnfunction(cssName){"," return cache[cssName]||(cache[cssName]= cssName.toLowerCase().replace(/-./g,function(match){"," return match.charAt(1).toUpperCase();"," }));"," };"," }(),",""," /**"," * 动态加载文件到doc中"," * @method loadFile"," * @param { DomDocument } document 需要加载资源文件的文档对象"," * @param { KeyValueMap } 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 { KeyValueMap } 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){"," returnnull;"," }",""," }",""," returnfunction(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(' ')+' ></'+ obj.tag +'>');"," return;"," }"," if(obj.id && doc.getElementById(obj.id)){"," return;"," }"," var element = doc.createElement(obj.tag);"," delete obj.tag;"," for(var p in obj){"," element.setAttribute(p, obj[p]);"," }"," element.onload = element.onreadystatechange =function(){"," if(!this.readyState ||/loaded|complete/.test(this.readyState)){"," item = getItem(doc, obj);"," if(item.funs.length >0){"," item.ready =1;"," for(var fi; fi = item.funs.pop();){"," fi();"," }"," }"," element.onload = element.onreadystatechange =null;"," }"," };"," element.onerror =function(){"," throw Error('The load '+(obj.href || obj.src)+' fails,check the url settings of file ueditor.config.js ')"," };"," doc.getElementsByTagName(\"head\")[0].appendChild(element);"," }"," }(),",""," /**"," * 判断obj对象是否为空"," * @method isEmptyObject"," * @param { * } obj 需要判断的对象"," * @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)returntrue;"," if(this.isArray(obj)||this.isString(obj))return obj.length ===0;"," for(var key in obj)if(obj.hasOwnProperty(key))returnfalse;"," returntrue;"," },",""," /*"," * 把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 +\";;\":';'"," });"," },",""," /*"," * 深度克隆对象,从source到target"," * @method clone"," * @grammar UE.utils.clone(source) => anthorObj 新的对象是完整的source的副本"," * @grammar UE.utils.clone(source,target) => target包含了source的所有内容,重名会覆盖"," */"," 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()){"," }"," }",""," returnfunction(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){"," (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','') =>null //清空给定的key值的背景颜色"," */"," cssRule:browser.ie ?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 = 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 = style;"," }else{"," head.removeChild(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;"," }","","};","/**"," * 判断给定的对象是否是字符串"," * @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'],function(v){"," UE.utils['is'+ v]=function(obj){"," return Object.prototype.toString.apply(obj)=='[object '+ v +']';"," }","});"]; +_$jscoverage['core/utils.js'][14]++; +var utils = (UE.utils = {each: (function (obj, iterator, context) { + _$jscoverage['core/utils.js'][55]++; + if ((obj == null)) { + _$jscoverage['core/utils.js'][55]++; + return; + } + _$jscoverage['core/utils.js'][56]++; + if ((obj.length === (+ obj.length))) { + _$jscoverage['core/utils.js'][57]++; + for (var i = 0, l = obj.length; (i < l); (i++)) { + _$jscoverage['core/utils.js'][58]++; + if ((iterator.call(context, obj[i], i, obj) === false)) { + _$jscoverage['core/utils.js'][59]++; + return false; + } +} + } + else { + _$jscoverage['core/utils.js'][62]++; + for (var key in obj) { + _$jscoverage['core/utils.js'][63]++; + if (obj.hasOwnProperty(key)) { + _$jscoverage['core/utils.js'][64]++; + if ((iterator.call(context, obj[key], key, obj) === false)) { + _$jscoverage['core/utils.js'][65]++; + return false; + } + } +} + } +}), makeInstance: (function (obj) { + _$jscoverage['core/utils.js'][87]++; + var noop = new Function(); + _$jscoverage['core/utils.js'][88]++; + noop.prototype = obj; + _$jscoverage['core/utils.js'][89]++; + obj = new noop(); + _$jscoverage['core/utils.js'][90]++; + noop.prototype = null; + _$jscoverage['core/utils.js'][91]++; + return obj; +}), extend: (function (t, s, b) { + _$jscoverage['core/utils.js'][138]++; + if (s) { + _$jscoverage['core/utils.js'][139]++; + for (var k in s) { + _$jscoverage['core/utils.js'][140]++; + if (((! b) || (! t.hasOwnProperty(k)))) { + _$jscoverage['core/utils.js'][141]++; + t[k] = s[k]; + } +} + } + _$jscoverage['core/utils.js'][145]++; + return t; +}), extend2: (function (t) { + _$jscoverage['core/utils.js'][172]++; + var a = arguments; + _$jscoverage['core/utils.js'][173]++; + for (var i = 1; (i < a.length); (i++)) { + _$jscoverage['core/utils.js'][174]++; + var x = a[i]; + _$jscoverage['core/utils.js'][175]++; + for (var k in x) { + _$jscoverage['core/utils.js'][176]++; + if ((! t.hasOwnProperty(k))) { + _$jscoverage['core/utils.js'][177]++; + t[k] = x[k]; + } +} +} + _$jscoverage['core/utils.js'][181]++; + return t; +}), inherits: (function (subClass, superClass) { + _$jscoverage['core/utils.js'][215]++; + var oldP = subClass.prototype, newP = utils.makeInstance(superClass.prototype); + _$jscoverage['core/utils.js'][217]++; + utils.extend(newP, oldP, true); + _$jscoverage['core/utils.js'][218]++; + subClass.prototype = newP; + _$jscoverage['core/utils.js'][219]++; + return (newP.constructor = subClass); +}), bind: (function (fn, context) { + _$jscoverage['core/utils.js'][249]++; + return (function () { + _$jscoverage['core/utils.js'][250]++; + return fn.apply(context, arguments); +}); +}), defer: (function (fn, delay, exclusion) { + _$jscoverage['core/utils.js'][304]++; + var timerID; + _$jscoverage['core/utils.js'][305]++; + return (function () { + _$jscoverage['core/utils.js'][306]++; + if (exclusion) { + _$jscoverage['core/utils.js'][307]++; + clearTimeout(timerID); + } + _$jscoverage['core/utils.js'][309]++; + timerID = setTimeout(fn, delay); +}); +}), indexOf: (function (array, item, start) { + _$jscoverage['core/utils.js'][348]++; + var index = -1; + _$jscoverage['core/utils.js'][349]++; + start = (this.isNumber(start)? start: 0); + _$jscoverage['core/utils.js'][350]++; + this.each(array, (function (v, i) { + _$jscoverage['core/utils.js'][351]++; + if (((i >= start) && (v === item))) { + _$jscoverage['core/utils.js'][352]++; + index = i; + _$jscoverage['core/utils.js'][353]++; + return false; + } +})); + _$jscoverage['core/utils.js'][356]++; + return index; +}), removeItem: (function (array, item) { + _$jscoverage['core/utils.js'][376]++; + for (var i = 0, l = array.length; (i < l); (i++)) { + _$jscoverage['core/utils.js'][377]++; + if ((array[i] === item)) { + _$jscoverage['core/utils.js'][378]++; + array.splice(i, 1); + _$jscoverage['core/utils.js'][379]++; + (i--); + } +} +}), trim: (function (str) { + _$jscoverage['core/utils.js'][406]++; + return str.replace(/(^[ \t\n\r]+)|([ \t\n\r]+$)/g, ""); +}), listToMap: (function (list) { + _$jscoverage['core/utils.js'][439]++; + if ((! list)) { + _$jscoverage['core/utils.js'][439]++; + return ({}); + } + _$jscoverage['core/utils.js'][440]++; + list = (utils.isArray(list)? list: list.split(",")); + _$jscoverage['core/utils.js'][441]++; + for (var i = 0, ci, obj = {}; (ci = list[(i++)]);) { + _$jscoverage['core/utils.js'][442]++; + obj[ci.toUpperCase()] = (obj[ci] = 1); +} + _$jscoverage['core/utils.js'][444]++; + return obj; +}), unhtml: (function (str, reg) { + _$jscoverage['core/utils.js'][462]++; + return (str? str.replace((reg || /[&<">'](?:(amp|lt|quot|gt|#39|nbsp);)?/g), (function (a, b) { + _$jscoverage['core/utils.js'][463]++; + if (b) { + _$jscoverage['core/utils.js'][464]++; + return a; + } + else { + _$jscoverage['core/utils.js'][466]++; + return {"<": "<", "&": "&", "\"": """, ">": ">", "'": "'"}[a]; + } +})): ""); +}), html: (function (str) { + _$jscoverage['core/utils.js'][495]++; + return (str? str.replace(/&((g|l|quo)t|amp|#39);/g, (function (m) { + _$jscoverage['core/utils.js'][496]++; + return {"<": "<", "&": "&", """: "\"", ">": ">", "'": "'"}[m]; +})): ""); +}), cssStyleToDomStyle: (function () { + _$jscoverage['core/utils.js'][522]++; + var test = document.createElement("div").style, cache = {"float": ((test.cssFloat != undefined)? "cssFloat": ((test.styleFloat != undefined)? "styleFloat": "float"))}; + _$jscoverage['core/utils.js'][527]++; + return (function (cssName) { + _$jscoverage['core/utils.js'][528]++; + return (cache[cssName] || (cache[cssName] = cssName.toLowerCase().replace(/-./g, (function (match) { + _$jscoverage['core/utils.js'][529]++; + return match.charAt(1).toUpperCase(); +})))); +}); +})(), loadFile: (function () { + _$jscoverage['core/utils.js'][575]++; + var tmpList = []; + _$jscoverage['core/utils.js'][577]++; + function getItem(doc, obj) { + _$jscoverage['core/utils.js'][578]++; + try { + _$jscoverage['core/utils.js'][579]++; + for (var i = 0, ci; (ci = tmpList[(i++)]);) { + _$jscoverage['core/utils.js'][580]++; + if (((ci.doc === doc) && (ci.url == (obj.src || obj.href)))) { + _$jscoverage['core/utils.js'][581]++; + return ci; + } +} + } + catch (e) { + _$jscoverage['core/utils.js'][585]++; + return null; + } +} + _$jscoverage['core/utils.js'][590]++; + return (function (doc, obj, fn) { + _$jscoverage['core/utils.js'][591]++; + var item = getItem(doc, obj); + _$jscoverage['core/utils.js'][592]++; + if (item) { + _$jscoverage['core/utils.js'][593]++; + if (item.ready) { + _$jscoverage['core/utils.js'][594]++; + (fn && fn()); + } + else { + _$jscoverage['core/utils.js'][596]++; + item.funs.push(fn); + } + _$jscoverage['core/utils.js'][598]++; + return; + } + _$jscoverage['core/utils.js'][600]++; + tmpList.push({doc: doc, url: (obj.src || obj.href), funs: [fn]}); + _$jscoverage['core/utils.js'][605]++; + if ((! doc.body)) { + _$jscoverage['core/utils.js'][606]++; + var html = []; + _$jscoverage['core/utils.js'][607]++; + for (var p in obj) { + _$jscoverage['core/utils.js'][608]++; + if ((p == "tag")) { + _$jscoverage['core/utils.js'][608]++; + continue; + } + _$jscoverage['core/utils.js'][609]++; + html.push((p + "=\"" + obj[p] + "\"")); +} + _$jscoverage['core/utils.js'][611]++; + doc.write(("<" + obj.tag + " " + html.join(" ") + " >")); + _$jscoverage['core/utils.js'][612]++; + return; + } + _$jscoverage['core/utils.js'][614]++; + if ((obj.id && doc.getElementById(obj.id))) { + _$jscoverage['core/utils.js'][615]++; + return; + } + _$jscoverage['core/utils.js'][617]++; + var element = doc.createElement(obj.tag); + _$jscoverage['core/utils.js'][618]++; + (delete obj.tag); + _$jscoverage['core/utils.js'][619]++; + for (var p = p in obj) { + _$jscoverage['core/utils.js'][620]++; + element.setAttribute(p, obj[p]); +} + _$jscoverage['core/utils.js'][622]++; + element.onload = (element.onreadystatechange = (function () { + _$jscoverage['core/utils.js'][623]++; + if (((! this.readyState) || /loaded|complete/.test(this.readyState))) { + _$jscoverage['core/utils.js'][624]++; + item = getItem(doc, obj); + _$jscoverage['core/utils.js'][625]++; + if ((item.funs.length > 0)) { + _$jscoverage['core/utils.js'][626]++; + item.ready = 1; + _$jscoverage['core/utils.js'][627]++; + for (var fi; (fi = item.funs.pop());) { + _$jscoverage['core/utils.js'][628]++; + fi(); +} + } + _$jscoverage['core/utils.js'][631]++; + element.onload = (element.onreadystatechange = null); + } +})); + _$jscoverage['core/utils.js'][634]++; + element.onerror = (function () { + _$jscoverage['core/utils.js'][635]++; + throw Error(("The load " + (obj.href || obj.src) + " fails,check the url settings of file ueditor.config.js ")); +}); + _$jscoverage['core/utils.js'][637]++; + doc.getElementsByTagName("head")[0].appendChild(element); +}); +})(), isEmptyObject: (function (obj) { + _$jscoverage['core/utils.js'][672]++; + if ((obj == null)) { + _$jscoverage['core/utils.js'][672]++; + return true; + } + _$jscoverage['core/utils.js'][673]++; + if ((this.isArray(obj) || this.isString(obj))) { + _$jscoverage['core/utils.js'][673]++; + return (obj.length === 0); + } + _$jscoverage['core/utils.js'][674]++; + for (var key in obj) { + _$jscoverage['core/utils.js'][674]++; + if (obj.hasOwnProperty(key)) { + _$jscoverage['core/utils.js'][674]++; + return false; + } +} + _$jscoverage['core/utils.js'][675]++; + return true; +}), fixColor: (function (name, value) { + _$jscoverage['core/utils.js'][687]++; + if ((/color/i.test(name) && /rgba?/.test(value))) { + _$jscoverage['core/utils.js'][688]++; + var array = value.split(","); + _$jscoverage['core/utils.js'][689]++; + if ((array.length > 3)) { + _$jscoverage['core/utils.js'][690]++; + return ""; + } + _$jscoverage['core/utils.js'][691]++; + value = "#"; + _$jscoverage['core/utils.js'][692]++; + for (var i = 0, color; (color = array[(i++)]);) { + _$jscoverage['core/utils.js'][693]++; + color = parseInt(color.replace(/[^\d]/gi, ""), 10).toString(16); + _$jscoverage['core/utils.js'][694]++; + value += ((color.length == 1)? ("0" + color): color); +} + _$jscoverage['core/utils.js'][696]++; + value = value.toUpperCase(); + } + _$jscoverage['core/utils.js'][698]++; + return value; +}), optCss: (function (val) { + _$jscoverage['core/utils.js'][708]++; + var padding, margin, border; + _$jscoverage['core/utils.js'][709]++; + val = val.replace(/(padding|margin|border)\-([^:]+):([^;]+);?/gi, (function (str, key, name, val) { + _$jscoverage['core/utils.js'][710]++; + if ((val.split(" ").length == 1)) { + _$jscoverage['core/utils.js'][711]++; + switch (key) { + case "padding": + _$jscoverage['core/utils.js'][713]++; + ((! padding) && (padding = {})); + _$jscoverage['core/utils.js'][714]++; + padding[name] = val; + _$jscoverage['core/utils.js'][715]++; + return ""; + case "margin": + _$jscoverage['core/utils.js'][717]++; + ((! margin) && (margin = {})); + _$jscoverage['core/utils.js'][718]++; + margin[name] = val; + _$jscoverage['core/utils.js'][719]++; + return ""; + case "border": + _$jscoverage['core/utils.js'][721]++; + return ((val == "initial")? "": str); + } + } + _$jscoverage['core/utils.js'][724]++; + return str; +})); + _$jscoverage['core/utils.js'][727]++; + function opt(obj, name) { + _$jscoverage['core/utils.js'][728]++; + if ((! obj)) { + _$jscoverage['core/utils.js'][729]++; + return ""; + } + _$jscoverage['core/utils.js'][731]++; + var t = obj.top, b = obj.bottom, l = obj.left, r = obj.right, val = ""; + _$jscoverage['core/utils.js'][732]++; + if (((! t) || (! l) || (! b) || (! r))) { + _$jscoverage['core/utils.js'][733]++; + for (var p in obj) { + _$jscoverage['core/utils.js'][734]++; + val += (";" + name + "-" + p + ":" + obj[p] + ";"); +} + } + else { + _$jscoverage['core/utils.js'][737]++; + val += (";" + name + ":" + (((t == b) && (b == l) && (l == r))? t: (((t == b) && (l == r))? (t + " " + l): ((l == r)? (t + " " + l + " " + b): (t + " " + r + " " + b + " " + l)))) + ";"); + } + _$jscoverage['core/utils.js'][742]++; + return val; +} + _$jscoverage['core/utils.js'][745]++; + val += (opt(padding, "padding") + opt(margin, "margin")); + _$jscoverage['core/utils.js'][746]++; + 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) { + _$jscoverage['core/utils.js'][748]++; + return (b? (b + ";;"): ";"); +})); +}), clone: (function (source, target) { + _$jscoverage['core/utils.js'][759]++; + var tmp; + _$jscoverage['core/utils.js'][760]++; + target = (target || {}); + _$jscoverage['core/utils.js'][761]++; + for (var i in source) { + _$jscoverage['core/utils.js'][762]++; + if (source.hasOwnProperty(i)) { + _$jscoverage['core/utils.js'][763]++; + tmp = source[i]; + _$jscoverage['core/utils.js'][764]++; + if (((typeof tmp) == "object")) { + _$jscoverage['core/utils.js'][765]++; + target[i] = (utils.isArray(tmp)? []: {}); + _$jscoverage['core/utils.js'][766]++; + utils.clone(source[i], target[i]); + } + else { + _$jscoverage['core/utils.js'][768]++; + target[i] = tmp; + } + } +} + _$jscoverage['core/utils.js'][772]++; + return target; +}), transUnitToPx: (function (val) { + _$jscoverage['core/utils.js'][792]++; + if ((! /(pt|cm)/.test(val))) { + _$jscoverage['core/utils.js'][793]++; + return val; + } + _$jscoverage['core/utils.js'][795]++; + var unit; + _$jscoverage['core/utils.js'][796]++; + val.replace(/([\d.]+)(\w+)/, (function (str, v, u) { + _$jscoverage['core/utils.js'][797]++; + val = v; + _$jscoverage['core/utils.js'][798]++; + unit = u; +})); + _$jscoverage['core/utils.js'][800]++; + switch (unit) { + case "cm": + _$jscoverage['core/utils.js'][802]++; + val = (parseFloat(val) * 25); + _$jscoverage['core/utils.js'][803]++; + break; + case "pt": + _$jscoverage['core/utils.js'][805]++; + val = Math.round(((parseFloat(val) * 96) / 72)); + } + _$jscoverage['core/utils.js'][807]++; + return (val + (val? "px": "")); +}), domReady: (function () { + _$jscoverage['core/utils.js'][828]++; + var fnArr = []; + _$jscoverage['core/utils.js'][830]++; + function doReady(doc) { + _$jscoverage['core/utils.js'][832]++; + doc.isReady = true; + _$jscoverage['core/utils.js'][833]++; + for (var ci; (ci = fnArr.pop()); ci()) { +} +} + _$jscoverage['core/utils.js'][837]++; + return (function (onready, win) { + _$jscoverage['core/utils.js'][838]++; + win = (win || window); + _$jscoverage['core/utils.js'][839]++; + var doc = win.document; + _$jscoverage['core/utils.js'][840]++; + (onready && fnArr.push(onready)); + _$jscoverage['core/utils.js'][841]++; + if ((doc.readyState === "complete")) { + _$jscoverage['core/utils.js'][842]++; + doReady(doc); + } + else { + _$jscoverage['core/utils.js'][844]++; + (doc.isReady && doReady(doc)); + _$jscoverage['core/utils.js'][845]++; + if (browser.ie) { + _$jscoverage['core/utils.js'][846]++; + (function () { + _$jscoverage['core/utils.js'][847]++; + if (doc.isReady) { + _$jscoverage['core/utils.js'][847]++; + return; + } + _$jscoverage['core/utils.js'][848]++; + try { + _$jscoverage['core/utils.js'][849]++; + doc.documentElement.doScroll("left"); + } + catch (error) { + _$jscoverage['core/utils.js'][851]++; + setTimeout(arguments.callee, 0); + _$jscoverage['core/utils.js'][852]++; + return; + } + _$jscoverage['core/utils.js'][854]++; + doReady(doc); +})(); + _$jscoverage['core/utils.js'][856]++; + win.attachEvent("onload", (function () { + _$jscoverage['core/utils.js'][857]++; + doReady(doc); +})); + } + else { + _$jscoverage['core/utils.js'][860]++; + doc.addEventListener("DOMContentLoaded", (function () { + _$jscoverage['core/utils.js'][861]++; + doc.removeEventListener("DOMContentLoaded", arguments.callee, false); + _$jscoverage['core/utils.js'][862]++; + doReady(doc); +}), false); + _$jscoverage['core/utils.js'][864]++; + win.addEventListener("load", (function () { + _$jscoverage['core/utils.js'][865]++; + doReady(doc); +}), false); + } + } +}); +})(), cssRule: (browser.ie? (function (key, style, doc) { + _$jscoverage['core/utils.js'][883]++; + var indexList, index; + _$jscoverage['core/utils.js'][884]++; + doc = (doc || document); + _$jscoverage['core/utils.js'][885]++; + if (doc.indexList) { + _$jscoverage['core/utils.js'][886]++; + indexList = doc.indexList; + } + else { + _$jscoverage['core/utils.js'][888]++; + indexList = (doc.indexList = {}); + } + _$jscoverage['core/utils.js'][890]++; + var sheetStyle; + _$jscoverage['core/utils.js'][891]++; + if ((! indexList[key])) { + _$jscoverage['core/utils.js'][892]++; + if ((style === undefined)) { + _$jscoverage['core/utils.js'][893]++; + return ""; + } + _$jscoverage['core/utils.js'][895]++; + sheetStyle = doc.createStyleSheet("", (index = doc.styleSheets.length)); + _$jscoverage['core/utils.js'][896]++; + indexList[key] = index; + } + else { + _$jscoverage['core/utils.js'][898]++; + sheetStyle = doc.styleSheets[indexList[key]]; + } + _$jscoverage['core/utils.js'][900]++; + if ((style === undefined)) { + _$jscoverage['core/utils.js'][901]++; + return sheetStyle.cssText; + } + _$jscoverage['core/utils.js'][903]++; + sheetStyle.cssText = (style || ""); +}): (function (key, style, doc) { + _$jscoverage['core/utils.js'][905]++; + doc = (doc || document); + _$jscoverage['core/utils.js'][906]++; + var head = doc.getElementsByTagName("head")[0], node; + _$jscoverage['core/utils.js'][907]++; + if ((! (node = doc.getElementById(key)))) { + _$jscoverage['core/utils.js'][908]++; + if ((style === undefined)) { + _$jscoverage['core/utils.js'][909]++; + return ""; + } + _$jscoverage['core/utils.js'][911]++; + node = doc.createElement("style"); + _$jscoverage['core/utils.js'][912]++; + node.id = key; + _$jscoverage['core/utils.js'][913]++; + head.appendChild(node); + } + _$jscoverage['core/utils.js'][915]++; + if ((style === undefined)) { + _$jscoverage['core/utils.js'][916]++; + return node.innerHTML; + } + _$jscoverage['core/utils.js'][918]++; + if ((style !== "")) { + _$jscoverage['core/utils.js'][919]++; + node.innerHTML = style; + } + else { + _$jscoverage['core/utils.js'][921]++; + head.removeChild(node); + } +})), sort: (function (array, compareFn) { + _$jscoverage['core/utils.js'][925]++; + compareFn = (compareFn || (function (item1, item2) { + _$jscoverage['core/utils.js'][925]++; + return item1.localeCompare(item2); +})); + _$jscoverage['core/utils.js'][926]++; + for (var i = 0, len = array.length; (i < len); (i++)) { + _$jscoverage['core/utils.js'][927]++; + for (var j = i, length = array.length; (j < length); (j++)) { + _$jscoverage['core/utils.js'][928]++; + if ((compareFn(array[i], array[j]) > 0)) { + _$jscoverage['core/utils.js'][929]++; + var t = array[i]; + _$jscoverage['core/utils.js'][930]++; + array[i] = array[j]; + _$jscoverage['core/utils.js'][931]++; + array[j] = t; + } +} +} + _$jscoverage['core/utils.js'][935]++; + return array; +})}); +_$jscoverage['core/utils.js'][980]++; +utils.each(["String", "Function", "Array", "Number", "RegExp", "Object"], (function (v) { + _$jscoverage['core/utils.js'][981]++; + UE.utils[("is" + v)] = (function (obj) { + _$jscoverage['core/utils.js'][982]++; + return (Object.prototype.toString.apply(obj) == ("[object " + v + "]")); +}); +})); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/customEvent.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/customEvent.js new file mode 100644 index 000000000..cd7c0e836 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/customEvent.js @@ -0,0 +1,43 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['customEvent.js']) { + _$jscoverage['customEvent.js'] = []; +} +_$jscoverage['customEvent.js'].source = ["/**"," * @file"," * @name 编辑器事件接口"," * @short Custom events"," * @des 本文件非编辑器核心文件,仅适用于生成对应的事件接口文档"," * UEditor编辑器中的所有事件监听和触发都统一采用"," * ''editor''是编辑器实例"," * editor.addListener(\"eventName\",handler) 和 editor.fireEvent(\"eventName\")方式调用,支持浏览器原生事件,如keydown,keyup,mousedown,mouseup等"," */","/**"," * 编辑器加载完成事件(核心),在编辑器准备好所有运行条件时触发,大部分场景可以使用editor.ready(fn)取代。"," * @name ready"," * @grammar editor.addListener(\"ready\",fn)"," * @example"," * editor.addListener(\"ready\",function(){"," * //this为editor实例"," * this.setContent(\"欢迎使用UEditor!\");"," * })"," * //同如下接口方式调用"," * editor.ready(function(){"," * this.setContent(\"欢迎使用UEditor!\");"," * })"," */","/**"," * 选区变化事件(核心),当选区出现变化时触发。"," * 在UEditor中,任何涉及到光标改变的操作都会触发选区变化事件,该事件主要用来实现工具栏状态反射。"," * @name selectionChange"," * @grammar editor.addListener(\"selectionChange\",fn)"," * @grammar editor.fireEvent(\"selectionChange\")"," * @example"," * editor.addListener(\"selectionChange\",function(){"," * //this为editor实例"," * })"," */","","/**"," * 内容变化事件(核心),当编辑区域中的文本内容出现变化时触发"," * @name contentChange"," * @grammar editor.addListener(\"contentChange\",fn)"," * @grammar editor.fireEvent(\"contentChange\")"," */","","/**"," * 粘贴事件(核心),当使用ctr+v快捷键粘贴(包括Chrome、FF浏览器的右键粘贴)时会触发本事件"," * @name (before|after)Paste"," * @grammar editor.addListener(\"beforePaste\",fn)"," * @desc"," * * beforePaste 在将粘贴的内容写到编辑器之前触发,这个事件触发时,粘贴的内容还未在编辑器内显示"," * * afterPaste 粘贴的内容已经写到编辑器里边后触发"," * @example"," * editor.addListener(\"beforePaste\",function(type,data){"," * //beforePaste事件监听区别于afterPaste事件监听最主要的一个方面是存在一个data参数,"," * //该data参数是一个对象,包含属性html。"," * //若用户在此处更改该html的值时,将会影响粘贴到编辑器中的内容,主要用于粘贴时需要特殊处理的一些场景。"," * console.log(this.getContent) //this都是当前编辑器的实例"," * //before事件才用这个参数,用来在写出编辑器之前对粘贴进来的内容进行最后的修改"," * data.html = \"我把粘贴内容改成了这句话\";"," * })"," */","","/**"," * 设置内容事件(核心),当调用setContent方法时触发"," * @name (before|after)SetContent"," * @grammar editor.addListener(\"beforeSetContent\",fn)"," * @desc"," * * beforeSetContent 在内容写到编辑器之前触发"," * * afterSetContent 内容已经写到编辑器里边后触发"," * @example"," * editor.addListener(\"beforeSetContent\",function(type,data){"," * //beforeSetContent事件监听区别于afterSetContent事件监听最主要的一个方面是存在一个data参数,"," * //该data参数是一个对象,包含属性html。"," * //若用户在此处更改该html的值时,将会影响设置到编辑器中的内容,主要用于设置内容时需要特殊处理的一些场景。"," * data.html = \"我把设置内容改成了这句话\";"," * })"," */","","/**"," * getAllHtml事件,当调用getAllHtml方法时触发"," * @name getAllHtml"," * @grammar editor.addListener(\"getAllHtml\",fn)"," * @desc"," * * 主要用来对于生成的整个html代码中的head内容进行定制,比如你想插入你自己的样式,script标签等,用来在展示时使用"," * @example"," * editor.addListener(\"getAllHtml\",function(type,data){"," * //data是document中head部分html的封装,可通过data.html来获取对应字符串。"," * //需要修改的话得重新赋值data.html = '<style type=\"text/css\"> body{margin:0;}</style>';"," * })"," */","","/**"," * 内容提交事件(插件),当内容提交插件加载并调用了autosubmit命令时触发,多用于提交之前的验证"," * @name beforeSubmit"," * @grammar editor.addListener(\"beforeSubmit\",fn) //若fn返回false,则阻止本次提交"," * @example"," * editor.addListener(\"beforeSubmit\",function(){"," * if(!editor.hasContents()){"," * return false;"," * }"," * })"," */","","/**"," * 如果抓取远程的图片失败了,就触发"," * @name catchRemoteError"," * @grammar editor.addListener(\"catchRemoteError\",fn)"," * @example"," * editor.addListener(\"catchRemoteError\",function(){"," * console.log(\"抓取失败了!\")"," * })"," */","","/**"," * 当抓取远程的图片成功并会返回生成图片的链接时触发"," * @name catchRemoterSuccess"," * @grammar editor.addListener(\"catchRemoterSuccess\",fn)"," * @example"," * editor.addListener(\"catchRemoterSuccess\",function(){"," * console.log(\"抓取成功\")"," * })"," */","","/**"," * 编辑模式切换事件(插件),当源码模式和富文本模式发生切换时触发事件"," * @name sourceModeChanged"," * @grammar editor.addListener(\"sourceModeChanged\",fn)"," * @example"," * editor.addListener(\"sourceModeChanged\",function(type,mode){"," * //mode代表了当前的编辑模式,true代表切换到了源码模式,false代表切换到了富文本模式"," * })"," */","","/**"," * 全屏切换事件(插件),当执行全屏切换的时候触发事件"," * @name fullScreenChanged"," * @grammar editor.addListener(\"fullScreenChanged\",fn)"," * @example"," * editor.addListener(\"fullScreenChanged\",function(type,mode){"," * //mode代表当前是否全屏,true代表切换到了全屏模式,false代表切换到了普通模式"," * })"," */","","/**"," * 字数超出限制事件(插件),当输入的字符数超出配置项配置时触发"," * @name wordCountOverflow"," * @grammar editor.addListener(\"wordCountOverflow\",fn)"," * @example"," * editor.addListener(\"wordCountOverflow\",function(type,length){"," * console.log(length)"," * })"," */",""]; diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/editor.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/editor.js new file mode 100644 index 000000000..2c544eae9 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/editor.js @@ -0,0 +1,73 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['editor.js']) { + _$jscoverage['editor.js'] = []; + _$jscoverage['editor.js'][1] = 0; + _$jscoverage['editor.js'][3] = 0; + _$jscoverage['editor.js'][5] = 0; + _$jscoverage['editor.js'][7] = 0; + _$jscoverage['editor.js'][9] = 0; + _$jscoverage['editor.js'][11] = 0; + _$jscoverage['editor.js'][13] = 0; + _$jscoverage['editor.js'][15] = 0; + _$jscoverage['editor.js'][17] = 0; + _$jscoverage['editor.js'][19] = 0; +} +_$jscoverage['editor.js'].source = ["UEDITOR_CONFIG = window.UEDITOR_CONFIG ||{};","","var baidu = window.baidu ||{};","","window.baidu = baidu;","","window.UE = baidu.editor ={};","","UE.plugins ={};","","UE.commands ={};","","UE.instants ={};","","UE.I18N ={};","","UE.version =\"1.2.6.1\";","","var dom = UE.dom ={};"]; +_$jscoverage['editor.js'][1]++; +UEDITOR_CONFIG = (window.UEDITOR_CONFIG || {}); +_$jscoverage['editor.js'][3]++; +var baidu = (window.baidu || {}); +_$jscoverage['editor.js'][5]++; +window.baidu = baidu; +_$jscoverage['editor.js'][7]++; +window.UE = (baidu.editor = {}); +_$jscoverage['editor.js'][9]++; +UE.plugins = {}; +_$jscoverage['editor.js'][11]++; +UE.commands = {}; +_$jscoverage['editor.js'][13]++; +UE.instants = {}; +_$jscoverage['editor.js'][15]++; +UE.I18N = {}; +_$jscoverage['editor.js'][17]++; +UE.version = "1.2.6.1"; +_$jscoverage['editor.js'][19]++; +var dom = (UE.dom = {}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/jscoverage-highlight.css b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/jscoverage-highlight.css new file mode 100644 index 000000000..d2ad01da5 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/jscoverage-highlight.css @@ -0,0 +1,38 @@ +/* + jscoverage-highlight.css - JSCoverage syntax highlighting style sheet + Copyright (C) 2008, 2009, 2010 siliconforks.com + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +/* keyword, type, symbol, cbracket */ +#sourceTable .k { + font-weight: bold; +} + +/* string, regexp, number */ +#sourceTable .s { + color: #006400; +} + +/* specialchar */ +#sourceTable .t { + color: #2e8b57; +} + +/* comment */ +#sourceTable .c { + font-style: italic; +} diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/jscoverage-ie.css b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/jscoverage-ie.css new file mode 100644 index 000000000..05cad2afa --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/jscoverage-ie.css @@ -0,0 +1,108 @@ +/* + jscoverage-ie.css - JSCoverage style sheet for Internet Explorer + Copyright (C) 2007, 2008, 2009, 2010 siliconforks.com + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#headingDiv { + position: static; + margin-left: 10px; + margin-right: 10px; + padding-top: 0.5em; +} + +#tabs { + clear: all; + position: static; + top: auto; + left: auto; + right: auto; + height: auto; + margin-left: 10px; + margin-right: 10px; +} + +#tabs div { + position: relative; + height: auto; + line-height: normal; + padding-top: 5px; + padding-bottom: 5px; +} + +#tabs div.selected { + padding-bottom: 6px; + z-index: 2; +} + +.TabPage { + position: relative; + top: -1px; + left: auto; + right: auto; + bottom: auto; + clear: left; + margin-left: 10px; + margin-right: 10px; + padding: 10px; + z-index: 1; +} + +#locationDiv { + margin-bottom: 10px; +} + +#iframeDiv { + position: static; + width: 100%; +} + +#summaryDiv { + position: static; + width: 100%; +} + +#fileDiv { + margin-bottom: 10px; +} + +#sourceDiv { + position: static; + width: 100%; +} + +#storeDiv { + position: static; + width: 100%; +} + +/* some defaults */ + +.TabPage { + height: 650px; +} + +#iframeDiv { + height: 600px; +} + +#summaryDiv { + height: 600px; +} + +#sourceDiv { + height: 600px; +} diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/jscoverage-throbber.gif b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/jscoverage-throbber.gif new file mode 100644 index 0000000000000000000000000000000000000000..f13c0b4ecc4327d891568b6494d60f0428741094 GIT binary patch literal 425 zcmZ?wbhEHbWM^P!c+AZJ1gxyA3JMB#c6JU94habfwY9Yk4GjwxEI4rBz=H=5{-XlL z|J;7AA;Hd$0j@@R2F#2={fa+X7`Yhu8FWB~fsAEf5&Ph&u(TrN>S}q#&`BOgn?s%^ zhV^T?;!vunS}Ag6b-d=(MIOf|ho~muQL2<$8FFRyeM?aWj}wbSQt>D~sr0mR%9Yjf zPE!>;PBMoq#ivwRwQ38{0bZhx9;cK;R1@$xKqa;6%azshgF*v64mgJ_#iR73%F-$k kU smaller than surrounding text. Because +the table already has font-size small, this would make the font-size within the +
     x-small.  So we don't rely on the default.
    +*/
    +table#sourceTable pre {
    +  font-size: medium;
    +}
    +
    +table#sourceTable td {
    +  border: 0px;
    +  padding-top: 0px;
    +  padding-bottom: 0px;
    +  padding-left: 10px;
    +  padding-right: 10px;
    +}
    +
    +table#sourceTable pre {
    +  border: 0px;
    +  margin: 0px;
    +}
    +
    +.g {
    +  background-color: #bfffbf;
    +}
    +
    +.y {
    +  background-color: #ffffbf;
    +}
    +
    +.r {
    +  background-color: #ffbfbf;
    +}
    +
    +/*******************************************************************************
    +store tab
    +*/
    +
    +#storeDiv {
    +  position: absolute;
    +  top: 3em;
    +  left: 1em;
    +  right: 1em;
    +  bottom: 1em;
    +  overflow: auto;
    +}
    +
    +/*******************************************************************************
    +about tab
    +*/
    +
    +p {
    +  margin-top: 0;
    +}
    +
    +/*******************************************************************************
    +tabs
    +*/
    +
    +#tabs {
    +  position: absolute;
    +  top: 3em;
    +  left: 1.5em;
    +  right: 1.5em;
    +  height: 2em;
    +}
    +
    +#tabs div {
    +  background-color: white;
    +  position: relative;
    +  float: left;
    +  border: 1px solid black;
    +  border-bottom-width: 0;
    +  cursor: pointer;
    +  margin-left: 0.5em;
    +  margin-right: 0.5em;
    +  padding-left: 0.5em;
    +  padding-right: 0.5em;
    +  height: 2em;
    +  z-index: 1;
    +  line-height: 1.8em;
    +}
    +
    +#tabs div.selected {
    +  z-index: 3;
    +  cursor: default;
    +}
    +
    +#tabs div.disabled {
    +  /* windows system color GrayText */
    +  color: #808080;
    +  cursor: default; 
    +}
    +
    +.TabPage {
    +  background-color: white;
    +  border: 1px solid black;
    +  position: absolute;
    +  top: 5em;
    +  left: 1.5em;
    +  right: 1.5em;
    +  bottom: 1.5em;
    +  z-index: 2;
    +  padding: 1em;
    +  display: none;
    +}
    +
    +#tabPages div.selected {
    +  display: block;
    +}
    +
    +img {
    +  visibility: hidden;
    +}
    diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/jscoverage.html b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/jscoverage.html
    new file mode 100644
    index 000000000..00d35185a
    --- /dev/null
    +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/jscoverage.html
    @@ -0,0 +1,164 @@
    +
    +
    +
    +
    +
    +
    +JSCoverage
    +
    +
    +
    +
    +
    +
    +
    +
    + + +
    +

    +Recent web browsers tend to place significant security restrictions on the use +of file: URLs. These restrictions can prevent JSCoverage from +working properly. To avoid problems, it is recommended that you do either of the +following: +

    +
      +
    • If you are using the jscoverage program to instrument your +JavaScript code, install the instrumented files on a web server.
    • +
    • Use the jscoverage-server program (which itself acts as a web +server).
    • +
    +

    +See the +manual +for further details. +

    + +
    + +
    +

    +Recent web browsers tend to place significant security restrictions on the use +of file: URLs. These restrictions can prevent JSCoverage from +working properly. To avoid problems, it is recommended that you view coverage +reports stored to the filesystem by serving them from a web server. +

    +

    +See the +manual +for further details. +

    + +
    + +
    +
    Browser
    +
    Summary
    +
    Source
    +
    Store
    +
    About
    +
    +
    +
    +
    + URL: + + +
    +
    + +
    +
    +
    + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + +
    FileStatementsExecutedCoverage
    + Total: + 0 + 00 +
    +
    +
    + 0% +
    +
    +
    +
    +
    +
    +
    +
    + + loading... +
    +
    +
    +

    + This is version 0.5.1 of JSCoverage, a program that calculates code + coverage statistics for JavaScript. +

    +

    + See http://siliconforks.com/jscoverage/ for more information. +

    +

    + Copyright © 2007, 2008, 2009, 2010 siliconforks.com +

    +
    +
    +
    + + diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/jscoverage.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/jscoverage.js new file mode 100644 index 000000000..4233615a4 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/jscoverage.js @@ -0,0 +1,1176 @@ +/* + jscoverage.js - code coverage for JavaScript + Copyright (C) 2007, 2008, 2009, 2010 siliconforks.com + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +function jscoverage_openWarningDialog() { + var id; + if (jscoverage_isReport) { + id = 'reportWarningDialog'; + } + else { + id = 'warningDialog'; + } + var dialog = document.getElementById(id); + dialog.style.display = 'block'; +} + +function jscoverage_closeWarningDialog() { + var id; + if (jscoverage_isReport) { + id = 'reportWarningDialog'; + } + else { + id = 'warningDialog'; + } + var dialog = document.getElementById(id); + dialog.style.display = 'none'; +} + +/** +Initializes the _$jscoverage object in a window. This should be the first +function called in the page. +@param w this should always be the global window object +*/ +function jscoverage_init(w) { + try { + // in Safari, "import" is a syntax error + Components.utils['import']('resource://app/modules/jscoverage.jsm'); + jscoverage_isInvertedMode = true; + return; + } + catch (e) {} + + // check if we are in inverted mode + if (w.opener) { + try { + if (w.opener.top._$jscoverage) { + jscoverage_isInvertedMode = true; + if (! w._$jscoverage) { + w._$jscoverage = w.opener.top._$jscoverage; + } + } + else { + jscoverage_isInvertedMode = false; + } + } + catch (e) { + try { + if (w.opener._$jscoverage) { + jscoverage_isInvertedMode = true; + if (! w._$jscoverage) { + w._$jscoverage = w.opener._$jscoverage; + } + } + else { + jscoverage_isInvertedMode = false; + } + } + catch (e2) { + jscoverage_isInvertedMode = false; + } + } + } + else { + jscoverage_isInvertedMode = false; + } + + if (! jscoverage_isInvertedMode) { + if (! w._$jscoverage) { + w._$jscoverage = {}; + } + } +} + +var jscoverage_currentFile = null; +var jscoverage_currentLine = null; + +var jscoverage_inLengthyOperation = false; + +/* +Possible states: + isInvertedMode isServer isReport tabs +normal false false false Browser +inverted true false false +server, normal false true false Browser, Store +server, inverted true true false Store +report false false true +*/ +var jscoverage_isInvertedMode = false; +var jscoverage_isServer = false; +var jscoverage_isReport = false; + +jscoverage_init(window); + +function jscoverage_createRequest() { + // Note that the IE7 XMLHttpRequest does not support file URL's. + // http://xhab.blogspot.com/2006/11/ie7-support-for-xmlhttprequest.html + // http://blogs.msdn.com/ie/archive/2006/12/06/file-uris-in-windows.aspx +//#JSCOVERAGE_IF + if (window.ActiveXObject) { + return new ActiveXObject("Microsoft.XMLHTTP"); + } + else { + return new XMLHttpRequest(); + } +} + +// http://www.quirksmode.org/js/findpos.html +function jscoverage_findPos(obj) { + var result = 0; + do { + result += obj.offsetTop; + obj = obj.offsetParent; + } + while (obj); + return result; +} + +// http://www.quirksmode.org/viewport/compatibility.html +function jscoverage_getViewportHeight() { +//#JSCOVERAGE_IF /MSIE/.test(navigator.userAgent) + if (self.innerHeight) { + // all except Explorer + return self.innerHeight; + } + else if (document.documentElement && document.documentElement.clientHeight) { + // Explorer 6 Strict Mode + return document.documentElement.clientHeight; + } + else if (document.body) { + // other Explorers + return document.body.clientHeight; + } + else { + throw "Couldn't calculate viewport height"; + } +//#JSCOVERAGE_ENDIF +} + +/** +Indicates visually that a lengthy operation has begun. The progress bar is +displayed, and the cursor is changed to busy (on browsers which support this). +*/ +function jscoverage_beginLengthyOperation() { + jscoverage_inLengthyOperation = true; + + var progressBar = document.getElementById('progressBar'); + progressBar.style.visibility = 'visible'; + ProgressBar.setPercentage(progressBar, 0); + var progressLabel = document.getElementById('progressLabel'); + progressLabel.style.visibility = 'visible'; + + /* blacklist buggy browsers */ +//#JSCOVERAGE_IF + if (! /Opera|WebKit/.test(navigator.userAgent)) { + /* + Change the cursor style of each element. Note that changing the class of the + element (to one with a busy cursor) is buggy in IE. + */ + var tabs = document.getElementById('tabs').getElementsByTagName('div'); + var i; + for (i = 0; i < tabs.length; i++) { + tabs.item(i).style.cursor = 'wait'; + } + } +} + +/** +Removes the progress bar and busy cursor. +*/ +function jscoverage_endLengthyOperation() { + var progressBar = document.getElementById('progressBar'); + ProgressBar.setPercentage(progressBar, 100); + setTimeout(function() { + jscoverage_inLengthyOperation = false; + progressBar.style.visibility = 'hidden'; + var progressLabel = document.getElementById('progressLabel'); + progressLabel.style.visibility = 'hidden'; + progressLabel.innerHTML = ''; + + var tabs = document.getElementById('tabs').getElementsByTagName('div'); + var i; + for (i = 0; i < tabs.length; i++) { + tabs.item(i).style.cursor = ''; + } + }, 50); +} + +function jscoverage_setSize() { +//#JSCOVERAGE_IF /MSIE/.test(navigator.userAgent) + var viewportHeight = jscoverage_getViewportHeight(); + + /* + border-top-width: 1px + padding-top: 10px + padding-bottom: 10px + border-bottom-width: 1px + margin-bottom: 10px + ---- + 32px + */ + var tabPages = document.getElementById('tabPages'); + var tabPageHeight = (viewportHeight - jscoverage_findPos(tabPages) - 32) + 'px'; + var nodeList = tabPages.childNodes; + var length = nodeList.length; + for (var i = 0; i < length; i++) { + var node = nodeList.item(i); + if (node.nodeType !== 1) { + continue; + } + node.style.height = tabPageHeight; + } + + var iframeDiv = document.getElementById('iframeDiv'); + // may not exist if we have removed the first tab + if (iframeDiv) { + iframeDiv.style.height = (viewportHeight - jscoverage_findPos(iframeDiv) - 21) + 'px'; + } + + var summaryDiv = document.getElementById('summaryDiv'); + summaryDiv.style.height = (viewportHeight - jscoverage_findPos(summaryDiv) - 21) + 'px'; + + var sourceDiv = document.getElementById('sourceDiv'); + sourceDiv.style.height = (viewportHeight - jscoverage_findPos(sourceDiv) - 21) + 'px'; + + var storeDiv = document.getElementById('storeDiv'); + if (storeDiv) { + storeDiv.style.height = (viewportHeight - jscoverage_findPos(storeDiv) - 21) + 'px'; + } +//#JSCOVERAGE_ENDIF +} + +/** +Returns the boolean value of a string. Values 'false', 'f', 'no', 'n', 'off', +and '0' (upper or lower case) are false. +@param s the string +@return a boolean value +*/ +function jscoverage_getBooleanValue(s) { + s = s.toLowerCase(); + if (s === 'false' || s === 'f' || s === 'no' || s === 'n' || s === 'off' || s === '0') { + return false; + } + return true; +} + +function jscoverage_removeTab(id) { + var tab = document.getElementById(id + 'Tab'); + tab.parentNode.removeChild(tab); + var tabPage = document.getElementById(id + 'TabPage'); + tabPage.parentNode.removeChild(tabPage); +} + +function jscoverage_isValidURL(url) { + // RFC 3986 + var matches = /^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/.exec(url); + if (matches === null) { + return false; + } + var scheme = matches[1]; + if (typeof scheme === 'string') { + scheme = scheme.toLowerCase(); + return scheme === '' || scheme === 'file:' || scheme === 'http:' || scheme === 'https:'; + } + return true; +} + +/** +Initializes the contents of the tabs. This sets the initial values of the +input field and iframe in the "Browser" tab and the checkbox in the "Summary" +tab. +@param queryString this should always be location.search +*/ +function jscoverage_initTabContents(queryString) { + var showMissingColumn = false; + var url = null; + var windowURL = null; + var parameters, parameter, i, index, name, value; + if (queryString.length > 0) { + // chop off the question mark + queryString = queryString.substring(1); + parameters = queryString.split(/&|;/); + for (i = 0; i < parameters.length; i++) { + parameter = parameters[i]; + index = parameter.indexOf('='); + if (index === -1) { + // still works with old syntax + url = decodeURIComponent(parameter); + } + else { + name = parameter.substr(0, index); + value = decodeURIComponent(parameter.substr(index + 1)); + if (name === 'missing' || name === 'm') { + showMissingColumn = jscoverage_getBooleanValue(value); + } + else if (name === 'url' || name === 'u' || name === 'frame' || name === 'f') { + url = value; + } + else if (name === 'window' || name === 'w') { + windowURL = value; + } + } + } + } + + var checkbox = document.getElementById('checkbox'); + checkbox.checked = showMissingColumn; + if (showMissingColumn) { + jscoverage_appendMissingColumn(); + } + + var isValidURL = function (url) { + var result = jscoverage_isValidURL(url); + if (! result) { + alert('Invalid URL: ' + url); + } + return result; + }; + + if (url !== null && isValidURL(url)) { + // this will automatically propagate to the input field + frames[0].location = url; + } + else if (windowURL !== null && isValidURL(windowURL)) { + window.open(windowURL); + } + + // if the browser tab is absent, we have to initialize the summary tab + if (! document.getElementById('browserTab')) { + jscoverage_recalculateSummaryTab(); + } +} + +function jscoverage_body_load() { + // check if this is a file: URL + if (window.location && window.location.href && /^file:/i.test(window.location.href)) { + var warningDiv = document.getElementById('warningDiv'); + warningDiv.style.display = 'block'; + } + + var progressBar = document.getElementById('progressBar'); + ProgressBar.init(progressBar); + + function reportError(e) { + jscoverage_endLengthyOperation(); + var summaryThrobber = document.getElementById('summaryThrobber'); + summaryThrobber.style.visibility = 'hidden'; + var div = document.getElementById('summaryErrorDiv'); + div.innerHTML = 'Error: ' + e; + } + + if (jscoverage_isReport) { + jscoverage_beginLengthyOperation(); + var summaryThrobber = document.getElementById('summaryThrobber'); + summaryThrobber.style.visibility = 'visible'; + var request = jscoverage_createRequest(); + try { + request.open('GET', 'jscoverage.json', true); + request.onreadystatechange = function (event) { + if (request.readyState === 4) { + try { + if (request.status !== 0 && request.status !== 200) { + throw request.status; + } + var response = request.responseText; + if (response === '') { + throw 404; + } + + var json; + if (window.JSON && window.JSON.parse) { + json = window.JSON.parse(response); + } + else { + json = eval('(' + response + ')'); + } + + var file; + for (file in json) { + if (! json.hasOwnProperty(file)) { + continue; + } + + var fileCoverage = json[file]; + _$jscoverage[file] = fileCoverage.coverage; + _$jscoverage[file].source = fileCoverage.source; + } + jscoverage_recalculateSummaryTab(); + summaryThrobber.style.visibility = 'hidden'; + } + catch (e) { + reportError(e); + } + } + }; + request.send(null); + } + catch (e) { + reportError(e); + } + + jscoverage_removeTab('browser'); + jscoverage_removeTab('store'); + } + else { + if (jscoverage_isInvertedMode) { + jscoverage_removeTab('browser'); + } + + if (! jscoverage_isServer) { + jscoverage_removeTab('store'); + } + } + + jscoverage_initTabControl(); + + jscoverage_initTabContents(location.search); +} + +function jscoverage_body_resize() { + if (/MSIE/.test(navigator.userAgent)) { + jscoverage_setSize(); + } +} + +// ----------------------------------------------------------------------------- +// tab 1 + +function jscoverage_updateBrowser() { + var input = document.getElementById("location"); + frames[0].location = input.value; +} + +function jscoverage_openWindow() { + var input = document.getElementById("location"); + var url = input.value; + window.open(url); +} + +function jscoverage_input_keypress(e) { + if (e.keyCode === 13) { + if (e.shiftKey) { + jscoverage_openWindow(); + } + else { + jscoverage_updateBrowser(); + } + } +} + +function jscoverage_openInFrameButton_click() { + jscoverage_updateBrowser(); +} + +function jscoverage_openInWindowButton_click() { + jscoverage_openWindow(); +} + +function jscoverage_browser_load() { + /* update the input box */ + var input = document.getElementById("location"); + + /* sometimes IE seems to fire this after the tab has been removed */ + if (input) { + input.value = frames[0].location; + } +} + +// ----------------------------------------------------------------------------- +// tab 2 + +function jscoverage_createHandler(file, line) { + return function () { + jscoverage_get(file, line); + return false; + }; +} + +function jscoverage_createLink(file, line) { + var link = document.createElement("a"); + link.href = '#'; + link.onclick = jscoverage_createHandler(file, line); + + var text; + if (line) { + text = line.toString(); + } + else { + text = file; + } + + link.appendChild(document.createTextNode(text)); + + return link; +} + +function jscoverage_recalculateSummaryTab(cc) { + var checkbox = document.getElementById('checkbox'); + var showMissingColumn = checkbox.checked; + + if (! cc) { + cc = window._$jscoverage; + } + if (! cc) { +//#JSCOVERAGE_IF 0 + throw "No coverage information found."; +//#JSCOVERAGE_ENDIF + } + + var tbody = document.getElementById("summaryTbody"); + while (tbody.hasChildNodes()) { + tbody.removeChild(tbody.firstChild); + } + + var totals = { files:0, statements:0, executed:0 }; + + var file; + var files = []; + for (file in cc) { + if (! cc.hasOwnProperty(file)) { + continue; + } + + files.push(file); + } + files.sort(); + + var rowCounter = 0; + for (var f = 0; f < files.length; f++) { + file = files[f]; + var lineNumber; + var num_statements = 0; + var num_executed = 0; + var missing = []; + var fileCC = cc[file]; + var length = fileCC.length; + var currentConditionalEnd = 0; + var conditionals = null; + if (fileCC.conditionals) { + conditionals = fileCC.conditionals; + } + for (lineNumber = 0; lineNumber < length; lineNumber++) { + var n = fileCC[lineNumber]; + + if (lineNumber === currentConditionalEnd) { + currentConditionalEnd = 0; + } + else if (currentConditionalEnd === 0 && conditionals && conditionals[lineNumber]) { + currentConditionalEnd = conditionals[lineNumber]; + } + + if (currentConditionalEnd !== 0) { + continue; + } + + if (n === undefined || n === null) { + continue; + } + + if (n === 0) { + missing.push(lineNumber); + } + else { + num_executed++; + } + num_statements++; + } + + var percentage = ( num_statements === 0 ? 0 : parseInt(100 * num_executed / num_statements) ); + + var row = document.createElement("tr"); + row.className = ( rowCounter++ % 2 == 0 ? "odd" : "even" ); + + var cell = document.createElement("td"); + cell.className = 'leftColumn'; + var link = jscoverage_createLink(file); + cell.appendChild(link); + + row.appendChild(cell); + + cell = document.createElement("td"); + cell.className = 'numeric'; + cell.appendChild(document.createTextNode(num_statements)); + row.appendChild(cell); + + cell = document.createElement("td"); + cell.className = 'numeric'; + cell.appendChild(document.createTextNode(num_executed)); + row.appendChild(cell); + + // new coverage td containing a bar graph + cell = document.createElement("td"); + cell.className = 'coverage'; + var pctGraph = document.createElement("div"), + covered = document.createElement("div"), + pct = document.createElement("span"); + pctGraph.className = "pctGraph"; + if( num_statements === 0 ) { + covered.className = "skipped"; + pct.appendChild(document.createTextNode("N/A")); + } else { + covered.className = "covered"; + covered.style.width = percentage + "px"; + pct.appendChild(document.createTextNode(percentage + '%')); + } + pct.className = "pct"; + pctGraph.appendChild(covered); + cell.appendChild(pctGraph); + cell.appendChild(pct); + row.appendChild(cell); + + if (showMissingColumn) { + cell = document.createElement("td"); + for (var i = 0; i < missing.length; i++) { + if (i !== 0) { + cell.appendChild(document.createTextNode(", ")); + } + link = jscoverage_createLink(file, missing[i]); + + // group contiguous missing lines; e.g., 10, 11, 12 -> 10-12 + var j, start = missing[i]; + for (;;) { + j = 1; + while (i + j < missing.length && missing[i + j] == missing[i] + j) { + j++; + } + var nextmissing = missing[i + j], cur = missing[i] + j; + if (isNaN(nextmissing)) { + break; + } + while (cur < nextmissing && ! fileCC[cur]) { + cur++; + } + if (cur < nextmissing || cur >= length) { + break; + } + i += j; + } + if (start != missing[i] || j > 1) { + i += j - 1; + link.innerHTML += "-" + missing[i]; + } + + cell.appendChild(link); + } + row.appendChild(cell); + } + + tbody.appendChild(row); + + totals['files'] ++; + totals['statements'] += num_statements; + totals['executed'] += num_executed; + + // write totals data into summaryTotals row + var tr = document.getElementById("summaryTotals"); + if (tr) { + var tds = tr.getElementsByTagName("td"); + tds[0].getElementsByTagName("span")[1].firstChild.nodeValue = totals['files']; + tds[1].firstChild.nodeValue = totals['statements']; + tds[2].firstChild.nodeValue = totals['executed']; + + var coverage = parseInt(100 * totals['executed'] / totals['statements']); + if( isNaN( coverage ) ) { + coverage = 0; + } + tds[3].getElementsByTagName("span")[0].firstChild.nodeValue = coverage + '%'; + tds[3].getElementsByTagName("div")[1].style.width = coverage + 'px'; + } + + } + jscoverage_endLengthyOperation(); +} + +function jscoverage_appendMissingColumn() { + var headerRow = document.getElementById('headerRow'); + var missingHeader = document.createElement('th'); + missingHeader.id = 'missingHeader'; + missingHeader.innerHTML = 'Missing'; + headerRow.appendChild(missingHeader); + var summaryTotals = document.getElementById('summaryTotals'); + var empty = document.createElement('td'); + empty.id = 'missingCell'; + summaryTotals.appendChild(empty); +} + +function jscoverage_removeMissingColumn() { + var missingNode; + missingNode = document.getElementById('missingHeader'); + missingNode.parentNode.removeChild(missingNode); + missingNode = document.getElementById('missingCell'); + missingNode.parentNode.removeChild(missingNode); +} + +function jscoverage_checkbox_click() { + if (jscoverage_inLengthyOperation) { + return false; + } + jscoverage_beginLengthyOperation(); + var checkbox = document.getElementById('checkbox'); + var showMissingColumn = checkbox.checked; + setTimeout(function() { + if (showMissingColumn) { + jscoverage_appendMissingColumn(); + } + else { + jscoverage_removeMissingColumn(); + } + jscoverage_recalculateSummaryTab(); + }, 50); + return true; +} + +// ----------------------------------------------------------------------------- +// tab 3 + +function jscoverage_makeTable() { + var coverage = _$jscoverage[jscoverage_currentFile]; + var lines = coverage.source; + + // this can happen if there is an error in the original JavaScript file + if (! lines) { + lines = []; + } + + var rows = ['']; + var i = 0; + var progressBar = document.getElementById('progressBar'); + var tableHTML; + var currentConditionalEnd = 0; + + function joinTableRows() { + tableHTML = rows.join(''); + ProgressBar.setPercentage(progressBar, 60); + /* + This may be a long delay, so set a timeout of 100 ms to make sure the + display is updated. + */ + setTimeout(appendTable, 100); + } + + function appendTable() { + var sourceDiv = document.getElementById('sourceDiv'); + sourceDiv.innerHTML = tableHTML; + ProgressBar.setPercentage(progressBar, 80); + setTimeout(jscoverage_scrollToLine, 0); + } + + while (i < lines.length) { + var lineNumber = i + 1; + + if (lineNumber === currentConditionalEnd) { + currentConditionalEnd = 0; + } + else if (currentConditionalEnd === 0 && coverage.conditionals && coverage.conditionals[lineNumber]) { + currentConditionalEnd = coverage.conditionals[lineNumber]; + } + + var row = ''; + row += ''; + var timesExecuted = coverage[lineNumber]; + if (timesExecuted !== undefined && timesExecuted !== null) { + if (currentConditionalEnd !== 0) { + row += ''; + } + else { + row += ''; + } + row += ''; + row += ''; + row += '\n'; + rows[lineNumber] = row; + i++; + } + rows[i + 1] = '
    ' + lineNumber + ''; + } + else if (timesExecuted === 0) { + row += ''; + } + else { + row += ''; + } + row += timesExecuted; + row += '
    ' + lines[i] + '
    '; + ProgressBar.setPercentage(progressBar, 40); + setTimeout(joinTableRows, 0); +} + +function jscoverage_scrollToLine() { + jscoverage_selectTab('sourceTab'); + if (! window.jscoverage_currentLine) { + jscoverage_endLengthyOperation(); + return; + } + var div = document.getElementById('sourceDiv'); + if (jscoverage_currentLine === 1) { + div.scrollTop = 0; + } + else { + var cell = document.getElementById('line-' + jscoverage_currentLine); + + // this might not be there if there is an error in the original JavaScript + if (cell) { + var divOffset = jscoverage_findPos(div); + var cellOffset = jscoverage_findPos(cell); + div.scrollTop = cellOffset - divOffset; + } + } + jscoverage_currentLine = 0; + jscoverage_endLengthyOperation(); +} + +/** +Loads the given file (and optional line) in the source tab. +*/ +function jscoverage_get(file, line) { + if (jscoverage_inLengthyOperation) { + return; + } + jscoverage_beginLengthyOperation(); + setTimeout(function() { + var sourceDiv = document.getElementById('sourceDiv'); + sourceDiv.innerHTML = ''; + jscoverage_selectTab('sourceTab'); + if (file === jscoverage_currentFile) { + jscoverage_currentLine = line; + jscoverage_recalculateSourceTab(); + } + else { + if (jscoverage_currentFile === null) { + var tab = document.getElementById('sourceTab'); + tab.className = ''; + tab.onclick = jscoverage_tab_click; + } + jscoverage_currentFile = file; + jscoverage_currentLine = line || 1; // when changing the source, always scroll to top + var fileDiv = document.getElementById('fileDiv'); + fileDiv.innerHTML = jscoverage_currentFile; + jscoverage_recalculateSourceTab(); + return; + } + }, 50); +} + +/** +Calculates coverage statistics for the current source file. +*/ +function jscoverage_recalculateSourceTab() { + if (! jscoverage_currentFile) { + jscoverage_endLengthyOperation(); + return; + } + var progressLabel = document.getElementById('progressLabel'); + progressLabel.innerHTML = 'Calculating coverage ...'; + var progressBar = document.getElementById('progressBar'); + ProgressBar.setPercentage(progressBar, 20); + setTimeout(jscoverage_makeTable, 0); +} + +// ----------------------------------------------------------------------------- +// tabs + +/** +Initializes the tab control. This function must be called when the document is +loaded. +*/ +function jscoverage_initTabControl() { + var tabs = document.getElementById('tabs'); + var i; + var child; + var tabNum = 0; + for (i = 0; i < tabs.childNodes.length; i++) { + child = tabs.childNodes.item(i); + if (child.nodeType === 1) { + if (child.className !== 'disabled') { + child.onclick = jscoverage_tab_click; + } + tabNum++; + } + } + jscoverage_selectTab(0); +} + +/** +Selects a tab. +@param tab the integer index of the tab (0, 1, 2, or 3) + OR + the ID of the tab element + OR + the tab element itself +*/ +function jscoverage_selectTab(tab) { + if (typeof tab !== 'number') { + tab = jscoverage_tabIndexOf(tab); + } + var tabs = document.getElementById('tabs'); + var tabPages = document.getElementById('tabPages'); + var nodeList; + var tabNum; + var i; + var node; + + nodeList = tabs.childNodes; + tabNum = 0; + for (i = 0; i < nodeList.length; i++) { + node = nodeList.item(i); + if (node.nodeType !== 1) { + continue; + } + + if (node.className !== 'disabled') { + if (tabNum === tab) { + node.className = 'selected'; + } + else { + node.className = ''; + } + } + tabNum++; + } + + nodeList = tabPages.childNodes; + tabNum = 0; + for (i = 0; i < nodeList.length; i++) { + node = nodeList.item(i); + if (node.nodeType !== 1) { + continue; + } + + if (tabNum === tab) { + node.className = 'selected TabPage'; + } + else { + node.className = 'TabPage'; + } + tabNum++; + } +} + +/** +Returns an integer (0, 1, 2, or 3) representing the index of a given tab. +@param tab the ID of the tab element + OR + the tab element itself +*/ +function jscoverage_tabIndexOf(tab) { + if (typeof tab === 'string') { + tab = document.getElementById(tab); + } + var tabs = document.getElementById('tabs'); + var i; + var child; + var tabNum = 0; + for (i = 0; i < tabs.childNodes.length; i++) { + child = tabs.childNodes.item(i); + if (child.nodeType === 1) { + if (child === tab) { + return tabNum; + } + tabNum++; + } + } +//#JSCOVERAGE_IF 0 + throw "Tab not found"; +//#JSCOVERAGE_ENDIF +} + +function jscoverage_tab_click(e) { + if (jscoverage_inLengthyOperation) { + return; + } + var target; +//#JSCOVERAGE_IF + if (e) { + target = e.target; + } + else if (window.event) { + // IE + target = window.event.srcElement; + } + if (target.className === 'selected') { + return; + } + jscoverage_beginLengthyOperation(); + setTimeout(function() { + if (target.id === 'summaryTab') { + var tbody = document.getElementById("summaryTbody"); + while (tbody.hasChildNodes()) { + tbody.removeChild(tbody.firstChild); + } + } + else if (target.id === 'sourceTab') { + var sourceDiv = document.getElementById('sourceDiv'); + sourceDiv.innerHTML = ''; + } + jscoverage_selectTab(target); + if (target.id === 'summaryTab') { + jscoverage_recalculateSummaryTab(); + } + else if (target.id === 'sourceTab') { + jscoverage_recalculateSourceTab(); + } + else { + jscoverage_endLengthyOperation(); + } + }, 50); +} + +// ----------------------------------------------------------------------------- +// progress bar + +var ProgressBar = { + init: function(element) { + element._percentage = 0; + + /* doing this via JavaScript crashes Safari */ +/* + var pctGraph = document.createElement('div'); + pctGraph.className = 'pctGraph'; + element.appendChild(pctGraph); + var covered = document.createElement('div'); + covered.className = 'covered'; + pctGraph.appendChild(covered); + var pct = document.createElement('span'); + pct.className = 'pct'; + element.appendChild(pct); +*/ + + ProgressBar._update(element); + }, + setPercentage: function(element, percentage) { + element._percentage = percentage; + ProgressBar._update(element); + }, + _update: function(element) { + var pctGraph = element.getElementsByTagName('div').item(0); + var covered = pctGraph.getElementsByTagName('div').item(0); + var pct = element.getElementsByTagName('span').item(0); + pct.innerHTML = element._percentage.toString() + '%'; + covered.style.width = element._percentage + 'px'; + } +}; + +// ----------------------------------------------------------------------------- +// reports + +function jscoverage_pad(s) { + return '0000'.substr(s.length) + s; +} + +function jscoverage_quote(s) { + return '"' + s.replace(/[\u0000-\u001f"\\\u007f-\uffff]/g, function (c) { + switch (c) { + case '\b': + return '\\b'; + case '\f': + return '\\f'; + case '\n': + return '\\n'; + case '\r': + return '\\r'; + case '\t': + return '\\t'; + // IE doesn't support this + /* + case '\v': + return '\\v'; + */ + case '"': + return '\\"'; + case '\\': + return '\\\\'; + default: + return '\\u' + jscoverage_pad(c.charCodeAt(0).toString(16)); + } + }) + '"'; +} + +function jscoverage_serializeCoverageToJSON() { + var json = []; + for (var file in _$jscoverage) { + if (! _$jscoverage.hasOwnProperty(file)) { + continue; + } + + var coverage = _$jscoverage[file]; + + var array = []; + var length = coverage.length; + for (var line = 0; line < length; line++) { + var value = coverage[line]; + if (value === undefined || value === null) { + value = 'null'; + } + array.push(value); + } + + var source = coverage.source; + var lines = []; + length = source.length; + for (var line = 0; line < length; line++) { + lines.push(jscoverage_quote(source[line])); + } + + json.push(jscoverage_quote(file) + ':{"coverage":[' + array.join(',') + '],"source":[' + lines.join(',') + ']}'); + } + return '{' + json.join(',') + '}'; +} + +function jscoverage_storeButton_click() { + if (jscoverage_inLengthyOperation) { + return; + } + + jscoverage_beginLengthyOperation(); + var img = document.getElementById('storeImg'); + img.style.visibility = 'visible'; + + var request = jscoverage_createRequest(); + request.open('POST', '/jscoverage-store', true); + request.onreadystatechange = function (event) { + if (request.readyState === 4) { + var message; + try { + if (request.status !== 200 && request.status !== 201 && request.status !== 204) { + throw request.status; + } + message = request.responseText; + } + catch (e) { + if (e.toString().search(/^\d{3}$/) === 0) { + message = e + ': ' + request.responseText; + } + else { + message = 'Could not connect to server: ' + e; + } + } + + jscoverage_endLengthyOperation(); + var img = document.getElementById('storeImg'); + img.style.visibility = 'hidden'; + + var div = document.getElementById('storeDiv'); + div.appendChild(document.createTextNode(new Date() + ': ' + message)); + div.appendChild(document.createElement('br')); + } + }; + request.setRequestHeader('Content-Type', 'application/json'); + var json = jscoverage_serializeCoverageToJSON(); + request.setRequestHeader('Content-Length', json.length.toString()); + request.send(json); +} diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/anchor.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/anchor.js new file mode 100644 index 000000000..09dd629c7 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/anchor.js @@ -0,0 +1,146 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/anchor.js']) { + _$jscoverage['plugins/anchor.js'] = []; + _$jscoverage['plugins/anchor.js'][7] = 0; + _$jscoverage['plugins/anchor.js'][8] = 0; + _$jscoverage['plugins/anchor.js'][10] = 0; + _$jscoverage['plugins/anchor.js'][11] = 0; + _$jscoverage['plugins/anchor.js'][17] = 0; + _$jscoverage['plugins/anchor.js'][18] = 0; + _$jscoverage['plugins/anchor.js'][19] = 0; + _$jscoverage['plugins/anchor.js'][20] = 0; + _$jscoverage['plugins/anchor.js'][21] = 0; + _$jscoverage['plugins/anchor.js'][22] = 0; + _$jscoverage['plugins/anchor.js'][30] = 0; + _$jscoverage['plugins/anchor.js'][31] = 0; + _$jscoverage['plugins/anchor.js'][32] = 0; + _$jscoverage['plugins/anchor.js'][33] = 0; + _$jscoverage['plugins/anchor.js'][34] = 0; + _$jscoverage['plugins/anchor.js'][35] = 0; + _$jscoverage['plugins/anchor.js'][39] = 0; + _$jscoverage['plugins/anchor.js'][57] = 0; + _$jscoverage['plugins/anchor.js'][59] = 0; + _$jscoverage['plugins/anchor.js'][60] = 0; + _$jscoverage['plugins/anchor.js'][61] = 0; + _$jscoverage['plugins/anchor.js'][62] = 0; + _$jscoverage['plugins/anchor.js'][64] = 0; + _$jscoverage['plugins/anchor.js'][65] = 0; + _$jscoverage['plugins/anchor.js'][68] = 0; + _$jscoverage['plugins/anchor.js'][70] = 0; + _$jscoverage['plugins/anchor.js'][71] = 0; + _$jscoverage['plugins/anchor.js'][72] = 0; + _$jscoverage['plugins/anchor.js'][76] = 0; +} +_$jscoverage['plugins/anchor.js'].source = ["/**"," * 锚点插件,为UEditor提供插入锚点支持"," * @file"," * @since 1.2.6.1"," */","","UE.plugins['anchor'] = function (){"," var me = this;",""," me.ready(function(){"," utils.cssRule('anchor',"," '.anchorclass{background: url(\\''"," + me.options.UEDITOR_HOME_URL +"," 'themes/default/images/anchor.gif\\') no-repeat scroll left center transparent;border: 1px dotted #0000FF;cursor: auto;display: inline-block;height: 16px;width: 15px;}',"," me.document)"," });"," me.addOutputRule(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' : ''"," })"," }"," })"," });"," me.addInputRule(function(root){"," utils.each(root.getNodesByTagName('a'),function(a){"," var val;"," if((val = a.getAttr('name')) && !a.getAttr('href')){"," a.tagName = 'img';"," a.setAttr({"," anchorname :a.getAttr('name'),"," 'class' : 'anchorclass'"," });"," a.setAttr('name')",""," }"," })"," });",""," /**"," * 插入锚点"," * @command anchor"," * @method execCommand"," * @param { String } cmd 命令字符串"," * @param { String } name 锚点名称字符串"," * @example"," * ```javascript"," * //editor 是编辑器实例"," * editor.execCommand('anchor', 'anchor1');"," * ```"," */"," me.commands['anchor'] = {"," execCommand:function (cmd, name) {"," var range = this.selection.getRange(),img = range.getClosedNode();"," if (img && img.getAttribute('anchorname')) {"," if (name) {"," img.setAttribute('anchorname', name);"," } else {"," range.setStartBefore(img).setCursor();"," domUtils.remove(img);"," }"," } else {"," if (name) {"," //只在选区的开始插入"," var anchor = this.document.createElement('img');"," range.collapse(true);"," domUtils.setAttributes(anchor,{"," 'anchorname':name,"," 'class':'anchorclass'"," });"," range.insertNode(anchor).setStartAfter(anchor).setCursor(false,true);"," }"," }"," }",""," };","","","};"]; +_$jscoverage['plugins/anchor.js'][7]++; +UE.plugins.anchor = (function () { + _$jscoverage['plugins/anchor.js'][8]++; + var me = this; + _$jscoverage['plugins/anchor.js'][10]++; + me.ready((function () { + _$jscoverage['plugins/anchor.js'][11]++; + utils.cssRule("anchor", (".anchorclass{background: url('" + me.options.UEDITOR_HOME_URL + "themes/default/images/anchor.gif') no-repeat scroll left center transparent;border: 1px dotted #0000FF;cursor: auto;display: inline-block;height: 16px;width: 15px;}"), me.document); +})); + _$jscoverage['plugins/anchor.js'][17]++; + me.addOutputRule((function (root) { + _$jscoverage['plugins/anchor.js'][18]++; + utils.each(root.getNodesByTagName("img"), (function (a) { + _$jscoverage['plugins/anchor.js'][19]++; + var val; + _$jscoverage['plugins/anchor.js'][20]++; + if ((val = a.getAttr("anchorname"))) { + _$jscoverage['plugins/anchor.js'][21]++; + a.tagName = "a"; + _$jscoverage['plugins/anchor.js'][22]++; + a.setAttr({anchorname: "", name: val, "class": ""}); + } +})); +})); + _$jscoverage['plugins/anchor.js'][30]++; + me.addInputRule((function (root) { + _$jscoverage['plugins/anchor.js'][31]++; + utils.each(root.getNodesByTagName("a"), (function (a) { + _$jscoverage['plugins/anchor.js'][32]++; + var val; + _$jscoverage['plugins/anchor.js'][33]++; + if (((val = a.getAttr("name")) && (! a.getAttr("href")))) { + _$jscoverage['plugins/anchor.js'][34]++; + a.tagName = "img"; + _$jscoverage['plugins/anchor.js'][35]++; + a.setAttr({anchorname: a.getAttr("name"), "class": "anchorclass"}); + _$jscoverage['plugins/anchor.js'][39]++; + a.setAttr("name"); + } +})); +})); + _$jscoverage['plugins/anchor.js'][57]++; + me.commands.anchor = {execCommand: (function (cmd, name) { + _$jscoverage['plugins/anchor.js'][59]++; + var range = this.selection.getRange(), img = range.getClosedNode(); + _$jscoverage['plugins/anchor.js'][60]++; + if ((img && img.getAttribute("anchorname"))) { + _$jscoverage['plugins/anchor.js'][61]++; + if (name) { + _$jscoverage['plugins/anchor.js'][62]++; + img.setAttribute("anchorname", name); + } + else { + _$jscoverage['plugins/anchor.js'][64]++; + range.setStartBefore(img).setCursor(); + _$jscoverage['plugins/anchor.js'][65]++; + domUtils.remove(img); + } + } + else { + _$jscoverage['plugins/anchor.js'][68]++; + if (name) { + _$jscoverage['plugins/anchor.js'][70]++; + var anchor = this.document.createElement("img"); + _$jscoverage['plugins/anchor.js'][71]++; + range.collapse(true); + _$jscoverage['plugins/anchor.js'][72]++; + domUtils.setAttributes(anchor, {"anchorname": name, "class": "anchorclass"}); + _$jscoverage['plugins/anchor.js'][76]++; + range.insertNode(anchor).setStartAfter(anchor).setCursor(false, true); + } + } +})}; +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/autofloat.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/autofloat.js new file mode 100644 index 000000000..6cb09ad9c --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/autofloat.js @@ -0,0 +1,290 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/autofloat.js']) { + _$jscoverage['plugins/autofloat.js'] = []; + _$jscoverage['plugins/autofloat.js'][10] = 0; + _$jscoverage['plugins/autofloat.js'][11] = 0; + _$jscoverage['plugins/autofloat.js'][13] = 0; + _$jscoverage['plugins/autofloat.js'][16] = 0; + _$jscoverage['plugins/autofloat.js'][21] = 0; + _$jscoverage['plugins/autofloat.js'][22] = 0; + _$jscoverage['plugins/autofloat.js'][24] = 0; + _$jscoverage['plugins/autofloat.js'][28] = 0; + _$jscoverage['plugins/autofloat.js'][29] = 0; + _$jscoverage['plugins/autofloat.js'][30] = 0; + _$jscoverage['plugins/autofloat.js'][31] = 0; + _$jscoverage['plugins/autofloat.js'][33] = 0; + _$jscoverage['plugins/autofloat.js'][35] = 0; + _$jscoverage['plugins/autofloat.js'][36] = 0; + _$jscoverage['plugins/autofloat.js'][37] = 0; + _$jscoverage['plugins/autofloat.js'][38] = 0; + _$jscoverage['plugins/autofloat.js'][40] = 0; + _$jscoverage['plugins/autofloat.js'][45] = 0; + _$jscoverage['plugins/autofloat.js'][46] = 0; + _$jscoverage['plugins/autofloat.js'][49] = 0; + _$jscoverage['plugins/autofloat.js'][50] = 0; + _$jscoverage['plugins/autofloat.js'][51] = 0; + _$jscoverage['plugins/autofloat.js'][52] = 0; + _$jscoverage['plugins/autofloat.js'][53] = 0; + _$jscoverage['plugins/autofloat.js'][54] = 0; + _$jscoverage['plugins/autofloat.js'][56] = 0; + _$jscoverage['plugins/autofloat.js'][58] = 0; + _$jscoverage['plugins/autofloat.js'][59] = 0; + _$jscoverage['plugins/autofloat.js'][60] = 0; + _$jscoverage['plugins/autofloat.js'][62] = 0; + _$jscoverage['plugins/autofloat.js'][63] = 0; + _$jscoverage['plugins/autofloat.js'][64] = 0; + _$jscoverage['plugins/autofloat.js'][65] = 0; + _$jscoverage['plugins/autofloat.js'][69] = 0; + _$jscoverage['plugins/autofloat.js'][70] = 0; + _$jscoverage['plugins/autofloat.js'][71] = 0; + _$jscoverage['plugins/autofloat.js'][72] = 0; + _$jscoverage['plugins/autofloat.js'][74] = 0; + _$jscoverage['plugins/autofloat.js'][77] = 0; + _$jscoverage['plugins/autofloat.js'][78] = 0; + _$jscoverage['plugins/autofloat.js'][79] = 0; + _$jscoverage['plugins/autofloat.js'][80] = 0; + _$jscoverage['plugins/autofloat.js'][81] = 0; + _$jscoverage['plugins/autofloat.js'][83] = 0; + _$jscoverage['plugins/autofloat.js'][86] = 0; + _$jscoverage['plugins/autofloat.js'][87] = 0; + _$jscoverage['plugins/autofloat.js'][90] = 0; + _$jscoverage['plugins/autofloat.js'][91] = 0; + _$jscoverage['plugins/autofloat.js'][92] = 0; + _$jscoverage['plugins/autofloat.js'][95] = 0; + _$jscoverage['plugins/autofloat.js'][96] = 0; + _$jscoverage['plugins/autofloat.js'][98] = 0; + _$jscoverage['plugins/autofloat.js'][99] = 0; + _$jscoverage['plugins/autofloat.js'][100] = 0; + _$jscoverage['plugins/autofloat.js'][101] = 0; + _$jscoverage['plugins/autofloat.js'][102] = 0; + _$jscoverage['plugins/autofloat.js'][103] = 0; + _$jscoverage['plugins/autofloat.js'][104] = 0; + _$jscoverage['plugins/autofloat.js'][106] = 0; + _$jscoverage['plugins/autofloat.js'][107] = 0; + _$jscoverage['plugins/autofloat.js'][109] = 0; + _$jscoverage['plugins/autofloat.js'][110] = 0; + _$jscoverage['plugins/autofloat.js'][111] = 0; + _$jscoverage['plugins/autofloat.js'][114] = 0; + _$jscoverage['plugins/autofloat.js'][115] = 0; + _$jscoverage['plugins/autofloat.js'][116] = 0; + _$jscoverage['plugins/autofloat.js'][119] = 0; + _$jscoverage['plugins/autofloat.js'][120] = 0; + _$jscoverage['plugins/autofloat.js'][121] = 0; + _$jscoverage['plugins/autofloat.js'][124] = 0; + _$jscoverage['plugins/autofloat.js'][125] = 0; + _$jscoverage['plugins/autofloat.js'][126] = 0; +} +_$jscoverage['plugins/autofloat.js'].source = ["///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,"," \t\tLteIE6 = 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';"," }","\t\tvar\tbakCssText,","\t\t\tplaceHolder = document.createElement('div'),"," toolbarBox,orgTop,"," getPosition,"," flag =true; //ie7模式下需要偏移","\t\tfunction setFloating(){","\t\t\tvar toobarBoxPos = domUtils.getXY(toolbarBox),","\t\t\t\torigalFloat = domUtils.getComputedStyle(toolbarBox,'position'),"," origalLeft = domUtils.getComputedStyle(toolbarBox,'left');","\t\t\ttoolbarBox.style.width = toolbarBox.offsetWidth + 'px';"," toolbarBox.style.zIndex = me.options.zIndex * 1 + 1;","\t\t\ttoolbarBox.parentNode.insertBefore(placeHolder, toolbarBox);","\t\t\tif (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';","\t\t\t} 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');"," }","\t\t\t}","\t\t}","\t\tfunction unsetFloating(){"," flag = true;"," if(placeHolder.parentNode){"," placeHolder.parentNode.removeChild(placeHolder);"," }","\t\t\ttoolbarBox.style.cssText = bakCssText;","\t\t}",""," function updateFloating(){"," var rect3 = getPosition(me.container);"," var offset=me.options.toolbarTopOffset||0;"," if (rect3.top < 0 && rect3.bottom - toolbarBox.offsetHeight > offset) {"," setFloating();"," }else{"," unsetFloating();"," }"," }"," var defer_updateFloating = utils.defer(function(){"," updateFloating();"," },browser.ie ? 200 : 100,true);",""," me.addListener('destroy',function(){"," domUtils.un(window, ['scroll','resize'], updateFloating);"," me.removeListener('keydown', defer_updateFloating);"," });",""," me.addListener('ready', function(){"," if(checkHasUI(me)){",""," getPosition = uiUtils.getClientRect;"," toolbarBox = me.ui.getDom('toolbarbox');"," orgTop = getPosition(toolbarBox).top;"," bakCssText = toolbarBox.style.cssText;"," placeHolder.style.height = toolbarBox.offsetHeight + 'px';"," if(LteIE6){"," fixIE6FixedPos();"," }"," domUtils.on(window, ['scroll','resize'], updateFloating);"," me.addListener('keydown', defer_updateFloating);",""," me.addListener('beforefullscreenchange', function (t, enabled){"," if (enabled) {"," unsetFloating();"," }"," });"," me.addListener('fullscreenchanged', function (t, enabled){"," if (!enabled) {"," updateFloating();"," }"," });"," me.addListener('sourcemodechanged', function (t, enabled){"," setTimeout(function (){"," updateFloating();"," },0);"," });"," me.addListener(\"clearDoc\",function(){"," setTimeout(function(){"," updateFloating();"," },0);",""," })"," }"," });","\t};"]; +_$jscoverage['plugins/autofloat.js'][10]++; +UE.plugins.autofloat = (function () { + _$jscoverage['plugins/autofloat.js'][11]++; + var me = this, lang = me.getLang(); + _$jscoverage['plugins/autofloat.js'][13]++; + me.setOpt({topOffset: 0}); + _$jscoverage['plugins/autofloat.js'][16]++; + var optsAutoFloatEnabled = (me.options.autoFloatEnabled !== false), topOffset = me.options.topOffset; + _$jscoverage['plugins/autofloat.js'][21]++; + if ((! optsAutoFloatEnabled)) { + _$jscoverage['plugins/autofloat.js'][22]++; + return; + } + _$jscoverage['plugins/autofloat.js'][24]++; + var uiUtils = UE.ui.uiUtils, LteIE6 = (browser.ie && (browser.version <= 6)), quirks = browser.quirks; + _$jscoverage['plugins/autofloat.js'][28]++; + function checkHasUI() { + _$jscoverage['plugins/autofloat.js'][29]++; + if ((! UE.ui)) { + _$jscoverage['plugins/autofloat.js'][30]++; + alert(lang.autofloatMsg); + _$jscoverage['plugins/autofloat.js'][31]++; + return 0; + } + _$jscoverage['plugins/autofloat.js'][33]++; + return 1; +} + _$jscoverage['plugins/autofloat.js'][35]++; + function fixIE6FixedPos() { + _$jscoverage['plugins/autofloat.js'][36]++; + var docStyle = document.body.style; + _$jscoverage['plugins/autofloat.js'][37]++; + docStyle.backgroundImage = "url(\"about:blank\")"; + _$jscoverage['plugins/autofloat.js'][38]++; + docStyle.backgroundAttachment = "fixed"; +} + _$jscoverage['plugins/autofloat.js'][40]++; + var bakCssText, placeHolder = document.createElement("div"), toolbarBox, orgTop, getPosition, flag = true; + _$jscoverage['plugins/autofloat.js'][45]++; + function setFloating() { + _$jscoverage['plugins/autofloat.js'][46]++; + var toobarBoxPos = domUtils.getXY(toolbarBox), origalFloat = domUtils.getComputedStyle(toolbarBox, "position"), origalLeft = domUtils.getComputedStyle(toolbarBox, "left"); + _$jscoverage['plugins/autofloat.js'][49]++; + toolbarBox.style.width = (toolbarBox.offsetWidth + "px"); + _$jscoverage['plugins/autofloat.js'][50]++; + toolbarBox.style.zIndex = ((me.options.zIndex * 1) + 1); + _$jscoverage['plugins/autofloat.js'][51]++; + toolbarBox.parentNode.insertBefore(placeHolder, toolbarBox); + _$jscoverage['plugins/autofloat.js'][52]++; + if ((LteIE6 || (quirks && browser.ie))) { + _$jscoverage['plugins/autofloat.js'][53]++; + if ((toolbarBox.style.position != "absolute")) { + _$jscoverage['plugins/autofloat.js'][54]++; + toolbarBox.style.position = "absolute"; + } + _$jscoverage['plugins/autofloat.js'][56]++; + toolbarBox.style.top = (((document.body.scrollTop || document.documentElement.scrollTop) - orgTop) + topOffset + "px"); + } + else { + _$jscoverage['plugins/autofloat.js'][58]++; + if ((browser.ie7Compat && flag)) { + _$jscoverage['plugins/autofloat.js'][59]++; + flag = false; + _$jscoverage['plugins/autofloat.js'][60]++; + toolbarBox.style.left = ((domUtils.getXY(toolbarBox).x - document.documentElement.getBoundingClientRect().left) + 2 + "px"); + } + _$jscoverage['plugins/autofloat.js'][62]++; + if ((toolbarBox.style.position != "fixed")) { + _$jscoverage['plugins/autofloat.js'][63]++; + toolbarBox.style.position = "fixed"; + _$jscoverage['plugins/autofloat.js'][64]++; + toolbarBox.style.top = (topOffset + "px"); + _$jscoverage['plugins/autofloat.js'][65]++; + (((origalFloat == "absolute") || (origalFloat == "relative")) && parseFloat(origalLeft) && (toolbarBox.style.left = (toobarBoxPos.x + "px"))); + } + } +} + _$jscoverage['plugins/autofloat.js'][69]++; + function unsetFloating() { + _$jscoverage['plugins/autofloat.js'][70]++; + flag = true; + _$jscoverage['plugins/autofloat.js'][71]++; + if (placeHolder.parentNode) { + _$jscoverage['plugins/autofloat.js'][72]++; + placeHolder.parentNode.removeChild(placeHolder); + } + _$jscoverage['plugins/autofloat.js'][74]++; + toolbarBox.style.cssText = bakCssText; +} + _$jscoverage['plugins/autofloat.js'][77]++; + function updateFloating() { + _$jscoverage['plugins/autofloat.js'][78]++; + var rect3 = getPosition(me.container); + _$jscoverage['plugins/autofloat.js'][79]++; + var offset = (me.options.toolbarTopOffset || 0); + _$jscoverage['plugins/autofloat.js'][80]++; + if (((rect3.top < 0) && ((rect3.bottom - toolbarBox.offsetHeight) > offset))) { + _$jscoverage['plugins/autofloat.js'][81]++; + setFloating(); + } + else { + _$jscoverage['plugins/autofloat.js'][83]++; + unsetFloating(); + } +} + _$jscoverage['plugins/autofloat.js'][86]++; + var defer_updateFloating = utils.defer((function () { + _$jscoverage['plugins/autofloat.js'][87]++; + updateFloating(); +}), (browser.ie? 200: 100), true); + _$jscoverage['plugins/autofloat.js'][90]++; + me.addListener("destroy", (function () { + _$jscoverage['plugins/autofloat.js'][91]++; + domUtils.un(window, ["scroll", "resize"], updateFloating); + _$jscoverage['plugins/autofloat.js'][92]++; + me.removeListener("keydown", defer_updateFloating); +})); + _$jscoverage['plugins/autofloat.js'][95]++; + me.addListener("ready", (function () { + _$jscoverage['plugins/autofloat.js'][96]++; + if (checkHasUI(me)) { + _$jscoverage['plugins/autofloat.js'][98]++; + getPosition = uiUtils.getClientRect; + _$jscoverage['plugins/autofloat.js'][99]++; + toolbarBox = me.ui.getDom("toolbarbox"); + _$jscoverage['plugins/autofloat.js'][100]++; + orgTop = getPosition(toolbarBox).top; + _$jscoverage['plugins/autofloat.js'][101]++; + bakCssText = toolbarBox.style.cssText; + _$jscoverage['plugins/autofloat.js'][102]++; + placeHolder.style.height = (toolbarBox.offsetHeight + "px"); + _$jscoverage['plugins/autofloat.js'][103]++; + if (LteIE6) { + _$jscoverage['plugins/autofloat.js'][104]++; + fixIE6FixedPos(); + } + _$jscoverage['plugins/autofloat.js'][106]++; + domUtils.on(window, ["scroll", "resize"], updateFloating); + _$jscoverage['plugins/autofloat.js'][107]++; + me.addListener("keydown", defer_updateFloating); + _$jscoverage['plugins/autofloat.js'][109]++; + me.addListener("beforefullscreenchange", (function (t, enabled) { + _$jscoverage['plugins/autofloat.js'][110]++; + if (enabled) { + _$jscoverage['plugins/autofloat.js'][111]++; + unsetFloating(); + } +})); + _$jscoverage['plugins/autofloat.js'][114]++; + me.addListener("fullscreenchanged", (function (t, enabled) { + _$jscoverage['plugins/autofloat.js'][115]++; + if ((! enabled)) { + _$jscoverage['plugins/autofloat.js'][116]++; + updateFloating(); + } +})); + _$jscoverage['plugins/autofloat.js'][119]++; + me.addListener("sourcemodechanged", (function (t, enabled) { + _$jscoverage['plugins/autofloat.js'][120]++; + setTimeout((function () { + _$jscoverage['plugins/autofloat.js'][121]++; + updateFloating(); +}), 0); +})); + _$jscoverage['plugins/autofloat.js'][124]++; + me.addListener("clearDoc", (function () { + _$jscoverage['plugins/autofloat.js'][125]++; + setTimeout((function () { + _$jscoverage['plugins/autofloat.js'][126]++; + updateFloating(); +}), 0); +})); + } +})); +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/autoheight.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/autoheight.js new file mode 100644 index 000000000..ba8195a94 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/autoheight.js @@ -0,0 +1,224 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/autoheight.js']) { + _$jscoverage['plugins/autoheight.js'] = []; + _$jscoverage['plugins/autoheight.js'][9] = 0; + _$jscoverage['plugins/autoheight.js'][10] = 0; + _$jscoverage['plugins/autoheight.js'][12] = 0; + _$jscoverage['plugins/autoheight.js'][13] = 0; + _$jscoverage['plugins/autoheight.js'][14] = 0; + _$jscoverage['plugins/autoheight.js'][17] = 0; + _$jscoverage['plugins/autoheight.js'][24] = 0; + _$jscoverage['plugins/autoheight.js'][25] = 0; + _$jscoverage['plugins/autoheight.js'][26] = 0; + _$jscoverage['plugins/autoheight.js'][27] = 0; + _$jscoverage['plugins/autoheight.js'][28] = 0; + _$jscoverage['plugins/autoheight.js'][29] = 0; + _$jscoverage['plugins/autoheight.js'][30] = 0; + _$jscoverage['plugins/autoheight.js'][31] = 0; + _$jscoverage['plugins/autoheight.js'][33] = 0; + _$jscoverage['plugins/autoheight.js'][34] = 0; + _$jscoverage['plugins/autoheight.js'][36] = 0; + _$jscoverage['plugins/autoheight.js'][37] = 0; + _$jscoverage['plugins/autoheight.js'][38] = 0; + _$jscoverage['plugins/autoheight.js'][39] = 0; + _$jscoverage['plugins/autoheight.js'][41] = 0; + _$jscoverage['plugins/autoheight.js'][43] = 0; + _$jscoverage['plugins/autoheight.js'][45] = 0; + _$jscoverage['plugins/autoheight.js'][50] = 0; + _$jscoverage['plugins/autoheight.js'][51] = 0; + _$jscoverage['plugins/autoheight.js'][52] = 0; + _$jscoverage['plugins/autoheight.js'][54] = 0; + _$jscoverage['plugins/autoheight.js'][55] = 0; + _$jscoverage['plugins/autoheight.js'][57] = 0; + _$jscoverage['plugins/autoheight.js'][58] = 0; + _$jscoverage['plugins/autoheight.js'][59] = 0; + _$jscoverage['plugins/autoheight.js'][60] = 0; + _$jscoverage['plugins/autoheight.js'][62] = 0; + _$jscoverage['plugins/autoheight.js'][63] = 0; + _$jscoverage['plugins/autoheight.js'][64] = 0; + _$jscoverage['plugins/autoheight.js'][65] = 0; + _$jscoverage['plugins/autoheight.js'][66] = 0; + _$jscoverage['plugins/autoheight.js'][69] = 0; + _$jscoverage['plugins/autoheight.js'][70] = 0; + _$jscoverage['plugins/autoheight.js'][72] = 0; + _$jscoverage['plugins/autoheight.js'][74] = 0; + _$jscoverage['plugins/autoheight.js'][76] = 0; + _$jscoverage['plugins/autoheight.js'][78] = 0; + _$jscoverage['plugins/autoheight.js'][79] = 0; + _$jscoverage['plugins/autoheight.js'][80] = 0; + _$jscoverage['plugins/autoheight.js'][81] = 0; + _$jscoverage['plugins/autoheight.js'][82] = 0; + _$jscoverage['plugins/autoheight.js'][84] = 0; + _$jscoverage['plugins/autoheight.js'][85] = 0; + _$jscoverage['plugins/autoheight.js'][87] = 0; + _$jscoverage['plugins/autoheight.js'][88] = 0; + _$jscoverage['plugins/autoheight.js'][89] = 0; + _$jscoverage['plugins/autoheight.js'][90] = 0; + _$jscoverage['plugins/autoheight.js'][91] = 0; +} +_$jscoverage['plugins/autoheight.js'].source = ["///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,"," span, tmpNode,"," lastHeight = 0,"," options = me.options,"," currentHeight,"," timer;",""," function adjustHeight() {"," var me = this;"," clearTimeout(timer);"," if(isFullscreen)return;"," timer = setTimeout(function () {"," if (!me.queryCommandState || me.queryCommandState && me.queryCommandState('source') != 1) {"," if (!span) {"," span = me.document.createElement('span');"," //trace:1764"," span.style.cssText = 'display:block;width:0;margin:0;padding:0;border:0;clear:both;';"," span.innerHTML = '.';"," }"," tmpNode = span.cloneNode(true);"," me.body.appendChild(tmpNode);"," currentHeight = Math.max(domUtils.getXY(tmpNode).y + tmpNode.offsetHeight,Math.max(options.minFrameHeight, options.initialFrameHeight));"," if (currentHeight != lastHeight) {",""," me.setHeight(currentHeight,true);",""," lastHeight = currentHeight;"," }"," domUtils.remove(tmpNode);",""," }"," }, 50);"," }"," var isFullscreen;"," me.addListener('fullscreenchanged',function(cmd,f){"," isFullscreen = f"," });"," me.addListener('destroy', function () {"," 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.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 () {"," adjustHeight.call(this);"," }, 100);",""," });"," });","","","};",""]; +_$jscoverage['plugins/autoheight.js'][9]++; +UE.plugins.autoheight = (function () { + _$jscoverage['plugins/autoheight.js'][10]++; + var me = this; + _$jscoverage['plugins/autoheight.js'][12]++; + me.autoHeightEnabled = (me.options.autoHeightEnabled !== false); + _$jscoverage['plugins/autoheight.js'][13]++; + if ((! me.autoHeightEnabled)) { + _$jscoverage['plugins/autoheight.js'][14]++; + return; + } + _$jscoverage['plugins/autoheight.js'][17]++; + var bakOverflow, span, tmpNode, lastHeight = 0, options = me.options, currentHeight, timer; + _$jscoverage['plugins/autoheight.js'][24]++; + function adjustHeight() { + _$jscoverage['plugins/autoheight.js'][25]++; + var me = this; + _$jscoverage['plugins/autoheight.js'][26]++; + clearTimeout(timer); + _$jscoverage['plugins/autoheight.js'][27]++; + if (isFullscreen) { + _$jscoverage['plugins/autoheight.js'][27]++; + return; + } + _$jscoverage['plugins/autoheight.js'][28]++; + timer = setTimeout((function () { + _$jscoverage['plugins/autoheight.js'][29]++; + if (((! me.queryCommandState) || (me.queryCommandState && (me.queryCommandState("source") != 1)))) { + _$jscoverage['plugins/autoheight.js'][30]++; + if ((! span)) { + _$jscoverage['plugins/autoheight.js'][31]++; + span = me.document.createElement("span"); + _$jscoverage['plugins/autoheight.js'][33]++; + span.style.cssText = "display:block;width:0;margin:0;padding:0;border:0;clear:both;"; + _$jscoverage['plugins/autoheight.js'][34]++; + span.innerHTML = "."; + } + _$jscoverage['plugins/autoheight.js'][36]++; + tmpNode = span.cloneNode(true); + _$jscoverage['plugins/autoheight.js'][37]++; + me.body.appendChild(tmpNode); + _$jscoverage['plugins/autoheight.js'][38]++; + currentHeight = Math.max((domUtils.getXY(tmpNode).y + tmpNode.offsetHeight), Math.max(options.minFrameHeight, options.initialFrameHeight)); + _$jscoverage['plugins/autoheight.js'][39]++; + if ((currentHeight != lastHeight)) { + _$jscoverage['plugins/autoheight.js'][41]++; + me.setHeight(currentHeight, true); + _$jscoverage['plugins/autoheight.js'][43]++; + lastHeight = currentHeight; + } + _$jscoverage['plugins/autoheight.js'][45]++; + domUtils.remove(tmpNode); + } +}), 50); +} + _$jscoverage['plugins/autoheight.js'][50]++; + var isFullscreen; + _$jscoverage['plugins/autoheight.js'][51]++; + me.addListener("fullscreenchanged", (function (cmd, f) { + _$jscoverage['plugins/autoheight.js'][52]++; + isFullscreen = f; +})); + _$jscoverage['plugins/autoheight.js'][54]++; + me.addListener("destroy", (function () { + _$jscoverage['plugins/autoheight.js'][55]++; + me.removeListener("contentchange afterinserthtml keyup mouseup", adjustHeight); +})); + _$jscoverage['plugins/autoheight.js'][57]++; + me.enableAutoHeight = (function () { + _$jscoverage['plugins/autoheight.js'][58]++; + var me = this; + _$jscoverage['plugins/autoheight.js'][59]++; + if ((! me.autoHeightEnabled)) { + _$jscoverage['plugins/autoheight.js'][60]++; + return; + } + _$jscoverage['plugins/autoheight.js'][62]++; + var doc = me.document; + _$jscoverage['plugins/autoheight.js'][63]++; + me.autoHeightEnabled = true; + _$jscoverage['plugins/autoheight.js'][64]++; + bakOverflow = doc.body.style.overflowY; + _$jscoverage['plugins/autoheight.js'][65]++; + doc.body.style.overflowY = "hidden"; + _$jscoverage['plugins/autoheight.js'][66]++; + me.addListener("contentchange afterinserthtml keyup mouseup", adjustHeight); + _$jscoverage['plugins/autoheight.js'][69]++; + setTimeout((function () { + _$jscoverage['plugins/autoheight.js'][70]++; + adjustHeight.call(me); +}), (browser.gecko? 100: 0)); + _$jscoverage['plugins/autoheight.js'][72]++; + me.fireEvent("autoheightchanged", me.autoHeightEnabled); +}); + _$jscoverage['plugins/autoheight.js'][74]++; + me.disableAutoHeight = (function () { + _$jscoverage['plugins/autoheight.js'][76]++; + me.body.style.overflowY = (bakOverflow || ""); + _$jscoverage['plugins/autoheight.js'][78]++; + me.removeListener("contentchange", adjustHeight); + _$jscoverage['plugins/autoheight.js'][79]++; + me.removeListener("keyup", adjustHeight); + _$jscoverage['plugins/autoheight.js'][80]++; + me.removeListener("mouseup", adjustHeight); + _$jscoverage['plugins/autoheight.js'][81]++; + me.autoHeightEnabled = false; + _$jscoverage['plugins/autoheight.js'][82]++; + me.fireEvent("autoheightchanged", me.autoHeightEnabled); +}); + _$jscoverage['plugins/autoheight.js'][84]++; + me.addListener("ready", (function () { + _$jscoverage['plugins/autoheight.js'][85]++; + me.enableAutoHeight(); + _$jscoverage['plugins/autoheight.js'][87]++; + var timer; + _$jscoverage['plugins/autoheight.js'][88]++; + domUtils.on((browser.ie? me.body: me.document), (browser.webkit? "dragover": "drop"), (function () { + _$jscoverage['plugins/autoheight.js'][89]++; + clearTimeout(timer); + _$jscoverage['plugins/autoheight.js'][90]++; + timer = setTimeout((function () { + _$jscoverage['plugins/autoheight.js'][91]++; + adjustHeight.call(this); +}), 100); +})); +})); +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/autolink.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/autolink.js new file mode 100644 index 000000000..e232a6180 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/autolink.js @@ -0,0 +1,246 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/autolink.js']) { + _$jscoverage['plugins/autolink.js'] = []; + _$jscoverage['plugins/autolink.js'][9] = 0; + _$jscoverage['plugins/autolink.js'][10] = 0; + _$jscoverage['plugins/autolink.js'][11] = 0; + _$jscoverage['plugins/autolink.js'][12] = 0; + _$jscoverage['plugins/autolink.js'][14] = 0; + _$jscoverage['plugins/autolink.js'][15] = 0; + _$jscoverage['plugins/autolink.js'][16] = 0; + _$jscoverage['plugins/autolink.js'][18] = 0; + _$jscoverage['plugins/autolink.js'][19] = 0; + _$jscoverage['plugins/autolink.js'][21] = 0; + _$jscoverage['plugins/autolink.js'][23] = 0; + _$jscoverage['plugins/autolink.js'][28] = 0; + _$jscoverage['plugins/autolink.js'][29] = 0; + _$jscoverage['plugins/autolink.js'][30] = 0; + _$jscoverage['plugins/autolink.js'][31] = 0; + _$jscoverage['plugins/autolink.js'][32] = 0; + _$jscoverage['plugins/autolink.js'][34] = 0; + _$jscoverage['plugins/autolink.js'][35] = 0; + _$jscoverage['plugins/autolink.js'][36] = 0; + _$jscoverage['plugins/autolink.js'][39] = 0; + _$jscoverage['plugins/autolink.js'][40] = 0; + _$jscoverage['plugins/autolink.js'][41] = 0; + _$jscoverage['plugins/autolink.js'][43] = 0; + _$jscoverage['plugins/autolink.js'][44] = 0; + _$jscoverage['plugins/autolink.js'][46] = 0; + _$jscoverage['plugins/autolink.js'][47] = 0; + _$jscoverage['plugins/autolink.js'][49] = 0; + _$jscoverage['plugins/autolink.js'][51] = 0; + _$jscoverage['plugins/autolink.js'][52] = 0; + _$jscoverage['plugins/autolink.js'][54] = 0; + _$jscoverage['plugins/autolink.js'][55] = 0; + _$jscoverage['plugins/autolink.js'][58] = 0; + _$jscoverage['plugins/autolink.js'][59] = 0; + _$jscoverage['plugins/autolink.js'][60] = 0; + _$jscoverage['plugins/autolink.js'][61] = 0; + _$jscoverage['plugins/autolink.js'][63] = 0; + _$jscoverage['plugins/autolink.js'][64] = 0; + _$jscoverage['plugins/autolink.js'][67] = 0; + _$jscoverage['plugins/autolink.js'][68] = 0; + _$jscoverage['plugins/autolink.js'][69] = 0; + _$jscoverage['plugins/autolink.js'][70] = 0; + _$jscoverage['plugins/autolink.js'][72] = 0; + _$jscoverage['plugins/autolink.js'][75] = 0; + _$jscoverage['plugins/autolink.js'][81] = 0; + _$jscoverage['plugins/autolink.js'][82] = 0; + _$jscoverage['plugins/autolink.js'][84] = 0; + _$jscoverage['plugins/autolink.js'][86] = 0; + _$jscoverage['plugins/autolink.js'][87] = 0; + _$jscoverage['plugins/autolink.js'][88] = 0; + _$jscoverage['plugins/autolink.js'][89] = 0; + _$jscoverage['plugins/autolink.js'][90] = 0; + _$jscoverage['plugins/autolink.js'][91] = 0; + _$jscoverage['plugins/autolink.js'][92] = 0; + _$jscoverage['plugins/autolink.js'][94] = 0; + _$jscoverage['plugins/autolink.js'][95] = 0; + _$jscoverage['plugins/autolink.js'][96] = 0; + _$jscoverage['plugins/autolink.js'][97] = 0; + _$jscoverage['plugins/autolink.js'][98] = 0; + _$jscoverage['plugins/autolink.js'][99] = 0; + _$jscoverage['plugins/autolink.js'][100] = 0; +} +_$jscoverage['plugins/autolink.js'].source = ["///import core","///commands 为非ie浏览器自动添加a标签","///commandsName AutoLink","///commandsTitle 自动增加链接","/*"," * @description 为非ie浏览器自动添加a标签"," * @author zhanyi"," */"," UE.plugins['autolink'] = function() {"," var cont = 0;"," if (browser.ie) {"," return;"," }"," var me = this;"," me.addListener('reset',function(){"," cont = 0;"," });"," me.addListener('keydown', function(type, evt) {"," 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?:\\/\\/)/ig.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();"," }"," }"," });"," };"]; +_$jscoverage['plugins/autolink.js'][9]++; +UE.plugins.autolink = (function () { + _$jscoverage['plugins/autolink.js'][10]++; + var cont = 0; + _$jscoverage['plugins/autolink.js'][11]++; + if (browser.ie) { + _$jscoverage['plugins/autolink.js'][12]++; + return; + } + _$jscoverage['plugins/autolink.js'][14]++; + var me = this; + _$jscoverage['plugins/autolink.js'][15]++; + me.addListener("reset", (function () { + _$jscoverage['plugins/autolink.js'][16]++; + cont = 0; +})); + _$jscoverage['plugins/autolink.js'][18]++; + me.addListener("keydown", (function (type, evt) { + _$jscoverage['plugins/autolink.js'][19]++; + var keyCode = (evt.keyCode || evt.which); + _$jscoverage['plugins/autolink.js'][21]++; + if (((keyCode == 32) || (keyCode == 13))) { + _$jscoverage['plugins/autolink.js'][23]++; + var sel = me.selection.getNative(), range = sel.getRangeAt(0).cloneRange(), offset, charCode; + _$jscoverage['plugins/autolink.js'][28]++; + var start = range.startContainer; + _$jscoverage['plugins/autolink.js'][29]++; + while (((start.nodeType == 1) && (range.startOffset > 0))) { + _$jscoverage['plugins/autolink.js'][30]++; + start = range.startContainer.childNodes[(range.startOffset - 1)]; + _$jscoverage['plugins/autolink.js'][31]++; + if ((! start)) { + _$jscoverage['plugins/autolink.js'][32]++; + break; + } + _$jscoverage['plugins/autolink.js'][34]++; + range.setStart(start, ((start.nodeType == 1)? start.childNodes.length: start.nodeValue.length)); + _$jscoverage['plugins/autolink.js'][35]++; + range.collapse(true); + _$jscoverage['plugins/autolink.js'][36]++; + start = range.startContainer; +} + _$jscoverage['plugins/autolink.js'][39]++; + do { + _$jscoverage['plugins/autolink.js'][40]++; + if ((range.startOffset == 0)) { + _$jscoverage['plugins/autolink.js'][41]++; + start = range.startContainer.previousSibling; + _$jscoverage['plugins/autolink.js'][43]++; + while ((start && (start.nodeType == 1))) { + _$jscoverage['plugins/autolink.js'][44]++; + start = start.lastChild; +} + _$jscoverage['plugins/autolink.js'][46]++; + if (((! start) || domUtils.isFillChar(start))) { + _$jscoverage['plugins/autolink.js'][47]++; + break; + } + _$jscoverage['plugins/autolink.js'][49]++; + offset = start.nodeValue.length; + } + else { + _$jscoverage['plugins/autolink.js'][51]++; + start = range.startContainer; + _$jscoverage['plugins/autolink.js'][52]++; + offset = range.startOffset; + } + _$jscoverage['plugins/autolink.js'][54]++; + range.setStart(start, (offset - 1)); + _$jscoverage['plugins/autolink.js'][55]++; + charCode = range.toString().charCodeAt(0); +} + while (((charCode != 160) && (charCode != 32))); + _$jscoverage['plugins/autolink.js'][58]++; + if (range.toString().replace(new RegExp(domUtils.fillChar, "g"), "").match(/(?:https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)/i)) { + _$jscoverage['plugins/autolink.js'][59]++; + while (range.toString().length) { + _$jscoverage['plugins/autolink.js'][60]++; + if (/^(?:https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)/i.test(range.toString())) { + _$jscoverage['plugins/autolink.js'][61]++; + break; + } + _$jscoverage['plugins/autolink.js'][63]++; + try { + _$jscoverage['plugins/autolink.js'][64]++; + range.setStart(range.startContainer, (range.startOffset + 1)); + } + catch (e) { + _$jscoverage['plugins/autolink.js'][67]++; + var start = range.startContainer; + _$jscoverage['plugins/autolink.js'][68]++; + while ((! (next = start.nextSibling))) { + _$jscoverage['plugins/autolink.js'][69]++; + if (domUtils.isBody(start)) { + _$jscoverage['plugins/autolink.js'][70]++; + return; + } + _$jscoverage['plugins/autolink.js'][72]++; + start = start.parentNode; +} + _$jscoverage['plugins/autolink.js'][75]++; + range.setStart(next, 0); + } +} + _$jscoverage['plugins/autolink.js'][81]++; + if (domUtils.findParentByTagName(range.startContainer, "a", true)) { + _$jscoverage['plugins/autolink.js'][82]++; + return; + } + _$jscoverage['plugins/autolink.js'][84]++; + var a = me.document.createElement("a"), text = me.document.createTextNode(" "), href; + _$jscoverage['plugins/autolink.js'][86]++; + (me.undoManger && me.undoManger.save()); + _$jscoverage['plugins/autolink.js'][87]++; + a.appendChild(range.extractContents()); + _$jscoverage['plugins/autolink.js'][88]++; + a.href = (a.innerHTML = a.innerHTML.replace(/<[^>]+>/g, "")); + _$jscoverage['plugins/autolink.js'][89]++; + href = a.getAttribute("href").replace(new RegExp(domUtils.fillChar, "g"), ""); + _$jscoverage['plugins/autolink.js'][90]++; + href = (/^(?:https?:\/\/)/gi.test(href)? href: ("http://" + href)); + _$jscoverage['plugins/autolink.js'][91]++; + a.setAttribute("_src", utils.html(href)); + _$jscoverage['plugins/autolink.js'][92]++; + a.href = utils.html(href); + _$jscoverage['plugins/autolink.js'][94]++; + range.insertNode(a); + _$jscoverage['plugins/autolink.js'][95]++; + a.parentNode.insertBefore(text, a.nextSibling); + _$jscoverage['plugins/autolink.js'][96]++; + range.setStart(text, 0); + _$jscoverage['plugins/autolink.js'][97]++; + range.collapse(true); + _$jscoverage['plugins/autolink.js'][98]++; + sel.removeAllRanges(); + _$jscoverage['plugins/autolink.js'][99]++; + sel.addRange(range); + _$jscoverage['plugins/autolink.js'][100]++; + (me.undoManger && me.undoManger.save()); + } + } +})); +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/autosubmit.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/autosubmit.js new file mode 100644 index 000000000..72002947b --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/autosubmit.js @@ -0,0 +1,77 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/autosubmit.js']) { + _$jscoverage['plugins/autosubmit.js'] = []; + _$jscoverage['plugins/autosubmit.js'][17] = 0; + _$jscoverage['plugins/autosubmit.js'][18] = 0; + _$jscoverage['plugins/autosubmit.js'][19] = 0; + _$jscoverage['plugins/autosubmit.js'][21] = 0; + _$jscoverage['plugins/autosubmit.js'][23] = 0; + _$jscoverage['plugins/autosubmit.js'][24] = 0; + _$jscoverage['plugins/autosubmit.js'][25] = 0; + _$jscoverage['plugins/autosubmit.js'][27] = 0; + _$jscoverage['plugins/autosubmit.js'][28] = 0; + _$jscoverage['plugins/autosubmit.js'][33] = 0; +} +_$jscoverage['plugins/autosubmit.js'].source = ["/**"," * 快捷键提交"," * @file"," * @since 1.2.6.1"," */","","/**"," * 对编辑器区域插入html字符串"," * @command autosubmit"," * @method execCommand"," * @param { String } cmd 命令字符串"," * @example"," * ```javascript"," * editor.execCommand( 'autosubmit' );"," * ```"," */","UE.plugins['autosubmit'] = function(){"," var me = this;"," me.commands['autosubmit'] = {"," execCommand:function () {"," var me=this,"," form = domUtils.findParentByTagName(me.iframe,\"form\", false);"," if (form) {"," if(me.fireEvent(\"beforesubmit\")===false){"," return;"," }"," me.sync();"," form.submit();"," }"," }"," };"," //快捷键"," me.addshortcutkey({"," \"autosubmit\" : \"ctrl+13\" //手动提交"," });","};"]; +_$jscoverage['plugins/autosubmit.js'][17]++; +UE.plugins.autosubmit = (function () { + _$jscoverage['plugins/autosubmit.js'][18]++; + var me = this; + _$jscoverage['plugins/autosubmit.js'][19]++; + me.commands.autosubmit = {execCommand: (function () { + _$jscoverage['plugins/autosubmit.js'][21]++; + var me = this, form = domUtils.findParentByTagName(me.iframe, "form", false); + _$jscoverage['plugins/autosubmit.js'][23]++; + if (form) { + _$jscoverage['plugins/autosubmit.js'][24]++; + if ((me.fireEvent("beforesubmit") === false)) { + _$jscoverage['plugins/autosubmit.js'][25]++; + return; + } + _$jscoverage['plugins/autosubmit.js'][27]++; + me.sync(); + _$jscoverage['plugins/autosubmit.js'][28]++; + form.submit(); + } +})}; + _$jscoverage['plugins/autosubmit.js'][33]++; + me.addshortcutkey({"autosubmit": "ctrl+13"}); +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/autotypeset.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/autotypeset.js new file mode 100644 index 000000000..86f561530 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/autotypeset.js @@ -0,0 +1,434 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/autotypeset.js']) { + _$jscoverage['plugins/autotypeset.js'] = []; + _$jscoverage['plugins/autotypeset.js'][11] = 0; + _$jscoverage['plugins/autotypeset.js'][13] = 0; + _$jscoverage['plugins/autotypeset.js'][28] = 0; + _$jscoverage['plugins/autotypeset.js'][47] = 0; + _$jscoverage['plugins/autotypeset.js'][48] = 0; + _$jscoverage['plugins/autotypeset.js'][50] = 0; + _$jscoverage['plugins/autotypeset.js'][51] = 0; + _$jscoverage['plugins/autotypeset.js'][52] = 0; + _$jscoverage['plugins/autotypeset.js'][53] = 0; + _$jscoverage['plugins/autotypeset.js'][54] = 0; + _$jscoverage['plugins/autotypeset.js'][55] = 0; + _$jscoverage['plugins/autotypeset.js'][56] = 0; + _$jscoverage['plugins/autotypeset.js'][60] = 0; + _$jscoverage['plugins/autotypeset.js'][63] = 0; + _$jscoverage['plugins/autotypeset.js'][68] = 0; + _$jscoverage['plugins/autotypeset.js'][69] = 0; + _$jscoverage['plugins/autotypeset.js'][70] = 0; + _$jscoverage['plugins/autotypeset.js'][71] = 0; + _$jscoverage['plugins/autotypeset.js'][72] = 0; + _$jscoverage['plugins/autotypeset.js'][76] = 0; + _$jscoverage['plugins/autotypeset.js'][77] = 0; + _$jscoverage['plugins/autotypeset.js'][78] = 0; + _$jscoverage['plugins/autotypeset.js'][79] = 0; + _$jscoverage['plugins/autotypeset.js'][80] = 0; + _$jscoverage['plugins/autotypeset.js'][82] = 0; + _$jscoverage['plugins/autotypeset.js'][83] = 0; + _$jscoverage['plugins/autotypeset.js'][85] = 0; + _$jscoverage['plugins/autotypeset.js'][87] = 0; + _$jscoverage['plugins/autotypeset.js'][90] = 0; + _$jscoverage['plugins/autotypeset.js'][92] = 0; + _$jscoverage['plugins/autotypeset.js'][93] = 0; + _$jscoverage['plugins/autotypeset.js'][96] = 0; + _$jscoverage['plugins/autotypeset.js'][97] = 0; + _$jscoverage['plugins/autotypeset.js'][99] = 0; + _$jscoverage['plugins/autotypeset.js'][103] = 0; + _$jscoverage['plugins/autotypeset.js'][104] = 0; + _$jscoverage['plugins/autotypeset.js'][105] = 0; + _$jscoverage['plugins/autotypeset.js'][108] = 0; + _$jscoverage['plugins/autotypeset.js'][110] = 0; + _$jscoverage['plugins/autotypeset.js'][111] = 0; + _$jscoverage['plugins/autotypeset.js'][112] = 0; + _$jscoverage['plugins/autotypeset.js'][113] = 0; + _$jscoverage['plugins/autotypeset.js'][114] = 0; + _$jscoverage['plugins/autotypeset.js'][115] = 0; + _$jscoverage['plugins/autotypeset.js'][116] = 0; + _$jscoverage['plugins/autotypeset.js'][118] = 0; + _$jscoverage['plugins/autotypeset.js'][123] = 0; + _$jscoverage['plugins/autotypeset.js'][124] = 0; + _$jscoverage['plugins/autotypeset.js'][125] = 0; + _$jscoverage['plugins/autotypeset.js'][126] = 0; + _$jscoverage['plugins/autotypeset.js'][127] = 0; + _$jscoverage['plugins/autotypeset.js'][130] = 0; + _$jscoverage['plugins/autotypeset.js'][131] = 0; + _$jscoverage['plugins/autotypeset.js'][136] = 0; + _$jscoverage['plugins/autotypeset.js'][137] = 0; + _$jscoverage['plugins/autotypeset.js'][138] = 0; + _$jscoverage['plugins/autotypeset.js'][140] = 0; + _$jscoverage['plugins/autotypeset.js'][141] = 0; + _$jscoverage['plugins/autotypeset.js'][150] = 0; + _$jscoverage['plugins/autotypeset.js'][152] = 0; + _$jscoverage['plugins/autotypeset.js'][153] = 0; + _$jscoverage['plugins/autotypeset.js'][155] = 0; + _$jscoverage['plugins/autotypeset.js'][159] = 0; + _$jscoverage['plugins/autotypeset.js'][160] = 0; + _$jscoverage['plugins/autotypeset.js'][161] = 0; + _$jscoverage['plugins/autotypeset.js'][162] = 0; + _$jscoverage['plugins/autotypeset.js'][166] = 0; + _$jscoverage['plugins/autotypeset.js'][167] = 0; + _$jscoverage['plugins/autotypeset.js'][168] = 0; + _$jscoverage['plugins/autotypeset.js'][170] = 0; + _$jscoverage['plugins/autotypeset.js'][171] = 0; + _$jscoverage['plugins/autotypeset.js'][172] = 0; + _$jscoverage['plugins/autotypeset.js'][173] = 0; + _$jscoverage['plugins/autotypeset.js'][174] = 0; + _$jscoverage['plugins/autotypeset.js'][175] = 0; + _$jscoverage['plugins/autotypeset.js'][176] = 0; + _$jscoverage['plugins/autotypeset.js'][177] = 0; + _$jscoverage['plugins/autotypeset.js'][178] = 0; + _$jscoverage['plugins/autotypeset.js'][180] = 0; + _$jscoverage['plugins/autotypeset.js'][181] = 0; + _$jscoverage['plugins/autotypeset.js'][183] = 0; + _$jscoverage['plugins/autotypeset.js'][191] = 0; + _$jscoverage['plugins/autotypeset.js'][192] = 0; + _$jscoverage['plugins/autotypeset.js'][194] = 0; + _$jscoverage['plugins/autotypeset.js'][195] = 0; + _$jscoverage['plugins/autotypeset.js'][196] = 0; + _$jscoverage['plugins/autotypeset.js'][197] = 0; + _$jscoverage['plugins/autotypeset.js'][198] = 0; + _$jscoverage['plugins/autotypeset.js'][200] = 0; + _$jscoverage['plugins/autotypeset.js'][201] = 0; + _$jscoverage['plugins/autotypeset.js'][203] = 0; + _$jscoverage['plugins/autotypeset.js'][204] = 0; + _$jscoverage['plugins/autotypeset.js'][208] = 0; + _$jscoverage['plugins/autotypeset.js'][209] = 0; + _$jscoverage['plugins/autotypeset.js'][210] = 0; + _$jscoverage['plugins/autotypeset.js'][217] = 0; + _$jscoverage['plugins/autotypeset.js'][218] = 0; + _$jscoverage['plugins/autotypeset.js'][219] = 0; + _$jscoverage['plugins/autotypeset.js'][227] = 0; + _$jscoverage['plugins/autotypeset.js'][228] = 0; + _$jscoverage['plugins/autotypeset.js'][229] = 0; + _$jscoverage['plugins/autotypeset.js'][233] = 0; + _$jscoverage['plugins/autotypeset.js'][234] = 0; + _$jscoverage['plugins/autotypeset.js'][237] = 0; + _$jscoverage['plugins/autotypeset.js'][238] = 0; + _$jscoverage['plugins/autotypeset.js'][241] = 0; + _$jscoverage['plugins/autotypeset.js'][243] = 0; + _$jscoverage['plugins/autotypeset.js'][244] = 0; + _$jscoverage['plugins/autotypeset.js'][245] = 0; + _$jscoverage['plugins/autotypeset.js'][247] = 0; +} +_$jscoverage['plugins/autotypeset.js'].source = ["///import core","///commands 自动排版","///commandsName autotypeset","///commandsTitle 自动排版","/*"," * 自动排版"," * @function"," * @name baidu.editor.execCommands"," */","","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' //行首缩进的大小"," }});"," 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;"," }"," 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(html){"," html.html = cont.innerHTML;"," }"," }"," if(opt.pasteFilter){"," me.addListener('beforepaste',autotype);"," }",""," me.commands['autotypeset'] = {"," execCommand:function () {"," me.removeListener('beforepaste',autotype);"," if(opt.pasteFilter){"," me.addListener('beforepaste',autotype);"," }"," autotype.call(me)"," }",""," };","","};",""]; +_$jscoverage['plugins/autotypeset.js'][11]++; +UE.plugins.autotypeset = (function () { + _$jscoverage['plugins/autotypeset.js'][13]++; + this.setOpt({"autotypeset": {mergeEmptyline: true, removeClass: true, removeEmptyline: false, textAlign: "left", imageBlockLine: "center", pasteFilter: false, clearFontSize: false, clearFontFamily: false, removeEmptyNode: false, removeTagNames: utils.extend({div: 1}, dtd.$removeEmpty), indent: false, indentValue: "2em"}}); + _$jscoverage['plugins/autotypeset.js'][28]++; + var me = this, opt = me.options.autotypeset, remainClass = {"selectTdClass": 1, "pagebreak": 1, "anchorclass": 1}, remainTag = {"li": 1}, tags = {div: 1, p: 1, blockquote: 1, center: 1, h1: 1, h2: 1, h3: 1, h4: 1, h5: 1, h6: 1, span: 1}, highlightCont; + _$jscoverage['plugins/autotypeset.js'][47]++; + if ((! opt)) { + _$jscoverage['plugins/autotypeset.js'][48]++; + return; + } + _$jscoverage['plugins/autotypeset.js'][50]++; + function isLine(node, notEmpty) { + _$jscoverage['plugins/autotypeset.js'][51]++; + if (((! node) || (node.nodeType == 3))) { + _$jscoverage['plugins/autotypeset.js'][52]++; + return 0; + } + _$jscoverage['plugins/autotypeset.js'][53]++; + if (domUtils.isBr(node)) { + _$jscoverage['plugins/autotypeset.js'][54]++; + return 1; + } + _$jscoverage['plugins/autotypeset.js'][55]++; + if ((node && node.parentNode && tags[node.tagName.toLowerCase()])) { + _$jscoverage['plugins/autotypeset.js'][56]++; + if (((highlightCont && highlightCont.contains(node)) || node.getAttribute("pagebreak"))) { + _$jscoverage['plugins/autotypeset.js'][60]++; + return 0; + } + _$jscoverage['plugins/autotypeset.js'][63]++; + return (notEmpty? (! domUtils.isEmptyBlock(node)): domUtils.isEmptyBlock(node, new RegExp(("[\\s" + domUtils.fillChar + "]"), "g"))); + } +} + _$jscoverage['plugins/autotypeset.js'][68]++; + function removeNotAttributeSpan(node) { + _$jscoverage['plugins/autotypeset.js'][69]++; + if ((! node.style.cssText)) { + _$jscoverage['plugins/autotypeset.js'][70]++; + domUtils.removeAttributes(node, ["style"]); + _$jscoverage['plugins/autotypeset.js'][71]++; + if (((node.tagName.toLowerCase() == "span") && domUtils.hasNoAttributes(node))) { + _$jscoverage['plugins/autotypeset.js'][72]++; + domUtils.remove(node, true); + } + } +} + _$jscoverage['plugins/autotypeset.js'][76]++; + function autotype(type, html) { + _$jscoverage['plugins/autotypeset.js'][77]++; + var me = this, cont; + _$jscoverage['plugins/autotypeset.js'][78]++; + if (html) { + _$jscoverage['plugins/autotypeset.js'][79]++; + if ((! opt.pasteFilter)) { + _$jscoverage['plugins/autotypeset.js'][80]++; + return; + } + _$jscoverage['plugins/autotypeset.js'][82]++; + cont = me.document.createElement("div"); + _$jscoverage['plugins/autotypeset.js'][83]++; + cont.innerHTML = html.html; + } + else { + _$jscoverage['plugins/autotypeset.js'][85]++; + cont = me.document.body; + } + _$jscoverage['plugins/autotypeset.js'][87]++; + var nodes = domUtils.getElementsByTagName(cont, "*"); + _$jscoverage['plugins/autotypeset.js'][90]++; + for (var i = 0, ci; (ci = nodes[(i++)]);) { + _$jscoverage['plugins/autotypeset.js'][92]++; + if ((me.fireEvent("excludeNodeinautotype", ci) === true)) { + _$jscoverage['plugins/autotypeset.js'][93]++; + continue; + } + _$jscoverage['plugins/autotypeset.js'][96]++; + if ((opt.clearFontSize && ci.style.fontSize)) { + _$jscoverage['plugins/autotypeset.js'][97]++; + domUtils.removeStyle(ci, "font-size"); + _$jscoverage['plugins/autotypeset.js'][99]++; + removeNotAttributeSpan(ci); + } + _$jscoverage['plugins/autotypeset.js'][103]++; + if ((opt.clearFontFamily && ci.style.fontFamily)) { + _$jscoverage['plugins/autotypeset.js'][104]++; + domUtils.removeStyle(ci, "font-family"); + _$jscoverage['plugins/autotypeset.js'][105]++; + removeNotAttributeSpan(ci); + } + _$jscoverage['plugins/autotypeset.js'][108]++; + if (isLine(ci)) { + _$jscoverage['plugins/autotypeset.js'][110]++; + if (opt.mergeEmptyline) { + _$jscoverage['plugins/autotypeset.js'][111]++; + var next = ci.nextSibling, tmpNode, isBr = domUtils.isBr(ci); + _$jscoverage['plugins/autotypeset.js'][112]++; + while (isLine(next)) { + _$jscoverage['plugins/autotypeset.js'][113]++; + tmpNode = next; + _$jscoverage['plugins/autotypeset.js'][114]++; + next = tmpNode.nextSibling; + _$jscoverage['plugins/autotypeset.js'][115]++; + if ((isBr && ((! next) || (next && (! domUtils.isBr(next)))))) { + _$jscoverage['plugins/autotypeset.js'][116]++; + break; + } + _$jscoverage['plugins/autotypeset.js'][118]++; + domUtils.remove(tmpNode); +} + } + _$jscoverage['plugins/autotypeset.js'][123]++; + if ((opt.removeEmptyline && domUtils.inDoc(ci, cont) && (! remainTag[ci.parentNode.tagName.toLowerCase()]))) { + _$jscoverage['plugins/autotypeset.js'][124]++; + if (domUtils.isBr(ci)) { + _$jscoverage['plugins/autotypeset.js'][125]++; + next = ci.nextSibling; + _$jscoverage['plugins/autotypeset.js'][126]++; + if ((next && (! domUtils.isBr(next)))) { + _$jscoverage['plugins/autotypeset.js'][127]++; + continue; + } + } + _$jscoverage['plugins/autotypeset.js'][130]++; + domUtils.remove(ci); + _$jscoverage['plugins/autotypeset.js'][131]++; + continue; + } + } + _$jscoverage['plugins/autotypeset.js'][136]++; + if ((isLine(ci, true) && (ci.tagName != "SPAN"))) { + _$jscoverage['plugins/autotypeset.js'][137]++; + if (opt.indent) { + _$jscoverage['plugins/autotypeset.js'][138]++; + ci.style.textIndent = opt.indentValue; + } + _$jscoverage['plugins/autotypeset.js'][140]++; + if (opt.textAlign) { + _$jscoverage['plugins/autotypeset.js'][141]++; + ci.style.textAlign = opt.textAlign; + } + } + _$jscoverage['plugins/autotypeset.js'][150]++; + if ((opt.removeClass && ci.className && (! remainClass[ci.className.toLowerCase()]))) { + _$jscoverage['plugins/autotypeset.js'][152]++; + if ((highlightCont && highlightCont.contains(ci))) { + _$jscoverage['plugins/autotypeset.js'][153]++; + continue; + } + _$jscoverage['plugins/autotypeset.js'][155]++; + domUtils.removeAttributes(ci, ["class"]); + } + _$jscoverage['plugins/autotypeset.js'][159]++; + if ((opt.imageBlockLine && (ci.tagName.toLowerCase() == "img") && (! ci.getAttribute("emotion")))) { + _$jscoverage['plugins/autotypeset.js'][160]++; + if (html) { + _$jscoverage['plugins/autotypeset.js'][161]++; + var img = ci; + _$jscoverage['plugins/autotypeset.js'][162]++; + switch (opt.imageBlockLine) { + case "left": + case "right": + case "none": + _$jscoverage['plugins/autotypeset.js'][166]++; + var pN = img.parentNode, tmpNode = tmpNode, pre, next = next; + _$jscoverage['plugins/autotypeset.js'][167]++; + while ((dtd.$inline[pN.tagName] || (pN.tagName == "A"))) { + _$jscoverage['plugins/autotypeset.js'][168]++; + pN = pN.parentNode; +} + _$jscoverage['plugins/autotypeset.js'][170]++; + tmpNode = pN; + _$jscoverage['plugins/autotypeset.js'][171]++; + if (((tmpNode.tagName == "P") && (domUtils.getStyle(tmpNode, "text-align") == "center"))) { + _$jscoverage['plugins/autotypeset.js'][172]++; + if (((! domUtils.isBody(tmpNode)) && (domUtils.getChildCount(tmpNode, (function (node) { + _$jscoverage['plugins/autotypeset.js'][172]++; + return ((! domUtils.isBr(node)) && (! domUtils.isWhitespace(node))); +})) == 1))) { + _$jscoverage['plugins/autotypeset.js'][173]++; + pre = tmpNode.previousSibling; + _$jscoverage['plugins/autotypeset.js'][174]++; + next = tmpNode.nextSibling; + _$jscoverage['plugins/autotypeset.js'][175]++; + if ((pre && next && (pre.nodeType == 1) && (next.nodeType == 1) && (pre.tagName == next.tagName) && domUtils.isBlockElm(pre))) { + _$jscoverage['plugins/autotypeset.js'][176]++; + pre.appendChild(tmpNode.firstChild); + _$jscoverage['plugins/autotypeset.js'][177]++; + while (next.firstChild) { + _$jscoverage['plugins/autotypeset.js'][178]++; + pre.appendChild(next.firstChild); +} + _$jscoverage['plugins/autotypeset.js'][180]++; + domUtils.remove(tmpNode); + _$jscoverage['plugins/autotypeset.js'][181]++; + domUtils.remove(next); + } + else { + _$jscoverage['plugins/autotypeset.js'][183]++; + domUtils.setStyle(tmpNode, "text-align", ""); + } + } + } + _$jscoverage['plugins/autotypeset.js'][191]++; + domUtils.setStyle(img, "float", opt.imageBlockLine); + _$jscoverage['plugins/autotypeset.js'][192]++; + break; + case "center": + _$jscoverage['plugins/autotypeset.js'][194]++; + if ((me.queryCommandValue("imagefloat") != "center")) { + _$jscoverage['plugins/autotypeset.js'][195]++; + pN = img.parentNode; + _$jscoverage['plugins/autotypeset.js'][196]++; + domUtils.setStyle(img, "float", "none"); + _$jscoverage['plugins/autotypeset.js'][197]++; + tmpNode = img; + _$jscoverage['plugins/autotypeset.js'][198]++; + while ((pN && (domUtils.getChildCount(pN, (function (node) { + _$jscoverage['plugins/autotypeset.js'][198]++; + return ((! domUtils.isBr(node)) && (! domUtils.isWhitespace(node))); +})) == 1) && (dtd.$inline[pN.tagName] || (pN.tagName == "A")))) { + _$jscoverage['plugins/autotypeset.js'][200]++; + tmpNode = pN; + _$jscoverage['plugins/autotypeset.js'][201]++; + pN = pN.parentNode; +} + _$jscoverage['plugins/autotypeset.js'][203]++; + var pNode = me.document.createElement("p"); + _$jscoverage['plugins/autotypeset.js'][204]++; + domUtils.setAttributes(pNode, {style: "text-align:center"}); + _$jscoverage['plugins/autotypeset.js'][208]++; + tmpNode.parentNode.insertBefore(pNode, tmpNode); + _$jscoverage['plugins/autotypeset.js'][209]++; + pNode.appendChild(tmpNode); + _$jscoverage['plugins/autotypeset.js'][210]++; + domUtils.setStyle(tmpNode, "float", ""); + } + } + } + else { + _$jscoverage['plugins/autotypeset.js'][217]++; + var range = me.selection.getRange(); + _$jscoverage['plugins/autotypeset.js'][218]++; + range.selectNode(ci).select(); + _$jscoverage['plugins/autotypeset.js'][219]++; + me.execCommand("imagefloat", opt.imageBlockLine); + } + } + _$jscoverage['plugins/autotypeset.js'][227]++; + if (opt.removeEmptyNode) { + _$jscoverage['plugins/autotypeset.js'][228]++; + if ((opt.removeTagNames[ci.tagName.toLowerCase()] && domUtils.hasNoAttributes(ci) && domUtils.isEmptyBlock(ci))) { + _$jscoverage['plugins/autotypeset.js'][229]++; + domUtils.remove(ci); + } + } +} + _$jscoverage['plugins/autotypeset.js'][233]++; + if (html) { + _$jscoverage['plugins/autotypeset.js'][234]++; + html.html = cont.innerHTML; + } +} + _$jscoverage['plugins/autotypeset.js'][237]++; + if (opt.pasteFilter) { + _$jscoverage['plugins/autotypeset.js'][238]++; + me.addListener("beforepaste", autotype); + } + _$jscoverage['plugins/autotypeset.js'][241]++; + me.commands.autotypeset = {execCommand: (function () { + _$jscoverage['plugins/autotypeset.js'][243]++; + me.removeListener("beforepaste", autotype); + _$jscoverage['plugins/autotypeset.js'][244]++; + if (opt.pasteFilter) { + _$jscoverage['plugins/autotypeset.js'][245]++; + me.addListener("beforepaste", autotype); + } + _$jscoverage['plugins/autotypeset.js'][247]++; + autotype.call(me); +})}; +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/background.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/background.js new file mode 100644 index 000000000..a36521711 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/background.js @@ -0,0 +1,92 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/background.js']) { + _$jscoverage['plugins/background.js'] = []; + _$jscoverage['plugins/background.js'][6] = 0; + _$jscoverage['plugins/background.js'][7] = 0; + _$jscoverage['plugins/background.js'][8] = 0; + _$jscoverage['plugins/background.js'][9] = 0; + _$jscoverage['plugins/background.js'][12] = 0; + _$jscoverage['plugins/background.js'][13] = 0; + _$jscoverage['plugins/background.js'][15] = 0; + _$jscoverage['plugins/background.js'][17] = 0; + _$jscoverage['plugins/background.js'][18] = 0; + _$jscoverage['plugins/background.js'][25] = 0; + _$jscoverage['plugins/background.js'][26] = 0; + _$jscoverage['plugins/background.js'][27] = 0; + _$jscoverage['plugins/background.js'][30] = 0; + _$jscoverage['plugins/background.js'][31] = 0; +} +_$jscoverage['plugins/background.js'].source = ["///import core","///commands 插入背景","///commandsName background","///commandsTitle 插入背景","///commandsDialog dialogs\\background","UE.plugins['background'] = function(){"," var me = this;"," me.addListener(\"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(/\"|\\(|\\)/ig,\"\");"," }else{"," url = su!=\"none\" ? su.replace(/url\\(\"?|\"?\\)/ig,\"\"):\"\";"," }"," var html = '<style type=\"text/css\">body{';"," var bgObj = {"," \"background-color\" : domUtils.getComputedStyle(body,\"background-color\")||\"#ffffff\","," 'background-image' : url ? 'url('+url+')' : '',"," 'background-repeat':domUtils.getComputedStyle(body,\"background-repeat\")||\"\","," 'background-position': browser.ie?(domUtils.getComputedStyle(body,\"background-position-x\")+\" \"+domUtils.getComputedStyle(body,\"background-position-y\")):domUtils.getComputedStyle(body,\"background-position\"),"," 'height':domUtils.getComputedStyle(body,\"height\")"," };"," for ( var name in bgObj ) {"," if ( bgObj.hasOwnProperty( name ) ) {"," html += name+\":\"+bgObj[name]+\";\";"," }"," }"," html += '}</style> ';"," headHtml.push(html);"," });","}"]; +_$jscoverage['plugins/background.js'][6]++; +UE.plugins.background = (function () { + _$jscoverage['plugins/background.js'][7]++; + var me = this; + _$jscoverage['plugins/background.js'][8]++; + me.addListener("getAllHtml", (function (type, headHtml) { + _$jscoverage['plugins/background.js'][9]++; + var body = this.body, su = domUtils.getComputedStyle(body, "background-image"), url = ""; + _$jscoverage['plugins/background.js'][12]++; + if ((su.indexOf(me.options.imagePath) > 0)) { + _$jscoverage['plugins/background.js'][13]++; + url = su.substring(su.indexOf(me.options.imagePath), (su.length - 1)).replace(/"|\(|\)/gi, ""); + } + else { + _$jscoverage['plugins/background.js'][15]++; + url = ((su != "none")? su.replace(/url\("?|"?\)/gi, ""): ""); + } + _$jscoverage['plugins/background.js'][17]++; + var html = " "; + _$jscoverage['plugins/background.js'][31]++; + headHtml.push(html); +})); +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/basestyle.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/basestyle.js new file mode 100644 index 000000000..5022b1b24 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/basestyle.js @@ -0,0 +1,159 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/basestyle.js']) { + _$jscoverage['plugins/basestyle.js'] = []; + _$jscoverage['plugins/basestyle.js'][7] = 0; + _$jscoverage['plugins/basestyle.js'][138] = 0; + _$jscoverage['plugins/basestyle.js'][145] = 0; + _$jscoverage['plugins/basestyle.js'][149] = 0; + _$jscoverage['plugins/basestyle.js'][154] = 0; + _$jscoverage['plugins/basestyle.js'][155] = 0; + _$jscoverage['plugins/basestyle.js'][156] = 0; + _$jscoverage['plugins/basestyle.js'][158] = 0; + _$jscoverage['plugins/basestyle.js'][159] = 0; + _$jscoverage['plugins/basestyle.js'][161] = 0; + _$jscoverage['plugins/basestyle.js'][165] = 0; + _$jscoverage['plugins/basestyle.js'][166] = 0; + _$jscoverage['plugins/basestyle.js'][167] = 0; + _$jscoverage['plugins/basestyle.js'][169] = 0; + _$jscoverage['plugins/basestyle.js'][170] = 0; + _$jscoverage['plugins/basestyle.js'][171] = 0; + _$jscoverage['plugins/basestyle.js'][172] = 0; + _$jscoverage['plugins/basestyle.js'][173] = 0; + _$jscoverage['plugins/basestyle.js'][174] = 0; + _$jscoverage['plugins/basestyle.js'][175] = 0; + _$jscoverage['plugins/basestyle.js'][177] = 0; + _$jscoverage['plugins/basestyle.js'][178] = 0; + _$jscoverage['plugins/basestyle.js'][179] = 0; + _$jscoverage['plugins/basestyle.js'][180] = 0; + _$jscoverage['plugins/basestyle.js'][185] = 0; + _$jscoverage['plugins/basestyle.js'][187] = 0; + _$jscoverage['plugins/basestyle.js'][189] = 0; + _$jscoverage['plugins/basestyle.js'][190] = 0; + _$jscoverage['plugins/basestyle.js'][191] = 0; + _$jscoverage['plugins/basestyle.js'][194] = 0; + _$jscoverage['plugins/basestyle.js'][196] = 0; + _$jscoverage['plugins/basestyle.js'][199] = 0; +} +_$jscoverage['plugins/basestyle.js'].source = ["/**"," * B、I、sub、super命令支持"," * @file"," * @since 1.2.6.1"," */","","UE.plugins['basestyle'] = function(){",""," /**"," * 字体加粗, 对已加粗的文本内容执行该命令, 将取消加粗"," * @command bold"," * @param { String } cmd 命令字符串"," * @method execCommand"," * @example"," * ```javascript"," * //editor是编辑器实例"," * //对当前选中的文本内容执行加粗操作"," * //第一次执行, 文本内容加粗"," * editor.execCommand( 'bold' );"," *"," * //第二次执行, 文本内容取消加粗"," * editor.execCommand( 'bold' );"," * ```"," */",""," /**"," * 获取当前选中的文本内容的加粗状态"," * @command bold"," * @param { String } cmd 命令字符串"," * @method queryCommandState"," * @return { int } 如果当前选中的所有文本内容已经被加粗, 则返回1, 否则返回0"," * @example"," * ```javascript"," * //editor是编辑器实例"," * //获取当前选中的文本内容的加粗状态"," * //output: 1 或者 0"," * console.log( editor.queryCommandState( 'bold' ) );"," * ```"," */",""," /**"," * 字体倾斜, 对已倾斜的文本内容执行该命令, 将取消倾斜"," * @command italic"," * @param { String } cmd 命令字符串"," * @method execCommand"," * @example"," * ```javascript"," * //editor是编辑器实例"," * //对当前选中的文本内容执行斜体操作"," * //第一次操作, 文本内容将变成斜体"," * editor.execCommand( 'italic' );"," *"," * //再次对同一文本内容执行, 则文本内容将恢复正常"," * editor.execCommand( 'italic' );"," * ```"," */",""," /**"," * 获取当前选中的文本内容的倾斜状态"," * @command italic"," * @method queryCommandState"," * @param { String } cmd 命令字符串"," * @return { int } 如果当前选中的所有文本内容已经是斜体, 则返回1, 否则返回0"," * @example"," * ```javascript"," * //editor是编辑器实例"," * //获取当前选中的文本内容的倾斜状态"," * //output: 1 或者 0"," * console.log( editor.queryCommandState( 'italic' ) );"," * ```"," */",""," /**"," * 下标文本, 把选中的文本内容切换成下标文本, 如果当前选中的文本已经是下标, 则该操作会把文本内容还原成"," * 正常文本"," * @command subscript"," * @method execCommand"," * @param { String } cmd 命令字符串"," * @example"," * ```javascript"," * //editor是编辑器实例"," * //对当前选中的文本内容执行下标操作"," * //第一次操作, 文本内容将变成下标文本"," * editor.execCommand( 'subscript' );"," *"," * //再次对同一文本内容执行, 则文本内容将恢复正常"," * editor.execCommand( 'subscript' );"," * ```"," */",""," /**"," * 获取当前选中的文本内容的下标状态"," * @command subscript"," * @method queryCommandState"," * @param { String } cmd 命令字符串"," * @return { int } 如果当前选中的所有文本内容已经是下标文本, 则返回1, 否则返回0"," * @example"," * ```javascript"," * //editor是编辑器实例"," * //获取当前选中的文本内容的下标状态"," * //output: 1 或者 0"," * console.log( editor.queryCommandState( 'subscript' ) );"," * ```"," */",""," /**"," * 上标文本, 把选中的文本内容切换成上标文本, 如果当前选中的文本已经是上标, 则该操作会把文本内容还原成"," * 正常文本"," * @command superscript"," * @method execCommand"," * @param { String } cmd 命令字符串"," * @example"," * ```javascript"," * //editor是编辑器实例"," * //对当前选中的文本内容执行上标操作"," * //第一次操作, 文本内容将变成上标文本"," * editor.execCommand( 'superscript' );"," *"," * //再次对同一文本内容执行, 则文本内容将恢复正常"," * editor.execCommand( 'superscript' );"," * ```"," */",""," /**"," * 获取当前选中的文本内容的上标状态"," * @command superscript"," * @method queryCommandState"," * @param { String } cmd 命令字符串"," * @return { int } 如果当前选中的所有文本内容已经是上标文本, 则返回1, 否则返回0"," * @example"," * ```javascript"," * //editor是编辑器实例"," * //获取当前选中的文本内容的上标状态"," * //output: 1 或者 0"," * console.log( editor.queryCommandState( '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] );"," }","};",""]; +_$jscoverage['plugins/basestyle.js'][7]++; +UE.plugins.basestyle = (function () { + _$jscoverage['plugins/basestyle.js'][138]++; + var basestyles = {"bold": ["strong", "b"], "italic": ["em", "i"], "subscript": ["sub"], "superscript": ["sup"]}, getObj = (function (editor, tagNames) { + _$jscoverage['plugins/basestyle.js'][145]++; + return domUtils.filterNodeList(editor.selection.getStartElementPath(), tagNames); +}), me = this; + _$jscoverage['plugins/basestyle.js'][149]++; + me.addshortcutkey({"Bold": "ctrl+66", "Italic": "ctrl+73", "Underline": "ctrl+85"}); + _$jscoverage['plugins/basestyle.js'][154]++; + me.addInputRule((function (root) { + _$jscoverage['plugins/basestyle.js'][155]++; + utils.each(root.getNodesByTagName("b i"), (function (node) { + _$jscoverage['plugins/basestyle.js'][156]++; + switch (node.tagName) { + case "b": + _$jscoverage['plugins/basestyle.js'][158]++; + node.tagName = "strong"; + _$jscoverage['plugins/basestyle.js'][159]++; + break; + case "i": + _$jscoverage['plugins/basestyle.js'][161]++; + node.tagName = "em"; + } +})); +})); + _$jscoverage['plugins/basestyle.js'][165]++; + for (var style in basestyles) { + _$jscoverage['plugins/basestyle.js'][166]++; + (function (cmd, tagNames) { + _$jscoverage['plugins/basestyle.js'][167]++; + me.commands[cmd] = {execCommand: (function (cmdName) { + _$jscoverage['plugins/basestyle.js'][169]++; + var range = me.selection.getRange(), obj = getObj(this, tagNames); + _$jscoverage['plugins/basestyle.js'][170]++; + if (range.collapsed) { + _$jscoverage['plugins/basestyle.js'][171]++; + if (obj) { + _$jscoverage['plugins/basestyle.js'][172]++; + var tmpText = me.document.createTextNode(""); + _$jscoverage['plugins/basestyle.js'][173]++; + range.insertNode(tmpText).removeInlineStyle(tagNames); + _$jscoverage['plugins/basestyle.js'][174]++; + range.setStartBefore(tmpText); + _$jscoverage['plugins/basestyle.js'][175]++; + domUtils.remove(tmpText); + } + else { + _$jscoverage['plugins/basestyle.js'][177]++; + var tmpNode = range.document.createElement(tagNames[0]); + _$jscoverage['plugins/basestyle.js'][178]++; + if (((cmdName == "superscript") || (cmdName == "subscript"))) { + _$jscoverage['plugins/basestyle.js'][179]++; + tmpText = me.document.createTextNode(""); + _$jscoverage['plugins/basestyle.js'][180]++; + range.insertNode(tmpText).removeInlineStyle(["sub", "sup"]).setStartBefore(tmpText).collapse(true); + } + _$jscoverage['plugins/basestyle.js'][185]++; + range.insertNode(tmpNode).setStart(tmpNode, 0); + } + _$jscoverage['plugins/basestyle.js'][187]++; + range.collapse(true); + } + else { + _$jscoverage['plugins/basestyle.js'][189]++; + if (((cmdName == "superscript") || (cmdName == "subscript"))) { + _$jscoverage['plugins/basestyle.js'][190]++; + if (((! obj) || (obj.tagName.toLowerCase() != cmdName))) { + _$jscoverage['plugins/basestyle.js'][191]++; + range.removeInlineStyle(["sub", "sup"]); + } + } + _$jscoverage['plugins/basestyle.js'][194]++; + (obj? range.removeInlineStyle(tagNames): range.applyInlineStyle(tagNames[0])); + } + _$jscoverage['plugins/basestyle.js'][196]++; + range.select(); +}), queryCommandState: (function () { + _$jscoverage['plugins/basestyle.js'][199]++; + return (getObj(this, tagNames)? 1: 0); +})}; +})(style, basestyles[style]); +} +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/blockquote.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/blockquote.js new file mode 100644 index 000000000..af7ef670e --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/blockquote.js @@ -0,0 +1,287 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/blockquote.js']) { + _$jscoverage['plugins/blockquote.js'] = []; + _$jscoverage['plugins/blockquote.js'][44] = 0; + _$jscoverage['plugins/blockquote.js'][45] = 0; + _$jscoverage['plugins/blockquote.js'][46] = 0; + _$jscoverage['plugins/blockquote.js'][47] = 0; + _$jscoverage['plugins/blockquote.js'][49] = 0; + _$jscoverage['plugins/blockquote.js'][51] = 0; + _$jscoverage['plugins/blockquote.js'][56] = 0; + _$jscoverage['plugins/blockquote.js'][58] = 0; + _$jscoverage['plugins/blockquote.js'][59] = 0; + _$jscoverage['plugins/blockquote.js'][62] = 0; + _$jscoverage['plugins/blockquote.js'][65] = 0; + _$jscoverage['plugins/blockquote.js'][66] = 0; + _$jscoverage['plugins/blockquote.js'][69] = 0; + _$jscoverage['plugins/blockquote.js'][70] = 0; + _$jscoverage['plugins/blockquote.js'][72] = 0; + _$jscoverage['plugins/blockquote.js'][75] = 0; + _$jscoverage['plugins/blockquote.js'][76] = 0; + _$jscoverage['plugins/blockquote.js'][77] = 0; + _$jscoverage['plugins/blockquote.js'][78] = 0; + _$jscoverage['plugins/blockquote.js'][79] = 0; + _$jscoverage['plugins/blockquote.js'][81] = 0; + _$jscoverage['plugins/blockquote.js'][87] = 0; + _$jscoverage['plugins/blockquote.js'][88] = 0; + _$jscoverage['plugins/blockquote.js'][89] = 0; + _$jscoverage['plugins/blockquote.js'][90] = 0; + _$jscoverage['plugins/blockquote.js'][91] = 0; + _$jscoverage['plugins/blockquote.js'][92] = 0; + _$jscoverage['plugins/blockquote.js'][101] = 0; + _$jscoverage['plugins/blockquote.js'][107] = 0; + _$jscoverage['plugins/blockquote.js'][108] = 0; + _$jscoverage['plugins/blockquote.js'][109] = 0; + _$jscoverage['plugins/blockquote.js'][110] = 0; + _$jscoverage['plugins/blockquote.js'][111] = 0; + _$jscoverage['plugins/blockquote.js'][112] = 0; + _$jscoverage['plugins/blockquote.js'][114] = 0; + _$jscoverage['plugins/blockquote.js'][117] = 0; + _$jscoverage['plugins/blockquote.js'][120] = 0; + _$jscoverage['plugins/blockquote.js'][122] = 0; + _$jscoverage['plugins/blockquote.js'][123] = 0; + _$jscoverage['plugins/blockquote.js'][124] = 0; + _$jscoverage['plugins/blockquote.js'][126] = 0; + _$jscoverage['plugins/blockquote.js'][128] = 0; + _$jscoverage['plugins/blockquote.js'][131] = 0; + _$jscoverage['plugins/blockquote.js'][132] = 0; + _$jscoverage['plugins/blockquote.js'][136] = 0; + _$jscoverage['plugins/blockquote.js'][137] = 0; + _$jscoverage['plugins/blockquote.js'][138] = 0; + _$jscoverage['plugins/blockquote.js'][140] = 0; + _$jscoverage['plugins/blockquote.js'][141] = 0; + _$jscoverage['plugins/blockquote.js'][143] = 0; + _$jscoverage['plugins/blockquote.js'][146] = 0; + _$jscoverage['plugins/blockquote.js'][149] = 0; + _$jscoverage['plugins/blockquote.js'][151] = 0; + _$jscoverage['plugins/blockquote.js'][152] = 0; + _$jscoverage['plugins/blockquote.js'][153] = 0; + _$jscoverage['plugins/blockquote.js'][156] = 0; + _$jscoverage['plugins/blockquote.js'][157] = 0; + _$jscoverage['plugins/blockquote.js'][163] = 0; + _$jscoverage['plugins/blockquote.js'][164] = 0; + _$jscoverage['plugins/blockquote.js'][165] = 0; + _$jscoverage['plugins/blockquote.js'][166] = 0; + _$jscoverage['plugins/blockquote.js'][168] = 0; + _$jscoverage['plugins/blockquote.js'][169] = 0; + _$jscoverage['plugins/blockquote.js'][170] = 0; + _$jscoverage['plugins/blockquote.js'][171] = 0; + _$jscoverage['plugins/blockquote.js'][176] = 0; + _$jscoverage['plugins/blockquote.js'][179] = 0; +} +_$jscoverage['plugins/blockquote.js'].source = ["/**"," * 添加引用"," * @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',{"," * color:'#000'"," * } );"," * ```"," */","","/**"," * 返回当前选区位置是否在引用标签内"," * @command blockquote"," * @method queryCommandState"," * @param { String } cmd 命令字符串"," * @return { int } 0为是,-1为不是"," * @example"," * ```javascript"," * editor.queryCommandState( 'blockquote' );"," * ```"," */","","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;"," }"," };","};",""]; +_$jscoverage['plugins/blockquote.js'][44]++; +UE.plugins.blockquote = (function () { + _$jscoverage['plugins/blockquote.js'][45]++; + var me = this; + _$jscoverage['plugins/blockquote.js'][46]++; + function getObj(editor) { + _$jscoverage['plugins/blockquote.js'][47]++; + return domUtils.filterNodeList(editor.selection.getStartElementPath(), "blockquote"); +} + _$jscoverage['plugins/blockquote.js'][49]++; + me.commands.blockquote = {execCommand: (function (cmdName, attrs) { + _$jscoverage['plugins/blockquote.js'][51]++; + var range = this.selection.getRange(), obj = getObj(this), blockquote = dtd.blockquote, bookmark = range.createBookmark(); + _$jscoverage['plugins/blockquote.js'][56]++; + if (obj) { + _$jscoverage['plugins/blockquote.js'][58]++; + var start = range.startContainer, startBlock = (domUtils.isBlockElm(start)? start: domUtils.findParent(start, (function (node) { + _$jscoverage['plugins/blockquote.js'][59]++; + return domUtils.isBlockElm(node); +}))), end = range.endContainer, endBlock = (domUtils.isBlockElm(end)? end: domUtils.findParent(end, (function (node) { + _$jscoverage['plugins/blockquote.js'][62]++; + return domUtils.isBlockElm(node); +}))); + _$jscoverage['plugins/blockquote.js'][65]++; + startBlock = (domUtils.findParentByTagName(startBlock, "li", true) || startBlock); + _$jscoverage['plugins/blockquote.js'][66]++; + endBlock = (domUtils.findParentByTagName(endBlock, "li", true) || endBlock); + _$jscoverage['plugins/blockquote.js'][69]++; + if (((startBlock.tagName == "LI") || (startBlock.tagName == "TD") || (startBlock === obj) || domUtils.isBody(startBlock))) { + _$jscoverage['plugins/blockquote.js'][70]++; + domUtils.remove(obj, true); + } + else { + _$jscoverage['plugins/blockquote.js'][72]++; + domUtils.breakParent(startBlock, obj); + } + _$jscoverage['plugins/blockquote.js'][75]++; + if ((startBlock !== endBlock)) { + _$jscoverage['plugins/blockquote.js'][76]++; + obj = domUtils.findParentByTagName(endBlock, "blockquote"); + _$jscoverage['plugins/blockquote.js'][77]++; + if (obj) { + _$jscoverage['plugins/blockquote.js'][78]++; + if (((endBlock.tagName == "LI") || (endBlock.tagName == "TD") || domUtils.isBody(endBlock))) { + _$jscoverage['plugins/blockquote.js'][79]++; + (obj.parentNode && domUtils.remove(obj, true)); + } + else { + _$jscoverage['plugins/blockquote.js'][81]++; + domUtils.breakParent(endBlock, obj); + } + } + } + _$jscoverage['plugins/blockquote.js'][87]++; + var blockquotes = domUtils.getElementsByTagName(this.document, "blockquote"); + _$jscoverage['plugins/blockquote.js'][88]++; + for (var i = 0, bi; (bi = blockquotes[(i++)]);) { + _$jscoverage['plugins/blockquote.js'][89]++; + if ((! bi.childNodes.length)) { + _$jscoverage['plugins/blockquote.js'][90]++; + domUtils.remove(bi); + } + else { + _$jscoverage['plugins/blockquote.js'][91]++; + if (((domUtils.getPosition(bi, startBlock) & domUtils.POSITION_FOLLOWING) && (domUtils.getPosition(bi, endBlock) & domUtils.POSITION_PRECEDING))) { + _$jscoverage['plugins/blockquote.js'][92]++; + domUtils.remove(bi, true); + } + } +} + } + else { + _$jscoverage['plugins/blockquote.js'][101]++; + var tmpRange = range.cloneRange(), node = ((tmpRange.startContainer.nodeType == 1)? tmpRange.startContainer: tmpRange.startContainer.parentNode), preNode = node, doEnd = 1; + _$jscoverage['plugins/blockquote.js'][107]++; + while (true) { + _$jscoverage['plugins/blockquote.js'][108]++; + if (domUtils.isBody(node)) { + _$jscoverage['plugins/blockquote.js'][109]++; + if ((preNode !== node)) { + _$jscoverage['plugins/blockquote.js'][110]++; + if (range.collapsed) { + _$jscoverage['plugins/blockquote.js'][111]++; + tmpRange.selectNode(preNode); + _$jscoverage['plugins/blockquote.js'][112]++; + doEnd = 0; + } + else { + _$jscoverage['plugins/blockquote.js'][114]++; + tmpRange.setStartBefore(preNode); + } + } + else { + _$jscoverage['plugins/blockquote.js'][117]++; + tmpRange.setStart(node, 0); + } + _$jscoverage['plugins/blockquote.js'][120]++; + break; + } + _$jscoverage['plugins/blockquote.js'][122]++; + if ((! blockquote[node.tagName])) { + _$jscoverage['plugins/blockquote.js'][123]++; + if (range.collapsed) { + _$jscoverage['plugins/blockquote.js'][124]++; + tmpRange.selectNode(preNode); + } + else { + _$jscoverage['plugins/blockquote.js'][126]++; + tmpRange.setStartBefore(preNode); + } + _$jscoverage['plugins/blockquote.js'][128]++; + break; + } + _$jscoverage['plugins/blockquote.js'][131]++; + preNode = node; + _$jscoverage['plugins/blockquote.js'][132]++; + node = node.parentNode; +} + _$jscoverage['plugins/blockquote.js'][136]++; + if (doEnd) { + _$jscoverage['plugins/blockquote.js'][137]++; + preNode = (node = (node = ((tmpRange.endContainer.nodeType == 1)? tmpRange.endContainer: tmpRange.endContainer.parentNode))); + _$jscoverage['plugins/blockquote.js'][138]++; + while (true) { + _$jscoverage['plugins/blockquote.js'][140]++; + if (domUtils.isBody(node)) { + _$jscoverage['plugins/blockquote.js'][141]++; + if ((preNode !== node)) { + _$jscoverage['plugins/blockquote.js'][143]++; + tmpRange.setEndAfter(preNode); + } + else { + _$jscoverage['plugins/blockquote.js'][146]++; + tmpRange.setEnd(node, node.childNodes.length); + } + _$jscoverage['plugins/blockquote.js'][149]++; + break; + } + _$jscoverage['plugins/blockquote.js'][151]++; + if ((! blockquote[node.tagName])) { + _$jscoverage['plugins/blockquote.js'][152]++; + tmpRange.setEndAfter(preNode); + _$jscoverage['plugins/blockquote.js'][153]++; + break; + } + _$jscoverage['plugins/blockquote.js'][156]++; + preNode = node; + _$jscoverage['plugins/blockquote.js'][157]++; + node = node.parentNode; +} + } + _$jscoverage['plugins/blockquote.js'][163]++; + node = range.document.createElement("blockquote"); + _$jscoverage['plugins/blockquote.js'][164]++; + domUtils.setAttributes(node, attrs); + _$jscoverage['plugins/blockquote.js'][165]++; + node.appendChild(tmpRange.extractContents()); + _$jscoverage['plugins/blockquote.js'][166]++; + tmpRange.insertNode(node); + _$jscoverage['plugins/blockquote.js'][168]++; + var childs = domUtils.getElementsByTagName(node, "blockquote"); + _$jscoverage['plugins/blockquote.js'][169]++; + for (var i = 0, ci; (ci = childs[(i++)]);) { + _$jscoverage['plugins/blockquote.js'][170]++; + if (ci.parentNode) { + _$jscoverage['plugins/blockquote.js'][171]++; + domUtils.remove(ci, true); + } +} + } + _$jscoverage['plugins/blockquote.js'][176]++; + range.moveToBookmark(bookmark).select(); +}), queryCommandState: (function () { + _$jscoverage['plugins/blockquote.js'][179]++; + return (getObj(this)? 1: 0); +})}; +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/catchremoteimage.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/catchremoteimage.js new file mode 100644 index 000000000..a27962630 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/catchremoteimage.js @@ -0,0 +1,192 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/catchremoteimage.js']) { + _$jscoverage['plugins/catchremoteimage.js'] = []; + _$jscoverage['plugins/catchremoteimage.js'][9] = 0; + _$jscoverage['plugins/catchremoteimage.js'][10] = 0; + _$jscoverage['plugins/catchremoteimage.js'][11] = 0; + _$jscoverage['plugins/catchremoteimage.js'][13] = 0; + _$jscoverage['plugins/catchremoteimage.js'][14] = 0; + _$jscoverage['plugins/catchremoteimage.js'][20] = 0; + _$jscoverage['plugins/catchremoteimage.js'][24] = 0; + _$jscoverage['plugins/catchremoteimage.js'][25] = 0; + _$jscoverage['plugins/catchremoteimage.js'][26] = 0; + _$jscoverage['plugins/catchremoteimage.js'][31] = 0; + _$jscoverage['plugins/catchremoteimage.js'][32] = 0; + _$jscoverage['plugins/catchremoteimage.js'][35] = 0; + _$jscoverage['plugins/catchremoteimage.js'][36] = 0; + _$jscoverage['plugins/catchremoteimage.js'][39] = 0; + _$jscoverage['plugins/catchremoteimage.js'][40] = 0; + _$jscoverage['plugins/catchremoteimage.js'][41] = 0; + _$jscoverage['plugins/catchremoteimage.js'][42] = 0; + _$jscoverage['plugins/catchremoteimage.js'][43] = 0; + _$jscoverage['plugins/catchremoteimage.js'][44] = 0; + _$jscoverage['plugins/catchremoteimage.js'][45] = 0; + _$jscoverage['plugins/catchremoteimage.js'][48] = 0; + _$jscoverage['plugins/catchremoteimage.js'][50] = 0; + _$jscoverage['plugins/catchremoteimage.js'][51] = 0; + _$jscoverage['plugins/catchremoteimage.js'][52] = 0; + _$jscoverage['plugins/catchremoteimage.js'][54] = 0; + _$jscoverage['plugins/catchremoteimage.js'][55] = 0; + _$jscoverage['plugins/catchremoteimage.js'][56] = 0; + _$jscoverage['plugins/catchremoteimage.js'][59] = 0; + _$jscoverage['plugins/catchremoteimage.js'][60] = 0; + _$jscoverage['plugins/catchremoteimage.js'][63] = 0; + _$jscoverage['plugins/catchremoteimage.js'][64] = 0; + _$jscoverage['plugins/catchremoteimage.js'][66] = 0; + _$jscoverage['plugins/catchremoteimage.js'][68] = 0; + _$jscoverage['plugins/catchremoteimage.js'][70] = 0; + _$jscoverage['plugins/catchremoteimage.js'][71] = 0; + _$jscoverage['plugins/catchremoteimage.js'][72] = 0; + _$jscoverage['plugins/catchremoteimage.js'][73] = 0; + _$jscoverage['plugins/catchremoteimage.js'][74] = 0; + _$jscoverage['plugins/catchremoteimage.js'][76] = 0; + _$jscoverage['plugins/catchremoteimage.js'][77] = 0; + _$jscoverage['plugins/catchremoteimage.js'][81] = 0; + _$jscoverage['plugins/catchremoteimage.js'][85] = 0; + _$jscoverage['plugins/catchremoteimage.js'][89] = 0; +} +_$jscoverage['plugins/catchremoteimage.js'].source = ["///import core","///commands 远程图片抓取","///commandsName catchRemoteImage,catchremoteimageenable","///commandsTitle 远程图片抓取","/*"," * 远程图片抓取,当开启本插件时所有不符合本地域名的图片都将被抓取成为本地服务器上的图片"," *"," */","UE.plugins['catchremoteimage'] = function () {"," if (this.options.catchRemoteImageEnable===false){"," return;"," }"," var me = this;"," this.setOpt({"," localDomain:[\"127.0.0.1\",\"localhost\",\"img.baidu.com\"],"," separater:'ue_separate_ue',"," catchFieldName:\"upfile\","," catchRemoteImageEnable:true"," });"," var ajax = UE.ajax,"," localDomain = me.options.localDomain ,"," catcherUrl = me.options.catcherUrl,"," separater = me.options.separater;"," function catchremoteimage(imgs, callbacks) {"," var submitStr = imgs.join(separater);"," var tmpOption = {"," timeout:60000, //单位:毫秒,回调请求超时设置。目标用户如果网速不是很快的话此处建议设置一个较大的数值"," onsuccess:callbacks[\"success\"],"," onerror:callbacks[\"error\"]"," };"," tmpOption[me.options.catchFieldName] = submitStr;"," ajax.request(catcherUrl, tmpOption);"," }",""," me.addListener(\"afterpaste\", function () {"," me.fireEvent(\"catchRemoteImage\");"," });",""," me.addListener(\"catchRemoteImage\", function () {"," var remoteImages = [];"," var imgs = domUtils.getElementsByTagName(me.document, \"img\");"," var test = function (src,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;"," }"," var src = ci.getAttribute(\"_src\") || ci.src || \"\";"," if (/^(https?|ftp):/i.test(src) && !test(src,localDomain)) {"," remoteImages.push(src);"," }"," }"," if (remoteImages.length) {"," catchremoteimage(remoteImages, {"," //成功抓取"," success:function (xhr) {"," try {"," var info = eval(\"(\" + xhr.responseText + \")\");"," } catch (e) {"," return;"," }"," var srcUrls = info.srcUrl.split(separater),"," urls = info.url.split(separater);"," for (var i = 0, ci; ci = imgs[i++];) {"," var src = ci.getAttribute(\"_src\") || ci.src || \"\";"," for (var j = 0, cj; cj = srcUrls[j++];) {"," var url = urls[j - 1];"," if (src == cj && url != \"error\") { //抓取失败时不做替换处理"," //地址修正"," var newSrc = me.options.catcherPath + url;"," domUtils.setAttributes(ci, {"," \"src\":newSrc,"," \"_src\":newSrc"," });"," break;"," }"," }"," }"," me.fireEvent('catchremotesuccess')"," },"," //回调失败,本次请求超时"," error:function () {"," me.fireEvent(\"catchremoteerror\");"," }"," });"," }",""," });","};"]; +_$jscoverage['plugins/catchremoteimage.js'][9]++; +UE.plugins.catchremoteimage = (function () { + _$jscoverage['plugins/catchremoteimage.js'][10]++; + if ((this.options.catchRemoteImageEnable === false)) { + _$jscoverage['plugins/catchremoteimage.js'][11]++; + return; + } + _$jscoverage['plugins/catchremoteimage.js'][13]++; + var me = this; + _$jscoverage['plugins/catchremoteimage.js'][14]++; + this.setOpt({localDomain: ["127.0.0.1", "localhost", "img.baidu.com"], separater: "ue_separate_ue", catchFieldName: "upfile", catchRemoteImageEnable: true}); + _$jscoverage['plugins/catchremoteimage.js'][20]++; + var ajax = UE.ajax, localDomain = me.options.localDomain, catcherUrl = me.options.catcherUrl, separater = me.options.separater; + _$jscoverage['plugins/catchremoteimage.js'][24]++; + function catchremoteimage(imgs, callbacks) { + _$jscoverage['plugins/catchremoteimage.js'][25]++; + var submitStr = imgs.join(separater); + _$jscoverage['plugins/catchremoteimage.js'][26]++; + var tmpOption = {timeout: 60000, onsuccess: callbacks.success, onerror: callbacks.error}; + _$jscoverage['plugins/catchremoteimage.js'][31]++; + tmpOption[me.options.catchFieldName] = submitStr; + _$jscoverage['plugins/catchremoteimage.js'][32]++; + ajax.request(catcherUrl, tmpOption); +} + _$jscoverage['plugins/catchremoteimage.js'][35]++; + me.addListener("afterpaste", (function () { + _$jscoverage['plugins/catchremoteimage.js'][36]++; + me.fireEvent("catchRemoteImage"); +})); + _$jscoverage['plugins/catchremoteimage.js'][39]++; + me.addListener("catchRemoteImage", (function () { + _$jscoverage['plugins/catchremoteimage.js'][40]++; + var remoteImages = []; + _$jscoverage['plugins/catchremoteimage.js'][41]++; + var imgs = domUtils.getElementsByTagName(me.document, "img"); + _$jscoverage['plugins/catchremoteimage.js'][42]++; + var test = (function (src, urls) { + _$jscoverage['plugins/catchremoteimage.js'][43]++; + for (var j = 0, url; (url = urls[(j++)]);) { + _$jscoverage['plugins/catchremoteimage.js'][44]++; + if ((src.indexOf(url) !== -1)) { + _$jscoverage['plugins/catchremoteimage.js'][45]++; + return true; + } +} + _$jscoverage['plugins/catchremoteimage.js'][48]++; + return false; +}); + _$jscoverage['plugins/catchremoteimage.js'][50]++; + for (var i = 0, ci; (ci = imgs[(i++)]);) { + _$jscoverage['plugins/catchremoteimage.js'][51]++; + if (ci.getAttribute("word_img")) { + _$jscoverage['plugins/catchremoteimage.js'][52]++; + continue; + } + _$jscoverage['plugins/catchremoteimage.js'][54]++; + var src = (ci.getAttribute("_src") || ci.src || ""); + _$jscoverage['plugins/catchremoteimage.js'][55]++; + if ((/^(https?|ftp):/i.test(src) && (! test(src, localDomain)))) { + _$jscoverage['plugins/catchremoteimage.js'][56]++; + remoteImages.push(src); + } +} + _$jscoverage['plugins/catchremoteimage.js'][59]++; + if (remoteImages.length) { + _$jscoverage['plugins/catchremoteimage.js'][60]++; + catchremoteimage(remoteImages, {success: (function (xhr) { + _$jscoverage['plugins/catchremoteimage.js'][63]++; + try { + _$jscoverage['plugins/catchremoteimage.js'][64]++; + var info = eval(("(" + xhr.responseText + ")")); + } + catch (e) { + _$jscoverage['plugins/catchremoteimage.js'][66]++; + return; + } + _$jscoverage['plugins/catchremoteimage.js'][68]++; + var srcUrls = info.srcUrl.split(separater), urls = info.url.split(separater); + _$jscoverage['plugins/catchremoteimage.js'][70]++; + for (var i = 0, ci; (ci = imgs[(i++)]);) { + _$jscoverage['plugins/catchremoteimage.js'][71]++; + var src = (ci.getAttribute("_src") || ci.src || ""); + _$jscoverage['plugins/catchremoteimage.js'][72]++; + for (var j = 0, cj; (cj = srcUrls[(j++)]);) { + _$jscoverage['plugins/catchremoteimage.js'][73]++; + var url = urls[(j - 1)]; + _$jscoverage['plugins/catchremoteimage.js'][74]++; + if (((src == cj) && (url != "error"))) { + _$jscoverage['plugins/catchremoteimage.js'][76]++; + var newSrc = (me.options.catcherPath + url); + _$jscoverage['plugins/catchremoteimage.js'][77]++; + domUtils.setAttributes(ci, {"src": newSrc, "_src": newSrc}); + _$jscoverage['plugins/catchremoteimage.js'][81]++; + break; + } +} +} + _$jscoverage['plugins/catchremoteimage.js'][85]++; + me.fireEvent("catchremotesuccess"); +}), error: (function () { + _$jscoverage['plugins/catchremoteimage.js'][89]++; + me.fireEvent("catchremoteerror"); +})}); + } +})); +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/cleardoc.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/cleardoc.js new file mode 100644 index 000000000..0feece8fb --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/cleardoc.js @@ -0,0 +1,75 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/cleardoc.js']) { + _$jscoverage['plugins/cleardoc.js'] = []; + _$jscoverage['plugins/cleardoc.js'][19] = 0; + _$jscoverage['plugins/cleardoc.js'][21] = 0; + _$jscoverage['plugins/cleardoc.js'][24] = 0; + _$jscoverage['plugins/cleardoc.js'][25] = 0; + _$jscoverage['plugins/cleardoc.js'][26] = 0; + _$jscoverage['plugins/cleardoc.js'][28] = 0; + _$jscoverage['plugins/cleardoc.js'][29] = 0; + _$jscoverage['plugins/cleardoc.js'][31] = 0; + _$jscoverage['plugins/cleardoc.js'][32] = 0; +} +_$jscoverage['plugins/cleardoc.js'].source = ["/**"," * 清空文档插件"," * @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 = \"<br/>\";"," range.setStart(me.body,0).setCursor();"," }else{"," me.body.innerHTML = \"<p>\"+(ie ? \"\" : \"<br/>\")+\"</p>\";"," range.setStart(me.body.firstChild,0).setCursor(false,true);"," }"," setTimeout(function(){"," me.fireEvent(\"clearDoc\");"," },0);",""," }","};",""]; +_$jscoverage['plugins/cleardoc.js'][19]++; +UE.commands.cleardoc = {execCommand: (function (cmdName) { + _$jscoverage['plugins/cleardoc.js'][21]++; + var me = this, enterTag = me.options.enterTag, range = me.selection.getRange(); + _$jscoverage['plugins/cleardoc.js'][24]++; + if ((enterTag == "br")) { + _$jscoverage['plugins/cleardoc.js'][25]++; + me.body.innerHTML = "
    "; + _$jscoverage['plugins/cleardoc.js'][26]++; + range.setStart(me.body, 0).setCursor(); + } + else { + _$jscoverage['plugins/cleardoc.js'][28]++; + me.body.innerHTML = ("

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

    "); + _$jscoverage['plugins/cleardoc.js'][29]++; + range.setStart(me.body.firstChild, 0).setCursor(false, true); + } + _$jscoverage['plugins/cleardoc.js'][31]++; + setTimeout((function () { + _$jscoverage['plugins/cleardoc.js'][32]++; + me.fireEvent("clearDoc"); +}), 0); +})}; diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/contextmenu.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/contextmenu.js new file mode 100644 index 000000000..69e001c82 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/contextmenu.js @@ -0,0 +1,413 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/contextmenu.js']) { + _$jscoverage['plugins/contextmenu.js'] = []; + _$jscoverage['plugins/contextmenu.js'][12] = 0; + _$jscoverage['plugins/contextmenu.js'][13] = 0; + _$jscoverage['plugins/contextmenu.js'][27] = 0; + _$jscoverage['plugins/contextmenu.js'][28] = 0; + _$jscoverage['plugins/contextmenu.js'][159] = 0; + _$jscoverage['plugins/contextmenu.js'][160] = 0; + _$jscoverage['plugins/contextmenu.js'][162] = 0; + _$jscoverage['plugins/contextmenu.js'][169] = 0; + _$jscoverage['plugins/contextmenu.js'][170] = 0; + _$jscoverage['plugins/contextmenu.js'][172] = 0; + _$jscoverage['plugins/contextmenu.js'][194] = 0; + _$jscoverage['plugins/contextmenu.js'][195] = 0; + _$jscoverage['plugins/contextmenu.js'][197] = 0; + _$jscoverage['plugins/contextmenu.js'][205] = 0; + _$jscoverage['plugins/contextmenu.js'][206] = 0; + _$jscoverage['plugins/contextmenu.js'][208] = 0; + _$jscoverage['plugins/contextmenu.js'][209] = 0; + _$jscoverage['plugins/contextmenu.js'][210] = 0; + _$jscoverage['plugins/contextmenu.js'][218] = 0; + _$jscoverage['plugins/contextmenu.js'][219] = 0; + _$jscoverage['plugins/contextmenu.js'][221] = 0; + _$jscoverage['plugins/contextmenu.js'][222] = 0; + _$jscoverage['plugins/contextmenu.js'][223] = 0; + _$jscoverage['plugins/contextmenu.js'][237] = 0; + _$jscoverage['plugins/contextmenu.js'][244] = 0; + _$jscoverage['plugins/contextmenu.js'][251] = 0; + _$jscoverage['plugins/contextmenu.js'][258] = 0; + _$jscoverage['plugins/contextmenu.js'][265] = 0; + _$jscoverage['plugins/contextmenu.js'][272] = 0; + _$jscoverage['plugins/contextmenu.js'][357] = 0; + _$jscoverage['plugins/contextmenu.js'][360] = 0; + _$jscoverage['plugins/contextmenu.js'][367] = 0; + _$jscoverage['plugins/contextmenu.js'][370] = 0; + _$jscoverage['plugins/contextmenu.js'][376] = 0; + _$jscoverage['plugins/contextmenu.js'][377] = 0; + _$jscoverage['plugins/contextmenu.js'][379] = 0; + _$jscoverage['plugins/contextmenu.js'][383] = 0; + _$jscoverage['plugins/contextmenu.js'][384] = 0; + _$jscoverage['plugins/contextmenu.js'][386] = 0; + _$jscoverage['plugins/contextmenu.js'][388] = 0; + _$jscoverage['plugins/contextmenu.js'][390] = 0; + _$jscoverage['plugins/contextmenu.js'][391] = 0; + _$jscoverage['plugins/contextmenu.js'][392] = 0; + _$jscoverage['plugins/contextmenu.js'][393] = 0; + _$jscoverage['plugins/contextmenu.js'][395] = 0; + _$jscoverage['plugins/contextmenu.js'][396] = 0; + _$jscoverage['plugins/contextmenu.js'][397] = 0; + _$jscoverage['plugins/contextmenu.js'][398] = 0; + _$jscoverage['plugins/contextmenu.js'][399] = 0; + _$jscoverage['plugins/contextmenu.js'][400] = 0; + _$jscoverage['plugins/contextmenu.js'][402] = 0; + _$jscoverage['plugins/contextmenu.js'][403] = 0; + _$jscoverage['plugins/contextmenu.js'][404] = 0; + _$jscoverage['plugins/contextmenu.js'][405] = 0; + _$jscoverage['plugins/contextmenu.js'][406] = 0; + _$jscoverage['plugins/contextmenu.js'][407] = 0; + _$jscoverage['plugins/contextmenu.js'][409] = 0; + _$jscoverage['plugins/contextmenu.js'][412] = 0; + _$jscoverage['plugins/contextmenu.js'][414] = 0; + _$jscoverage['plugins/contextmenu.js'][418] = 0; + _$jscoverage['plugins/contextmenu.js'][420] = 0; + _$jscoverage['plugins/contextmenu.js'][427] = 0; + _$jscoverage['plugins/contextmenu.js'][428] = 0; + _$jscoverage['plugins/contextmenu.js'][429] = 0; + _$jscoverage['plugins/contextmenu.js'][431] = 0; + _$jscoverage['plugins/contextmenu.js'][433] = 0; + _$jscoverage['plugins/contextmenu.js'][435] = 0; + _$jscoverage['plugins/contextmenu.js'][437] = 0; + _$jscoverage['plugins/contextmenu.js'][439] = 0; + _$jscoverage['plugins/contextmenu.js'][441] = 0; + _$jscoverage['plugins/contextmenu.js'][443] = 0; + _$jscoverage['plugins/contextmenu.js'][446] = 0; + _$jscoverage['plugins/contextmenu.js'][459] = 0; + _$jscoverage['plugins/contextmenu.js'][462] = 0; + _$jscoverage['plugins/contextmenu.js'][463] = 0; + _$jscoverage['plugins/contextmenu.js'][464] = 0; + _$jscoverage['plugins/contextmenu.js'][466] = 0; + _$jscoverage['plugins/contextmenu.js'][467] = 0; + _$jscoverage['plugins/contextmenu.js'][470] = 0; + _$jscoverage['plugins/contextmenu.js'][474] = 0; + _$jscoverage['plugins/contextmenu.js'][476] = 0; + _$jscoverage['plugins/contextmenu.js'][485] = 0; + _$jscoverage['plugins/contextmenu.js'][486] = 0; + _$jscoverage['plugins/contextmenu.js'][489] = 0; + _$jscoverage['plugins/contextmenu.js'][494] = 0; + _$jscoverage['plugins/contextmenu.js'][495] = 0; + _$jscoverage['plugins/contextmenu.js'][497] = 0; + _$jscoverage['plugins/contextmenu.js'][499] = 0; + _$jscoverage['plugins/contextmenu.js'][500] = 0; + _$jscoverage['plugins/contextmenu.js'][501] = 0; + _$jscoverage['plugins/contextmenu.js'][502] = 0; + _$jscoverage['plugins/contextmenu.js'][503] = 0; + _$jscoverage['plugins/contextmenu.js'][505] = 0; + _$jscoverage['plugins/contextmenu.js'][507] = 0; + _$jscoverage['plugins/contextmenu.js'][508] = 0; + _$jscoverage['plugins/contextmenu.js'][509] = 0; +} +_$jscoverage['plugins/contextmenu.js'].source = ["///import core","///commands 右键菜单","///commandsName ContextMenu","///commandsTitle 右键菜单","/*"," * 右键菜单"," * @function"," * @name baidu.editor.plugins.contextmenu"," * @author zhanyi"," */","","UE.plugins['contextmenu'] = function () {"," var me = this,"," lang = me.getLang( \"contextMenu\" ),"," menu,"," items = me.options.contextMenu || ["," {label:lang['selectall'], cmdName:'selectall'},"," {"," label:lang.deletecode,"," cmdName:'highlightcode',"," icon:'deletehighlightcode'"," },"," {"," 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.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();"," }"," }"," ]"," },"," {"," group:lang.tablesort,"," icon:'tablesort',"," subMenu:["," {"," label:lang.reversecurrent,"," cmdName:'sorttable',"," value:1"," },"," {"," label:lang.orderbyasc,"," cmdName:'sorttable'"," },"," {"," label:lang.reversebyasc,"," cmdName:'sorttable',"," exec:function(){"," this.execCommand(\"sorttable\",function(td1,td2){"," var value1 = td1.innerHTML,"," value2 = td2.innerHTML;"," return value2.localeCompare(value1);"," });"," }"," },"," {"," label:lang.orderbynum,"," cmdName:'sorttable',"," exec:function(){"," this.execCommand(\"sorttable\",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);"," });"," }"," },"," {"," label:lang.reversebynum,"," cmdName:'sorttable',"," exec:function(){"," this.execCommand(\"sorttable\",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);"," });"," }"," }"," ]"," },"," {"," 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',"," exec:function () {"," alert( lang.copymsg );"," },"," query:function () {"," return 0;"," }"," },"," {"," label:lang['paste'],"," cmdName:'paste',"," exec:function () {"," alert( lang.pastemsg );"," },"," query:function () {"," return 0;"," }"," },{"," label:lang['highlightcode'],"," cmdName:'highlightcode',"," exec:function () {"," if ( UE.ui['highlightcode'] ) {"," new UE.ui['highlightcode']( this );"," }"," this.ui._dialogs['highlightcodeDialog'].open();"," }"," }"," ];"," 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 ) {"," //highlight todo"," if ( item.cmdName == 'highlightcode' ) {"," if(me.queryCommandState( item.cmdName ) == 1 && item.icon != 'deletehighlightcode'){"," return;"," }"," if(me.queryCommandState( item.cmdName ) != 1 && item.icon == 'deletehighlightcode'){"," return;"," }"," }"," 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 );",""," }"," }"," } );","};","",""]; +_$jscoverage['plugins/contextmenu.js'][12]++; +UE.plugins.contextmenu = (function () { + _$jscoverage['plugins/contextmenu.js'][13]++; + var me = this, lang = me.getLang("contextMenu"), menu, items = (me.options.contextMenu || [{label: lang.selectall, cmdName: "selectall"}, {label: lang.deletecode, cmdName: "highlightcode", icon: "deletehighlightcode"}, {label: lang.cleardoc, cmdName: "cleardoc", exec: (function () { + _$jscoverage['plugins/contextmenu.js'][27]++; + if (confirm(lang.confirmclear)) { + _$jscoverage['plugins/contextmenu.js'][28]++; + 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.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 () { + _$jscoverage['plugins/contextmenu.js'][159]++; + if (UE.ui.edittd) { + _$jscoverage['plugins/contextmenu.js'][160]++; + new (UE.ui.edittd)(this); + } + _$jscoverage['plugins/contextmenu.js'][162]++; + this.getDialog("edittd").open(); +})}, {label: lang.edittable, cmdName: "edittable", exec: (function () { + _$jscoverage['plugins/contextmenu.js'][169]++; + if (UE.ui.edittable) { + _$jscoverage['plugins/contextmenu.js'][170]++; + new (UE.ui.edittable)(this); + } + _$jscoverage['plugins/contextmenu.js'][172]++; + this.getDialog("edittable").open(); +})}]}, {group: lang.tablesort, icon: "tablesort", subMenu: [{label: lang.reversecurrent, cmdName: "sorttable", value: 1}, {label: lang.orderbyasc, cmdName: "sorttable"}, {label: lang.reversebyasc, cmdName: "sorttable", exec: (function () { + _$jscoverage['plugins/contextmenu.js'][194]++; + this.execCommand("sorttable", (function (td1, td2) { + _$jscoverage['plugins/contextmenu.js'][195]++; + var value1 = td1.innerHTML, value2 = td2.innerHTML; + _$jscoverage['plugins/contextmenu.js'][197]++; + return value2.localeCompare(value1); +})); +})}, {label: lang.orderbynum, cmdName: "sorttable", exec: (function () { + _$jscoverage['plugins/contextmenu.js'][205]++; + this.execCommand("sorttable", (function (td1, td2) { + _$jscoverage['plugins/contextmenu.js'][206]++; + var value1 = td1[(browser.ie? "innerText": "textContent")].match(/\d+/), value2 = td2[(browser.ie? "innerText": "textContent")].match(/\d+/); + _$jscoverage['plugins/contextmenu.js'][208]++; + if (value1) { + _$jscoverage['plugins/contextmenu.js'][208]++; + value1 = (+ value1[0]); + } + _$jscoverage['plugins/contextmenu.js'][209]++; + if (value2) { + _$jscoverage['plugins/contextmenu.js'][209]++; + value2 = (+ value2[0]); + } + _$jscoverage['plugins/contextmenu.js'][210]++; + return ((value1 || 0) - (value2 || 0)); +})); +})}, {label: lang.reversebynum, cmdName: "sorttable", exec: (function () { + _$jscoverage['plugins/contextmenu.js'][218]++; + this.execCommand("sorttable", (function (td1, td2) { + _$jscoverage['plugins/contextmenu.js'][219]++; + var value1 = td1[(browser.ie? "innerText": "textContent")].match(/\d+/), value2 = td2[(browser.ie? "innerText": "textContent")].match(/\d+/); + _$jscoverage['plugins/contextmenu.js'][221]++; + if (value1) { + _$jscoverage['plugins/contextmenu.js'][221]++; + value1 = (+ value1[0]); + } + _$jscoverage['plugins/contextmenu.js'][222]++; + if (value2) { + _$jscoverage['plugins/contextmenu.js'][222]++; + value2 = (+ value2[0]); + } + _$jscoverage['plugins/contextmenu.js'][223]++; + return ((value2 || 0) - (value1 || 0)); +})); +})}]}, {group: lang.borderbk, icon: "borderBack", subMenu: [{label: lang.setcolor, cmdName: "interlacetable", exec: (function () { + _$jscoverage['plugins/contextmenu.js'][237]++; + this.execCommand("interlacetable"); +})}, {label: lang.unsetcolor, cmdName: "uninterlacetable", exec: (function () { + _$jscoverage['plugins/contextmenu.js'][244]++; + this.execCommand("uninterlacetable"); +})}, {label: lang.setbackground, cmdName: "settablebackground", exec: (function () { + _$jscoverage['plugins/contextmenu.js'][251]++; + this.execCommand("settablebackground", {repeat: true, colorList: ["#bbb", "#ccc"]}); +})}, {label: lang.unsetbackground, cmdName: "cleartablebackground", exec: (function () { + _$jscoverage['plugins/contextmenu.js'][258]++; + this.execCommand("cleartablebackground"); +})}, {label: lang.redandblue, cmdName: "settablebackground", exec: (function () { + _$jscoverage['plugins/contextmenu.js'][265]++; + this.execCommand("settablebackground", {repeat: true, colorList: ["red", "blue"]}); +})}, {label: lang.threecolorgradient, cmdName: "settablebackground", exec: (function () { + _$jscoverage['plugins/contextmenu.js'][272]++; + 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", exec: (function () { + _$jscoverage['plugins/contextmenu.js'][357]++; + alert(lang.copymsg); +}), query: (function () { + _$jscoverage['plugins/contextmenu.js'][360]++; + return 0; +})}, {label: lang.paste, cmdName: "paste", exec: (function () { + _$jscoverage['plugins/contextmenu.js'][367]++; + alert(lang.pastemsg); +}), query: (function () { + _$jscoverage['plugins/contextmenu.js'][370]++; + return 0; +})}, {label: lang.highlightcode, cmdName: "highlightcode", exec: (function () { + _$jscoverage['plugins/contextmenu.js'][376]++; + if (UE.ui.highlightcode) { + _$jscoverage['plugins/contextmenu.js'][377]++; + new (UE.ui.highlightcode)(this); + } + _$jscoverage['plugins/contextmenu.js'][379]++; + this.ui._dialogs.highlightcodeDialog.open(); +})}]); + _$jscoverage['plugins/contextmenu.js'][383]++; + if ((! items.length)) { + _$jscoverage['plugins/contextmenu.js'][384]++; + return; + } + _$jscoverage['plugins/contextmenu.js'][386]++; + var uiUtils = UE.ui.uiUtils; + _$jscoverage['plugins/contextmenu.js'][388]++; + me.addListener("contextmenu", (function (type, evt) { + _$jscoverage['plugins/contextmenu.js'][390]++; + var offset = uiUtils.getViewportOffsetByEvent(evt); + _$jscoverage['plugins/contextmenu.js'][391]++; + me.fireEvent("beforeselectionchange"); + _$jscoverage['plugins/contextmenu.js'][392]++; + if (menu) { + _$jscoverage['plugins/contextmenu.js'][393]++; + menu.destroy(); + } + _$jscoverage['plugins/contextmenu.js'][395]++; + for (var i = 0, ti, contextItems = []; (ti = items[i]); (i++)) { + _$jscoverage['plugins/contextmenu.js'][396]++; + var last; + _$jscoverage['plugins/contextmenu.js'][397]++; + (function (item) { + _$jscoverage['plugins/contextmenu.js'][398]++; + if ((item == "-")) { + _$jscoverage['plugins/contextmenu.js'][399]++; + if (((last = contextItems[(contextItems.length - 1)]) && (last !== "-"))) { + _$jscoverage['plugins/contextmenu.js'][400]++; + contextItems.push("-"); + } + } + else { + _$jscoverage['plugins/contextmenu.js'][402]++; + if (item.hasOwnProperty("group")) { + _$jscoverage['plugins/contextmenu.js'][403]++; + for (var j = 0, cj, subMenu = []; (cj = item.subMenu[j]); (j++)) { + _$jscoverage['plugins/contextmenu.js'][404]++; + (function (subItem) { + _$jscoverage['plugins/contextmenu.js'][405]++; + if ((subItem == "-")) { + _$jscoverage['plugins/contextmenu.js'][406]++; + if (((last = subMenu[(subMenu.length - 1)]) && (last !== "-"))) { + _$jscoverage['plugins/contextmenu.js'][407]++; + subMenu.push("-"); + } + else { + _$jscoverage['plugins/contextmenu.js'][409]++; + subMenu.splice((subMenu.length - 1)); + } + } + else { + _$jscoverage['plugins/contextmenu.js'][412]++; + if (((me.commands[subItem.cmdName] || UE.commands[subItem.cmdName] || subItem.query) && ((subItem.query? subItem.query(): me.queryCommandState(subItem.cmdName)) > -1))) { + _$jscoverage['plugins/contextmenu.js'][414]++; + 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 () { + _$jscoverage['plugins/contextmenu.js'][418]++; + subItem.exec.call(me); +}): (function () { + _$jscoverage['plugins/contextmenu.js'][420]++; + me.execCommand(subItem.cmdName, subItem.value); +}))}); + } + } +})(cj); +} + _$jscoverage['plugins/contextmenu.js'][427]++; + if (subMenu.length) { + _$jscoverage['plugins/contextmenu.js'][428]++; + function getLabel() { + _$jscoverage['plugins/contextmenu.js'][429]++; + switch (item.icon) { + case "table": + _$jscoverage['plugins/contextmenu.js'][431]++; + return me.getLang("contextMenu.table"); + case "justifyjustify": + _$jscoverage['plugins/contextmenu.js'][433]++; + return me.getLang("contextMenu.paragraph"); + case "aligntd": + _$jscoverage['plugins/contextmenu.js'][435]++; + return me.getLang("contextMenu.aligntd"); + case "aligntable": + _$jscoverage['plugins/contextmenu.js'][437]++; + return me.getLang("contextMenu.aligntable"); + case "tablesort": + _$jscoverage['plugins/contextmenu.js'][439]++; + return lang.tablesort; + case "borderBack": + _$jscoverage['plugins/contextmenu.js'][441]++; + return lang.borderbk; + default: + _$jscoverage['plugins/contextmenu.js'][443]++; + return ""; + } +} + _$jscoverage['plugins/contextmenu.js'][446]++; + contextItems.push({"label": getLabel(), className: ("edui-for-" + item.icon), "subMenu": {items: subMenu, editor: me}}); + } + } + else { + _$jscoverage['plugins/contextmenu.js'][459]++; + if (((me.commands[item.cmdName] || UE.commands[item.cmdName] || item.query) && ((item.query? item.query.call(me): me.queryCommandState(item.cmdName)) > -1))) { + _$jscoverage['plugins/contextmenu.js'][462]++; + if ((item.cmdName == "highlightcode")) { + _$jscoverage['plugins/contextmenu.js'][463]++; + if (((me.queryCommandState(item.cmdName) == 1) && (item.icon != "deletehighlightcode"))) { + _$jscoverage['plugins/contextmenu.js'][464]++; + return; + } + _$jscoverage['plugins/contextmenu.js'][466]++; + if (((me.queryCommandState(item.cmdName) != 1) && (item.icon == "deletehighlightcode"))) { + _$jscoverage['plugins/contextmenu.js'][467]++; + return; + } + } + _$jscoverage['plugins/contextmenu.js'][470]++; + 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 () { + _$jscoverage['plugins/contextmenu.js'][474]++; + item.exec.call(me); +}): (function () { + _$jscoverage['plugins/contextmenu.js'][476]++; + me.execCommand(item.cmdName, item.value); +}))}); + } + } + } +})(ti); +} + _$jscoverage['plugins/contextmenu.js'][485]++; + if ((contextItems[(contextItems.length - 1)] == "-")) { + _$jscoverage['plugins/contextmenu.js'][486]++; + contextItems.pop(); + } + _$jscoverage['plugins/contextmenu.js'][489]++; + menu = new (UE.ui.Menu)({items: contextItems, className: "edui-contextmenu", editor: me}); + _$jscoverage['plugins/contextmenu.js'][494]++; + menu.render(); + _$jscoverage['plugins/contextmenu.js'][495]++; + menu.showAt(offset); + _$jscoverage['plugins/contextmenu.js'][497]++; + me.fireEvent("aftershowcontextmenu", menu); + _$jscoverage['plugins/contextmenu.js'][499]++; + domUtils.preventDefault(evt); + _$jscoverage['plugins/contextmenu.js'][500]++; + if (browser.ie) { + _$jscoverage['plugins/contextmenu.js'][501]++; + var ieRange; + _$jscoverage['plugins/contextmenu.js'][502]++; + try { + _$jscoverage['plugins/contextmenu.js'][503]++; + ieRange = me.selection.getNative().createRange(); + } + catch (e) { + _$jscoverage['plugins/contextmenu.js'][505]++; + return; + } + _$jscoverage['plugins/contextmenu.js'][507]++; + if (ieRange.item) { + _$jscoverage['plugins/contextmenu.js'][508]++; + var range = new (dom.Range)(me.document); + _$jscoverage['plugins/contextmenu.js'][509]++; + range.selectNode(ieRange.item(0)).select(true, true); + } + } +})); +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/convertcase.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/convertcase.js new file mode 100644 index 000000000..89df8c0c9 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/convertcase.js @@ -0,0 +1,91 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/convertcase.js']) { + _$jscoverage['plugins/convertcase.js'] = []; + _$jscoverage['plugins/convertcase.js'][28] = 0; + _$jscoverage['plugins/convertcase.js'][31] = 0; + _$jscoverage['plugins/convertcase.js'][32] = 0; + _$jscoverage['plugins/convertcase.js'][33] = 0; + _$jscoverage['plugins/convertcase.js'][34] = 0; + _$jscoverage['plugins/convertcase.js'][36] = 0; + _$jscoverage['plugins/convertcase.js'][39] = 0; + _$jscoverage['plugins/convertcase.js'][42] = 0; + _$jscoverage['plugins/convertcase.js'][44] = 0; + _$jscoverage['plugins/convertcase.js'][45] = 0; + _$jscoverage['plugins/convertcase.js'][47] = 0; + _$jscoverage['plugins/convertcase.js'][48] = 0; + _$jscoverage['plugins/convertcase.js'][49] = 0; + _$jscoverage['plugins/convertcase.js'][53] = 0; +} +_$jscoverage['plugins/convertcase.js'].source = ["/**"," * 大小写转换"," * @file"," * @since 1.2.6.1"," */","","/**"," * 把选区内文本变大写"," * @command touppercase"," * @method execCommand"," * @param { String } cmd 命令字符串"," * @example"," * ```javascript"," * editor.execCommand( '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();"," }","};",""]; +_$jscoverage['plugins/convertcase.js'][28]++; +UE.commands.touppercase = (UE.commands.tolowercase = {execCommand: (function (cmd) { + _$jscoverage['plugins/convertcase.js'][31]++; + var me = this; + _$jscoverage['plugins/convertcase.js'][32]++; + var rng = me.selection.getRange(); + _$jscoverage['plugins/convertcase.js'][33]++; + if (rng.collapsed) { + _$jscoverage['plugins/convertcase.js'][34]++; + return rng; + } + _$jscoverage['plugins/convertcase.js'][36]++; + var bk = rng.createBookmark(), bkEnd = bk.end, filterFn = (function (node) { + _$jscoverage['plugins/convertcase.js'][39]++; + return ((! domUtils.isBr(node)) && (! domUtils.isWhitespace(node))); +}), curNode = domUtils.getNextDomNode(bk.start, false, filterFn); + _$jscoverage['plugins/convertcase.js'][42]++; + while ((curNode && (domUtils.getPosition(curNode, bkEnd) & domUtils.POSITION_PRECEDING))) { + _$jscoverage['plugins/convertcase.js'][44]++; + if ((curNode.nodeType == 3)) { + _$jscoverage['plugins/convertcase.js'][45]++; + curNode.nodeValue = (curNode.nodeValue[((cmd == "touppercase")? "toUpperCase": "toLowerCase")])(); + } + _$jscoverage['plugins/convertcase.js'][47]++; + curNode = domUtils.getNextDomNode(curNode, true, filterFn); + _$jscoverage['plugins/convertcase.js'][48]++; + if ((curNode === bkEnd)) { + _$jscoverage['plugins/convertcase.js'][49]++; + break; + } +} + _$jscoverage['plugins/convertcase.js'][53]++; + rng.moveToBookmark(bk).select(); +})}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/customstyle.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/customstyle.js new file mode 100644 index 000000000..fbf440cbb --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/customstyle.js @@ -0,0 +1,293 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/customstyle.js']) { + _$jscoverage['plugins/customstyle.js'] = []; + _$jscoverage['plugins/customstyle.js'][6] = 0; + _$jscoverage['plugins/customstyle.js'][7] = 0; + _$jscoverage['plugins/customstyle.js'][8] = 0; + _$jscoverage['plugins/customstyle.js'][14] = 0; + _$jscoverage['plugins/customstyle.js'][16] = 0; + _$jscoverage['plugins/customstyle.js'][19] = 0; + _$jscoverage['plugins/customstyle.js'][22] = 0; + _$jscoverage['plugins/customstyle.js'][23] = 0; + _$jscoverage['plugins/customstyle.js'][24] = 0; + _$jscoverage['plugins/customstyle.js'][26] = 0; + _$jscoverage['plugins/customstyle.js'][27] = 0; + _$jscoverage['plugins/customstyle.js'][28] = 0; + _$jscoverage['plugins/customstyle.js'][29] = 0; + _$jscoverage['plugins/customstyle.js'][30] = 0; + _$jscoverage['plugins/customstyle.js'][32] = 0; + _$jscoverage['plugins/customstyle.js'][33] = 0; + _$jscoverage['plugins/customstyle.js'][34] = 0; + _$jscoverage['plugins/customstyle.js'][35] = 0; + _$jscoverage['plugins/customstyle.js'][36] = 0; + _$jscoverage['plugins/customstyle.js'][38] = 0; + _$jscoverage['plugins/customstyle.js'][43] = 0; + _$jscoverage['plugins/customstyle.js'][45] = 0; + _$jscoverage['plugins/customstyle.js'][46] = 0; + _$jscoverage['plugins/customstyle.js'][48] = 0; + _$jscoverage['plugins/customstyle.js'][49] = 0; + _$jscoverage['plugins/customstyle.js'][50] = 0; + _$jscoverage['plugins/customstyle.js'][51] = 0; + _$jscoverage['plugins/customstyle.js'][55] = 0; + _$jscoverage['plugins/customstyle.js'][56] = 0; + _$jscoverage['plugins/customstyle.js'][57] = 0; + _$jscoverage['plugins/customstyle.js'][58] = 0; + _$jscoverage['plugins/customstyle.js'][60] = 0; + _$jscoverage['plugins/customstyle.js'][63] = 0; + _$jscoverage['plugins/customstyle.js'][64] = 0; + _$jscoverage['plugins/customstyle.js'][66] = 0; + _$jscoverage['plugins/customstyle.js'][68] = 0; + _$jscoverage['plugins/customstyle.js'][73] = 0; + _$jscoverage['plugins/customstyle.js'][75] = 0; + _$jscoverage['plugins/customstyle.js'][76] = 0; + _$jscoverage['plugins/customstyle.js'][77] = 0; + _$jscoverage['plugins/customstyle.js'][78] = 0; + _$jscoverage['plugins/customstyle.js'][79] = 0; + _$jscoverage['plugins/customstyle.js'][80] = 0; + _$jscoverage['plugins/customstyle.js'][81] = 0; + _$jscoverage['plugins/customstyle.js'][83] = 0; + _$jscoverage['plugins/customstyle.js'][84] = 0; + _$jscoverage['plugins/customstyle.js'][85] = 0; + _$jscoverage['plugins/customstyle.js'][86] = 0; + _$jscoverage['plugins/customstyle.js'][90] = 0; + _$jscoverage['plugins/customstyle.js'][91] = 0; + _$jscoverage['plugins/customstyle.js'][92] = 0; + _$jscoverage['plugins/customstyle.js'][93] = 0; + _$jscoverage['plugins/customstyle.js'][94] = 0; + _$jscoverage['plugins/customstyle.js'][96] = 0; + _$jscoverage['plugins/customstyle.js'][99] = 0; + _$jscoverage['plugins/customstyle.js'][100] = 0; + _$jscoverage['plugins/customstyle.js'][106] = 0; + _$jscoverage['plugins/customstyle.js'][108] = 0; + _$jscoverage['plugins/customstyle.js'][110] = 0; + _$jscoverage['plugins/customstyle.js'][114] = 0; + _$jscoverage['plugins/customstyle.js'][115] = 0; + _$jscoverage['plugins/customstyle.js'][117] = 0; + _$jscoverage['plugins/customstyle.js'][118] = 0; + _$jscoverage['plugins/customstyle.js'][119] = 0; + _$jscoverage['plugins/customstyle.js'][120] = 0; + _$jscoverage['plugins/customstyle.js'][121] = 0; + _$jscoverage['plugins/customstyle.js'][123] = 0; + _$jscoverage['plugins/customstyle.js'][124] = 0; + _$jscoverage['plugins/customstyle.js'][125] = 0; + _$jscoverage['plugins/customstyle.js'][126] = 0; + _$jscoverage['plugins/customstyle.js'][127] = 0; + _$jscoverage['plugins/customstyle.js'][128] = 0; +} +_$jscoverage['plugins/customstyle.js'].source = ["/**"," * 自定义样式命令支持"," * @file"," */","","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();","",""," }"," }"," }"," });","};"]; +_$jscoverage['plugins/customstyle.js'][6]++; +UE.plugins.customstyle = (function () { + _$jscoverage['plugins/customstyle.js'][7]++; + var me = this; + _$jscoverage['plugins/customstyle.js'][8]++; + 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;"}]}); + _$jscoverage['plugins/customstyle.js'][14]++; + me.commands.customstyle = {execCommand: (function (cmdName, obj) { + _$jscoverage['plugins/customstyle.js'][16]++; + var me = this, tagName = obj.tag, node = domUtils.findParent(me.selection.getStart(), (function (node) { + _$jscoverage['plugins/customstyle.js'][19]++; + return node.getAttribute("label"); +}), true), range, bk, tmpObj = {}; + _$jscoverage['plugins/customstyle.js'][22]++; + for (var p in obj) { + _$jscoverage['plugins/customstyle.js'][23]++; + if ((obj[p] !== undefined)) { + _$jscoverage['plugins/customstyle.js'][24]++; + tmpObj[p] = obj[p]; + } +} + _$jscoverage['plugins/customstyle.js'][26]++; + (delete tmpObj.tag); + _$jscoverage['plugins/customstyle.js'][27]++; + if ((node && (node.getAttribute("label") == obj.label))) { + _$jscoverage['plugins/customstyle.js'][28]++; + range = this.selection.getRange(); + _$jscoverage['plugins/customstyle.js'][29]++; + bk = range.createBookmark(); + _$jscoverage['plugins/customstyle.js'][30]++; + if (range.collapsed) { + _$jscoverage['plugins/customstyle.js'][32]++; + if (dtd.$block[node.tagName]) { + _$jscoverage['plugins/customstyle.js'][33]++; + var fillNode = me.document.createElement("p"); + _$jscoverage['plugins/customstyle.js'][34]++; + domUtils.moveChild(node, fillNode); + _$jscoverage['plugins/customstyle.js'][35]++; + node.parentNode.insertBefore(fillNode, node); + _$jscoverage['plugins/customstyle.js'][36]++; + domUtils.remove(node); + } + else { + _$jscoverage['plugins/customstyle.js'][38]++; + domUtils.remove(node, true); + } + } + else { + _$jscoverage['plugins/customstyle.js'][43]++; + var common = domUtils.getCommonAncestor(bk.start, bk.end), nodes = domUtils.getElementsByTagName(common, tagName); + _$jscoverage['plugins/customstyle.js'][45]++; + if (new RegExp(tagName, "i").test(common.tagName)) { + _$jscoverage['plugins/customstyle.js'][46]++; + nodes.push(common); + } + _$jscoverage['plugins/customstyle.js'][48]++; + for (var i = 0, ni; (ni = nodes[(i++)]);) { + _$jscoverage['plugins/customstyle.js'][49]++; + if ((ni.getAttribute("label") == obj.label)) { + _$jscoverage['plugins/customstyle.js'][50]++; + var ps = domUtils.getPosition(ni, bk.start), pe = domUtils.getPosition(ni, bk.end); + _$jscoverage['plugins/customstyle.js'][51]++; + if ((((ps & domUtils.POSITION_FOLLOWING) || (ps & domUtils.POSITION_CONTAINS)) && ((pe & domUtils.POSITION_PRECEDING) || (pe & domUtils.POSITION_CONTAINS)))) { + _$jscoverage['plugins/customstyle.js'][55]++; + if (dtd.$block[tagName]) { + _$jscoverage['plugins/customstyle.js'][56]++; + var fillNode = me.document.createElement("p"); + _$jscoverage['plugins/customstyle.js'][57]++; + domUtils.moveChild(ni, fillNode); + _$jscoverage['plugins/customstyle.js'][58]++; + ni.parentNode.insertBefore(fillNode, ni); + } + } + _$jscoverage['plugins/customstyle.js'][60]++; + domUtils.remove(ni, true); + } +} + _$jscoverage['plugins/customstyle.js'][63]++; + node = domUtils.findParent(common, (function (node) { + _$jscoverage['plugins/customstyle.js'][64]++; + return (node.getAttribute("label") == obj.label); +}), true); + _$jscoverage['plugins/customstyle.js'][66]++; + if (node) { + _$jscoverage['plugins/customstyle.js'][68]++; + domUtils.remove(node, true); + } + } + _$jscoverage['plugins/customstyle.js'][73]++; + range.moveToBookmark(bk).select(); + } + else { + _$jscoverage['plugins/customstyle.js'][75]++; + if (dtd.$block[tagName]) { + _$jscoverage['plugins/customstyle.js'][76]++; + this.execCommand("paragraph", tagName, tmpObj, "customstyle"); + _$jscoverage['plugins/customstyle.js'][77]++; + range = me.selection.getRange(); + _$jscoverage['plugins/customstyle.js'][78]++; + if ((! range.collapsed)) { + _$jscoverage['plugins/customstyle.js'][79]++; + range.collapse(); + _$jscoverage['plugins/customstyle.js'][80]++; + node = domUtils.findParent(me.selection.getStart(), (function (node) { + _$jscoverage['plugins/customstyle.js'][81]++; + return (node.getAttribute("label") == obj.label); +}), true); + _$jscoverage['plugins/customstyle.js'][83]++; + var pNode = me.document.createElement("p"); + _$jscoverage['plugins/customstyle.js'][84]++; + domUtils.insertAfter(node, pNode); + _$jscoverage['plugins/customstyle.js'][85]++; + domUtils.fillNode(me.document, pNode); + _$jscoverage['plugins/customstyle.js'][86]++; + range.setStart(pNode, 0).setCursor(); + } + } + else { + _$jscoverage['plugins/customstyle.js'][90]++; + range = me.selection.getRange(); + _$jscoverage['plugins/customstyle.js'][91]++; + if (range.collapsed) { + _$jscoverage['plugins/customstyle.js'][92]++; + node = me.document.createElement(tagName); + _$jscoverage['plugins/customstyle.js'][93]++; + domUtils.setAttributes(node, tmpObj); + _$jscoverage['plugins/customstyle.js'][94]++; + range.insertNode(node).setStart(node, 0).setCursor(); + _$jscoverage['plugins/customstyle.js'][96]++; + return; + } + _$jscoverage['plugins/customstyle.js'][99]++; + bk = range.createBookmark(); + _$jscoverage['plugins/customstyle.js'][100]++; + range.applyInlineStyle(tagName, tmpObj).moveToBookmark(bk).select(); + } + } +}), queryCommandValue: (function () { + _$jscoverage['plugins/customstyle.js'][106]++; + var parent = domUtils.filterNodeList(this.selection.getStartElementPath(), (function (node) { + _$jscoverage['plugins/customstyle.js'][108]++; + return node.getAttribute("label"); +})); + _$jscoverage['plugins/customstyle.js'][110]++; + return (parent? parent.getAttribute("label"): ""); +})}; + _$jscoverage['plugins/customstyle.js'][114]++; + me.addListener("keyup", (function (type, evt) { + _$jscoverage['plugins/customstyle.js'][115]++; + var keyCode = (evt.keyCode || evt.which); + _$jscoverage['plugins/customstyle.js'][117]++; + if (((keyCode == 32) || (keyCode == 13))) { + _$jscoverage['plugins/customstyle.js'][118]++; + var range = me.selection.getRange(); + _$jscoverage['plugins/customstyle.js'][119]++; + if (range.collapsed) { + _$jscoverage['plugins/customstyle.js'][120]++; + var node = domUtils.findParent(me.selection.getStart(), (function (node) { + _$jscoverage['plugins/customstyle.js'][121]++; + return node.getAttribute("label"); +}), true); + _$jscoverage['plugins/customstyle.js'][123]++; + if ((node && dtd.$block[node.tagName] && domUtils.isEmptyNode(node))) { + _$jscoverage['plugins/customstyle.js'][124]++; + var p = me.document.createElement("p"); + _$jscoverage['plugins/customstyle.js'][125]++; + domUtils.insertAfter(node, p); + _$jscoverage['plugins/customstyle.js'][126]++; + domUtils.fillNode(me.document, p); + _$jscoverage['plugins/customstyle.js'][127]++; + domUtils.remove(node); + _$jscoverage['plugins/customstyle.js'][128]++; + range.setStart(p, 0).setCursor(); + } + } + } +})); +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/defaultfilter.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/defaultfilter.js new file mode 100644 index 000000000..7cb7f3dad --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/defaultfilter.js @@ -0,0 +1,388 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/defaultfilter.js']) { + _$jscoverage['plugins/defaultfilter.js'] = []; + _$jscoverage['plugins/defaultfilter.js'][4] = 0; + _$jscoverage['plugins/defaultfilter.js'][5] = 0; + _$jscoverage['plugins/defaultfilter.js'][6] = 0; + _$jscoverage['plugins/defaultfilter.js'][9] = 0; + _$jscoverage['plugins/defaultfilter.js'][10] = 0; + _$jscoverage['plugins/defaultfilter.js'][11] = 0; + _$jscoverage['plugins/defaultfilter.js'][13] = 0; + _$jscoverage['plugins/defaultfilter.js'][14] = 0; + _$jscoverage['plugins/defaultfilter.js'][15] = 0; + _$jscoverage['plugins/defaultfilter.js'][16] = 0; + _$jscoverage['plugins/defaultfilter.js'][17] = 0; + _$jscoverage['plugins/defaultfilter.js'][18] = 0; + _$jscoverage['plugins/defaultfilter.js'][20] = 0; + _$jscoverage['plugins/defaultfilter.js'][22] = 0; + _$jscoverage['plugins/defaultfilter.js'][25] = 0; + _$jscoverage['plugins/defaultfilter.js'][29] = 0; + _$jscoverage['plugins/defaultfilter.js'][30] = 0; + _$jscoverage['plugins/defaultfilter.js'][31] = 0; + _$jscoverage['plugins/defaultfilter.js'][33] = 0; + _$jscoverage['plugins/defaultfilter.js'][34] = 0; + _$jscoverage['plugins/defaultfilter.js'][36] = 0; + _$jscoverage['plugins/defaultfilter.js'][39] = 0; + _$jscoverage['plugins/defaultfilter.js'][40] = 0; + _$jscoverage['plugins/defaultfilter.js'][41] = 0; + _$jscoverage['plugins/defaultfilter.js'][42] = 0; + _$jscoverage['plugins/defaultfilter.js'][45] = 0; + _$jscoverage['plugins/defaultfilter.js'][46] = 0; + _$jscoverage['plugins/defaultfilter.js'][48] = 0; + _$jscoverage['plugins/defaultfilter.js'][49] = 0; + _$jscoverage['plugins/defaultfilter.js'][50] = 0; + _$jscoverage['plugins/defaultfilter.js'][51] = 0; + _$jscoverage['plugins/defaultfilter.js'][52] = 0; + _$jscoverage['plugins/defaultfilter.js'][56] = 0; + _$jscoverage['plugins/defaultfilter.js'][58] = 0; + _$jscoverage['plugins/defaultfilter.js'][59] = 0; + _$jscoverage['plugins/defaultfilter.js'][60] = 0; + _$jscoverage['plugins/defaultfilter.js'][69] = 0; + _$jscoverage['plugins/defaultfilter.js'][70] = 0; + _$jscoverage['plugins/defaultfilter.js'][72] = 0; + _$jscoverage['plugins/defaultfilter.js'][74] = 0; + _$jscoverage['plugins/defaultfilter.js'][75] = 0; + _$jscoverage['plugins/defaultfilter.js'][78] = 0; + _$jscoverage['plugins/defaultfilter.js'][79] = 0; + _$jscoverage['plugins/defaultfilter.js'][80] = 0; + _$jscoverage['plugins/defaultfilter.js'][82] = 0; + _$jscoverage['plugins/defaultfilter.js'][83] = 0; + _$jscoverage['plugins/defaultfilter.js'][85] = 0; + _$jscoverage['plugins/defaultfilter.js'][86] = 0; + _$jscoverage['plugins/defaultfilter.js'][87] = 0; + _$jscoverage['plugins/defaultfilter.js'][88] = 0; + _$jscoverage['plugins/defaultfilter.js'][90] = 0; + _$jscoverage['plugins/defaultfilter.js'][91] = 0; + _$jscoverage['plugins/defaultfilter.js'][92] = 0; + _$jscoverage['plugins/defaultfilter.js'][94] = 0; + _$jscoverage['plugins/defaultfilter.js'][98] = 0; + _$jscoverage['plugins/defaultfilter.js'][99] = 0; + _$jscoverage['plugins/defaultfilter.js'][101] = 0; + _$jscoverage['plugins/defaultfilter.js'][102] = 0; + _$jscoverage['plugins/defaultfilter.js'][104] = 0; + _$jscoverage['plugins/defaultfilter.js'][105] = 0; + _$jscoverage['plugins/defaultfilter.js'][108] = 0; + _$jscoverage['plugins/defaultfilter.js'][109] = 0; + _$jscoverage['plugins/defaultfilter.js'][111] = 0; + _$jscoverage['plugins/defaultfilter.js'][112] = 0; + _$jscoverage['plugins/defaultfilter.js'][113] = 0; + _$jscoverage['plugins/defaultfilter.js'][115] = 0; + _$jscoverage['plugins/defaultfilter.js'][116] = 0; + _$jscoverage['plugins/defaultfilter.js'][117] = 0; + _$jscoverage['plugins/defaultfilter.js'][119] = 0; + _$jscoverage['plugins/defaultfilter.js'][123] = 0; + _$jscoverage['plugins/defaultfilter.js'][125] = 0; + _$jscoverage['plugins/defaultfilter.js'][130] = 0; + _$jscoverage['plugins/defaultfilter.js'][131] = 0; + _$jscoverage['plugins/defaultfilter.js'][138] = 0; + _$jscoverage['plugins/defaultfilter.js'][140] = 0; + _$jscoverage['plugins/defaultfilter.js'][141] = 0; + _$jscoverage['plugins/defaultfilter.js'][142] = 0; + _$jscoverage['plugins/defaultfilter.js'][144] = 0; + _$jscoverage['plugins/defaultfilter.js'][146] = 0; + _$jscoverage['plugins/defaultfilter.js'][147] = 0; + _$jscoverage['plugins/defaultfilter.js'][148] = 0; + _$jscoverage['plugins/defaultfilter.js'][150] = 0; + _$jscoverage['plugins/defaultfilter.js'][152] = 0; + _$jscoverage['plugins/defaultfilter.js'][154] = 0; + _$jscoverage['plugins/defaultfilter.js'][155] = 0; + _$jscoverage['plugins/defaultfilter.js'][156] = 0; + _$jscoverage['plugins/defaultfilter.js'][157] = 0; + _$jscoverage['plugins/defaultfilter.js'][159] = 0; + _$jscoverage['plugins/defaultfilter.js'][161] = 0; + _$jscoverage['plugins/defaultfilter.js'][162] = 0; + _$jscoverage['plugins/defaultfilter.js'][167] = 0; + _$jscoverage['plugins/defaultfilter.js'][169] = 0; + _$jscoverage['plugins/defaultfilter.js'][170] = 0; +} +_$jscoverage['plugins/defaultfilter.js'].source = ["///import core","///plugin 编辑器默认的过滤转换机制","","UE.plugins['defaultfilter'] = function () {"," var me = this;"," me.setOpt('allowDivTransToP',true);"," //默认的过滤处理"," //进入编辑器的内容处理"," me.addInputRule(function (root) {"," var allowDivTransToP = this.options.allowDivTransToP;"," var val;"," //进行默认的处理"," 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: encodeURIComponent(node.innerText() || '')"," });"," node.tagName = 'div';"," node.removeChild(node.firstChild());"," 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)"," }"," }"," }"," 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)","//","// }"," if (!node.firstChild()) {"," node.innerHTML(browser.ie ? '&nbsp;' : '<br/>')"," }"," 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.ie ? UE.uNode.createText(' ') : UE.uNode.createElement('br'))"," }"," }",""," }"," 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: ''});"," }"," break;"," case 'a':"," if (val = node.getAttr('_href')) {"," node.setAttr({"," 'href': val,"," '_href': ''"," })"," }"," break;"," case 'img':"," if (val = node.getAttr('_src')) {"," node.setAttr({"," 'src': node.getAttr('_src'),"," '_src': ''"," })"," }","",""," }"," }",""," })","",""," });","};"]; +_$jscoverage['plugins/defaultfilter.js'][4]++; +UE.plugins.defaultfilter = (function () { + _$jscoverage['plugins/defaultfilter.js'][5]++; + var me = this; + _$jscoverage['plugins/defaultfilter.js'][6]++; + me.setOpt("allowDivTransToP", true); + _$jscoverage['plugins/defaultfilter.js'][9]++; + me.addInputRule((function (root) { + _$jscoverage['plugins/defaultfilter.js'][10]++; + var allowDivTransToP = this.options.allowDivTransToP; + _$jscoverage['plugins/defaultfilter.js'][11]++; + var val; + _$jscoverage['plugins/defaultfilter.js'][13]++; + root.traversal((function (node) { + _$jscoverage['plugins/defaultfilter.js'][14]++; + if ((node.type == "element")) { + _$jscoverage['plugins/defaultfilter.js'][15]++; + if (((! dtd.$cdata[node.tagName]) && me.options.autoClearEmptyNode && dtd.$inline[node.tagName] && (! dtd.$empty[node.tagName]) && ((! node.attrs) || utils.isEmptyObject(node.attrs)))) { + _$jscoverage['plugins/defaultfilter.js'][16]++; + if ((! node.firstChild())) { + _$jscoverage['plugins/defaultfilter.js'][16]++; + node.parentNode.removeChild(node); + } + else { + _$jscoverage['plugins/defaultfilter.js'][17]++; + if (((node.tagName == "span") && ((! node.attrs) || utils.isEmptyObject(node.attrs)))) { + _$jscoverage['plugins/defaultfilter.js'][18]++; + node.parentNode.removeChild(node, true); + } + } + _$jscoverage['plugins/defaultfilter.js'][20]++; + return; + } + _$jscoverage['plugins/defaultfilter.js'][22]++; + switch (node.tagName) { + case "style": + case "script": + _$jscoverage['plugins/defaultfilter.js'][25]++; + node.setAttr({cdata_tag: node.tagName, cdata_data: encodeURIComponent((node.innerText() || ""))}); + _$jscoverage['plugins/defaultfilter.js'][29]++; + node.tagName = "div"; + _$jscoverage['plugins/defaultfilter.js'][30]++; + node.removeChild(node.firstChild()); + _$jscoverage['plugins/defaultfilter.js'][31]++; + break; + case "a": + _$jscoverage['plugins/defaultfilter.js'][33]++; + if ((val = node.getAttr("href"))) { + _$jscoverage['plugins/defaultfilter.js'][34]++; + node.setAttr("_href", val); + } + _$jscoverage['plugins/defaultfilter.js'][36]++; + break; + case "img": + _$jscoverage['plugins/defaultfilter.js'][39]++; + if ((val = node.getAttr("src"))) { + _$jscoverage['plugins/defaultfilter.js'][40]++; + if (/^data:/.test(val)) { + _$jscoverage['plugins/defaultfilter.js'][41]++; + node.parentNode.removeChild(node); + _$jscoverage['plugins/defaultfilter.js'][42]++; + break; + } + } + _$jscoverage['plugins/defaultfilter.js'][45]++; + node.setAttr("_src", node.getAttr("src")); + _$jscoverage['plugins/defaultfilter.js'][46]++; + break; + case "span": + _$jscoverage['plugins/defaultfilter.js'][48]++; + if ((browser.webkit && (val = node.getStyle("white-space")))) { + _$jscoverage['plugins/defaultfilter.js'][49]++; + if (/nowrap|normal/.test(val)) { + _$jscoverage['plugins/defaultfilter.js'][50]++; + node.setStyle("white-space", ""); + _$jscoverage['plugins/defaultfilter.js'][51]++; + if ((me.options.autoClearEmptyNode && utils.isEmptyObject(node.attrs))) { + _$jscoverage['plugins/defaultfilter.js'][52]++; + node.parentNode.removeChild(node, true); + } + } + } + _$jscoverage['plugins/defaultfilter.js'][56]++; + break; + case "p": + _$jscoverage['plugins/defaultfilter.js'][58]++; + if ((val = node.getAttr("align"))) { + _$jscoverage['plugins/defaultfilter.js'][59]++; + node.setAttr("align"); + _$jscoverage['plugins/defaultfilter.js'][60]++; + node.setStyle("text-align", val); + } + _$jscoverage['plugins/defaultfilter.js'][69]++; + if ((! node.firstChild())) { + _$jscoverage['plugins/defaultfilter.js'][70]++; + node.innerHTML((browser.ie? " ": "
    ")); + } + _$jscoverage['plugins/defaultfilter.js'][72]++; + break; + case "div": + _$jscoverage['plugins/defaultfilter.js'][74]++; + if (node.getAttr("cdata_tag")) { + _$jscoverage['plugins/defaultfilter.js'][75]++; + break; + } + _$jscoverage['plugins/defaultfilter.js'][78]++; + val = node.getAttr("class"); + _$jscoverage['plugins/defaultfilter.js'][79]++; + if ((val && /^line number\d+/.test(val))) { + _$jscoverage['plugins/defaultfilter.js'][80]++; + break; + } + _$jscoverage['plugins/defaultfilter.js'][82]++; + if ((! allowDivTransToP)) { + _$jscoverage['plugins/defaultfilter.js'][83]++; + break; + } + _$jscoverage['plugins/defaultfilter.js'][85]++; + var tmpNode, p = UE.uNode.createElement("p"); + _$jscoverage['plugins/defaultfilter.js'][86]++; + while ((tmpNode = node.firstChild())) { + _$jscoverage['plugins/defaultfilter.js'][87]++; + if (((tmpNode.type == "text") || (! UE.dom.dtd.$block[tmpNode.tagName]))) { + _$jscoverage['plugins/defaultfilter.js'][88]++; + p.appendChild(tmpNode); + } + else { + _$jscoverage['plugins/defaultfilter.js'][90]++; + if (p.firstChild()) { + _$jscoverage['plugins/defaultfilter.js'][91]++; + node.parentNode.insertBefore(p, node); + _$jscoverage['plugins/defaultfilter.js'][92]++; + p = UE.uNode.createElement("p"); + } + else { + _$jscoverage['plugins/defaultfilter.js'][94]++; + node.parentNode.insertBefore(tmpNode, node); + } + } +} + _$jscoverage['plugins/defaultfilter.js'][98]++; + if (p.firstChild()) { + _$jscoverage['plugins/defaultfilter.js'][99]++; + node.parentNode.insertBefore(p, node); + } + _$jscoverage['plugins/defaultfilter.js'][101]++; + node.parentNode.removeChild(node); + _$jscoverage['plugins/defaultfilter.js'][102]++; + break; + case "dl": + _$jscoverage['plugins/defaultfilter.js'][104]++; + node.tagName = "ul"; + _$jscoverage['plugins/defaultfilter.js'][105]++; + break; + case "dt": + case "dd": + _$jscoverage['plugins/defaultfilter.js'][108]++; + node.tagName = "li"; + _$jscoverage['plugins/defaultfilter.js'][109]++; + break; + case "li": + _$jscoverage['plugins/defaultfilter.js'][111]++; + var className = node.getAttr("class"); + _$jscoverage['plugins/defaultfilter.js'][112]++; + if (((! className) || (! /list\-/.test(className)))) { + _$jscoverage['plugins/defaultfilter.js'][113]++; + node.setAttr(); + } + _$jscoverage['plugins/defaultfilter.js'][115]++; + var tmpNodes = node.getNodesByTagName("ol ul"); + _$jscoverage['plugins/defaultfilter.js'][116]++; + UE.utils.each(tmpNodes, (function (n) { + _$jscoverage['plugins/defaultfilter.js'][117]++; + node.parentNode.insertAfter(n, node); +})); + _$jscoverage['plugins/defaultfilter.js'][119]++; + break; + case "td": + case "th": + case "caption": + _$jscoverage['plugins/defaultfilter.js'][123]++; + if (((! node.children) || (! node.children.length))) { + _$jscoverage['plugins/defaultfilter.js'][125]++; + node.appendChild((browser.ie? UE.uNode.createText(" "): UE.uNode.createElement("br"))); + } + } + } + _$jscoverage['plugins/defaultfilter.js'][130]++; + if ((node.type == "comment")) { + _$jscoverage['plugins/defaultfilter.js'][131]++; + node.parentNode.removeChild(node); + } +})); +})); + _$jscoverage['plugins/defaultfilter.js'][138]++; + me.addOutputRule((function (root) { + _$jscoverage['plugins/defaultfilter.js'][140]++; + var val; + _$jscoverage['plugins/defaultfilter.js'][141]++; + root.traversal((function (node) { + _$jscoverage['plugins/defaultfilter.js'][142]++; + if ((node.type == "element")) { + _$jscoverage['plugins/defaultfilter.js'][144]++; + if ((me.options.autoClearEmptyNode && dtd.$inline[node.tagName] && (! dtd.$empty[node.tagName]) && ((! node.attrs) || utils.isEmptyObject(node.attrs)))) { + _$jscoverage['plugins/defaultfilter.js'][146]++; + if ((! node.firstChild())) { + _$jscoverage['plugins/defaultfilter.js'][146]++; + node.parentNode.removeChild(node); + } + else { + _$jscoverage['plugins/defaultfilter.js'][147]++; + if (((node.tagName == "span") && ((! node.attrs) || utils.isEmptyObject(node.attrs)))) { + _$jscoverage['plugins/defaultfilter.js'][148]++; + node.parentNode.removeChild(node, true); + } + } + _$jscoverage['plugins/defaultfilter.js'][150]++; + return; + } + _$jscoverage['plugins/defaultfilter.js'][152]++; + switch (node.tagName) { + case "div": + _$jscoverage['plugins/defaultfilter.js'][154]++; + if ((val = node.getAttr("cdata_tag"))) { + _$jscoverage['plugins/defaultfilter.js'][155]++; + node.tagName = val; + _$jscoverage['plugins/defaultfilter.js'][156]++; + node.appendChild(UE.uNode.createText(node.getAttr("cdata_data"))); + _$jscoverage['plugins/defaultfilter.js'][157]++; + node.setAttr({cdata_tag: "", cdata_data: ""}); + } + _$jscoverage['plugins/defaultfilter.js'][159]++; + break; + case "a": + _$jscoverage['plugins/defaultfilter.js'][161]++; + if ((val = node.getAttr("_href"))) { + _$jscoverage['plugins/defaultfilter.js'][162]++; + node.setAttr({"href": val, "_href": ""}); + } + _$jscoverage['plugins/defaultfilter.js'][167]++; + break; + case "img": + _$jscoverage['plugins/defaultfilter.js'][169]++; + if ((val = node.getAttr("_src"))) { + _$jscoverage['plugins/defaultfilter.js'][170]++; + node.setAttr({"src": node.getAttr("_src"), "_src": ""}); + } + } + } +})); +})); +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/directionality.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/directionality.js new file mode 100644 index 000000000..8accd52cb --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/directionality.js @@ -0,0 +1,199 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/directionality.js']) { + _$jscoverage['plugins/directionality.js'] = []; + _$jscoverage['plugins/directionality.js'][7] = 0; + _$jscoverage['plugins/directionality.js'][8] = 0; + _$jscoverage['plugins/directionality.js'][21] = 0; + _$jscoverage['plugins/directionality.js'][26] = 0; + _$jscoverage['plugins/directionality.js'][28] = 0; + _$jscoverage['plugins/directionality.js'][33] = 0; + _$jscoverage['plugins/directionality.js'][34] = 0; + _$jscoverage['plugins/directionality.js'][35] = 0; + _$jscoverage['plugins/directionality.js'][37] = 0; + _$jscoverage['plugins/directionality.js'][38] = 0; + _$jscoverage['plugins/directionality.js'][39] = 0; + _$jscoverage['plugins/directionality.js'][43] = 0; + _$jscoverage['plugins/directionality.js'][44] = 0; + _$jscoverage['plugins/directionality.js'][45] = 0; + _$jscoverage['plugins/directionality.js'][46] = 0; + _$jscoverage['plugins/directionality.js'][47] = 0; + _$jscoverage['plugins/directionality.js'][48] = 0; + _$jscoverage['plugins/directionality.js'][49] = 0; + _$jscoverage['plugins/directionality.js'][52] = 0; + _$jscoverage['plugins/directionality.js'][53] = 0; + _$jscoverage['plugins/directionality.js'][54] = 0; + _$jscoverage['plugins/directionality.js'][56] = 0; + _$jscoverage['plugins/directionality.js'][57] = 0; + _$jscoverage['plugins/directionality.js'][60] = 0; + _$jscoverage['plugins/directionality.js'][61] = 0; + _$jscoverage['plugins/directionality.js'][62] = 0; + _$jscoverage['plugins/directionality.js'][63] = 0; + _$jscoverage['plugins/directionality.js'][64] = 0; + _$jscoverage['plugins/directionality.js'][65] = 0; + _$jscoverage['plugins/directionality.js'][68] = 0; + _$jscoverage['plugins/directionality.js'][70] = 0; + _$jscoverage['plugins/directionality.js'][73] = 0; + _$jscoverage['plugins/directionality.js'][99] = 0; + _$jscoverage['plugins/directionality.js'][101] = 0; + _$jscoverage['plugins/directionality.js'][103] = 0; + _$jscoverage['plugins/directionality.js'][104] = 0; + _$jscoverage['plugins/directionality.js'][105] = 0; + _$jscoverage['plugins/directionality.js'][107] = 0; + _$jscoverage['plugins/directionality.js'][108] = 0; + _$jscoverage['plugins/directionality.js'][109] = 0; + _$jscoverage['plugins/directionality.js'][110] = 0; + _$jscoverage['plugins/directionality.js'][113] = 0; + _$jscoverage['plugins/directionality.js'][114] = 0; + _$jscoverage['plugins/directionality.js'][117] = 0; + _$jscoverage['plugins/directionality.js'][118] = 0; +} +_$jscoverage['plugins/directionality.js'].source = ["/**"," * 设置文字输入的方向的插件"," * @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.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';"," }"," };","})();",""]; +_$jscoverage['plugins/directionality.js'][7]++; +(function () { + _$jscoverage['plugins/directionality.js'][8]++; + var block = domUtils.isBlockElm, getObj = (function (editor) { + _$jscoverage['plugins/directionality.js'][21]++; + return domUtils.filterNodeList(editor.selection.getStartElementPath(), (function (n) { + _$jscoverage['plugins/directionality.js'][21]++; + return n.getAttribute("dir"); +})); +}), doDirectionality = (function (range, editor, forward) { + _$jscoverage['plugins/directionality.js'][26]++; + var bookmark, filterFn = (function (node) { + _$jscoverage['plugins/directionality.js'][28]++; + return ((node.nodeType == 1)? (! domUtils.isBookmarkNode(node)): (! domUtils.isWhitespace(node))); +}), obj = getObj(editor); + _$jscoverage['plugins/directionality.js'][33]++; + if ((obj && range.collapsed)) { + _$jscoverage['plugins/directionality.js'][34]++; + obj.setAttribute("dir", forward); + _$jscoverage['plugins/directionality.js'][35]++; + return range; + } + _$jscoverage['plugins/directionality.js'][37]++; + bookmark = range.createBookmark(); + _$jscoverage['plugins/directionality.js'][38]++; + range.enlarge(true); + _$jscoverage['plugins/directionality.js'][39]++; + var bookmark2 = range.createBookmark(), current = domUtils.getNextDomNode(bookmark2.start, false, filterFn), tmpRange = range.cloneRange(), tmpNode; + _$jscoverage['plugins/directionality.js'][43]++; + while ((current && (! (domUtils.getPosition(current, bookmark2.end) & domUtils.POSITION_FOLLOWING)))) { + _$jscoverage['plugins/directionality.js'][44]++; + if (((current.nodeType == 3) || (! block(current)))) { + _$jscoverage['plugins/directionality.js'][45]++; + tmpRange.setStartBefore(current); + _$jscoverage['plugins/directionality.js'][46]++; + while ((current && (current !== bookmark2.end) && (! block(current)))) { + _$jscoverage['plugins/directionality.js'][47]++; + tmpNode = current; + _$jscoverage['plugins/directionality.js'][48]++; + current = domUtils.getNextDomNode(current, false, null, (function (node) { + _$jscoverage['plugins/directionality.js'][49]++; + return (! block(node)); +})); +} + _$jscoverage['plugins/directionality.js'][52]++; + tmpRange.setEndAfter(tmpNode); + _$jscoverage['plugins/directionality.js'][53]++; + var common = tmpRange.getCommonAncestor(); + _$jscoverage['plugins/directionality.js'][54]++; + if (((! domUtils.isBody(common)) && block(common))) { + _$jscoverage['plugins/directionality.js'][56]++; + common.setAttribute("dir", forward); + _$jscoverage['plugins/directionality.js'][57]++; + current = common; + } + else { + _$jscoverage['plugins/directionality.js'][60]++; + var p = range.document.createElement("p"); + _$jscoverage['plugins/directionality.js'][61]++; + p.setAttribute("dir", forward); + _$jscoverage['plugins/directionality.js'][62]++; + var frag = tmpRange.extractContents(); + _$jscoverage['plugins/directionality.js'][63]++; + p.appendChild(frag); + _$jscoverage['plugins/directionality.js'][64]++; + tmpRange.insertNode(p); + _$jscoverage['plugins/directionality.js'][65]++; + current = p; + } + _$jscoverage['plugins/directionality.js'][68]++; + current = domUtils.getNextDomNode(current, false, filterFn); + } + else { + _$jscoverage['plugins/directionality.js'][70]++; + current = domUtils.getNextDomNode(current, true, filterFn); + } +} + _$jscoverage['plugins/directionality.js'][73]++; + return range.moveToBookmark(bookmark2).moveToBookmark(bookmark); +}); + _$jscoverage['plugins/directionality.js'][99]++; + UE.commands.directionality = {execCommand: (function (cmdName, forward) { + _$jscoverage['plugins/directionality.js'][101]++; + var range = this.selection.getRange(); + _$jscoverage['plugins/directionality.js'][103]++; + if (range.collapsed) { + _$jscoverage['plugins/directionality.js'][104]++; + var txt = this.document.createTextNode("d"); + _$jscoverage['plugins/directionality.js'][105]++; + range.insertNode(txt); + } + _$jscoverage['plugins/directionality.js'][107]++; + doDirectionality(range, this, forward); + _$jscoverage['plugins/directionality.js'][108]++; + if (txt) { + _$jscoverage['plugins/directionality.js'][109]++; + range.setStartBefore(txt).collapse(true); + _$jscoverage['plugins/directionality.js'][110]++; + domUtils.remove(txt); + } + _$jscoverage['plugins/directionality.js'][113]++; + range.select(); + _$jscoverage['plugins/directionality.js'][114]++; + return true; +}), queryCommandValue: (function () { + _$jscoverage['plugins/directionality.js'][117]++; + var node = getObj(this); + _$jscoverage['plugins/directionality.js'][118]++; + return (node? node.getAttribute("dir"): "ltr"); +})}; +})(); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/dragdrop.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/dragdrop.js new file mode 100644 index 000000000..12afaabad --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/dragdrop.js @@ -0,0 +1,158 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/dragdrop.js']) { + _$jscoverage['plugins/dragdrop.js'] = []; + _$jscoverage['plugins/dragdrop.js'][1] = 0; + _$jscoverage['plugins/dragdrop.js'][3] = 0; + _$jscoverage['plugins/dragdrop.js'][4] = 0; + _$jscoverage['plugins/dragdrop.js'][5] = 0; + _$jscoverage['plugins/dragdrop.js'][6] = 0; + _$jscoverage['plugins/dragdrop.js'][7] = 0; + _$jscoverage['plugins/dragdrop.js'][9] = 0; + _$jscoverage['plugins/dragdrop.js'][11] = 0; + _$jscoverage['plugins/dragdrop.js'][12] = 0; + _$jscoverage['plugins/dragdrop.js'][13] = 0; + _$jscoverage['plugins/dragdrop.js'][14] = 0; + _$jscoverage['plugins/dragdrop.js'][16] = 0; + _$jscoverage['plugins/dragdrop.js'][21] = 0; + _$jscoverage['plugins/dragdrop.js'][22] = 0; + _$jscoverage['plugins/dragdrop.js'][23] = 0; + _$jscoverage['plugins/dragdrop.js'][24] = 0; + _$jscoverage['plugins/dragdrop.js'][25] = 0; + _$jscoverage['plugins/dragdrop.js'][26] = 0; + _$jscoverage['plugins/dragdrop.js'][27] = 0; + _$jscoverage['plugins/dragdrop.js'][30] = 0; + _$jscoverage['plugins/dragdrop.js'][31] = 0; + _$jscoverage['plugins/dragdrop.js'][33] = 0; + _$jscoverage['plugins/dragdrop.js'][34] = 0; + _$jscoverage['plugins/dragdrop.js'][36] = 0; + _$jscoverage['plugins/dragdrop.js'][37] = 0; + _$jscoverage['plugins/dragdrop.js'][45] = 0; + _$jscoverage['plugins/dragdrop.js'][46] = 0; + _$jscoverage['plugins/dragdrop.js'][47] = 0; + _$jscoverage['plugins/dragdrop.js'][48] = 0; + _$jscoverage['plugins/dragdrop.js'][49] = 0; + _$jscoverage['plugins/dragdrop.js'][50] = 0; + _$jscoverage['plugins/dragdrop.js'][51] = 0; +} +_$jscoverage['plugins/dragdrop.js'].source = ["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')"," }"," }"," }"," })","};"]; +_$jscoverage['plugins/dragdrop.js'][1]++; +UE.plugins.dragdrop = (function () { + _$jscoverage['plugins/dragdrop.js'][3]++; + var me = this; + _$jscoverage['plugins/dragdrop.js'][4]++; + me.ready((function () { + _$jscoverage['plugins/dragdrop.js'][5]++; + domUtils.on(this.body, "dragend", (function () { + _$jscoverage['plugins/dragdrop.js'][6]++; + var rng = me.selection.getRange(); + _$jscoverage['plugins/dragdrop.js'][7]++; + var node = (rng.getClosedNode() || me.selection.getStart()); + _$jscoverage['plugins/dragdrop.js'][9]++; + if ((node && (node.tagName == "IMG"))) { + _$jscoverage['plugins/dragdrop.js'][11]++; + var pre = node.previousSibling, next; + _$jscoverage['plugins/dragdrop.js'][12]++; + while ((next = node.nextSibling)) { + _$jscoverage['plugins/dragdrop.js'][13]++; + if (((next.nodeType == 1) && (next.tagName == "SPAN") && (! next.firstChild))) { + _$jscoverage['plugins/dragdrop.js'][14]++; + domUtils.remove(next); + } + else { + _$jscoverage['plugins/dragdrop.js'][16]++; + break; + } +} + _$jscoverage['plugins/dragdrop.js'][21]++; + if ((((pre && (pre.nodeType == 1) && (! domUtils.isEmptyBlock(pre))) || (! pre)) && ((! next) || (next && (! domUtils.isEmptyBlock(next)))))) { + _$jscoverage['plugins/dragdrop.js'][22]++; + if ((pre && (pre.tagName == "P") && (! domUtils.isEmptyBlock(pre)))) { + _$jscoverage['plugins/dragdrop.js'][23]++; + pre.appendChild(node); + _$jscoverage['plugins/dragdrop.js'][24]++; + domUtils.moveChild(next, pre); + _$jscoverage['plugins/dragdrop.js'][25]++; + domUtils.remove(next); + } + else { + _$jscoverage['plugins/dragdrop.js'][26]++; + if ((next && (next.tagName == "P") && (! domUtils.isEmptyBlock(next)))) { + _$jscoverage['plugins/dragdrop.js'][27]++; + next.insertBefore(node, next.firstChild); + } + } + _$jscoverage['plugins/dragdrop.js'][30]++; + if ((pre && (pre.tagName == "P") && domUtils.isEmptyBlock(pre))) { + _$jscoverage['plugins/dragdrop.js'][31]++; + domUtils.remove(pre); + } + _$jscoverage['plugins/dragdrop.js'][33]++; + if ((next && (next.tagName == "P") && domUtils.isEmptyBlock(next))) { + _$jscoverage['plugins/dragdrop.js'][34]++; + domUtils.remove(next); + } + _$jscoverage['plugins/dragdrop.js'][36]++; + rng.selectNode(node).select(); + _$jscoverage['plugins/dragdrop.js'][37]++; + me.fireEvent("saveScene"); + } + } +})); +})); + _$jscoverage['plugins/dragdrop.js'][45]++; + me.addListener("keyup", (function (type, evt) { + _$jscoverage['plugins/dragdrop.js'][46]++; + var keyCode = (evt.keyCode || evt.which); + _$jscoverage['plugins/dragdrop.js'][47]++; + if ((keyCode == 13)) { + _$jscoverage['plugins/dragdrop.js'][48]++; + var rng = me.selection.getRange(), node; + _$jscoverage['plugins/dragdrop.js'][49]++; + if ((node = domUtils.findParentByTagName(rng.startContainer, "p", true))) { + _$jscoverage['plugins/dragdrop.js'][50]++; + if ((domUtils.getComputedStyle(node, "text-align") == "center")) { + _$jscoverage['plugins/dragdrop.js'][51]++; + domUtils.removeStyle(node, "text-align"); + } + } + } +})); +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/elementpath.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/elementpath.js new file mode 100644 index 000000000..4491ea35a --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/elementpath.js @@ -0,0 +1,120 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/elementpath.js']) { + _$jscoverage['plugins/elementpath.js'] = []; + _$jscoverage['plugins/elementpath.js'][6] = 0; + _$jscoverage['plugins/elementpath.js'][7] = 0; + _$jscoverage['plugins/elementpath.js'][10] = 0; + _$jscoverage['plugins/elementpath.js'][11] = 0; + _$jscoverage['plugins/elementpath.js'][12] = 0; + _$jscoverage['plugins/elementpath.js'][14] = 0; + _$jscoverage['plugins/elementpath.js'][16] = 0; + _$jscoverage['plugins/elementpath.js'][17] = 0; + _$jscoverage['plugins/elementpath.js'][19] = 0; + _$jscoverage['plugins/elementpath.js'][20] = 0; + _$jscoverage['plugins/elementpath.js'][24] = 0; + _$jscoverage['plugins/elementpath.js'][26] = 0; + _$jscoverage['plugins/elementpath.js'][27] = 0; + _$jscoverage['plugins/elementpath.js'][28] = 0; + _$jscoverage['plugins/elementpath.js'][29] = 0; + _$jscoverage['plugins/elementpath.js'][31] = 0; + _$jscoverage['plugins/elementpath.js'][32] = 0; + _$jscoverage['plugins/elementpath.js'][33] = 0; + _$jscoverage['plugins/elementpath.js'][35] = 0; + _$jscoverage['plugins/elementpath.js'][36] = 0; + _$jscoverage['plugins/elementpath.js'][37] = 0; + _$jscoverage['plugins/elementpath.js'][38] = 0; + _$jscoverage['plugins/elementpath.js'][41] = 0; +} +_$jscoverage['plugins/elementpath.js'].source = ["/**"," * 选取路径命令"," * @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 ) {"," debugger;"," 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;"," }"," };","};",""]; +_$jscoverage['plugins/elementpath.js'][6]++; +UE.plugins.elementpath = (function () { + _$jscoverage['plugins/elementpath.js'][7]++; + var currentLevel, tagNames, me = this; + _$jscoverage['plugins/elementpath.js'][10]++; + me.setOpt("elementPathEnabled", true); + _$jscoverage['plugins/elementpath.js'][11]++; + if ((! me.options.elementPathEnabled)) { + _$jscoverage['plugins/elementpath.js'][12]++; + return; + } + _$jscoverage['plugins/elementpath.js'][14]++; + me.commands.elementpath = {execCommand: (function (cmdName, level) { + _$jscoverage['plugins/elementpath.js'][16]++; + debugger; + _$jscoverage['plugins/elementpath.js'][17]++; + var start = tagNames[level], range = me.selection.getRange(); + _$jscoverage['plugins/elementpath.js'][19]++; + currentLevel = (level * 1); + _$jscoverage['plugins/elementpath.js'][20]++; + range.selectNode(start).select(); +}), queryCommandValue: (function () { + _$jscoverage['plugins/elementpath.js'][24]++; + var parents = [].concat(this.selection.getStartElementPath()).reverse(), names = []; + _$jscoverage['plugins/elementpath.js'][26]++; + tagNames = parents; + _$jscoverage['plugins/elementpath.js'][27]++; + for (var i = 0, ci; (ci = parents[i]); (i++)) { + _$jscoverage['plugins/elementpath.js'][28]++; + if ((ci.nodeType == 3)) { + _$jscoverage['plugins/elementpath.js'][29]++; + continue; + } + _$jscoverage['plugins/elementpath.js'][31]++; + var name = ci.tagName.toLowerCase(); + _$jscoverage['plugins/elementpath.js'][32]++; + if (((name == "img") && ci.getAttribute("anchorname"))) { + _$jscoverage['plugins/elementpath.js'][33]++; + name = "anchor"; + } + _$jscoverage['plugins/elementpath.js'][35]++; + names[i] = name; + _$jscoverage['plugins/elementpath.js'][36]++; + if ((currentLevel == i)) { + _$jscoverage['plugins/elementpath.js'][37]++; + currentLevel = -1; + _$jscoverage['plugins/elementpath.js'][38]++; + break; + } +} + _$jscoverage['plugins/elementpath.js'][41]++; + return names; +})}; +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/enterkey.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/enterkey.js new file mode 100644 index 000000000..b016991c7 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/enterkey.js @@ -0,0 +1,352 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/enterkey.js']) { + _$jscoverage['plugins/enterkey.js'] = []; + _$jscoverage['plugins/enterkey.js'][10] = 0; + _$jscoverage['plugins/enterkey.js'][11] = 0; + _$jscoverage['plugins/enterkey.js'][14] = 0; + _$jscoverage['plugins/enterkey.js'][16] = 0; + _$jscoverage['plugins/enterkey.js'][17] = 0; + _$jscoverage['plugins/enterkey.js'][18] = 0; + _$jscoverage['plugins/enterkey.js'][23] = 0; + _$jscoverage['plugins/enterkey.js'][25] = 0; + _$jscoverage['plugins/enterkey.js'][26] = 0; + _$jscoverage['plugins/enterkey.js'][27] = 0; + _$jscoverage['plugins/enterkey.js'][28] = 0; + _$jscoverage['plugins/enterkey.js'][29] = 0; + _$jscoverage['plugins/enterkey.js'][30] = 0; + _$jscoverage['plugins/enterkey.js'][34] = 0; + _$jscoverage['plugins/enterkey.js'][35] = 0; + _$jscoverage['plugins/enterkey.js'][36] = 0; + _$jscoverage['plugins/enterkey.js'][37] = 0; + _$jscoverage['plugins/enterkey.js'][38] = 0; + _$jscoverage['plugins/enterkey.js'][39] = 0; + _$jscoverage['plugins/enterkey.js'][40] = 0; + _$jscoverage['plugins/enterkey.js'][41] = 0; + _$jscoverage['plugins/enterkey.js'][43] = 0; + _$jscoverage['plugins/enterkey.js'][44] = 0; + _$jscoverage['plugins/enterkey.js'][45] = 0; + _$jscoverage['plugins/enterkey.js'][46] = 0; + _$jscoverage['plugins/enterkey.js'][48] = 0; + _$jscoverage['plugins/enterkey.js'][53] = 0; + _$jscoverage['plugins/enterkey.js'][54] = 0; + _$jscoverage['plugins/enterkey.js'][58] = 0; + _$jscoverage['plugins/enterkey.js'][60] = 0; + _$jscoverage['plugins/enterkey.js'][65] = 0; + _$jscoverage['plugins/enterkey.js'][66] = 0; + _$jscoverage['plugins/enterkey.js'][67] = 0; + _$jscoverage['plugins/enterkey.js'][68] = 0; + _$jscoverage['plugins/enterkey.js'][69] = 0; + _$jscoverage['plugins/enterkey.js'][70] = 0; + _$jscoverage['plugins/enterkey.js'][72] = 0; + _$jscoverage['plugins/enterkey.js'][73] = 0; + _$jscoverage['plugins/enterkey.js'][76] = 0; + _$jscoverage['plugins/enterkey.js'][78] = 0; + _$jscoverage['plugins/enterkey.js'][80] = 0; + _$jscoverage['plugins/enterkey.js'][84] = 0; + _$jscoverage['plugins/enterkey.js'][85] = 0; + _$jscoverage['plugins/enterkey.js'][86] = 0; + _$jscoverage['plugins/enterkey.js'][89] = 0; + _$jscoverage['plugins/enterkey.js'][92] = 0; + _$jscoverage['plugins/enterkey.js'][94] = 0; + _$jscoverage['plugins/enterkey.js'][98] = 0; + _$jscoverage['plugins/enterkey.js'][100] = 0; + _$jscoverage['plugins/enterkey.js'][102] = 0; + _$jscoverage['plugins/enterkey.js'][103] = 0; + _$jscoverage['plugins/enterkey.js'][104] = 0; + _$jscoverage['plugins/enterkey.js'][105] = 0; + _$jscoverage['plugins/enterkey.js'][110] = 0; + _$jscoverage['plugins/enterkey.js'][111] = 0; + _$jscoverage['plugins/enterkey.js'][117] = 0; + _$jscoverage['plugins/enterkey.js'][119] = 0; + _$jscoverage['plugins/enterkey.js'][120] = 0; + _$jscoverage['plugins/enterkey.js'][121] = 0; + _$jscoverage['plugins/enterkey.js'][122] = 0; + _$jscoverage['plugins/enterkey.js'][123] = 0; + _$jscoverage['plugins/enterkey.js'][124] = 0; + _$jscoverage['plugins/enterkey.js'][125] = 0; + _$jscoverage['plugins/enterkey.js'][126] = 0; + _$jscoverage['plugins/enterkey.js'][127] = 0; + _$jscoverage['plugins/enterkey.js'][129] = 0; + _$jscoverage['plugins/enterkey.js'][131] = 0; + _$jscoverage['plugins/enterkey.js'][132] = 0; + _$jscoverage['plugins/enterkey.js'][133] = 0; + _$jscoverage['plugins/enterkey.js'][134] = 0; + _$jscoverage['plugins/enterkey.js'][135] = 0; + _$jscoverage['plugins/enterkey.js'][136] = 0; + _$jscoverage['plugins/enterkey.js'][138] = 0; + _$jscoverage['plugins/enterkey.js'][140] = 0; + _$jscoverage['plugins/enterkey.js'][142] = 0; + _$jscoverage['plugins/enterkey.js'][143] = 0; + _$jscoverage['plugins/enterkey.js'][144] = 0; + _$jscoverage['plugins/enterkey.js'][147] = 0; + _$jscoverage['plugins/enterkey.js'][152] = 0; + _$jscoverage['plugins/enterkey.js'][153] = 0; + _$jscoverage['plugins/enterkey.js'][158] = 0; + _$jscoverage['plugins/enterkey.js'][159] = 0; + _$jscoverage['plugins/enterkey.js'][160] = 0; + _$jscoverage['plugins/enterkey.js'][161] = 0; + _$jscoverage['plugins/enterkey.js'][162] = 0; + _$jscoverage['plugins/enterkey.js'][163] = 0; + _$jscoverage['plugins/enterkey.js'][165] = 0; + _$jscoverage['plugins/enterkey.js'][167] = 0; +} +_$jscoverage['plugins/enterkey.js'].source = ["///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, '<p>');"," 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, '<p>');",""," 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();",""," }",""," }",""," }"," });","};"]; +_$jscoverage['plugins/enterkey.js'][10]++; +UE.plugins.enterkey = (function () { + _$jscoverage['plugins/enterkey.js'][11]++; + var hTag, me = this, tag = me.options.enterTag; + _$jscoverage['plugins/enterkey.js'][14]++; + me.addListener("keyup", (function (type, evt) { + _$jscoverage['plugins/enterkey.js'][16]++; + var keyCode = (evt.keyCode || evt.which); + _$jscoverage['plugins/enterkey.js'][17]++; + if ((keyCode == 13)) { + _$jscoverage['plugins/enterkey.js'][18]++; + var range = me.selection.getRange(), start = range.startContainer, doSave; + _$jscoverage['plugins/enterkey.js'][23]++; + if ((! browser.ie)) { + _$jscoverage['plugins/enterkey.js'][25]++; + if (/h\d/i.test(hTag)) { + _$jscoverage['plugins/enterkey.js'][26]++; + if (browser.gecko) { + _$jscoverage['plugins/enterkey.js'][27]++; + var h = domUtils.findParentByTagName(start, ["h1", "h2", "h3", "h4", "h5", "h6", "blockquote", "caption", "table"], true); + _$jscoverage['plugins/enterkey.js'][28]++; + if ((! h)) { + _$jscoverage['plugins/enterkey.js'][29]++; + me.document.execCommand("formatBlock", false, "

    "); + _$jscoverage['plugins/enterkey.js'][30]++; + doSave = 1; + } + } + else { + _$jscoverage['plugins/enterkey.js'][34]++; + if ((start.nodeType == 1)) { + _$jscoverage['plugins/enterkey.js'][35]++; + var tmp = me.document.createTextNode(""), div; + _$jscoverage['plugins/enterkey.js'][36]++; + range.insertNode(tmp); + _$jscoverage['plugins/enterkey.js'][37]++; + div = domUtils.findParentByTagName(tmp, "div", true); + _$jscoverage['plugins/enterkey.js'][38]++; + if (div) { + _$jscoverage['plugins/enterkey.js'][39]++; + var p = me.document.createElement("p"); + _$jscoverage['plugins/enterkey.js'][40]++; + while (div.firstChild) { + _$jscoverage['plugins/enterkey.js'][41]++; + p.appendChild(div.firstChild); +} + _$jscoverage['plugins/enterkey.js'][43]++; + div.parentNode.insertBefore(p, div); + _$jscoverage['plugins/enterkey.js'][44]++; + domUtils.remove(div); + _$jscoverage['plugins/enterkey.js'][45]++; + range.setStartBefore(tmp).setCursor(); + _$jscoverage['plugins/enterkey.js'][46]++; + doSave = 1; + } + _$jscoverage['plugins/enterkey.js'][48]++; + domUtils.remove(tmp); + } + } + _$jscoverage['plugins/enterkey.js'][53]++; + if ((me.undoManger && doSave)) { + _$jscoverage['plugins/enterkey.js'][54]++; + me.undoManger.save(); + } + } + _$jscoverage['plugins/enterkey.js'][58]++; + (browser.opera && range.select()); + } + else { + _$jscoverage['plugins/enterkey.js'][60]++; + me.fireEvent("saveScene", true, true); + } + } +})); + _$jscoverage['plugins/enterkey.js'][65]++; + me.addListener("keydown", (function (type, evt) { + _$jscoverage['plugins/enterkey.js'][66]++; + var keyCode = (evt.keyCode || evt.which); + _$jscoverage['plugins/enterkey.js'][67]++; + if ((keyCode == 13)) { + _$jscoverage['plugins/enterkey.js'][68]++; + if (me.fireEvent("beforeenterkeydown")) { + _$jscoverage['plugins/enterkey.js'][69]++; + domUtils.preventDefault(evt); + _$jscoverage['plugins/enterkey.js'][70]++; + return; + } + _$jscoverage['plugins/enterkey.js'][72]++; + me.fireEvent("saveScene", true, true); + _$jscoverage['plugins/enterkey.js'][73]++; + hTag = ""; + _$jscoverage['plugins/enterkey.js'][76]++; + var range = me.selection.getRange(); + _$jscoverage['plugins/enterkey.js'][78]++; + if ((! range.collapsed)) { + _$jscoverage['plugins/enterkey.js'][80]++; + var start = range.startContainer, end = range.endContainer, startTd = domUtils.findParentByTagName(start, "td", true), endTd = domUtils.findParentByTagName(end, "td", true); + _$jscoverage['plugins/enterkey.js'][84]++; + if (((startTd && endTd && (startTd !== endTd)) || ((! startTd) && endTd) || (startTd && (! endTd)))) { + _$jscoverage['plugins/enterkey.js'][85]++; + (evt.preventDefault? evt.preventDefault(): (evt.returnValue = false)); + _$jscoverage['plugins/enterkey.js'][86]++; + return; + } + } + _$jscoverage['plugins/enterkey.js'][89]++; + if ((tag == "p")) { + _$jscoverage['plugins/enterkey.js'][92]++; + if ((! browser.ie)) { + _$jscoverage['plugins/enterkey.js'][94]++; + start = domUtils.findParentByTagName(range.startContainer, ["ol", "ul", "p", "h1", "h2", "h3", "h4", "h5", "h6", "blockquote", "caption"], true); + _$jscoverage['plugins/enterkey.js'][98]++; + if (((! start) && (! browser.opera))) { + _$jscoverage['plugins/enterkey.js'][100]++; + me.document.execCommand("formatBlock", false, "

    "); + _$jscoverage['plugins/enterkey.js'][102]++; + if (browser.gecko) { + _$jscoverage['plugins/enterkey.js'][103]++; + range = me.selection.getRange(); + _$jscoverage['plugins/enterkey.js'][104]++; + start = domUtils.findParentByTagName(range.startContainer, "p", true); + _$jscoverage['plugins/enterkey.js'][105]++; + (start && domUtils.removeDirtyAttr(start)); + } + } + else { + _$jscoverage['plugins/enterkey.js'][110]++; + hTag = start.tagName; + _$jscoverage['plugins/enterkey.js'][111]++; + ((start.tagName.toLowerCase() == "p") && browser.gecko && domUtils.removeDirtyAttr(start)); + } + } + } + else { + _$jscoverage['plugins/enterkey.js'][117]++; + (evt.preventDefault? evt.preventDefault(): (evt.returnValue = false)); + _$jscoverage['plugins/enterkey.js'][119]++; + if ((! range.collapsed)) { + _$jscoverage['plugins/enterkey.js'][120]++; + range.deleteContents(); + _$jscoverage['plugins/enterkey.js'][121]++; + start = range.startContainer; + _$jscoverage['plugins/enterkey.js'][122]++; + if (((start.nodeType == 1) && (start = start.childNodes[range.startOffset]))) { + _$jscoverage['plugins/enterkey.js'][123]++; + while ((start.nodeType == 1)) { + _$jscoverage['plugins/enterkey.js'][124]++; + if (dtd.$empty[start.tagName]) { + _$jscoverage['plugins/enterkey.js'][125]++; + range.setStartBefore(start).setCursor(); + _$jscoverage['plugins/enterkey.js'][126]++; + if (me.undoManger) { + _$jscoverage['plugins/enterkey.js'][127]++; + me.undoManger.save(); + } + _$jscoverage['plugins/enterkey.js'][129]++; + return false; + } + _$jscoverage['plugins/enterkey.js'][131]++; + if ((! start.firstChild)) { + _$jscoverage['plugins/enterkey.js'][132]++; + var br = range.document.createElement("br"); + _$jscoverage['plugins/enterkey.js'][133]++; + start.appendChild(br); + _$jscoverage['plugins/enterkey.js'][134]++; + range.setStart(start, 0).setCursor(); + _$jscoverage['plugins/enterkey.js'][135]++; + if (me.undoManger) { + _$jscoverage['plugins/enterkey.js'][136]++; + me.undoManger.save(); + } + _$jscoverage['plugins/enterkey.js'][138]++; + return false; + } + _$jscoverage['plugins/enterkey.js'][140]++; + start = start.firstChild; +} + _$jscoverage['plugins/enterkey.js'][142]++; + if ((start === range.startContainer.childNodes[range.startOffset])) { + _$jscoverage['plugins/enterkey.js'][143]++; + br = range.document.createElement("br"); + _$jscoverage['plugins/enterkey.js'][144]++; + range.insertNode(br).setCursor(); + } + else { + _$jscoverage['plugins/enterkey.js'][147]++; + range.setStart(start, 0).setCursor(); + } + } + else { + _$jscoverage['plugins/enterkey.js'][152]++; + br = range.document.createElement("br"); + _$jscoverage['plugins/enterkey.js'][153]++; + range.insertNode(br).setStartAfter(br).setCursor(); + } + } + else { + _$jscoverage['plugins/enterkey.js'][158]++; + br = range.document.createElement("br"); + _$jscoverage['plugins/enterkey.js'][159]++; + range.insertNode(br); + _$jscoverage['plugins/enterkey.js'][160]++; + var parent = br.parentNode; + _$jscoverage['plugins/enterkey.js'][161]++; + if ((parent.lastChild === br)) { + _$jscoverage['plugins/enterkey.js'][162]++; + br.parentNode.insertBefore(br.cloneNode(true), br); + _$jscoverage['plugins/enterkey.js'][163]++; + range.setStartBefore(br); + } + else { + _$jscoverage['plugins/enterkey.js'][165]++; + range.setStartAfter(br); + } + _$jscoverage['plugins/enterkey.js'][167]++; + range.setCursor(); + } + } + } +})); +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/fiximgclick.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/fiximgclick.js new file mode 100644 index 000000000..b32a5f225 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/fiximgclick.js @@ -0,0 +1,68 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/fiximgclick.js']) { + _$jscoverage['plugins/fiximgclick.js'] = []; + _$jscoverage['plugins/fiximgclick.js'][7] = 0; + _$jscoverage['plugins/fiximgclick.js'][8] = 0; + _$jscoverage['plugins/fiximgclick.js'][9] = 0; + _$jscoverage['plugins/fiximgclick.js'][10] = 0; + _$jscoverage['plugins/fiximgclick.js'][11] = 0; + _$jscoverage['plugins/fiximgclick.js'][12] = 0; + _$jscoverage['plugins/fiximgclick.js'][13] = 0; +} +_$jscoverage['plugins/fiximgclick.js'].source = ["///import core","///commands 修复chrome下图片不能点击的问题","///commandsName FixImgClick","///commandsTitle 修复chrome下图片不能点击的问题","//修复chrome下图片不能点击的问题","//todo 可以改大小","UE.plugins['fiximgclick'] = function() {"," var me = this;"," if ( browser.webkit ) {"," me.addListener( 'click', function( type, e ) {"," if ( e.target.tagName == 'IMG' ) {"," var range = new dom.Range( me.document );"," range.selectNode( e.target ).select();",""," }"," } );"," }","};"]; +_$jscoverage['plugins/fiximgclick.js'][7]++; +UE.plugins.fiximgclick = (function () { + _$jscoverage['plugins/fiximgclick.js'][8]++; + var me = this; + _$jscoverage['plugins/fiximgclick.js'][9]++; + if (browser.webkit) { + _$jscoverage['plugins/fiximgclick.js'][10]++; + me.addListener("click", (function (type, e) { + _$jscoverage['plugins/fiximgclick.js'][11]++; + if ((e.target.tagName == "IMG")) { + _$jscoverage['plugins/fiximgclick.js'][12]++; + var range = new (dom.Range)(me.document); + _$jscoverage['plugins/fiximgclick.js'][13]++; + range.selectNode(e.target).select(); + } +})); + } +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/font.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/font.js new file mode 100644 index 000000000..7cfdc6709 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/font.js @@ -0,0 +1,646 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/font.js']) { + _$jscoverage['plugins/font.js'] = []; + _$jscoverage['plugins/font.js'][197] = 0; + _$jscoverage['plugins/font.js'][198] = 0; + _$jscoverage['plugins/font.js'][216] = 0; + _$jscoverage['plugins/font.js'][233] = 0; + _$jscoverage['plugins/font.js'][234] = 0; + _$jscoverage['plugins/font.js'][235] = 0; + _$jscoverage['plugins/font.js'][236] = 0; + _$jscoverage['plugins/font.js'][237] = 0; + _$jscoverage['plugins/font.js'][239] = 0; + _$jscoverage['plugins/font.js'][240] = 0; + _$jscoverage['plugins/font.js'][241] = 0; + _$jscoverage['plugins/font.js'][244] = 0; + _$jscoverage['plugins/font.js'][249] = 0; + _$jscoverage['plugins/font.js'][250] = 0; + _$jscoverage['plugins/font.js'][251] = 0; + _$jscoverage['plugins/font.js'][252] = 0; + _$jscoverage['plugins/font.js'][253] = 0; + _$jscoverage['plugins/font.js'][254] = 0; + _$jscoverage['plugins/font.js'][255] = 0; + _$jscoverage['plugins/font.js'][256] = 0; + _$jscoverage['plugins/font.js'][257] = 0; + _$jscoverage['plugins/font.js'][258] = 0; + _$jscoverage['plugins/font.js'][259] = 0; + _$jscoverage['plugins/font.js'][261] = 0; + _$jscoverage['plugins/font.js'][262] = 0; + _$jscoverage['plugins/font.js'][263] = 0; + _$jscoverage['plugins/font.js'][266] = 0; + _$jscoverage['plugins/font.js'][272] = 0; + _$jscoverage['plugins/font.js'][273] = 0; + _$jscoverage['plugins/font.js'][275] = 0; + _$jscoverage['plugins/font.js'][276] = 0; + _$jscoverage['plugins/font.js'][277] = 0; + _$jscoverage['plugins/font.js'][278] = 0; + _$jscoverage['plugins/font.js'][281] = 0; + _$jscoverage['plugins/font.js'][283] = 0; + _$jscoverage['plugins/font.js'][284] = 0; + _$jscoverage['plugins/font.js'][285] = 0; + _$jscoverage['plugins/font.js'][286] = 0; + _$jscoverage['plugins/font.js'][287] = 0; + _$jscoverage['plugins/font.js'][289] = 0; + _$jscoverage['plugins/font.js'][291] = 0; + _$jscoverage['plugins/font.js'][293] = 0; + _$jscoverage['plugins/font.js'][294] = 0; + _$jscoverage['plugins/font.js'][296] = 0; + _$jscoverage['plugins/font.js'][297] = 0; + _$jscoverage['plugins/font.js'][298] = 0; + _$jscoverage['plugins/font.js'][299] = 0; + _$jscoverage['plugins/font.js'][300] = 0; + _$jscoverage['plugins/font.js'][301] = 0; + _$jscoverage['plugins/font.js'][302] = 0; + _$jscoverage['plugins/font.js'][304] = 0; + _$jscoverage['plugins/font.js'][305] = 0; + _$jscoverage['plugins/font.js'][306] = 0; + _$jscoverage['plugins/font.js'][308] = 0; + _$jscoverage['plugins/font.js'][309] = 0; + _$jscoverage['plugins/font.js'][310] = 0; + _$jscoverage['plugins/font.js'][315] = 0; + _$jscoverage['plugins/font.js'][316] = 0; + _$jscoverage['plugins/font.js'][318] = 0; + _$jscoverage['plugins/font.js'][319] = 0; + _$jscoverage['plugins/font.js'][320] = 0; + _$jscoverage['plugins/font.js'][325] = 0; + _$jscoverage['plugins/font.js'][326] = 0; + _$jscoverage['plugins/font.js'][329] = 0; + _$jscoverage['plugins/font.js'][330] = 0; + _$jscoverage['plugins/font.js'][331] = 0; + _$jscoverage['plugins/font.js'][332] = 0; + _$jscoverage['plugins/font.js'][333] = 0; + _$jscoverage['plugins/font.js'][334] = 0; + _$jscoverage['plugins/font.js'][336] = 0; + _$jscoverage['plugins/font.js'][337] = 0; + _$jscoverage['plugins/font.js'][339] = 0; + _$jscoverage['plugins/font.js'][340] = 0; + _$jscoverage['plugins/font.js'][342] = 0; + _$jscoverage['plugins/font.js'][343] = 0; + _$jscoverage['plugins/font.js'][345] = 0; + _$jscoverage['plugins/font.js'][348] = 0; + _$jscoverage['plugins/font.js'][352] = 0; + _$jscoverage['plugins/font.js'][353] = 0; + _$jscoverage['plugins/font.js'][357] = 0; + _$jscoverage['plugins/font.js'][409] = 0; + _$jscoverage['plugins/font.js'][410] = 0; + _$jscoverage['plugins/font.js'][411] = 0; + _$jscoverage['plugins/font.js'][413] = 0; + _$jscoverage['plugins/font.js'][416] = 0; + _$jscoverage['plugins/font.js'][420] = 0; + _$jscoverage['plugins/font.js'][422] = 0; + _$jscoverage['plugins/font.js'][423] = 0; + _$jscoverage['plugins/font.js'][424] = 0; + _$jscoverage['plugins/font.js'][427] = 0; + _$jscoverage['plugins/font.js'][428] = 0; + _$jscoverage['plugins/font.js'][429] = 0; + _$jscoverage['plugins/font.js'][430] = 0; + _$jscoverage['plugins/font.js'][432] = 0; + _$jscoverage['plugins/font.js'][433] = 0; + _$jscoverage['plugins/font.js'][435] = 0; + _$jscoverage['plugins/font.js'][436] = 0; + _$jscoverage['plugins/font.js'][437] = 0; + _$jscoverage['plugins/font.js'][439] = 0; + _$jscoverage['plugins/font.js'][441] = 0; + _$jscoverage['plugins/font.js'][442] = 0; + _$jscoverage['plugins/font.js'][443] = 0; + _$jscoverage['plugins/font.js'][446] = 0; + _$jscoverage['plugins/font.js'][447] = 0; + _$jscoverage['plugins/font.js'][448] = 0; + _$jscoverage['plugins/font.js'][450] = 0; + _$jscoverage['plugins/font.js'][451] = 0; + _$jscoverage['plugins/font.js'][452] = 0; + _$jscoverage['plugins/font.js'][453] = 0; + _$jscoverage['plugins/font.js'][455] = 0; + _$jscoverage['plugins/font.js'][456] = 0; + _$jscoverage['plugins/font.js'][459] = 0; + _$jscoverage['plugins/font.js'][460] = 0; + _$jscoverage['plugins/font.js'][464] = 0; + _$jscoverage['plugins/font.js'][465] = 0; + _$jscoverage['plugins/font.js'][466] = 0; + _$jscoverage['plugins/font.js'][468] = 0; + _$jscoverage['plugins/font.js'][470] = 0; + _$jscoverage['plugins/font.js'][471] = 0; + _$jscoverage['plugins/font.js'][472] = 0; + _$jscoverage['plugins/font.js'][473] = 0; + _$jscoverage['plugins/font.js'][475] = 0; + _$jscoverage['plugins/font.js'][478] = 0; + _$jscoverage['plugins/font.js'][481] = 0; + _$jscoverage['plugins/font.js'][483] = 0; + _$jscoverage['plugins/font.js'][484] = 0; + _$jscoverage['plugins/font.js'][485] = 0; + _$jscoverage['plugins/font.js'][486] = 0; + _$jscoverage['plugins/font.js'][488] = 0; + _$jscoverage['plugins/font.js'][490] = 0; + _$jscoverage['plugins/font.js'][495] = 0; + _$jscoverage['plugins/font.js'][496] = 0; + _$jscoverage['plugins/font.js'][497] = 0; + _$jscoverage['plugins/font.js'][498] = 0; + _$jscoverage['plugins/font.js'][499] = 0; + _$jscoverage['plugins/font.js'][502] = 0; + _$jscoverage['plugins/font.js'][503] = 0; + _$jscoverage['plugins/font.js'][504] = 0; + _$jscoverage['plugins/font.js'][510] = 0; + _$jscoverage['plugins/font.js'][515] = 0; + _$jscoverage['plugins/font.js'][518] = 0; + _$jscoverage['plugins/font.js'][521] = 0; + _$jscoverage['plugins/font.js'][522] = 0; + _$jscoverage['plugins/font.js'][523] = 0; + _$jscoverage['plugins/font.js'][524] = 0; + _$jscoverage['plugins/font.js'][525] = 0; + _$jscoverage['plugins/font.js'][527] = 0; + _$jscoverage['plugins/font.js'][528] = 0; + _$jscoverage['plugins/font.js'][532] = 0; + _$jscoverage['plugins/font.js'][534] = 0; + _$jscoverage['plugins/font.js'][536] = 0; + _$jscoverage['plugins/font.js'][537] = 0; + _$jscoverage['plugins/font.js'][538] = 0; + _$jscoverage['plugins/font.js'][539] = 0; + _$jscoverage['plugins/font.js'][540] = 0; + _$jscoverage['plugins/font.js'][541] = 0; + _$jscoverage['plugins/font.js'][544] = 0; + _$jscoverage['plugins/font.js'][546] = 0; + _$jscoverage['plugins/font.js'][549] = 0; + _$jscoverage['plugins/font.js'][550] = 0; + _$jscoverage['plugins/font.js'][553] = 0; + _$jscoverage['plugins/font.js'][555] = 0; + _$jscoverage['plugins/font.js'][559] = 0; + _$jscoverage['plugins/font.js'][563] = 0; + _$jscoverage['plugins/font.js'][566] = 0; + _$jscoverage['plugins/font.js'][567] = 0; + _$jscoverage['plugins/font.js'][568] = 0; + _$jscoverage['plugins/font.js'][569] = 0; + _$jscoverage['plugins/font.js'][570] = 0; + _$jscoverage['plugins/font.js'][572] = 0; +} +_$jscoverage['plugins/font.js'].source = ["/**"," * 字体颜色,背景色,字号,字体,下划线,删除线"," * @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 underline"," * @method queryCommandValue"," * @param { String } cmd 命令字符串"," * @return { String } underline|default"," * @example"," * ```javascript"," * editor.queryCommandValue( 'underline' );"," * ```"," */","/**"," * 返回选区有无下划线"," * @command underline"," * @method queryCommandValue"," * @param { String } cmd 命令字符串"," * @return { Bool }true为有下划线,反之则无"," * @example"," * ```javascript"," * editor.queryCommandValue( 'underline' );"," * ```"," */","","/**"," * 根据选区内文本有无删除线设置字体删除线"," * @command strikethrough"," * @method execCommand"," * @param { String } cmd 命令字符串"," * @example"," * ```javascript"," * editor.execCommand( 'strikethrough' );"," * ```"," */","/**"," * 返回选区删除线样式"," * @command strikethrough"," * @method queryCommandValue"," * @param { String } cmd 命令字符串"," * @return { String } line-through|default"," * @example"," * ```javascript"," * editor.queryCommandValue( 'strikethrough' );"," * ```"," */","/**"," * 返回选区有无删除线"," * @command strikethrough"," * @method queryCommandValue"," * @param { String } cmd 命令字符串"," * @return { Bool }true为有删除线,反之则无"," * @example"," * ```javascript"," * editor.queryCommandValue( 'strikethrough' );"," * ```"," */","","/**"," * 根据选区内文本有无字体边框设置字体边框"," * @command fontborder"," * @method execCommand"," * @param { String } cmd 命令字符串"," * @example"," * ```javascript"," * editor.execCommand( 'fontborder' );"," * ```"," */","/**"," * 返回选区字体边框样式"," * @command fontborder"," * @method queryCommandValue"," * @param { String } cmd 命令字符串"," * @return { String } 字体边框样式"," * @example"," * ```javascript"," * editor.queryCommandValue( 'fontborder' );"," * ```"," */","/**"," * 返回选区有无字体边框"," * @command fontborder"," * @method queryCommandValue"," * @param { String } cmd 命令字符串"," * @return { Bool }true为有字体边框,反之则无"," * @example"," * ```javascript"," * editor.queryCommandValue( '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){"," var start = rng.startContainer.childNodes[rng.startOffset];"," if(start && domUtils.isTagNode(start,'span')){"," var bk = rng.createBookmark();"," utils.each(domUtils.getElementsByTagName(start, 'span'), function (span) {"," if (!span.parentNode || domUtils.isBookmarkNode(span))return;"," if(cmdName == 'backcolor' && domUtils.getComputedStyle(span,'background-color').toLowerCase() === value){"," return;"," }"," domUtils.removeStyle(span,needSetChild[cmdName]);"," if(span.style.cssText.replace(/^\\s+$/,'').length == 0){"," domUtils.remove(span,true)"," }"," });"," rng.moveToBookmark(bk)"," }"," }"," }",""," }"," 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:' + 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 val == (cmdName == 'underline' ?"," 'underline' : 'line-through');"," }",""," }"," };"," })(p, fonts[p]);"," }","};"]; +_$jscoverage['plugins/font.js'][197]++; +UE.plugins.font = (function () { + _$jscoverage['plugins/font.js'][198]++; + 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"}; + _$jscoverage['plugins/font.js'][216]++; + me.setOpt({"fontfamily": [{name: "songti", val: "\u5b8b\u4f53,SimSun"}, {name: "yahei", val: "\u5fae\u8f6f\u96c5\u9ed1,Microsoft YaHei"}, {name: "kaiti", val: "\u6977\u4f53,\u6977\u4f53_GB2312, SimKai"}, {name: "heiti", val: "\u9ed1\u4f53, SimHei"}, {name: "lishu", val: "\u96b6\u4e66, 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]}); + _$jscoverage['plugins/font.js'][233]++; + function mergeWithParent(node) { + _$jscoverage['plugins/font.js'][234]++; + var parent; + _$jscoverage['plugins/font.js'][235]++; + while ((parent = node.parentNode)) { + _$jscoverage['plugins/font.js'][236]++; + if (((parent.tagName == "SPAN") && (domUtils.getChildCount(parent, (function (child) { + _$jscoverage['plugins/font.js'][237]++; + return ((! domUtils.isBookmarkNode(child)) && (! domUtils.isBr(child))); +})) == 1))) { + _$jscoverage['plugins/font.js'][239]++; + parent.style.cssText += node.style.cssText; + _$jscoverage['plugins/font.js'][240]++; + domUtils.remove(node, true); + _$jscoverage['plugins/font.js'][241]++; + node = parent; + } + else { + _$jscoverage['plugins/font.js'][244]++; + break; + } +} +} + _$jscoverage['plugins/font.js'][249]++; + function mergeChild(rng, cmdName, value) { + _$jscoverage['plugins/font.js'][250]++; + if (needSetChild[cmdName]) { + _$jscoverage['plugins/font.js'][251]++; + rng.adjustmentBoundary(); + _$jscoverage['plugins/font.js'][252]++; + if (((! rng.collapsed) && (rng.startContainer.nodeType == 1))) { + _$jscoverage['plugins/font.js'][253]++; + var start = rng.startContainer.childNodes[rng.startOffset]; + _$jscoverage['plugins/font.js'][254]++; + if ((start && domUtils.isTagNode(start, "span"))) { + _$jscoverage['plugins/font.js'][255]++; + var bk = rng.createBookmark(); + _$jscoverage['plugins/font.js'][256]++; + utils.each(domUtils.getElementsByTagName(start, "span"), (function (span) { + _$jscoverage['plugins/font.js'][257]++; + if (((! span.parentNode) || domUtils.isBookmarkNode(span))) { + _$jscoverage['plugins/font.js'][257]++; + return; + } + _$jscoverage['plugins/font.js'][258]++; + if (((cmdName == "backcolor") && (domUtils.getComputedStyle(span, "background-color").toLowerCase() === value))) { + _$jscoverage['plugins/font.js'][259]++; + return; + } + _$jscoverage['plugins/font.js'][261]++; + domUtils.removeStyle(span, needSetChild[cmdName]); + _$jscoverage['plugins/font.js'][262]++; + if ((span.style.cssText.replace(/^\s+$/, "").length == 0)) { + _$jscoverage['plugins/font.js'][263]++; + domUtils.remove(span, true); + } +})); + _$jscoverage['plugins/font.js'][266]++; + rng.moveToBookmark(bk); + } + } + } +} + _$jscoverage['plugins/font.js'][272]++; + function mergesibling(rng, cmdName, value) { + _$jscoverage['plugins/font.js'][273]++; + var collapsed = rng.collapsed, bk = rng.createBookmark(), common; + _$jscoverage['plugins/font.js'][275]++; + if (collapsed) { + _$jscoverage['plugins/font.js'][276]++; + common = bk.start.parentNode; + _$jscoverage['plugins/font.js'][277]++; + while (dtd.$inline[common.tagName]) { + _$jscoverage['plugins/font.js'][278]++; + common = common.parentNode; +} + } + else { + _$jscoverage['plugins/font.js'][281]++; + common = domUtils.getCommonAncestor(bk.start, bk.end); + } + _$jscoverage['plugins/font.js'][283]++; + utils.each(domUtils.getElementsByTagName(common, "span"), (function (span) { + _$jscoverage['plugins/font.js'][284]++; + if (((! span.parentNode) || domUtils.isBookmarkNode(span))) { + _$jscoverage['plugins/font.js'][284]++; + return; + } + _$jscoverage['plugins/font.js'][285]++; + if (/\s*border\s*:\s*none;?\s*/i.test(span.style.cssText)) { + _$jscoverage['plugins/font.js'][286]++; + if (/^\s*border\s*:\s*none;?\s*$/.test(span.style.cssText)) { + _$jscoverage['plugins/font.js'][287]++; + domUtils.remove(span, true); + } + else { + _$jscoverage['plugins/font.js'][289]++; + domUtils.removeStyle(span, "border"); + } + _$jscoverage['plugins/font.js'][291]++; + return; + } + _$jscoverage['plugins/font.js'][293]++; + if ((/border/i.test(span.style.cssText) && (span.parentNode.tagName == "SPAN") && /border/i.test(span.parentNode.style.cssText))) { + _$jscoverage['plugins/font.js'][294]++; + span.style.cssText = span.style.cssText.replace(/border[^:]*:[^;]+;?/gi, ""); + } + _$jscoverage['plugins/font.js'][296]++; + if ((! ((cmdName == "fontborder") && (value == "none")))) { + _$jscoverage['plugins/font.js'][297]++; + var next = span.nextSibling; + _$jscoverage['plugins/font.js'][298]++; + while ((next && (next.nodeType == 1) && (next.tagName == "SPAN"))) { + _$jscoverage['plugins/font.js'][299]++; + if ((domUtils.isBookmarkNode(next) && (cmdName == "fontborder"))) { + _$jscoverage['plugins/font.js'][300]++; + span.appendChild(next); + _$jscoverage['plugins/font.js'][301]++; + next = span.nextSibling; + _$jscoverage['plugins/font.js'][302]++; + continue; + } + _$jscoverage['plugins/font.js'][304]++; + if ((next.style.cssText == span.style.cssText)) { + _$jscoverage['plugins/font.js'][305]++; + domUtils.moveChild(next, span); + _$jscoverage['plugins/font.js'][306]++; + domUtils.remove(next); + } + _$jscoverage['plugins/font.js'][308]++; + if ((span.nextSibling === next)) { + _$jscoverage['plugins/font.js'][309]++; + break; + } + _$jscoverage['plugins/font.js'][310]++; + next = span.nextSibling; +} + } + _$jscoverage['plugins/font.js'][315]++; + mergeWithParent(span); + _$jscoverage['plugins/font.js'][316]++; + if ((browser.ie && (browser.version > 8))) { + _$jscoverage['plugins/font.js'][318]++; + var parent = domUtils.findParent(span, (function (n) { + _$jscoverage['plugins/font.js'][318]++; + return ((n.tagName == "SPAN") && /background-color/.test(n.style.cssText)); +})); + _$jscoverage['plugins/font.js'][319]++; + if ((parent && (! /background-color/.test(span.style.cssText)))) { + _$jscoverage['plugins/font.js'][320]++; + span.style.backgroundColor = parent.style.backgroundColor; + } + } +})); + _$jscoverage['plugins/font.js'][325]++; + rng.moveToBookmark(bk); + _$jscoverage['plugins/font.js'][326]++; + mergeChild(rng, cmdName, value); +} + _$jscoverage['plugins/font.js'][329]++; + me.addInputRule((function (root) { + _$jscoverage['plugins/font.js'][330]++; + utils.each(root.getNodesByTagName("u s del font strike"), (function (node) { + _$jscoverage['plugins/font.js'][331]++; + if ((node.tagName == "font")) { + _$jscoverage['plugins/font.js'][332]++; + var cssStyle = []; + _$jscoverage['plugins/font.js'][333]++; + for (var p in node.attrs) { + _$jscoverage['plugins/font.js'][334]++; + switch (p) { + case "size": + _$jscoverage['plugins/font.js'][336]++; + cssStyle.push(("font-size:" + node.attrs[p] + "px")); + _$jscoverage['plugins/font.js'][337]++; + break; + case "color": + _$jscoverage['plugins/font.js'][339]++; + cssStyle.push(("color:" + node.attrs[p])); + _$jscoverage['plugins/font.js'][340]++; + break; + case "face": + _$jscoverage['plugins/font.js'][342]++; + cssStyle.push(("font-family:" + node.attrs[p])); + _$jscoverage['plugins/font.js'][343]++; + break; + case "style": + _$jscoverage['plugins/font.js'][345]++; + cssStyle.push(node.attrs[p]); + } +} + _$jscoverage['plugins/font.js'][348]++; + node.attrs = {"style": cssStyle.join(";")}; + } + else { + _$jscoverage['plugins/font.js'][352]++; + var val = ((node.tagName == "u")? "underline": "line-through"); + _$jscoverage['plugins/font.js'][353]++; + node.attrs = {"style": ((node.getAttr("style") || "") + "text-decoration:" + val + ";")}; + } + _$jscoverage['plugins/font.js'][357]++; + node.tagName = "span"; +})); +})); + _$jscoverage['plugins/font.js'][409]++; + for (var p in fonts) { + _$jscoverage['plugins/font.js'][410]++; + (function (cmd, style) { + _$jscoverage['plugins/font.js'][411]++; + UE.commands[cmd] = {execCommand: (function (cmdName, value) { + _$jscoverage['plugins/font.js'][413]++; + value = (value || (this.queryCommandState(cmdName)? "none": ((cmdName == "underline")? "underline": ((cmdName == "fontborder")? "1px solid #000": "line-through")))); + _$jscoverage['plugins/font.js'][416]++; + var me = this, range = this.selection.getRange(), text; + _$jscoverage['plugins/font.js'][420]++; + if ((value == "default")) { + _$jscoverage['plugins/font.js'][422]++; + if (range.collapsed) { + _$jscoverage['plugins/font.js'][423]++; + text = me.document.createTextNode("font"); + _$jscoverage['plugins/font.js'][424]++; + range.insertNode(text).select(); + } + _$jscoverage['plugins/font.js'][427]++; + me.execCommand("removeFormat", "span,a", style); + _$jscoverage['plugins/font.js'][428]++; + if (text) { + _$jscoverage['plugins/font.js'][429]++; + range.setStartBefore(text).collapse(true); + _$jscoverage['plugins/font.js'][430]++; + domUtils.remove(text); + } + _$jscoverage['plugins/font.js'][432]++; + mergesibling(range, cmdName, value); + _$jscoverage['plugins/font.js'][433]++; + range.select(); + } + else { + _$jscoverage['plugins/font.js'][435]++; + if ((! range.collapsed)) { + _$jscoverage['plugins/font.js'][436]++; + if ((needCmd[cmd] && me.queryCommandValue(cmd))) { + _$jscoverage['plugins/font.js'][437]++; + me.execCommand("removeFormat", "span,a", style); + } + _$jscoverage['plugins/font.js'][439]++; + range = me.selection.getRange(); + _$jscoverage['plugins/font.js'][441]++; + range.applyInlineStyle("span", {"style": (style + ":" + value)}); + _$jscoverage['plugins/font.js'][442]++; + mergesibling(range, cmdName, value); + _$jscoverage['plugins/font.js'][443]++; + range.select(); + } + else { + _$jscoverage['plugins/font.js'][446]++; + var span = domUtils.findParentByTagName(range.startContainer, "span", true); + _$jscoverage['plugins/font.js'][447]++; + text = me.document.createTextNode("font"); + _$jscoverage['plugins/font.js'][448]++; + if ((span && (! span.children.length) && (! span[(browser.ie? "innerText": "textContent")].replace(fillCharReg, "").length))) { + _$jscoverage['plugins/font.js'][450]++; + range.insertNode(text); + _$jscoverage['plugins/font.js'][451]++; + if (needCmd[cmd]) { + _$jscoverage['plugins/font.js'][452]++; + range.selectNode(text).select(); + _$jscoverage['plugins/font.js'][453]++; + me.execCommand("removeFormat", "span,a", style, null); + _$jscoverage['plugins/font.js'][455]++; + span = domUtils.findParentByTagName(text, "span", true); + _$jscoverage['plugins/font.js'][456]++; + range.setStartBefore(text); + } + _$jscoverage['plugins/font.js'][459]++; + (span && (span.style.cssText += (";" + style + ":" + value))); + _$jscoverage['plugins/font.js'][460]++; + range.collapse(true).select(); + } + else { + _$jscoverage['plugins/font.js'][464]++; + range.insertNode(text); + _$jscoverage['plugins/font.js'][465]++; + range.selectNode(text).select(); + _$jscoverage['plugins/font.js'][466]++; + span = range.document.createElement("span"); + _$jscoverage['plugins/font.js'][468]++; + if (needCmd[cmd]) { + _$jscoverage['plugins/font.js'][470]++; + if (domUtils.findParentByTagName(text, "a", true)) { + _$jscoverage['plugins/font.js'][471]++; + range.setStartBefore(text).setCursor(); + _$jscoverage['plugins/font.js'][472]++; + domUtils.remove(text); + _$jscoverage['plugins/font.js'][473]++; + return; + } + _$jscoverage['plugins/font.js'][475]++; + me.execCommand("removeFormat", "span,a", style); + } + _$jscoverage['plugins/font.js'][478]++; + span.style.cssText = (style + ":" + value); + _$jscoverage['plugins/font.js'][481]++; + text.parentNode.insertBefore(span, text); + _$jscoverage['plugins/font.js'][483]++; + if (((! browser.ie) || (browser.ie && (browser.version == 9)))) { + _$jscoverage['plugins/font.js'][484]++; + var spanParent = span.parentNode; + _$jscoverage['plugins/font.js'][485]++; + while ((! domUtils.isBlockElm(spanParent))) { + _$jscoverage['plugins/font.js'][486]++; + if ((spanParent.tagName == "SPAN")) { + _$jscoverage['plugins/font.js'][488]++; + span.style.cssText = (spanParent.style.cssText + ";" + span.style.cssText); + } + _$jscoverage['plugins/font.js'][490]++; + spanParent = spanParent.parentNode; +} + } + _$jscoverage['plugins/font.js'][495]++; + if (opera) { + _$jscoverage['plugins/font.js'][496]++; + setTimeout((function () { + _$jscoverage['plugins/font.js'][497]++; + range.setStart(span, 0).collapse(true); + _$jscoverage['plugins/font.js'][498]++; + mergesibling(range, cmdName, value); + _$jscoverage['plugins/font.js'][499]++; + range.select(); +})); + } + else { + _$jscoverage['plugins/font.js'][502]++; + range.setStart(span, 0).collapse(true); + _$jscoverage['plugins/font.js'][503]++; + mergesibling(range, cmdName, value); + _$jscoverage['plugins/font.js'][504]++; + range.select(); + } + } + _$jscoverage['plugins/font.js'][510]++; + domUtils.remove(text); + } + } + _$jscoverage['plugins/font.js'][515]++; + return true; +}), queryCommandValue: (function (cmdName) { + _$jscoverage['plugins/font.js'][518]++; + var startNode = this.selection.getStart(); + _$jscoverage['plugins/font.js'][521]++; + if (((cmdName == "underline") || (cmdName == "strikethrough"))) { + _$jscoverage['plugins/font.js'][522]++; + var tmpNode = startNode, value; + _$jscoverage['plugins/font.js'][523]++; + while ((tmpNode && (! domUtils.isBlockElm(tmpNode)) && (! domUtils.isBody(tmpNode)))) { + _$jscoverage['plugins/font.js'][524]++; + if ((tmpNode.nodeType == 1)) { + _$jscoverage['plugins/font.js'][525]++; + value = domUtils.getComputedStyle(tmpNode, style); + _$jscoverage['plugins/font.js'][527]++; + if ((value != "none")) { + _$jscoverage['plugins/font.js'][528]++; + return value; + } + } + _$jscoverage['plugins/font.js'][532]++; + tmpNode = tmpNode.parentNode; +} + _$jscoverage['plugins/font.js'][534]++; + return "none"; + } + _$jscoverage['plugins/font.js'][536]++; + if ((cmdName == "fontborder")) { + _$jscoverage['plugins/font.js'][537]++; + var tmp = startNode, val; + _$jscoverage['plugins/font.js'][538]++; + while ((tmp && dtd.$inline[tmp.tagName])) { + _$jscoverage['plugins/font.js'][539]++; + if ((val = domUtils.getComputedStyle(tmp, "border"))) { + _$jscoverage['plugins/font.js'][540]++; + if ((/1px/.test(val) && /solid/.test(val))) { + _$jscoverage['plugins/font.js'][541]++; + return val; + } + } + _$jscoverage['plugins/font.js'][544]++; + tmp = tmp.parentNode; +} + _$jscoverage['plugins/font.js'][546]++; + return ""; + } + _$jscoverage['plugins/font.js'][549]++; + if ((cmdName == "FontSize")) { + _$jscoverage['plugins/font.js'][550]++; + var styleVal = domUtils.getComputedStyle(startNode, style), tmp = /^([\d\.]+)(\w+)$/.exec(styleVal); + _$jscoverage['plugins/font.js'][553]++; + if (tmp) { + _$jscoverage['plugins/font.js'][555]++; + return (Math.floor(tmp[1]) + tmp[2]); + } + _$jscoverage['plugins/font.js'][559]++; + return styleVal; + } + _$jscoverage['plugins/font.js'][563]++; + return domUtils.getComputedStyle(startNode, style); +}), queryCommandState: (function (cmdName) { + _$jscoverage['plugins/font.js'][566]++; + if ((! needCmd[cmdName])) { + _$jscoverage['plugins/font.js'][567]++; + return 0; + } + _$jscoverage['plugins/font.js'][568]++; + var val = this.queryCommandValue(cmdName); + _$jscoverage['plugins/font.js'][569]++; + if ((cmdName == "fontborder")) { + _$jscoverage['plugins/font.js'][570]++; + return (/1px/.test(val) && /solid/.test(val)); + } + else { + _$jscoverage['plugins/font.js'][572]++; + return (val == ((cmdName == "underline")? "underline": "line-through")); + } +})}; +})(p, fonts[p]); +} +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/formatmatch.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/formatmatch.js new file mode 100644 index 000000000..0dbe004f9 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/formatmatch.js @@ -0,0 +1,237 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/formatmatch.js']) { + _$jscoverage['plugins/formatmatch.js'] = []; + _$jscoverage['plugins/formatmatch.js'][39] = 0; + _$jscoverage['plugins/formatmatch.js'][41] = 0; + _$jscoverage['plugins/formatmatch.js'][45] = 0; + _$jscoverage['plugins/formatmatch.js'][46] = 0; + _$jscoverage['plugins/formatmatch.js'][47] = 0; + _$jscoverage['plugins/formatmatch.js'][50] = 0; + _$jscoverage['plugins/formatmatch.js'][52] = 0; + _$jscoverage['plugins/formatmatch.js'][53] = 0; + _$jscoverage['plugins/formatmatch.js'][56] = 0; + _$jscoverage['plugins/formatmatch.js'][58] = 0; + _$jscoverage['plugins/formatmatch.js'][59] = 0; + _$jscoverage['plugins/formatmatch.js'][61] = 0; + _$jscoverage['plugins/formatmatch.js'][65] = 0; + _$jscoverage['plugins/formatmatch.js'][67] = 0; + _$jscoverage['plugins/formatmatch.js'][69] = 0; + _$jscoverage['plugins/formatmatch.js'][72] = 0; + _$jscoverage['plugins/formatmatch.js'][74] = 0; + _$jscoverage['plugins/formatmatch.js'][76] = 0; + _$jscoverage['plugins/formatmatch.js'][77] = 0; + _$jscoverage['plugins/formatmatch.js'][78] = 0; + _$jscoverage['plugins/formatmatch.js'][79] = 0; + _$jscoverage['plugins/formatmatch.js'][80] = 0; + _$jscoverage['plugins/formatmatch.js'][84] = 0; + _$jscoverage['plugins/formatmatch.js'][87] = 0; + _$jscoverage['plugins/formatmatch.js'][88] = 0; + _$jscoverage['plugins/formatmatch.js'][89] = 0; + _$jscoverage['plugins/formatmatch.js'][90] = 0; + _$jscoverage['plugins/formatmatch.js'][91] = 0; + _$jscoverage['plugins/formatmatch.js'][93] = 0; + _$jscoverage['plugins/formatmatch.js'][94] = 0; + _$jscoverage['plugins/formatmatch.js'][95] = 0; + _$jscoverage['plugins/formatmatch.js'][97] = 0; + _$jscoverage['plugins/formatmatch.js'][98] = 0; + _$jscoverage['plugins/formatmatch.js'][101] = 0; + _$jscoverage['plugins/formatmatch.js'][102] = 0; + _$jscoverage['plugins/formatmatch.js'][110] = 0; + _$jscoverage['plugins/formatmatch.js'][111] = 0; + _$jscoverage['plugins/formatmatch.js'][112] = 0; + _$jscoverage['plugins/formatmatch.js'][115] = 0; + _$jscoverage['plugins/formatmatch.js'][118] = 0; + _$jscoverage['plugins/formatmatch.js'][119] = 0; + _$jscoverage['plugins/formatmatch.js'][120] = 0; + _$jscoverage['plugins/formatmatch.js'][121] = 0; + _$jscoverage['plugins/formatmatch.js'][122] = 0; + _$jscoverage['plugins/formatmatch.js'][127] = 0; + _$jscoverage['plugins/formatmatch.js'][128] = 0; + _$jscoverage['plugins/formatmatch.js'][129] = 0; + _$jscoverage['plugins/formatmatch.js'][130] = 0; + _$jscoverage['plugins/formatmatch.js'][131] = 0; + _$jscoverage['plugins/formatmatch.js'][132] = 0; + _$jscoverage['plugins/formatmatch.js'][133] = 0; + _$jscoverage['plugins/formatmatch.js'][136] = 0; + _$jscoverage['plugins/formatmatch.js'][137] = 0; + _$jscoverage['plugins/formatmatch.js'][138] = 0; + _$jscoverage['plugins/formatmatch.js'][139] = 0; + _$jscoverage['plugins/formatmatch.js'][145] = 0; + _$jscoverage['plugins/formatmatch.js'][146] = 0; + _$jscoverage['plugins/formatmatch.js'][151] = 0; +} +_$jscoverage['plugins/formatmatch.js'].source = ["///import core","///import plugins\\removeformat.js","///commands 格式刷","///commandsName FormatMatch","///commandsTitle 格式刷","/**"," * 格式刷,只格式inline的"," * @file"," * @since 1.2.6.1"," */","","/**"," * 格式刷,对inline类型的文本内容执行格式刷操作"," * @command formatmatch"," * @method execCommand"," * @param { String } cmd 命令字符串"," * @example"," * ```javascript"," * //editor是编辑器实例"," * //获取格式刷"," * editor.execCommand( 'formatmatch' );"," * ```"," */","","/**"," * 获取当前的格式状态"," * @command formatmatch"," * @method queryCommandState"," * @param { String } cmd 命令字符串"," * @return { int } 如果当前的格式刷处于可用状态, 则返回1, 否则返回0"," * @example"," * ```javascript"," * //editor是编辑器实例"," * //获取当前选中的文本内容的上标状态"," * //output: 1 或者 0"," * console.log( editor.queryCommandState( '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"," };","};",""]; +_$jscoverage['plugins/formatmatch.js'][39]++; +UE.plugins.formatmatch = (function () { + _$jscoverage['plugins/formatmatch.js'][41]++; + var me = this, list = [], img, flag = 0; + _$jscoverage['plugins/formatmatch.js'][45]++; + me.addListener("reset", (function () { + _$jscoverage['plugins/formatmatch.js'][46]++; + list = []; + _$jscoverage['plugins/formatmatch.js'][47]++; + flag = 0; +})); + _$jscoverage['plugins/formatmatch.js'][50]++; + function addList(type, evt) { + _$jscoverage['plugins/formatmatch.js'][52]++; + if (browser.webkit) { + _$jscoverage['plugins/formatmatch.js'][53]++; + var target = ((evt.target.tagName == "IMG")? evt.target: null); + } + _$jscoverage['plugins/formatmatch.js'][56]++; + function addFormat(range) { + _$jscoverage['plugins/formatmatch.js'][58]++; + if (text) { + _$jscoverage['plugins/formatmatch.js'][59]++; + range.selectNode(text); + } + _$jscoverage['plugins/formatmatch.js'][61]++; + return range.applyInlineStyle(list[(list.length - 1)].tagName, null, list); +} + _$jscoverage['plugins/formatmatch.js'][65]++; + (me.undoManger && me.undoManger.save()); + _$jscoverage['plugins/formatmatch.js'][67]++; + var range = me.selection.getRange(), imgT = (target || range.getClosedNode()); + _$jscoverage['plugins/formatmatch.js'][69]++; + if ((img && imgT && (imgT.tagName == "IMG"))) { + _$jscoverage['plugins/formatmatch.js'][72]++; + imgT.style.cssText += (";float:" + (img.style.cssFloat || img.style.styleFloat || "none") + ";display:" + (img.style.display || "inline")); + _$jscoverage['plugins/formatmatch.js'][74]++; + img = null; + } + else { + _$jscoverage['plugins/formatmatch.js'][76]++; + if ((! img)) { + _$jscoverage['plugins/formatmatch.js'][77]++; + var collapsed = range.collapsed; + _$jscoverage['plugins/formatmatch.js'][78]++; + if (collapsed) { + _$jscoverage['plugins/formatmatch.js'][79]++; + var text = me.document.createTextNode("match"); + _$jscoverage['plugins/formatmatch.js'][80]++; + range.insertNode(text).select(); + } + _$jscoverage['plugins/formatmatch.js'][84]++; + me.__hasEnterExecCommand = true; + _$jscoverage['plugins/formatmatch.js'][87]++; + var removeFormatAttributes = me.options.removeFormatAttributes; + _$jscoverage['plugins/formatmatch.js'][88]++; + me.options.removeFormatAttributes = ""; + _$jscoverage['plugins/formatmatch.js'][89]++; + me.execCommand("removeformat"); + _$jscoverage['plugins/formatmatch.js'][90]++; + me.options.removeFormatAttributes = removeFormatAttributes; + _$jscoverage['plugins/formatmatch.js'][91]++; + me.__hasEnterExecCommand = false; + _$jscoverage['plugins/formatmatch.js'][93]++; + range = me.selection.getRange(); + _$jscoverage['plugins/formatmatch.js'][94]++; + if (list.length) { + _$jscoverage['plugins/formatmatch.js'][95]++; + addFormat(range); + } + _$jscoverage['plugins/formatmatch.js'][97]++; + if (text) { + _$jscoverage['plugins/formatmatch.js'][98]++; + range.setStartBefore(text).collapse(true); + } + _$jscoverage['plugins/formatmatch.js'][101]++; + range.select(); + _$jscoverage['plugins/formatmatch.js'][102]++; + (text && domUtils.remove(text)); + } + } + _$jscoverage['plugins/formatmatch.js'][110]++; + (me.undoManger && me.undoManger.save()); + _$jscoverage['plugins/formatmatch.js'][111]++; + me.removeListener("mouseup", addList); + _$jscoverage['plugins/formatmatch.js'][112]++; + flag = 0; +} + _$jscoverage['plugins/formatmatch.js'][115]++; + me.commands.formatmatch = {execCommand: (function (cmdName) { + _$jscoverage['plugins/formatmatch.js'][118]++; + if (flag) { + _$jscoverage['plugins/formatmatch.js'][119]++; + flag = 0; + _$jscoverage['plugins/formatmatch.js'][120]++; + list = []; + _$jscoverage['plugins/formatmatch.js'][121]++; + me.removeListener("mouseup", addList); + _$jscoverage['plugins/formatmatch.js'][122]++; + return; + } + _$jscoverage['plugins/formatmatch.js'][127]++; + var range = me.selection.getRange(); + _$jscoverage['plugins/formatmatch.js'][128]++; + img = range.getClosedNode(); + _$jscoverage['plugins/formatmatch.js'][129]++; + if (((! img) || (img.tagName != "IMG"))) { + _$jscoverage['plugins/formatmatch.js'][130]++; + range.collapse(true).shrinkBoundary(); + _$jscoverage['plugins/formatmatch.js'][131]++; + var start = range.startContainer; + _$jscoverage['plugins/formatmatch.js'][132]++; + list = domUtils.findParents(start, true, (function (node) { + _$jscoverage['plugins/formatmatch.js'][133]++; + return ((! domUtils.isBlockElm(node)) && (node.nodeType == 1)); +})); + _$jscoverage['plugins/formatmatch.js'][136]++; + for (var i = 0, ci; (ci = list[i]); (i++)) { + _$jscoverage['plugins/formatmatch.js'][137]++; + if ((ci.tagName == "A")) { + _$jscoverage['plugins/formatmatch.js'][138]++; + list.splice(i, 1); + _$jscoverage['plugins/formatmatch.js'][139]++; + break; + } +} + } + _$jscoverage['plugins/formatmatch.js'][145]++; + me.addListener("mouseup", addList); + _$jscoverage['plugins/formatmatch.js'][146]++; + flag = 1; +}), queryCommandState: (function () { + _$jscoverage['plugins/formatmatch.js'][151]++; + return flag; +}), notNeedUndo: 1}; +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/horizontal.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/horizontal.js new file mode 100644 index 000000000..f619da64d --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/horizontal.js @@ -0,0 +1,149 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/horizontal.js']) { + _$jscoverage['plugins/horizontal.js'] = []; + _$jscoverage['plugins/horizontal.js'][28] = 0; + _$jscoverage['plugins/horizontal.js'][29] = 0; + _$jscoverage['plugins/horizontal.js'][30] = 0; + _$jscoverage['plugins/horizontal.js'][32] = 0; + _$jscoverage['plugins/horizontal.js'][33] = 0; + _$jscoverage['plugins/horizontal.js'][34] = 0; + _$jscoverage['plugins/horizontal.js'][35] = 0; + _$jscoverage['plugins/horizontal.js'][37] = 0; + _$jscoverage['plugins/horizontal.js'][39] = 0; + _$jscoverage['plugins/horizontal.js'][40] = 0; + _$jscoverage['plugins/horizontal.js'][41] = 0; + _$jscoverage['plugins/horizontal.js'][42] = 0; + _$jscoverage['plugins/horizontal.js'][43] = 0; + _$jscoverage['plugins/horizontal.js'][44] = 0; + _$jscoverage['plugins/horizontal.js'][45] = 0; + _$jscoverage['plugins/horizontal.js'][48] = 0; + _$jscoverage['plugins/horizontal.js'][49] = 0; + _$jscoverage['plugins/horizontal.js'][50] = 0; + _$jscoverage['plugins/horizontal.js'][56] = 0; + _$jscoverage['plugins/horizontal.js'][62] = 0; + _$jscoverage['plugins/horizontal.js'][98] = 0; + _$jscoverage['plugins/horizontal.js'][99] = 0; + _$jscoverage['plugins/horizontal.js'][100] = 0; + _$jscoverage['plugins/horizontal.js'][101] = 0; + _$jscoverage['plugins/horizontal.js'][102] = 0; + _$jscoverage['plugins/horizontal.js'][103] = 0; + _$jscoverage['plugins/horizontal.js'][104] = 0; + _$jscoverage['plugins/horizontal.js'][105] = 0; + _$jscoverage['plugins/horizontal.js'][106] = 0; + _$jscoverage['plugins/horizontal.js'][107] = 0; + _$jscoverage['plugins/horizontal.js'][108] = 0; +} +_$jscoverage['plugins/horizontal.js'].source = ["/**"," * 插入分割线插件"," * @file"," * @since 1.2.6.1"," */","","/**"," * 插入分割线,分割线是hr标签"," * @command horizontal"," * @method execCommand"," * @param { String } cmdName 命令字符串"," * @example"," * ```javascript"," * editor.execCommand( 'horizontal' );"," * ```"," */","","/**"," * 查询当前是否允许插入分割线"," * @command horizontal"," * @method queryCommandState"," * @return { Int } 如果选区在表格里面,返回0,否则返回1"," * @example"," * ```javascript"," * editor.queryCommandState( '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','<hr>');"," 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;",""," }"," }",""," })","};",""]; +_$jscoverage['plugins/horizontal.js'][28]++; +UE.plugins.horizontal = (function () { + _$jscoverage['plugins/horizontal.js'][29]++; + var me = this; + _$jscoverage['plugins/horizontal.js'][30]++; + me.commands.horizontal = {execCommand: (function (cmdName) { + _$jscoverage['plugins/horizontal.js'][32]++; + var me = this; + _$jscoverage['plugins/horizontal.js'][33]++; + if ((me.queryCommandState(cmdName) !== -1)) { + _$jscoverage['plugins/horizontal.js'][34]++; + me.execCommand("insertHtml", "


    "); + _$jscoverage['plugins/horizontal.js'][35]++; + var range = me.selection.getRange(), start = range.startContainer; + _$jscoverage['plugins/horizontal.js'][37]++; + if (((start.nodeType == 1) && (! start.childNodes[range.startOffset]))) { + _$jscoverage['plugins/horizontal.js'][39]++; + var tmp; + _$jscoverage['plugins/horizontal.js'][40]++; + if ((tmp = start.childNodes[(range.startOffset - 1)])) { + _$jscoverage['plugins/horizontal.js'][41]++; + if (((tmp.nodeType == 1) && (tmp.tagName == "HR"))) { + _$jscoverage['plugins/horizontal.js'][42]++; + if ((me.options.enterTag == "p")) { + _$jscoverage['plugins/horizontal.js'][43]++; + tmp = me.document.createElement("p"); + _$jscoverage['plugins/horizontal.js'][44]++; + range.insertNode(tmp); + _$jscoverage['plugins/horizontal.js'][45]++; + range.setStart(tmp, 0).setCursor(); + } + else { + _$jscoverage['plugins/horizontal.js'][48]++; + tmp = me.document.createElement("br"); + _$jscoverage['plugins/horizontal.js'][49]++; + range.insertNode(tmp); + _$jscoverage['plugins/horizontal.js'][50]++; + range.setStartBefore(tmp).setCursor(); + } + } + } + } + _$jscoverage['plugins/horizontal.js'][56]++; + return true; + } +}), queryCommandState: (function () { + _$jscoverage['plugins/horizontal.js'][62]++; + return (domUtils.filterNodeList(this.selection.getStartElementPath(), "table")? -1: 0); +})}; + _$jscoverage['plugins/horizontal.js'][98]++; + me.addListener("delkeydown", (function (name, evt) { + _$jscoverage['plugins/horizontal.js'][99]++; + var rng = this.selection.getRange(); + _$jscoverage['plugins/horizontal.js'][100]++; + rng.txtToElmBoundary(true); + _$jscoverage['plugins/horizontal.js'][101]++; + if (domUtils.isStartInblock(rng)) { + _$jscoverage['plugins/horizontal.js'][102]++; + var tmpNode = rng.startContainer; + _$jscoverage['plugins/horizontal.js'][103]++; + var pre = tmpNode.previousSibling; + _$jscoverage['plugins/horizontal.js'][104]++; + if ((pre && domUtils.isTagNode(pre, "hr"))) { + _$jscoverage['plugins/horizontal.js'][105]++; + domUtils.remove(pre); + _$jscoverage['plugins/horizontal.js'][106]++; + rng.select(); + _$jscoverage['plugins/horizontal.js'][107]++; + domUtils.preventDefault(evt); + _$jscoverage['plugins/horizontal.js'][108]++; + return true; + } + } +})); +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/iframe.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/iframe.js new file mode 100644 index 000000000..33406b245 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/iframe.js @@ -0,0 +1,64 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/iframe.js']) { + _$jscoverage['plugins/iframe.js'] = []; + _$jscoverage['plugins/iframe.js'][8] = 0; + _$jscoverage['plugins/iframe.js'][9] = 0; + _$jscoverage['plugins/iframe.js'][10] = 0; + _$jscoverage['plugins/iframe.js'][11] = 0; + _$jscoverage['plugins/iframe.js'][14] = 0; + _$jscoverage['plugins/iframe.js'][15] = 0; +} +_$jscoverage['plugins/iframe.js'].source = ["///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();"," });","","};",""]; +_$jscoverage['plugins/iframe.js'][8]++; +UE.plugins.insertframe = (function () { + _$jscoverage['plugins/iframe.js'][9]++; + var me = this; + _$jscoverage['plugins/iframe.js'][10]++; + function deleteIframe() { + _$jscoverage['plugins/iframe.js'][11]++; + (me._iframe && (delete me._iframe)); +} + _$jscoverage['plugins/iframe.js'][14]++; + me.addListener("selectionchange", (function () { + _$jscoverage['plugins/iframe.js'][15]++; + deleteIframe(); +})); +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/image.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/image.js new file mode 100644 index 000000000..5c6b26110 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/image.js @@ -0,0 +1,354 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/image.js']) { + _$jscoverage['plugins/image.js'] = []; + _$jscoverage['plugins/image.js'][41] = 0; + _$jscoverage['plugins/image.js'][43] = 0; + _$jscoverage['plugins/image.js'][45] = 0; + _$jscoverage['plugins/image.js'][46] = 0; + _$jscoverage['plugins/image.js'][47] = 0; + _$jscoverage['plugins/image.js'][48] = 0; + _$jscoverage['plugins/image.js'][52] = 0; + _$jscoverage['plugins/image.js'][53] = 0; + _$jscoverage['plugins/image.js'][54] = 0; + _$jscoverage['plugins/image.js'][56] = 0; + _$jscoverage['plugins/image.js'][57] = 0; + _$jscoverage['plugins/image.js'][58] = 0; + _$jscoverage['plugins/image.js'][59] = 0; + _$jscoverage['plugins/image.js'][61] = 0; + _$jscoverage['plugins/image.js'][62] = 0; + _$jscoverage['plugins/image.js'][63] = 0; + _$jscoverage['plugins/image.js'][64] = 0; + _$jscoverage['plugins/image.js'][65] = 0; + _$jscoverage['plugins/image.js'][66] = 0; + _$jscoverage['plugins/image.js'][68] = 0; + _$jscoverage['plugins/image.js'][69] = 0; + _$jscoverage['plugins/image.js'][71] = 0; + _$jscoverage['plugins/image.js'][77] = 0; + _$jscoverage['plugins/image.js'][79] = 0; + _$jscoverage['plugins/image.js'][80] = 0; + _$jscoverage['plugins/image.js'][81] = 0; + _$jscoverage['plugins/image.js'][84] = 0; + _$jscoverage['plugins/image.js'][86] = 0; + _$jscoverage['plugins/image.js'][87] = 0; + _$jscoverage['plugins/image.js'][88] = 0; + _$jscoverage['plugins/image.js'][89] = 0; + _$jscoverage['plugins/image.js'][90] = 0; + _$jscoverage['plugins/image.js'][91] = 0; + _$jscoverage['plugins/image.js'][92] = 0; + _$jscoverage['plugins/image.js'][95] = 0; + _$jscoverage['plugins/image.js'][96] = 0; + _$jscoverage['plugins/image.js'][98] = 0; + _$jscoverage['plugins/image.js'][99] = 0; + _$jscoverage['plugins/image.js'][100] = 0; + _$jscoverage['plugins/image.js'][101] = 0; + _$jscoverage['plugins/image.js'][103] = 0; + _$jscoverage['plugins/image.js'][105] = 0; + _$jscoverage['plugins/image.js'][106] = 0; + _$jscoverage['plugins/image.js'][107] = 0; + _$jscoverage['plugins/image.js'][108] = 0; + _$jscoverage['plugins/image.js'][110] = 0; + _$jscoverage['plugins/image.js'][111] = 0; + _$jscoverage['plugins/image.js'][112] = 0; + _$jscoverage['plugins/image.js'][117] = 0; + _$jscoverage['plugins/image.js'][124] = 0; + _$jscoverage['plugins/image.js'][126] = 0; + _$jscoverage['plugins/image.js'][127] = 0; + _$jscoverage['plugins/image.js'][129] = 0; + _$jscoverage['plugins/image.js'][130] = 0; + _$jscoverage['plugins/image.js'][131] = 0; + _$jscoverage['plugins/image.js'][132] = 0; + _$jscoverage['plugins/image.js'][133] = 0; + _$jscoverage['plugins/image.js'][135] = 0; + _$jscoverage['plugins/image.js'][141] = 0; + _$jscoverage['plugins/image.js'][146] = 0; + _$jscoverage['plugins/image.js'][149] = 0; + _$jscoverage['plugins/image.js'][151] = 0; + _$jscoverage['plugins/image.js'][152] = 0; + _$jscoverage['plugins/image.js'][153] = 0; + _$jscoverage['plugins/image.js'][155] = 0; + _$jscoverage['plugins/image.js'][173] = 0; + _$jscoverage['plugins/image.js'][176] = 0; + _$jscoverage['plugins/image.js'][177] = 0; + _$jscoverage['plugins/image.js'][178] = 0; + _$jscoverage['plugins/image.js'][180] = 0; + _$jscoverage['plugins/image.js'][183] = 0; + _$jscoverage['plugins/image.js'][184] = 0; + _$jscoverage['plugins/image.js'][185] = 0; + _$jscoverage['plugins/image.js'][186] = 0; + _$jscoverage['plugins/image.js'][190] = 0; + _$jscoverage['plugins/image.js'][191] = 0; + _$jscoverage['plugins/image.js'][192] = 0; + _$jscoverage['plugins/image.js'][193] = 0; + _$jscoverage['plugins/image.js'][194] = 0; + _$jscoverage['plugins/image.js'][198] = 0; + _$jscoverage['plugins/image.js'][199] = 0; + _$jscoverage['plugins/image.js'][200] = 0; + _$jscoverage['plugins/image.js'][201] = 0; + _$jscoverage['plugins/image.js'][210] = 0; + _$jscoverage['plugins/image.js'][211] = 0; + _$jscoverage['plugins/image.js'][213] = 0; + _$jscoverage['plugins/image.js'][216] = 0; + _$jscoverage['plugins/image.js'][217] = 0; + _$jscoverage['plugins/image.js'][223] = 0; + _$jscoverage['plugins/image.js'][227] = 0; +} +_$jscoverage['plugins/image.js'].source = ["/**"," * 图片插入、排版插件"," * @file"," * @since 1.2.6.1"," */","","/**"," * 对图片居左居中居右排版"," * @command imagefloat"," * @method execCommand"," * @param { String } cmd 命令字符串"," * @param { String } align 对齐方式,可传left、right、none、center"," * @example"," * ```javascript"," * editor.execCommand( 'imagefloat', 'center' );"," * ```"," */","","/**"," * 如果选区所在位置是图片区域"," * @command imagefloat"," * @method queryCommandValue"," * @param { String } cmd 命令字符串"," * @return { String } 返回图片对齐方式"," * @example"," * ```javascript"," * editor.queryCommandValue( 'imagefloat' );"," * ```"," */","/**"," * 返回当前选区位置是否是图片"," * @command imagefloat"," * @method queryCommandState"," * @param { String } cmd 命令字符串"," * @return { int } 0为是,-1为不是"," * @example"," * ```javascript"," * editor.queryCommandState( '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') {"," 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', '<p id=\"_img_parent_tmp\" style=\"text-align:center\">' + pN.innerHTML + '</p>');",""," tmpNode = me.document.getElementById('_img_parent_tmp');"," tmpNode.removeAttribute('id');"," tmpNode = tmpNode.firstChild;"," range.selectNode(tmpNode).select();"," //去掉后边多余的元素"," next = tmpNode.parentNode.nextSibling;"," if (next && domUtils.isEmptyNode(next)) {"," domUtils.remove(next);"," }",""," }",""," break;"," }",""," }"," }"," },"," queryCommandValue:function () {"," var range = this.selection.getRange(),"," startNode, floatStyle;"," if (range.collapsed) {"," return 'none';"," }"," startNode = range.getClosedNode();"," if (startNode && startNode.nodeType == 1 && startNode.tagName == 'IMG') {"," floatStyle = startNode.getAttribute('align')||domUtils.getComputedStyle(startNode, 'float');"," 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 属性键值对,这些属性都将被复制到当前插入图片"," * @example"," * ```javascript"," * editor.execCommand( 'insertimage', {"," * src:'a/b/c.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 (img && /img/i.test(img.tagName) && img.className != \"edui-faked-video\" && !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 = '<img src=\"' + ci.src + '\" ' + (ci._src ? ' _src=\"' + ci._src + '\" ' : '') +"," (ci.width ? 'width=\"' + ci.width + '\" ' : '') +"," (ci.height ? ' height=\"' + ci.height + '\" ' : '') +"," (ci['floatStyle'] == 'left' || ci['floatStyle'] == 'right' ? ' style=\"float:' + ci['floatStyle'] + ';\"' : '') +"," (ci.title && ci.title != \"\" ? ' title=\"' + ci.title + '\"' : '') +"," (ci.border && ci.border != \"0\" ? ' border=\"' + ci.border + '\"' : '') +"," (ci.alt && ci.alt != \"\" ? ' alt=\"' + ci.alt + '\"' : '') +"," (ci.hspace && ci.hspace != \"0\" ? ' hspace = \"' + ci.hspace + '\"' : '') +"," (ci.vspace && ci.vspace != \"0\" ? ' vspace = \"' + ci.vspace + '\"' : '') + '/>';"," if (ci['floatStyle'] == 'center') {"," str = '<p style=\"text-align: center\">' + str + '</p>';"," }"," html.push(str);",""," } else {"," for (var i = 0; ci = opt[i++];) {"," str = '<p ' + (ci['floatStyle'] == 'center' ? 'style=\"text-align: center\" ' : '') + '><img src=\"' + ci.src + '\" ' +"," (ci.width ? 'width=\"' + ci.width + '\" ' : '') + (ci._src ? ' _src=\"' + ci._src + '\" ' : '') +"," (ci.height ? ' height=\"' + ci.height + '\" ' : '') +"," ' style=\"' + (ci['floatStyle'] && ci['floatStyle'] != 'center' ? 'float:' + ci['floatStyle'] + ';' : '') +"," (ci.border || '') + '\" ' +"," (ci.title ? ' title=\"' + ci.title + '\"' : '') + ' /></p>';"," html.push(str);"," }"," }",""," me.execCommand('insertHtml', html.join(''));"," }"," }","};"]; +_$jscoverage['plugins/image.js'][41]++; +UE.commands.imagefloat = {execCommand: (function (cmd, align) { + _$jscoverage['plugins/image.js'][43]++; + var me = this, range = me.selection.getRange(); + _$jscoverage['plugins/image.js'][45]++; + if ((! range.collapsed)) { + _$jscoverage['plugins/image.js'][46]++; + var img = range.getClosedNode(); + _$jscoverage['plugins/image.js'][47]++; + if ((img && (img.tagName == "IMG"))) { + _$jscoverage['plugins/image.js'][48]++; + switch (align) { + case "left": + case "right": + case "none": + _$jscoverage['plugins/image.js'][52]++; + var pN = img.parentNode, tmpNode, pre, next; + _$jscoverage['plugins/image.js'][53]++; + while ((dtd.$inline[pN.tagName] || (pN.tagName == "A"))) { + _$jscoverage['plugins/image.js'][54]++; + pN = pN.parentNode; +} + _$jscoverage['plugins/image.js'][56]++; + tmpNode = pN; + _$jscoverage['plugins/image.js'][57]++; + if (((tmpNode.tagName == "P") && (domUtils.getStyle(tmpNode, "text-align") == "center"))) { + _$jscoverage['plugins/image.js'][58]++; + if (((! domUtils.isBody(tmpNode)) && (domUtils.getChildCount(tmpNode, (function (node) { + _$jscoverage['plugins/image.js'][59]++; + return ((! domUtils.isBr(node)) && (! domUtils.isWhitespace(node))); +})) == 1))) { + _$jscoverage['plugins/image.js'][61]++; + pre = tmpNode.previousSibling; + _$jscoverage['plugins/image.js'][62]++; + next = tmpNode.nextSibling; + _$jscoverage['plugins/image.js'][63]++; + if ((pre && next && (pre.nodeType == 1) && (next.nodeType == 1) && (pre.tagName == next.tagName) && domUtils.isBlockElm(pre))) { + _$jscoverage['plugins/image.js'][64]++; + pre.appendChild(tmpNode.firstChild); + _$jscoverage['plugins/image.js'][65]++; + while (next.firstChild) { + _$jscoverage['plugins/image.js'][66]++; + pre.appendChild(next.firstChild); +} + _$jscoverage['plugins/image.js'][68]++; + domUtils.remove(tmpNode); + _$jscoverage['plugins/image.js'][69]++; + domUtils.remove(next); + } + else { + _$jscoverage['plugins/image.js'][71]++; + domUtils.setStyle(tmpNode, "text-align", ""); + } + } + _$jscoverage['plugins/image.js'][77]++; + range.selectNode(img).select(); + } + _$jscoverage['plugins/image.js'][79]++; + domUtils.setStyle(img, "float", ((align == "none")? "": align)); + _$jscoverage['plugins/image.js'][80]++; + if ((align == "none")) { + _$jscoverage['plugins/image.js'][81]++; + domUtils.removeAttributes(img, "align"); + } + _$jscoverage['plugins/image.js'][84]++; + break; + case "center": + _$jscoverage['plugins/image.js'][86]++; + if ((me.queryCommandValue("imagefloat") != "center")) { + _$jscoverage['plugins/image.js'][87]++; + pN = img.parentNode; + _$jscoverage['plugins/image.js'][88]++; + domUtils.setStyle(img, "float", ""); + _$jscoverage['plugins/image.js'][89]++; + domUtils.removeAttributes(img, "align"); + _$jscoverage['plugins/image.js'][90]++; + tmpNode = img; + _$jscoverage['plugins/image.js'][91]++; + while ((pN && (domUtils.getChildCount(pN, (function (node) { + _$jscoverage['plugins/image.js'][92]++; + return ((! domUtils.isBr(node)) && (! domUtils.isWhitespace(node))); +})) == 1) && (dtd.$inline[pN.tagName] || (pN.tagName == "A")))) { + _$jscoverage['plugins/image.js'][95]++; + tmpNode = pN; + _$jscoverage['plugins/image.js'][96]++; + pN = pN.parentNode; +} + _$jscoverage['plugins/image.js'][98]++; + range.setStartBefore(tmpNode).setCursor(false); + _$jscoverage['plugins/image.js'][99]++; + pN = me.document.createElement("div"); + _$jscoverage['plugins/image.js'][100]++; + pN.appendChild(tmpNode); + _$jscoverage['plugins/image.js'][101]++; + domUtils.setStyle(tmpNode, "float", ""); + _$jscoverage['plugins/image.js'][103]++; + me.execCommand("insertHtml", ("

    " + pN.innerHTML + "

    ")); + _$jscoverage['plugins/image.js'][105]++; + tmpNode = me.document.getElementById("_img_parent_tmp"); + _$jscoverage['plugins/image.js'][106]++; + tmpNode.removeAttribute("id"); + _$jscoverage['plugins/image.js'][107]++; + tmpNode = tmpNode.firstChild; + _$jscoverage['plugins/image.js'][108]++; + range.selectNode(tmpNode).select(); + _$jscoverage['plugins/image.js'][110]++; + next = tmpNode.parentNode.nextSibling; + _$jscoverage['plugins/image.js'][111]++; + if ((next && domUtils.isEmptyNode(next))) { + _$jscoverage['plugins/image.js'][112]++; + domUtils.remove(next); + } + } + _$jscoverage['plugins/image.js'][117]++; + break; + } + } + } +}), queryCommandValue: (function () { + _$jscoverage['plugins/image.js'][124]++; + var range = this.selection.getRange(), startNode, floatStyle; + _$jscoverage['plugins/image.js'][126]++; + if (range.collapsed) { + _$jscoverage['plugins/image.js'][127]++; + return "none"; + } + _$jscoverage['plugins/image.js'][129]++; + startNode = range.getClosedNode(); + _$jscoverage['plugins/image.js'][130]++; + if ((startNode && (startNode.nodeType == 1) && (startNode.tagName == "IMG"))) { + _$jscoverage['plugins/image.js'][131]++; + floatStyle = (startNode.getAttribute("align") || domUtils.getComputedStyle(startNode, "float")); + _$jscoverage['plugins/image.js'][132]++; + if ((floatStyle == "none")) { + _$jscoverage['plugins/image.js'][133]++; + floatStyle = ((domUtils.getComputedStyle(startNode.parentNode, "text-align") == "center")? "center": floatStyle); + } + _$jscoverage['plugins/image.js'][135]++; + return ({left: 1, right: 1, center: 1}[floatStyle]? floatStyle: "none"); + } + _$jscoverage['plugins/image.js'][141]++; + return "none"; +}), queryCommandState: (function () { + _$jscoverage['plugins/image.js'][146]++; + var range = this.selection.getRange(), startNode; + _$jscoverage['plugins/image.js'][149]++; + if (range.collapsed) { + _$jscoverage['plugins/image.js'][149]++; + return -1; + } + _$jscoverage['plugins/image.js'][151]++; + startNode = range.getClosedNode(); + _$jscoverage['plugins/image.js'][152]++; + if ((startNode && (startNode.nodeType == 1) && (startNode.tagName == "IMG"))) { + _$jscoverage['plugins/image.js'][153]++; + return 0; + } + _$jscoverage['plugins/image.js'][155]++; + return -1; +})}; +_$jscoverage['plugins/image.js'][173]++; +UE.commands.insertimage = {execCommand: (function (cmd, opt) { + _$jscoverage['plugins/image.js'][176]++; + opt = (utils.isArray(opt)? opt: [opt]); + _$jscoverage['plugins/image.js'][177]++; + if ((! opt.length)) { + _$jscoverage['plugins/image.js'][178]++; + return; + } + _$jscoverage['plugins/image.js'][180]++; + var me = this, range = me.selection.getRange(), img = range.getClosedNode(); + _$jscoverage['plugins/image.js'][183]++; + if ((img && /img/i.test(img.tagName) && (img.className != "edui-faked-video") && (! img.getAttribute("word_img")))) { + _$jscoverage['plugins/image.js'][184]++; + var first = opt.shift(); + _$jscoverage['plugins/image.js'][185]++; + var floatStyle = first.floatStyle; + _$jscoverage['plugins/image.js'][186]++; + (delete first.floatStyle); + _$jscoverage['plugins/image.js'][190]++; + domUtils.setAttributes(img, first); + _$jscoverage['plugins/image.js'][191]++; + me.execCommand("imagefloat", floatStyle); + _$jscoverage['plugins/image.js'][192]++; + if ((opt.length > 0)) { + _$jscoverage['plugins/image.js'][193]++; + range.setStartAfter(img).setCursor(false, true); + _$jscoverage['plugins/image.js'][194]++; + me.execCommand("insertimage", opt); + } + } + else { + _$jscoverage['plugins/image.js'][198]++; + var html = [], str = "", ci; + _$jscoverage['plugins/image.js'][199]++; + ci = opt[0]; + _$jscoverage['plugins/image.js'][200]++; + if ((opt.length == 1)) { + _$jscoverage['plugins/image.js'][201]++; + str = ("\"""); + _$jscoverage['plugins/image.js'][210]++; + if ((ci.floatStyle == "center")) { + _$jscoverage['plugins/image.js'][211]++; + str = ("

    " + str + "

    "); + } + _$jscoverage['plugins/image.js'][213]++; + html.push(str); + } + else { + _$jscoverage['plugins/image.js'][216]++; + for (var i = 0; (ci = opt[(i++)]);) { + _$jscoverage['plugins/image.js'][217]++; + str = ("

    "); + _$jscoverage['plugins/image.js'][223]++; + html.push(str); +} + } + _$jscoverage['plugins/image.js'][227]++; + me.execCommand("insertHtml", html.join("")); + } +})}; diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/indent.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/indent.js new file mode 100644 index 000000000..83ae81e5c --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/indent.js @@ -0,0 +1,60 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/indent.js']) { + _$jscoverage['plugins/indent.js'] = []; + _$jscoverage['plugins/indent.js'][30] = 0; + _$jscoverage['plugins/indent.js'][32] = 0; + _$jscoverage['plugins/indent.js'][33] = 0; + _$jscoverage['plugins/indent.js'][36] = 0; + _$jscoverage['plugins/indent.js'][37] = 0; +} +_$jscoverage['plugins/indent.js'].source = ["/**"," * 缩进"," * @file"," * @since 1.2.6.1"," */","","/**"," * 给选区内文本添加缩进"," * @command indent"," * @method execCommand"," * @param { String } cmd 命令字符串"," * @example"," * ```javascript"," * editor.execCommand( 'indent' );"," * ```"," */","","/**"," * 返回当前选区位置是否有缩进"," * @command indent"," * @method queryCommandState"," * @param { String } cmd 命令字符串"," * @return { int } 0为不是,1为是"," * @example"," * ```javascript"," * editor.queryCommandState( '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;"," }","","};"]; +_$jscoverage['plugins/indent.js'][30]++; +UE.commands.indent = {execCommand: (function () { + _$jscoverage['plugins/indent.js'][32]++; + var me = this, value = (me.queryCommandState("indent")? "0em": (me.options.indentValue || "2em")); + _$jscoverage['plugins/indent.js'][33]++; + me.execCommand("Paragraph", "p", {style: ("text-indent:" + value)}); +}), queryCommandState: (function () { + _$jscoverage['plugins/indent.js'][36]++; + var pN = domUtils.filterNodeList(this.selection.getStartElementPath(), "p h1 h2 h3 h4 h5 h6"); + _$jscoverage['plugins/indent.js'][37]++; + return ((pN && pN.style.textIndent && parseInt(pN.style.textIndent))? 1: 0); +})}; diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/insertcode.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/insertcode.js new file mode 100644 index 000000000..a870678b8 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/insertcode.js @@ -0,0 +1,1066 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/insertcode.js']) { + _$jscoverage['plugins/insertcode.js'] = []; + _$jscoverage['plugins/insertcode.js'][7] = 0; + _$jscoverage['plugins/insertcode.js'][8] = 0; + _$jscoverage['plugins/insertcode.js'][9] = 0; + _$jscoverage['plugins/insertcode.js'][10] = 0; + _$jscoverage['plugins/insertcode.js'][13] = 0; + _$jscoverage['plugins/insertcode.js'][63] = 0; + _$jscoverage['plugins/insertcode.js'][65] = 0; + _$jscoverage['plugins/insertcode.js'][68] = 0; + _$jscoverage['plugins/insertcode.js'][69] = 0; + _$jscoverage['plugins/insertcode.js'][71] = 0; + _$jscoverage['plugins/insertcode.js'][72] = 0; + _$jscoverage['plugins/insertcode.js'][73] = 0; + _$jscoverage['plugins/insertcode.js'][75] = 0; + _$jscoverage['plugins/insertcode.js'][76] = 0; + _$jscoverage['plugins/insertcode.js'][77] = 0; + _$jscoverage['plugins/insertcode.js'][79] = 0; + _$jscoverage['plugins/insertcode.js'][80] = 0; + _$jscoverage['plugins/insertcode.js'][82] = 0; + _$jscoverage['plugins/insertcode.js'][83] = 0; + _$jscoverage['plugins/insertcode.js'][84] = 0; + _$jscoverage['plugins/insertcode.js'][85] = 0; + _$jscoverage['plugins/insertcode.js'][86] = 0; + _$jscoverage['plugins/insertcode.js'][87] = 0; + _$jscoverage['plugins/insertcode.js'][88] = 0; + _$jscoverage['plugins/insertcode.js'][89] = 0; + _$jscoverage['plugins/insertcode.js'][90] = 0; + _$jscoverage['plugins/insertcode.js'][91] = 0; + _$jscoverage['plugins/insertcode.js'][94] = 0; + _$jscoverage['plugins/insertcode.js'][97] = 0; + _$jscoverage['plugins/insertcode.js'][98] = 0; + _$jscoverage['plugins/insertcode.js'][102] = 0; + _$jscoverage['plugins/insertcode.js'][104] = 0; + _$jscoverage['plugins/insertcode.js'][105] = 0; + _$jscoverage['plugins/insertcode.js'][108] = 0; + _$jscoverage['plugins/insertcode.js'][110] = 0; + _$jscoverage['plugins/insertcode.js'][111] = 0; + _$jscoverage['plugins/insertcode.js'][112] = 0; + _$jscoverage['plugins/insertcode.js'][113] = 0; + _$jscoverage['plugins/insertcode.js'][114] = 0; + _$jscoverage['plugins/insertcode.js'][115] = 0; + _$jscoverage['plugins/insertcode.js'][116] = 0; + _$jscoverage['plugins/insertcode.js'][117] = 0; + _$jscoverage['plugins/insertcode.js'][118] = 0; + _$jscoverage['plugins/insertcode.js'][119] = 0; + _$jscoverage['plugins/insertcode.js'][122] = 0; + _$jscoverage['plugins/insertcode.js'][125] = 0; + _$jscoverage['plugins/insertcode.js'][126] = 0; + _$jscoverage['plugins/insertcode.js'][130] = 0; + _$jscoverage['plugins/insertcode.js'][132] = 0; + _$jscoverage['plugins/insertcode.js'][133] = 0; + _$jscoverage['plugins/insertcode.js'][137] = 0; + _$jscoverage['plugins/insertcode.js'][138] = 0; + _$jscoverage['plugins/insertcode.js'][139] = 0; + _$jscoverage['plugins/insertcode.js'][140] = 0; + _$jscoverage['plugins/insertcode.js'][141] = 0; + _$jscoverage['plugins/insertcode.js'][149] = 0; + _$jscoverage['plugins/insertcode.js'][151] = 0; + _$jscoverage['plugins/insertcode.js'][152] = 0; + _$jscoverage['plugins/insertcode.js'][153] = 0; + _$jscoverage['plugins/insertcode.js'][155] = 0; + _$jscoverage['plugins/insertcode.js'][157] = 0; + _$jscoverage['plugins/insertcode.js'][159] = 0; + _$jscoverage['plugins/insertcode.js'][160] = 0; + _$jscoverage['plugins/insertcode.js'][161] = 0; + _$jscoverage['plugins/insertcode.js'][163] = 0; + _$jscoverage['plugins/insertcode.js'][171] = 0; + _$jscoverage['plugins/insertcode.js'][172] = 0; + _$jscoverage['plugins/insertcode.js'][173] = 0; + _$jscoverage['plugins/insertcode.js'][174] = 0; + _$jscoverage['plugins/insertcode.js'][175] = 0; + _$jscoverage['plugins/insertcode.js'][176] = 0; + _$jscoverage['plugins/insertcode.js'][177] = 0; + _$jscoverage['plugins/insertcode.js'][180] = 0; + _$jscoverage['plugins/insertcode.js'][184] = 0; + _$jscoverage['plugins/insertcode.js'][185] = 0; + _$jscoverage['plugins/insertcode.js'][186] = 0; + _$jscoverage['plugins/insertcode.js'][187] = 0; + _$jscoverage['plugins/insertcode.js'][188] = 0; + _$jscoverage['plugins/insertcode.js'][189] = 0; + _$jscoverage['plugins/insertcode.js'][190] = 0; + _$jscoverage['plugins/insertcode.js'][191] = 0; + _$jscoverage['plugins/insertcode.js'][193] = 0; + _$jscoverage['plugins/insertcode.js'][195] = 0; + _$jscoverage['plugins/insertcode.js'][196] = 0; + _$jscoverage['plugins/insertcode.js'][197] = 0; + _$jscoverage['plugins/insertcode.js'][198] = 0; + _$jscoverage['plugins/insertcode.js'][199] = 0; + _$jscoverage['plugins/insertcode.js'][200] = 0; + _$jscoverage['plugins/insertcode.js'][201] = 0; + _$jscoverage['plugins/insertcode.js'][203] = 0; + _$jscoverage['plugins/insertcode.js'][207] = 0; + _$jscoverage['plugins/insertcode.js'][208] = 0; + _$jscoverage['plugins/insertcode.js'][209] = 0; + _$jscoverage['plugins/insertcode.js'][210] = 0; + _$jscoverage['plugins/insertcode.js'][211] = 0; + _$jscoverage['plugins/insertcode.js'][214] = 0; + _$jscoverage['plugins/insertcode.js'][216] = 0; + _$jscoverage['plugins/insertcode.js'][217] = 0; + _$jscoverage['plugins/insertcode.js'][219] = 0; + _$jscoverage['plugins/insertcode.js'][226] = 0; + _$jscoverage['plugins/insertcode.js'][230] = 0; + _$jscoverage['plugins/insertcode.js'][247] = 0; + _$jscoverage['plugins/insertcode.js'][248] = 0; + _$jscoverage['plugins/insertcode.js'][249] = 0; + _$jscoverage['plugins/insertcode.js'][251] = 0; + _$jscoverage['plugins/insertcode.js'][252] = 0; + _$jscoverage['plugins/insertcode.js'][254] = 0; + _$jscoverage['plugins/insertcode.js'][256] = 0; + _$jscoverage['plugins/insertcode.js'][257] = 0; + _$jscoverage['plugins/insertcode.js'][258] = 0; + _$jscoverage['plugins/insertcode.js'][259] = 0; + _$jscoverage['plugins/insertcode.js'][260] = 0; + _$jscoverage['plugins/insertcode.js'][261] = 0; + _$jscoverage['plugins/insertcode.js'][262] = 0; + _$jscoverage['plugins/insertcode.js'][264] = 0; + _$jscoverage['plugins/insertcode.js'][265] = 0; + _$jscoverage['plugins/insertcode.js'][266] = 0; + _$jscoverage['plugins/insertcode.js'][267] = 0; + _$jscoverage['plugins/insertcode.js'][268] = 0; + _$jscoverage['plugins/insertcode.js'][269] = 0; + _$jscoverage['plugins/insertcode.js'][271] = 0; + _$jscoverage['plugins/insertcode.js'][273] = 0; + _$jscoverage['plugins/insertcode.js'][274] = 0; + _$jscoverage['plugins/insertcode.js'][275] = 0; + _$jscoverage['plugins/insertcode.js'][276] = 0; + _$jscoverage['plugins/insertcode.js'][277] = 0; + _$jscoverage['plugins/insertcode.js'][278] = 0; + _$jscoverage['plugins/insertcode.js'][279] = 0; + _$jscoverage['plugins/insertcode.js'][280] = 0; + _$jscoverage['plugins/insertcode.js'][283] = 0; + _$jscoverage['plugins/insertcode.js'][284] = 0; + _$jscoverage['plugins/insertcode.js'][285] = 0; + _$jscoverage['plugins/insertcode.js'][286] = 0; + _$jscoverage['plugins/insertcode.js'][287] = 0; + _$jscoverage['plugins/insertcode.js'][289] = 0; + _$jscoverage['plugins/insertcode.js'][290] = 0; + _$jscoverage['plugins/insertcode.js'][291] = 0; + _$jscoverage['plugins/insertcode.js'][292] = 0; + _$jscoverage['plugins/insertcode.js'][296] = 0; + _$jscoverage['plugins/insertcode.js'][297] = 0; + _$jscoverage['plugins/insertcode.js'][298] = 0; + _$jscoverage['plugins/insertcode.js'][301] = 0; + _$jscoverage['plugins/insertcode.js'][303] = 0; + _$jscoverage['plugins/insertcode.js'][305] = 0; + _$jscoverage['plugins/insertcode.js'][306] = 0; + _$jscoverage['plugins/insertcode.js'][307] = 0; + _$jscoverage['plugins/insertcode.js'][308] = 0; + _$jscoverage['plugins/insertcode.js'][309] = 0; + _$jscoverage['plugins/insertcode.js'][310] = 0; + _$jscoverage['plugins/insertcode.js'][311] = 0; + _$jscoverage['plugins/insertcode.js'][312] = 0; + _$jscoverage['plugins/insertcode.js'][315] = 0; + _$jscoverage['plugins/insertcode.js'][316] = 0; + _$jscoverage['plugins/insertcode.js'][317] = 0; + _$jscoverage['plugins/insertcode.js'][318] = 0; + _$jscoverage['plugins/insertcode.js'][319] = 0; + _$jscoverage['plugins/insertcode.js'][321] = 0; + _$jscoverage['plugins/insertcode.js'][325] = 0; + _$jscoverage['plugins/insertcode.js'][326] = 0; + _$jscoverage['plugins/insertcode.js'][327] = 0; + _$jscoverage['plugins/insertcode.js'][328] = 0; + _$jscoverage['plugins/insertcode.js'][329] = 0; + _$jscoverage['plugins/insertcode.js'][330] = 0; + _$jscoverage['plugins/insertcode.js'][331] = 0; + _$jscoverage['plugins/insertcode.js'][332] = 0; + _$jscoverage['plugins/insertcode.js'][333] = 0; + _$jscoverage['plugins/insertcode.js'][334] = 0; + _$jscoverage['plugins/insertcode.js'][335] = 0; + _$jscoverage['plugins/insertcode.js'][336] = 0; + _$jscoverage['plugins/insertcode.js'][339] = 0; + _$jscoverage['plugins/insertcode.js'][340] = 0; + _$jscoverage['plugins/insertcode.js'][341] = 0; + _$jscoverage['plugins/insertcode.js'][342] = 0; + _$jscoverage['plugins/insertcode.js'][343] = 0; + _$jscoverage['plugins/insertcode.js'][345] = 0; + _$jscoverage['plugins/insertcode.js'][346] = 0; + _$jscoverage['plugins/insertcode.js'][347] = 0; + _$jscoverage['plugins/insertcode.js'][348] = 0; + _$jscoverage['plugins/insertcode.js'][353] = 0; + _$jscoverage['plugins/insertcode.js'][354] = 0; + _$jscoverage['plugins/insertcode.js'][356] = 0; + _$jscoverage['plugins/insertcode.js'][361] = 0; + _$jscoverage['plugins/insertcode.js'][362] = 0; + _$jscoverage['plugins/insertcode.js'][368] = 0; + _$jscoverage['plugins/insertcode.js'][369] = 0; + _$jscoverage['plugins/insertcode.js'][370] = 0; + _$jscoverage['plugins/insertcode.js'][371] = 0; + _$jscoverage['plugins/insertcode.js'][372] = 0; + _$jscoverage['plugins/insertcode.js'][373] = 0; + _$jscoverage['plugins/insertcode.js'][436] = 0; + _$jscoverage['plugins/insertcode.js'][437] = 0; + _$jscoverage['plugins/insertcode.js'][438] = 0; + _$jscoverage['plugins/insertcode.js'][440] = 0; + _$jscoverage['plugins/insertcode.js'][441] = 0; + _$jscoverage['plugins/insertcode.js'][442] = 0; + _$jscoverage['plugins/insertcode.js'][444] = 0; + _$jscoverage['plugins/insertcode.js'][446] = 0; + _$jscoverage['plugins/insertcode.js'][447] = 0; + _$jscoverage['plugins/insertcode.js'][449] = 0; + _$jscoverage['plugins/insertcode.js'][451] = 0; + _$jscoverage['plugins/insertcode.js'][453] = 0; + _$jscoverage['plugins/insertcode.js'][454] = 0; + _$jscoverage['plugins/insertcode.js'][455] = 0; + _$jscoverage['plugins/insertcode.js'][456] = 0; + _$jscoverage['plugins/insertcode.js'][459] = 0; + _$jscoverage['plugins/insertcode.js'][460] = 0; + _$jscoverage['plugins/insertcode.js'][461] = 0; + _$jscoverage['plugins/insertcode.js'][462] = 0; + _$jscoverage['plugins/insertcode.js'][464] = 0; + _$jscoverage['plugins/insertcode.js'][467] = 0; + _$jscoverage['plugins/insertcode.js'][469] = 0; + _$jscoverage['plugins/insertcode.js'][471] = 0; + _$jscoverage['plugins/insertcode.js'][472] = 0; + _$jscoverage['plugins/insertcode.js'][477] = 0; + _$jscoverage['plugins/insertcode.js'][478] = 0; + _$jscoverage['plugins/insertcode.js'][485] = 0; + _$jscoverage['plugins/insertcode.js'][486] = 0; + _$jscoverage['plugins/insertcode.js'][489] = 0; + _$jscoverage['plugins/insertcode.js'][490] = 0; + _$jscoverage['plugins/insertcode.js'][491] = 0; + _$jscoverage['plugins/insertcode.js'][493] = 0; + _$jscoverage['plugins/insertcode.js'][494] = 0; + _$jscoverage['plugins/insertcode.js'][496] = 0; + _$jscoverage['plugins/insertcode.js'][497] = 0; + _$jscoverage['plugins/insertcode.js'][498] = 0; + _$jscoverage['plugins/insertcode.js'][499] = 0; + _$jscoverage['plugins/insertcode.js'][500] = 0; + _$jscoverage['plugins/insertcode.js'][501] = 0; + _$jscoverage['plugins/insertcode.js'][502] = 0; + _$jscoverage['plugins/insertcode.js'][503] = 0; + _$jscoverage['plugins/insertcode.js'][504] = 0; + _$jscoverage['plugins/insertcode.js'][505] = 0; + _$jscoverage['plugins/insertcode.js'][506] = 0; + _$jscoverage['plugins/insertcode.js'][509] = 0; + _$jscoverage['plugins/insertcode.js'][512] = 0; + _$jscoverage['plugins/insertcode.js'][513] = 0; + _$jscoverage['plugins/insertcode.js'][517] = 0; + _$jscoverage['plugins/insertcode.js'][519] = 0; + _$jscoverage['plugins/insertcode.js'][520] = 0; + _$jscoverage['plugins/insertcode.js'][523] = 0; + _$jscoverage['plugins/insertcode.js'][524] = 0; + _$jscoverage['plugins/insertcode.js'][526] = 0; + _$jscoverage['plugins/insertcode.js'][528] = 0; + _$jscoverage['plugins/insertcode.js'][529] = 0; + _$jscoverage['plugins/insertcode.js'][530] = 0; + _$jscoverage['plugins/insertcode.js'][531] = 0; + _$jscoverage['plugins/insertcode.js'][532] = 0; + _$jscoverage['plugins/insertcode.js'][533] = 0; + _$jscoverage['plugins/insertcode.js'][534] = 0; + _$jscoverage['plugins/insertcode.js'][535] = 0; + _$jscoverage['plugins/insertcode.js'][537] = 0; + _$jscoverage['plugins/insertcode.js'][538] = 0; + _$jscoverage['plugins/insertcode.js'][539] = 0; + _$jscoverage['plugins/insertcode.js'][543] = 0; + _$jscoverage['plugins/insertcode.js'][547] = 0; + _$jscoverage['plugins/insertcode.js'][548] = 0; + _$jscoverage['plugins/insertcode.js'][552] = 0; + _$jscoverage['plugins/insertcode.js'][554] = 0; + _$jscoverage['plugins/insertcode.js'][555] = 0; + _$jscoverage['plugins/insertcode.js'][560] = 0; + _$jscoverage['plugins/insertcode.js'][564] = 0; + _$jscoverage['plugins/insertcode.js'][568] = 0; + _$jscoverage['plugins/insertcode.js'][569] = 0; + _$jscoverage['plugins/insertcode.js'][570] = 0; + _$jscoverage['plugins/insertcode.js'][571] = 0; + _$jscoverage['plugins/insertcode.js'][572] = 0; + _$jscoverage['plugins/insertcode.js'][573] = 0; + _$jscoverage['plugins/insertcode.js'][574] = 0; + _$jscoverage['plugins/insertcode.js'][575] = 0; + _$jscoverage['plugins/insertcode.js'][577] = 0; + _$jscoverage['plugins/insertcode.js'][578] = 0; + _$jscoverage['plugins/insertcode.js'][579] = 0; + _$jscoverage['plugins/insertcode.js'][586] = 0; + _$jscoverage['plugins/insertcode.js'][587] = 0; + _$jscoverage['plugins/insertcode.js'][588] = 0; + _$jscoverage['plugins/insertcode.js'][589] = 0; + _$jscoverage['plugins/insertcode.js'][590] = 0; + _$jscoverage['plugins/insertcode.js'][591] = 0; + _$jscoverage['plugins/insertcode.js'][592] = 0; + _$jscoverage['plugins/insertcode.js'][593] = 0; + _$jscoverage['plugins/insertcode.js'][594] = 0; + _$jscoverage['plugins/insertcode.js'][595] = 0; + _$jscoverage['plugins/insertcode.js'][596] = 0; + _$jscoverage['plugins/insertcode.js'][597] = 0; +} +_$jscoverage['plugins/insertcode.js'].source = ["/**"," * 插入代码插件"," * @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.version > 8 ? '' : '&nbsp;'):'<br/>';"," }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.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){",""," if(node.type =='element'){"," if(node.tagName == 'br'){"," code += '<br>'"," }else if(!dtd.$empty[node.tagName]){"," utils.each(node.children,function(cn){"," if(cn.type =='element'){"," if(cn.tagName == 'br'){"," code += '<br>'"," }else if(!dtd.$empty[node.tagName]){"," code += cn.innerText();"," }"," }else{"," code += cn.data"," }"," });"," if(!/br>$/.test(code)){"," code += '<br>';"," }"," }"," }else{"," code += node.data + '<br>'"," }"," if(!node.nextSibling() && /<br>$/.test(code)){"," code = code.replace(/<br>$/,'');"," }",""," }else{"," code += (node.type == 'element' ? (dtd.$empty[node.tagName] ? '' : node.innerText()) : node.data);"," if(!/br\\/?\\s*>$/.test(code)){"," if(!node.nextSibling())"," return;"," code += '<br>'"," }"," }",""," }",""," });"," }"," me.execCommand('inserthtml','<pre id=\"coder\"class=\"brush:'+lang+';toolbar:false\">'+code+'</pre>',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.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.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,'&nbsp;').replace(/\\n$/,'');"," }else{"," if(n.tagName == 'br'){"," code += '\\n'"," }else{"," code += (!dtd.$empty[n.tagName] ? '' : n.innerText());"," }",""," }",""," });",""," pre.innerText(code.replace(/(&nbsp;|\\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,"," highlightcode: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 ){"," var tmpNode = me.document.createElement('br'),pre;"," rng.insertNode(tmpNode).setStartAfter(tmpNode).collapse(true);"," var next = tmpNode.nextSibling;"," if(!next){"," 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){","","// if(!rng.collapsed){","// var bk = rng.createBookmark();","// var start = bk.start.previousSibling;","// if(start === pre.firstChild){","// start.nodeValue = start.nodeValue.replace(/^\\s{4}/,'');","// }else{","// while(start){","// if(domUtils.isBr(start)){","// start = start.nextSibling;","// start.nodeValue = start.nodeValue.replace(/^\\s{4}/,'');","// break;","// }","// while(start.previousSibling && start.previousSibling.nodeType == 3){","// start.nodeValue = start.previousSibling.nodeValue + start.nodeValue;","// domUtils.remove(start.previousSibling)","// }","// start = start.previousSibling;","// }","// }","//","// var end = bk.end;","// start = bk.start.nextSibling;","//","// while(start && start !== end){","// if(domUtils.isBr(start) && start.nextSibling){","// if(start.nextSibling === end){","// break;","// }","// start = start.nextSibling;","// while(start.nextSibling && start.nextSibling.nodeType == 3){","// start.nodeValue += start.nextSibling.nodeValue;","// domUtils.remove(start.nextSibling)","// }","//","// start.nodeValue = start.nodeValue.replace(/^\\s{4}/,'');","// }","//","// start = start.nextSibling;","// }","// rng.moveToBookmark(bk).select();","// }else{","// var bk = rng.createBookmark();","// var start = bk.start.previousSibling;","// if(start === pre.firstChild){","// start.nodeValue = start.nodeValue.replace(/^\\s{4}/,'');","// }else{","// while(start){","// if(domUtils.isBr(start)){","// start = start.nextSibling;","// start.nodeValue = start.nodeValue.replace(/^\\s{4}/,'');","// break;","// }","// while(start.previousSibling && start.previousSibling.nodeType == 3){","// start.nodeValue = start.previousSibling.nodeValue + start.nodeValue;","// domUtils.remove(start.previousSibling)","// }","// start = start.previousSibling;","// }","// }","// }"," }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(/&nbsp;/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(/&nbsp;/g,' '))));",""," }"," }else{"," frag.appendChild(me.document.createTextNode(utils.html( cn.data.replace(/&nbsp;/g,' '))));",""," }"," })"," if(frag.lastChild.nodeName != 'BR'){"," frag.appendChild(me.document.createElement('br'))"," }"," }"," }else{"," frag.appendChild(me.document.createTextNode(utils.html( node.data.replace(/&nbsp;/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;"," }"," })","};"]; +_$jscoverage['plugins/insertcode.js'][7]++; +UE.plugins.insertcode = (function () { + _$jscoverage['plugins/insertcode.js'][8]++; + var me = this; + _$jscoverage['plugins/insertcode.js'][9]++; + me.ready((function () { + _$jscoverage['plugins/insertcode.js'][10]++; + utils.cssRule("pre", "pre{margin:.5em 0;padding:.4em .6em;border-radius:8px;background:#f8f8f8;}", me.document); +})); + _$jscoverage['plugins/insertcode.js'][13]++; + 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"}); + _$jscoverage['plugins/insertcode.js'][63]++; + me.commands.insertcode = {execCommand: (function (cmd, lang) { + _$jscoverage['plugins/insertcode.js'][65]++; + var me = this, rng = me.selection.getRange(), pre = domUtils.findParentByTagName(rng.startContainer, "pre", true); + _$jscoverage['plugins/insertcode.js'][68]++; + if (pre) { + _$jscoverage['plugins/insertcode.js'][69]++; + pre.className = ("brush:" + lang + ";toolbar:false;"); + } + else { + _$jscoverage['plugins/insertcode.js'][71]++; + var code = ""; + _$jscoverage['plugins/insertcode.js'][72]++; + if (rng.collapsed) { + _$jscoverage['plugins/insertcode.js'][73]++; + code = (browser.ie? ((browser.version > 8)? "": " "): "
    "); + } + else { + _$jscoverage['plugins/insertcode.js'][75]++; + var frag = rng.extractContents(); + _$jscoverage['plugins/insertcode.js'][76]++; + var div = me.document.createElement("div"); + _$jscoverage['plugins/insertcode.js'][77]++; + div.appendChild(frag); + _$jscoverage['plugins/insertcode.js'][79]++; + utils.each(UE.filterNode(UE.htmlparser(div.innerHTML.replace(/[\r\t]/g, "")), me.options.filterTxtRules).children, (function (node) { + _$jscoverage['plugins/insertcode.js'][80]++; + if ((browser.ie && (browser.version > 8))) { + _$jscoverage['plugins/insertcode.js'][82]++; + if ((node.type == "element")) { + _$jscoverage['plugins/insertcode.js'][83]++; + if ((node.tagName == "br")) { + _$jscoverage['plugins/insertcode.js'][84]++; + code += "\n"; + } + else { + _$jscoverage['plugins/insertcode.js'][85]++; + if ((! dtd.$empty[node.tagName])) { + _$jscoverage['plugins/insertcode.js'][86]++; + utils.each(node.children, (function (cn) { + _$jscoverage['plugins/insertcode.js'][87]++; + if ((cn.type == "element")) { + _$jscoverage['plugins/insertcode.js'][88]++; + if ((cn.tagName == "br")) { + _$jscoverage['plugins/insertcode.js'][89]++; + code += "\n"; + } + else { + _$jscoverage['plugins/insertcode.js'][90]++; + if ((! dtd.$empty[node.tagName])) { + _$jscoverage['plugins/insertcode.js'][91]++; + code += cn.innerText(); + } + } + } + else { + _$jscoverage['plugins/insertcode.js'][94]++; + code += cn.data; + } +})); + _$jscoverage['plugins/insertcode.js'][97]++; + if ((! /\n$/.test(code))) { + _$jscoverage['plugins/insertcode.js'][98]++; + code += "\n"; + } + } + } + } + else { + _$jscoverage['plugins/insertcode.js'][102]++; + code += (node.data + "\n"); + } + _$jscoverage['plugins/insertcode.js'][104]++; + if (((! node.nextSibling()) && /\n$/.test(code))) { + _$jscoverage['plugins/insertcode.js'][105]++; + code = code.replace(/\n$/, ""); + } + } + else { + _$jscoverage['plugins/insertcode.js'][108]++; + if (browser.ie) { + _$jscoverage['plugins/insertcode.js'][110]++; + if ((node.type == "element")) { + _$jscoverage['plugins/insertcode.js'][111]++; + if ((node.tagName == "br")) { + _$jscoverage['plugins/insertcode.js'][112]++; + code += "
    "; + } + else { + _$jscoverage['plugins/insertcode.js'][113]++; + if ((! dtd.$empty[node.tagName])) { + _$jscoverage['plugins/insertcode.js'][114]++; + utils.each(node.children, (function (cn) { + _$jscoverage['plugins/insertcode.js'][115]++; + if ((cn.type == "element")) { + _$jscoverage['plugins/insertcode.js'][116]++; + if ((cn.tagName == "br")) { + _$jscoverage['plugins/insertcode.js'][117]++; + code += "
    "; + } + else { + _$jscoverage['plugins/insertcode.js'][118]++; + if ((! dtd.$empty[node.tagName])) { + _$jscoverage['plugins/insertcode.js'][119]++; + code += cn.innerText(); + } + } + } + else { + _$jscoverage['plugins/insertcode.js'][122]++; + code += cn.data; + } +})); + _$jscoverage['plugins/insertcode.js'][125]++; + if ((! /br>$/.test(code))) { + _$jscoverage['plugins/insertcode.js'][126]++; + code += "
    "; + } + } + } + } + else { + _$jscoverage['plugins/insertcode.js'][130]++; + code += (node.data + "
    "); + } + _$jscoverage['plugins/insertcode.js'][132]++; + if (((! node.nextSibling()) && /
    $/.test(code))) { + _$jscoverage['plugins/insertcode.js'][133]++; + code = code.replace(/
    $/, ""); + } + } + else { + _$jscoverage['plugins/insertcode.js'][137]++; + code += ((node.type == "element")? (dtd.$empty[node.tagName]? "": node.innerText()): node.data); + _$jscoverage['plugins/insertcode.js'][138]++; + if ((! /br\/?\s*>$/.test(code))) { + _$jscoverage['plugins/insertcode.js'][139]++; + if ((! node.nextSibling())) { + _$jscoverage['plugins/insertcode.js'][140]++; + return; + } + _$jscoverage['plugins/insertcode.js'][141]++; + code += "
    "; + } + } + } +})); + } + _$jscoverage['plugins/insertcode.js'][149]++; + me.execCommand("inserthtml", ("
    " + code + "
    "), true); + _$jscoverage['plugins/insertcode.js'][151]++; + pre = me.document.getElementById("coder"); + _$jscoverage['plugins/insertcode.js'][152]++; + domUtils.removeAttributes(pre, "id"); + _$jscoverage['plugins/insertcode.js'][153]++; + var tmpNode = pre.previousSibling; + _$jscoverage['plugins/insertcode.js'][155]++; + if ((tmpNode && (((tmpNode.nodeType == 3) && (tmpNode.nodeValue.length == 1) && browser.ie && (browser.version == 6)) || domUtils.isEmptyBlock(tmpNode)))) { + _$jscoverage['plugins/insertcode.js'][157]++; + domUtils.remove(tmpNode); + } + _$jscoverage['plugins/insertcode.js'][159]++; + var rng = me.selection.getRange(); + _$jscoverage['plugins/insertcode.js'][160]++; + if (domUtils.isEmptyBlock(pre)) { + _$jscoverage['plugins/insertcode.js'][161]++; + rng.setStart(pre, 0).setCursor(false, true); + } + else { + _$jscoverage['plugins/insertcode.js'][163]++; + rng.selectNodeContents(pre).select(); + } + } +}), queryCommandValue: (function () { + _$jscoverage['plugins/insertcode.js'][171]++; + var path = this.selection.getStartElementPath(); + _$jscoverage['plugins/insertcode.js'][172]++; + var lang = ""; + _$jscoverage['plugins/insertcode.js'][173]++; + utils.each(path, (function (node) { + _$jscoverage['plugins/insertcode.js'][174]++; + if ((node.nodeName == "PRE")) { + _$jscoverage['plugins/insertcode.js'][175]++; + var match = node.className.match(/brush:([^;]+)/); + _$jscoverage['plugins/insertcode.js'][176]++; + lang = ((match && match[1])? match[1]: ""); + _$jscoverage['plugins/insertcode.js'][177]++; + return false; + } +})); + _$jscoverage['plugins/insertcode.js'][180]++; + return lang; +})}; + _$jscoverage['plugins/insertcode.js'][184]++; + me.addInputRule((function (root) { + _$jscoverage['plugins/insertcode.js'][185]++; + utils.each(root.getNodesByTagName("pre"), (function (pre) { + _$jscoverage['plugins/insertcode.js'][186]++; + var brs = pre.getNodesByTagName("br"); + _$jscoverage['plugins/insertcode.js'][187]++; + if (brs.length) { + _$jscoverage['plugins/insertcode.js'][188]++; + (browser.ie && (browser.version > 8) && utils.each(brs, (function (br) { + _$jscoverage['plugins/insertcode.js'][189]++; + var txt = UE.uNode.createText("\n"); + _$jscoverage['plugins/insertcode.js'][190]++; + br.parentNode.insertBefore(txt, br); + _$jscoverage['plugins/insertcode.js'][191]++; + br.parentNode.removeChild(br); +}))); + _$jscoverage['plugins/insertcode.js'][193]++; + return; + } + _$jscoverage['plugins/insertcode.js'][195]++; + if ((browser.ie && (browser.version > 8))) { + _$jscoverage['plugins/insertcode.js'][196]++; + return; + } + _$jscoverage['plugins/insertcode.js'][197]++; + var code = pre.innerText().split(/\n/); + _$jscoverage['plugins/insertcode.js'][198]++; + pre.innerHTML(""); + _$jscoverage['plugins/insertcode.js'][199]++; + utils.each(code, (function (c) { + _$jscoverage['plugins/insertcode.js'][200]++; + if (c.length) { + _$jscoverage['plugins/insertcode.js'][201]++; + pre.appendChild(UE.uNode.createText(c)); + } + _$jscoverage['plugins/insertcode.js'][203]++; + pre.appendChild(UE.uNode.createElement("br")); +})); +})); +})); + _$jscoverage['plugins/insertcode.js'][207]++; + me.addOutputRule((function (root) { + _$jscoverage['plugins/insertcode.js'][208]++; + utils.each(root.getNodesByTagName("pre"), (function (pre) { + _$jscoverage['plugins/insertcode.js'][209]++; + var code = ""; + _$jscoverage['plugins/insertcode.js'][210]++; + utils.each(pre.children, (function (n) { + _$jscoverage['plugins/insertcode.js'][211]++; + if ((n.type == "text")) { + _$jscoverage['plugins/insertcode.js'][214]++; + code += n.data.replace(/[ ]/g, " ").replace(/\n$/, ""); + } + else { + _$jscoverage['plugins/insertcode.js'][216]++; + if ((n.tagName == "br")) { + _$jscoverage['plugins/insertcode.js'][217]++; + code += "\n"; + } + else { + _$jscoverage['plugins/insertcode.js'][219]++; + code += ((! dtd.$empty[n.tagName])? "": n.innerText()); + } + } +})); + _$jscoverage['plugins/insertcode.js'][226]++; + pre.innerText(code.replace(/( |\n)+$/, "")); +})); +})); + _$jscoverage['plugins/insertcode.js'][230]++; + me.notNeedCodeQuery = {help: 1, undo: 1, redo: 1, source: 1, print: 1, searchreplace: 1, fullscreen: 1, preview: 1, insertparagraph: 1, elementpath: 1, highlightcode: 1, insertcode: 1, inserthtml: 1, selectall: 1}; + _$jscoverage['plugins/insertcode.js'][247]++; + var orgQuery = me.queryCommandState; + _$jscoverage['plugins/insertcode.js'][248]++; + me.queryCommandState = (function (cmd) { + _$jscoverage['plugins/insertcode.js'][249]++; + var me = this; + _$jscoverage['plugins/insertcode.js'][251]++; + if (((! me.notNeedCodeQuery[cmd.toLowerCase()]) && me.selection && me.queryCommandValue("insertcode"))) { + _$jscoverage['plugins/insertcode.js'][252]++; + return -1; + } + _$jscoverage['plugins/insertcode.js'][254]++; + return UE.Editor.prototype.queryCommandState.apply(this, arguments); +}); + _$jscoverage['plugins/insertcode.js'][256]++; + me.addListener("beforeenterkeydown", (function () { + _$jscoverage['plugins/insertcode.js'][257]++; + var rng = me.selection.getRange(); + _$jscoverage['plugins/insertcode.js'][258]++; + var pre = domUtils.findParentByTagName(rng.startContainer, "pre", true); + _$jscoverage['plugins/insertcode.js'][259]++; + if (pre) { + _$jscoverage['plugins/insertcode.js'][260]++; + me.fireEvent("saveScene"); + _$jscoverage['plugins/insertcode.js'][261]++; + if ((! rng.collapsed)) { + _$jscoverage['plugins/insertcode.js'][262]++; + rng.deleteContents(); + } + _$jscoverage['plugins/insertcode.js'][264]++; + if ((! browser.ie)) { + _$jscoverage['plugins/insertcode.js'][265]++; + var tmpNode = me.document.createElement("br"), pre = pre; + _$jscoverage['plugins/insertcode.js'][266]++; + rng.insertNode(tmpNode).setStartAfter(tmpNode).collapse(true); + _$jscoverage['plugins/insertcode.js'][267]++; + var next = tmpNode.nextSibling; + _$jscoverage['plugins/insertcode.js'][268]++; + if ((! next)) { + _$jscoverage['plugins/insertcode.js'][269]++; + rng.insertNode(tmpNode.cloneNode(false)); + } + else { + _$jscoverage['plugins/insertcode.js'][271]++; + rng.setStartAfter(tmpNode); + } + _$jscoverage['plugins/insertcode.js'][273]++; + pre = tmpNode.previousSibling; + _$jscoverage['plugins/insertcode.js'][274]++; + var tmp; + _$jscoverage['plugins/insertcode.js'][275]++; + while (pre) { + _$jscoverage['plugins/insertcode.js'][276]++; + tmp = pre; + _$jscoverage['plugins/insertcode.js'][277]++; + pre = pre.previousSibling; + _$jscoverage['plugins/insertcode.js'][278]++; + if (((! pre) || (pre.nodeName == "BR"))) { + _$jscoverage['plugins/insertcode.js'][279]++; + pre = tmp; + _$jscoverage['plugins/insertcode.js'][280]++; + break; + } +} + _$jscoverage['plugins/insertcode.js'][283]++; + if (pre) { + _$jscoverage['plugins/insertcode.js'][284]++; + var str = ""; + _$jscoverage['plugins/insertcode.js'][285]++; + while ((pre && (pre.nodeName != "BR") && new RegExp(("^[\\s" + domUtils.fillChar + "]*$")).test(pre.nodeValue))) { + _$jscoverage['plugins/insertcode.js'][286]++; + str += pre.nodeValue; + _$jscoverage['plugins/insertcode.js'][287]++; + pre = pre.nextSibling; +} + _$jscoverage['plugins/insertcode.js'][289]++; + if ((pre.nodeName != "BR")) { + _$jscoverage['plugins/insertcode.js'][290]++; + var match = pre.nodeValue.match(new RegExp(("^([\\s" + domUtils.fillChar + "]+)"))); + _$jscoverage['plugins/insertcode.js'][291]++; + if ((match && match[1])) { + _$jscoverage['plugins/insertcode.js'][292]++; + str += match[1]; + } + } + _$jscoverage['plugins/insertcode.js'][296]++; + if (str) { + _$jscoverage['plugins/insertcode.js'][297]++; + str = me.document.createTextNode(str); + _$jscoverage['plugins/insertcode.js'][298]++; + rng.insertNode(str).setStartAfter(str); + } + } + _$jscoverage['plugins/insertcode.js'][301]++; + rng.collapse(true).select(true); + } + else { + _$jscoverage['plugins/insertcode.js'][303]++; + if ((browser.version > 8)) { + _$jscoverage['plugins/insertcode.js'][305]++; + var txt = me.document.createTextNode("\n"); + _$jscoverage['plugins/insertcode.js'][306]++; + var start = rng.startContainer; + _$jscoverage['plugins/insertcode.js'][307]++; + if ((rng.startOffset == 0)) { + _$jscoverage['plugins/insertcode.js'][308]++; + var preNode = start.previousSibling; + _$jscoverage['plugins/insertcode.js'][309]++; + if (preNode) { + _$jscoverage['plugins/insertcode.js'][310]++; + rng.insertNode(txt); + _$jscoverage['plugins/insertcode.js'][311]++; + var fillchar = me.document.createTextNode(" "); + _$jscoverage['plugins/insertcode.js'][312]++; + rng.setStartAfter(txt).insertNode(fillchar).setStart(fillchar, 0).collapse(true).select(true); + } + } + else { + _$jscoverage['plugins/insertcode.js'][315]++; + rng.insertNode(txt).setStartAfter(txt); + _$jscoverage['plugins/insertcode.js'][316]++; + var fillchar = me.document.createTextNode(" "); + _$jscoverage['plugins/insertcode.js'][317]++; + start = rng.startContainer.childNodes[rng.startOffset]; + _$jscoverage['plugins/insertcode.js'][318]++; + if ((start && (! /^\n/.test(start.nodeValue)))) { + _$jscoverage['plugins/insertcode.js'][319]++; + rng.setStartBefore(txt); + } + _$jscoverage['plugins/insertcode.js'][321]++; + rng.insertNode(fillchar).setStart(fillchar, 0).collapse(true).select(true); + } + } + else { + _$jscoverage['plugins/insertcode.js'][325]++; + var tmpNode = me.document.createElement("br"); + _$jscoverage['plugins/insertcode.js'][326]++; + rng.insertNode(tmpNode); + _$jscoverage['plugins/insertcode.js'][327]++; + rng.insertNode(me.document.createTextNode(domUtils.fillChar)); + _$jscoverage['plugins/insertcode.js'][328]++; + rng.setStartAfter(tmpNode); + _$jscoverage['plugins/insertcode.js'][329]++; + pre = tmpNode.previousSibling; + _$jscoverage['plugins/insertcode.js'][330]++; + var tmp = tmp; + _$jscoverage['plugins/insertcode.js'][331]++; + while (pre) { + _$jscoverage['plugins/insertcode.js'][332]++; + tmp = pre; + _$jscoverage['plugins/insertcode.js'][333]++; + pre = pre.previousSibling; + _$jscoverage['plugins/insertcode.js'][334]++; + if (((! pre) || (pre.nodeName == "BR"))) { + _$jscoverage['plugins/insertcode.js'][335]++; + pre = tmp; + _$jscoverage['plugins/insertcode.js'][336]++; + break; + } +} + _$jscoverage['plugins/insertcode.js'][339]++; + if (pre) { + _$jscoverage['plugins/insertcode.js'][340]++; + var str = ""; + _$jscoverage['plugins/insertcode.js'][341]++; + while ((pre && (pre.nodeName != "BR") && new RegExp(("^[ " + domUtils.fillChar + "]*$")).test(pre.nodeValue))) { + _$jscoverage['plugins/insertcode.js'][342]++; + str += pre.nodeValue; + _$jscoverage['plugins/insertcode.js'][343]++; + pre = pre.nextSibling; +} + _$jscoverage['plugins/insertcode.js'][345]++; + if ((pre.nodeName != "BR")) { + _$jscoverage['plugins/insertcode.js'][346]++; + var match = pre.nodeValue.match(new RegExp(("^([ " + domUtils.fillChar + "]+)"))); + _$jscoverage['plugins/insertcode.js'][347]++; + if ((match && match[1])) { + _$jscoverage['plugins/insertcode.js'][348]++; + str += match[1]; + } + } + _$jscoverage['plugins/insertcode.js'][353]++; + str = me.document.createTextNode(str); + _$jscoverage['plugins/insertcode.js'][354]++; + rng.insertNode(str).setStartAfter(str); + } + _$jscoverage['plugins/insertcode.js'][356]++; + rng.collapse(true).select(); + } + } + _$jscoverage['plugins/insertcode.js'][361]++; + me.fireEvent("saveScene"); + _$jscoverage['plugins/insertcode.js'][362]++; + return true; + } +})); + _$jscoverage['plugins/insertcode.js'][368]++; + me.addListener("tabkeydown", (function (cmd, evt) { + _$jscoverage['plugins/insertcode.js'][369]++; + var rng = me.selection.getRange(); + _$jscoverage['plugins/insertcode.js'][370]++; + var pre = domUtils.findParentByTagName(rng.startContainer, "pre", true); + _$jscoverage['plugins/insertcode.js'][371]++; + if (pre) { + _$jscoverage['plugins/insertcode.js'][372]++; + me.fireEvent("saveScene"); + _$jscoverage['plugins/insertcode.js'][373]++; + if (evt.shiftKey) { + } + else { + _$jscoverage['plugins/insertcode.js'][436]++; + if ((! rng.collapsed)) { + _$jscoverage['plugins/insertcode.js'][437]++; + var bk = rng.createBookmark(); + _$jscoverage['plugins/insertcode.js'][438]++; + var start = bk.start.previousSibling; + _$jscoverage['plugins/insertcode.js'][440]++; + while (start) { + _$jscoverage['plugins/insertcode.js'][441]++; + if (((pre.firstChild === start) && (! domUtils.isBr(start)))) { + _$jscoverage['plugins/insertcode.js'][442]++; + pre.insertBefore(me.document.createTextNode(" "), start); + _$jscoverage['plugins/insertcode.js'][444]++; + break; + } + _$jscoverage['plugins/insertcode.js'][446]++; + if (domUtils.isBr(start)) { + _$jscoverage['plugins/insertcode.js'][447]++; + pre.insertBefore(me.document.createTextNode(" "), start.nextSibling); + _$jscoverage['plugins/insertcode.js'][449]++; + break; + } + _$jscoverage['plugins/insertcode.js'][451]++; + start = start.previousSibling; +} + _$jscoverage['plugins/insertcode.js'][453]++; + var end = bk.end; + _$jscoverage['plugins/insertcode.js'][454]++; + start = bk.start.nextSibling; + _$jscoverage['plugins/insertcode.js'][455]++; + if ((pre.firstChild === bk.start)) { + _$jscoverage['plugins/insertcode.js'][456]++; + pre.insertBefore(me.document.createTextNode(" "), start.nextSibling); + } + _$jscoverage['plugins/insertcode.js'][459]++; + while ((start && (start !== end))) { + _$jscoverage['plugins/insertcode.js'][460]++; + if ((domUtils.isBr(start) && start.nextSibling)) { + _$jscoverage['plugins/insertcode.js'][461]++; + if ((start.nextSibling === end)) { + _$jscoverage['plugins/insertcode.js'][462]++; + break; + } + _$jscoverage['plugins/insertcode.js'][464]++; + pre.insertBefore(me.document.createTextNode(" "), start.nextSibling); + } + _$jscoverage['plugins/insertcode.js'][467]++; + start = start.nextSibling; +} + _$jscoverage['plugins/insertcode.js'][469]++; + rng.moveToBookmark(bk).select(); + } + else { + _$jscoverage['plugins/insertcode.js'][471]++; + var tmpNode = me.document.createTextNode(" "); + _$jscoverage['plugins/insertcode.js'][472]++; + rng.insertNode(tmpNode).setStartAfter(tmpNode).collapse(true).select(true); + } + } + _$jscoverage['plugins/insertcode.js'][477]++; + me.fireEvent("saveScene"); + _$jscoverage['plugins/insertcode.js'][478]++; + return true; + } +})); + _$jscoverage['plugins/insertcode.js'][485]++; + me.addListener("beforeinserthtml", (function (evtName, html) { + _$jscoverage['plugins/insertcode.js'][486]++; + var me = this, rng = me.selection.getRange(), pre = domUtils.findParentByTagName(rng.startContainer, "pre", true); + _$jscoverage['plugins/insertcode.js'][489]++; + if (pre) { + _$jscoverage['plugins/insertcode.js'][490]++; + if ((! rng.collapsed)) { + _$jscoverage['plugins/insertcode.js'][491]++; + rng.deleteContents(); + } + _$jscoverage['plugins/insertcode.js'][493]++; + var htmlstr = ""; + _$jscoverage['plugins/insertcode.js'][494]++; + if ((browser.ie && (browser.version > 8))) { + _$jscoverage['plugins/insertcode.js'][496]++; + utils.each(UE.filterNode(UE.htmlparser(html), me.options.filterTxtRules).children, (function (node) { + _$jscoverage['plugins/insertcode.js'][497]++; + if ((node.type == "element")) { + _$jscoverage['plugins/insertcode.js'][498]++; + if ((node.tagName == "br")) { + _$jscoverage['plugins/insertcode.js'][499]++; + htmlstr += "\n"; + } + else { + _$jscoverage['plugins/insertcode.js'][500]++; + if ((! dtd.$empty[node.tagName])) { + _$jscoverage['plugins/insertcode.js'][501]++; + utils.each(node.children, (function (cn) { + _$jscoverage['plugins/insertcode.js'][502]++; + if ((cn.type == "element")) { + _$jscoverage['plugins/insertcode.js'][503]++; + if ((cn.tagName == "br")) { + _$jscoverage['plugins/insertcode.js'][504]++; + htmlstr += "\n"; + } + else { + _$jscoverage['plugins/insertcode.js'][505]++; + if ((! dtd.$empty[node.tagName])) { + _$jscoverage['plugins/insertcode.js'][506]++; + htmlstr += cn.innerText(); + } + } + } + else { + _$jscoverage['plugins/insertcode.js'][509]++; + htmlstr += cn.data; + } +})); + _$jscoverage['plugins/insertcode.js'][512]++; + if ((! /\n$/.test(htmlstr))) { + _$jscoverage['plugins/insertcode.js'][513]++; + htmlstr += "\n"; + } + } + } + } + else { + _$jscoverage['plugins/insertcode.js'][517]++; + htmlstr += (node.data + "\n"); + } + _$jscoverage['plugins/insertcode.js'][519]++; + if (((! node.nextSibling()) && /\n$/.test(htmlstr))) { + _$jscoverage['plugins/insertcode.js'][520]++; + htmlstr = htmlstr.replace(/\n$/, ""); + } +})); + _$jscoverage['plugins/insertcode.js'][523]++; + var tmpNode = me.document.createTextNode(utils.html(htmlstr.replace(/ /g, " "))); + _$jscoverage['plugins/insertcode.js'][524]++; + rng.insertNode(tmpNode).selectNode(tmpNode).select(); + } + else { + _$jscoverage['plugins/insertcode.js'][526]++; + var frag = me.document.createDocumentFragment(); + _$jscoverage['plugins/insertcode.js'][528]++; + utils.each(UE.filterNode(UE.htmlparser(html), me.options.filterTxtRules).children, (function (node) { + _$jscoverage['plugins/insertcode.js'][529]++; + if ((node.type == "element")) { + _$jscoverage['plugins/insertcode.js'][530]++; + if ((node.tagName == "br")) { + _$jscoverage['plugins/insertcode.js'][531]++; + frag.appendChild(me.document.createElement("br")); + } + else { + _$jscoverage['plugins/insertcode.js'][532]++; + if ((! dtd.$empty[node.tagName])) { + _$jscoverage['plugins/insertcode.js'][533]++; + utils.each(node.children, (function (cn) { + _$jscoverage['plugins/insertcode.js'][534]++; + if ((cn.type == "element")) { + _$jscoverage['plugins/insertcode.js'][535]++; + if ((cn.tagName == "br")) { + _$jscoverage['plugins/insertcode.js'][537]++; + frag.appendChild(me.document.createElement("br")); + } + else { + _$jscoverage['plugins/insertcode.js'][538]++; + if ((! dtd.$empty[node.tagName])) { + _$jscoverage['plugins/insertcode.js'][539]++; + frag.appendChild(me.document.createTextNode(utils.html(cn.innerText().replace(/ /g, " ")))); + } + } + } + else { + _$jscoverage['plugins/insertcode.js'][543]++; + frag.appendChild(me.document.createTextNode(utils.html(cn.data.replace(/ /g, " ")))); + } +})); + _$jscoverage['plugins/insertcode.js'][547]++; + if ((frag.lastChild.nodeName != "BR")) { + _$jscoverage['plugins/insertcode.js'][548]++; + frag.appendChild(me.document.createElement("br")); + } + } + } + } + else { + _$jscoverage['plugins/insertcode.js'][552]++; + frag.appendChild(me.document.createTextNode(utils.html(node.data.replace(/ /g, " ")))); + } + _$jscoverage['plugins/insertcode.js'][554]++; + if (((! node.nextSibling()) && (frag.lastChild.nodeName == "BR"))) { + _$jscoverage['plugins/insertcode.js'][555]++; + frag.removeChild(frag.lastChild); + } +})); + _$jscoverage['plugins/insertcode.js'][560]++; + rng.insertNode(frag).select(); + } + _$jscoverage['plugins/insertcode.js'][564]++; + return true; + } +})); + _$jscoverage['plugins/insertcode.js'][568]++; + me.addListener("keydown", (function (cmd, evt) { + _$jscoverage['plugins/insertcode.js'][569]++; + var me = this, keyCode = (evt.keyCode || evt.which); + _$jscoverage['plugins/insertcode.js'][570]++; + if ((keyCode == 40)) { + _$jscoverage['plugins/insertcode.js'][571]++; + var rng = me.selection.getRange(), pre, start = rng.startContainer; + _$jscoverage['plugins/insertcode.js'][572]++; + if ((rng.collapsed && (pre = domUtils.findParentByTagName(rng.startContainer, "pre", true)) && (! pre.nextSibling))) { + _$jscoverage['plugins/insertcode.js'][573]++; + var last = pre.lastChild; + _$jscoverage['plugins/insertcode.js'][574]++; + while ((last && (last.nodeName == "BR"))) { + _$jscoverage['plugins/insertcode.js'][575]++; + last = last.previousSibling; +} + _$jscoverage['plugins/insertcode.js'][577]++; + if (((last === start) || ((rng.startContainer === pre) && (rng.startOffset == pre.childNodes.length)))) { + _$jscoverage['plugins/insertcode.js'][578]++; + me.execCommand("insertparagraph"); + _$jscoverage['plugins/insertcode.js'][579]++; + domUtils.preventDefault(evt); + } + } + } +})); + _$jscoverage['plugins/insertcode.js'][586]++; + me.addListener("delkeydown", (function (type, evt) { + _$jscoverage['plugins/insertcode.js'][587]++; + var rng = this.selection.getRange(); + _$jscoverage['plugins/insertcode.js'][588]++; + rng.txtToElmBoundary(true); + _$jscoverage['plugins/insertcode.js'][589]++; + var start = rng.startContainer; + _$jscoverage['plugins/insertcode.js'][590]++; + if ((domUtils.isTagNode(start, "pre") && rng.collapsed && domUtils.isStartInblock(rng))) { + _$jscoverage['plugins/insertcode.js'][591]++; + var p = me.document.createElement("p"); + _$jscoverage['plugins/insertcode.js'][592]++; + domUtils.fillNode(me.document, p); + _$jscoverage['plugins/insertcode.js'][593]++; + start.parentNode.insertBefore(p, start); + _$jscoverage['plugins/insertcode.js'][594]++; + domUtils.remove(start); + _$jscoverage['plugins/insertcode.js'][595]++; + rng.setStart(p, 0).setCursor(false, true); + _$jscoverage['plugins/insertcode.js'][596]++; + domUtils.preventDefault(evt); + _$jscoverage['plugins/insertcode.js'][597]++; + return true; + } +})); +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/inserthtml.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/inserthtml.js new file mode 100644 index 000000000..2e7ccbac2 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/inserthtml.js @@ -0,0 +1,504 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/inserthtml.js']) { + _$jscoverage['plugins/inserthtml.js'] = []; + _$jscoverage['plugins/inserthtml.js'][31] = 0; + _$jscoverage['plugins/inserthtml.js'][33] = 0; + _$jscoverage['plugins/inserthtml.js'][36] = 0; + _$jscoverage['plugins/inserthtml.js'][37] = 0; + _$jscoverage['plugins/inserthtml.js'][39] = 0; + _$jscoverage['plugins/inserthtml.js'][40] = 0; + _$jscoverage['plugins/inserthtml.js'][42] = 0; + _$jscoverage['plugins/inserthtml.js'][43] = 0; + _$jscoverage['plugins/inserthtml.js'][44] = 0; + _$jscoverage['plugins/inserthtml.js'][46] = 0; + _$jscoverage['plugins/inserthtml.js'][47] = 0; + _$jscoverage['plugins/inserthtml.js'][49] = 0; + _$jscoverage['plugins/inserthtml.js'][50] = 0; + _$jscoverage['plugins/inserthtml.js'][53] = 0; + _$jscoverage['plugins/inserthtml.js'][54] = 0; + _$jscoverage['plugins/inserthtml.js'][56] = 0; + _$jscoverage['plugins/inserthtml.js'][58] = 0; + _$jscoverage['plugins/inserthtml.js'][59] = 0; + _$jscoverage['plugins/inserthtml.js'][60] = 0; + _$jscoverage['plugins/inserthtml.js'][61] = 0; + _$jscoverage['plugins/inserthtml.js'][63] = 0; + _$jscoverage['plugins/inserthtml.js'][64] = 0; + _$jscoverage['plugins/inserthtml.js'][65] = 0; + _$jscoverage['plugins/inserthtml.js'][67] = 0; + _$jscoverage['plugins/inserthtml.js'][70] = 0; + _$jscoverage['plugins/inserthtml.js'][71] = 0; + _$jscoverage['plugins/inserthtml.js'][72] = 0; + _$jscoverage['plugins/inserthtml.js'][73] = 0; + _$jscoverage['plugins/inserthtml.js'][76] = 0; + _$jscoverage['plugins/inserthtml.js'][77] = 0; + _$jscoverage['plugins/inserthtml.js'][78] = 0; + _$jscoverage['plugins/inserthtml.js'][79] = 0; + _$jscoverage['plugins/inserthtml.js'][80] = 0; + _$jscoverage['plugins/inserthtml.js'][81] = 0; + _$jscoverage['plugins/inserthtml.js'][82] = 0; + _$jscoverage['plugins/inserthtml.js'][87] = 0; + _$jscoverage['plugins/inserthtml.js'][88] = 0; + _$jscoverage['plugins/inserthtml.js'][89] = 0; + _$jscoverage['plugins/inserthtml.js'][90] = 0; + _$jscoverage['plugins/inserthtml.js'][91] = 0; + _$jscoverage['plugins/inserthtml.js'][92] = 0; + _$jscoverage['plugins/inserthtml.js'][93] = 0; + _$jscoverage['plugins/inserthtml.js'][95] = 0; + _$jscoverage['plugins/inserthtml.js'][102] = 0; + _$jscoverage['plugins/inserthtml.js'][104] = 0; + _$jscoverage['plugins/inserthtml.js'][105] = 0; + _$jscoverage['plugins/inserthtml.js'][106] = 0; + _$jscoverage['plugins/inserthtml.js'][107] = 0; + _$jscoverage['plugins/inserthtml.js'][108] = 0; + _$jscoverage['plugins/inserthtml.js'][109] = 0; + _$jscoverage['plugins/inserthtml.js'][110] = 0; + _$jscoverage['plugins/inserthtml.js'][111] = 0; + _$jscoverage['plugins/inserthtml.js'][112] = 0; + _$jscoverage['plugins/inserthtml.js'][116] = 0; + _$jscoverage['plugins/inserthtml.js'][117] = 0; + _$jscoverage['plugins/inserthtml.js'][118] = 0; + _$jscoverage['plugins/inserthtml.js'][119] = 0; + _$jscoverage['plugins/inserthtml.js'][121] = 0; + _$jscoverage['plugins/inserthtml.js'][122] = 0; + _$jscoverage['plugins/inserthtml.js'][123] = 0; + _$jscoverage['plugins/inserthtml.js'][124] = 0; + _$jscoverage['plugins/inserthtml.js'][125] = 0; + _$jscoverage['plugins/inserthtml.js'][128] = 0; + _$jscoverage['plugins/inserthtml.js'][129] = 0; + _$jscoverage['plugins/inserthtml.js'][130] = 0; + _$jscoverage['plugins/inserthtml.js'][131] = 0; + _$jscoverage['plugins/inserthtml.js'][132] = 0; + _$jscoverage['plugins/inserthtml.js'][133] = 0; + _$jscoverage['plugins/inserthtml.js'][135] = 0; + _$jscoverage['plugins/inserthtml.js'][137] = 0; + _$jscoverage['plugins/inserthtml.js'][138] = 0; + _$jscoverage['plugins/inserthtml.js'][139] = 0; + _$jscoverage['plugins/inserthtml.js'][140] = 0; + _$jscoverage['plugins/inserthtml.js'][141] = 0; + _$jscoverage['plugins/inserthtml.js'][142] = 0; + _$jscoverage['plugins/inserthtml.js'][143] = 0; + _$jscoverage['plugins/inserthtml.js'][144] = 0; + _$jscoverage['plugins/inserthtml.js'][148] = 0; + _$jscoverage['plugins/inserthtml.js'][149] = 0; + _$jscoverage['plugins/inserthtml.js'][150] = 0; + _$jscoverage['plugins/inserthtml.js'][152] = 0; + _$jscoverage['plugins/inserthtml.js'][154] = 0; + _$jscoverage['plugins/inserthtml.js'][157] = 0; + _$jscoverage['plugins/inserthtml.js'][158] = 0; + _$jscoverage['plugins/inserthtml.js'][159] = 0; + _$jscoverage['plugins/inserthtml.js'][160] = 0; + _$jscoverage['plugins/inserthtml.js'][161] = 0; + _$jscoverage['plugins/inserthtml.js'][162] = 0; + _$jscoverage['plugins/inserthtml.js'][163] = 0; + _$jscoverage['plugins/inserthtml.js'][165] = 0; + _$jscoverage['plugins/inserthtml.js'][167] = 0; + _$jscoverage['plugins/inserthtml.js'][170] = 0; + _$jscoverage['plugins/inserthtml.js'][171] = 0; + _$jscoverage['plugins/inserthtml.js'][172] = 0; + _$jscoverage['plugins/inserthtml.js'][174] = 0; + _$jscoverage['plugins/inserthtml.js'][175] = 0; + _$jscoverage['plugins/inserthtml.js'][176] = 0; + _$jscoverage['plugins/inserthtml.js'][177] = 0; + _$jscoverage['plugins/inserthtml.js'][179] = 0; + _$jscoverage['plugins/inserthtml.js'][180] = 0; + _$jscoverage['plugins/inserthtml.js'][181] = 0; + _$jscoverage['plugins/inserthtml.js'][182] = 0; + _$jscoverage['plugins/inserthtml.js'][188] = 0; + _$jscoverage['plugins/inserthtml.js'][190] = 0; + _$jscoverage['plugins/inserthtml.js'][191] = 0; + _$jscoverage['plugins/inserthtml.js'][192] = 0; + _$jscoverage['plugins/inserthtml.js'][193] = 0; + _$jscoverage['plugins/inserthtml.js'][197] = 0; + _$jscoverage['plugins/inserthtml.js'][202] = 0; + _$jscoverage['plugins/inserthtml.js'][204] = 0; + _$jscoverage['plugins/inserthtml.js'][207] = 0; + _$jscoverage['plugins/inserthtml.js'][208] = 0; + _$jscoverage['plugins/inserthtml.js'][210] = 0; + _$jscoverage['plugins/inserthtml.js'][211] = 0; + _$jscoverage['plugins/inserthtml.js'][213] = 0; + _$jscoverage['plugins/inserthtml.js'][217] = 0; + _$jscoverage['plugins/inserthtml.js'][219] = 0; + _$jscoverage['plugins/inserthtml.js'][220] = 0; + _$jscoverage['plugins/inserthtml.js'][223] = 0; + _$jscoverage['plugins/inserthtml.js'][224] = 0; + _$jscoverage['plugins/inserthtml.js'][225] = 0; + _$jscoverage['plugins/inserthtml.js'][226] = 0; + _$jscoverage['plugins/inserthtml.js'][228] = 0; + _$jscoverage['plugins/inserthtml.js'][232] = 0; + _$jscoverage['plugins/inserthtml.js'][233] = 0; + _$jscoverage['plugins/inserthtml.js'][235] = 0; + _$jscoverage['plugins/inserthtml.js'][236] = 0; + _$jscoverage['plugins/inserthtml.js'][243] = 0; + _$jscoverage['plugins/inserthtml.js'][244] = 0; + _$jscoverage['plugins/inserthtml.js'][251] = 0; + _$jscoverage['plugins/inserthtml.js'][252] = 0; + _$jscoverage['plugins/inserthtml.js'][253] = 0; + _$jscoverage['plugins/inserthtml.js'][254] = 0; +} +_$jscoverage['plugins/inserthtml.js'].source = ["/**"," * 插入html字符串插件"," * @file"," * @since 1.2.6.1"," */","","/**"," * 对编辑器区域插入html字符串"," * @command inserthtml"," * @method execCommand"," * @param { String } cmd 命令字符串"," * @param { String } html 插入的html字符串"," * @example"," * ```javascript"," * editor.execCommand( 'insertcode', '<p>我是UEdtior开发者</P>' );"," * ```"," */","/**"," * 对编辑器区域插入html字符串"," * @command inserthtml"," * @method execCommand"," * @param { String } cmd 命令字符串"," * @param { String } html 插入的html字符串"," * @param { Bool } notNeedFilter 传true时不走过滤规则,反之要走配置项过滤规则"," * @example"," * ```javascript"," * editor.execCommand( 'inserthtml', '<div>我是UEdtior开发者</div>' ,true);"," * ```"," */","","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]<br/>"," 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 = '<p>'+(browser.ie ? '' : '<br/>')+'</p>';"," 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>|<[p> ==> <p></p><div></div><p>|</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 : '<br/>';"," }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');"," },200);"," }","};"]; +_$jscoverage['plugins/inserthtml.js'][31]++; +UE.commands.inserthtml = {execCommand: (function (command, html, notNeedFilter) { + _$jscoverage['plugins/inserthtml.js'][33]++; + var me = this, range, div; + _$jscoverage['plugins/inserthtml.js'][36]++; + if ((! html)) { + _$jscoverage['plugins/inserthtml.js'][37]++; + return; + } + _$jscoverage['plugins/inserthtml.js'][39]++; + if ((me.fireEvent("beforeinserthtml", html) === true)) { + _$jscoverage['plugins/inserthtml.js'][40]++; + return; + } + _$jscoverage['plugins/inserthtml.js'][42]++; + range = me.selection.getRange(); + _$jscoverage['plugins/inserthtml.js'][43]++; + div = range.document.createElement("div"); + _$jscoverage['plugins/inserthtml.js'][44]++; + div.style.display = "inline"; + _$jscoverage['plugins/inserthtml.js'][46]++; + if ((! notNeedFilter)) { + _$jscoverage['plugins/inserthtml.js'][47]++; + var root = UE.htmlparser(html); + _$jscoverage['plugins/inserthtml.js'][49]++; + if (me.options.filterRules) { + _$jscoverage['plugins/inserthtml.js'][50]++; + UE.filterNode(root, me.options.filterRules); + } + _$jscoverage['plugins/inserthtml.js'][53]++; + me.filterInputRule(root); + _$jscoverage['plugins/inserthtml.js'][54]++; + html = root.toHtml(); + } + _$jscoverage['plugins/inserthtml.js'][56]++; + div.innerHTML = utils.trim(html); + _$jscoverage['plugins/inserthtml.js'][58]++; + if ((! range.collapsed)) { + _$jscoverage['plugins/inserthtml.js'][59]++; + var tmpNode = range.startContainer; + _$jscoverage['plugins/inserthtml.js'][60]++; + if (domUtils.isFillChar(tmpNode)) { + _$jscoverage['plugins/inserthtml.js'][61]++; + range.setStartBefore(tmpNode); + } + _$jscoverage['plugins/inserthtml.js'][63]++; + tmpNode = range.endContainer; + _$jscoverage['plugins/inserthtml.js'][64]++; + if (domUtils.isFillChar(tmpNode)) { + _$jscoverage['plugins/inserthtml.js'][65]++; + range.setEndAfter(tmpNode); + } + _$jscoverage['plugins/inserthtml.js'][67]++; + range.txtToElmBoundary(); + _$jscoverage['plugins/inserthtml.js'][70]++; + if ((range.endContainer && (range.endContainer.nodeType == 1))) { + _$jscoverage['plugins/inserthtml.js'][71]++; + tmpNode = range.endContainer.childNodes[range.endOffset]; + _$jscoverage['plugins/inserthtml.js'][72]++; + if ((tmpNode && domUtils.isBr(tmpNode))) { + _$jscoverage['plugins/inserthtml.js'][73]++; + range.setEndAfter(tmpNode); + } + } + _$jscoverage['plugins/inserthtml.js'][76]++; + if ((range.startOffset == 0)) { + _$jscoverage['plugins/inserthtml.js'][77]++; + tmpNode = range.startContainer; + _$jscoverage['plugins/inserthtml.js'][78]++; + if (domUtils.isBoundaryNode(tmpNode, "firstChild")) { + _$jscoverage['plugins/inserthtml.js'][79]++; + tmpNode = range.endContainer; + _$jscoverage['plugins/inserthtml.js'][80]++; + if (((range.endOffset == ((tmpNode.nodeType == 3)? tmpNode.nodeValue.length: tmpNode.childNodes.length)) && domUtils.isBoundaryNode(tmpNode, "lastChild"))) { + _$jscoverage['plugins/inserthtml.js'][81]++; + me.body.innerHTML = ("

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

    "); + _$jscoverage['plugins/inserthtml.js'][82]++; + range.setStart(me.body.firstChild, 0).collapse(true); + } + } + } + _$jscoverage['plugins/inserthtml.js'][87]++; + ((! range.collapsed) && range.deleteContents()); + _$jscoverage['plugins/inserthtml.js'][88]++; + if ((range.startContainer.nodeType == 1)) { + _$jscoverage['plugins/inserthtml.js'][89]++; + var child = range.startContainer.childNodes[range.startOffset], pre; + _$jscoverage['plugins/inserthtml.js'][90]++; + if ((child && domUtils.isBlockElm(child) && (pre = child.previousSibling) && domUtils.isBlockElm(pre))) { + _$jscoverage['plugins/inserthtml.js'][91]++; + range.setEnd(pre, pre.childNodes.length).collapse(); + _$jscoverage['plugins/inserthtml.js'][92]++; + while (child.firstChild) { + _$jscoverage['plugins/inserthtml.js'][93]++; + pre.appendChild(child.firstChild); +} + _$jscoverage['plugins/inserthtml.js'][95]++; + domUtils.remove(child); + } + } + } + _$jscoverage['plugins/inserthtml.js'][102]++; + var child = child, parent, pre = pre, tmp, hadBreak = 0, nextNode; + _$jscoverage['plugins/inserthtml.js'][104]++; + if (range.inFillChar()) { + _$jscoverage['plugins/inserthtml.js'][105]++; + child = range.startContainer; + _$jscoverage['plugins/inserthtml.js'][106]++; + if (domUtils.isFillChar(child)) { + _$jscoverage['plugins/inserthtml.js'][107]++; + range.setStartBefore(child).collapse(true); + _$jscoverage['plugins/inserthtml.js'][108]++; + domUtils.remove(child); + } + else { + _$jscoverage['plugins/inserthtml.js'][109]++; + if (domUtils.isFillChar(child, true)) { + _$jscoverage['plugins/inserthtml.js'][110]++; + child.nodeValue = child.nodeValue.replace(fillCharReg, ""); + _$jscoverage['plugins/inserthtml.js'][111]++; + (range.startOffset--); + _$jscoverage['plugins/inserthtml.js'][112]++; + (range.collapsed && range.collapse(true)); + } + } + } + _$jscoverage['plugins/inserthtml.js'][116]++; + var li = domUtils.findParentByTagName(range.startContainer, "li", true); + _$jscoverage['plugins/inserthtml.js'][117]++; + if (li) { + _$jscoverage['plugins/inserthtml.js'][118]++; + var next, last; + _$jscoverage['plugins/inserthtml.js'][119]++; + while ((child = div.firstChild)) { + _$jscoverage['plugins/inserthtml.js'][121]++; + while ((child && ((child.nodeType == 3) || (! domUtils.isBlockElm(child)) || (child.tagName == "HR")))) { + _$jscoverage['plugins/inserthtml.js'][122]++; + next = child.nextSibling; + _$jscoverage['plugins/inserthtml.js'][123]++; + range.insertNode(child).collapse(); + _$jscoverage['plugins/inserthtml.js'][124]++; + last = child; + _$jscoverage['plugins/inserthtml.js'][125]++; + child = next; +} + _$jscoverage['plugins/inserthtml.js'][128]++; + if (child) { + _$jscoverage['plugins/inserthtml.js'][129]++; + if (/^(ol|ul)$/i.test(child.tagName)) { + _$jscoverage['plugins/inserthtml.js'][130]++; + while (child.firstChild) { + _$jscoverage['plugins/inserthtml.js'][131]++; + last = child.firstChild; + _$jscoverage['plugins/inserthtml.js'][132]++; + domUtils.insertAfter(li, child.firstChild); + _$jscoverage['plugins/inserthtml.js'][133]++; + li = li.nextSibling; +} + _$jscoverage['plugins/inserthtml.js'][135]++; + domUtils.remove(child); + } + else { + _$jscoverage['plugins/inserthtml.js'][137]++; + var tmpLi; + _$jscoverage['plugins/inserthtml.js'][138]++; + next = child.nextSibling; + _$jscoverage['plugins/inserthtml.js'][139]++; + tmpLi = me.document.createElement("li"); + _$jscoverage['plugins/inserthtml.js'][140]++; + domUtils.insertAfter(li, tmpLi); + _$jscoverage['plugins/inserthtml.js'][141]++; + tmpLi.appendChild(child); + _$jscoverage['plugins/inserthtml.js'][142]++; + last = child; + _$jscoverage['plugins/inserthtml.js'][143]++; + child = next; + _$jscoverage['plugins/inserthtml.js'][144]++; + li = tmpLi; + } + } +} + _$jscoverage['plugins/inserthtml.js'][148]++; + li = domUtils.findParentByTagName(range.startContainer, "li", true); + _$jscoverage['plugins/inserthtml.js'][149]++; + if (domUtils.isEmptyBlock(li)) { + _$jscoverage['plugins/inserthtml.js'][150]++; + domUtils.remove(li); + } + _$jscoverage['plugins/inserthtml.js'][152]++; + if (last) { + _$jscoverage['plugins/inserthtml.js'][154]++; + range.setStartAfter(last).collapse(true).select(true); + } + } + else { + _$jscoverage['plugins/inserthtml.js'][157]++; + while ((child = div.firstChild)) { + _$jscoverage['plugins/inserthtml.js'][158]++; + if (hadBreak) { + _$jscoverage['plugins/inserthtml.js'][159]++; + var p = me.document.createElement("p"); + _$jscoverage['plugins/inserthtml.js'][160]++; + while ((child && ((child.nodeType == 3) || (! dtd.$block[child.tagName])))) { + _$jscoverage['plugins/inserthtml.js'][161]++; + nextNode = child.nextSibling; + _$jscoverage['plugins/inserthtml.js'][162]++; + p.appendChild(child); + _$jscoverage['plugins/inserthtml.js'][163]++; + child = nextNode; +} + _$jscoverage['plugins/inserthtml.js'][165]++; + if (p.firstChild) { + _$jscoverage['plugins/inserthtml.js'][167]++; + child = p; + } + } + _$jscoverage['plugins/inserthtml.js'][170]++; + range.insertNode(child); + _$jscoverage['plugins/inserthtml.js'][171]++; + nextNode = child.nextSibling; + _$jscoverage['plugins/inserthtml.js'][172]++; + if (((! hadBreak) && (child.nodeType == domUtils.NODE_ELEMENT) && domUtils.isBlockElm(child))) { + _$jscoverage['plugins/inserthtml.js'][174]++; + parent = domUtils.findParent(child, (function (node) { + _$jscoverage['plugins/inserthtml.js'][174]++; + return domUtils.isBlockElm(node); +})); + _$jscoverage['plugins/inserthtml.js'][175]++; + if ((parent && (parent.tagName.toLowerCase() != "body") && (! (dtd[parent.tagName][child.nodeName] && (child.parentNode === parent))))) { + _$jscoverage['plugins/inserthtml.js'][176]++; + if ((! dtd[parent.tagName][child.nodeName])) { + _$jscoverage['plugins/inserthtml.js'][177]++; + pre = parent; + } + else { + _$jscoverage['plugins/inserthtml.js'][179]++; + tmp = child.parentNode; + _$jscoverage['plugins/inserthtml.js'][180]++; + while ((tmp !== parent)) { + _$jscoverage['plugins/inserthtml.js'][181]++; + pre = tmp; + _$jscoverage['plugins/inserthtml.js'][182]++; + tmp = tmp.parentNode; +} + } + _$jscoverage['plugins/inserthtml.js'][188]++; + domUtils.breakParent(child, (pre || tmp)); + _$jscoverage['plugins/inserthtml.js'][190]++; + var pre = child.previousSibling; + _$jscoverage['plugins/inserthtml.js'][191]++; + domUtils.trimWhiteTextNode(pre); + _$jscoverage['plugins/inserthtml.js'][192]++; + if ((! pre.childNodes.length)) { + _$jscoverage['plugins/inserthtml.js'][193]++; + domUtils.remove(pre); + } + _$jscoverage['plugins/inserthtml.js'][197]++; + if (((! browser.ie) && (next = child.nextSibling) && domUtils.isBlockElm(next) && next.lastChild && (! domUtils.isBr(next.lastChild)))) { + _$jscoverage['plugins/inserthtml.js'][202]++; + next.appendChild(me.document.createElement("br")); + } + _$jscoverage['plugins/inserthtml.js'][204]++; + hadBreak = 1; + } + } + _$jscoverage['plugins/inserthtml.js'][207]++; + var next = child.nextSibling; + _$jscoverage['plugins/inserthtml.js'][208]++; + if (((! div.firstChild) && next && domUtils.isBlockElm(next))) { + _$jscoverage['plugins/inserthtml.js'][210]++; + range.setStart(next, 0).collapse(true); + _$jscoverage['plugins/inserthtml.js'][211]++; + break; + } + _$jscoverage['plugins/inserthtml.js'][213]++; + range.setEndAfter(child).collapse(); +} + _$jscoverage['plugins/inserthtml.js'][217]++; + child = range.startContainer; + _$jscoverage['plugins/inserthtml.js'][219]++; + if ((nextNode && domUtils.isBr(nextNode))) { + _$jscoverage['plugins/inserthtml.js'][220]++; + domUtils.remove(nextNode); + } + _$jscoverage['plugins/inserthtml.js'][223]++; + if ((domUtils.isBlockElm(child) && domUtils.isEmptyNode(child))) { + _$jscoverage['plugins/inserthtml.js'][224]++; + if ((nextNode = child.nextSibling)) { + _$jscoverage['plugins/inserthtml.js'][225]++; + domUtils.remove(child); + _$jscoverage['plugins/inserthtml.js'][226]++; + if (((nextNode.nodeType == 1) && dtd.$block[nextNode.tagName])) { + _$jscoverage['plugins/inserthtml.js'][228]++; + range.setStart(nextNode, 0).collapse(true).shrinkBoundary(); + } + } + else { + _$jscoverage['plugins/inserthtml.js'][232]++; + try { + _$jscoverage['plugins/inserthtml.js'][233]++; + child.innerHTML = (browser.ie? domUtils.fillChar: "
    "); + } + catch (e) { + _$jscoverage['plugins/inserthtml.js'][235]++; + range.setStartBefore(child); + _$jscoverage['plugins/inserthtml.js'][236]++; + domUtils.remove(child); + } + } + } + _$jscoverage['plugins/inserthtml.js'][243]++; + try { + _$jscoverage['plugins/inserthtml.js'][244]++; + range.select(true); + } + catch (e) { + } + } + _$jscoverage['plugins/inserthtml.js'][251]++; + setTimeout((function () { + _$jscoverage['plugins/inserthtml.js'][252]++; + range = me.selection.getRange(); + _$jscoverage['plugins/inserthtml.js'][253]++; + range.scrollToView(me.autoHeightEnabled, (me.autoHeightEnabled? domUtils.getXY(me.iframe).y: 0)); + _$jscoverage['plugins/inserthtml.js'][254]++; + me.fireEvent("afterinserthtml"); +}), 200); +})}; diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/insertparagraph.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/insertparagraph.js new file mode 100644 index 000000000..d95607770 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/insertparagraph.js @@ -0,0 +1,92 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/insertparagraph.js']) { + _$jscoverage['plugins/insertparagraph.js'] = []; + _$jscoverage['plugins/insertparagraph.js'][20] = 0; + _$jscoverage['plugins/insertparagraph.js'][22] = 0; + _$jscoverage['plugins/insertparagraph.js'][25] = 0; + _$jscoverage['plugins/insertparagraph.js'][26] = 0; + _$jscoverage['plugins/insertparagraph.js'][27] = 0; + _$jscoverage['plugins/insertparagraph.js'][29] = 0; + _$jscoverage['plugins/insertparagraph.js'][30] = 0; + _$jscoverage['plugins/insertparagraph.js'][32] = 0; + _$jscoverage['plugins/insertparagraph.js'][33] = 0; + _$jscoverage['plugins/insertparagraph.js'][34] = 0; + _$jscoverage['plugins/insertparagraph.js'][35] = 0; + _$jscoverage['plugins/insertparagraph.js'][37] = 0; + _$jscoverage['plugins/insertparagraph.js'][39] = 0; + _$jscoverage['plugins/insertparagraph.js'][40] = 0; +} +_$jscoverage['plugins/insertparagraph.js'].source = ["/**"," * 插入新的段落"," * @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);"," }"," }","};",""]; +_$jscoverage['plugins/insertparagraph.js'][20]++; +UE.commands.insertparagraph = {execCommand: (function (cmdName, front) { + _$jscoverage['plugins/insertparagraph.js'][22]++; + var me = this, range = me.selection.getRange(), start = range.startContainer, tmpNode; + _$jscoverage['plugins/insertparagraph.js'][25]++; + while (start) { + _$jscoverage['plugins/insertparagraph.js'][26]++; + if (domUtils.isBody(start)) { + _$jscoverage['plugins/insertparagraph.js'][27]++; + break; + } + _$jscoverage['plugins/insertparagraph.js'][29]++; + tmpNode = start; + _$jscoverage['plugins/insertparagraph.js'][30]++; + start = start.parentNode; +} + _$jscoverage['plugins/insertparagraph.js'][32]++; + if (tmpNode) { + _$jscoverage['plugins/insertparagraph.js'][33]++; + var p = me.document.createElement("p"); + _$jscoverage['plugins/insertparagraph.js'][34]++; + if (front) { + _$jscoverage['plugins/insertparagraph.js'][35]++; + tmpNode.parentNode.insertBefore(p, tmpNode); + } + else { + _$jscoverage['plugins/insertparagraph.js'][37]++; + tmpNode.parentNode.insertBefore(p, tmpNode.nextSibling); + } + _$jscoverage['plugins/insertparagraph.js'][39]++; + domUtils.fillNode(me.document, p); + _$jscoverage['plugins/insertparagraph.js'][40]++; + range.setStart(p, 0).setCursor(false, true); + } +})}; diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/justify.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/justify.js new file mode 100644 index 000000000..ebe5ef7f1 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/justify.js @@ -0,0 +1,186 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/justify.js']) { + _$jscoverage['plugins/justify.js'] = []; + _$jscoverage['plugins/justify.js'][40] = 0; + _$jscoverage['plugins/justify.js'][41] = 0; + _$jscoverage['plugins/justify.js'][50] = 0; + _$jscoverage['plugins/justify.js'][52] = 0; + _$jscoverage['plugins/justify.js'][55] = 0; + _$jscoverage['plugins/justify.js'][56] = 0; + _$jscoverage['plugins/justify.js'][60] = 0; + _$jscoverage['plugins/justify.js'][61] = 0; + _$jscoverage['plugins/justify.js'][62] = 0; + _$jscoverage['plugins/justify.js'][63] = 0; + _$jscoverage['plugins/justify.js'][64] = 0; + _$jscoverage['plugins/justify.js'][65] = 0; + _$jscoverage['plugins/justify.js'][66] = 0; + _$jscoverage['plugins/justify.js'][69] = 0; + _$jscoverage['plugins/justify.js'][70] = 0; + _$jscoverage['plugins/justify.js'][71] = 0; + _$jscoverage['plugins/justify.js'][72] = 0; + _$jscoverage['plugins/justify.js'][73] = 0; + _$jscoverage['plugins/justify.js'][75] = 0; + _$jscoverage['plugins/justify.js'][76] = 0; + _$jscoverage['plugins/justify.js'][77] = 0; + _$jscoverage['plugins/justify.js'][78] = 0; + _$jscoverage['plugins/justify.js'][79] = 0; + _$jscoverage['plugins/justify.js'][80] = 0; + _$jscoverage['plugins/justify.js'][82] = 0; + _$jscoverage['plugins/justify.js'][84] = 0; + _$jscoverage['plugins/justify.js'][87] = 0; + _$jscoverage['plugins/justify.js'][90] = 0; + _$jscoverage['plugins/justify.js'][92] = 0; + _$jscoverage['plugins/justify.js'][96] = 0; + _$jscoverage['plugins/justify.js'][97] = 0; + _$jscoverage['plugins/justify.js'][98] = 0; + _$jscoverage['plugins/justify.js'][100] = 0; + _$jscoverage['plugins/justify.js'][101] = 0; + _$jscoverage['plugins/justify.js'][102] = 0; + _$jscoverage['plugins/justify.js'][103] = 0; + _$jscoverage['plugins/justify.js'][106] = 0; + _$jscoverage['plugins/justify.js'][109] = 0; + _$jscoverage['plugins/justify.js'][112] = 0; + _$jscoverage['plugins/justify.js'][114] = 0; + _$jscoverage['plugins/justify.js'][117] = 0; + _$jscoverage['plugins/justify.js'][120] = 0; +} +_$jscoverage['plugins/justify.js'].source = ["/**"," * 段落格式"," * @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' );"," * ```"," */","/**"," * 返回当前选区位置是否是图片"," * @command justify"," * @method queryCommandState"," * @param { String } cmd 命令字符串"," * @return { Int } 0为是,-1为不是"," * @example"," * ```javascript"," * editor.queryCommandState( '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;"," }",""," };","};"]; +_$jscoverage['plugins/justify.js'][40]++; +UE.plugins.justify = (function () { + _$jscoverage['plugins/justify.js'][41]++; + var me = this, block = domUtils.isBlockElm, defaultValue = {left: 1, right: 1, center: 1, justify: 1}, doJustify = (function (range, style) { + _$jscoverage['plugins/justify.js'][50]++; + var bookmark = range.createBookmark(), filterFn = (function (node) { + _$jscoverage['plugins/justify.js'][52]++; + return ((node.nodeType == 1)? ((node.tagName.toLowerCase() != "br") && (! domUtils.isBookmarkNode(node))): (! domUtils.isWhitespace(node))); +}); + _$jscoverage['plugins/justify.js'][55]++; + range.enlarge(true); + _$jscoverage['plugins/justify.js'][56]++; + var bookmark2 = range.createBookmark(), current = domUtils.getNextDomNode(bookmark2.start, false, filterFn), tmpRange = range.cloneRange(), tmpNode; + _$jscoverage['plugins/justify.js'][60]++; + while ((current && (! (domUtils.getPosition(current, bookmark2.end) & domUtils.POSITION_FOLLOWING)))) { + _$jscoverage['plugins/justify.js'][61]++; + if (((current.nodeType == 3) || (! block(current)))) { + _$jscoverage['plugins/justify.js'][62]++; + tmpRange.setStartBefore(current); + _$jscoverage['plugins/justify.js'][63]++; + while ((current && (current !== bookmark2.end) && (! block(current)))) { + _$jscoverage['plugins/justify.js'][64]++; + tmpNode = current; + _$jscoverage['plugins/justify.js'][65]++; + current = domUtils.getNextDomNode(current, false, null, (function (node) { + _$jscoverage['plugins/justify.js'][66]++; + return (! block(node)); +})); +} + _$jscoverage['plugins/justify.js'][69]++; + tmpRange.setEndAfter(tmpNode); + _$jscoverage['plugins/justify.js'][70]++; + var common = tmpRange.getCommonAncestor(); + _$jscoverage['plugins/justify.js'][71]++; + if (((! domUtils.isBody(common)) && block(common))) { + _$jscoverage['plugins/justify.js'][72]++; + domUtils.setStyles(common, (utils.isString(style)? {"text-align": style}: style)); + _$jscoverage['plugins/justify.js'][73]++; + current = common; + } + else { + _$jscoverage['plugins/justify.js'][75]++; + var p = range.document.createElement("p"); + _$jscoverage['plugins/justify.js'][76]++; + domUtils.setStyles(p, (utils.isString(style)? {"text-align": style}: style)); + _$jscoverage['plugins/justify.js'][77]++; + var frag = tmpRange.extractContents(); + _$jscoverage['plugins/justify.js'][78]++; + p.appendChild(frag); + _$jscoverage['plugins/justify.js'][79]++; + tmpRange.insertNode(p); + _$jscoverage['plugins/justify.js'][80]++; + current = p; + } + _$jscoverage['plugins/justify.js'][82]++; + current = domUtils.getNextDomNode(current, false, filterFn); + } + else { + _$jscoverage['plugins/justify.js'][84]++; + current = domUtils.getNextDomNode(current, true, filterFn); + } +} + _$jscoverage['plugins/justify.js'][87]++; + return range.moveToBookmark(bookmark2).moveToBookmark(bookmark); +}); + _$jscoverage['plugins/justify.js'][90]++; + UE.commands.justify = {execCommand: (function (cmdName, align) { + _$jscoverage['plugins/justify.js'][92]++; + var range = this.selection.getRange(), txt; + _$jscoverage['plugins/justify.js'][96]++; + if (range.collapsed) { + _$jscoverage['plugins/justify.js'][97]++; + txt = this.document.createTextNode("p"); + _$jscoverage['plugins/justify.js'][98]++; + range.insertNode(txt); + } + _$jscoverage['plugins/justify.js'][100]++; + doJustify(range, align); + _$jscoverage['plugins/justify.js'][101]++; + if (txt) { + _$jscoverage['plugins/justify.js'][102]++; + range.setStartBefore(txt).collapse(true); + _$jscoverage['plugins/justify.js'][103]++; + domUtils.remove(txt); + } + _$jscoverage['plugins/justify.js'][106]++; + range.select(); + _$jscoverage['plugins/justify.js'][109]++; + return true; +}), queryCommandValue: (function () { + _$jscoverage['plugins/justify.js'][112]++; + var startNode = this.selection.getStart(), value = domUtils.getComputedStyle(startNode, "text-align"); + _$jscoverage['plugins/justify.js'][114]++; + return (defaultValue[value]? value: "left"); +}), queryCommandState: (function () { + _$jscoverage['plugins/justify.js'][117]++; + var start = this.selection.getStart(), cell = (start && domUtils.findParentByTagName(start, ["td", "th", "caption"], true)); + _$jscoverage['plugins/justify.js'][120]++; + return (cell? -1: 0); +})}; +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/keystrokes.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/keystrokes.js new file mode 100644 index 000000000..6be9a96d8 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/keystrokes.js @@ -0,0 +1,465 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/keystrokes.js']) { + _$jscoverage['plugins/keystrokes.js'] = []; + _$jscoverage['plugins/keystrokes.js'][4] = 0; + _$jscoverage['plugins/keystrokes.js'][5] = 0; + _$jscoverage['plugins/keystrokes.js'][6] = 0; + _$jscoverage['plugins/keystrokes.js'][7] = 0; + _$jscoverage['plugins/keystrokes.js'][8] = 0; + _$jscoverage['plugins/keystrokes.js'][12] = 0; + _$jscoverage['plugins/keystrokes.js'][21] = 0; + _$jscoverage['plugins/keystrokes.js'][22] = 0; + _$jscoverage['plugins/keystrokes.js'][23] = 0; + _$jscoverage['plugins/keystrokes.js'][25] = 0; + _$jscoverage['plugins/keystrokes.js'][26] = 0; + _$jscoverage['plugins/keystrokes.js'][27] = 0; + _$jscoverage['plugins/keystrokes.js'][29] = 0; + _$jscoverage['plugins/keystrokes.js'][32] = 0; + _$jscoverage['plugins/keystrokes.js'][33] = 0; + _$jscoverage['plugins/keystrokes.js'][34] = 0; + _$jscoverage['plugins/keystrokes.js'][35] = 0; + _$jscoverage['plugins/keystrokes.js'][38] = 0; + _$jscoverage['plugins/keystrokes.js'][39] = 0; + _$jscoverage['plugins/keystrokes.js'][40] = 0; + _$jscoverage['plugins/keystrokes.js'][41] = 0; + _$jscoverage['plugins/keystrokes.js'][42] = 0; + _$jscoverage['plugins/keystrokes.js'][43] = 0; + _$jscoverage['plugins/keystrokes.js'][44] = 0; + _$jscoverage['plugins/keystrokes.js'][45] = 0; + _$jscoverage['plugins/keystrokes.js'][46] = 0; + _$jscoverage['plugins/keystrokes.js'][47] = 0; + _$jscoverage['plugins/keystrokes.js'][54] = 0; + _$jscoverage['plugins/keystrokes.js'][55] = 0; + _$jscoverage['plugins/keystrokes.js'][56] = 0; + _$jscoverage['plugins/keystrokes.js'][57] = 0; + _$jscoverage['plugins/keystrokes.js'][58] = 0; + _$jscoverage['plugins/keystrokes.js'][60] = 0; + _$jscoverage['plugins/keystrokes.js'][62] = 0; + _$jscoverage['plugins/keystrokes.js'][63] = 0; + _$jscoverage['plugins/keystrokes.js'][65] = 0; + _$jscoverage['plugins/keystrokes.js'][66] = 0; + _$jscoverage['plugins/keystrokes.js'][67] = 0; + _$jscoverage['plugins/keystrokes.js'][69] = 0; + _$jscoverage['plugins/keystrokes.js'][70] = 0; + _$jscoverage['plugins/keystrokes.js'][71] = 0; + _$jscoverage['plugins/keystrokes.js'][76] = 0; + _$jscoverage['plugins/keystrokes.js'][77] = 0; + _$jscoverage['plugins/keystrokes.js'][78] = 0; + _$jscoverage['plugins/keystrokes.js'][79] = 0; + _$jscoverage['plugins/keystrokes.js'][80] = 0; + _$jscoverage['plugins/keystrokes.js'][81] = 0; + _$jscoverage['plugins/keystrokes.js'][82] = 0; + _$jscoverage['plugins/keystrokes.js'][83] = 0; + _$jscoverage['plugins/keystrokes.js'][86] = 0; + _$jscoverage['plugins/keystrokes.js'][87] = 0; + _$jscoverage['plugins/keystrokes.js'][88] = 0; + _$jscoverage['plugins/keystrokes.js'][89] = 0; + _$jscoverage['plugins/keystrokes.js'][90] = 0; + _$jscoverage['plugins/keystrokes.js'][91] = 0; + _$jscoverage['plugins/keystrokes.js'][97] = 0; + _$jscoverage['plugins/keystrokes.js'][99] = 0; + _$jscoverage['plugins/keystrokes.js'][105] = 0; + _$jscoverage['plugins/keystrokes.js'][106] = 0; + _$jscoverage['plugins/keystrokes.js'][107] = 0; + _$jscoverage['plugins/keystrokes.js'][109] = 0; + _$jscoverage['plugins/keystrokes.js'][110] = 0; + _$jscoverage['plugins/keystrokes.js'][111] = 0; + _$jscoverage['plugins/keystrokes.js'][112] = 0; + _$jscoverage['plugins/keystrokes.js'][114] = 0; + _$jscoverage['plugins/keystrokes.js'][115] = 0; + _$jscoverage['plugins/keystrokes.js'][116] = 0; + _$jscoverage['plugins/keystrokes.js'][117] = 0; + _$jscoverage['plugins/keystrokes.js'][120] = 0; + _$jscoverage['plugins/keystrokes.js'][121] = 0; + _$jscoverage['plugins/keystrokes.js'][122] = 0; + _$jscoverage['plugins/keystrokes.js'][123] = 0; + _$jscoverage['plugins/keystrokes.js'][124] = 0; + _$jscoverage['plugins/keystrokes.js'][126] = 0; + _$jscoverage['plugins/keystrokes.js'][128] = 0; + _$jscoverage['plugins/keystrokes.js'][131] = 0; + _$jscoverage['plugins/keystrokes.js'][132] = 0; + _$jscoverage['plugins/keystrokes.js'][134] = 0; + _$jscoverage['plugins/keystrokes.js'][135] = 0; + _$jscoverage['plugins/keystrokes.js'][136] = 0; + _$jscoverage['plugins/keystrokes.js'][138] = 0; + _$jscoverage['plugins/keystrokes.js'][141] = 0; + _$jscoverage['plugins/keystrokes.js'][145] = 0; + _$jscoverage['plugins/keystrokes.js'][146] = 0; + _$jscoverage['plugins/keystrokes.js'][147] = 0; + _$jscoverage['plugins/keystrokes.js'][148] = 0; + _$jscoverage['plugins/keystrokes.js'][149] = 0; + _$jscoverage['plugins/keystrokes.js'][150] = 0; + _$jscoverage['plugins/keystrokes.js'][151] = 0; + _$jscoverage['plugins/keystrokes.js'][152] = 0; + _$jscoverage['plugins/keystrokes.js'][153] = 0; + _$jscoverage['plugins/keystrokes.js'][155] = 0; + _$jscoverage['plugins/keystrokes.js'][156] = 0; + _$jscoverage['plugins/keystrokes.js'][157] = 0; + _$jscoverage['plugins/keystrokes.js'][162] = 0; + _$jscoverage['plugins/keystrokes.js'][163] = 0; + _$jscoverage['plugins/keystrokes.js'][165] = 0; + _$jscoverage['plugins/keystrokes.js'][166] = 0; + _$jscoverage['plugins/keystrokes.js'][167] = 0; + _$jscoverage['plugins/keystrokes.js'][169] = 0; + _$jscoverage['plugins/keystrokes.js'][170] = 0; + _$jscoverage['plugins/keystrokes.js'][171] = 0; + _$jscoverage['plugins/keystrokes.js'][173] = 0; + _$jscoverage['plugins/keystrokes.js'][174] = 0; + _$jscoverage['plugins/keystrokes.js'][175] = 0; + _$jscoverage['plugins/keystrokes.js'][176] = 0; + _$jscoverage['plugins/keystrokes.js'][177] = 0; + _$jscoverage['plugins/keystrokes.js'][178] = 0; + _$jscoverage['plugins/keystrokes.js'][179] = 0; + _$jscoverage['plugins/keystrokes.js'][181] = 0; + _$jscoverage['plugins/keystrokes.js'][182] = 0; + _$jscoverage['plugins/keystrokes.js'][183] = 0; + _$jscoverage['plugins/keystrokes.js'][184] = 0; + _$jscoverage['plugins/keystrokes.js'][185] = 0; + _$jscoverage['plugins/keystrokes.js'][191] = 0; + _$jscoverage['plugins/keystrokes.js'][192] = 0; + _$jscoverage['plugins/keystrokes.js'][195] = 0; + _$jscoverage['plugins/keystrokes.js'][201] = 0; + _$jscoverage['plugins/keystrokes.js'][202] = 0; + _$jscoverage['plugins/keystrokes.js'][203] = 0; + _$jscoverage['plugins/keystrokes.js'][204] = 0; + _$jscoverage['plugins/keystrokes.js'][205] = 0; + _$jscoverage['plugins/keystrokes.js'][206] = 0; + _$jscoverage['plugins/keystrokes.js'][208] = 0; +} +_$jscoverage['plugins/keystrokes.js'].source = ["/*"," * 处理特殊键的兼容性问题"," */","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]<br/>"," 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 = '<p>'+(browser.ie ? '' : '<br/>')+'</p>';"," rng.setStart(me.body.firstChild,0).setCursor(false,true);"," me._selectionChange();"," return;"," }"," }"," }"," }",""," //处理backspace"," if (keyCode == 8) {"," 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 == 9) {"," //不处理以下标签"," 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 || '&nbsp;'; 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 {"," //普通的情况"," start = domUtils.findParent(range.startContainer, filterFn);"," end = domUtils.findParent(range.endContainer, filterFn);"," if (start && end && start === end) {"," range.deleteContents();"," range.insertNode(span.cloneNode(true).firstChild).setCursor(true);"," } else {"," var bookmark = range.createBookmark(),"," filterFn = function(node) {"," return domUtils.isBlockElm(node) && !excludeTagNameForTabKey[node.tagName.toLowerCase()]",""," };"," 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;"," }"," }"," }"," });"," me.addListener('keyup', function(type, evt) {"," var keyCode = evt.keyCode || evt.which,"," rng,me = this;"," if(keyCode == 8){"," 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 : '<br/>'"," });"," 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()"," }",""," }"," }",""," })","};"]; +_$jscoverage['plugins/keystrokes.js'][4]++; +UE.plugins.keystrokes = (function () { + _$jscoverage['plugins/keystrokes.js'][5]++; + var me = this; + _$jscoverage['plugins/keystrokes.js'][6]++; + var collapsed = true; + _$jscoverage['plugins/keystrokes.js'][7]++; + me.addListener("keydown", (function (type, evt) { + _$jscoverage['plugins/keystrokes.js'][8]++; + var keyCode = (evt.keyCode || evt.which), rng = me.selection.getRange(); + _$jscoverage['plugins/keystrokes.js'][12]++; + 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]))) { + _$jscoverage['plugins/keystrokes.js'][21]++; + var tmpNode = rng.startContainer; + _$jscoverage['plugins/keystrokes.js'][22]++; + if (domUtils.isFillChar(tmpNode)) { + _$jscoverage['plugins/keystrokes.js'][23]++; + rng.setStartBefore(tmpNode); + } + _$jscoverage['plugins/keystrokes.js'][25]++; + tmpNode = rng.endContainer; + _$jscoverage['plugins/keystrokes.js'][26]++; + if (domUtils.isFillChar(tmpNode)) { + _$jscoverage['plugins/keystrokes.js'][27]++; + rng.setEndAfter(tmpNode); + } + _$jscoverage['plugins/keystrokes.js'][29]++; + rng.txtToElmBoundary(); + _$jscoverage['plugins/keystrokes.js'][32]++; + if ((rng.endContainer && (rng.endContainer.nodeType == 1))) { + _$jscoverage['plugins/keystrokes.js'][33]++; + tmpNode = rng.endContainer.childNodes[rng.endOffset]; + _$jscoverage['plugins/keystrokes.js'][34]++; + if ((tmpNode && domUtils.isBr(tmpNode))) { + _$jscoverage['plugins/keystrokes.js'][35]++; + rng.setEndAfter(tmpNode); + } + } + _$jscoverage['plugins/keystrokes.js'][38]++; + if ((rng.startOffset == 0)) { + _$jscoverage['plugins/keystrokes.js'][39]++; + tmpNode = rng.startContainer; + _$jscoverage['plugins/keystrokes.js'][40]++; + if (domUtils.isBoundaryNode(tmpNode, "firstChild")) { + _$jscoverage['plugins/keystrokes.js'][41]++; + tmpNode = rng.endContainer; + _$jscoverage['plugins/keystrokes.js'][42]++; + if (((rng.endOffset == ((tmpNode.nodeType == 3)? tmpNode.nodeValue.length: tmpNode.childNodes.length)) && domUtils.isBoundaryNode(tmpNode, "lastChild"))) { + _$jscoverage['plugins/keystrokes.js'][43]++; + me.fireEvent("saveScene"); + _$jscoverage['plugins/keystrokes.js'][44]++; + me.body.innerHTML = ("

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

    "); + _$jscoverage['plugins/keystrokes.js'][45]++; + rng.setStart(me.body.firstChild, 0).setCursor(false, true); + _$jscoverage['plugins/keystrokes.js'][46]++; + me._selectionChange(); + _$jscoverage['plugins/keystrokes.js'][47]++; + return; + } + } + } + } + _$jscoverage['plugins/keystrokes.js'][54]++; + if ((keyCode == 8)) { + _$jscoverage['plugins/keystrokes.js'][55]++; + rng = me.selection.getRange(); + _$jscoverage['plugins/keystrokes.js'][56]++; + collapsed = rng.collapsed; + _$jscoverage['plugins/keystrokes.js'][57]++; + if (me.fireEvent("delkeydown", evt)) { + _$jscoverage['plugins/keystrokes.js'][58]++; + return; + } + _$jscoverage['plugins/keystrokes.js'][60]++; + var start, end; + _$jscoverage['plugins/keystrokes.js'][62]++; + if ((rng.collapsed && rng.inFillChar())) { + _$jscoverage['plugins/keystrokes.js'][63]++; + start = rng.startContainer; + _$jscoverage['plugins/keystrokes.js'][65]++; + if (domUtils.isFillChar(start)) { + _$jscoverage['plugins/keystrokes.js'][66]++; + rng.setStartBefore(start).shrinkBoundary(true).collapse(true); + _$jscoverage['plugins/keystrokes.js'][67]++; + domUtils.remove(start); + } + else { + _$jscoverage['plugins/keystrokes.js'][69]++; + start.nodeValue = start.nodeValue.replace(new RegExp(("^" + domUtils.fillChar)), ""); + _$jscoverage['plugins/keystrokes.js'][70]++; + (rng.startOffset--); + _$jscoverage['plugins/keystrokes.js'][71]++; + rng.collapse(true).select(true); + } + } + _$jscoverage['plugins/keystrokes.js'][76]++; + if ((start = rng.getClosedNode())) { + _$jscoverage['plugins/keystrokes.js'][77]++; + me.fireEvent("saveScene"); + _$jscoverage['plugins/keystrokes.js'][78]++; + rng.setStartBefore(start); + _$jscoverage['plugins/keystrokes.js'][79]++; + domUtils.remove(start); + _$jscoverage['plugins/keystrokes.js'][80]++; + rng.setCursor(); + _$jscoverage['plugins/keystrokes.js'][81]++; + me.fireEvent("saveScene"); + _$jscoverage['plugins/keystrokes.js'][82]++; + domUtils.preventDefault(evt); + _$jscoverage['plugins/keystrokes.js'][83]++; + return; + } + _$jscoverage['plugins/keystrokes.js'][86]++; + if ((! browser.ie)) { + _$jscoverage['plugins/keystrokes.js'][87]++; + start = domUtils.findParentByTagName(rng.startContainer, "table", true); + _$jscoverage['plugins/keystrokes.js'][88]++; + end = domUtils.findParentByTagName(rng.endContainer, "table", true); + _$jscoverage['plugins/keystrokes.js'][89]++; + if (((start && (! end)) || ((! start) && end) || (start !== end))) { + _$jscoverage['plugins/keystrokes.js'][90]++; + evt.preventDefault(); + _$jscoverage['plugins/keystrokes.js'][91]++; + return; + } + } + } + _$jscoverage['plugins/keystrokes.js'][97]++; + if ((keyCode == 9)) { + _$jscoverage['plugins/keystrokes.js'][99]++; + var excludeTagNameForTabKey = {"ol": 1, "ul": 1, "table": 1}; + _$jscoverage['plugins/keystrokes.js'][105]++; + if (me.fireEvent("tabkeydown", evt)) { + _$jscoverage['plugins/keystrokes.js'][106]++; + domUtils.preventDefault(evt); + _$jscoverage['plugins/keystrokes.js'][107]++; + return; + } + _$jscoverage['plugins/keystrokes.js'][109]++; + var range = me.selection.getRange(); + _$jscoverage['plugins/keystrokes.js'][110]++; + me.fireEvent("saveScene"); + _$jscoverage['plugins/keystrokes.js'][111]++; + for (var i = 0, txt = "", tabSize = (me.options.tabSize || 4), tabNode = (me.options.tabNode || " "); (i < tabSize); (i++)) { + _$jscoverage['plugins/keystrokes.js'][112]++; + txt += tabNode; +} + _$jscoverage['plugins/keystrokes.js'][114]++; + var span = me.document.createElement("span"); + _$jscoverage['plugins/keystrokes.js'][115]++; + span.innerHTML = (txt + domUtils.fillChar); + _$jscoverage['plugins/keystrokes.js'][116]++; + if (range.collapsed) { + _$jscoverage['plugins/keystrokes.js'][117]++; + range.insertNode(span.cloneNode(true).firstChild).setCursor(true); + } + else { + _$jscoverage['plugins/keystrokes.js'][120]++; + start = domUtils.findParent(range.startContainer, filterFn); + _$jscoverage['plugins/keystrokes.js'][121]++; + end = domUtils.findParent(range.endContainer, filterFn); + _$jscoverage['plugins/keystrokes.js'][122]++; + if ((start && end && (start === end))) { + _$jscoverage['plugins/keystrokes.js'][123]++; + range.deleteContents(); + _$jscoverage['plugins/keystrokes.js'][124]++; + range.insertNode(span.cloneNode(true).firstChild).setCursor(true); + } + else { + _$jscoverage['plugins/keystrokes.js'][126]++; + var bookmark = range.createBookmark(), filterFn = (function (node) { + _$jscoverage['plugins/keystrokes.js'][128]++; + return (domUtils.isBlockElm(node) && (! excludeTagNameForTabKey[node.tagName.toLowerCase()])); +}); + _$jscoverage['plugins/keystrokes.js'][131]++; + range.enlarge(true); + _$jscoverage['plugins/keystrokes.js'][132]++; + var bookmark2 = range.createBookmark(), current = domUtils.getNextDomNode(bookmark2.start, false, filterFn); + _$jscoverage['plugins/keystrokes.js'][134]++; + while ((current && (! (domUtils.getPosition(current, bookmark2.end) & domUtils.POSITION_FOLLOWING)))) { + _$jscoverage['plugins/keystrokes.js'][135]++; + current.insertBefore(span.cloneNode(true).firstChild, current.firstChild); + _$jscoverage['plugins/keystrokes.js'][136]++; + current = domUtils.getNextDomNode(current, false, filterFn); +} + _$jscoverage['plugins/keystrokes.js'][138]++; + range.moveToBookmark(bookmark2).moveToBookmark(bookmark).select(); + } + } + _$jscoverage['plugins/keystrokes.js'][141]++; + domUtils.preventDefault(evt); + } + _$jscoverage['plugins/keystrokes.js'][145]++; + if ((browser.gecko && (keyCode == 46))) { + _$jscoverage['plugins/keystrokes.js'][146]++; + range = me.selection.getRange(); + _$jscoverage['plugins/keystrokes.js'][147]++; + if (range.collapsed) { + _$jscoverage['plugins/keystrokes.js'][148]++; + start = range.startContainer; + _$jscoverage['plugins/keystrokes.js'][149]++; + if (domUtils.isEmptyBlock(start)) { + _$jscoverage['plugins/keystrokes.js'][150]++; + var parent = start.parentNode; + _$jscoverage['plugins/keystrokes.js'][151]++; + while (((domUtils.getChildCount(parent) == 1) && (! domUtils.isBody(parent)))) { + _$jscoverage['plugins/keystrokes.js'][152]++; + start = parent; + _$jscoverage['plugins/keystrokes.js'][153]++; + parent = parent.parentNode; +} + _$jscoverage['plugins/keystrokes.js'][155]++; + if ((start === parent.lastChild)) { + _$jscoverage['plugins/keystrokes.js'][156]++; + evt.preventDefault(); + } + _$jscoverage['plugins/keystrokes.js'][157]++; + return; + } + } + } +})); + _$jscoverage['plugins/keystrokes.js'][162]++; + me.addListener("keyup", (function (type, evt) { + _$jscoverage['plugins/keystrokes.js'][163]++; + var keyCode = (evt.keyCode || evt.which), rng, me = this; + _$jscoverage['plugins/keystrokes.js'][165]++; + if ((keyCode == 8)) { + _$jscoverage['plugins/keystrokes.js'][166]++; + if (me.fireEvent("delkeyup")) { + _$jscoverage['plugins/keystrokes.js'][167]++; + return; + } + _$jscoverage['plugins/keystrokes.js'][169]++; + rng = me.selection.getRange(); + _$jscoverage['plugins/keystrokes.js'][170]++; + if (rng.collapsed) { + _$jscoverage['plugins/keystrokes.js'][171]++; + var tmpNode, autoClearTagName = ["h1", "h2", "h3", "h4", "h5", "h6"]; + _$jscoverage['plugins/keystrokes.js'][173]++; + if ((tmpNode = domUtils.findParentByTagName(rng.startContainer, autoClearTagName, true))) { + _$jscoverage['plugins/keystrokes.js'][174]++; + if (domUtils.isEmptyBlock(tmpNode)) { + _$jscoverage['plugins/keystrokes.js'][175]++; + var pre = tmpNode.previousSibling; + _$jscoverage['plugins/keystrokes.js'][176]++; + if ((pre && (pre.nodeName != "TABLE"))) { + _$jscoverage['plugins/keystrokes.js'][177]++; + domUtils.remove(tmpNode); + _$jscoverage['plugins/keystrokes.js'][178]++; + rng.setStartAtLast(pre).setCursor(false, true); + _$jscoverage['plugins/keystrokes.js'][179]++; + return; + } + else { + _$jscoverage['plugins/keystrokes.js'][181]++; + var next = tmpNode.nextSibling; + _$jscoverage['plugins/keystrokes.js'][182]++; + if ((next && (next.nodeName != "TABLE"))) { + _$jscoverage['plugins/keystrokes.js'][183]++; + domUtils.remove(tmpNode); + _$jscoverage['plugins/keystrokes.js'][184]++; + rng.setStartAtFirst(next).setCursor(false, true); + _$jscoverage['plugins/keystrokes.js'][185]++; + return; + } + } + } + } + _$jscoverage['plugins/keystrokes.js'][191]++; + if (domUtils.isBody(rng.startContainer)) { + _$jscoverage['plugins/keystrokes.js'][192]++; + var tmpNode = domUtils.createElement(me.document, "p", {"innerHTML": (browser.ie? domUtils.fillChar: "
    ")}); + _$jscoverage['plugins/keystrokes.js'][195]++; + rng.insertNode(tmpNode).setStart(tmpNode, 0).setCursor(false, true); + } + } + _$jscoverage['plugins/keystrokes.js'][201]++; + if (((! collapsed) && ((rng.startContainer.nodeType == 3) || ((rng.startContainer.nodeType == 1) && domUtils.isEmptyBlock(rng.startContainer))))) { + _$jscoverage['plugins/keystrokes.js'][202]++; + if (browser.ie) { + _$jscoverage['plugins/keystrokes.js'][203]++; + var span = rng.document.createElement("span"); + _$jscoverage['plugins/keystrokes.js'][204]++; + rng.insertNode(span).setStartBefore(span).collapse(true); + _$jscoverage['plugins/keystrokes.js'][205]++; + rng.select(); + _$jscoverage['plugins/keystrokes.js'][206]++; + domUtils.remove(span); + } + else { + _$jscoverage['plugins/keystrokes.js'][208]++; + rng.select(); + } + } + } +})); +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/lineheight.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/lineheight.js new file mode 100644 index 000000000..7c9d13c2f --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/lineheight.js @@ -0,0 +1,80 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/lineheight.js']) { + _$jscoverage['plugins/lineheight.js'] = []; + _$jscoverage['plugins/lineheight.js'][7] = 0; + _$jscoverage['plugins/lineheight.js'][8] = 0; + _$jscoverage['plugins/lineheight.js'][9] = 0; + _$jscoverage['plugins/lineheight.js'][33] = 0; + _$jscoverage['plugins/lineheight.js'][35] = 0; + _$jscoverage['plugins/lineheight.js'][36] = 0; + _$jscoverage['plugins/lineheight.js'][39] = 0; + _$jscoverage['plugins/lineheight.js'][40] = 0; + _$jscoverage['plugins/lineheight.js'][41] = 0; + _$jscoverage['plugins/lineheight.js'][42] = 0; +} +_$jscoverage['plugins/lineheight.js'].source = ["/**"," * 设置行内间距"," * @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 传入的行高大小"," * @example"," * ```javascript"," * editor.execCommand( 'lineheight', '1');"," * ```"," */"," /**"," * 查询当前选区内容的行高大小"," * @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.]*/ig,\"\");"," }"," }"," };","};","",""]; +_$jscoverage['plugins/lineheight.js'][7]++; +UE.plugins.lineheight = (function () { + _$jscoverage['plugins/lineheight.js'][8]++; + var me = this; + _$jscoverage['plugins/lineheight.js'][9]++; + me.setOpt({"lineheight": ["1", "1.5", "1.75", "2", "3", "4", "5"]}); + _$jscoverage['plugins/lineheight.js'][33]++; + me.commands.lineheight = {execCommand: (function (cmdName, value) { + _$jscoverage['plugins/lineheight.js'][35]++; + this.execCommand("paragraph", "p", {style: ("line-height:" + ((value == "1")? "normal": (value + "em")))}); + _$jscoverage['plugins/lineheight.js'][36]++; + return true; +}), queryCommandValue: (function () { + _$jscoverage['plugins/lineheight.js'][39]++; + var pN = domUtils.filterNodeList(this.selection.getStartElementPath(), (function (node) { + _$jscoverage['plugins/lineheight.js'][39]++; + return domUtils.isBlockElm(node); +})); + _$jscoverage['plugins/lineheight.js'][40]++; + if (pN) { + _$jscoverage['plugins/lineheight.js'][41]++; + var value = domUtils.getComputedStyle(pN, "line-height"); + _$jscoverage['plugins/lineheight.js'][42]++; + return ((value == "normal")? 1: value.replace(/[^\d.]*/gi, "")); + } +})}; +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/link.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/link.js new file mode 100644 index 000000000..eeedea7ab --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/link.js @@ -0,0 +1,266 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/link.js']) { + _$jscoverage['plugins/link.js'] = []; + _$jscoverage['plugins/link.js'][66] = 0; + _$jscoverage['plugins/link.js'][67] = 0; + _$jscoverage['plugins/link.js'][68] = 0; + _$jscoverage['plugins/link.js'][70] = 0; + _$jscoverage['plugins/link.js'][71] = 0; + _$jscoverage['plugins/link.js'][73] = 0; + _$jscoverage['plugins/link.js'][74] = 0; + _$jscoverage['plugins/link.js'][79] = 0; + _$jscoverage['plugins/link.js'][81] = 0; + _$jscoverage['plugins/link.js'][83] = 0; + _$jscoverage['plugins/link.js'][84] = 0; + _$jscoverage['plugins/link.js'][86] = 0; + _$jscoverage['plugins/link.js'][87] = 0; + _$jscoverage['plugins/link.js'][88] = 0; + _$jscoverage['plugins/link.js'][91] = 0; + _$jscoverage['plugins/link.js'][95] = 0; + _$jscoverage['plugins/link.js'][96] = 0; + _$jscoverage['plugins/link.js'][98] = 0; + _$jscoverage['plugins/link.js'][99] = 0; + _$jscoverage['plugins/link.js'][100] = 0; + _$jscoverage['plugins/link.js'][101] = 0; + _$jscoverage['plugins/link.js'][102] = 0; + _$jscoverage['plugins/link.js'][103] = 0; + _$jscoverage['plugins/link.js'][107] = 0; + _$jscoverage['plugins/link.js'][108] = 0; + _$jscoverage['plugins/link.js'][109] = 0; + _$jscoverage['plugins/link.js'][112] = 0; + _$jscoverage['plugins/link.js'][113] = 0; + _$jscoverage['plugins/link.js'][115] = 0; + _$jscoverage['plugins/link.js'][117] = 0; + _$jscoverage['plugins/link.js'][118] = 0; + _$jscoverage['plugins/link.js'][120] = 0; + _$jscoverage['plugins/link.js'][123] = 0; + _$jscoverage['plugins/link.js'][124] = 0; + _$jscoverage['plugins/link.js'][125] = 0; + _$jscoverage['plugins/link.js'][126] = 0; + _$jscoverage['plugins/link.js'][129] = 0; + _$jscoverage['plugins/link.js'][130] = 0; + _$jscoverage['plugins/link.js'][132] = 0; + _$jscoverage['plugins/link.js'][136] = 0; + _$jscoverage['plugins/link.js'][138] = 0; + _$jscoverage['plugins/link.js'][139] = 0; + _$jscoverage['plugins/link.js'][140] = 0; + _$jscoverage['plugins/link.js'][141] = 0; + _$jscoverage['plugins/link.js'][142] = 0; + _$jscoverage['plugins/link.js'][144] = 0; + _$jscoverage['plugins/link.js'][148] = 0; + _$jscoverage['plugins/link.js'][150] = 0; + _$jscoverage['plugins/link.js'][153] = 0; + _$jscoverage['plugins/link.js'][154] = 0; + _$jscoverage['plugins/link.js'][156] = 0; + _$jscoverage['plugins/link.js'][158] = 0; + _$jscoverage['plugins/link.js'][162] = 0; + _$jscoverage['plugins/link.js'][163] = 0; + _$jscoverage['plugins/link.js'][166] = 0; + _$jscoverage['plugins/link.js'][167] = 0; + _$jscoverage['plugins/link.js'][169] = 0; + _$jscoverage['plugins/link.js'][172] = 0; + _$jscoverage['plugins/link.js'][173] = 0; + _$jscoverage['plugins/link.js'][174] = 0; + _$jscoverage['plugins/link.js'][178] = 0; + _$jscoverage['plugins/link.js'][179] = 0; + _$jscoverage['plugins/link.js'][183] = 0; + _$jscoverage['plugins/link.js'][190] = 0; + _$jscoverage['plugins/link.js'][192] = 0; +} +_$jscoverage['plugins/link.js'].source = ["/**"," * 超链接"," * @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:'ueditor.baidu.com',"," * title:'ueditor官网',"," * target:'_blank'"," * }' );"," * ```"," */","/**"," * 如果选区所在位置是区域,返回当前超链接节点"," * @command link"," * @method queryCommandValue"," * @param { String } cmd 命令字符串"," * @return { Element } 超链接节点"," * @example"," * ```javascript"," * editor.queryCommandValue( 'link' );"," * ```"," */","/**"," * 返回当前选区位置是否是超链接"," * @command link"," * @method queryCommandState"," * @param { String } cmd 命令字符串"," * @return { Int } 0为是,-1为不是"," * @example"," * ```javascript"," * editor.queryCommandState( 'link' );"," * ```"," */","","/**"," * 根据当前选区取消超链接"," * @command unlink"," * @method execCommand"," * @param { String } cmd 命令字符串"," * @example"," * ```javascript"," * editor.execCommand( 'unlink');"," * ```"," */","/**"," * 返回当前选区位置是否是超链接"," * @command unlink"," * @method queryCommandState"," * @param { String } cmd 命令字符串"," * @return { Int } 0为是,-1为不是"," * @example"," * ```javascript"," * editor.queryCommandState( '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 如果是<p><a>xx</a></p> 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\");"," return flag ? -1 : 0;"," }"," };","};"]; +_$jscoverage['plugins/link.js'][66]++; +UE.plugins.link = (function () { + _$jscoverage['plugins/link.js'][67]++; + function optimize(range) { + _$jscoverage['plugins/link.js'][68]++; + var start = range.startContainer, end = range.endContainer; + _$jscoverage['plugins/link.js'][70]++; + if ((start = domUtils.findParentByTagName(start, "a", true))) { + _$jscoverage['plugins/link.js'][71]++; + range.setStartBefore(start); + } + _$jscoverage['plugins/link.js'][73]++; + if ((end = domUtils.findParentByTagName(end, "a", true))) { + _$jscoverage['plugins/link.js'][74]++; + range.setEndAfter(end); + } +} + _$jscoverage['plugins/link.js'][79]++; + UE.commands.unlink = {execCommand: (function () { + _$jscoverage['plugins/link.js'][81]++; + var range = this.selection.getRange(), bookmark; + _$jscoverage['plugins/link.js'][83]++; + if ((range.collapsed && (! domUtils.findParentByTagName(range.startContainer, "a", true)))) { + _$jscoverage['plugins/link.js'][84]++; + return; + } + _$jscoverage['plugins/link.js'][86]++; + bookmark = range.createBookmark(); + _$jscoverage['plugins/link.js'][87]++; + optimize(range); + _$jscoverage['plugins/link.js'][88]++; + range.removeInlineStyle("a").moveToBookmark(bookmark).select(); +}), queryCommandState: (function () { + _$jscoverage['plugins/link.js'][91]++; + return (((! this.highlight) && this.queryCommandValue("link"))? 0: -1); +})}; + _$jscoverage['plugins/link.js'][95]++; + function doLink(range, opt, me) { + _$jscoverage['plugins/link.js'][96]++; + var rngClone = range.cloneRange(), link = me.queryCommandValue("link"); + _$jscoverage['plugins/link.js'][98]++; + optimize((range = range.adjustmentBoundary())); + _$jscoverage['plugins/link.js'][99]++; + var start = range.startContainer; + _$jscoverage['plugins/link.js'][100]++; + if (((start.nodeType == 1) && link)) { + _$jscoverage['plugins/link.js'][101]++; + start = start.childNodes[range.startOffset]; + _$jscoverage['plugins/link.js'][102]++; + if ((start && (start.nodeType == 1) && (start.tagName == "A") && /^(?:https?|ftp|file)\s*:\s*\/\//.test(start[(browser.ie? "innerText": "textContent")]))) { + _$jscoverage['plugins/link.js'][103]++; + start[(browser.ie? "innerText": "textContent")] = utils.html((opt.textValue || opt.href)); + } + } + _$jscoverage['plugins/link.js'][107]++; + if (((! rngClone.collapsed) || link)) { + _$jscoverage['plugins/link.js'][108]++; + range.removeInlineStyle("a"); + _$jscoverage['plugins/link.js'][109]++; + rngClone = range.cloneRange(); + } + _$jscoverage['plugins/link.js'][112]++; + if (rngClone.collapsed) { + _$jscoverage['plugins/link.js'][113]++; + var a = range.document.createElement("a"), text = ""; + _$jscoverage['plugins/link.js'][115]++; + if (opt.textValue) { + _$jscoverage['plugins/link.js'][117]++; + text = utils.html(opt.textValue); + _$jscoverage['plugins/link.js'][118]++; + (delete opt.textValue); + } + else { + _$jscoverage['plugins/link.js'][120]++; + text = utils.html(opt.href); + } + _$jscoverage['plugins/link.js'][123]++; + domUtils.setAttributes(a, opt); + _$jscoverage['plugins/link.js'][124]++; + start = domUtils.findParentByTagName(rngClone.startContainer, "a", true); + _$jscoverage['plugins/link.js'][125]++; + if ((start && domUtils.isInNodeEndBoundary(rngClone, start))) { + _$jscoverage['plugins/link.js'][126]++; + range.setStartAfter(start).collapse(true); + } + _$jscoverage['plugins/link.js'][129]++; + a[(browser.ie? "innerText": "textContent")] = text; + _$jscoverage['plugins/link.js'][130]++; + range.insertNode(a).selectNode(a); + } + else { + _$jscoverage['plugins/link.js'][132]++; + range.applyInlineStyle("a", opt); + } +} + _$jscoverage['plugins/link.js'][136]++; + UE.commands.link = {execCommand: (function (cmdName, opt) { + _$jscoverage['plugins/link.js'][138]++; + var range; + _$jscoverage['plugins/link.js'][139]++; + (opt._href && (opt._href = utils.unhtml(opt._href, /[<">]/g))); + _$jscoverage['plugins/link.js'][140]++; + (opt.href && (opt.href = utils.unhtml(opt.href, /[<">]/g))); + _$jscoverage['plugins/link.js'][141]++; + (opt.textValue && (opt.textValue = utils.unhtml(opt.textValue, /[<">]/g))); + _$jscoverage['plugins/link.js'][142]++; + doLink((range = this.selection.getRange()), opt, this); + _$jscoverage['plugins/link.js'][144]++; + range.collapse().select(true); +}), queryCommandValue: (function () { + _$jscoverage['plugins/link.js'][148]++; + var range = this.selection.getRange(), node; + _$jscoverage['plugins/link.js'][150]++; + if (range.collapsed) { + _$jscoverage['plugins/link.js'][153]++; + node = range.startContainer; + _$jscoverage['plugins/link.js'][154]++; + node = ((node.nodeType == 1)? node: node.parentNode); + _$jscoverage['plugins/link.js'][156]++; + if ((node && (node = domUtils.findParentByTagName(node, "a", true)) && (! domUtils.isInNodeEndBoundary(range, node)))) { + _$jscoverage['plugins/link.js'][158]++; + return node; + } + } + else { + _$jscoverage['plugins/link.js'][162]++; + range.shrinkBoundary(); + _$jscoverage['plugins/link.js'][163]++; + 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(); + _$jscoverage['plugins/link.js'][166]++; + node = domUtils.findParentByTagName(common, "a", true); + _$jscoverage['plugins/link.js'][167]++; + if (((! node) && (common.nodeType == 1))) { + _$jscoverage['plugins/link.js'][169]++; + var as = common.getElementsByTagName("a"), ps, pe; + _$jscoverage['plugins/link.js'][172]++; + for (var i = 0, ci; (ci = as[(i++)]);) { + _$jscoverage['plugins/link.js'][173]++; + ((ps = domUtils.getPosition(ci, start)), (pe = domUtils.getPosition(ci, end))); + _$jscoverage['plugins/link.js'][174]++; + if ((((ps & domUtils.POSITION_FOLLOWING) || (ps & domUtils.POSITION_CONTAINS)) && ((pe & domUtils.POSITION_PRECEDING) || (pe & domUtils.POSITION_CONTAINS)))) { + _$jscoverage['plugins/link.js'][178]++; + node = ci; + _$jscoverage['plugins/link.js'][179]++; + break; + } +} + } + _$jscoverage['plugins/link.js'][183]++; + return node; + } +}), queryCommandState: (function () { + _$jscoverage['plugins/link.js'][190]++; + var img = this.selection.getRange().getClosedNode(), flag = (img && (img.className == "edui-faked-video")); + _$jscoverage['plugins/link.js'][192]++; + return (flag? -1: 0); +})}; +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/list.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/list.js new file mode 100644 index 000000000..3b18180e6 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/list.js @@ -0,0 +1,2337 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/list.js']) { + _$jscoverage['plugins/list.js'] = []; + _$jscoverage['plugins/list.js'][7] = 0; + _$jscoverage['plugins/list.js'][8] = 0; + _$jscoverage['plugins/list.js'][14] = 0; + _$jscoverage['plugins/list.js'][25] = 0; + _$jscoverage['plugins/list.js'][50] = 0; + _$jscoverage['plugins/list.js'][51] = 0; + _$jscoverage['plugins/list.js'][52] = 0; + _$jscoverage['plugins/list.js'][53] = 0; + _$jscoverage['plugins/list.js'][55] = 0; + _$jscoverage['plugins/list.js'][57] = 0; + _$jscoverage['plugins/list.js'][61] = 0; + _$jscoverage['plugins/list.js'][64] = 0; + _$jscoverage['plugins/list.js'][65] = 0; + _$jscoverage['plugins/list.js'][66] = 0; + _$jscoverage['plugins/list.js'][70] = 0; + _$jscoverage['plugins/list.js'][71] = 0; + _$jscoverage['plugins/list.js'][72] = 0; + _$jscoverage['plugins/list.js'][73] = 0; + _$jscoverage['plugins/list.js'][74] = 0; + _$jscoverage['plugins/list.js'][75] = 0; + _$jscoverage['plugins/list.js'][77] = 0; + _$jscoverage['plugins/list.js'][78] = 0; + _$jscoverage['plugins/list.js'][80] = 0; + _$jscoverage['plugins/list.js'][82] = 0; + _$jscoverage['plugins/list.js'][84] = 0; + _$jscoverage['plugins/list.js'][85] = 0; + _$jscoverage['plugins/list.js'][86] = 0; + _$jscoverage['plugins/list.js'][87] = 0; + _$jscoverage['plugins/list.js'][89] = 0; + _$jscoverage['plugins/list.js'][90] = 0; + _$jscoverage['plugins/list.js'][91] = 0; + _$jscoverage['plugins/list.js'][92] = 0; + _$jscoverage['plugins/list.js'][94] = 0; + _$jscoverage['plugins/list.js'][95] = 0; + _$jscoverage['plugins/list.js'][96] = 0; + _$jscoverage['plugins/list.js'][97] = 0; + _$jscoverage['plugins/list.js'][100] = 0; + _$jscoverage['plugins/list.js'][101] = 0; + _$jscoverage['plugins/list.js'][103] = 0; + _$jscoverage['plugins/list.js'][104] = 0; + _$jscoverage['plugins/list.js'][105] = 0; + _$jscoverage['plugins/list.js'][107] = 0; + _$jscoverage['plugins/list.js'][108] = 0; + _$jscoverage['plugins/list.js'][110] = 0; + _$jscoverage['plugins/list.js'][113] = 0; + _$jscoverage['plugins/list.js'][114] = 0; + _$jscoverage['plugins/list.js'][115] = 0; + _$jscoverage['plugins/list.js'][117] = 0; + _$jscoverage['plugins/list.js'][120] = 0; + _$jscoverage['plugins/list.js'][121] = 0; + _$jscoverage['plugins/list.js'][122] = 0; + _$jscoverage['plugins/list.js'][123] = 0; + _$jscoverage['plugins/list.js'][125] = 0; + _$jscoverage['plugins/list.js'][126] = 0; + _$jscoverage['plugins/list.js'][127] = 0; + _$jscoverage['plugins/list.js'][128] = 0; + _$jscoverage['plugins/list.js'][129] = 0; + _$jscoverage['plugins/list.js'][130] = 0; + _$jscoverage['plugins/list.js'][131] = 0; + _$jscoverage['plugins/list.js'][132] = 0; + _$jscoverage['plugins/list.js'][133] = 0; + _$jscoverage['plugins/list.js'][134] = 0; + _$jscoverage['plugins/list.js'][135] = 0; + _$jscoverage['plugins/list.js'][136] = 0; + _$jscoverage['plugins/list.js'][138] = 0; + _$jscoverage['plugins/list.js'][139] = 0; + _$jscoverage['plugins/list.js'][140] = 0; + _$jscoverage['plugins/list.js'][141] = 0; + _$jscoverage['plugins/list.js'][142] = 0; + _$jscoverage['plugins/list.js'][143] = 0; + _$jscoverage['plugins/list.js'][153] = 0; + _$jscoverage['plugins/list.js'][154] = 0; + _$jscoverage['plugins/list.js'][155] = 0; + _$jscoverage['plugins/list.js'][156] = 0; + _$jscoverage['plugins/list.js'][158] = 0; + _$jscoverage['plugins/list.js'][162] = 0; + _$jscoverage['plugins/list.js'][163] = 0; + _$jscoverage['plugins/list.js'][165] = 0; + _$jscoverage['plugins/list.js'][166] = 0; + _$jscoverage['plugins/list.js'][167] = 0; + _$jscoverage['plugins/list.js'][168] = 0; + _$jscoverage['plugins/list.js'][169] = 0; + _$jscoverage['plugins/list.js'][170] = 0; + _$jscoverage['plugins/list.js'][171] = 0; + _$jscoverage['plugins/list.js'][172] = 0; + _$jscoverage['plugins/list.js'][174] = 0; + _$jscoverage['plugins/list.js'][175] = 0; + _$jscoverage['plugins/list.js'][176] = 0; + _$jscoverage['plugins/list.js'][178] = 0; + _$jscoverage['plugins/list.js'][180] = 0; + _$jscoverage['plugins/list.js'][181] = 0; + _$jscoverage['plugins/list.js'][184] = 0; + _$jscoverage['plugins/list.js'][185] = 0; + _$jscoverage['plugins/list.js'][186] = 0; + _$jscoverage['plugins/list.js'][187] = 0; + _$jscoverage['plugins/list.js'][188] = 0; + _$jscoverage['plugins/list.js'][189] = 0; + _$jscoverage['plugins/list.js'][192] = 0; + _$jscoverage['plugins/list.js'][198] = 0; + _$jscoverage['plugins/list.js'][201] = 0; + _$jscoverage['plugins/list.js'][202] = 0; + _$jscoverage['plugins/list.js'][203] = 0; + _$jscoverage['plugins/list.js'][204] = 0; + _$jscoverage['plugins/list.js'][205] = 0; + _$jscoverage['plugins/list.js'][206] = 0; + _$jscoverage['plugins/list.js'][208] = 0; + _$jscoverage['plugins/list.js'][209] = 0; + _$jscoverage['plugins/list.js'][210] = 0; + _$jscoverage['plugins/list.js'][211] = 0; + _$jscoverage['plugins/list.js'][213] = 0; + _$jscoverage['plugins/list.js'][218] = 0; + _$jscoverage['plugins/list.js'][219] = 0; + _$jscoverage['plugins/list.js'][223] = 0; + _$jscoverage['plugins/list.js'][224] = 0; + _$jscoverage['plugins/list.js'][227] = 0; + _$jscoverage['plugins/list.js'][228] = 0; + _$jscoverage['plugins/list.js'][229] = 0; + _$jscoverage['plugins/list.js'][230] = 0; + _$jscoverage['plugins/list.js'][233] = 0; + _$jscoverage['plugins/list.js'][244] = 0; + _$jscoverage['plugins/list.js'][245] = 0; + _$jscoverage['plugins/list.js'][246] = 0; + _$jscoverage['plugins/list.js'][247] = 0; + _$jscoverage['plugins/list.js'][248] = 0; + _$jscoverage['plugins/list.js'][249] = 0; + _$jscoverage['plugins/list.js'][252] = 0; + _$jscoverage['plugins/list.js'][254] = 0; + _$jscoverage['plugins/list.js'][255] = 0; + _$jscoverage['plugins/list.js'][256] = 0; + _$jscoverage['plugins/list.js'][261] = 0; + _$jscoverage['plugins/list.js'][262] = 0; + _$jscoverage['plugins/list.js'][263] = 0; + _$jscoverage['plugins/list.js'][267] = 0; + _$jscoverage['plugins/list.js'][268] = 0; + _$jscoverage['plugins/list.js'][269] = 0; + _$jscoverage['plugins/list.js'][271] = 0; + _$jscoverage['plugins/list.js'][272] = 0; + _$jscoverage['plugins/list.js'][273] = 0; + _$jscoverage['plugins/list.js'][274] = 0; + _$jscoverage['plugins/list.js'][275] = 0; + _$jscoverage['plugins/list.js'][276] = 0; + _$jscoverage['plugins/list.js'][279] = 0; + _$jscoverage['plugins/list.js'][282] = 0; + _$jscoverage['plugins/list.js'][285] = 0; + _$jscoverage['plugins/list.js'][286] = 0; + _$jscoverage['plugins/list.js'][287] = 0; + _$jscoverage['plugins/list.js'][289] = 0; + _$jscoverage['plugins/list.js'][291] = 0; + _$jscoverage['plugins/list.js'][293] = 0; + _$jscoverage['plugins/list.js'][294] = 0; + _$jscoverage['plugins/list.js'][295] = 0; + _$jscoverage['plugins/list.js'][297] = 0; + _$jscoverage['plugins/list.js'][299] = 0; + _$jscoverage['plugins/list.js'][300] = 0; + _$jscoverage['plugins/list.js'][301] = 0; + _$jscoverage['plugins/list.js'][302] = 0; + _$jscoverage['plugins/list.js'][304] = 0; + _$jscoverage['plugins/list.js'][305] = 0; + _$jscoverage['plugins/list.js'][307] = 0; + _$jscoverage['plugins/list.js'][308] = 0; + _$jscoverage['plugins/list.js'][311] = 0; + _$jscoverage['plugins/list.js'][312] = 0; + _$jscoverage['plugins/list.js'][313] = 0; + _$jscoverage['plugins/list.js'][319] = 0; + _$jscoverage['plugins/list.js'][320] = 0; + _$jscoverage['plugins/list.js'][323] = 0; + _$jscoverage['plugins/list.js'][324] = 0; + _$jscoverage['plugins/list.js'][326] = 0; + _$jscoverage['plugins/list.js'][327] = 0; + _$jscoverage['plugins/list.js'][329] = 0; + _$jscoverage['plugins/list.js'][330] = 0; + _$jscoverage['plugins/list.js'][331] = 0; + _$jscoverage['plugins/list.js'][333] = 0; + _$jscoverage['plugins/list.js'][334] = 0; + _$jscoverage['plugins/list.js'][335] = 0; + _$jscoverage['plugins/list.js'][336] = 0; + _$jscoverage['plugins/list.js'][340] = 0; + _$jscoverage['plugins/list.js'][341] = 0; + _$jscoverage['plugins/list.js'][342] = 0; + _$jscoverage['plugins/list.js'][343] = 0; + _$jscoverage['plugins/list.js'][346] = 0; + _$jscoverage['plugins/list.js'][347] = 0; + _$jscoverage['plugins/list.js'][351] = 0; + _$jscoverage['plugins/list.js'][352] = 0; + _$jscoverage['plugins/list.js'][353] = 0; + _$jscoverage['plugins/list.js'][354] = 0; + _$jscoverage['plugins/list.js'][355] = 0; + _$jscoverage['plugins/list.js'][356] = 0; + _$jscoverage['plugins/list.js'][357] = 0; + _$jscoverage['plugins/list.js'][358] = 0; + _$jscoverage['plugins/list.js'][360] = 0; + _$jscoverage['plugins/list.js'][361] = 0; + _$jscoverage['plugins/list.js'][363] = 0; + _$jscoverage['plugins/list.js'][364] = 0; + _$jscoverage['plugins/list.js'][365] = 0; + _$jscoverage['plugins/list.js'][366] = 0; + _$jscoverage['plugins/list.js'][367] = 0; + _$jscoverage['plugins/list.js'][368] = 0; + _$jscoverage['plugins/list.js'][372] = 0; + _$jscoverage['plugins/list.js'][373] = 0; + _$jscoverage['plugins/list.js'][374] = 0; + _$jscoverage['plugins/list.js'][375] = 0; + _$jscoverage['plugins/list.js'][377] = 0; + _$jscoverage['plugins/list.js'][379] = 0; + _$jscoverage['plugins/list.js'][380] = 0; + _$jscoverage['plugins/list.js'][384] = 0; + _$jscoverage['plugins/list.js'][386] = 0; + _$jscoverage['plugins/list.js'][389] = 0; + _$jscoverage['plugins/list.js'][391] = 0; + _$jscoverage['plugins/list.js'][392] = 0; + _$jscoverage['plugins/list.js'][393] = 0; + _$jscoverage['plugins/list.js'][396] = 0; + _$jscoverage['plugins/list.js'][399] = 0; + _$jscoverage['plugins/list.js'][400] = 0; + _$jscoverage['plugins/list.js'][401] = 0; + _$jscoverage['plugins/list.js'][402] = 0; + _$jscoverage['plugins/list.js'][403] = 0; + _$jscoverage['plugins/list.js'][404] = 0; + _$jscoverage['plugins/list.js'][407] = 0; + _$jscoverage['plugins/list.js'][408] = 0; + _$jscoverage['plugins/list.js'][410] = 0; + _$jscoverage['plugins/list.js'][411] = 0; + _$jscoverage['plugins/list.js'][412] = 0; + _$jscoverage['plugins/list.js'][414] = 0; + _$jscoverage['plugins/list.js'][415] = 0; + _$jscoverage['plugins/list.js'][417] = 0; + _$jscoverage['plugins/list.js'][418] = 0; + _$jscoverage['plugins/list.js'][419] = 0; + _$jscoverage['plugins/list.js'][423] = 0; + _$jscoverage['plugins/list.js'][424] = 0; + _$jscoverage['plugins/list.js'][425] = 0; + _$jscoverage['plugins/list.js'][427] = 0; + _$jscoverage['plugins/list.js'][428] = 0; + _$jscoverage['plugins/list.js'][431] = 0; + _$jscoverage['plugins/list.js'][432] = 0; + _$jscoverage['plugins/list.js'][433] = 0; + _$jscoverage['plugins/list.js'][434] = 0; + _$jscoverage['plugins/list.js'][436] = 0; + _$jscoverage['plugins/list.js'][437] = 0; + _$jscoverage['plugins/list.js'][438] = 0; + _$jscoverage['plugins/list.js'][442] = 0; + _$jscoverage['plugins/list.js'][443] = 0; + _$jscoverage['plugins/list.js'][444] = 0; + _$jscoverage['plugins/list.js'][445] = 0; + _$jscoverage['plugins/list.js'][446] = 0; + _$jscoverage['plugins/list.js'][448] = 0; + _$jscoverage['plugins/list.js'][449] = 0; + _$jscoverage['plugins/list.js'][450] = 0; + _$jscoverage['plugins/list.js'][451] = 0; + _$jscoverage['plugins/list.js'][453] = 0; + _$jscoverage['plugins/list.js'][454] = 0; + _$jscoverage['plugins/list.js'][456] = 0; + _$jscoverage['plugins/list.js'][458] = 0; + _$jscoverage['plugins/list.js'][460] = 0; + _$jscoverage['plugins/list.js'][461] = 0; + _$jscoverage['plugins/list.js'][462] = 0; + _$jscoverage['plugins/list.js'][463] = 0; + _$jscoverage['plugins/list.js'][465] = 0; + _$jscoverage['plugins/list.js'][466] = 0; + _$jscoverage['plugins/list.js'][467] = 0; + _$jscoverage['plugins/list.js'][468] = 0; + _$jscoverage['plugins/list.js'][469] = 0; + _$jscoverage['plugins/list.js'][470] = 0; + _$jscoverage['plugins/list.js'][471] = 0; + _$jscoverage['plugins/list.js'][472] = 0; + _$jscoverage['plugins/list.js'][475] = 0; + _$jscoverage['plugins/list.js'][477] = 0; + _$jscoverage['plugins/list.js'][480] = 0; + _$jscoverage['plugins/list.js'][483] = 0; + _$jscoverage['plugins/list.js'][485] = 0; + _$jscoverage['plugins/list.js'][486] = 0; + _$jscoverage['plugins/list.js'][487] = 0; + _$jscoverage['plugins/list.js'][488] = 0; + _$jscoverage['plugins/list.js'][489] = 0; + _$jscoverage['plugins/list.js'][490] = 0; + _$jscoverage['plugins/list.js'][491] = 0; + _$jscoverage['plugins/list.js'][493] = 0; + _$jscoverage['plugins/list.js'][494] = 0; + _$jscoverage['plugins/list.js'][495] = 0; + _$jscoverage['plugins/list.js'][497] = 0; + _$jscoverage['plugins/list.js'][498] = 0; + _$jscoverage['plugins/list.js'][499] = 0; + _$jscoverage['plugins/list.js'][500] = 0; + _$jscoverage['plugins/list.js'][501] = 0; + _$jscoverage['plugins/list.js'][504] = 0; + _$jscoverage['plugins/list.js'][506] = 0; + _$jscoverage['plugins/list.js'][510] = 0; + _$jscoverage['plugins/list.js'][512] = 0; + _$jscoverage['plugins/list.js'][513] = 0; + _$jscoverage['plugins/list.js'][514] = 0; + _$jscoverage['plugins/list.js'][516] = 0; + _$jscoverage['plugins/list.js'][520] = 0; + _$jscoverage['plugins/list.js'][521] = 0; + _$jscoverage['plugins/list.js'][525] = 0; + _$jscoverage['plugins/list.js'][528] = 0; + _$jscoverage['plugins/list.js'][529] = 0; + _$jscoverage['plugins/list.js'][530] = 0; + _$jscoverage['plugins/list.js'][532] = 0; + _$jscoverage['plugins/list.js'][533] = 0; + _$jscoverage['plugins/list.js'][534] = 0; + _$jscoverage['plugins/list.js'][535] = 0; + _$jscoverage['plugins/list.js'][540] = 0; + _$jscoverage['plugins/list.js'][542] = 0; + _$jscoverage['plugins/list.js'][543] = 0; + _$jscoverage['plugins/list.js'][544] = 0; + _$jscoverage['plugins/list.js'][545] = 0; + _$jscoverage['plugins/list.js'][546] = 0; + _$jscoverage['plugins/list.js'][547] = 0; + _$jscoverage['plugins/list.js'][548] = 0; + _$jscoverage['plugins/list.js'][551] = 0; + _$jscoverage['plugins/list.js'][552] = 0; + _$jscoverage['plugins/list.js'][553] = 0; + _$jscoverage['plugins/list.js'][557] = 0; + _$jscoverage['plugins/list.js'][559] = 0; + _$jscoverage['plugins/list.js'][560] = 0; + _$jscoverage['plugins/list.js'][561] = 0; + _$jscoverage['plugins/list.js'][562] = 0; + _$jscoverage['plugins/list.js'][563] = 0; + _$jscoverage['plugins/list.js'][565] = 0; + _$jscoverage['plugins/list.js'][567] = 0; + _$jscoverage['plugins/list.js'][570] = 0; + _$jscoverage['plugins/list.js'][574] = 0; + _$jscoverage['plugins/list.js'][575] = 0; + _$jscoverage['plugins/list.js'][576] = 0; + _$jscoverage['plugins/list.js'][578] = 0; + _$jscoverage['plugins/list.js'][579] = 0; + _$jscoverage['plugins/list.js'][581] = 0; + _$jscoverage['plugins/list.js'][583] = 0; + _$jscoverage['plugins/list.js'][584] = 0; + _$jscoverage['plugins/list.js'][587] = 0; + _$jscoverage['plugins/list.js'][589] = 0; + _$jscoverage['plugins/list.js'][590] = 0; + _$jscoverage['plugins/list.js'][592] = 0; + _$jscoverage['plugins/list.js'][593] = 0; + _$jscoverage['plugins/list.js'][595] = 0; + _$jscoverage['plugins/list.js'][596] = 0; + _$jscoverage['plugins/list.js'][598] = 0; + _$jscoverage['plugins/list.js'][599] = 0; + _$jscoverage['plugins/list.js'][600] = 0; + _$jscoverage['plugins/list.js'][602] = 0; + _$jscoverage['plugins/list.js'][603] = 0; + _$jscoverage['plugins/list.js'][604] = 0; + _$jscoverage['plugins/list.js'][607] = 0; + _$jscoverage['plugins/list.js'][608] = 0; + _$jscoverage['plugins/list.js'][609] = 0; + _$jscoverage['plugins/list.js'][610] = 0; + _$jscoverage['plugins/list.js'][611] = 0; + _$jscoverage['plugins/list.js'][612] = 0; + _$jscoverage['plugins/list.js'][617] = 0; + _$jscoverage['plugins/list.js'][625] = 0; + _$jscoverage['plugins/list.js'][627] = 0; + _$jscoverage['plugins/list.js'][628] = 0; + _$jscoverage['plugins/list.js'][629] = 0; + _$jscoverage['plugins/list.js'][630] = 0; + _$jscoverage['plugins/list.js'][632] = 0; + _$jscoverage['plugins/list.js'][633] = 0; + _$jscoverage['plugins/list.js'][634] = 0; + _$jscoverage['plugins/list.js'][635] = 0; + _$jscoverage['plugins/list.js'][636] = 0; + _$jscoverage['plugins/list.js'][637] = 0; + _$jscoverage['plugins/list.js'][638] = 0; + _$jscoverage['plugins/list.js'][639] = 0; + _$jscoverage['plugins/list.js'][640] = 0; + _$jscoverage['plugins/list.js'][641] = 0; + _$jscoverage['plugins/list.js'][642] = 0; + _$jscoverage['plugins/list.js'][645] = 0; + _$jscoverage['plugins/list.js'][646] = 0; + _$jscoverage['plugins/list.js'][647] = 0; + _$jscoverage['plugins/list.js'][650] = 0; + _$jscoverage['plugins/list.js'][651] = 0; + _$jscoverage['plugins/list.js'][653] = 0; + _$jscoverage['plugins/list.js'][654] = 0; + _$jscoverage['plugins/list.js'][655] = 0; + _$jscoverage['plugins/list.js'][656] = 0; + _$jscoverage['plugins/list.js'][658] = 0; + _$jscoverage['plugins/list.js'][659] = 0; + _$jscoverage['plugins/list.js'][661] = 0; + _$jscoverage['plugins/list.js'][662] = 0; + _$jscoverage['plugins/list.js'][666] = 0; + _$jscoverage['plugins/list.js'][667] = 0; + _$jscoverage['plugins/list.js'][669] = 0; + _$jscoverage['plugins/list.js'][670] = 0; + _$jscoverage['plugins/list.js'][672] = 0; + _$jscoverage['plugins/list.js'][673] = 0; + _$jscoverage['plugins/list.js'][675] = 0; + _$jscoverage['plugins/list.js'][679] = 0; + _$jscoverage['plugins/list.js'][680] = 0; + _$jscoverage['plugins/list.js'][681] = 0; + _$jscoverage['plugins/list.js'][682] = 0; + _$jscoverage['plugins/list.js'][685] = 0; + _$jscoverage['plugins/list.js'][686] = 0; + _$jscoverage['plugins/list.js'][687] = 0; + _$jscoverage['plugins/list.js'][691] = 0; + _$jscoverage['plugins/list.js'][692] = 0; + _$jscoverage['plugins/list.js'][693] = 0; + _$jscoverage['plugins/list.js'][694] = 0; + _$jscoverage['plugins/list.js'][695] = 0; + _$jscoverage['plugins/list.js'][700] = 0; + _$jscoverage['plugins/list.js'][701] = 0; + _$jscoverage['plugins/list.js'][702] = 0; + _$jscoverage['plugins/list.js'][703] = 0; + _$jscoverage['plugins/list.js'][704] = 0; + _$jscoverage['plugins/list.js'][705] = 0; + _$jscoverage['plugins/list.js'][706] = 0; + _$jscoverage['plugins/list.js'][710] = 0; + _$jscoverage['plugins/list.js'][711] = 0; + _$jscoverage['plugins/list.js'][714] = 0; + _$jscoverage['plugins/list.js'][715] = 0; + _$jscoverage['plugins/list.js'][716] = 0; + _$jscoverage['plugins/list.js'][720] = 0; + _$jscoverage['plugins/list.js'][721] = 0; + _$jscoverage['plugins/list.js'][722] = 0; + _$jscoverage['plugins/list.js'][723] = 0; + _$jscoverage['plugins/list.js'][724] = 0; + _$jscoverage['plugins/list.js'][737] = 0; + _$jscoverage['plugins/list.js'][738] = 0; + _$jscoverage['plugins/list.js'][739] = 0; + _$jscoverage['plugins/list.js'][740] = 0; + _$jscoverage['plugins/list.js'][741] = 0; + _$jscoverage['plugins/list.js'][742] = 0; + _$jscoverage['plugins/list.js'][747] = 0; + _$jscoverage['plugins/list.js'][749] = 0; + _$jscoverage['plugins/list.js'][752] = 0; + _$jscoverage['plugins/list.js'][753] = 0; + _$jscoverage['plugins/list.js'][754] = 0; + _$jscoverage['plugins/list.js'][755] = 0; + _$jscoverage['plugins/list.js'][756] = 0; + _$jscoverage['plugins/list.js'][757] = 0; + _$jscoverage['plugins/list.js'][759] = 0; + _$jscoverage['plugins/list.js'][760] = 0; + _$jscoverage['plugins/list.js'][766] = 0; + _$jscoverage['plugins/list.js'][767] = 0; + _$jscoverage['plugins/list.js'][769] = 0; + _$jscoverage['plugins/list.js'][770] = 0; + _$jscoverage['plugins/list.js'][771] = 0; + _$jscoverage['plugins/list.js'][772] = 0; + _$jscoverage['plugins/list.js'][773] = 0; + _$jscoverage['plugins/list.js'][776] = 0; + _$jscoverage['plugins/list.js'][777] = 0; + _$jscoverage['plugins/list.js'][778] = 0; + _$jscoverage['plugins/list.js'][779] = 0; + _$jscoverage['plugins/list.js'][780] = 0; + _$jscoverage['plugins/list.js'][781] = 0; + _$jscoverage['plugins/list.js'][782] = 0; + _$jscoverage['plugins/list.js'][783] = 0; + _$jscoverage['plugins/list.js'][784] = 0; + _$jscoverage['plugins/list.js'][785] = 0; + _$jscoverage['plugins/list.js'][786] = 0; + _$jscoverage['plugins/list.js'][787] = 0; + _$jscoverage['plugins/list.js'][790] = 0; + _$jscoverage['plugins/list.js'][791] = 0; + _$jscoverage['plugins/list.js'][792] = 0; + _$jscoverage['plugins/list.js'][793] = 0; + _$jscoverage['plugins/list.js'][794] = 0; + _$jscoverage['plugins/list.js'][795] = 0; + _$jscoverage['plugins/list.js'][798] = 0; + _$jscoverage['plugins/list.js'][799] = 0; + _$jscoverage['plugins/list.js'][800] = 0; + _$jscoverage['plugins/list.js'][801] = 0; + _$jscoverage['plugins/list.js'][802] = 0; + _$jscoverage['plugins/list.js'][803] = 0; + _$jscoverage['plugins/list.js'][805] = 0; + _$jscoverage['plugins/list.js'][808] = 0; + _$jscoverage['plugins/list.js'][809] = 0; + _$jscoverage['plugins/list.js'][810] = 0; + _$jscoverage['plugins/list.js'][811] = 0; + _$jscoverage['plugins/list.js'][812] = 0; + _$jscoverage['plugins/list.js'][813] = 0; + _$jscoverage['plugins/list.js'][814] = 0; + _$jscoverage['plugins/list.js'][815] = 0; + _$jscoverage['plugins/list.js'][816] = 0; + _$jscoverage['plugins/list.js'][817] = 0; + _$jscoverage['plugins/list.js'][818] = 0; + _$jscoverage['plugins/list.js'][819] = 0; + _$jscoverage['plugins/list.js'][823] = 0; + _$jscoverage['plugins/list.js'][825] = 0; + _$jscoverage['plugins/list.js'][827] = 0; + _$jscoverage['plugins/list.js'][829] = 0; + _$jscoverage['plugins/list.js'][830] = 0; + _$jscoverage['plugins/list.js'][833] = 0; + _$jscoverage['plugins/list.js'][834] = 0; + _$jscoverage['plugins/list.js'][835] = 0; + _$jscoverage['plugins/list.js'][840] = 0; + _$jscoverage['plugins/list.js'][841] = 0; + _$jscoverage['plugins/list.js'][842] = 0; + _$jscoverage['plugins/list.js'][843] = 0; + _$jscoverage['plugins/list.js'][845] = 0; + _$jscoverage['plugins/list.js'][846] = 0; + _$jscoverage['plugins/list.js'][848] = 0; + _$jscoverage['plugins/list.js'][921] = 0; + _$jscoverage['plugins/list.js'][925] = 0; + _$jscoverage['plugins/list.js'][926] = 0; + _$jscoverage['plugins/list.js'][928] = 0; + _$jscoverage['plugins/list.js'][931] = 0; + _$jscoverage['plugins/list.js'][937] = 0; + _$jscoverage['plugins/list.js'][938] = 0; + _$jscoverage['plugins/list.js'][946] = 0; + _$jscoverage['plugins/list.js'][947] = 0; + _$jscoverage['plugins/list.js'][948] = 0; + _$jscoverage['plugins/list.js'][949] = 0; + _$jscoverage['plugins/list.js'][951] = 0; + _$jscoverage['plugins/list.js'][953] = 0; + _$jscoverage['plugins/list.js'][954] = 0; + _$jscoverage['plugins/list.js'][955] = 0; + _$jscoverage['plugins/list.js'][956] = 0; + _$jscoverage['plugins/list.js'][957] = 0; + _$jscoverage['plugins/list.js'][958] = 0; + _$jscoverage['plugins/list.js'][959] = 0; + _$jscoverage['plugins/list.js'][960] = 0; + _$jscoverage['plugins/list.js'][962] = 0; + _$jscoverage['plugins/list.js'][964] = 0; + _$jscoverage['plugins/list.js'][966] = 0; + _$jscoverage['plugins/list.js'][967] = 0; + _$jscoverage['plugins/list.js'][968] = 0; + _$jscoverage['plugins/list.js'][969] = 0; + _$jscoverage['plugins/list.js'][970] = 0; + _$jscoverage['plugins/list.js'][971] = 0; + _$jscoverage['plugins/list.js'][973] = 0; + _$jscoverage['plugins/list.js'][975] = 0; + _$jscoverage['plugins/list.js'][976] = 0; + _$jscoverage['plugins/list.js'][977] = 0; + _$jscoverage['plugins/list.js'][978] = 0; + _$jscoverage['plugins/list.js'][980] = 0; + _$jscoverage['plugins/list.js'][981] = 0; + _$jscoverage['plugins/list.js'][983] = 0; + _$jscoverage['plugins/list.js'][984] = 0; + _$jscoverage['plugins/list.js'][985] = 0; + _$jscoverage['plugins/list.js'][986] = 0; + _$jscoverage['plugins/list.js'][987] = 0; + _$jscoverage['plugins/list.js'][988] = 0; + _$jscoverage['plugins/list.js'][989] = 0; + _$jscoverage['plugins/list.js'][994] = 0; + _$jscoverage['plugins/list.js'][995] = 0; + _$jscoverage['plugins/list.js'][1000] = 0; + _$jscoverage['plugins/list.js'][1002] = 0; + _$jscoverage['plugins/list.js'][1003] = 0; + _$jscoverage['plugins/list.js'][1004] = 0; + _$jscoverage['plugins/list.js'][1005] = 0; + _$jscoverage['plugins/list.js'][1008] = 0; + _$jscoverage['plugins/list.js'][1009] = 0; + _$jscoverage['plugins/list.js'][1010] = 0; + _$jscoverage['plugins/list.js'][1011] = 0; + _$jscoverage['plugins/list.js'][1014] = 0; + _$jscoverage['plugins/list.js'][1015] = 0; + _$jscoverage['plugins/list.js'][1016] = 0; + _$jscoverage['plugins/list.js'][1017] = 0; + _$jscoverage['plugins/list.js'][1018] = 0; + _$jscoverage['plugins/list.js'][1020] = 0; + _$jscoverage['plugins/list.js'][1022] = 0; + _$jscoverage['plugins/list.js'][1023] = 0; + _$jscoverage['plugins/list.js'][1024] = 0; + _$jscoverage['plugins/list.js'][1026] = 0; + _$jscoverage['plugins/list.js'][1028] = 0; + _$jscoverage['plugins/list.js'][1029] = 0; + _$jscoverage['plugins/list.js'][1030] = 0; + _$jscoverage['plugins/list.js'][1031] = 0; + _$jscoverage['plugins/list.js'][1033] = 0; + _$jscoverage['plugins/list.js'][1035] = 0; + _$jscoverage['plugins/list.js'][1038] = 0; + _$jscoverage['plugins/list.js'][1040] = 0; + _$jscoverage['plugins/list.js'][1041] = 0; + _$jscoverage['plugins/list.js'][1042] = 0; + _$jscoverage['plugins/list.js'][1043] = 0; + _$jscoverage['plugins/list.js'][1045] = 0; + _$jscoverage['plugins/list.js'][1047] = 0; + _$jscoverage['plugins/list.js'][1050] = 0; + _$jscoverage['plugins/list.js'][1052] = 0; + _$jscoverage['plugins/list.js'][1053] = 0; + _$jscoverage['plugins/list.js'][1054] = 0; + _$jscoverage['plugins/list.js'][1055] = 0; + _$jscoverage['plugins/list.js'][1056] = 0; + _$jscoverage['plugins/list.js'][1058] = 0; + _$jscoverage['plugins/list.js'][1059] = 0; + _$jscoverage['plugins/list.js'][1060] = 0; + _$jscoverage['plugins/list.js'][1061] = 0; + _$jscoverage['plugins/list.js'][1062] = 0; + _$jscoverage['plugins/list.js'][1064] = 0; + _$jscoverage['plugins/list.js'][1066] = 0; + _$jscoverage['plugins/list.js'][1067] = 0; + _$jscoverage['plugins/list.js'][1068] = 0; + _$jscoverage['plugins/list.js'][1069] = 0; + _$jscoverage['plugins/list.js'][1071] = 0; + _$jscoverage['plugins/list.js'][1073] = 0; + _$jscoverage['plugins/list.js'][1075] = 0; + _$jscoverage['plugins/list.js'][1077] = 0; + _$jscoverage['plugins/list.js'][1080] = 0; + _$jscoverage['plugins/list.js'][1082] = 0; + _$jscoverage['plugins/list.js'][1083] = 0; + _$jscoverage['plugins/list.js'][1084] = 0; + _$jscoverage['plugins/list.js'][1085] = 0; + _$jscoverage['plugins/list.js'][1086] = 0; + _$jscoverage['plugins/list.js'][1087] = 0; + _$jscoverage['plugins/list.js'][1090] = 0; + _$jscoverage['plugins/list.js'][1096] = 0; + _$jscoverage['plugins/list.js'][1097] = 0; + _$jscoverage['plugins/list.js'][1099] = 0; + _$jscoverage['plugins/list.js'][1100] = 0; + _$jscoverage['plugins/list.js'][1102] = 0; + _$jscoverage['plugins/list.js'][1103] = 0; + _$jscoverage['plugins/list.js'][1106] = 0; + _$jscoverage['plugins/list.js'][1108] = 0; + _$jscoverage['plugins/list.js'][1114] = 0; + _$jscoverage['plugins/list.js'][1116] = 0; + _$jscoverage['plugins/list.js'][1117] = 0; + _$jscoverage['plugins/list.js'][1118] = 0; + _$jscoverage['plugins/list.js'][1119] = 0; + _$jscoverage['plugins/list.js'][1121] = 0; + _$jscoverage['plugins/list.js'][1122] = 0; + _$jscoverage['plugins/list.js'][1123] = 0; + _$jscoverage['plugins/list.js'][1124] = 0; + _$jscoverage['plugins/list.js'][1127] = 0; + _$jscoverage['plugins/list.js'][1128] = 0; + _$jscoverage['plugins/list.js'][1130] = 0; + _$jscoverage['plugins/list.js'][1131] = 0; + _$jscoverage['plugins/list.js'][1132] = 0; + _$jscoverage['plugins/list.js'][1133] = 0; + _$jscoverage['plugins/list.js'][1137] = 0; + _$jscoverage['plugins/list.js'][1138] = 0; + _$jscoverage['plugins/list.js'][1139] = 0; + _$jscoverage['plugins/list.js'][1140] = 0; + _$jscoverage['plugins/list.js'][1141] = 0; + _$jscoverage['plugins/list.js'][1144] = 0; + _$jscoverage['plugins/list.js'][1146] = 0; + _$jscoverage['plugins/list.js'][1148] = 0; + _$jscoverage['plugins/list.js'][1150] = 0; + _$jscoverage['plugins/list.js'][1151] = 0; + _$jscoverage['plugins/list.js'][1152] = 0; + _$jscoverage['plugins/list.js'][1153] = 0; + _$jscoverage['plugins/list.js'][1154] = 0; + _$jscoverage['plugins/list.js'][1156] = 0; + _$jscoverage['plugins/list.js'][1158] = 0; + _$jscoverage['plugins/list.js'][1160] = 0; + _$jscoverage['plugins/list.js'][1163] = 0; + _$jscoverage['plugins/list.js'][1164] = 0; + _$jscoverage['plugins/list.js'][1165] = 0; + _$jscoverage['plugins/list.js'][1166] = 0; + _$jscoverage['plugins/list.js'][1167] = 0; + _$jscoverage['plugins/list.js'][1169] = 0; + _$jscoverage['plugins/list.js'][1171] = 0; + _$jscoverage['plugins/list.js'][1172] = 0; + _$jscoverage['plugins/list.js'][1173] = 0; + _$jscoverage['plugins/list.js'][1176] = 0; + _$jscoverage['plugins/list.js'][1180] = 0; + _$jscoverage['plugins/list.js'][1181] = 0; + _$jscoverage['plugins/list.js'][1182] = 0; + _$jscoverage['plugins/list.js'][1183] = 0; + _$jscoverage['plugins/list.js'][1184] = 0; + _$jscoverage['plugins/list.js'][1186] = 0; + _$jscoverage['plugins/list.js'][1187] = 0; + _$jscoverage['plugins/list.js'][1188] = 0; + _$jscoverage['plugins/list.js'][1190] = 0; + _$jscoverage['plugins/list.js'][1194] = 0; + _$jscoverage['plugins/list.js'][1195] = 0; + _$jscoverage['plugins/list.js'][1197] = 0; + _$jscoverage['plugins/list.js'][1198] = 0; + _$jscoverage['plugins/list.js'][1199] = 0; + _$jscoverage['plugins/list.js'][1200] = 0; + _$jscoverage['plugins/list.js'][1202] = 0; + _$jscoverage['plugins/list.js'][1203] = 0; + _$jscoverage['plugins/list.js'][1204] = 0; + _$jscoverage['plugins/list.js'][1205] = 0; + _$jscoverage['plugins/list.js'][1207] = 0; +} +_$jscoverage['plugins/list.js'].source = ["/**"," * 有序列表,无序列表插件"," * @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( {"," '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不限制"," } );"," 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();"," });"," //进入编辑器的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 ? '&nbsp;' : '<br/>')"," }"," //去掉末尾的空白"," var p = li.firstChild();"," var lastChild = p.lastChild();"," if(lastChild && lastChild.type == 'text' && /^\\s*$/.test(lastChild.data)){"," p.removeChild(lastChild)"," }"," });"," 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*(&nbsp;)+\\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 = '<p></p>';"," 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><br/></p>类型的空节点,干掉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;"," }"," }","",""," /**"," * 运行有序列表命令"," * @command insertorderedlist"," * @method execCommand"," * @param { String } command 命令字符串"," * @param { String } style 插入的有序列表类型,值为:decimal,lower-alpha,lower-roman,upper-alpha,upper-roman"," * @example"," * ```javascript"," * editor.execCommand( 'insertunorderedlist','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"," * @example"," * ```javascript"," * editor.queryCommandValue( 'insertorderedlist' );"," * ```"," */",""," /**"," * 运行无序列表命令"," * @command insertunorderedlist"," * @method execCommand"," * @param { String } command 命令字符串"," * @param { String } style 插入的无序列表类型,值为:circle,disc,square"," * @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"," * @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.childNodes[i++];) {"," if(domUtils.isTagNode(ci,'ol ul')){"," utils.each(domUtils.getElementsByTagName(ci,'li'),function(li){"," while(li.firstChild){"," tmpFrag.appendChild(li.firstChild);"," }",""," });"," }else{"," while (ci.firstChild) {"," tmpFrag.appendChild(ci.firstChild);"," }"," }",""," }"," 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;"," }"," };","};",""]; +_$jscoverage['plugins/list.js'][7]++; +UE.plugins.list = (function () { + _$jscoverage['plugins/list.js'][8]++; + var me = this, notExchange = {"TD": 1, "PRE": 1, "BLOCKQUOTE": 1}; + _$jscoverage['plugins/list.js'][14]++; + var customStyle = {"cn": "cn-1-", "cn1": "cn-2-", "cn2": "cn-3-", "num": "num-1-", "num1": "num-2-", "num2": "num-3-", "dash": "dash", "dot": "dot"}; + _$jscoverage['plugins/list.js'][25]++; + me.setOpt({"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}); + _$jscoverage['plugins/list.js'][50]++; + function listToArray(list) { + _$jscoverage['plugins/list.js'][51]++; + var arr = []; + _$jscoverage['plugins/list.js'][52]++; + for (var p in list) { + _$jscoverage['plugins/list.js'][53]++; + arr.push(p); +} + _$jscoverage['plugins/list.js'][55]++; + return arr; +} + _$jscoverage['plugins/list.js'][57]++; + var listStyle = {"OL": listToArray(me.options.insertorderedlist), "UL": listToArray(me.options.insertunorderedlist)}; + _$jscoverage['plugins/list.js'][61]++; + var liiconpath = me.options.listiconpath; + _$jscoverage['plugins/list.js'][64]++; + for (var s in customStyle) { + _$jscoverage['plugins/list.js'][65]++; + if (((! me.options.insertorderedlist.hasOwnProperty(s)) && (! me.options.insertunorderedlist.hasOwnProperty(s)))) { + _$jscoverage['plugins/list.js'][66]++; + (delete customStyle[s]); + } +} + _$jscoverage['plugins/list.js'][70]++; + me.ready((function () { + _$jscoverage['plugins/list.js'][71]++; + var customCss = []; + _$jscoverage['plugins/list.js'][72]++; + for (var p in customStyle) { + _$jscoverage['plugins/list.js'][73]++; + if (((p == "dash") || (p == "dot"))) { + _$jscoverage['plugins/list.js'][74]++; + customCss.push(("li.list-" + customStyle[p] + "{background-image:url(" + liiconpath + customStyle[p] + ".gif)}")); + _$jscoverage['plugins/list.js'][75]++; + customCss.push(("ul.custom_" + p + "{list-style:none;}ul.custom_" + p + " li{background-position:0 3px;background-repeat:no-repeat}")); + } + else { + _$jscoverage['plugins/list.js'][77]++; + for (var i = 0; (i < 99); (i++)) { + _$jscoverage['plugins/list.js'][78]++; + customCss.push(("li.list-" + customStyle[p] + i + "{background-image:url(" + liiconpath + "list-" + customStyle[p] + i + ".gif)}")); +} + _$jscoverage['plugins/list.js'][80]++; + customCss.push(("ol.custom_" + p + "{list-style:none;}ol.custom_" + p + " li{background-position:0 3px;background-repeat:no-repeat}")); + } + _$jscoverage['plugins/list.js'][82]++; + switch (p) { + case "cn": + _$jscoverage['plugins/list.js'][84]++; + customCss.push(("li.list-" + p + "-paddingleft-1{padding-left:25px}")); + _$jscoverage['plugins/list.js'][85]++; + customCss.push(("li.list-" + p + "-paddingleft-2{padding-left:40px}")); + _$jscoverage['plugins/list.js'][86]++; + customCss.push(("li.list-" + p + "-paddingleft-3{padding-left:55px}")); + _$jscoverage['plugins/list.js'][87]++; + break; + case "cn1": + _$jscoverage['plugins/list.js'][89]++; + customCss.push(("li.list-" + p + "-paddingleft-1{padding-left:30px}")); + _$jscoverage['plugins/list.js'][90]++; + customCss.push(("li.list-" + p + "-paddingleft-2{padding-left:40px}")); + _$jscoverage['plugins/list.js'][91]++; + customCss.push(("li.list-" + p + "-paddingleft-3{padding-left:55px}")); + _$jscoverage['plugins/list.js'][92]++; + break; + case "cn2": + _$jscoverage['plugins/list.js'][94]++; + customCss.push(("li.list-" + p + "-paddingleft-1{padding-left:40px}")); + _$jscoverage['plugins/list.js'][95]++; + customCss.push(("li.list-" + p + "-paddingleft-2{padding-left:55px}")); + _$jscoverage['plugins/list.js'][96]++; + customCss.push(("li.list-" + p + "-paddingleft-3{padding-left:68px}")); + _$jscoverage['plugins/list.js'][97]++; + break; + case "num": + case "num1": + _$jscoverage['plugins/list.js'][100]++; + customCss.push(("li.list-" + p + "-paddingleft-1{padding-left:25px}")); + _$jscoverage['plugins/list.js'][101]++; + break; + case "num2": + _$jscoverage['plugins/list.js'][103]++; + customCss.push(("li.list-" + p + "-paddingleft-1{padding-left:35px}")); + _$jscoverage['plugins/list.js'][104]++; + customCss.push(("li.list-" + p + "-paddingleft-2{padding-left:40px}")); + _$jscoverage['plugins/list.js'][105]++; + break; + case "dash": + _$jscoverage['plugins/list.js'][107]++; + customCss.push(("li.list-" + p + "-paddingleft{padding-left:35px}")); + _$jscoverage['plugins/list.js'][108]++; + break; + case "dot": + _$jscoverage['plugins/list.js'][110]++; + customCss.push(("li.list-" + p + "-paddingleft{padding-left:20px}")); + } +} + _$jscoverage['plugins/list.js'][113]++; + customCss.push(".list-paddingleft-1{padding-left:0}"); + _$jscoverage['plugins/list.js'][114]++; + customCss.push((".list-paddingleft-2{padding-left:" + me.options.listDefaultPaddingLeft + "px}")); + _$jscoverage['plugins/list.js'][115]++; + customCss.push((".list-paddingleft-3{padding-left:" + (me.options.listDefaultPaddingLeft * 2) + "px}")); + _$jscoverage['plugins/list.js'][117]++; + utils.cssRule("list", ("ol,ul{margin:0;pading:0;" + (browser.ie? "": "width:95%") + "}li{clear:both;}" + customCss.join("\n")), me.document); +})); + _$jscoverage['plugins/list.js'][120]++; + me.ready((function () { + _$jscoverage['plugins/list.js'][121]++; + domUtils.on(me.body, "cut", (function () { + _$jscoverage['plugins/list.js'][122]++; + setTimeout((function () { + _$jscoverage['plugins/list.js'][123]++; + var rng = me.selection.getRange(), li; + _$jscoverage['plugins/list.js'][125]++; + if ((! rng.collapsed)) { + _$jscoverage['plugins/list.js'][126]++; + if ((li = domUtils.findParentByTagName(rng.startContainer, "li", true))) { + _$jscoverage['plugins/list.js'][127]++; + if (((! li.nextSibling) && domUtils.isEmptyBlock(li))) { + _$jscoverage['plugins/list.js'][128]++; + var pn = li.parentNode, node; + _$jscoverage['plugins/list.js'][129]++; + if ((node = pn.previousSibling)) { + _$jscoverage['plugins/list.js'][130]++; + domUtils.remove(pn); + _$jscoverage['plugins/list.js'][131]++; + rng.setStartAtLast(node).collapse(true); + _$jscoverage['plugins/list.js'][132]++; + rng.select(true); + } + else { + _$jscoverage['plugins/list.js'][133]++; + if ((node = pn.nextSibling)) { + _$jscoverage['plugins/list.js'][134]++; + domUtils.remove(pn); + _$jscoverage['plugins/list.js'][135]++; + rng.setStartAtFirst(node).collapse(true); + _$jscoverage['plugins/list.js'][136]++; + rng.select(true); + } + else { + _$jscoverage['plugins/list.js'][138]++; + var tmpNode = me.document.createElement("p"); + _$jscoverage['plugins/list.js'][139]++; + domUtils.fillNode(me.document, tmpNode); + _$jscoverage['plugins/list.js'][140]++; + pn.parentNode.insertBefore(tmpNode, pn); + _$jscoverage['plugins/list.js'][141]++; + domUtils.remove(pn); + _$jscoverage['plugins/list.js'][142]++; + rng.setStart(tmpNode, 0).collapse(true); + _$jscoverage['plugins/list.js'][143]++; + rng.select(true); + } + } + } + } + } +})); +})); +})); + _$jscoverage['plugins/list.js'][153]++; + function getStyle(node) { + _$jscoverage['plugins/list.js'][154]++; + var cls = node.className; + _$jscoverage['plugins/list.js'][155]++; + if (domUtils.hasClass(node, /custom_/)) { + _$jscoverage['plugins/list.js'][156]++; + return cls.match(/custom_(\w+)/)[1]; + } + _$jscoverage['plugins/list.js'][158]++; + return domUtils.getStyle(node, "list-style-type"); +} + _$jscoverage['plugins/list.js'][162]++; + me.addListener("beforepaste", (function (type, html) { + _$jscoverage['plugins/list.js'][163]++; + var me = this, rng = me.selection.getRange(), li; + _$jscoverage['plugins/list.js'][165]++; + var root = UE.htmlparser(html.html, true); + _$jscoverage['plugins/list.js'][166]++; + if ((li = domUtils.findParentByTagName(rng.startContainer, "li", true))) { + _$jscoverage['plugins/list.js'][167]++; + var list = li.parentNode, tagName = ((list.tagName == "OL")? "ul": "ol"); + _$jscoverage['plugins/list.js'][168]++; + utils.each(root.getNodesByTagName(tagName), (function (n) { + _$jscoverage['plugins/list.js'][169]++; + n.tagName = list.tagName; + _$jscoverage['plugins/list.js'][170]++; + n.setAttr(); + _$jscoverage['plugins/list.js'][171]++; + if ((n.parentNode === root)) { + _$jscoverage['plugins/list.js'][172]++; + type = (getStyle(list) || ((list.tagName == "OL")? "decimal": "disc")); + } + else { + _$jscoverage['plugins/list.js'][174]++; + var className = n.parentNode.getAttr("class"); + _$jscoverage['plugins/list.js'][175]++; + if ((className && /custom_/.test(className))) { + _$jscoverage['plugins/list.js'][176]++; + type = className.match(/custom_(\w+)/)[1]; + } + else { + _$jscoverage['plugins/list.js'][178]++; + type = n.parentNode.getStyle("list-style-type"); + } + _$jscoverage['plugins/list.js'][180]++; + if ((! type)) { + _$jscoverage['plugins/list.js'][181]++; + type = ((list.tagName == "OL")? "decimal": "disc"); + } + } + _$jscoverage['plugins/list.js'][184]++; + var index = utils.indexOf(listStyle[list.tagName], type); + _$jscoverage['plugins/list.js'][185]++; + if ((n.parentNode !== root)) { + _$jscoverage['plugins/list.js'][186]++; + index = (((index + 1) == listStyle[list.tagName].length)? 0: (index + 1)); + } + _$jscoverage['plugins/list.js'][187]++; + var currentStyle = listStyle[list.tagName][index]; + _$jscoverage['plugins/list.js'][188]++; + if (customStyle[currentStyle]) { + _$jscoverage['plugins/list.js'][189]++; + n.setAttr("class", ("custom_" + currentStyle)); + } + else { + _$jscoverage['plugins/list.js'][192]++; + n.setStyle("list-style-type", currentStyle); + } +})); + } + _$jscoverage['plugins/list.js'][198]++; + html.html = root.toHtml(); +})); + _$jscoverage['plugins/list.js'][201]++; + me.addInputRule((function (root) { + _$jscoverage['plugins/list.js'][202]++; + utils.each(root.getNodesByTagName("li"), (function (li) { + _$jscoverage['plugins/list.js'][203]++; + var tmpP = UE.uNode.createElement("p"); + _$jscoverage['plugins/list.js'][204]++; + for (var i = 0, ci; (ci = li.children[i]);) { + _$jscoverage['plugins/list.js'][205]++; + if (((ci.type == "text") || dtd.p[ci.tagName])) { + _$jscoverage['plugins/list.js'][206]++; + tmpP.appendChild(ci); + } + else { + _$jscoverage['plugins/list.js'][208]++; + if (tmpP.firstChild()) { + _$jscoverage['plugins/list.js'][209]++; + li.insertBefore(tmpP, ci); + _$jscoverage['plugins/list.js'][210]++; + tmpP = UE.uNode.createElement("p"); + _$jscoverage['plugins/list.js'][211]++; + i = (i + 2); + } + else { + _$jscoverage['plugins/list.js'][213]++; + (i++); + } + } +} + _$jscoverage['plugins/list.js'][218]++; + if (((tmpP.firstChild() && (! tmpP.parentNode)) || (! li.firstChild()))) { + _$jscoverage['plugins/list.js'][219]++; + li.appendChild(tmpP); + } + _$jscoverage['plugins/list.js'][223]++; + if ((! tmpP.firstChild())) { + _$jscoverage['plugins/list.js'][224]++; + tmpP.innerHTML((browser.ie? " ": "
    ")); + } + _$jscoverage['plugins/list.js'][227]++; + var p = li.firstChild(); + _$jscoverage['plugins/list.js'][228]++; + var lastChild = p.lastChild(); + _$jscoverage['plugins/list.js'][229]++; + if ((lastChild && (lastChild.type == "text") && /^\s*$/.test(lastChild.data))) { + _$jscoverage['plugins/list.js'][230]++; + p.removeChild(lastChild); + } +})); + _$jscoverage['plugins/list.js'][233]++; + 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"}; + _$jscoverage['plugins/list.js'][244]++; + function checkListType(content, container) { + _$jscoverage['plugins/list.js'][245]++; + var span = container.firstChild(); + _$jscoverage['plugins/list.js'][246]++; + if ((span && (span.type == "element") && (span.tagName == "span") && /Wingdings|Symbol/.test(span.getStyle("font-family")))) { + _$jscoverage['plugins/list.js'][247]++; + for (var p in unorderlisttype) { + _$jscoverage['plugins/list.js'][248]++; + if ((unorderlisttype[p] == span.data)) { + _$jscoverage['plugins/list.js'][249]++; + return p; + } +} + _$jscoverage['plugins/list.js'][252]++; + return "disc"; + } + _$jscoverage['plugins/list.js'][254]++; + for (var p = p in orderlisttype) { + _$jscoverage['plugins/list.js'][255]++; + if (orderlisttype[p].test(content)) { + _$jscoverage['plugins/list.js'][256]++; + return p; + } +} +} + _$jscoverage['plugins/list.js'][261]++; + utils.each(root.getNodesByTagName("p"), (function (node) { + _$jscoverage['plugins/list.js'][262]++; + if ((node.getAttr("class") != "MsoListParagraph")) { + _$jscoverage['plugins/list.js'][263]++; + return; + } + _$jscoverage['plugins/list.js'][267]++; + node.setStyle("margin", ""); + _$jscoverage['plugins/list.js'][268]++; + node.setStyle("margin-left", ""); + _$jscoverage['plugins/list.js'][269]++; + node.setAttr("class", ""); + _$jscoverage['plugins/list.js'][271]++; + function appendLi(list, p, type) { + _$jscoverage['plugins/list.js'][272]++; + if ((list.tagName == "ol")) { + _$jscoverage['plugins/list.js'][273]++; + if (browser.ie) { + _$jscoverage['plugins/list.js'][274]++; + var first = p.firstChild(); + _$jscoverage['plugins/list.js'][275]++; + if (((first.type == "element") && (first.tagName == "span") && orderlisttype[type].test(first.innerText()))) { + _$jscoverage['plugins/list.js'][276]++; + p.removeChild(first); + } + } + else { + _$jscoverage['plugins/list.js'][279]++; + p.innerHTML(p.innerHTML().replace(orderlisttype[type], "")); + } + } + else { + _$jscoverage['plugins/list.js'][282]++; + p.removeChild(p.firstChild()); + } + _$jscoverage['plugins/list.js'][285]++; + var li = UE.uNode.createElement("li"); + _$jscoverage['plugins/list.js'][286]++; + li.appendChild(p); + _$jscoverage['plugins/list.js'][287]++; + list.appendChild(li); +} + _$jscoverage['plugins/list.js'][289]++; + var tmp = node, type, cacheNode = node; + _$jscoverage['plugins/list.js'][291]++; + if (((node.parentNode.tagName != "li") && (type = checkListType(node.innerText(), node)))) { + _$jscoverage['plugins/list.js'][293]++; + var list = UE.uNode.createElement((me.options.insertorderedlist.hasOwnProperty(type)? "ol": "ul")); + _$jscoverage['plugins/list.js'][294]++; + if (customStyle[type]) { + _$jscoverage['plugins/list.js'][295]++; + list.setAttr("class", ("custom_" + type)); + } + else { + _$jscoverage['plugins/list.js'][297]++; + list.setStyle("list-style-type", type); + } + _$jscoverage['plugins/list.js'][299]++; + while ((node && (node.parentNode.tagName != "li") && checkListType(node.innerText(), node))) { + _$jscoverage['plugins/list.js'][300]++; + tmp = node.nextSibling(); + _$jscoverage['plugins/list.js'][301]++; + if ((! tmp)) { + _$jscoverage['plugins/list.js'][302]++; + node.parentNode.insertBefore(list, node); + } + _$jscoverage['plugins/list.js'][304]++; + appendLi(list, node, type); + _$jscoverage['plugins/list.js'][305]++; + node = tmp; +} + _$jscoverage['plugins/list.js'][307]++; + if (((! list.parentNode) && node && node.parentNode)) { + _$jscoverage['plugins/list.js'][308]++; + node.parentNode.insertBefore(list, node); + } + } + _$jscoverage['plugins/list.js'][311]++; + var span = cacheNode.firstChild(); + _$jscoverage['plugins/list.js'][312]++; + if ((span && (span.type == "element") && (span.tagName == "span") && /^\s*( )+\s*$/.test(span.innerText()))) { + _$jscoverage['plugins/list.js'][313]++; + span.parentNode.removeChild(span); + } +})); +})); + _$jscoverage['plugins/list.js'][319]++; + me.addListener("contentchange", (function () { + _$jscoverage['plugins/list.js'][320]++; + adjustListStyle(me.document); +})); + _$jscoverage['plugins/list.js'][323]++; + function adjustListStyle(doc, ignore) { + _$jscoverage['plugins/list.js'][324]++; + utils.each(domUtils.getElementsByTagName(doc, "ol ul"), (function (node) { + _$jscoverage['plugins/list.js'][326]++; + if ((! domUtils.inDoc(node, doc))) { + _$jscoverage['plugins/list.js'][327]++; + return; + } + _$jscoverage['plugins/list.js'][329]++; + var parent = node.parentNode; + _$jscoverage['plugins/list.js'][330]++; + if ((parent.tagName == node.tagName)) { + _$jscoverage['plugins/list.js'][331]++; + var nodeStyleType = (getStyle(node) || ((node.tagName == "OL")? "decimal": "disc")), parentStyleType = (getStyle(parent) || ((parent.tagName == "OL")? "decimal": "disc")); + _$jscoverage['plugins/list.js'][333]++; + if ((nodeStyleType == parentStyleType)) { + _$jscoverage['plugins/list.js'][334]++; + var styleIndex = utils.indexOf(listStyle[node.tagName], nodeStyleType); + _$jscoverage['plugins/list.js'][335]++; + styleIndex = (((styleIndex + 1) == listStyle[node.tagName].length)? 0: (styleIndex + 1)); + _$jscoverage['plugins/list.js'][336]++; + setListStyle(node, listStyle[node.tagName][styleIndex]); + } + } + _$jscoverage['plugins/list.js'][340]++; + var index = 0, type = 2; + _$jscoverage['plugins/list.js'][341]++; + if (domUtils.hasClass(node, /custom_/)) { + _$jscoverage['plugins/list.js'][342]++; + if ((! (/[ou]l/i.test(parent.tagName) && domUtils.hasClass(parent, /custom_/)))) { + _$jscoverage['plugins/list.js'][343]++; + type = 1; + } + } + else { + _$jscoverage['plugins/list.js'][346]++; + if ((/[ou]l/i.test(parent.tagName) && domUtils.hasClass(parent, /custom_/))) { + _$jscoverage['plugins/list.js'][347]++; + type = 3; + } + } + _$jscoverage['plugins/list.js'][351]++; + var style = domUtils.getStyle(node, "list-style-type"); + _$jscoverage['plugins/list.js'][352]++; + (style && (node.style.cssText = ("list-style-type:" + style))); + _$jscoverage['plugins/list.js'][353]++; + node.className = (utils.trim(node.className.replace(/list-paddingleft-\w+/, "")) + " list-paddingleft-" + type); + _$jscoverage['plugins/list.js'][354]++; + utils.each(domUtils.getElementsByTagName(node, "li"), (function (li) { + _$jscoverage['plugins/list.js'][355]++; + (li.style.cssText && (li.style.cssText = "")); + _$jscoverage['plugins/list.js'][356]++; + if ((! li.firstChild)) { + _$jscoverage['plugins/list.js'][357]++; + domUtils.remove(li); + _$jscoverage['plugins/list.js'][358]++; + return; + } + _$jscoverage['plugins/list.js'][360]++; + if ((li.parentNode !== node)) { + _$jscoverage['plugins/list.js'][361]++; + return; + } + _$jscoverage['plugins/list.js'][363]++; + (index++); + _$jscoverage['plugins/list.js'][364]++; + if (domUtils.hasClass(node, /custom_/)) { + _$jscoverage['plugins/list.js'][365]++; + var paddingLeft = 1, currentStyle = getStyle(node); + _$jscoverage['plugins/list.js'][366]++; + if ((node.tagName == "OL")) { + _$jscoverage['plugins/list.js'][367]++; + if (currentStyle) { + _$jscoverage['plugins/list.js'][368]++; + switch (currentStyle) { + case "cn": + case "cn1": + case "cn2": + _$jscoverage['plugins/list.js'][372]++; + if (((index > 10) && (((index % 10) == 0) || ((index > 10) && (index < 20))))) { + _$jscoverage['plugins/list.js'][373]++; + paddingLeft = 2; + } + else { + _$jscoverage['plugins/list.js'][374]++; + if ((index > 20)) { + _$jscoverage['plugins/list.js'][375]++; + paddingLeft = 3; + } + } + _$jscoverage['plugins/list.js'][377]++; + break; + case "num2": + _$jscoverage['plugins/list.js'][379]++; + if ((index > 9)) { + _$jscoverage['plugins/list.js'][380]++; + paddingLeft = 2; + } + } + } + _$jscoverage['plugins/list.js'][384]++; + li.className = ("list-" + customStyle[currentStyle] + index + " " + "list-" + currentStyle + "-paddingleft-" + paddingLeft); + } + else { + _$jscoverage['plugins/list.js'][386]++; + li.className = ("list-" + customStyle[currentStyle] + " " + "list-" + currentStyle + "-paddingleft"); + } + } + else { + _$jscoverage['plugins/list.js'][389]++; + li.className = li.className.replace(/list-[\w\-]+/gi, ""); + } + _$jscoverage['plugins/list.js'][391]++; + var className = li.getAttribute("class"); + _$jscoverage['plugins/list.js'][392]++; + if (((className !== null) && (! className.replace(/\s/g, "")))) { + _$jscoverage['plugins/list.js'][393]++; + domUtils.removeAttributes(li, "class"); + } +})); + _$jscoverage['plugins/list.js'][396]++; + ((! ignore) && adjustList(node, node.tagName.toLowerCase(), (getStyle(node) || domUtils.getStyle(node, "list-style-type")), true)); +})); +} + _$jscoverage['plugins/list.js'][399]++; + function adjustList(list, tag, style, ignoreEmpty) { + _$jscoverage['plugins/list.js'][400]++; + var nextList = list.nextSibling; + _$jscoverage['plugins/list.js'][401]++; + if ((nextList && (nextList.nodeType == 1) && (nextList.tagName.toLowerCase() == tag) && ((getStyle(nextList) || domUtils.getStyle(nextList, "list-style-type") || ((tag == "ol")? "decimal": "disc")) == style))) { + _$jscoverage['plugins/list.js'][402]++; + domUtils.moveChild(nextList, list); + _$jscoverage['plugins/list.js'][403]++; + if ((nextList.childNodes.length == 0)) { + _$jscoverage['plugins/list.js'][404]++; + domUtils.remove(nextList); + } + } + _$jscoverage['plugins/list.js'][407]++; + if ((nextList && domUtils.isFillChar(nextList))) { + _$jscoverage['plugins/list.js'][408]++; + domUtils.remove(nextList); + } + _$jscoverage['plugins/list.js'][410]++; + var preList = list.previousSibling; + _$jscoverage['plugins/list.js'][411]++; + if ((preList && (preList.nodeType == 1) && (preList.tagName.toLowerCase() == tag) && ((getStyle(preList) || domUtils.getStyle(preList, "list-style-type") || ((tag == "ol")? "decimal": "disc")) == style))) { + _$jscoverage['plugins/list.js'][412]++; + domUtils.moveChild(list, preList); + } + _$jscoverage['plugins/list.js'][414]++; + if ((preList && domUtils.isFillChar(preList))) { + _$jscoverage['plugins/list.js'][415]++; + domUtils.remove(preList); + } + _$jscoverage['plugins/list.js'][417]++; + ((! ignoreEmpty) && domUtils.isEmptyBlock(list) && domUtils.remove(list)); + _$jscoverage['plugins/list.js'][418]++; + if (getStyle(list)) { + _$jscoverage['plugins/list.js'][419]++; + adjustListStyle(list.ownerDocument, true); + } +} + _$jscoverage['plugins/list.js'][423]++; + function setListStyle(list, style) { + _$jscoverage['plugins/list.js'][424]++; + if (customStyle[style]) { + _$jscoverage['plugins/list.js'][425]++; + list.className = ("custom_" + style); + } + _$jscoverage['plugins/list.js'][427]++; + try { + _$jscoverage['plugins/list.js'][428]++; + domUtils.setStyle(list, "list-style-type", style); + } + catch (e) { + } +} + _$jscoverage['plugins/list.js'][431]++; + function clearEmptySibling(node) { + _$jscoverage['plugins/list.js'][432]++; + var tmpNode = node.previousSibling; + _$jscoverage['plugins/list.js'][433]++; + if ((tmpNode && domUtils.isEmptyBlock(tmpNode))) { + _$jscoverage['plugins/list.js'][434]++; + domUtils.remove(tmpNode); + } + _$jscoverage['plugins/list.js'][436]++; + tmpNode = node.nextSibling; + _$jscoverage['plugins/list.js'][437]++; + if ((tmpNode && domUtils.isEmptyBlock(tmpNode))) { + _$jscoverage['plugins/list.js'][438]++; + domUtils.remove(tmpNode); + } +} + _$jscoverage['plugins/list.js'][442]++; + me.addListener("keydown", (function (type, evt) { + _$jscoverage['plugins/list.js'][443]++; + function preventAndSave() { + _$jscoverage['plugins/list.js'][444]++; + (evt.preventDefault? evt.preventDefault(): (evt.returnValue = false)); + _$jscoverage['plugins/list.js'][445]++; + me.fireEvent("contentchange"); + _$jscoverage['plugins/list.js'][446]++; + (me.undoManger && me.undoManger.save()); +} + _$jscoverage['plugins/list.js'][448]++; + function findList(node, filterFn) { + _$jscoverage['plugins/list.js'][449]++; + while ((node && (! domUtils.isBody(node)))) { + _$jscoverage['plugins/list.js'][450]++; + if (filterFn(node)) { + _$jscoverage['plugins/list.js'][451]++; + return null; + } + _$jscoverage['plugins/list.js'][453]++; + if (((node.nodeType == 1) && /[ou]l/i.test(node.tagName))) { + _$jscoverage['plugins/list.js'][454]++; + return node; + } + _$jscoverage['plugins/list.js'][456]++; + node = node.parentNode; +} + _$jscoverage['plugins/list.js'][458]++; + return null; +} + _$jscoverage['plugins/list.js'][460]++; + var keyCode = (evt.keyCode || evt.which); + _$jscoverage['plugins/list.js'][461]++; + if (((keyCode == 13) && (! evt.shiftKey))) { + _$jscoverage['plugins/list.js'][462]++; + var rng = me.selection.getRange(), parent = domUtils.findParent(rng.startContainer, (function (node) { + _$jscoverage['plugins/list.js'][463]++; + return domUtils.isBlockElm(node); +}), true), li = domUtils.findParentByTagName(rng.startContainer, "li", true); + _$jscoverage['plugins/list.js'][465]++; + if ((parent && (parent.tagName != "PRE") && (! li))) { + _$jscoverage['plugins/list.js'][466]++; + var html = parent.innerHTML.replace(new RegExp(domUtils.fillChar, "g"), ""); + _$jscoverage['plugins/list.js'][467]++; + if (/^\s*1\s*\.[^\d]/.test(html)) { + _$jscoverage['plugins/list.js'][468]++; + parent.innerHTML = html.replace(/^\s*1\s*\./, ""); + _$jscoverage['plugins/list.js'][469]++; + rng.setStartAtLast(parent).collapse(true).select(); + _$jscoverage['plugins/list.js'][470]++; + me.__hasEnterExecCommand = true; + _$jscoverage['plugins/list.js'][471]++; + me.execCommand("insertorderedlist"); + _$jscoverage['plugins/list.js'][472]++; + me.__hasEnterExecCommand = false; + } + } + _$jscoverage['plugins/list.js'][475]++; + var range = me.selection.getRange(), start = findList(range.startContainer, (function (node) { + _$jscoverage['plugins/list.js'][477]++; + return (node.tagName == "TABLE"); +})), end = (range.collapsed? start: findList(range.endContainer, (function (node) { + _$jscoverage['plugins/list.js'][480]++; + return (node.tagName == "TABLE"); +}))); + _$jscoverage['plugins/list.js'][483]++; + if ((start && end && (start === end))) { + _$jscoverage['plugins/list.js'][485]++; + if ((! range.collapsed)) { + _$jscoverage['plugins/list.js'][486]++; + start = domUtils.findParentByTagName(range.startContainer, "li", true); + _$jscoverage['plugins/list.js'][487]++; + end = domUtils.findParentByTagName(range.endContainer, "li", true); + _$jscoverage['plugins/list.js'][488]++; + if ((start && end && (start === end))) { + _$jscoverage['plugins/list.js'][489]++; + range.deleteContents(); + _$jscoverage['plugins/list.js'][490]++; + li = domUtils.findParentByTagName(range.startContainer, "li", true); + _$jscoverage['plugins/list.js'][491]++; + if ((li && domUtils.isEmptyBlock(li))) { + _$jscoverage['plugins/list.js'][493]++; + pre = li.previousSibling; + _$jscoverage['plugins/list.js'][494]++; + next = li.nextSibling; + _$jscoverage['plugins/list.js'][495]++; + p = me.document.createElement("p"); + _$jscoverage['plugins/list.js'][497]++; + domUtils.fillNode(me.document, p); + _$jscoverage['plugins/list.js'][498]++; + parentList = li.parentNode; + _$jscoverage['plugins/list.js'][499]++; + if ((pre && next)) { + _$jscoverage['plugins/list.js'][500]++; + range.setStart(next, 0).collapse(true).select(true); + _$jscoverage['plugins/list.js'][501]++; + domUtils.remove(li); + } + else { + _$jscoverage['plugins/list.js'][504]++; + if ((((! pre) && (! next)) || (! pre))) { + _$jscoverage['plugins/list.js'][506]++; + parentList.parentNode.insertBefore(p, parentList); + } + else { + _$jscoverage['plugins/list.js'][510]++; + li.parentNode.parentNode.insertBefore(p, parentList.nextSibling); + } + _$jscoverage['plugins/list.js'][512]++; + domUtils.remove(li); + _$jscoverage['plugins/list.js'][513]++; + if ((! parentList.firstChild)) { + _$jscoverage['plugins/list.js'][514]++; + domUtils.remove(parentList); + } + _$jscoverage['plugins/list.js'][516]++; + range.setStart(p, 0).setCursor(); + } + _$jscoverage['plugins/list.js'][520]++; + preventAndSave(); + _$jscoverage['plugins/list.js'][521]++; + return; + } + } + else { + _$jscoverage['plugins/list.js'][525]++; + var tmpRange = range.cloneRange(), bk = tmpRange.collapse(false).createBookmark(); + _$jscoverage['plugins/list.js'][528]++; + range.deleteContents(); + _$jscoverage['plugins/list.js'][529]++; + tmpRange.moveToBookmark(bk); + _$jscoverage['plugins/list.js'][530]++; + var li = domUtils.findParentByTagName(tmpRange.startContainer, "li", true); + _$jscoverage['plugins/list.js'][532]++; + clearEmptySibling(li); + _$jscoverage['plugins/list.js'][533]++; + tmpRange.select(); + _$jscoverage['plugins/list.js'][534]++; + preventAndSave(); + _$jscoverage['plugins/list.js'][535]++; + return; + } + } + _$jscoverage['plugins/list.js'][540]++; + li = domUtils.findParentByTagName(range.startContainer, "li", true); + _$jscoverage['plugins/list.js'][542]++; + if (li) { + _$jscoverage['plugins/list.js'][543]++; + if (domUtils.isEmptyBlock(li)) { + _$jscoverage['plugins/list.js'][544]++; + bk = range.createBookmark(); + _$jscoverage['plugins/list.js'][545]++; + var parentList = li.parentNode; + _$jscoverage['plugins/list.js'][546]++; + if ((li !== parentList.lastChild)) { + _$jscoverage['plugins/list.js'][547]++; + domUtils.breakParent(li, parentList); + _$jscoverage['plugins/list.js'][548]++; + clearEmptySibling(li); + } + else { + _$jscoverage['plugins/list.js'][551]++; + parentList.parentNode.insertBefore(li, parentList.nextSibling); + _$jscoverage['plugins/list.js'][552]++; + if (domUtils.isEmptyNode(parentList)) { + _$jscoverage['plugins/list.js'][553]++; + domUtils.remove(parentList); + } + } + _$jscoverage['plugins/list.js'][557]++; + if ((! dtd.$list[li.parentNode.tagName])) { + _$jscoverage['plugins/list.js'][559]++; + if ((! domUtils.isBlockElm(li.firstChild))) { + _$jscoverage['plugins/list.js'][560]++; + p = me.document.createElement("p"); + _$jscoverage['plugins/list.js'][561]++; + li.parentNode.insertBefore(p, li); + _$jscoverage['plugins/list.js'][562]++; + while (li.firstChild) { + _$jscoverage['plugins/list.js'][563]++; + p.appendChild(li.firstChild); +} + _$jscoverage['plugins/list.js'][565]++; + domUtils.remove(li); + } + else { + _$jscoverage['plugins/list.js'][567]++; + domUtils.remove(li, true); + } + } + _$jscoverage['plugins/list.js'][570]++; + range.moveToBookmark(bk).select(); + } + else { + _$jscoverage['plugins/list.js'][574]++; + var first = li.firstChild; + _$jscoverage['plugins/list.js'][575]++; + if (((! first) || (! domUtils.isBlockElm(first)))) { + _$jscoverage['plugins/list.js'][576]++; + var p = me.document.createElement("p"); + _$jscoverage['plugins/list.js'][578]++; + ((! li.firstChild) && domUtils.fillNode(me.document, p)); + _$jscoverage['plugins/list.js'][579]++; + while (li.firstChild) { + _$jscoverage['plugins/list.js'][581]++; + p.appendChild(li.firstChild); +} + _$jscoverage['plugins/list.js'][583]++; + li.appendChild(p); + _$jscoverage['plugins/list.js'][584]++; + first = p; + } + _$jscoverage['plugins/list.js'][587]++; + var span = me.document.createElement("span"); + _$jscoverage['plugins/list.js'][589]++; + range.insertNode(span); + _$jscoverage['plugins/list.js'][590]++; + domUtils.breakParent(span, li); + _$jscoverage['plugins/list.js'][592]++; + var nextLi = span.nextSibling; + _$jscoverage['plugins/list.js'][593]++; + first = nextLi.firstChild; + _$jscoverage['plugins/list.js'][595]++; + if ((! first)) { + _$jscoverage['plugins/list.js'][596]++; + p = me.document.createElement("p"); + _$jscoverage['plugins/list.js'][598]++; + domUtils.fillNode(me.document, p); + _$jscoverage['plugins/list.js'][599]++; + nextLi.appendChild(p); + _$jscoverage['plugins/list.js'][600]++; + first = p; + } + _$jscoverage['plugins/list.js'][602]++; + if (domUtils.isEmptyNode(first)) { + _$jscoverage['plugins/list.js'][603]++; + first.innerHTML = ""; + _$jscoverage['plugins/list.js'][604]++; + domUtils.fillNode(me.document, first); + } + _$jscoverage['plugins/list.js'][607]++; + range.setStart(first, 0).collapse(true).shrinkBoundary().select(); + _$jscoverage['plugins/list.js'][608]++; + domUtils.remove(span); + _$jscoverage['plugins/list.js'][609]++; + var pre = nextLi.previousSibling; + _$jscoverage['plugins/list.js'][610]++; + if ((pre && domUtils.isEmptyBlock(pre))) { + _$jscoverage['plugins/list.js'][611]++; + pre.innerHTML = "

    "; + _$jscoverage['plugins/list.js'][612]++; + domUtils.fillNode(me.document, pre.firstChild); + } + } + _$jscoverage['plugins/list.js'][617]++; + preventAndSave(); + } + } + } + _$jscoverage['plugins/list.js'][625]++; + if ((keyCode == 8)) { + _$jscoverage['plugins/list.js'][627]++; + range = me.selection.getRange(); + _$jscoverage['plugins/list.js'][628]++; + if ((range.collapsed && domUtils.isStartInblock(range))) { + _$jscoverage['plugins/list.js'][629]++; + tmpRange = range.cloneRange().trimBoundary(); + _$jscoverage['plugins/list.js'][630]++; + li = domUtils.findParentByTagName(range.startContainer, "li", true); + _$jscoverage['plugins/list.js'][632]++; + if ((li && domUtils.isStartInblock(tmpRange))) { + _$jscoverage['plugins/list.js'][633]++; + start = domUtils.findParentByTagName(range.startContainer, "p", true); + _$jscoverage['plugins/list.js'][634]++; + if ((start && (start !== li.firstChild))) { + _$jscoverage['plugins/list.js'][635]++; + var parentList = domUtils.findParentByTagName(start, ["ol", "ul"]); + _$jscoverage['plugins/list.js'][636]++; + domUtils.breakParent(start, parentList); + _$jscoverage['plugins/list.js'][637]++; + clearEmptySibling(start); + _$jscoverage['plugins/list.js'][638]++; + me.fireEvent("contentchange"); + _$jscoverage['plugins/list.js'][639]++; + range.setStart(start, 0).setCursor(false, true); + _$jscoverage['plugins/list.js'][640]++; + me.fireEvent("saveScene"); + _$jscoverage['plugins/list.js'][641]++; + domUtils.preventDefault(evt); + _$jscoverage['plugins/list.js'][642]++; + return; + } + _$jscoverage['plugins/list.js'][645]++; + if ((li && (pre = li.previousSibling))) { + _$jscoverage['plugins/list.js'][646]++; + if (((keyCode == 46) && li.childNodes.length)) { + _$jscoverage['plugins/list.js'][647]++; + return; + } + _$jscoverage['plugins/list.js'][650]++; + if (dtd.$list[pre.tagName]) { + _$jscoverage['plugins/list.js'][651]++; + pre = pre.lastChild; + } + _$jscoverage['plugins/list.js'][653]++; + (me.undoManger && me.undoManger.save()); + _$jscoverage['plugins/list.js'][654]++; + first = li.firstChild; + _$jscoverage['plugins/list.js'][655]++; + if (domUtils.isBlockElm(first)) { + _$jscoverage['plugins/list.js'][656]++; + if (domUtils.isEmptyNode(first)) { + _$jscoverage['plugins/list.js'][658]++; + pre.appendChild(first); + _$jscoverage['plugins/list.js'][659]++; + range.setStart(first, 0).setCursor(false, true); + _$jscoverage['plugins/list.js'][661]++; + while (li.firstChild) { + _$jscoverage['plugins/list.js'][662]++; + pre.appendChild(li.firstChild); +} + } + else { + _$jscoverage['plugins/list.js'][666]++; + span = me.document.createElement("span"); + _$jscoverage['plugins/list.js'][667]++; + range.insertNode(span); + _$jscoverage['plugins/list.js'][669]++; + if (domUtils.isEmptyBlock(pre)) { + _$jscoverage['plugins/list.js'][670]++; + pre.innerHTML = ""; + } + _$jscoverage['plugins/list.js'][672]++; + domUtils.moveChild(li, pre); + _$jscoverage['plugins/list.js'][673]++; + range.setStartBefore(span).collapse(true).select(true); + _$jscoverage['plugins/list.js'][675]++; + domUtils.remove(span); + } + } + else { + _$jscoverage['plugins/list.js'][679]++; + if (domUtils.isEmptyNode(li)) { + _$jscoverage['plugins/list.js'][680]++; + var p = me.document.createElement("p"); + _$jscoverage['plugins/list.js'][681]++; + pre.appendChild(p); + _$jscoverage['plugins/list.js'][682]++; + range.setStart(p, 0).setCursor(); + } + else { + _$jscoverage['plugins/list.js'][685]++; + range.setEnd(pre, pre.childNodes.length).collapse().select(true); + _$jscoverage['plugins/list.js'][686]++; + while (li.firstChild) { + _$jscoverage['plugins/list.js'][687]++; + pre.appendChild(li.firstChild); +} + } + } + _$jscoverage['plugins/list.js'][691]++; + domUtils.remove(li); + _$jscoverage['plugins/list.js'][692]++; + me.fireEvent("contentchange"); + _$jscoverage['plugins/list.js'][693]++; + me.fireEvent("saveScene"); + _$jscoverage['plugins/list.js'][694]++; + domUtils.preventDefault(evt); + _$jscoverage['plugins/list.js'][695]++; + return; + } + _$jscoverage['plugins/list.js'][700]++; + if ((li && (! li.previousSibling))) { + _$jscoverage['plugins/list.js'][701]++; + var parentList = li.parentNode; + _$jscoverage['plugins/list.js'][702]++; + var bk = range.createBookmark(); + _$jscoverage['plugins/list.js'][703]++; + if (domUtils.isTagNode(parentList.parentNode, "ol ul")) { + _$jscoverage['plugins/list.js'][704]++; + parentList.parentNode.insertBefore(li, parentList); + _$jscoverage['plugins/list.js'][705]++; + if (domUtils.isEmptyNode(parentList)) { + _$jscoverage['plugins/list.js'][706]++; + domUtils.remove(parentList); + } + } + else { + _$jscoverage['plugins/list.js'][710]++; + while (li.firstChild) { + _$jscoverage['plugins/list.js'][711]++; + parentList.parentNode.insertBefore(li.firstChild, parentList); +} + _$jscoverage['plugins/list.js'][714]++; + domUtils.remove(li); + _$jscoverage['plugins/list.js'][715]++; + if (domUtils.isEmptyNode(parentList)) { + _$jscoverage['plugins/list.js'][716]++; + domUtils.remove(parentList); + } + } + _$jscoverage['plugins/list.js'][720]++; + range.moveToBookmark(bk).setCursor(false, true); + _$jscoverage['plugins/list.js'][721]++; + me.fireEvent("contentchange"); + _$jscoverage['plugins/list.js'][722]++; + me.fireEvent("saveScene"); + _$jscoverage['plugins/list.js'][723]++; + domUtils.preventDefault(evt); + _$jscoverage['plugins/list.js'][724]++; + return; + } + } + } + } +})); + _$jscoverage['plugins/list.js'][737]++; + me.addListener("keyup", (function (type, evt) { + _$jscoverage['plugins/list.js'][738]++; + var keyCode = (evt.keyCode || evt.which); + _$jscoverage['plugins/list.js'][739]++; + if ((keyCode == 8)) { + _$jscoverage['plugins/list.js'][740]++; + var rng = me.selection.getRange(), list; + _$jscoverage['plugins/list.js'][741]++; + if ((list = domUtils.findParentByTagName(rng.startContainer, ["ol", "ul"], true))) { + _$jscoverage['plugins/list.js'][742]++; + adjustList(list, list.tagName.toLowerCase(), (getStyle(list) || domUtils.getComputedStyle(list, "list-style-type")), true); + } + } +})); + _$jscoverage['plugins/list.js'][747]++; + me.addListener("tabkeydown", (function () { + _$jscoverage['plugins/list.js'][749]++; + var range = me.selection.getRange(); + _$jscoverage['plugins/list.js'][752]++; + function checkLevel(li) { + _$jscoverage['plugins/list.js'][753]++; + if ((me.options.maxListLevel != -1)) { + _$jscoverage['plugins/list.js'][754]++; + var level = li.parentNode, levelNum = 0; + _$jscoverage['plugins/list.js'][755]++; + while (/[ou]l/i.test(level.tagName)) { + _$jscoverage['plugins/list.js'][756]++; + (levelNum++); + _$jscoverage['plugins/list.js'][757]++; + level = level.parentNode; +} + _$jscoverage['plugins/list.js'][759]++; + if ((levelNum >= me.options.maxListLevel)) { + _$jscoverage['plugins/list.js'][760]++; + return true; + } + } +} + _$jscoverage['plugins/list.js'][766]++; + var li = domUtils.findParentByTagName(range.startContainer, "li", true); + _$jscoverage['plugins/list.js'][767]++; + if (li) { + _$jscoverage['plugins/list.js'][769]++; + var bk; + _$jscoverage['plugins/list.js'][770]++; + if (range.collapsed) { + _$jscoverage['plugins/list.js'][771]++; + if (checkLevel(li)) { + _$jscoverage['plugins/list.js'][772]++; + return true; + } + _$jscoverage['plugins/list.js'][773]++; + var parentLi = li.parentNode, list = me.document.createElement(parentLi.tagName), index = utils.indexOf(listStyle[list.tagName], (getStyle(parentLi) || domUtils.getComputedStyle(parentLi, "list-style-type"))); + _$jscoverage['plugins/list.js'][776]++; + index = (((index + 1) == listStyle[list.tagName].length)? 0: (index + 1)); + _$jscoverage['plugins/list.js'][777]++; + var currentStyle = listStyle[list.tagName][index]; + _$jscoverage['plugins/list.js'][778]++; + setListStyle(list, currentStyle); + _$jscoverage['plugins/list.js'][779]++; + if (domUtils.isStartInblock(range)) { + _$jscoverage['plugins/list.js'][780]++; + me.fireEvent("saveScene"); + _$jscoverage['plugins/list.js'][781]++; + bk = range.createBookmark(); + _$jscoverage['plugins/list.js'][782]++; + parentLi.insertBefore(list, li); + _$jscoverage['plugins/list.js'][783]++; + list.appendChild(li); + _$jscoverage['plugins/list.js'][784]++; + adjustList(list, list.tagName.toLowerCase(), currentStyle); + _$jscoverage['plugins/list.js'][785]++; + me.fireEvent("contentchange"); + _$jscoverage['plugins/list.js'][786]++; + range.moveToBookmark(bk).select(true); + _$jscoverage['plugins/list.js'][787]++; + return true; + } + } + else { + _$jscoverage['plugins/list.js'][790]++; + me.fireEvent("saveScene"); + _$jscoverage['plugins/list.js'][791]++; + bk = range.createBookmark(); + _$jscoverage['plugins/list.js'][792]++; + for (var i = 0, closeList, parents = domUtils.findParents(li), ci; (ci = parents[(i++)]);) { + _$jscoverage['plugins/list.js'][793]++; + if (domUtils.isTagNode(ci, "ol ul")) { + _$jscoverage['plugins/list.js'][794]++; + closeList = ci; + _$jscoverage['plugins/list.js'][795]++; + break; + } +} + _$jscoverage['plugins/list.js'][798]++; + var current = li; + _$jscoverage['plugins/list.js'][799]++; + if (bk.end) { + _$jscoverage['plugins/list.js'][800]++; + while ((current && (! (domUtils.getPosition(current, bk.end) & domUtils.POSITION_FOLLOWING)))) { + _$jscoverage['plugins/list.js'][801]++; + if (checkLevel(current)) { + _$jscoverage['plugins/list.js'][802]++; + current = domUtils.getNextDomNode(current, false, null, (function (node) { + _$jscoverage['plugins/list.js'][802]++; + return (node !== closeList); +})); + _$jscoverage['plugins/list.js'][803]++; + continue; + } + _$jscoverage['plugins/list.js'][805]++; + var parentLi = current.parentNode, list = me.document.createElement(parentLi.tagName), index = utils.indexOf(listStyle[list.tagName], (getStyle(parentLi) || domUtils.getComputedStyle(parentLi, "list-style-type"))); + _$jscoverage['plugins/list.js'][808]++; + var currentIndex = (((index + 1) == listStyle[list.tagName].length)? 0: (index + 1)); + _$jscoverage['plugins/list.js'][809]++; + var currentStyle = listStyle[list.tagName][currentIndex]; + _$jscoverage['plugins/list.js'][810]++; + setListStyle(list, currentStyle); + _$jscoverage['plugins/list.js'][811]++; + parentLi.insertBefore(list, current); + _$jscoverage['plugins/list.js'][812]++; + while ((current && (! (domUtils.getPosition(current, bk.end) & domUtils.POSITION_FOLLOWING)))) { + _$jscoverage['plugins/list.js'][813]++; + li = current.nextSibling; + _$jscoverage['plugins/list.js'][814]++; + list.appendChild(current); + _$jscoverage['plugins/list.js'][815]++; + if (((! li) || domUtils.isTagNode(li, "ol ul"))) { + _$jscoverage['plugins/list.js'][816]++; + if (li) { + _$jscoverage['plugins/list.js'][817]++; + while ((li = li.firstChild)) { + _$jscoverage['plugins/list.js'][818]++; + if ((li.tagName == "LI")) { + _$jscoverage['plugins/list.js'][819]++; + break; + } +} + } + else { + _$jscoverage['plugins/list.js'][823]++; + li = domUtils.getNextDomNode(current, false, null, (function (node) { + _$jscoverage['plugins/list.js'][823]++; + return (node !== closeList); +})); + } + _$jscoverage['plugins/list.js'][825]++; + break; + } + _$jscoverage['plugins/list.js'][827]++; + current = li; +} + _$jscoverage['plugins/list.js'][829]++; + adjustList(list, list.tagName.toLowerCase(), currentStyle); + _$jscoverage['plugins/list.js'][830]++; + current = li; +} + } + _$jscoverage['plugins/list.js'][833]++; + me.fireEvent("contentchange"); + _$jscoverage['plugins/list.js'][834]++; + range.moveToBookmark(bk).select(); + _$jscoverage['plugins/list.js'][835]++; + return true; + } + } +})); + _$jscoverage['plugins/list.js'][840]++; + function getLi(start) { + _$jscoverage['plugins/list.js'][841]++; + while ((start && (! domUtils.isBody(start)))) { + _$jscoverage['plugins/list.js'][842]++; + if ((start.nodeName == "TABLE")) { + _$jscoverage['plugins/list.js'][843]++; + return null; + } + _$jscoverage['plugins/list.js'][845]++; + if ((start.nodeName == "LI")) { + _$jscoverage['plugins/list.js'][846]++; + return start; + } + _$jscoverage['plugins/list.js'][848]++; + start = start.parentNode; +} +} + _$jscoverage['plugins/list.js'][921]++; + me.commands.insertorderedlist = (me.commands.insertunorderedlist = {execCommand: (function (command, style) { + _$jscoverage['plugins/list.js'][925]++; + if ((! style)) { + _$jscoverage['plugins/list.js'][926]++; + style = ((command.toLowerCase() == "insertorderedlist")? "decimal": "disc"); + } + _$jscoverage['plugins/list.js'][928]++; + var me = this, range = this.selection.getRange(), filterFn = (function (node) { + _$jscoverage['plugins/list.js'][931]++; + return ((node.nodeType == 1)? (node.tagName.toLowerCase() != "br"): (! domUtils.isWhitespace(node))); +}), tag = ((command.toLowerCase() == "insertorderedlist")? "ol": "ul"), frag = me.document.createDocumentFragment(); + _$jscoverage['plugins/list.js'][937]++; + range.adjustmentBoundary().shrinkBoundary(); + _$jscoverage['plugins/list.js'][938]++; + 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; + _$jscoverage['plugins/list.js'][946]++; + if ((start || end)) { + _$jscoverage['plugins/list.js'][947]++; + (start && (startParent = start.parentNode)); + _$jscoverage['plugins/list.js'][948]++; + if ((! bko.end)) { + _$jscoverage['plugins/list.js'][949]++; + end = start; + } + _$jscoverage['plugins/list.js'][951]++; + (end && (endParent = end.parentNode)); + _$jscoverage['plugins/list.js'][953]++; + if ((startParent === endParent)) { + _$jscoverage['plugins/list.js'][954]++; + while ((start !== end)) { + _$jscoverage['plugins/list.js'][955]++; + tmp = start; + _$jscoverage['plugins/list.js'][956]++; + start = start.nextSibling; + _$jscoverage['plugins/list.js'][957]++; + if ((! domUtils.isBlockElm(tmp.firstChild))) { + _$jscoverage['plugins/list.js'][958]++; + var p = me.document.createElement("p"); + _$jscoverage['plugins/list.js'][959]++; + while (tmp.firstChild) { + _$jscoverage['plugins/list.js'][960]++; + p.appendChild(tmp.firstChild); +} + _$jscoverage['plugins/list.js'][962]++; + tmp.appendChild(p); + } + _$jscoverage['plugins/list.js'][964]++; + frag.appendChild(tmp); +} + _$jscoverage['plugins/list.js'][966]++; + tmp = me.document.createElement("span"); + _$jscoverage['plugins/list.js'][967]++; + startParent.insertBefore(tmp, end); + _$jscoverage['plugins/list.js'][968]++; + if ((! domUtils.isBlockElm(end.firstChild))) { + _$jscoverage['plugins/list.js'][969]++; + p = me.document.createElement("p"); + _$jscoverage['plugins/list.js'][970]++; + while (end.firstChild) { + _$jscoverage['plugins/list.js'][971]++; + p.appendChild(end.firstChild); +} + _$jscoverage['plugins/list.js'][973]++; + end.appendChild(p); + } + _$jscoverage['plugins/list.js'][975]++; + frag.appendChild(end); + _$jscoverage['plugins/list.js'][976]++; + domUtils.breakParent(tmp, startParent); + _$jscoverage['plugins/list.js'][977]++; + if (domUtils.isEmptyNode(tmp.previousSibling)) { + _$jscoverage['plugins/list.js'][978]++; + domUtils.remove(tmp.previousSibling); + } + _$jscoverage['plugins/list.js'][980]++; + if (domUtils.isEmptyNode(tmp.nextSibling)) { + _$jscoverage['plugins/list.js'][981]++; + domUtils.remove(tmp.nextSibling); + } + _$jscoverage['plugins/list.js'][983]++; + var nodeStyle = (getStyle(startParent) || domUtils.getComputedStyle(startParent, "list-style-type") || ((command.toLowerCase() == "insertorderedlist")? "decimal": "disc")); + _$jscoverage['plugins/list.js'][984]++; + if (((startParent.tagName.toLowerCase() == tag) && (nodeStyle == style))) { + _$jscoverage['plugins/list.js'][985]++; + for (var i = 0, ci, tmpFrag = me.document.createDocumentFragment(); (ci = frag.childNodes[(i++)]);) { + _$jscoverage['plugins/list.js'][986]++; + if (domUtils.isTagNode(ci, "ol ul")) { + _$jscoverage['plugins/list.js'][987]++; + utils.each(domUtils.getElementsByTagName(ci, "li"), (function (li) { + _$jscoverage['plugins/list.js'][988]++; + while (li.firstChild) { + _$jscoverage['plugins/list.js'][989]++; + tmpFrag.appendChild(li.firstChild); +} +})); + } + else { + _$jscoverage['plugins/list.js'][994]++; + while (ci.firstChild) { + _$jscoverage['plugins/list.js'][995]++; + tmpFrag.appendChild(ci.firstChild); +} + } +} + _$jscoverage['plugins/list.js'][1000]++; + tmp.parentNode.insertBefore(tmpFrag, tmp); + } + else { + _$jscoverage['plugins/list.js'][1002]++; + list = me.document.createElement(tag); + _$jscoverage['plugins/list.js'][1003]++; + setListStyle(list, style); + _$jscoverage['plugins/list.js'][1004]++; + list.appendChild(frag); + _$jscoverage['plugins/list.js'][1005]++; + tmp.parentNode.insertBefore(list, tmp); + } + _$jscoverage['plugins/list.js'][1008]++; + domUtils.remove(tmp); + _$jscoverage['plugins/list.js'][1009]++; + (list && adjustList(list, tag, style)); + _$jscoverage['plugins/list.js'][1010]++; + range.moveToBookmark(bko).select(); + _$jscoverage['plugins/list.js'][1011]++; + return; + } + _$jscoverage['plugins/list.js'][1014]++; + if (start) { + _$jscoverage['plugins/list.js'][1015]++; + while (start) { + _$jscoverage['plugins/list.js'][1016]++; + tmp = start.nextSibling; + _$jscoverage['plugins/list.js'][1017]++; + if (domUtils.isTagNode(start, "ol ul")) { + _$jscoverage['plugins/list.js'][1018]++; + frag.appendChild(start); + } + else { + _$jscoverage['plugins/list.js'][1020]++; + var tmpfrag = me.document.createDocumentFragment(), hasBlock = 0; + _$jscoverage['plugins/list.js'][1022]++; + while (start.firstChild) { + _$jscoverage['plugins/list.js'][1023]++; + if (domUtils.isBlockElm(start.firstChild)) { + _$jscoverage['plugins/list.js'][1024]++; + hasBlock = 1; + } + _$jscoverage['plugins/list.js'][1026]++; + tmpfrag.appendChild(start.firstChild); +} + _$jscoverage['plugins/list.js'][1028]++; + if ((! hasBlock)) { + _$jscoverage['plugins/list.js'][1029]++; + var tmpP = me.document.createElement("p"); + _$jscoverage['plugins/list.js'][1030]++; + tmpP.appendChild(tmpfrag); + _$jscoverage['plugins/list.js'][1031]++; + frag.appendChild(tmpP); + } + else { + _$jscoverage['plugins/list.js'][1033]++; + frag.appendChild(tmpfrag); + } + _$jscoverage['plugins/list.js'][1035]++; + domUtils.remove(start); + } + _$jscoverage['plugins/list.js'][1038]++; + start = tmp; +} + _$jscoverage['plugins/list.js'][1040]++; + startParent.parentNode.insertBefore(frag, startParent.nextSibling); + _$jscoverage['plugins/list.js'][1041]++; + if (domUtils.isEmptyNode(startParent)) { + _$jscoverage['plugins/list.js'][1042]++; + range.setStartBefore(startParent); + _$jscoverage['plugins/list.js'][1043]++; + domUtils.remove(startParent); + } + else { + _$jscoverage['plugins/list.js'][1045]++; + range.setStartAfter(startParent); + } + _$jscoverage['plugins/list.js'][1047]++; + modifyStart = 1; + } + _$jscoverage['plugins/list.js'][1050]++; + if ((end && domUtils.inDoc(endParent, me.document))) { + _$jscoverage['plugins/list.js'][1052]++; + start = endParent.firstChild; + _$jscoverage['plugins/list.js'][1053]++; + while ((start && (start !== end))) { + _$jscoverage['plugins/list.js'][1054]++; + tmp = start.nextSibling; + _$jscoverage['plugins/list.js'][1055]++; + if (domUtils.isTagNode(start, "ol ul")) { + _$jscoverage['plugins/list.js'][1056]++; + frag.appendChild(start); + } + else { + _$jscoverage['plugins/list.js'][1058]++; + tmpfrag = me.document.createDocumentFragment(); + _$jscoverage['plugins/list.js'][1059]++; + hasBlock = 0; + _$jscoverage['plugins/list.js'][1060]++; + while (start.firstChild) { + _$jscoverage['plugins/list.js'][1061]++; + if (domUtils.isBlockElm(start.firstChild)) { + _$jscoverage['plugins/list.js'][1062]++; + hasBlock = 1; + } + _$jscoverage['plugins/list.js'][1064]++; + tmpfrag.appendChild(start.firstChild); +} + _$jscoverage['plugins/list.js'][1066]++; + if ((! hasBlock)) { + _$jscoverage['plugins/list.js'][1067]++; + tmpP = me.document.createElement("p"); + _$jscoverage['plugins/list.js'][1068]++; + tmpP.appendChild(tmpfrag); + _$jscoverage['plugins/list.js'][1069]++; + frag.appendChild(tmpP); + } + else { + _$jscoverage['plugins/list.js'][1071]++; + frag.appendChild(tmpfrag); + } + _$jscoverage['plugins/list.js'][1073]++; + domUtils.remove(start); + } + _$jscoverage['plugins/list.js'][1075]++; + start = tmp; +} + _$jscoverage['plugins/list.js'][1077]++; + var tmpDiv = domUtils.createElement(me.document, "div", {"tmpDiv": 1}); + _$jscoverage['plugins/list.js'][1080]++; + domUtils.moveChild(end, tmpDiv); + _$jscoverage['plugins/list.js'][1082]++; + frag.appendChild(tmpDiv); + _$jscoverage['plugins/list.js'][1083]++; + domUtils.remove(end); + _$jscoverage['plugins/list.js'][1084]++; + endParent.parentNode.insertBefore(frag, endParent); + _$jscoverage['plugins/list.js'][1085]++; + range.setEndBefore(endParent); + _$jscoverage['plugins/list.js'][1086]++; + if (domUtils.isEmptyNode(endParent)) { + _$jscoverage['plugins/list.js'][1087]++; + domUtils.remove(endParent); + } + _$jscoverage['plugins/list.js'][1090]++; + modifyEnd = 1; + } + } + _$jscoverage['plugins/list.js'][1096]++; + if ((! modifyStart)) { + _$jscoverage['plugins/list.js'][1097]++; + range.setStartBefore(me.document.getElementById(bko.start)); + } + _$jscoverage['plugins/list.js'][1099]++; + if ((bko.end && (! modifyEnd))) { + _$jscoverage['plugins/list.js'][1100]++; + range.setEndAfter(me.document.getElementById(bko.end)); + } + _$jscoverage['plugins/list.js'][1102]++; + range.enlarge(true, (function (node) { + _$jscoverage['plugins/list.js'][1103]++; + return notExchange[node.tagName]; +})); + _$jscoverage['plugins/list.js'][1106]++; + frag = me.document.createDocumentFragment(); + _$jscoverage['plugins/list.js'][1108]++; + var bk = range.createBookmark(), current = domUtils.getNextDomNode(bk.start, false, filterFn), tmpRange = range.cloneRange(), tmpNode, block = domUtils.isBlockElm; + _$jscoverage['plugins/list.js'][1114]++; + while ((current && (current !== bk.end) && (domUtils.getPosition(current, bk.end) & domUtils.POSITION_PRECEDING))) { + _$jscoverage['plugins/list.js'][1116]++; + if (((current.nodeType == 3) || dtd.li[current.tagName])) { + _$jscoverage['plugins/list.js'][1117]++; + if (((current.nodeType == 1) && dtd.$list[current.tagName])) { + _$jscoverage['plugins/list.js'][1118]++; + while (current.firstChild) { + _$jscoverage['plugins/list.js'][1119]++; + frag.appendChild(current.firstChild); +} + _$jscoverage['plugins/list.js'][1121]++; + tmpNode = domUtils.getNextDomNode(current, false, filterFn); + _$jscoverage['plugins/list.js'][1122]++; + domUtils.remove(current); + _$jscoverage['plugins/list.js'][1123]++; + current = tmpNode; + _$jscoverage['plugins/list.js'][1124]++; + continue; + } + _$jscoverage['plugins/list.js'][1127]++; + tmpNode = current; + _$jscoverage['plugins/list.js'][1128]++; + tmpRange.setStartBefore(current); + _$jscoverage['plugins/list.js'][1130]++; + while ((current && (current !== bk.end) && ((! block(current)) || domUtils.isBookmarkNode(current)))) { + _$jscoverage['plugins/list.js'][1131]++; + tmpNode = current; + _$jscoverage['plugins/list.js'][1132]++; + current = domUtils.getNextDomNode(current, false, null, (function (node) { + _$jscoverage['plugins/list.js'][1133]++; + return (! notExchange[node.tagName]); +})); +} + _$jscoverage['plugins/list.js'][1137]++; + if ((current && block(current))) { + _$jscoverage['plugins/list.js'][1138]++; + tmp = domUtils.getNextDomNode(tmpNode, false, filterFn); + _$jscoverage['plugins/list.js'][1139]++; + if ((tmp && domUtils.isBookmarkNode(tmp))) { + _$jscoverage['plugins/list.js'][1140]++; + current = domUtils.getNextDomNode(tmp, false, filterFn); + _$jscoverage['plugins/list.js'][1141]++; + tmpNode = tmp; + } + } + _$jscoverage['plugins/list.js'][1144]++; + tmpRange.setEndAfter(tmpNode); + _$jscoverage['plugins/list.js'][1146]++; + current = domUtils.getNextDomNode(tmpNode, false, filterFn); + _$jscoverage['plugins/list.js'][1148]++; + var li = range.document.createElement("li"); + _$jscoverage['plugins/list.js'][1150]++; + li.appendChild(tmpRange.extractContents()); + _$jscoverage['plugins/list.js'][1151]++; + if (domUtils.isEmptyNode(li)) { + _$jscoverage['plugins/list.js'][1152]++; + var tmpNode = range.document.createElement("p"); + _$jscoverage['plugins/list.js'][1153]++; + while (li.firstChild) { + _$jscoverage['plugins/list.js'][1154]++; + tmpNode.appendChild(li.firstChild); +} + _$jscoverage['plugins/list.js'][1156]++; + li.appendChild(tmpNode); + } + _$jscoverage['plugins/list.js'][1158]++; + frag.appendChild(li); + } + else { + _$jscoverage['plugins/list.js'][1160]++; + current = domUtils.getNextDomNode(current, true, filterFn); + } +} + _$jscoverage['plugins/list.js'][1163]++; + range.moveToBookmark(bk).collapse(true); + _$jscoverage['plugins/list.js'][1164]++; + list = me.document.createElement(tag); + _$jscoverage['plugins/list.js'][1165]++; + setListStyle(list, style); + _$jscoverage['plugins/list.js'][1166]++; + list.appendChild(frag); + _$jscoverage['plugins/list.js'][1167]++; + range.insertNode(list); + _$jscoverage['plugins/list.js'][1169]++; + adjustList(list, tag, style); + _$jscoverage['plugins/list.js'][1171]++; + for (var i = 0, ci = ci, tmpDivs = domUtils.getElementsByTagName(list, "div"); (ci = tmpDivs[(i++)]);) { + _$jscoverage['plugins/list.js'][1172]++; + if (ci.getAttribute("tmpDiv")) { + _$jscoverage['plugins/list.js'][1173]++; + domUtils.remove(ci, true); + } +} + _$jscoverage['plugins/list.js'][1176]++; + range.moveToBookmark(bko).select(); +}), queryCommandState: (function (command) { + _$jscoverage['plugins/list.js'][1180]++; + var tag = ((command.toLowerCase() == "insertorderedlist")? "ol": "ul"); + _$jscoverage['plugins/list.js'][1181]++; + var path = this.selection.getStartElementPath(); + _$jscoverage['plugins/list.js'][1182]++; + for (var i = 0, ci; (ci = path[(i++)]);) { + _$jscoverage['plugins/list.js'][1183]++; + if ((ci.nodeName == "TABLE")) { + _$jscoverage['plugins/list.js'][1184]++; + return 0; + } + _$jscoverage['plugins/list.js'][1186]++; + if ((tag == ci.nodeName.toLowerCase())) { + _$jscoverage['plugins/list.js'][1187]++; + return 1; + } + _$jscoverage['plugins/list.js'][1188]++; + ; +} + _$jscoverage['plugins/list.js'][1190]++; + return 0; +}), queryCommandValue: (function (command) { + _$jscoverage['plugins/list.js'][1194]++; + var tag = ((command.toLowerCase() == "insertorderedlist")? "ol": "ul"); + _$jscoverage['plugins/list.js'][1195]++; + var path = this.selection.getStartElementPath(), node; + _$jscoverage['plugins/list.js'][1197]++; + for (var i = 0, ci; (ci = path[(i++)]);) { + _$jscoverage['plugins/list.js'][1198]++; + if ((ci.nodeName == "TABLE")) { + _$jscoverage['plugins/list.js'][1199]++; + node = null; + _$jscoverage['plugins/list.js'][1200]++; + break; + } + _$jscoverage['plugins/list.js'][1202]++; + if ((tag == ci.nodeName.toLowerCase())) { + _$jscoverage['plugins/list.js'][1203]++; + node = ci; + _$jscoverage['plugins/list.js'][1204]++; + break; + } + _$jscoverage['plugins/list.js'][1205]++; + ; +} + _$jscoverage['plugins/list.js'][1207]++; + return (node? (getStyle(node) || domUtils.getComputedStyle(node, "list-style-type")): null); +})}); +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/music.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/music.js new file mode 100644 index 000000000..ee7d4efc9 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/music.js @@ -0,0 +1,135 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/music.js']) { + _$jscoverage['plugins/music.js'] = []; + _$jscoverage['plugins/music.js'][24] = 0; + _$jscoverage['plugins/music.js'][25] = 0; + _$jscoverage['plugins/music.js'][37] = 0; + _$jscoverage['plugins/music.js'][38] = 0; + _$jscoverage['plugins/music.js'][50] = 0; + _$jscoverage['plugins/music.js'][51] = 0; + _$jscoverage['plugins/music.js'][53] = 0; + _$jscoverage['plugins/music.js'][54] = 0; + _$jscoverage['plugins/music.js'][55] = 0; + _$jscoverage['plugins/music.js'][57] = 0; + _$jscoverage['plugins/music.js'][59] = 0; + _$jscoverage['plugins/music.js'][60] = 0; + _$jscoverage['plugins/music.js'][61] = 0; + _$jscoverage['plugins/music.js'][62] = 0; + _$jscoverage['plugins/music.js'][66] = 0; + _$jscoverage['plugins/music.js'][67] = 0; + _$jscoverage['plugins/music.js'][69] = 0; + _$jscoverage['plugins/music.js'][70] = 0; + _$jscoverage['plugins/music.js'][72] = 0; + _$jscoverage['plugins/music.js'][73] = 0; + _$jscoverage['plugins/music.js'][74] = 0; + _$jscoverage['plugins/music.js'][76] = 0; + _$jscoverage['plugins/music.js'][79] = 0; + _$jscoverage['plugins/music.js'][81] = 0; + _$jscoverage['plugins/music.js'][83] = 0; + _$jscoverage['plugins/music.js'][86] = 0; + _$jscoverage['plugins/music.js'][89] = 0; +} +_$jscoverage['plugins/music.js'].source = ["/**"," * 插入音乐命令"," * @file"," */","","/**"," * 在当前光标处插入音乐"," * @command music"," * @method execCommand"," * @param { KeyValueMap } musicOptions 插入音乐的参数项, 支持的key有: url=>音乐地址;"," * width=>音乐容器宽度;height=>音乐容器高度;align=>音乐文件的对齐方式, 可选值有: left, center, right, none"," * @example"," * ```javascript"," * //editor是编辑器实例"," * //在编辑器里插入一个“植物大战僵尸”的APP"," * editor.execCommand( 'music' , {"," * width: 400,"," * height: 95,"," * align: \"center\","," * url: \"音乐地址\""," * } );"," * ```"," */","UE.plugins['music'] = function () {"," var me = this,"," div;",""," /*"," * 创建插入音乐字符串"," * @param url 音乐地址"," * @param width 音乐宽度"," * @param height 音乐高度"," * @param align 对齐"," * @param toEmbed 是否以flash代替显示"," * @param addParagraph 是否需要添加P标签"," */"," function creatInsertStr(url,width,height,align,toEmbed,addParagraph){"," return !toEmbed ?"," (addParagraph? ('<p '+ (align !=\"none\" ? ( align == \"center\"? ' style=\"text-align:center;\" ':' style=\"float:\"'+ align ) : '') + '>'): '') +"," '<img align=\"'+align+'\" width=\"'+ width +'\" height=\"' + height + '\" _url=\"'+url+'\" class=\"edui-faked-music\"' +"," ' src=\"'+me.options.langPath+me.options.lang+'/images/music.png\" />' +"," (addParagraph?'</p>':'')"," :"," '<embed type=\"application/x-shockwave-flash\" class=\"edui-faked-music\" pluginspage=\"http://www.macromedia.com/go/getflashplayer\"' +"," ' src=\"' + url + '\" width=\"' + width + '\" height=\"' + height + '\" align=\"' + align + '\"' +"," ( align !=\"none\" ? ' style= \"'+ ( align == \"center\"? \"display:block;\":\" float: \"+ align ) + '\"' :'' ) +"," ' wmode=\"transparent\" play=\"true\" loop=\"false\" menu=\"false\" allowscriptaccess=\"never\" allowfullscreen=\"true\" >';"," }",""," function switchImgAndEmbed(img2embed) {"," var tmpdiv,"," nodes = domUtils.getElementsByTagName(me.document, !img2embed ? \"embed\" : \"img\");"," for (var i = 0, node; node = nodes[i++];) {"," if (node.className != \"edui-faked-music\") {"," continue;"," }"," tmpdiv = me.document.createElement(\"div\");"," //先看float在看align,浮动有的是时候是在float上定义的"," var align = domUtils.getComputedStyle(node,'float');"," align = align == 'none' ? (node.getAttribute('align') || '') : align;"," tmpdiv.innerHTML = creatInsertStr(img2embed ? node.getAttribute(\"_url\") : node.getAttribute(\"src\"), node.width, node.height, align, img2embed);"," node.parentNode.replaceChild(tmpdiv.firstChild, node);"," }"," }",""," me.addListener(\"beforegetcontent\", function () {"," switchImgAndEmbed(true);"," });"," me.addListener('aftersetcontent', function () {"," switchImgAndEmbed(false);"," });"," me.addListener('aftergetcontent', function (cmdName) {"," if (cmdName == 'aftergetcontent' && me.queryCommandState('source')) {"," return;"," }"," switchImgAndEmbed(false);"," });",""," me.commands[\"music\"] = {"," execCommand:function (cmd, musicObj) {"," var me = this,"," str = creatInsertStr(musicObj.url, musicObj.width || 400, musicObj.height || 95, \"none\", false, true);"," 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;"," }"," };","};"]; +_$jscoverage['plugins/music.js'][24]++; +UE.plugins.music = (function () { + _$jscoverage['plugins/music.js'][25]++; + var me = this, div; + _$jscoverage['plugins/music.js'][37]++; + function creatInsertStr(url, width, height, align, toEmbed, addParagraph) { + _$jscoverage['plugins/music.js'][38]++; + return ((! toEmbed)? ((addParagraph? ("

    "): "") + "" + (addParagraph? "

    ": "")): ("")); +} + _$jscoverage['plugins/music.js'][50]++; + function switchImgAndEmbed(img2embed) { + _$jscoverage['plugins/music.js'][51]++; + var tmpdiv, nodes = domUtils.getElementsByTagName(me.document, ((! img2embed)? "embed": "img")); + _$jscoverage['plugins/music.js'][53]++; + for (var i = 0, node; (node = nodes[(i++)]);) { + _$jscoverage['plugins/music.js'][54]++; + if ((node.className != "edui-faked-music")) { + _$jscoverage['plugins/music.js'][55]++; + continue; + } + _$jscoverage['plugins/music.js'][57]++; + tmpdiv = me.document.createElement("div"); + _$jscoverage['plugins/music.js'][59]++; + var align = domUtils.getComputedStyle(node, "float"); + _$jscoverage['plugins/music.js'][60]++; + align = ((align == "none")? (node.getAttribute("align") || ""): align); + _$jscoverage['plugins/music.js'][61]++; + tmpdiv.innerHTML = creatInsertStr((img2embed? node.getAttribute("_url"): node.getAttribute("src")), node.width, node.height, align, img2embed); + _$jscoverage['plugins/music.js'][62]++; + node.parentNode.replaceChild(tmpdiv.firstChild, node); +} +} + _$jscoverage['plugins/music.js'][66]++; + me.addListener("beforegetcontent", (function () { + _$jscoverage['plugins/music.js'][67]++; + switchImgAndEmbed(true); +})); + _$jscoverage['plugins/music.js'][69]++; + me.addListener("aftersetcontent", (function () { + _$jscoverage['plugins/music.js'][70]++; + switchImgAndEmbed(false); +})); + _$jscoverage['plugins/music.js'][72]++; + me.addListener("aftergetcontent", (function (cmdName) { + _$jscoverage['plugins/music.js'][73]++; + if (((cmdName == "aftergetcontent") && me.queryCommandState("source"))) { + _$jscoverage['plugins/music.js'][74]++; + return; + } + _$jscoverage['plugins/music.js'][76]++; + switchImgAndEmbed(false); +})); + _$jscoverage['plugins/music.js'][79]++; + me.commands.music = {execCommand: (function (cmd, musicObj) { + _$jscoverage['plugins/music.js'][81]++; + var me = this, str = creatInsertStr(musicObj.url, (musicObj.width || 400), (musicObj.height || 95), "none", false, true); + _$jscoverage['plugins/music.js'][83]++; + me.execCommand("inserthtml", str); +}), queryCommandState: (function () { + _$jscoverage['plugins/music.js'][86]++; + var me = this, img = me.selection.getRange().getClosedNode(), flag = (img && (img.className == "edui-faked-music")); + _$jscoverage['plugins/music.js'][89]++; + return (flag? 1: 0); +})}; +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/pagebreak.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/pagebreak.js new file mode 100644 index 000000000..33d635338 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/pagebreak.js @@ -0,0 +1,303 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/pagebreak.js']) { + _$jscoverage['plugins/pagebreak.js'] = []; + _$jscoverage['plugins/pagebreak.js'][7] = 0; + _$jscoverage['plugins/pagebreak.js'][8] = 0; + _$jscoverage['plugins/pagebreak.js'][10] = 0; + _$jscoverage['plugins/pagebreak.js'][12] = 0; + _$jscoverage['plugins/pagebreak.js'][13] = 0; + _$jscoverage['plugins/pagebreak.js'][14] = 0; + _$jscoverage['plugins/pagebreak.js'][16] = 0; + _$jscoverage['plugins/pagebreak.js'][17] = 0; + _$jscoverage['plugins/pagebreak.js'][18] = 0; + _$jscoverage['plugins/pagebreak.js'][20] = 0; + _$jscoverage['plugins/pagebreak.js'][21] = 0; + _$jscoverage['plugins/pagebreak.js'][26] = 0; + _$jscoverage['plugins/pagebreak.js'][27] = 0; + _$jscoverage['plugins/pagebreak.js'][29] = 0; + _$jscoverage['plugins/pagebreak.js'][30] = 0; + _$jscoverage['plugins/pagebreak.js'][32] = 0; + _$jscoverage['plugins/pagebreak.js'][33] = 0; + _$jscoverage['plugins/pagebreak.js'][34] = 0; + _$jscoverage['plugins/pagebreak.js'][35] = 0; + _$jscoverage['plugins/pagebreak.js'][36] = 0; + _$jscoverage['plugins/pagebreak.js'][37] = 0; + _$jscoverage['plugins/pagebreak.js'][41] = 0; + _$jscoverage['plugins/pagebreak.js'][42] = 0; + _$jscoverage['plugins/pagebreak.js'][43] = 0; + _$jscoverage['plugins/pagebreak.js'][44] = 0; + _$jscoverage['plugins/pagebreak.js'][45] = 0; + _$jscoverage['plugins/pagebreak.js'][46] = 0; + _$jscoverage['plugins/pagebreak.js'][62] = 0; + _$jscoverage['plugins/pagebreak.js'][64] = 0; + _$jscoverage['plugins/pagebreak.js'][65] = 0; + _$jscoverage['plugins/pagebreak.js'][70] = 0; + _$jscoverage['plugins/pagebreak.js'][72] = 0; + _$jscoverage['plugins/pagebreak.js'][75] = 0; + _$jscoverage['plugins/pagebreak.js'][76] = 0; + _$jscoverage['plugins/pagebreak.js'][78] = 0; + _$jscoverage['plugins/pagebreak.js'][79] = 0; + _$jscoverage['plugins/pagebreak.js'][80] = 0; + _$jscoverage['plugins/pagebreak.js'][88] = 0; + _$jscoverage['plugins/pagebreak.js'][89] = 0; + _$jscoverage['plugins/pagebreak.js'][92] = 0; + _$jscoverage['plugins/pagebreak.js'][93] = 0; + _$jscoverage['plugins/pagebreak.js'][96] = 0; + _$jscoverage['plugins/pagebreak.js'][97] = 0; + _$jscoverage['plugins/pagebreak.js'][98] = 0; + _$jscoverage['plugins/pagebreak.js'][102] = 0; + _$jscoverage['plugins/pagebreak.js'][107] = 0; + _$jscoverage['plugins/pagebreak.js'][108] = 0; + _$jscoverage['plugins/pagebreak.js'][109] = 0; + _$jscoverage['plugins/pagebreak.js'][110] = 0; + _$jscoverage['plugins/pagebreak.js'][111] = 0; + _$jscoverage['plugins/pagebreak.js'][112] = 0; + _$jscoverage['plugins/pagebreak.js'][113] = 0; + _$jscoverage['plugins/pagebreak.js'][117] = 0; + _$jscoverage['plugins/pagebreak.js'][119] = 0; + _$jscoverage['plugins/pagebreak.js'][120] = 0; + _$jscoverage['plugins/pagebreak.js'][121] = 0; + _$jscoverage['plugins/pagebreak.js'][122] = 0; + _$jscoverage['plugins/pagebreak.js'][123] = 0; + _$jscoverage['plugins/pagebreak.js'][124] = 0; + _$jscoverage['plugins/pagebreak.js'][126] = 0; + _$jscoverage['plugins/pagebreak.js'][128] = 0; + _$jscoverage['plugins/pagebreak.js'][129] = 0; + _$jscoverage['plugins/pagebreak.js'][130] = 0; + _$jscoverage['plugins/pagebreak.js'][131] = 0; + _$jscoverage['plugins/pagebreak.js'][133] = 0; + _$jscoverage['plugins/pagebreak.js'][136] = 0; + _$jscoverage['plugins/pagebreak.js'][137] = 0; + _$jscoverage['plugins/pagebreak.js'][139] = 0; + _$jscoverage['plugins/pagebreak.js'][140] = 0; + _$jscoverage['plugins/pagebreak.js'][141] = 0; + _$jscoverage['plugins/pagebreak.js'][143] = 0; + _$jscoverage['plugins/pagebreak.js'][144] = 0; + _$jscoverage['plugins/pagebreak.js'][146] = 0; + _$jscoverage['plugins/pagebreak.js'][148] = 0; + _$jscoverage['plugins/pagebreak.js'][151] = 0; +} +_$jscoverage['plugins/pagebreak.js'].source = ["/**"," * 分页功能插件"," * @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('<hr class=\"pagebreak\" noshade=\"noshade\" size=\"5\" style=\"-webkit-user-select: none;\">');"," 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 命令字符串"," * @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);",""," }",""," }"," };","};"]; +_$jscoverage['plugins/pagebreak.js'][7]++; +UE.plugins.pagebreak = (function () { + _$jscoverage['plugins/pagebreak.js'][8]++; + var me = this, notBreakTags = ["td"]; + _$jscoverage['plugins/pagebreak.js'][10]++; + me.setOpt("pageBreakTag", "_ueditor_page_break_tag_"); + _$jscoverage['plugins/pagebreak.js'][12]++; + function fillNode(node) { + _$jscoverage['plugins/pagebreak.js'][13]++; + if (domUtils.isEmptyBlock(node)) { + _$jscoverage['plugins/pagebreak.js'][14]++; + var firstChild = node.firstChild, tmpNode; + _$jscoverage['plugins/pagebreak.js'][16]++; + while ((firstChild && (firstChild.nodeType == 1) && domUtils.isEmptyBlock(firstChild))) { + _$jscoverage['plugins/pagebreak.js'][17]++; + tmpNode = firstChild; + _$jscoverage['plugins/pagebreak.js'][18]++; + firstChild = firstChild.firstChild; +} + _$jscoverage['plugins/pagebreak.js'][20]++; + ((! tmpNode) && (tmpNode = node)); + _$jscoverage['plugins/pagebreak.js'][21]++; + domUtils.fillNode(me.document, tmpNode); + } +} + _$jscoverage['plugins/pagebreak.js'][26]++; + me.ready((function () { + _$jscoverage['plugins/pagebreak.js'][27]++; + utils.cssRule("pagebreak", ".pagebreak{display:block;clear:both !important;cursor:default !important;width: 100% !important;margin:0;}", me.document); +})); + _$jscoverage['plugins/pagebreak.js'][29]++; + function isHr(node) { + _$jscoverage['plugins/pagebreak.js'][30]++; + return (node && (node.nodeType == 1) && (node.tagName == "HR") && (node.className == "pagebreak")); +} + _$jscoverage['plugins/pagebreak.js'][32]++; + me.addInputRule((function (root) { + _$jscoverage['plugins/pagebreak.js'][33]++; + root.traversal((function (node) { + _$jscoverage['plugins/pagebreak.js'][34]++; + if (((node.type == "text") && (node.data == me.options.pageBreakTag))) { + _$jscoverage['plugins/pagebreak.js'][35]++; + var hr = UE.uNode.createElement("
    "); + _$jscoverage['plugins/pagebreak.js'][36]++; + node.parentNode.insertBefore(hr, node); + _$jscoverage['plugins/pagebreak.js'][37]++; + node.parentNode.removeChild(node); + } +})); +})); + _$jscoverage['plugins/pagebreak.js'][41]++; + me.addOutputRule((function (node) { + _$jscoverage['plugins/pagebreak.js'][42]++; + utils.each(node.getNodesByTagName("hr"), (function (n) { + _$jscoverage['plugins/pagebreak.js'][43]++; + if ((n.getAttr("class") == "pagebreak")) { + _$jscoverage['plugins/pagebreak.js'][44]++; + var txt = UE.uNode.createText(me.options.pageBreakTag); + _$jscoverage['plugins/pagebreak.js'][45]++; + n.parentNode.insertBefore(txt, n); + _$jscoverage['plugins/pagebreak.js'][46]++; + n.parentNode.removeChild(n); + } +})); +})); + _$jscoverage['plugins/pagebreak.js'][62]++; + me.commands.pagebreak = {execCommand: (function () { + _$jscoverage['plugins/pagebreak.js'][64]++; + var range = me.selection.getRange(), hr = me.document.createElement("hr"); + _$jscoverage['plugins/pagebreak.js'][65]++; + domUtils.setAttributes(hr, {"class": "pagebreak", noshade: "noshade", size: "5"}); + _$jscoverage['plugins/pagebreak.js'][70]++; + domUtils.unSelectable(hr); + _$jscoverage['plugins/pagebreak.js'][72]++; + var node = domUtils.findParentByTagName(range.startContainer, notBreakTags, true), parents = [], pN; + _$jscoverage['plugins/pagebreak.js'][75]++; + if (node) { + _$jscoverage['plugins/pagebreak.js'][76]++; + switch (node.tagName) { + case "TD": + _$jscoverage['plugins/pagebreak.js'][78]++; + pN = node.parentNode; + _$jscoverage['plugins/pagebreak.js'][79]++; + if ((! pN.previousSibling)) { + _$jscoverage['plugins/pagebreak.js'][80]++; + var table = domUtils.findParentByTagName(pN, "table"); + _$jscoverage['plugins/pagebreak.js'][88]++; + table.parentNode.insertBefore(hr, table); + _$jscoverage['plugins/pagebreak.js'][89]++; + parents = domUtils.findParents(hr, true); + } + else { + _$jscoverage['plugins/pagebreak.js'][92]++; + pN.parentNode.insertBefore(hr, pN); + _$jscoverage['plugins/pagebreak.js'][93]++; + parents = domUtils.findParents(hr); + } + _$jscoverage['plugins/pagebreak.js'][96]++; + pN = parents[1]; + _$jscoverage['plugins/pagebreak.js'][97]++; + if ((hr !== pN)) { + _$jscoverage['plugins/pagebreak.js'][98]++; + domUtils.breakParent(hr, pN); + } + _$jscoverage['plugins/pagebreak.js'][102]++; + me.fireEvent("afteradjusttable", me.document); + } + } + else { + _$jscoverage['plugins/pagebreak.js'][107]++; + if ((! range.collapsed)) { + _$jscoverage['plugins/pagebreak.js'][108]++; + range.deleteContents(); + _$jscoverage['plugins/pagebreak.js'][109]++; + var start = range.startContainer; + _$jscoverage['plugins/pagebreak.js'][110]++; + while (((! domUtils.isBody(start)) && domUtils.isBlockElm(start) && domUtils.isEmptyNode(start))) { + _$jscoverage['plugins/pagebreak.js'][111]++; + range.setStartBefore(start).collapse(true); + _$jscoverage['plugins/pagebreak.js'][112]++; + domUtils.remove(start); + _$jscoverage['plugins/pagebreak.js'][113]++; + start = range.startContainer; +} + } + _$jscoverage['plugins/pagebreak.js'][117]++; + range.insertNode(hr); + _$jscoverage['plugins/pagebreak.js'][119]++; + var pN = hr.parentNode, nextNode; + _$jscoverage['plugins/pagebreak.js'][120]++; + while ((! domUtils.isBody(pN))) { + _$jscoverage['plugins/pagebreak.js'][121]++; + domUtils.breakParent(hr, pN); + _$jscoverage['plugins/pagebreak.js'][122]++; + nextNode = hr.nextSibling; + _$jscoverage['plugins/pagebreak.js'][123]++; + if ((nextNode && domUtils.isEmptyBlock(nextNode))) { + _$jscoverage['plugins/pagebreak.js'][124]++; + domUtils.remove(nextNode); + } + _$jscoverage['plugins/pagebreak.js'][126]++; + pN = hr.parentNode; +} + _$jscoverage['plugins/pagebreak.js'][128]++; + nextNode = hr.nextSibling; + _$jscoverage['plugins/pagebreak.js'][129]++; + var pre = hr.previousSibling; + _$jscoverage['plugins/pagebreak.js'][130]++; + if (isHr(pre)) { + _$jscoverage['plugins/pagebreak.js'][131]++; + domUtils.remove(pre); + } + else { + _$jscoverage['plugins/pagebreak.js'][133]++; + (pre && fillNode(pre)); + } + _$jscoverage['plugins/pagebreak.js'][136]++; + if ((! nextNode)) { + _$jscoverage['plugins/pagebreak.js'][137]++; + var p = me.document.createElement("p"); + _$jscoverage['plugins/pagebreak.js'][139]++; + hr.parentNode.appendChild(p); + _$jscoverage['plugins/pagebreak.js'][140]++; + domUtils.fillNode(me.document, p); + _$jscoverage['plugins/pagebreak.js'][141]++; + range.setStart(p, 0).collapse(true); + } + else { + _$jscoverage['plugins/pagebreak.js'][143]++; + if (isHr(nextNode)) { + _$jscoverage['plugins/pagebreak.js'][144]++; + domUtils.remove(nextNode); + } + else { + _$jscoverage['plugins/pagebreak.js'][146]++; + fillNode(nextNode); + } + _$jscoverage['plugins/pagebreak.js'][148]++; + range.setEndAfter(hr).collapse(false); + } + _$jscoverage['plugins/pagebreak.js'][151]++; + range.select(true); + } +})}; +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/paragraph.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/paragraph.js new file mode 100644 index 000000000..33ceb78b6 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/paragraph.js @@ -0,0 +1,290 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/paragraph.js']) { + _$jscoverage['plugins/paragraph.js'] = []; + _$jscoverage['plugins/paragraph.js'][47] = 0; + _$jscoverage['plugins/paragraph.js'][48] = 0; + _$jscoverage['plugins/paragraph.js'][53] = 0; + _$jscoverage['plugins/paragraph.js'][55] = 0; + _$jscoverage['plugins/paragraph.js'][59] = 0; + _$jscoverage['plugins/paragraph.js'][60] = 0; + _$jscoverage['plugins/paragraph.js'][64] = 0; + _$jscoverage['plugins/paragraph.js'][65] = 0; + _$jscoverage['plugins/paragraph.js'][66] = 0; + _$jscoverage['plugins/paragraph.js'][67] = 0; + _$jscoverage['plugins/paragraph.js'][68] = 0; + _$jscoverage['plugins/paragraph.js'][69] = 0; + _$jscoverage['plugins/paragraph.js'][70] = 0; + _$jscoverage['plugins/paragraph.js'][73] = 0; + _$jscoverage['plugins/paragraph.js'][75] = 0; + _$jscoverage['plugins/paragraph.js'][76] = 0; + _$jscoverage['plugins/paragraph.js'][77] = 0; + _$jscoverage['plugins/paragraph.js'][78] = 0; + _$jscoverage['plugins/paragraph.js'][79] = 0; + _$jscoverage['plugins/paragraph.js'][82] = 0; + _$jscoverage['plugins/paragraph.js'][84] = 0; + _$jscoverage['plugins/paragraph.js'][85] = 0; + _$jscoverage['plugins/paragraph.js'][89] = 0; + _$jscoverage['plugins/paragraph.js'][91] = 0; + _$jscoverage['plugins/paragraph.js'][93] = 0; + _$jscoverage['plugins/paragraph.js'][95] = 0; + _$jscoverage['plugins/paragraph.js'][96] = 0; + _$jscoverage['plugins/paragraph.js'][98] = 0; + _$jscoverage['plugins/paragraph.js'][100] = 0; + _$jscoverage['plugins/paragraph.js'][101] = 0; + _$jscoverage['plugins/paragraph.js'][102] = 0; + _$jscoverage['plugins/paragraph.js'][106] = 0; + _$jscoverage['plugins/paragraph.js'][107] = 0; + _$jscoverage['plugins/paragraph.js'][108] = 0; + _$jscoverage['plugins/paragraph.js'][109] = 0; + _$jscoverage['plugins/paragraph.js'][111] = 0; + _$jscoverage['plugins/paragraph.js'][112] = 0; + _$jscoverage['plugins/paragraph.js'][114] = 0; + _$jscoverage['plugins/paragraph.js'][118] = 0; + _$jscoverage['plugins/paragraph.js'][119] = 0; + _$jscoverage['plugins/paragraph.js'][121] = 0; + _$jscoverage['plugins/paragraph.js'][125] = 0; + _$jscoverage['plugins/paragraph.js'][127] = 0; + _$jscoverage['plugins/paragraph.js'][130] = 0; + _$jscoverage['plugins/paragraph.js'][132] = 0; + _$jscoverage['plugins/paragraph.js'][133] = 0; + _$jscoverage['plugins/paragraph.js'][135] = 0; + _$jscoverage['plugins/paragraph.js'][137] = 0; + _$jscoverage['plugins/paragraph.js'][138] = 0; + _$jscoverage['plugins/paragraph.js'][139] = 0; + _$jscoverage['plugins/paragraph.js'][141] = 0; + _$jscoverage['plugins/paragraph.js'][142] = 0; + _$jscoverage['plugins/paragraph.js'][143] = 0; + _$jscoverage['plugins/paragraph.js'][144] = 0; + _$jscoverage['plugins/paragraph.js'][146] = 0; + _$jscoverage['plugins/paragraph.js'][147] = 0; + _$jscoverage['plugins/paragraph.js'][148] = 0; + _$jscoverage['plugins/paragraph.js'][153] = 0; + _$jscoverage['plugins/paragraph.js'][154] = 0; + _$jscoverage['plugins/paragraph.js'][155] = 0; + _$jscoverage['plugins/paragraph.js'][156] = 0; + _$jscoverage['plugins/paragraph.js'][158] = 0; + _$jscoverage['plugins/paragraph.js'][160] = 0; + _$jscoverage['plugins/paragraph.js'][161] = 0; + _$jscoverage['plugins/paragraph.js'][166] = 0; + _$jscoverage['plugins/paragraph.js'][167] = 0; + _$jscoverage['plugins/paragraph.js'][168] = 0; + _$jscoverage['plugins/paragraph.js'][169] = 0; + _$jscoverage['plugins/paragraph.js'][173] = 0; + _$jscoverage['plugins/paragraph.js'][176] = 0; + _$jscoverage['plugins/paragraph.js'][179] = 0; + _$jscoverage['plugins/paragraph.js'][180] = 0; +} +_$jscoverage['plugins/paragraph.js'].source = ["/**"," * 段落样式"," * @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','{"," * color:'#000'"," * }' );"," * ```"," */","/**"," * 对选区内文本添加相应标签嵌套"," * @command Paragraph"," * @method execCommand"," * @param { String } cmd 命令字符串"," * @param {String} style 标签值为:'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'"," * @param {Object} attrs 标签的属性"," * @param {String} sourceCmdName 对与customstyle特殊处理"," * @example"," * ```javascript"," * editor.execCommand( 'Paragraph','h1','{"," * color:'#000'"," * }' );"," * ```"," */","/**"," * 返回选区内节点标签名"," * @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() : '';"," }"," };","};"]; +_$jscoverage['plugins/paragraph.js'][47]++; +UE.plugins.paragraph = (function () { + _$jscoverage['plugins/paragraph.js'][48]++; + var me = this, block = domUtils.isBlockElm, notExchange = ["TD", "LI", "PRE"], doParagraph = (function (range, style, attrs, sourceCmdName) { + _$jscoverage['plugins/paragraph.js'][53]++; + var bookmark = range.createBookmark(), filterFn = (function (node) { + _$jscoverage['plugins/paragraph.js'][55]++; + return ((node.nodeType == 1)? ((node.tagName.toLowerCase() != "br") && (! domUtils.isBookmarkNode(node))): (! domUtils.isWhitespace(node))); +}), para; + _$jscoverage['plugins/paragraph.js'][59]++; + range.enlarge(true); + _$jscoverage['plugins/paragraph.js'][60]++; + var bookmark2 = range.createBookmark(), current = domUtils.getNextDomNode(bookmark2.start, false, filterFn), tmpRange = range.cloneRange(), tmpNode; + _$jscoverage['plugins/paragraph.js'][64]++; + while ((current && (! (domUtils.getPosition(current, bookmark2.end) & domUtils.POSITION_FOLLOWING)))) { + _$jscoverage['plugins/paragraph.js'][65]++; + if (((current.nodeType == 3) || (! block(current)))) { + _$jscoverage['plugins/paragraph.js'][66]++; + tmpRange.setStartBefore(current); + _$jscoverage['plugins/paragraph.js'][67]++; + while ((current && (current !== bookmark2.end) && (! block(current)))) { + _$jscoverage['plugins/paragraph.js'][68]++; + tmpNode = current; + _$jscoverage['plugins/paragraph.js'][69]++; + current = domUtils.getNextDomNode(current, false, null, (function (node) { + _$jscoverage['plugins/paragraph.js'][70]++; + return (! block(node)); +})); +} + _$jscoverage['plugins/paragraph.js'][73]++; + tmpRange.setEndAfter(tmpNode); + _$jscoverage['plugins/paragraph.js'][75]++; + para = range.document.createElement(style); + _$jscoverage['plugins/paragraph.js'][76]++; + if (attrs) { + _$jscoverage['plugins/paragraph.js'][77]++; + domUtils.setAttributes(para, attrs); + _$jscoverage['plugins/paragraph.js'][78]++; + if ((sourceCmdName && (sourceCmdName == "customstyle") && attrs.style)) { + _$jscoverage['plugins/paragraph.js'][79]++; + para.style.cssText = attrs.style; + } + } + _$jscoverage['plugins/paragraph.js'][82]++; + para.appendChild(tmpRange.extractContents()); + _$jscoverage['plugins/paragraph.js'][84]++; + if (domUtils.isEmptyNode(para)) { + _$jscoverage['plugins/paragraph.js'][85]++; + domUtils.fillChar(range.document, para); + } + _$jscoverage['plugins/paragraph.js'][89]++; + tmpRange.insertNode(para); + _$jscoverage['plugins/paragraph.js'][91]++; + var parent = para.parentNode; + _$jscoverage['plugins/paragraph.js'][93]++; + if ((block(parent) && (! domUtils.isBody(para.parentNode)) && (utils.indexOf(notExchange, parent.tagName) == -1))) { + _$jscoverage['plugins/paragraph.js'][95]++; + if ((! (sourceCmdName && (sourceCmdName == "customstyle")))) { + _$jscoverage['plugins/paragraph.js'][96]++; + (parent.getAttribute("dir") && para.setAttribute("dir", parent.getAttribute("dir"))); + _$jscoverage['plugins/paragraph.js'][98]++; + (parent.style.cssText && (para.style.cssText = (parent.style.cssText + ";" + para.style.cssText))); + _$jscoverage['plugins/paragraph.js'][100]++; + (parent.style.textAlign && (! para.style.textAlign) && (para.style.textAlign = parent.style.textAlign)); + _$jscoverage['plugins/paragraph.js'][101]++; + (parent.style.textIndent && (! para.style.textIndent) && (para.style.textIndent = parent.style.textIndent)); + _$jscoverage['plugins/paragraph.js'][102]++; + (parent.style.padding && (! para.style.padding) && (para.style.padding = parent.style.padding)); + } + _$jscoverage['plugins/paragraph.js'][106]++; + if ((attrs && /h\d/i.test(parent.tagName) && (! /h\d/i.test(para.tagName)))) { + _$jscoverage['plugins/paragraph.js'][107]++; + domUtils.setAttributes(parent, attrs); + _$jscoverage['plugins/paragraph.js'][108]++; + if ((sourceCmdName && (sourceCmdName == "customstyle") && attrs.style)) { + _$jscoverage['plugins/paragraph.js'][109]++; + parent.style.cssText = attrs.style; + } + _$jscoverage['plugins/paragraph.js'][111]++; + domUtils.remove(para, true); + _$jscoverage['plugins/paragraph.js'][112]++; + para = parent; + } + else { + _$jscoverage['plugins/paragraph.js'][114]++; + domUtils.remove(para.parentNode, true); + } + } + _$jscoverage['plugins/paragraph.js'][118]++; + if ((utils.indexOf(notExchange, parent.tagName) != -1)) { + _$jscoverage['plugins/paragraph.js'][119]++; + current = parent; + } + else { + _$jscoverage['plugins/paragraph.js'][121]++; + current = para; + } + _$jscoverage['plugins/paragraph.js'][125]++; + current = domUtils.getNextDomNode(current, false, filterFn); + } + else { + _$jscoverage['plugins/paragraph.js'][127]++; + current = domUtils.getNextDomNode(current, true, filterFn); + } +} + _$jscoverage['plugins/paragraph.js'][130]++; + return range.moveToBookmark(bookmark2).moveToBookmark(bookmark); +}); + _$jscoverage['plugins/paragraph.js'][132]++; + me.setOpt("paragraph", {"p": "", "h1": "", "h2": "", "h3": "", "h4": "", "h5": "", "h6": ""}); + _$jscoverage['plugins/paragraph.js'][133]++; + me.commands.paragraph = {execCommand: (function (cmdName, style, attrs, sourceCmdName) { + _$jscoverage['plugins/paragraph.js'][135]++; + var range = this.selection.getRange(); + _$jscoverage['plugins/paragraph.js'][137]++; + if (range.collapsed) { + _$jscoverage['plugins/paragraph.js'][138]++; + var txt = this.document.createTextNode("p"); + _$jscoverage['plugins/paragraph.js'][139]++; + range.insertNode(txt); + _$jscoverage['plugins/paragraph.js'][141]++; + if (browser.ie) { + _$jscoverage['plugins/paragraph.js'][142]++; + var node = txt.previousSibling; + _$jscoverage['plugins/paragraph.js'][143]++; + if ((node && domUtils.isWhitespace(node))) { + _$jscoverage['plugins/paragraph.js'][144]++; + domUtils.remove(node); + } + _$jscoverage['plugins/paragraph.js'][146]++; + node = txt.nextSibling; + _$jscoverage['plugins/paragraph.js'][147]++; + if ((node && domUtils.isWhitespace(node))) { + _$jscoverage['plugins/paragraph.js'][148]++; + domUtils.remove(node); + } + } + } + _$jscoverage['plugins/paragraph.js'][153]++; + range = doParagraph(range, style, attrs, sourceCmdName); + _$jscoverage['plugins/paragraph.js'][154]++; + if (txt) { + _$jscoverage['plugins/paragraph.js'][155]++; + range.setStartBefore(txt).collapse(true); + _$jscoverage['plugins/paragraph.js'][156]++; + pN = txt.parentNode; + _$jscoverage['plugins/paragraph.js'][158]++; + domUtils.remove(txt); + _$jscoverage['plugins/paragraph.js'][160]++; + if ((domUtils.isBlockElm(pN) && domUtils.isEmptyNode(pN))) { + _$jscoverage['plugins/paragraph.js'][161]++; + domUtils.fillNode(this.document, pN); + } + } + _$jscoverage['plugins/paragraph.js'][166]++; + if ((browser.gecko && range.collapsed && (range.startContainer.nodeType == 1))) { + _$jscoverage['plugins/paragraph.js'][167]++; + var child = range.startContainer.childNodes[range.startOffset]; + _$jscoverage['plugins/paragraph.js'][168]++; + if ((child && (child.nodeType == 1) && (child.tagName.toLowerCase() == style))) { + _$jscoverage['plugins/paragraph.js'][169]++; + range.setStart(child, 0).collapse(true); + } + } + _$jscoverage['plugins/paragraph.js'][173]++; + range.select(); + _$jscoverage['plugins/paragraph.js'][176]++; + return true; +}), queryCommandValue: (function () { + _$jscoverage['plugins/paragraph.js'][179]++; + var node = domUtils.filterNodeList(this.selection.getStartElementPath(), "p h1 h2 h3 h4 h5 h6"); + _$jscoverage['plugins/paragraph.js'][180]++; + return (node? node.tagName.toLowerCase(): ""); +})}; +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/paste.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/paste.js new file mode 100644 index 000000000..df0dde7f3 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/paste.js @@ -0,0 +1,574 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/paste.js']) { + _$jscoverage['plugins/paste.js'] = []; + _$jscoverage['plugins/paste.js'][12] = 0; + _$jscoverage['plugins/paste.js'][13] = 0; + _$jscoverage['plugins/paste.js'][14] = 0; + _$jscoverage['plugins/paste.js'][15] = 0; + _$jscoverage['plugins/paste.js'][16] = 0; + _$jscoverage['plugins/paste.js'][18] = 0; + _$jscoverage['plugins/paste.js'][22] = 0; + _$jscoverage['plugins/paste.js'][24] = 0; + _$jscoverage['plugins/paste.js'][25] = 0; + _$jscoverage['plugins/paste.js'][28] = 0; + _$jscoverage['plugins/paste.js'][29] = 0; + _$jscoverage['plugins/paste.js'][33] = 0; + _$jscoverage['plugins/paste.js'][35] = 0; + _$jscoverage['plugins/paste.js'][36] = 0; + _$jscoverage['plugins/paste.js'][37] = 0; + _$jscoverage['plugins/paste.js'][38] = 0; + _$jscoverage['plugins/paste.js'][39] = 0; + _$jscoverage['plugins/paste.js'][41] = 0; + _$jscoverage['plugins/paste.js'][42] = 0; + _$jscoverage['plugins/paste.js'][46] = 0; + _$jscoverage['plugins/paste.js'][47] = 0; + _$jscoverage['plugins/paste.js'][50] = 0; + _$jscoverage['plugins/paste.js'][51] = 0; + _$jscoverage['plugins/paste.js'][55] = 0; + _$jscoverage['plugins/paste.js'][57] = 0; + _$jscoverage['plugins/paste.js'][59] = 0; + _$jscoverage['plugins/paste.js'][60] = 0; + _$jscoverage['plugins/paste.js'][61] = 0; + _$jscoverage['plugins/paste.js'][63] = 0; + _$jscoverage['plugins/paste.js'][64] = 0; + _$jscoverage['plugins/paste.js'][65] = 0; + _$jscoverage['plugins/paste.js'][66] = 0; + _$jscoverage['plugins/paste.js'][70] = 0; + _$jscoverage['plugins/paste.js'][72] = 0; + _$jscoverage['plugins/paste.js'][73] = 0; + _$jscoverage['plugins/paste.js'][74] = 0; + _$jscoverage['plugins/paste.js'][75] = 0; + _$jscoverage['plugins/paste.js'][76] = 0; + _$jscoverage['plugins/paste.js'][77] = 0; + _$jscoverage['plugins/paste.js'][80] = 0; + _$jscoverage['plugins/paste.js'][81] = 0; + _$jscoverage['plugins/paste.js'][82] = 0; + _$jscoverage['plugins/paste.js'][83] = 0; + _$jscoverage['plugins/paste.js'][84] = 0; + _$jscoverage['plugins/paste.js'][85] = 0; + _$jscoverage['plugins/paste.js'][87] = 0; + _$jscoverage['plugins/paste.js'][90] = 0; + _$jscoverage['plugins/paste.js'][91] = 0; + _$jscoverage['plugins/paste.js'][92] = 0; + _$jscoverage['plugins/paste.js'][95] = 0; + _$jscoverage['plugins/paste.js'][96] = 0; + _$jscoverage['plugins/paste.js'][97] = 0; + _$jscoverage['plugins/paste.js'][98] = 0; + _$jscoverage['plugins/paste.js'][102] = 0; + _$jscoverage['plugins/paste.js'][103] = 0; + _$jscoverage['plugins/paste.js'][104] = 0; + _$jscoverage['plugins/paste.js'][105] = 0; + _$jscoverage['plugins/paste.js'][108] = 0; + _$jscoverage['plugins/paste.js'][109] = 0; + _$jscoverage['plugins/paste.js'][110] = 0; + _$jscoverage['plugins/paste.js'][111] = 0; + _$jscoverage['plugins/paste.js'][116] = 0; + _$jscoverage['plugins/paste.js'][119] = 0; + _$jscoverage['plugins/paste.js'][121] = 0; + _$jscoverage['plugins/paste.js'][123] = 0; + _$jscoverage['plugins/paste.js'][124] = 0; + _$jscoverage['plugins/paste.js'][127] = 0; + _$jscoverage['plugins/paste.js'][129] = 0; + _$jscoverage['plugins/paste.js'][130] = 0; + _$jscoverage['plugins/paste.js'][131] = 0; + _$jscoverage['plugins/paste.js'][132] = 0; + _$jscoverage['plugins/paste.js'][134] = 0; + _$jscoverage['plugins/paste.js'][135] = 0; + _$jscoverage['plugins/paste.js'][136] = 0; + _$jscoverage['plugins/paste.js'][140] = 0; + _$jscoverage['plugins/paste.js'][141] = 0; + _$jscoverage['plugins/paste.js'][143] = 0; + _$jscoverage['plugins/paste.js'][144] = 0; + _$jscoverage['plugins/paste.js'][146] = 0; + _$jscoverage['plugins/paste.js'][148] = 0; + _$jscoverage['plugins/paste.js'][149] = 0; + _$jscoverage['plugins/paste.js'][152] = 0; + _$jscoverage['plugins/paste.js'][153] = 0; + _$jscoverage['plugins/paste.js'][155] = 0; + _$jscoverage['plugins/paste.js'][157] = 0; + _$jscoverage['plugins/paste.js'][158] = 0; + _$jscoverage['plugins/paste.js'][160] = 0; + _$jscoverage['plugins/paste.js'][164] = 0; + _$jscoverage['plugins/paste.js'][166] = 0; + _$jscoverage['plugins/paste.js'][167] = 0; + _$jscoverage['plugins/paste.js'][168] = 0; + _$jscoverage['plugins/paste.js'][170] = 0; + _$jscoverage['plugins/paste.js'][172] = 0; + _$jscoverage['plugins/paste.js'][174] = 0; + _$jscoverage['plugins/paste.js'][175] = 0; + _$jscoverage['plugins/paste.js'][176] = 0; + _$jscoverage['plugins/paste.js'][177] = 0; + _$jscoverage['plugins/paste.js'][178] = 0; + _$jscoverage['plugins/paste.js'][179] = 0; + _$jscoverage['plugins/paste.js'][181] = 0; + _$jscoverage['plugins/paste.js'][183] = 0; + _$jscoverage['plugins/paste.js'][184] = 0; + _$jscoverage['plugins/paste.js'][187] = 0; + _$jscoverage['plugins/paste.js'][188] = 0; + _$jscoverage['plugins/paste.js'][190] = 0; + _$jscoverage['plugins/paste.js'][194] = 0; + _$jscoverage['plugins/paste.js'][196] = 0; + _$jscoverage['plugins/paste.js'][197] = 0; + _$jscoverage['plugins/paste.js'][198] = 0; + _$jscoverage['plugins/paste.js'][199] = 0; + _$jscoverage['plugins/paste.js'][200] = 0; + _$jscoverage['plugins/paste.js'][201] = 0; + _$jscoverage['plugins/paste.js'][203] = 0; + _$jscoverage['plugins/paste.js'][204] = 0; + _$jscoverage['plugins/paste.js'][205] = 0; + _$jscoverage['plugins/paste.js'][208] = 0; + _$jscoverage['plugins/paste.js'][209] = 0; + _$jscoverage['plugins/paste.js'][211] = 0; + _$jscoverage['plugins/paste.js'][218] = 0; + _$jscoverage['plugins/paste.js'][219] = 0; + _$jscoverage['plugins/paste.js'][220] = 0; + _$jscoverage['plugins/paste.js'][221] = 0; + _$jscoverage['plugins/paste.js'][222] = 0; + _$jscoverage['plugins/paste.js'][223] = 0; + _$jscoverage['plugins/paste.js'][224] = 0; + _$jscoverage['plugins/paste.js'][225] = 0; + _$jscoverage['plugins/paste.js'][226] = 0; + _$jscoverage['plugins/paste.js'][228] = 0; + _$jscoverage['plugins/paste.js'][229] = 0; + _$jscoverage['plugins/paste.js'][234] = 0; + _$jscoverage['plugins/paste.js'][236] = 0; + _$jscoverage['plugins/paste.js'][238] = 0; + _$jscoverage['plugins/paste.js'][242] = 0; + _$jscoverage['plugins/paste.js'][245] = 0; + _$jscoverage['plugins/paste.js'][249] = 0; + _$jscoverage['plugins/paste.js'][250] = 0; + _$jscoverage['plugins/paste.js'][252] = 0; + _$jscoverage['plugins/paste.js'][253] = 0; + _$jscoverage['plugins/paste.js'][254] = 0; + _$jscoverage['plugins/paste.js'][255] = 0; + _$jscoverage['plugins/paste.js'][258] = 0; + _$jscoverage['plugins/paste.js'][260] = 0; + _$jscoverage['plugins/paste.js'][261] = 0; + _$jscoverage['plugins/paste.js'][264] = 0; + _$jscoverage['plugins/paste.js'][265] = 0; + _$jscoverage['plugins/paste.js'][266] = 0; + _$jscoverage['plugins/paste.js'][267] = 0; + _$jscoverage['plugins/paste.js'][268] = 0; + _$jscoverage['plugins/paste.js'][273] = 0; + _$jscoverage['plugins/paste.js'][274] = 0; + _$jscoverage['plugins/paste.js'][275] = 0; + _$jscoverage['plugins/paste.js'][277] = 0; + _$jscoverage['plugins/paste.js'][278] = 0; +} +_$jscoverage['plugins/paste.js'].source = ["///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 = '&nbsp;';"," 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;",""," var txtContent, htmlContent, address;",""," 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 = '<p><br/></p>';"," 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字符,也会产生&nbsp;这里过滤掉"," html = div.innerHTML;//.replace(/>(?:(\\s|&nbsp;)*?)</g,'><');",""," //过滤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)"," }"," })"," }"," 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', 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 = 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) + '>'"," }",""," });"," } 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);"," });"," });",""," });","};",""]; +_$jscoverage['plugins/paste.js'][12]++; +UE.plugins.paste = (function () { + _$jscoverage['plugins/paste.js'][13]++; + function getClipboardData(callback) { + _$jscoverage['plugins/paste.js'][14]++; + var doc = this.document; + _$jscoverage['plugins/paste.js'][15]++; + if (doc.getElementById("baidu_pastebin")) { + _$jscoverage['plugins/paste.js'][16]++; + return; + } + _$jscoverage['plugins/paste.js'][18]++; + var range = this.selection.getRange(), bk = range.createBookmark(), pastebin = doc.createElement("div"); + _$jscoverage['plugins/paste.js'][22]++; + pastebin.id = "baidu_pastebin"; + _$jscoverage['plugins/paste.js'][24]++; + (browser.webkit && pastebin.appendChild(doc.createTextNode((domUtils.fillChar + domUtils.fillChar)))); + _$jscoverage['plugins/paste.js'][25]++; + doc.body.appendChild(pastebin); + _$jscoverage['plugins/paste.js'][28]++; + bk.start.style.display = ""; + _$jscoverage['plugins/paste.js'][29]++; + pastebin.style.cssText = ("position:absolute;width:1px;height:1px;overflow:hidden;left:-1000px;white-space:nowrap;top:" + domUtils.getXY(bk.start).y + "px"); + _$jscoverage['plugins/paste.js'][33]++; + range.selectNodeContents(pastebin).select(true); + _$jscoverage['plugins/paste.js'][35]++; + setTimeout((function () { + _$jscoverage['plugins/paste.js'][36]++; + if (browser.webkit) { + _$jscoverage['plugins/paste.js'][37]++; + for (var i = 0, pastebins = doc.querySelectorAll("#baidu_pastebin"), pi; (pi = pastebins[(i++)]);) { + _$jscoverage['plugins/paste.js'][38]++; + if (domUtils.isEmptyNode(pi)) { + _$jscoverage['plugins/paste.js'][39]++; + domUtils.remove(pi); + } + else { + _$jscoverage['plugins/paste.js'][41]++; + pastebin = pi; + _$jscoverage['plugins/paste.js'][42]++; + break; + } +} + } + _$jscoverage['plugins/paste.js'][46]++; + try { + _$jscoverage['plugins/paste.js'][47]++; + pastebin.parentNode.removeChild(pastebin); + } + catch (e) { + } + _$jscoverage['plugins/paste.js'][50]++; + range.moveToBookmark(bk).select(true); + _$jscoverage['plugins/paste.js'][51]++; + callback(pastebin); +}), 0); +} + _$jscoverage['plugins/paste.js'][55]++; + var me = this; + _$jscoverage['plugins/paste.js'][57]++; + var txtContent, htmlContent, address; + _$jscoverage['plugins/paste.js'][59]++; + function filter(div) { + _$jscoverage['plugins/paste.js'][60]++; + var html; + _$jscoverage['plugins/paste.js'][61]++; + if (div.firstChild) { + _$jscoverage['plugins/paste.js'][63]++; + var nodes = domUtils.getElementsByTagName(div, "span"); + _$jscoverage['plugins/paste.js'][64]++; + for (var i = 0, ni; (ni = nodes[(i++)]);) { + _$jscoverage['plugins/paste.js'][65]++; + if (((ni.id == "_baidu_cut_start") || (ni.id == "_baidu_cut_end"))) { + _$jscoverage['plugins/paste.js'][66]++; + domUtils.remove(ni); + } +} + _$jscoverage['plugins/paste.js'][70]++; + if (browser.webkit) { + _$jscoverage['plugins/paste.js'][72]++; + var brs = div.querySelectorAll("div br"); + _$jscoverage['plugins/paste.js'][73]++; + for (var i = 0, bi; (bi = brs[(i++)]);) { + _$jscoverage['plugins/paste.js'][74]++; + var pN = bi.parentNode; + _$jscoverage['plugins/paste.js'][75]++; + if (((pN.tagName == "DIV") && (pN.childNodes.length == 1))) { + _$jscoverage['plugins/paste.js'][76]++; + pN.innerHTML = "


    "; + _$jscoverage['plugins/paste.js'][77]++; + domUtils.remove(pN); + } +} + _$jscoverage['plugins/paste.js'][80]++; + var divs = div.querySelectorAll("#baidu_pastebin"); + _$jscoverage['plugins/paste.js'][81]++; + for (var i = 0, di; (di = divs[(i++)]);) { + _$jscoverage['plugins/paste.js'][82]++; + var tmpP = me.document.createElement("p"); + _$jscoverage['plugins/paste.js'][83]++; + di.parentNode.insertBefore(tmpP, di); + _$jscoverage['plugins/paste.js'][84]++; + while (di.firstChild) { + _$jscoverage['plugins/paste.js'][85]++; + tmpP.appendChild(di.firstChild); +} + _$jscoverage['plugins/paste.js'][87]++; + domUtils.remove(di); +} + _$jscoverage['plugins/paste.js'][90]++; + var metas = div.querySelectorAll("meta"); + _$jscoverage['plugins/paste.js'][91]++; + for (var i = 0, ci; (ci = metas[(i++)]);) { + _$jscoverage['plugins/paste.js'][92]++; + domUtils.remove(ci); +} + _$jscoverage['plugins/paste.js'][95]++; + var brs = div.querySelectorAll("br"); + _$jscoverage['plugins/paste.js'][96]++; + for (i = 0; (ci = brs[(i++)]);) { + _$jscoverage['plugins/paste.js'][97]++; + if (/^apple-/i.test(ci.className)) { + _$jscoverage['plugins/paste.js'][98]++; + domUtils.remove(ci); + } +} + } + _$jscoverage['plugins/paste.js'][102]++; + if (browser.gecko) { + _$jscoverage['plugins/paste.js'][103]++; + var dirtyNodes = div.querySelectorAll("[_moz_dirty]"); + _$jscoverage['plugins/paste.js'][104]++; + for (i = 0; (ci = dirtyNodes[(i++)]);) { + _$jscoverage['plugins/paste.js'][105]++; + ci.removeAttribute("_moz_dirty"); +} + } + _$jscoverage['plugins/paste.js'][108]++; + if ((! browser.ie)) { + _$jscoverage['plugins/paste.js'][109]++; + var spans = div.querySelectorAll("span.Apple-style-span"); + _$jscoverage['plugins/paste.js'][110]++; + for (var i = 0, ci = ci; (ci = spans[(i++)]);) { + _$jscoverage['plugins/paste.js'][111]++; + domUtils.remove(ci, true); +} + } + _$jscoverage['plugins/paste.js'][116]++; + html = div.innerHTML; + _$jscoverage['plugins/paste.js'][119]++; + html = UE.filterWord(html); + _$jscoverage['plugins/paste.js'][121]++; + var root = UE.htmlparser(html); + _$jscoverage['plugins/paste.js'][123]++; + if (me.options.filterRules) { + _$jscoverage['plugins/paste.js'][124]++; + UE.filterNode(root, me.options.filterRules); + } + _$jscoverage['plugins/paste.js'][127]++; + me.filterInputRule(root); + _$jscoverage['plugins/paste.js'][129]++; + if (browser.webkit) { + _$jscoverage['plugins/paste.js'][130]++; + var br = root.lastChild(); + _$jscoverage['plugins/paste.js'][131]++; + if ((br && (br.type == "element") && (br.tagName == "br"))) { + _$jscoverage['plugins/paste.js'][132]++; + root.removeChild(br); + } + _$jscoverage['plugins/paste.js'][134]++; + utils.each(me.body.querySelectorAll("div"), (function (node) { + _$jscoverage['plugins/paste.js'][135]++; + if (domUtils.isEmptyBlock(node)) { + _$jscoverage['plugins/paste.js'][136]++; + domUtils.remove(node); + } +})); + } + _$jscoverage['plugins/paste.js'][140]++; + html = {"html": root.toHtml()}; + _$jscoverage['plugins/paste.js'][141]++; + me.fireEvent("beforepaste", html, root); + _$jscoverage['plugins/paste.js'][143]++; + if ((! html.html)) { + _$jscoverage['plugins/paste.js'][144]++; + return; + } + _$jscoverage['plugins/paste.js'][146]++; + root = UE.htmlparser(html.html, true); + _$jscoverage['plugins/paste.js'][148]++; + if ((me.queryCommandState("pasteplain") === 1)) { + _$jscoverage['plugins/paste.js'][149]++; + me.execCommand("insertHtml", UE.filterNode(root, me.options.filterTxtRules).toHtml(), true); + } + else { + _$jscoverage['plugins/paste.js'][152]++; + UE.filterNode(root, me.options.filterTxtRules); + _$jscoverage['plugins/paste.js'][153]++; + txtContent = root.toHtml(); + _$jscoverage['plugins/paste.js'][155]++; + htmlContent = html.html; + _$jscoverage['plugins/paste.js'][157]++; + address = me.selection.getRange().createAddress(true); + _$jscoverage['plugins/paste.js'][158]++; + me.execCommand("insertHtml", htmlContent, true); + } + _$jscoverage['plugins/paste.js'][160]++; + me.fireEvent("afterpaste", html); + } +} + _$jscoverage['plugins/paste.js'][164]++; + me.addListener("pasteTransfer", (function (cmd, plainType) { + _$jscoverage['plugins/paste.js'][166]++; + if ((address && txtContent && htmlContent && (txtContent != htmlContent))) { + _$jscoverage['plugins/paste.js'][167]++; + var range = me.selection.getRange(); + _$jscoverage['plugins/paste.js'][168]++; + range.moveToAddress(address, true); + _$jscoverage['plugins/paste.js'][170]++; + if ((! range.collapsed)) { + _$jscoverage['plugins/paste.js'][172]++; + while ((! domUtils.isBody(range.startContainer))) { + _$jscoverage['plugins/paste.js'][174]++; + var start = range.startContainer; + _$jscoverage['plugins/paste.js'][175]++; + if ((start.nodeType == 1)) { + _$jscoverage['plugins/paste.js'][176]++; + start = start.childNodes[range.startOffset]; + _$jscoverage['plugins/paste.js'][177]++; + if ((! start)) { + _$jscoverage['plugins/paste.js'][178]++; + range.setStartBefore(range.startContainer); + _$jscoverage['plugins/paste.js'][179]++; + continue; + } + _$jscoverage['plugins/paste.js'][181]++; + var pre = start.previousSibling; + _$jscoverage['plugins/paste.js'][183]++; + if ((pre && (pre.nodeType == 3) && new RegExp(("^[\n\r\t " + domUtils.fillChar + "]*$")).test(pre.nodeValue))) { + _$jscoverage['plugins/paste.js'][184]++; + range.setStartBefore(pre); + } + } + _$jscoverage['plugins/paste.js'][187]++; + if ((range.startOffset == 0)) { + _$jscoverage['plugins/paste.js'][188]++; + range.setStartBefore(range.startContainer); + } + else { + _$jscoverage['plugins/paste.js'][190]++; + break; + } +} + _$jscoverage['plugins/paste.js'][194]++; + while ((! domUtils.isBody(range.endContainer))) { + _$jscoverage['plugins/paste.js'][196]++; + var end = range.endContainer; + _$jscoverage['plugins/paste.js'][197]++; + if ((end.nodeType == 1)) { + _$jscoverage['plugins/paste.js'][198]++; + end = end.childNodes[range.endOffset]; + _$jscoverage['plugins/paste.js'][199]++; + if ((! end)) { + _$jscoverage['plugins/paste.js'][200]++; + range.setEndAfter(range.endContainer); + _$jscoverage['plugins/paste.js'][201]++; + continue; + } + _$jscoverage['plugins/paste.js'][203]++; + var next = end.nextSibling; + _$jscoverage['plugins/paste.js'][204]++; + if ((next && (next.nodeType == 3) && new RegExp(("^[\n\r\t" + domUtils.fillChar + "]*$")).test(next.nodeValue))) { + _$jscoverage['plugins/paste.js'][205]++; + range.setEndAfter(next); + } + } + _$jscoverage['plugins/paste.js'][208]++; + if ((range.endOffset == range.endContainer[((range.endContainer.nodeType == 3)? "nodeValue": "childNodes")].length)) { + _$jscoverage['plugins/paste.js'][209]++; + range.setEndAfter(range.endContainer); + } + else { + _$jscoverage['plugins/paste.js'][211]++; + break; + } +} + } + _$jscoverage['plugins/paste.js'][218]++; + range.deleteContents(); + _$jscoverage['plugins/paste.js'][219]++; + range.select(true); + _$jscoverage['plugins/paste.js'][220]++; + me.__hasEnterExecCommand = true; + _$jscoverage['plugins/paste.js'][221]++; + var html = htmlContent; + _$jscoverage['plugins/paste.js'][222]++; + if ((plainType === 2)) { + _$jscoverage['plugins/paste.js'][223]++; + html = html.replace(/<(\/?)([\w\-]+)([^>]*)>/gi, (function (a, b, tagName, attrs) { + _$jscoverage['plugins/paste.js'][224]++; + tagName = tagName.toLowerCase(); + _$jscoverage['plugins/paste.js'][225]++; + if ({img: 1}[tagName]) { + _$jscoverage['plugins/paste.js'][226]++; + return a; + } + _$jscoverage['plugins/paste.js'][228]++; + attrs = attrs.replace(/([\w\-]*?)\s*=\s*(("([^"]*)")|('([^']*)')|([^\s>]+))/gi, (function (str, atr, val) { + _$jscoverage['plugins/paste.js'][229]++; + if ({"src": 1, "href": 1, "name": 1}[atr.toLowerCase()]) { + _$jscoverage['plugins/paste.js'][234]++; + return (atr + "=" + val + " "); + } + _$jscoverage['plugins/paste.js'][236]++; + return ""; +})); + _$jscoverage['plugins/paste.js'][238]++; + if ({"span": 1, "div": 1}[tagName]) { + _$jscoverage['plugins/paste.js'][242]++; + return ""; + } + else { + _$jscoverage['plugins/paste.js'][245]++; + return ("<" + b + tagName + " " + utils.trim(attrs) + ">"); + } +})); + } + else { + _$jscoverage['plugins/paste.js'][249]++; + if (plainType) { + _$jscoverage['plugins/paste.js'][250]++; + html = txtContent; + } + } + _$jscoverage['plugins/paste.js'][252]++; + me.execCommand("inserthtml", html, true); + _$jscoverage['plugins/paste.js'][253]++; + me.__hasEnterExecCommand = false; + _$jscoverage['plugins/paste.js'][254]++; + var rng = me.selection.getRange(); + _$jscoverage['plugins/paste.js'][255]++; + while (((! domUtils.isBody(rng.startContainer)) && (! rng.startOffset) && rng.startContainer[((rng.startContainer.nodeType == 3)? "nodeValue": "childNodes")].length)) { + _$jscoverage['plugins/paste.js'][258]++; + rng.setStartBefore(rng.startContainer); +} + _$jscoverage['plugins/paste.js'][260]++; + var tmpAddress = rng.createAddress(true); + _$jscoverage['plugins/paste.js'][261]++; + address.endAddress = tmpAddress.startAddress; + } +})); + _$jscoverage['plugins/paste.js'][264]++; + me.addListener("ready", (function () { + _$jscoverage['plugins/paste.js'][265]++; + domUtils.on(me.body, "cut", (function () { + _$jscoverage['plugins/paste.js'][266]++; + var range = me.selection.getRange(); + _$jscoverage['plugins/paste.js'][267]++; + if (((! range.collapsed) && me.undoManger)) { + _$jscoverage['plugins/paste.js'][268]++; + me.undoManger.save(); + } +})); + _$jscoverage['plugins/paste.js'][273]++; + domUtils.on(me.body, ((browser.ie || browser.opera)? "keydown": "paste"), (function (e) { + _$jscoverage['plugins/paste.js'][274]++; + if (((browser.ie || browser.opera) && (((! e.ctrlKey) && (! e.metaKey)) || (e.keyCode != "86")))) { + _$jscoverage['plugins/paste.js'][275]++; + return; + } + _$jscoverage['plugins/paste.js'][277]++; + getClipboardData.call(me, (function (div) { + _$jscoverage['plugins/paste.js'][278]++; + filter(div); +})); +})); +})); +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/preview.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/preview.js new file mode 100644 index 000000000..4612b2bba --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/preview.js @@ -0,0 +1,59 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/preview.js']) { + _$jscoverage['plugins/preview.js'] = []; + _$jscoverage['plugins/preview.js'][17] = 0; + _$jscoverage['plugins/preview.js'][19] = 0; + _$jscoverage['plugins/preview.js'][21] = 0; + _$jscoverage['plugins/preview.js'][22] = 0; + _$jscoverage['plugins/preview.js'][28] = 0; +} +_$jscoverage['plugins/preview.js'].source = ["/**"," * 预览"," * @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('<html><head><script src=\"'+this.options.UEDITOR_HOME_URL+'ueditor.parse.js\"></script><script>' +"," \"setTimeout(function(){uParse('div',{\" +"," \" 'highlightJsUrl':'\"+this.options.UEDITOR_HOME_URL+\"third-party/SyntaxHighlighter/shCore.js',\" +"," \" 'highlightCssUrl':'\"+this.options.UEDITOR_HOME_URL+\"third-party/SyntaxHighlighter/shCoreDefault.css'\" +"," \"})},300)\" +"," '</script></head><body><div>'+this.getContent(null,null,true)+'</div></body></html>');"," d.close();"," },"," notNeedUndo : 1","};"]; +_$jscoverage['plugins/preview.js'][17]++; +UE.commands.preview = {execCommand: (function () { + _$jscoverage['plugins/preview.js'][19]++; + var w = window.open("", "_blank", ""), d = w.document; + _$jscoverage['plugins/preview.js'][21]++; + d.open(); + _$jscoverage['plugins/preview.js'][22]++; + d.write(("
    " + this.getContent(null, null, true) + "
    ")); + _$jscoverage['plugins/preview.js'][28]++; + d.close(); +}), notNeedUndo: 1}; diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/print.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/print.js new file mode 100644 index 000000000..da94c1bb2 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/print.js @@ -0,0 +1,50 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/print.js']) { + _$jscoverage['plugins/print.js'] = []; + _$jscoverage['plugins/print.js'][17] = 0; + _$jscoverage['plugins/print.js'][19] = 0; +} +_$jscoverage['plugins/print.js'].source = ["/**"," * 打印"," * @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","};",""]; +_$jscoverage['plugins/print.js'][17]++; +UE.commands.print = {execCommand: (function () { + _$jscoverage['plugins/print.js'][19]++; + this.window.print(); +}), notNeedUndo: 1}; diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/puretxtpaste.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/puretxtpaste.js new file mode 100644 index 000000000..cc8fe4e0a --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/puretxtpaste.js @@ -0,0 +1,144 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/puretxtpaste.js']) { + _$jscoverage['plugins/puretxtpaste.js'] = []; + _$jscoverage['plugins/puretxtpaste.js'][7] = 0; + _$jscoverage['plugins/puretxtpaste.js'][8] = 0; + _$jscoverage['plugins/puretxtpaste.js'][9] = 0; + _$jscoverage['plugins/puretxtpaste.js'][12] = 0; + _$jscoverage['plugins/puretxtpaste.js'][13] = 0; + _$jscoverage['plugins/puretxtpaste.js'][14] = 0; + _$jscoverage['plugins/puretxtpaste.js'][16] = 0; + _$jscoverage['plugins/puretxtpaste.js'][17] = 0; + _$jscoverage['plugins/puretxtpaste.js'][19] = 0; + _$jscoverage['plugins/puretxtpaste.js'][25] = 0; + _$jscoverage['plugins/puretxtpaste.js'][26] = 0; + _$jscoverage['plugins/puretxtpaste.js'][27] = 0; + _$jscoverage['plugins/puretxtpaste.js'][28] = 0; + _$jscoverage['plugins/puretxtpaste.js'][30] = 0; + _$jscoverage['plugins/puretxtpaste.js'][31] = 0; + _$jscoverage['plugins/puretxtpaste.js'][32] = 0; + _$jscoverage['plugins/puretxtpaste.js'][34] = 0; + _$jscoverage['plugins/puretxtpaste.js'][38] = 0; + _$jscoverage['plugins/puretxtpaste.js'][39] = 0; + _$jscoverage['plugins/puretxtpaste.js'][41] = 0; + _$jscoverage['plugins/puretxtpaste.js'][55] = 0; + _$jscoverage['plugins/puretxtpaste.js'][56] = 0; + _$jscoverage['plugins/puretxtpaste.js'][57] = 0; + _$jscoverage['plugins/puretxtpaste.js'][59] = 0; + _$jscoverage['plugins/puretxtpaste.js'][65] = 0; + _$jscoverage['plugins/puretxtpaste.js'][89] = 0; + _$jscoverage['plugins/puretxtpaste.js'][91] = 0; + _$jscoverage['plugins/puretxtpaste.js'][94] = 0; +} +_$jscoverage['plugins/puretxtpaste.js'].source = ["/**"," * 纯文本粘贴插件"," * @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(' &nbsp; &nbsp;'),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"," };","};"]; +_$jscoverage['plugins/puretxtpaste.js'][7]++; +UE.plugins.pasteplain = (function () { + _$jscoverage['plugins/puretxtpaste.js'][8]++; + var me = this; + _$jscoverage['plugins/puretxtpaste.js'][9]++; + me.setOpt({"pasteplain": false, "filterTxtRules": (function () { + _$jscoverage['plugins/puretxtpaste.js'][12]++; + function transP(node) { + _$jscoverage['plugins/puretxtpaste.js'][13]++; + node.tagName = "p"; + _$jscoverage['plugins/puretxtpaste.js'][14]++; + node.setStyle(); +} + _$jscoverage['plugins/puretxtpaste.js'][16]++; + function removeNode(node) { + _$jscoverage['plugins/puretxtpaste.js'][17]++; + node.parentNode.removeChild(node, true); +} + _$jscoverage['plugins/puretxtpaste.js'][19]++; + return ({"-": "script style object iframe embed input select", "p": {$: {}}, "br": {$: {}}, div: (function (node) { + _$jscoverage['plugins/puretxtpaste.js'][25]++; + var tmpNode, p = UE.uNode.createElement("p"); + _$jscoverage['plugins/puretxtpaste.js'][26]++; + while ((tmpNode = node.firstChild())) { + _$jscoverage['plugins/puretxtpaste.js'][27]++; + if (((tmpNode.type == "text") || (! UE.dom.dtd.$block[tmpNode.tagName]))) { + _$jscoverage['plugins/puretxtpaste.js'][28]++; + p.appendChild(tmpNode); + } + else { + _$jscoverage['plugins/puretxtpaste.js'][30]++; + if (p.firstChild()) { + _$jscoverage['plugins/puretxtpaste.js'][31]++; + node.parentNode.insertBefore(p, node); + _$jscoverage['plugins/puretxtpaste.js'][32]++; + p = UE.uNode.createElement("p"); + } + else { + _$jscoverage['plugins/puretxtpaste.js'][34]++; + node.parentNode.insertBefore(tmpNode, node); + } + } +} + _$jscoverage['plugins/puretxtpaste.js'][38]++; + if (p.firstChild()) { + _$jscoverage['plugins/puretxtpaste.js'][39]++; + node.parentNode.insertBefore(p, node); + } + _$jscoverage['plugins/puretxtpaste.js'][41]++; + 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) { + _$jscoverage['plugins/puretxtpaste.js'][55]++; + var txt = (! (! node.innerText())); + _$jscoverage['plugins/puretxtpaste.js'][56]++; + if (txt) { + _$jscoverage['plugins/puretxtpaste.js'][57]++; + node.parentNode.insertAfter(UE.uNode.createText("    "), node); + } + _$jscoverage['plugins/puretxtpaste.js'][59]++; + node.parentNode.removeChild(node, node.innerText()); +})}); +})()}); + _$jscoverage['plugins/puretxtpaste.js'][65]++; + var pasteplain = me.options.pasteplain; + _$jscoverage['plugins/puretxtpaste.js'][89]++; + me.commands.pasteplain = {queryCommandState: (function () { + _$jscoverage['plugins/puretxtpaste.js'][91]++; + return (pasteplain? 1: 0); +}), execCommand: (function () { + _$jscoverage['plugins/puretxtpaste.js'][94]++; + pasteplain = ((! pasteplain) | 0); +}), notNeedUndo: 1}; +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/removeformat.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/removeformat.js new file mode 100644 index 000000000..c13eaaf8d --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/removeformat.js @@ -0,0 +1,318 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/removeformat.js']) { + _$jscoverage['plugins/removeformat.js'] = []; + _$jscoverage['plugins/removeformat.js'][22] = 0; + _$jscoverage['plugins/removeformat.js'][23] = 0; + _$jscoverage['plugins/removeformat.js'][24] = 0; + _$jscoverage['plugins/removeformat.js'][28] = 0; + _$jscoverage['plugins/removeformat.js'][31] = 0; + _$jscoverage['plugins/removeformat.js'][36] = 0; + _$jscoverage['plugins/removeformat.js'][39] = 0; + _$jscoverage['plugins/removeformat.js'][40] = 0; + _$jscoverage['plugins/removeformat.js'][41] = 0; + _$jscoverage['plugins/removeformat.js'][43] = 0; + _$jscoverage['plugins/removeformat.js'][46] = 0; + _$jscoverage['plugins/removeformat.js'][47] = 0; + _$jscoverage['plugins/removeformat.js'][48] = 0; + _$jscoverage['plugins/removeformat.js'][49] = 0; + _$jscoverage['plugins/removeformat.js'][50] = 0; + _$jscoverage['plugins/removeformat.js'][53] = 0; + _$jscoverage['plugins/removeformat.js'][56] = 0; + _$jscoverage['plugins/removeformat.js'][58] = 0; + _$jscoverage['plugins/removeformat.js'][60] = 0; + _$jscoverage['plugins/removeformat.js'][61] = 0; + _$jscoverage['plugins/removeformat.js'][62] = 0; + _$jscoverage['plugins/removeformat.js'][66] = 0; + _$jscoverage['plugins/removeformat.js'][67] = 0; + _$jscoverage['plugins/removeformat.js'][68] = 0; + _$jscoverage['plugins/removeformat.js'][69] = 0; + _$jscoverage['plugins/removeformat.js'][72] = 0; + _$jscoverage['plugins/removeformat.js'][73] = 0; + _$jscoverage['plugins/removeformat.js'][74] = 0; + _$jscoverage['plugins/removeformat.js'][80] = 0; + _$jscoverage['plugins/removeformat.js'][82] = 0; + _$jscoverage['plugins/removeformat.js'][85] = 0; + _$jscoverage['plugins/removeformat.js'][86] = 0; + _$jscoverage['plugins/removeformat.js'][88] = 0; + _$jscoverage['plugins/removeformat.js'][90] = 0; + _$jscoverage['plugins/removeformat.js'][92] = 0; + _$jscoverage['plugins/removeformat.js'][93] = 0; + _$jscoverage['plugins/removeformat.js'][94] = 0; + _$jscoverage['plugins/removeformat.js'][95] = 0; + _$jscoverage['plugins/removeformat.js'][99] = 0; + _$jscoverage['plugins/removeformat.js'][101] = 0; + _$jscoverage['plugins/removeformat.js'][102] = 0; + _$jscoverage['plugins/removeformat.js'][103] = 0; + _$jscoverage['plugins/removeformat.js'][106] = 0; + _$jscoverage['plugins/removeformat.js'][108] = 0; + _$jscoverage['plugins/removeformat.js'][109] = 0; + _$jscoverage['plugins/removeformat.js'][110] = 0; + _$jscoverage['plugins/removeformat.js'][111] = 0; + _$jscoverage['plugins/removeformat.js'][112] = 0; + _$jscoverage['plugins/removeformat.js'][113] = 0; + _$jscoverage['plugins/removeformat.js'][116] = 0; + _$jscoverage['plugins/removeformat.js'][120] = 0; + _$jscoverage['plugins/removeformat.js'][121] = 0; + _$jscoverage['plugins/removeformat.js'][122] = 0; + _$jscoverage['plugins/removeformat.js'][123] = 0; + _$jscoverage['plugins/removeformat.js'][129] = 0; + _$jscoverage['plugins/removeformat.js'][134] = 0; + _$jscoverage['plugins/removeformat.js'][135] = 0; + _$jscoverage['plugins/removeformat.js'][136] = 0; + _$jscoverage['plugins/removeformat.js'][138] = 0; + _$jscoverage['plugins/removeformat.js'][139] = 0; + _$jscoverage['plugins/removeformat.js'][140] = 0; + _$jscoverage['plugins/removeformat.js'][142] = 0; + _$jscoverage['plugins/removeformat.js'][144] = 0; + _$jscoverage['plugins/removeformat.js'][147] = 0; + _$jscoverage['plugins/removeformat.js'][148] = 0; + _$jscoverage['plugins/removeformat.js'][149] = 0; + _$jscoverage['plugins/removeformat.js'][152] = 0; + _$jscoverage['plugins/removeformat.js'][153] = 0; + _$jscoverage['plugins/removeformat.js'][155] = 0; + _$jscoverage['plugins/removeformat.js'][156] = 0; + _$jscoverage['plugins/removeformat.js'][159] = 0; + _$jscoverage['plugins/removeformat.js'][160] = 0; + _$jscoverage['plugins/removeformat.js'][161] = 0; + _$jscoverage['plugins/removeformat.js'][162] = 0; + _$jscoverage['plugins/removeformat.js'][163] = 0; + _$jscoverage['plugins/removeformat.js'][164] = 0; + _$jscoverage['plugins/removeformat.js'][166] = 0; + _$jscoverage['plugins/removeformat.js'][175] = 0; + _$jscoverage['plugins/removeformat.js'][176] = 0; + _$jscoverage['plugins/removeformat.js'][177] = 0; +} +_$jscoverage['plugins/removeformat.js'].source = ["/**"," * 清除格式"," * @file"," * @since 1.2.6.1"," */","","/**"," * 对图片居左居中居右排版"," * @command removeformat"," * @method execCommand"," * @param { String } cmd 命令字符串"," * @param {String} tags 以逗号隔开的标签。如:span,a"," * @param {String} style 样式"," * @param {String} attrs 属性"," * @param {String} notIncluedA 是否把a标签切开"," * @example"," * ```javascript"," * editor.execCommand( 'removeformat', 'center' );"," * ```"," */","","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);"," //清除冗余的代码 <b><bookmark></b>"," 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();",""," }",""," };","","};"]; +_$jscoverage['plugins/removeformat.js'][22]++; +UE.plugins.removeformat = (function () { + _$jscoverage['plugins/removeformat.js'][23]++; + var me = this; + _$jscoverage['plugins/removeformat.js'][24]++; + 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"}); + _$jscoverage['plugins/removeformat.js'][28]++; + me.commands.removeformat = {execCommand: (function (cmdName, tags, style, attrs, notIncludeA) { + _$jscoverage['plugins/removeformat.js'][31]++; + 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) { + _$jscoverage['plugins/removeformat.js'][36]++; + return (node.nodeType == 1); +}); + _$jscoverage['plugins/removeformat.js'][39]++; + function isRedundantSpan(node) { + _$jscoverage['plugins/removeformat.js'][40]++; + if (((node.nodeType == 3) || (node.tagName.toLowerCase() != "span"))) { + _$jscoverage['plugins/removeformat.js'][41]++; + return 0; + } + _$jscoverage['plugins/removeformat.js'][43]++; + if (browser.ie) { + _$jscoverage['plugins/removeformat.js'][46]++; + var attrs = node.attributes; + _$jscoverage['plugins/removeformat.js'][47]++; + if (attrs.length) { + _$jscoverage['plugins/removeformat.js'][48]++; + for (var i = 0, l = attrs.length; (i < l); (i++)) { + _$jscoverage['plugins/removeformat.js'][49]++; + if (attrs[i].specified) { + _$jscoverage['plugins/removeformat.js'][50]++; + return 0; + } +} + _$jscoverage['plugins/removeformat.js'][53]++; + return 1; + } + } + _$jscoverage['plugins/removeformat.js'][56]++; + return (! node.attributes.length); +} + _$jscoverage['plugins/removeformat.js'][58]++; + function doRemove(range) { + _$jscoverage['plugins/removeformat.js'][60]++; + var bookmark1 = range.createBookmark(); + _$jscoverage['plugins/removeformat.js'][61]++; + if (range.collapsed) { + _$jscoverage['plugins/removeformat.js'][62]++; + range.enlarge(true); + } + _$jscoverage['plugins/removeformat.js'][66]++; + if ((! notIncludeA)) { + _$jscoverage['plugins/removeformat.js'][67]++; + var aNode = domUtils.findParentByTagName(range.startContainer, "a", true); + _$jscoverage['plugins/removeformat.js'][68]++; + if (aNode) { + _$jscoverage['plugins/removeformat.js'][69]++; + range.setStartBefore(aNode); + } + _$jscoverage['plugins/removeformat.js'][72]++; + aNode = domUtils.findParentByTagName(range.endContainer, "a", true); + _$jscoverage['plugins/removeformat.js'][73]++; + if (aNode) { + _$jscoverage['plugins/removeformat.js'][74]++; + range.setEndAfter(aNode); + } + } + _$jscoverage['plugins/removeformat.js'][80]++; + bookmark = range.createBookmark(); + _$jscoverage['plugins/removeformat.js'][82]++; + node = bookmark.start; + _$jscoverage['plugins/removeformat.js'][85]++; + while (((parent = node.parentNode) && (! domUtils.isBlockElm(parent)))) { + _$jscoverage['plugins/removeformat.js'][86]++; + domUtils.breakParent(node, parent); + _$jscoverage['plugins/removeformat.js'][88]++; + domUtils.clearEmptySibling(node); +} + _$jscoverage['plugins/removeformat.js'][90]++; + if (bookmark.end) { + _$jscoverage['plugins/removeformat.js'][92]++; + node = bookmark.end; + _$jscoverage['plugins/removeformat.js'][93]++; + while (((parent = node.parentNode) && (! domUtils.isBlockElm(parent)))) { + _$jscoverage['plugins/removeformat.js'][94]++; + domUtils.breakParent(node, parent); + _$jscoverage['plugins/removeformat.js'][95]++; + domUtils.clearEmptySibling(node); +} + _$jscoverage['plugins/removeformat.js'][99]++; + var current = domUtils.getNextDomNode(bookmark.start, false, filter), next; + _$jscoverage['plugins/removeformat.js'][101]++; + while (current) { + _$jscoverage['plugins/removeformat.js'][102]++; + if ((current == bookmark.end)) { + _$jscoverage['plugins/removeformat.js'][103]++; + break; + } + _$jscoverage['plugins/removeformat.js'][106]++; + next = domUtils.getNextDomNode(current, true, filter); + _$jscoverage['plugins/removeformat.js'][108]++; + if (((! dtd.$empty[current.tagName.toLowerCase()]) && (! domUtils.isBookmarkNode(current)))) { + _$jscoverage['plugins/removeformat.js'][109]++; + if (tagReg.test(current.tagName)) { + _$jscoverage['plugins/removeformat.js'][110]++; + if (style) { + _$jscoverage['plugins/removeformat.js'][111]++; + domUtils.removeStyle(current, style); + _$jscoverage['plugins/removeformat.js'][112]++; + if ((isRedundantSpan(current) && (style != "text-decoration"))) { + _$jscoverage['plugins/removeformat.js'][113]++; + domUtils.remove(current, true); + } + } + else { + _$jscoverage['plugins/removeformat.js'][116]++; + domUtils.remove(current, true); + } + } + else { + _$jscoverage['plugins/removeformat.js'][120]++; + if (((! dtd.$tableContent[current.tagName]) && (! dtd.$list[current.tagName]))) { + _$jscoverage['plugins/removeformat.js'][121]++; + domUtils.removeAttributes(current, removeFormatAttributes); + _$jscoverage['plugins/removeformat.js'][122]++; + if (isRedundantSpan(current)) { + _$jscoverage['plugins/removeformat.js'][123]++; + domUtils.remove(current, true); + } + } + } + } + _$jscoverage['plugins/removeformat.js'][129]++; + current = next; +} + } + _$jscoverage['plugins/removeformat.js'][134]++; + var pN = bookmark.start.parentNode; + _$jscoverage['plugins/removeformat.js'][135]++; + if ((domUtils.isBlockElm(pN) && (! dtd.$tableContent[pN.tagName]) && (! dtd.$list[pN.tagName]))) { + _$jscoverage['plugins/removeformat.js'][136]++; + domUtils.removeAttributes(pN, removeFormatAttributes); + } + _$jscoverage['plugins/removeformat.js'][138]++; + pN = bookmark.end.parentNode; + _$jscoverage['plugins/removeformat.js'][139]++; + if ((bookmark.end && domUtils.isBlockElm(pN) && (! dtd.$tableContent[pN.tagName]) && (! dtd.$list[pN.tagName]))) { + _$jscoverage['plugins/removeformat.js'][140]++; + domUtils.removeAttributes(pN, removeFormatAttributes); + } + _$jscoverage['plugins/removeformat.js'][142]++; + range.moveToBookmark(bookmark).moveToBookmark(bookmark1); + _$jscoverage['plugins/removeformat.js'][144]++; + var node = range.startContainer, tmp, collapsed = range.collapsed; + _$jscoverage['plugins/removeformat.js'][147]++; + while (((node.nodeType == 1) && domUtils.isEmptyNode(node) && dtd.$removeEmpty[node.tagName])) { + _$jscoverage['plugins/removeformat.js'][148]++; + tmp = node.parentNode; + _$jscoverage['plugins/removeformat.js'][149]++; + range.setStartBefore(node); + _$jscoverage['plugins/removeformat.js'][152]++; + if ((range.startContainer === range.endContainer)) { + _$jscoverage['plugins/removeformat.js'][153]++; + (range.endOffset--); + } + _$jscoverage['plugins/removeformat.js'][155]++; + domUtils.remove(node); + _$jscoverage['plugins/removeformat.js'][156]++; + node = tmp; +} + _$jscoverage['plugins/removeformat.js'][159]++; + if ((! collapsed)) { + _$jscoverage['plugins/removeformat.js'][160]++; + node = range.endContainer; + _$jscoverage['plugins/removeformat.js'][161]++; + while (((node.nodeType == 1) && domUtils.isEmptyNode(node) && dtd.$removeEmpty[node.tagName])) { + _$jscoverage['plugins/removeformat.js'][162]++; + tmp = node.parentNode; + _$jscoverage['plugins/removeformat.js'][163]++; + range.setEndBefore(node); + _$jscoverage['plugins/removeformat.js'][164]++; + domUtils.remove(node); + _$jscoverage['plugins/removeformat.js'][166]++; + node = tmp; +} + } +} + _$jscoverage['plugins/removeformat.js'][175]++; + range = this.selection.getRange(); + _$jscoverage['plugins/removeformat.js'][176]++; + doRemove(range); + _$jscoverage['plugins/removeformat.js'][177]++; + range.select(); +})}; +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/rowspacing.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/rowspacing.js new file mode 100644 index 000000000..3d4a37ff9 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/rowspacing.js @@ -0,0 +1,83 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/rowspacing.js']) { + _$jscoverage['plugins/rowspacing.js'] = []; + _$jscoverage['plugins/rowspacing.js'][19] = 0; + _$jscoverage['plugins/rowspacing.js'][20] = 0; + _$jscoverage['plugins/rowspacing.js'][21] = 0; + _$jscoverage['plugins/rowspacing.js'][26] = 0; + _$jscoverage['plugins/rowspacing.js'][28] = 0; + _$jscoverage['plugins/rowspacing.js'][29] = 0; + _$jscoverage['plugins/rowspacing.js'][32] = 0; + _$jscoverage['plugins/rowspacing.js'][35] = 0; + _$jscoverage['plugins/rowspacing.js'][36] = 0; + _$jscoverage['plugins/rowspacing.js'][37] = 0; + _$jscoverage['plugins/rowspacing.js'][39] = 0; +} +_$jscoverage['plugins/rowspacing.js'].source = ["/**"," * 段前段后间距插件"," * @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;",""," }"," };","};","",""]; +_$jscoverage['plugins/rowspacing.js'][19]++; +UE.plugins.rowspacing = (function () { + _$jscoverage['plugins/rowspacing.js'][20]++; + var me = this; + _$jscoverage['plugins/rowspacing.js'][21]++; + me.setOpt({"rowspacingtop": ["5", "10", "15", "20", "25"], "rowspacingbottom": ["5", "10", "15", "20", "25"]}); + _$jscoverage['plugins/rowspacing.js'][26]++; + me.commands.rowspacing = {execCommand: (function (cmdName, value, dir) { + _$jscoverage['plugins/rowspacing.js'][28]++; + this.execCommand("paragraph", "p", {style: ("margin-" + dir + ":" + value + "px")}); + _$jscoverage['plugins/rowspacing.js'][29]++; + return true; +}), queryCommandValue: (function (cmdName, dir) { + _$jscoverage['plugins/rowspacing.js'][32]++; + var pN = domUtils.filterNodeList(this.selection.getStartElementPath(), (function (node) { + _$jscoverage['plugins/rowspacing.js'][32]++; + return domUtils.isBlockElm(node); +})), value; + _$jscoverage['plugins/rowspacing.js'][35]++; + if (pN) { + _$jscoverage['plugins/rowspacing.js'][36]++; + value = domUtils.getComputedStyle(pN, ("margin-" + dir)).replace(/[^\d]/g, ""); + _$jscoverage['plugins/rowspacing.js'][37]++; + return ((! value)? 0: value); + } + _$jscoverage['plugins/rowspacing.js'][39]++; + return 0; +})}; +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/scrawl.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/scrawl.js new file mode 100644 index 000000000..62c528f16 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/scrawl.js @@ -0,0 +1,50 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/scrawl.js']) { + _$jscoverage['plugins/scrawl.js'] = []; + _$jscoverage['plugins/scrawl.js'][17] = 0; + _$jscoverage['plugins/scrawl.js'][19] = 0; +} +_$jscoverage['plugins/scrawl.js'].source = ["/**"," * 涂鸦"," * @file"," * @since 1.2.6.1"," */","","/*"," * 涂鸦浏览器判断"," * @command scrawl"," * @method queryCommandState"," * @return { Int } ie8下返回-1,反之返回0"," * @example"," * ```javascript"," * editor.queryCommandState( 'scrawl' );"," * ```"," */","UE.commands['scrawl'] = {"," queryCommandState : function(){"," return ( browser.ie && browser.version <= 8 ) ? -1 :0;"," }","};"]; +_$jscoverage['plugins/scrawl.js'][17]++; +UE.commands.scrawl = {queryCommandState: (function () { + _$jscoverage['plugins/scrawl.js'][19]++; + return ((browser.ie && (browser.version <= 8))? -1: 0); +})}; diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/searchreplace.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/searchreplace.js new file mode 100644 index 000000000..4129d8216 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/searchreplace.js @@ -0,0 +1,405 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/searchreplace.js']) { + _$jscoverage['plugins/searchreplace.js'] = []; + _$jscoverage['plugins/searchreplace.js'][10] = 0; + _$jscoverage['plugins/searchreplace.js'][12] = 0; + _$jscoverage['plugins/searchreplace.js'][15] = 0; + _$jscoverage['plugins/searchreplace.js'][16] = 0; + _$jscoverage['plugins/searchreplace.js'][17] = 0; + _$jscoverage['plugins/searchreplace.js'][19] = 0; + _$jscoverage['plugins/searchreplace.js'][21] = 0; + _$jscoverage['plugins/searchreplace.js'][31] = 0; + _$jscoverage['plugins/searchreplace.js'][32] = 0; + _$jscoverage['plugins/searchreplace.js'][33] = 0; + _$jscoverage['plugins/searchreplace.js'][34] = 0; + _$jscoverage['plugins/searchreplace.js'][35] = 0; + _$jscoverage['plugins/searchreplace.js'][37] = 0; + _$jscoverage['plugins/searchreplace.js'][38] = 0; + _$jscoverage['plugins/searchreplace.js'][39] = 0; + _$jscoverage['plugins/searchreplace.js'][40] = 0; + _$jscoverage['plugins/searchreplace.js'][41] = 0; + _$jscoverage['plugins/searchreplace.js'][42] = 0; + _$jscoverage['plugins/searchreplace.js'][43] = 0; + _$jscoverage['plugins/searchreplace.js'][44] = 0; + _$jscoverage['plugins/searchreplace.js'][46] = 0; + _$jscoverage['plugins/searchreplace.js'][50] = 0; + _$jscoverage['plugins/searchreplace.js'][51] = 0; + _$jscoverage['plugins/searchreplace.js'][52] = 0; + _$jscoverage['plugins/searchreplace.js'][55] = 0; + _$jscoverage['plugins/searchreplace.js'][57] = 0; + _$jscoverage['plugins/searchreplace.js'][58] = 0; + _$jscoverage['plugins/searchreplace.js'][60] = 0; + _$jscoverage['plugins/searchreplace.js'][61] = 0; + _$jscoverage['plugins/searchreplace.js'][62] = 0; + _$jscoverage['plugins/searchreplace.js'][64] = 0; + _$jscoverage['plugins/searchreplace.js'][65] = 0; + _$jscoverage['plugins/searchreplace.js'][68] = 0; + _$jscoverage['plugins/searchreplace.js'][69] = 0; + _$jscoverage['plugins/searchreplace.js'][70] = 0; + _$jscoverage['plugins/searchreplace.js'][71] = 0; + _$jscoverage['plugins/searchreplace.js'][72] = 0; + _$jscoverage['plugins/searchreplace.js'][73] = 0; + _$jscoverage['plugins/searchreplace.js'][75] = 0; + _$jscoverage['plugins/searchreplace.js'][77] = 0; + _$jscoverage['plugins/searchreplace.js'][78] = 0; + _$jscoverage['plugins/searchreplace.js'][79] = 0; + _$jscoverage['plugins/searchreplace.js'][80] = 0; + _$jscoverage['plugins/searchreplace.js'][83] = 0; + _$jscoverage['plugins/searchreplace.js'][84] = 0; + _$jscoverage['plugins/searchreplace.js'][85] = 0; + _$jscoverage['plugins/searchreplace.js'][90] = 0; + _$jscoverage['plugins/searchreplace.js'][91] = 0; + _$jscoverage['plugins/searchreplace.js'][92] = 0; + _$jscoverage['plugins/searchreplace.js'][93] = 0; + _$jscoverage['plugins/searchreplace.js'][94] = 0; + _$jscoverage['plugins/searchreplace.js'][95] = 0; + _$jscoverage['plugins/searchreplace.js'][97] = 0; + _$jscoverage['plugins/searchreplace.js'][98] = 0; + _$jscoverage['plugins/searchreplace.js'][99] = 0; + _$jscoverage['plugins/searchreplace.js'][102] = 0; + _$jscoverage['plugins/searchreplace.js'][103] = 0; + _$jscoverage['plugins/searchreplace.js'][104] = 0; + _$jscoverage['plugins/searchreplace.js'][105] = 0; + _$jscoverage['plugins/searchreplace.js'][108] = 0; + _$jscoverage['plugins/searchreplace.js'][109] = 0; + _$jscoverage['plugins/searchreplace.js'][112] = 0; + _$jscoverage['plugins/searchreplace.js'][113] = 0; + _$jscoverage['plugins/searchreplace.js'][114] = 0; + _$jscoverage['plugins/searchreplace.js'][116] = 0; + _$jscoverage['plugins/searchreplace.js'][119] = 0; + _$jscoverage['plugins/searchreplace.js'][120] = 0; + _$jscoverage['plugins/searchreplace.js'][126] = 0; + _$jscoverage['plugins/searchreplace.js'][127] = 0; + _$jscoverage['plugins/searchreplace.js'][128] = 0; + _$jscoverage['plugins/searchreplace.js'][129] = 0; + _$jscoverage['plugins/searchreplace.js'][131] = 0; + _$jscoverage['plugins/searchreplace.js'][135] = 0; + _$jscoverage['plugins/searchreplace.js'][136] = 0; + _$jscoverage['plugins/searchreplace.js'][138] = 0; + _$jscoverage['plugins/searchreplace.js'][139] = 0; + _$jscoverage['plugins/searchreplace.js'][140] = 0; + _$jscoverage['plugins/searchreplace.js'][142] = 0; + _$jscoverage['plugins/searchreplace.js'][144] = 0; + _$jscoverage['plugins/searchreplace.js'][146] = 0; + _$jscoverage['plugins/searchreplace.js'][147] = 0; + _$jscoverage['plugins/searchreplace.js'][148] = 0; + _$jscoverage['plugins/searchreplace.js'][150] = 0; + _$jscoverage['plugins/searchreplace.js'][151] = 0; + _$jscoverage['plugins/searchreplace.js'][153] = 0; + _$jscoverage['plugins/searchreplace.js'][154] = 0; + _$jscoverage['plugins/searchreplace.js'][155] = 0; + _$jscoverage['plugins/searchreplace.js'][157] = 0; + _$jscoverage['plugins/searchreplace.js'][158] = 0; + _$jscoverage['plugins/searchreplace.js'][159] = 0; + _$jscoverage['plugins/searchreplace.js'][160] = 0; + _$jscoverage['plugins/searchreplace.js'][162] = 0; + _$jscoverage['plugins/searchreplace.js'][163] = 0; + _$jscoverage['plugins/searchreplace.js'][164] = 0; + _$jscoverage['plugins/searchreplace.js'][166] = 0; + _$jscoverage['plugins/searchreplace.js'][167] = 0; + _$jscoverage['plugins/searchreplace.js'][168] = 0; + _$jscoverage['plugins/searchreplace.js'][169] = 0; + _$jscoverage['plugins/searchreplace.js'][170] = 0; + _$jscoverage['plugins/searchreplace.js'][171] = 0; + _$jscoverage['plugins/searchreplace.js'][174] = 0; + _$jscoverage['plugins/searchreplace.js'][176] = 0; + _$jscoverage['plugins/searchreplace.js'][177] = 0; + _$jscoverage['plugins/searchreplace.js'][178] = 0; + _$jscoverage['plugins/searchreplace.js'][183] = 0; +} +_$jscoverage['plugins/searchreplace.js'].source = ["///import core","///commands 查找替换","///commandsName SearchReplace","///commandsTitle 查询替换","///commandsDialog dialogs\\searchreplace","/*"," * @description 查找替换"," * @author zhanyi"," */","UE.plugins['searchreplace'] = function(){",""," var currentRange,"," first,"," me = this;"," me.addListener('reset',function(){"," currentRange = null;"," first = null;"," });"," me.commands['searchreplace'] = {"," execCommand : function(cmdName,opt){"," var me = this,"," sel = me.selection,"," range,"," nativeRange,"," num = 0,"," opt = utils.extend(opt,{"," all : false,"," casesensitive : false,"," dir : 1"," },true);"," var searchStr = opt.searchStr;"," if(browser.ie){"," me.focus();"," while(1){"," var tmpRange;",""," nativeRange = me.document.selection.createRange();"," tmpRange = nativeRange.duplicate();"," tmpRange.moveToElementText(me.document.body);"," if(opt.all){"," first = 0;"," opt.dir = 1;"," if(currentRange){"," tmpRange.setEndPoint(opt.dir == -1 ? 'EndToStart' : 'StartToEnd',currentRange);"," }else{"," tmpRange.moveToElementText(me.document.body);"," }",""," }else{"," tmpRange.setEndPoint(opt.dir == -1 ? 'EndToStart' : 'StartToEnd',nativeRange);"," if(opt.hasOwnProperty(\"replaceStr\")){"," tmpRange.setEndPoint(opt.dir == -1 ? 'StartToEnd' : 'EndToStart',nativeRange);"," }"," }"," nativeRange = tmpRange.duplicate();",""," if(/^\\/[^/]+\\/\\w*$/.test(opt.searchStr)){"," var str = tmpRange.text,"," reg = new RegExp(opt.searchStr.replace(/^\\/|\\/\\w*$/g,''),'g' + (opt.casesensitive ? '':'i'));"," var match = str.match(reg);"," if(match && match.length){"," searchStr = opt.dir < 0 ? match[match.length -1] : match[0];"," }else{"," currentRange = null;"," return num;"," }"," }"," if(!tmpRange.findText(searchStr,opt.dir,opt.casesensitive ? 4 : 0)){"," currentRange = null;"," tmpRange = me.document.selection.createRange();"," tmpRange.scrollIntoView();"," currentRange = null;"," return num;"," }"," tmpRange.select();"," //替换"," if(opt.hasOwnProperty(\"replaceStr\")){"," range = sel.getRange();"," range.deleteContents().insertNode(range.document.createTextNode(opt.replaceStr)).select();"," currentRange = sel.getNative().createRange();",""," }"," num++;"," if(!opt.all){"," break;"," }"," }"," }else{",""," var w = me.window,nativeSel = sel.getNative();"," while(1){"," if(opt.all){"," if(currentRange){"," currentRange.collapse(false);"," nativeRange = currentRange;"," }else{"," nativeRange = me.document.createRange();"," nativeRange.setStart(me.document.body,0);"," nativeRange.collapse(true);"," }",""," nativeSel.removeAllRanges();"," nativeSel.addRange( nativeRange );"," first = 0;"," opt.dir = 1;"," }else{"," //safari弹出层,原生已经找不到range了,所以需要先选回来,再取原生"," if(browser.safari){"," me.selection.getRange().select();",""," }"," var nativeSel = w.getSelection();"," if(!nativeSel.rangeCount){"," nativeRange = currentRange || me._bakNativeRange;"," }else{"," nativeRange = nativeSel.getRangeAt(0);"," }",""," if(opt.hasOwnProperty(\"replaceStr\")){"," nativeRange.collapse(opt.dir == 1 ? true : false);"," }"," }",""," //如果是第一次并且海选中了内容那就要清除,为find做准备",""," if(!first){"," nativeRange.collapse( opt.dir <0 ? true : false);"," nativeSel.removeAllRanges();"," nativeSel.addRange( nativeRange );"," }else{"," nativeSel.removeAllRanges();"," }"," //是正则查找",""," if(/^\\/[^/]+\\/\\w*$/.test(opt.searchStr)){"," var tmpRange = nativeRange.cloneRange();"," //向前查找"," if(opt.dir < 0 ){"," nativeRange.collapse(true);"," nativeRange.setStart(me.body,0);"," }else{"," nativeRange.setEnd(me.body,me.body.childNodes.length);"," }"," var str = nativeRange + '',"," reg = new RegExp(opt.searchStr.replace(/^\\/|\\/\\w*$/g,''),'g' + (opt.casesensitive ? '':'i'));"," var match = str.match(reg);"," if(match && match.length){"," searchStr = opt.dir < 0 ? match[match.length -1] : match[0];"," }else{"," currentRange = null;"," return num;"," }"," nativeSel.removeAllRanges();"," nativeRange = tmpRange;"," nativeSel.addRange(nativeRange);"," }"," if(!w.find(searchStr,opt.casesensitive,opt.dir < 0 ? true : false) ) {"," currentRange = null;"," nativeSel.removeAllRanges();"," return num;"," }"," first = 0;"," range = w.getSelection().getRangeAt(0);"," if(!range.collapsed){",""," if(opt.hasOwnProperty(\"replaceStr\")){"," range.deleteContents();"," var text = w.document.createTextNode(opt.replaceStr);"," range.insertNode(text);"," range.selectNode(text);"," nativeSel.addRange(range);",""," }"," currentRange = range.cloneRange();"," }"," num++;"," if(!opt.all){"," break;"," }"," }",""," }"," return true;"," }"," };","","};"]; +_$jscoverage['plugins/searchreplace.js'][10]++; +UE.plugins.searchreplace = (function () { + _$jscoverage['plugins/searchreplace.js'][12]++; + var currentRange, first, me = this; + _$jscoverage['plugins/searchreplace.js'][15]++; + me.addListener("reset", (function () { + _$jscoverage['plugins/searchreplace.js'][16]++; + currentRange = null; + _$jscoverage['plugins/searchreplace.js'][17]++; + first = null; +})); + _$jscoverage['plugins/searchreplace.js'][19]++; + me.commands.searchreplace = {execCommand: (function (cmdName, opt) { + _$jscoverage['plugins/searchreplace.js'][21]++; + var me = this, sel = me.selection, range, nativeRange, num = 0, opt = utils.extend(opt, {all: false, casesensitive: false, dir: 1}, true); + _$jscoverage['plugins/searchreplace.js'][31]++; + var searchStr = opt.searchStr; + _$jscoverage['plugins/searchreplace.js'][32]++; + if (browser.ie) { + _$jscoverage['plugins/searchreplace.js'][33]++; + me.focus(); + _$jscoverage['plugins/searchreplace.js'][34]++; + while (true) { + _$jscoverage['plugins/searchreplace.js'][35]++; + var tmpRange; + _$jscoverage['plugins/searchreplace.js'][37]++; + nativeRange = me.document.selection.createRange(); + _$jscoverage['plugins/searchreplace.js'][38]++; + tmpRange = nativeRange.duplicate(); + _$jscoverage['plugins/searchreplace.js'][39]++; + tmpRange.moveToElementText(me.document.body); + _$jscoverage['plugins/searchreplace.js'][40]++; + if (opt.all) { + _$jscoverage['plugins/searchreplace.js'][41]++; + first = 0; + _$jscoverage['plugins/searchreplace.js'][42]++; + opt.dir = 1; + _$jscoverage['plugins/searchreplace.js'][43]++; + if (currentRange) { + _$jscoverage['plugins/searchreplace.js'][44]++; + tmpRange.setEndPoint(((opt.dir == -1)? "EndToStart": "StartToEnd"), currentRange); + } + else { + _$jscoverage['plugins/searchreplace.js'][46]++; + tmpRange.moveToElementText(me.document.body); + } + } + else { + _$jscoverage['plugins/searchreplace.js'][50]++; + tmpRange.setEndPoint(((opt.dir == -1)? "EndToStart": "StartToEnd"), nativeRange); + _$jscoverage['plugins/searchreplace.js'][51]++; + if (opt.hasOwnProperty("replaceStr")) { + _$jscoverage['plugins/searchreplace.js'][52]++; + tmpRange.setEndPoint(((opt.dir == -1)? "StartToEnd": "EndToStart"), nativeRange); + } + } + _$jscoverage['plugins/searchreplace.js'][55]++; + nativeRange = tmpRange.duplicate(); + _$jscoverage['plugins/searchreplace.js'][57]++; + if (/^\/[^/]+\/\w*$/.test(opt.searchStr)) { + _$jscoverage['plugins/searchreplace.js'][58]++; + var str = tmpRange.text, reg = new RegExp(opt.searchStr.replace(/^\/|\/\w*$/g, ""), ("g" + (opt.casesensitive? "": "i"))); + _$jscoverage['plugins/searchreplace.js'][60]++; + var match = str.match(reg); + _$jscoverage['plugins/searchreplace.js'][61]++; + if ((match && match.length)) { + _$jscoverage['plugins/searchreplace.js'][62]++; + searchStr = ((opt.dir < 0)? match[(match.length - 1)]: match[0]); + } + else { + _$jscoverage['plugins/searchreplace.js'][64]++; + currentRange = null; + _$jscoverage['plugins/searchreplace.js'][65]++; + return num; + } + } + _$jscoverage['plugins/searchreplace.js'][68]++; + if ((! tmpRange.findText(searchStr, opt.dir, (opt.casesensitive? 4: 0)))) { + _$jscoverage['plugins/searchreplace.js'][69]++; + currentRange = null; + _$jscoverage['plugins/searchreplace.js'][70]++; + tmpRange = me.document.selection.createRange(); + _$jscoverage['plugins/searchreplace.js'][71]++; + tmpRange.scrollIntoView(); + _$jscoverage['plugins/searchreplace.js'][72]++; + currentRange = null; + _$jscoverage['plugins/searchreplace.js'][73]++; + return num; + } + _$jscoverage['plugins/searchreplace.js'][75]++; + tmpRange.select(); + _$jscoverage['plugins/searchreplace.js'][77]++; + if (opt.hasOwnProperty("replaceStr")) { + _$jscoverage['plugins/searchreplace.js'][78]++; + range = sel.getRange(); + _$jscoverage['plugins/searchreplace.js'][79]++; + range.deleteContents().insertNode(range.document.createTextNode(opt.replaceStr)).select(); + _$jscoverage['plugins/searchreplace.js'][80]++; + currentRange = sel.getNative().createRange(); + } + _$jscoverage['plugins/searchreplace.js'][83]++; + (num++); + _$jscoverage['plugins/searchreplace.js'][84]++; + if ((! opt.all)) { + _$jscoverage['plugins/searchreplace.js'][85]++; + break; + } +} + } + else { + _$jscoverage['plugins/searchreplace.js'][90]++; + var w = me.window, nativeSel = sel.getNative(); + _$jscoverage['plugins/searchreplace.js'][91]++; + while (true) { + _$jscoverage['plugins/searchreplace.js'][92]++; + if (opt.all) { + _$jscoverage['plugins/searchreplace.js'][93]++; + if (currentRange) { + _$jscoverage['plugins/searchreplace.js'][94]++; + currentRange.collapse(false); + _$jscoverage['plugins/searchreplace.js'][95]++; + nativeRange = currentRange; + } + else { + _$jscoverage['plugins/searchreplace.js'][97]++; + nativeRange = me.document.createRange(); + _$jscoverage['plugins/searchreplace.js'][98]++; + nativeRange.setStart(me.document.body, 0); + _$jscoverage['plugins/searchreplace.js'][99]++; + nativeRange.collapse(true); + } + _$jscoverage['plugins/searchreplace.js'][102]++; + nativeSel.removeAllRanges(); + _$jscoverage['plugins/searchreplace.js'][103]++; + nativeSel.addRange(nativeRange); + _$jscoverage['plugins/searchreplace.js'][104]++; + first = 0; + _$jscoverage['plugins/searchreplace.js'][105]++; + opt.dir = 1; + } + else { + _$jscoverage['plugins/searchreplace.js'][108]++; + if (browser.safari) { + _$jscoverage['plugins/searchreplace.js'][109]++; + me.selection.getRange().select(); + } + _$jscoverage['plugins/searchreplace.js'][112]++; + var nativeSel = w.getSelection(); + _$jscoverage['plugins/searchreplace.js'][113]++; + if ((! nativeSel.rangeCount)) { + _$jscoverage['plugins/searchreplace.js'][114]++; + nativeRange = (currentRange || me._bakNativeRange); + } + else { + _$jscoverage['plugins/searchreplace.js'][116]++; + nativeRange = nativeSel.getRangeAt(0); + } + _$jscoverage['plugins/searchreplace.js'][119]++; + if (opt.hasOwnProperty("replaceStr")) { + _$jscoverage['plugins/searchreplace.js'][120]++; + nativeRange.collapse(((opt.dir == 1)? true: false)); + } + } + _$jscoverage['plugins/searchreplace.js'][126]++; + if ((! first)) { + _$jscoverage['plugins/searchreplace.js'][127]++; + nativeRange.collapse(((opt.dir < 0)? true: false)); + _$jscoverage['plugins/searchreplace.js'][128]++; + nativeSel.removeAllRanges(); + _$jscoverage['plugins/searchreplace.js'][129]++; + nativeSel.addRange(nativeRange); + } + else { + _$jscoverage['plugins/searchreplace.js'][131]++; + nativeSel.removeAllRanges(); + } + _$jscoverage['plugins/searchreplace.js'][135]++; + if (/^\/[^/]+\/\w*$/.test(opt.searchStr)) { + _$jscoverage['plugins/searchreplace.js'][136]++; + var tmpRange = nativeRange.cloneRange(); + _$jscoverage['plugins/searchreplace.js'][138]++; + if ((opt.dir < 0)) { + _$jscoverage['plugins/searchreplace.js'][139]++; + nativeRange.collapse(true); + _$jscoverage['plugins/searchreplace.js'][140]++; + nativeRange.setStart(me.body, 0); + } + else { + _$jscoverage['plugins/searchreplace.js'][142]++; + nativeRange.setEnd(me.body, me.body.childNodes.length); + } + _$jscoverage['plugins/searchreplace.js'][144]++; + var str = (nativeRange + ""), reg = new RegExp(opt.searchStr.replace(/^\/|\/\w*$/g, ""), ("g" + (opt.casesensitive? "": "i"))); + _$jscoverage['plugins/searchreplace.js'][146]++; + var match = str.match(reg); + _$jscoverage['plugins/searchreplace.js'][147]++; + if ((match && match.length)) { + _$jscoverage['plugins/searchreplace.js'][148]++; + searchStr = ((opt.dir < 0)? match[(match.length - 1)]: match[0]); + } + else { + _$jscoverage['plugins/searchreplace.js'][150]++; + currentRange = null; + _$jscoverage['plugins/searchreplace.js'][151]++; + return num; + } + _$jscoverage['plugins/searchreplace.js'][153]++; + nativeSel.removeAllRanges(); + _$jscoverage['plugins/searchreplace.js'][154]++; + nativeRange = tmpRange; + _$jscoverage['plugins/searchreplace.js'][155]++; + nativeSel.addRange(nativeRange); + } + _$jscoverage['plugins/searchreplace.js'][157]++; + if ((! w.find(searchStr, opt.casesensitive, ((opt.dir < 0)? true: false)))) { + _$jscoverage['plugins/searchreplace.js'][158]++; + currentRange = null; + _$jscoverage['plugins/searchreplace.js'][159]++; + nativeSel.removeAllRanges(); + _$jscoverage['plugins/searchreplace.js'][160]++; + return num; + } + _$jscoverage['plugins/searchreplace.js'][162]++; + first = 0; + _$jscoverage['plugins/searchreplace.js'][163]++; + range = w.getSelection().getRangeAt(0); + _$jscoverage['plugins/searchreplace.js'][164]++; + if ((! range.collapsed)) { + _$jscoverage['plugins/searchreplace.js'][166]++; + if (opt.hasOwnProperty("replaceStr")) { + _$jscoverage['plugins/searchreplace.js'][167]++; + range.deleteContents(); + _$jscoverage['plugins/searchreplace.js'][168]++; + var text = w.document.createTextNode(opt.replaceStr); + _$jscoverage['plugins/searchreplace.js'][169]++; + range.insertNode(text); + _$jscoverage['plugins/searchreplace.js'][170]++; + range.selectNode(text); + _$jscoverage['plugins/searchreplace.js'][171]++; + nativeSel.addRange(range); + } + _$jscoverage['plugins/searchreplace.js'][174]++; + currentRange = range.cloneRange(); + } + _$jscoverage['plugins/searchreplace.js'][176]++; + (num++); + _$jscoverage['plugins/searchreplace.js'][177]++; + if ((! opt.all)) { + _$jscoverage['plugins/searchreplace.js'][178]++; + break; + } +} + } + _$jscoverage['plugins/searchreplace.js'][183]++; + return true; +})}; +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/selectall.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/selectall.js new file mode 100644 index 000000000..a59fe08d2 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/selectall.js @@ -0,0 +1,80 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/selectall.js']) { + _$jscoverage['plugins/selectall.js'] = []; + _$jscoverage['plugins/selectall.js'][17] = 0; + _$jscoverage['plugins/selectall.js'][18] = 0; + _$jscoverage['plugins/selectall.js'][19] = 0; + _$jscoverage['plugins/selectall.js'][22] = 0; + _$jscoverage['plugins/selectall.js'][24] = 0; + _$jscoverage['plugins/selectall.js'][25] = 0; + _$jscoverage['plugins/selectall.js'][27] = 0; + _$jscoverage['plugins/selectall.js'][28] = 0; + _$jscoverage['plugins/selectall.js'][30] = 0; + _$jscoverage['plugins/selectall.js'][32] = 0; + _$jscoverage['plugins/selectall.js'][39] = 0; +} +_$jscoverage['plugins/selectall.js'].source = ["/**"," * 全选"," * @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\""," });","};"]; +_$jscoverage['plugins/selectall.js'][17]++; +UE.plugins.selectall = (function () { + _$jscoverage['plugins/selectall.js'][18]++; + var me = this; + _$jscoverage['plugins/selectall.js'][19]++; + me.commands.selectall = {execCommand: (function () { + _$jscoverage['plugins/selectall.js'][22]++; + var me = this, body = me.body, range = me.selection.getRange(); + _$jscoverage['plugins/selectall.js'][24]++; + range.selectNodeContents(body); + _$jscoverage['plugins/selectall.js'][25]++; + if (domUtils.isEmptyBlock(body)) { + _$jscoverage['plugins/selectall.js'][27]++; + if ((browser.opera && body.firstChild && (body.firstChild.nodeType == 1))) { + _$jscoverage['plugins/selectall.js'][28]++; + range.setStartAtFirst(body.firstChild); + } + _$jscoverage['plugins/selectall.js'][30]++; + range.collapse(true); + } + _$jscoverage['plugins/selectall.js'][32]++; + range.select(true); +}), notNeedUndo: 1}; + _$jscoverage['plugins/selectall.js'][39]++; + me.addshortcutkey({"selectAll": "ctrl+65"}); +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/shortcutmenu.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/shortcutmenu.js new file mode 100644 index 000000000..1f728c1db --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/shortcutmenu.js @@ -0,0 +1,145 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/shortcutmenu.js']) { + _$jscoverage['plugins/shortcutmenu.js'] = []; + _$jscoverage['plugins/shortcutmenu.js'][12] = 0; + _$jscoverage['plugins/shortcutmenu.js'][13] = 0; + _$jscoverage['plugins/shortcutmenu.js'][17] = 0; + _$jscoverage['plugins/shortcutmenu.js'][18] = 0; + _$jscoverage['plugins/shortcutmenu.js'][21] = 0; + _$jscoverage['plugins/shortcutmenu.js'][22] = 0; + _$jscoverage['plugins/shortcutmenu.js'][32] = 0; + _$jscoverage['plugins/shortcutmenu.js'][33] = 0; + _$jscoverage['plugins/shortcutmenu.js'][34] = 0; + _$jscoverage['plugins/shortcutmenu.js'][36] = 0; + _$jscoverage['plugins/shortcutmenu.js'][37] = 0; + _$jscoverage['plugins/shortcutmenu.js'][44] = 0; + _$jscoverage['plugins/shortcutmenu.js'][45] = 0; + _$jscoverage['plugins/shortcutmenu.js'][48] = 0; + _$jscoverage['plugins/shortcutmenu.js'][52] = 0; + _$jscoverage['plugins/shortcutmenu.js'][53] = 0; + _$jscoverage['plugins/shortcutmenu.js'][54] = 0; + _$jscoverage['plugins/shortcutmenu.js'][55] = 0; + _$jscoverage['plugins/shortcutmenu.js'][56] = 0; + _$jscoverage['plugins/shortcutmenu.js'][57] = 0; + _$jscoverage['plugins/shortcutmenu.js'][59] = 0; + _$jscoverage['plugins/shortcutmenu.js'][61] = 0; + _$jscoverage['plugins/shortcutmenu.js'][62] = 0; + _$jscoverage['plugins/shortcutmenu.js'][63] = 0; + _$jscoverage['plugins/shortcutmenu.js'][69] = 0; + _$jscoverage['plugins/shortcutmenu.js'][70] = 0; + _$jscoverage['plugins/shortcutmenu.js'][74] = 0; + _$jscoverage['plugins/shortcutmenu.js'][75] = 0; + _$jscoverage['plugins/shortcutmenu.js'][76] = 0; +} +_$jscoverage['plugins/shortcutmenu.js'].source = ["///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.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);",""," }"," }"," }",""," if (type == \"keydown\") {"," menu && !menu.isHidden && menu.hide ();"," }"," });",""," me.addListener ('keydown' , function (type) {"," if (type == \"keydown\") {"," menu && !menu.isHidden && menu.hide ();"," }",""," });","","};","",""]; +_$jscoverage['plugins/shortcutmenu.js'][12]++; +UE.plugins.shortcutmenu = (function () { + _$jscoverage['plugins/shortcutmenu.js'][13]++; + var me = this, menu, items = (me.options.shortcutMenu || []); + _$jscoverage['plugins/shortcutmenu.js'][17]++; + if ((! items.length)) { + _$jscoverage['plugins/shortcutmenu.js'][18]++; + return; + } + _$jscoverage['plugins/shortcutmenu.js'][21]++; + me.addListener("contextmenu mouseup", (function (type, e) { + _$jscoverage['plugins/shortcutmenu.js'][22]++; + var me = this, customEvt = {type: type, target: (e.target || e.srcElement), screenX: e.screenX, screenY: e.screenY, clientX: e.clientX, clientY: e.clientY}; + _$jscoverage['plugins/shortcutmenu.js'][32]++; + setTimeout((function () { + _$jscoverage['plugins/shortcutmenu.js'][33]++; + var rng = me.selection.getRange(); + _$jscoverage['plugins/shortcutmenu.js'][34]++; + if (((rng.collapsed === false) || (type == "contextmenu"))) { + _$jscoverage['plugins/shortcutmenu.js'][36]++; + if ((! menu)) { + _$jscoverage['plugins/shortcutmenu.js'][37]++; + menu = new (baidu.editor.ui.ShortCutMenu)({editor: me, items: items, theme: me.options.theme, className: "edui-shortcutmenu"}); + _$jscoverage['plugins/shortcutmenu.js'][44]++; + menu.render(); + _$jscoverage['plugins/shortcutmenu.js'][45]++; + me.fireEvent("afterrendershortcutmenu", menu); + } + _$jscoverage['plugins/shortcutmenu.js'][48]++; + menu.show(customEvt, (! (! UE.plugins.contextmenu))); + } +})); + _$jscoverage['plugins/shortcutmenu.js'][52]++; + if ((type == "contextmenu")) { + _$jscoverage['plugins/shortcutmenu.js'][53]++; + domUtils.preventDefault(e); + _$jscoverage['plugins/shortcutmenu.js'][54]++; + if (browser.ie) { + _$jscoverage['plugins/shortcutmenu.js'][55]++; + var ieRange; + _$jscoverage['plugins/shortcutmenu.js'][56]++; + try { + _$jscoverage['plugins/shortcutmenu.js'][57]++; + ieRange = me.selection.getNative().createRange(); + } + catch (e) { + _$jscoverage['plugins/shortcutmenu.js'][59]++; + return; + } + _$jscoverage['plugins/shortcutmenu.js'][61]++; + if (ieRange.item) { + _$jscoverage['plugins/shortcutmenu.js'][62]++; + var range = new (dom.Range)(me.document); + _$jscoverage['plugins/shortcutmenu.js'][63]++; + range.selectNode(ieRange.item(0)).select(true, true); + } + } + } + _$jscoverage['plugins/shortcutmenu.js'][69]++; + if ((type == "keydown")) { + _$jscoverage['plugins/shortcutmenu.js'][70]++; + (menu && (! menu.isHidden) && menu.hide()); + } +})); + _$jscoverage['plugins/shortcutmenu.js'][74]++; + me.addListener("keydown", (function (type) { + _$jscoverage['plugins/shortcutmenu.js'][75]++; + if ((type == "keydown")) { + _$jscoverage['plugins/shortcutmenu.js'][76]++; + (menu && (! menu.isHidden) && menu.hide()); + } +})); +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/snapscreen.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/snapscreen.js new file mode 100644 index 000000000..11e252cb1 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/snapscreen.js @@ -0,0 +1,173 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/snapscreen.js']) { + _$jscoverage['plugins/snapscreen.js'] = []; + _$jscoverage['plugins/snapscreen.js'][20] = 0; + _$jscoverage['plugins/snapscreen.js'][21] = 0; + _$jscoverage['plugins/snapscreen.js'][25] = 0; + _$jscoverage['plugins/snapscreen.js'][31] = 0; + _$jscoverage['plugins/snapscreen.js'][33] = 0; + _$jscoverage['plugins/snapscreen.js'][34] = 0; + _$jscoverage['plugins/snapscreen.js'][35] = 0; + _$jscoverage['plugins/snapscreen.js'][36] = 0; + _$jscoverage['plugins/snapscreen.js'][37] = 0; + _$jscoverage['plugins/snapscreen.js'][38] = 0; + _$jscoverage['plugins/snapscreen.js'][39] = 0; + _$jscoverage['plugins/snapscreen.js'][41] = 0; + _$jscoverage['plugins/snapscreen.js'][42] = 0; + _$jscoverage['plugins/snapscreen.js'][43] = 0; + _$jscoverage['plugins/snapscreen.js'][44] = 0; + _$jscoverage['plugins/snapscreen.js'][48] = 0; + _$jscoverage['plugins/snapscreen.js'][50] = 0; + _$jscoverage['plugins/snapscreen.js'][51] = 0; + _$jscoverage['plugins/snapscreen.js'][52] = 0; + _$jscoverage['plugins/snapscreen.js'][54] = 0; + _$jscoverage['plugins/snapscreen.js'][55] = 0; + _$jscoverage['plugins/snapscreen.js'][58] = 0; + _$jscoverage['plugins/snapscreen.js'][59] = 0; + _$jscoverage['plugins/snapscreen.js'][60] = 0; + _$jscoverage['plugins/snapscreen.js'][62] = 0; + _$jscoverage['plugins/snapscreen.js'][68] = 0; + _$jscoverage['plugins/snapscreen.js'][71] = 0; + _$jscoverage['plugins/snapscreen.js'][72] = 0; + _$jscoverage['plugins/snapscreen.js'][74] = 0; + _$jscoverage['plugins/snapscreen.js'][75] = 0; + _$jscoverage['plugins/snapscreen.js'][76] = 0; + _$jscoverage['plugins/snapscreen.js'][77] = 0; + _$jscoverage['plugins/snapscreen.js'][78] = 0; + _$jscoverage['plugins/snapscreen.js'][79] = 0; + _$jscoverage['plugins/snapscreen.js'][81] = 0; + _$jscoverage['plugins/snapscreen.js'][82] = 0; + _$jscoverage['plugins/snapscreen.js'][84] = 0; +} +_$jscoverage['plugins/snapscreen.js'].source = ["/**"," * 截屏"," * @file"," * @since 1.2.6.1"," */","","/**"," * 截屏"," * @command snapscreen"," * @method execCommand"," * @param { String } cmd 命令字符串"," * @example"," * ```javascript"," * //editor是编辑器实例"," * //执行截屏命令, 需要服务器端配合接收图片"," * editor.execCommand( 'snapscreen' );"," * ```"," */","","UE.plugins['snapscreen'] = function(){"," var me = this,"," doc,"," snapplugin;",""," me.setOpt({"," snapscreenServerPort: location.port //屏幕截图的server端端口"," ,snapscreenImgAlign: '' //截图的图片默认的排版方式"," ,snapscreenHost: location.hostname //屏幕截图的server端文件所在的网站地址或者ip,请不要加http://",""," });"," me.commands['snapscreen'] = {"," execCommand: function(){"," var me = this,lang = me.getLang(\"snapScreen_plugin\");"," if(!snapplugin){"," var container = me.container;"," doc = container.ownerDocument || container.document;"," snapplugin = doc.createElement(\"object\");"," try{snapplugin.type = \"application/x-pluginbaidusnap\";}catch(e){"," return;"," }"," snapplugin.style.cssText = \"position:absolute;left:-9999px;\";"," snapplugin.setAttribute(\"width\",\"0\");"," snapplugin.setAttribute(\"height\",\"0\");"," container.appendChild(snapplugin);"," }","",""," var editorOptions = me.options;",""," var onSuccess = function(rs){"," try{"," rs = eval(\"(\"+ rs +\")\");"," }catch(e){"," alert(lang.callBackErrorMsg);"," return;"," }",""," if(rs.state != 'SUCCESS'){"," alert(rs.state);"," return;"," }"," me.execCommand('insertimage', {"," src: editorOptions.snapscreenPath + rs.url,"," floatStyle: editorOptions.snapscreenImgAlign,"," _src:editorOptions.snapscreenPath + rs.url"," });"," };"," var onStartUpload = function(){"," //开始截图上传"," };"," var onError = function(){"," alert(lang.uploadErrorMsg);"," };"," try{"," var port = editorOptions.snapscreenServerPort + '';"," editorOptions.snapscreenServerUrl = editorOptions.snapscreenServerUrl.split( editorOptions.snapscreenHost );"," editorOptions.snapscreenServerUrl = editorOptions.snapscreenServerUrl[1] || editorOptions.snapscreenServerUrl[0];"," if( editorOptions.snapscreenServerUrl.indexOf(\":\"+port) === 0 ) {"," editorOptions.snapscreenServerUrl = editorOptions.snapscreenServerUrl.substring( port.length+1 );"," }"," var ret =snapplugin.saveSnapshot(editorOptions.snapscreenHost, editorOptions.snapscreenServerUrl, port);"," onSuccess(ret);"," }catch(e){"," me.ui._dialogs['snapscreenDialog'].open();"," }"," }"," };","}",""]; +_$jscoverage['plugins/snapscreen.js'][20]++; +UE.plugins.snapscreen = (function () { + _$jscoverage['plugins/snapscreen.js'][21]++; + var me = this, doc, snapplugin; + _$jscoverage['plugins/snapscreen.js'][25]++; + me.setOpt({snapscreenServerPort: location.port, snapscreenImgAlign: "", snapscreenHost: location.hostname}); + _$jscoverage['plugins/snapscreen.js'][31]++; + me.commands.snapscreen = {execCommand: (function () { + _$jscoverage['plugins/snapscreen.js'][33]++; + var me = this, lang = me.getLang("snapScreen_plugin"); + _$jscoverage['plugins/snapscreen.js'][34]++; + if ((! snapplugin)) { + _$jscoverage['plugins/snapscreen.js'][35]++; + var container = me.container; + _$jscoverage['plugins/snapscreen.js'][36]++; + doc = (container.ownerDocument || container.document); + _$jscoverage['plugins/snapscreen.js'][37]++; + snapplugin = doc.createElement("object"); + _$jscoverage['plugins/snapscreen.js'][38]++; + try { + _$jscoverage['plugins/snapscreen.js'][38]++; + snapplugin.type = "application/x-pluginbaidusnap"; + } + catch (e) { + _$jscoverage['plugins/snapscreen.js'][39]++; + return; + } + _$jscoverage['plugins/snapscreen.js'][41]++; + snapplugin.style.cssText = "position:absolute;left:-9999px;"; + _$jscoverage['plugins/snapscreen.js'][42]++; + snapplugin.setAttribute("width", "0"); + _$jscoverage['plugins/snapscreen.js'][43]++; + snapplugin.setAttribute("height", "0"); + _$jscoverage['plugins/snapscreen.js'][44]++; + container.appendChild(snapplugin); + } + _$jscoverage['plugins/snapscreen.js'][48]++; + var editorOptions = me.options; + _$jscoverage['plugins/snapscreen.js'][50]++; + var onSuccess = (function (rs) { + _$jscoverage['plugins/snapscreen.js'][51]++; + try { + _$jscoverage['plugins/snapscreen.js'][52]++; + rs = eval(("(" + rs + ")")); + } + catch (e) { + _$jscoverage['plugins/snapscreen.js'][54]++; + alert(lang.callBackErrorMsg); + _$jscoverage['plugins/snapscreen.js'][55]++; + return; + } + _$jscoverage['plugins/snapscreen.js'][58]++; + if ((rs.state != "SUCCESS")) { + _$jscoverage['plugins/snapscreen.js'][59]++; + alert(rs.state); + _$jscoverage['plugins/snapscreen.js'][60]++; + return; + } + _$jscoverage['plugins/snapscreen.js'][62]++; + me.execCommand("insertimage", {src: (editorOptions.snapscreenPath + rs.url), floatStyle: editorOptions.snapscreenImgAlign, _src: (editorOptions.snapscreenPath + rs.url)}); +}); + _$jscoverage['plugins/snapscreen.js'][68]++; + var onStartUpload = (function () { +}); + _$jscoverage['plugins/snapscreen.js'][71]++; + var onError = (function () { + _$jscoverage['plugins/snapscreen.js'][72]++; + alert(lang.uploadErrorMsg); +}); + _$jscoverage['plugins/snapscreen.js'][74]++; + try { + _$jscoverage['plugins/snapscreen.js'][75]++; + var port = (editorOptions.snapscreenServerPort + ""); + _$jscoverage['plugins/snapscreen.js'][76]++; + editorOptions.snapscreenServerUrl = editorOptions.snapscreenServerUrl.split(editorOptions.snapscreenHost); + _$jscoverage['plugins/snapscreen.js'][77]++; + editorOptions.snapscreenServerUrl = (editorOptions.snapscreenServerUrl[1] || editorOptions.snapscreenServerUrl[0]); + _$jscoverage['plugins/snapscreen.js'][78]++; + if ((editorOptions.snapscreenServerUrl.indexOf((":" + port)) === 0)) { + _$jscoverage['plugins/snapscreen.js'][79]++; + editorOptions.snapscreenServerUrl = editorOptions.snapscreenServerUrl.substring((port.length + 1)); + } + _$jscoverage['plugins/snapscreen.js'][81]++; + var ret = snapplugin.saveSnapshot(editorOptions.snapscreenHost, editorOptions.snapscreenServerUrl, port); + _$jscoverage['plugins/snapscreen.js'][82]++; + onSuccess(ret); + } + catch (e) { + _$jscoverage['plugins/snapscreen.js'][84]++; + me.ui._dialogs.snapscreenDialog.open(); + } +})}; +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/source.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/source.js new file mode 100644 index 000000000..a67509153 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/source.js @@ -0,0 +1,476 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/source.js']) { + _$jscoverage['plugins/source.js'] = []; + _$jscoverage['plugins/source.js'][7] = 0; + _$jscoverage['plugins/source.js'][8] = 0; + _$jscoverage['plugins/source.js'][10] = 0; + _$jscoverage['plugins/source.js'][11] = 0; + _$jscoverage['plugins/source.js'][13] = 0; + _$jscoverage['plugins/source.js'][14] = 0; + _$jscoverage['plugins/source.js'][15] = 0; + _$jscoverage['plugins/source.js'][16] = 0; + _$jscoverage['plugins/source.js'][17] = 0; + _$jscoverage['plugins/source.js'][18] = 0; + _$jscoverage['plugins/source.js'][21] = 0; + _$jscoverage['plugins/source.js'][22] = 0; + _$jscoverage['plugins/source.js'][24] = 0; + _$jscoverage['plugins/source.js'][27] = 0; + _$jscoverage['plugins/source.js'][30] = 0; + _$jscoverage['plugins/source.js'][31] = 0; + _$jscoverage['plugins/source.js'][32] = 0; + _$jscoverage['plugins/source.js'][33] = 0; + _$jscoverage['plugins/source.js'][34] = 0; + _$jscoverage['plugins/source.js'][37] = 0; + _$jscoverage['plugins/source.js'][38] = 0; + _$jscoverage['plugins/source.js'][42] = 0; + _$jscoverage['plugins/source.js'][44] = 0; + _$jscoverage['plugins/source.js'][45] = 0; + _$jscoverage['plugins/source.js'][46] = 0; + _$jscoverage['plugins/source.js'][52] = 0; + _$jscoverage['plugins/source.js'][58] = 0; + _$jscoverage['plugins/source.js'][59] = 0; + _$jscoverage['plugins/source.js'][60] = 0; + _$jscoverage['plugins/source.js'][61] = 0; + _$jscoverage['plugins/source.js'][62] = 0; + _$jscoverage['plugins/source.js'][64] = 0; + _$jscoverage['plugins/source.js'][67] = 0; + _$jscoverage['plugins/source.js'][70] = 0; + _$jscoverage['plugins/source.js'][73] = 0; + _$jscoverage['plugins/source.js'][76] = 0; + _$jscoverage['plugins/source.js'][77] = 0; + _$jscoverage['plugins/source.js'][78] = 0; + _$jscoverage['plugins/source.js'][84] = 0; + _$jscoverage['plugins/source.js'][85] = 0; + _$jscoverage['plugins/source.js'][86] = 0; + _$jscoverage['plugins/source.js'][87] = 0; + _$jscoverage['plugins/source.js'][88] = 0; + _$jscoverage['plugins/source.js'][90] = 0; + _$jscoverage['plugins/source.js'][92] = 0; + _$jscoverage['plugins/source.js'][95] = 0; + _$jscoverage['plugins/source.js'][96] = 0; + _$jscoverage['plugins/source.js'][99] = 0; + _$jscoverage['plugins/source.js'][101] = 0; + _$jscoverage['plugins/source.js'][127] = 0; + _$jscoverage['plugins/source.js'][130] = 0; + _$jscoverage['plugins/source.js'][131] = 0; + _$jscoverage['plugins/source.js'][132] = 0; + _$jscoverage['plugins/source.js'][133] = 0; + _$jscoverage['plugins/source.js'][134] = 0; + _$jscoverage['plugins/source.js'][135] = 0; + _$jscoverage['plugins/source.js'][138] = 0; + _$jscoverage['plugins/source.js'][139] = 0; + _$jscoverage['plugins/source.js'][142] = 0; + _$jscoverage['plugins/source.js'][143] = 0; + _$jscoverage['plugins/source.js'][144] = 0; + _$jscoverage['plugins/source.js'][145] = 0; + _$jscoverage['plugins/source.js'][146] = 0; + _$jscoverage['plugins/source.js'][147] = 0; + _$jscoverage['plugins/source.js'][151] = 0; + _$jscoverage['plugins/source.js'][152] = 0; + _$jscoverage['plugins/source.js'][153] = 0; + _$jscoverage['plugins/source.js'][155] = 0; + _$jscoverage['plugins/source.js'][156] = 0; + _$jscoverage['plugins/source.js'][158] = 0; + _$jscoverage['plugins/source.js'][164] = 0; + _$jscoverage['plugins/source.js'][166] = 0; + _$jscoverage['plugins/source.js'][168] = 0; + _$jscoverage['plugins/source.js'][170] = 0; + _$jscoverage['plugins/source.js'][171] = 0; + _$jscoverage['plugins/source.js'][172] = 0; + _$jscoverage['plugins/source.js'][173] = 0; + _$jscoverage['plugins/source.js'][174] = 0; + _$jscoverage['plugins/source.js'][175] = 0; + _$jscoverage['plugins/source.js'][180] = 0; + _$jscoverage['plugins/source.js'][181] = 0; + _$jscoverage['plugins/source.js'][184] = 0; + _$jscoverage['plugins/source.js'][185] = 0; + _$jscoverage['plugins/source.js'][187] = 0; + _$jscoverage['plugins/source.js'][188] = 0; + _$jscoverage['plugins/source.js'][189] = 0; + _$jscoverage['plugins/source.js'][191] = 0; + _$jscoverage['plugins/source.js'][193] = 0; + _$jscoverage['plugins/source.js'][194] = 0; + _$jscoverage['plugins/source.js'][195] = 0; + _$jscoverage['plugins/source.js'][197] = 0; + _$jscoverage['plugins/source.js'][198] = 0; + _$jscoverage['plugins/source.js'][200] = 0; + _$jscoverage['plugins/source.js'][201] = 0; + _$jscoverage['plugins/source.js'][202] = 0; + _$jscoverage['plugins/source.js'][206] = 0; + _$jscoverage['plugins/source.js'][208] = 0; + _$jscoverage['plugins/source.js'][210] = 0; + _$jscoverage['plugins/source.js'][211] = 0; + _$jscoverage['plugins/source.js'][213] = 0; + _$jscoverage['plugins/source.js'][215] = 0; + _$jscoverage['plugins/source.js'][216] = 0; + _$jscoverage['plugins/source.js'][217] = 0; + _$jscoverage['plugins/source.js'][218] = 0; + _$jscoverage['plugins/source.js'][219] = 0; + _$jscoverage['plugins/source.js'][220] = 0; + _$jscoverage['plugins/source.js'][221] = 0; + _$jscoverage['plugins/source.js'][222] = 0; + _$jscoverage['plugins/source.js'][228] = 0; + _$jscoverage['plugins/source.js'][229] = 0; + _$jscoverage['plugins/source.js'][234] = 0; + _$jscoverage['plugins/source.js'][237] = 0; + _$jscoverage['plugins/source.js'][241] = 0; + _$jscoverage['plugins/source.js'][243] = 0; + _$jscoverage['plugins/source.js'][244] = 0; + _$jscoverage['plugins/source.js'][245] = 0; + _$jscoverage['plugins/source.js'][247] = 0; + _$jscoverage['plugins/source.js'][252] = 0; + _$jscoverage['plugins/source.js'][255] = 0; + _$jscoverage['plugins/source.js'][257] = 0; + _$jscoverage['plugins/source.js'][258] = 0; + _$jscoverage['plugins/source.js'][264] = 0; + _$jscoverage['plugins/source.js'][265] = 0; + _$jscoverage['plugins/source.js'][266] = 0; + _$jscoverage['plugins/source.js'][270] = 0; +} +_$jscoverage['plugins/source.js'].source = ["/**"," * 源码编辑插件"," * @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;"," }"," };"," },"," 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;"," }"," };"," }"," };",""," UE.plugins['source'] = function (){"," var me = this;"," var opt = this.options;"," var sourceMode = false;"," var sourceEditor;",""," 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 = me.getContent,"," 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(/&nbsp;/g,' '))",""," }"," }"," });",""," me.fireEvent('aftergetcontent');",""," var content = root.toHtml(true);",""," sourceEditor = createSourceEditor(me.iframe.parentNode);",""," sourceEditor.setContent(content);"," setTimeout(function (){"," sourceEditor.select();"," me.addListener('fullscreenchanged', function(){"," try{"," sourceEditor.getCodeMirror().refresh()"," }catch(e){}"," });"," });"," //重置getContent,源码模式下取值也能是最新的数据"," me.getContent = function (){"," return sourceEditor.getContent() || '<p>' + (browser.ie ? '' : '<br/>')+'</p>';"," };"," } else {"," me.iframe.style.cssText = bakCssText;"," var cont = sourceEditor.getContent() || '<p>' + (browser.ie ? '' : '<br/>')+'</p>';"," //处理掉block节点前后的空格,有可能会误命中,暂时不考虑"," cont = cont.replace(new RegExp('[\\\\r\\\\t\\\\n ]*<\\/?(\\\\w+)\\\\s*(?:[^>]*)>','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(cont);"," sourceEditor.dispose();"," sourceEditor = null;"," //还原getContent方法"," me.getContent = oldGetContent;"," var first = me.body.firstChild;"," //trace:1106 都删除空了,下边会报错,所以补充一个p占位"," if(!first){"," me.body.innerHTML = '<p>'+(browser.ie?'':'<br/>')+'</p>';"," 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\""," });",""," });"," }",""," };","","})();"]; +_$jscoverage['plugins/source.js'][7]++; +(function () { + _$jscoverage['plugins/source.js'][8]++; + var sourceEditors = {textarea: (function (editor, holder) { + _$jscoverage['plugins/source.js'][10]++; + var textarea = holder.ownerDocument.createElement("textarea"); + _$jscoverage['plugins/source.js'][11]++; + textarea.style.cssText = "position:absolute;resize:none;width:100%;height:100%;border:0;padding:0;margin:0;overflow-y:auto;"; + _$jscoverage['plugins/source.js'][13]++; + if ((browser.ie && (browser.version < 8))) { + _$jscoverage['plugins/source.js'][14]++; + textarea.style.width = (holder.offsetWidth + "px"); + _$jscoverage['plugins/source.js'][15]++; + textarea.style.height = (holder.offsetHeight + "px"); + _$jscoverage['plugins/source.js'][16]++; + holder.onresize = (function () { + _$jscoverage['plugins/source.js'][17]++; + textarea.style.width = (holder.offsetWidth + "px"); + _$jscoverage['plugins/source.js'][18]++; + textarea.style.height = (holder.offsetHeight + "px"); +}); + } + _$jscoverage['plugins/source.js'][21]++; + holder.appendChild(textarea); + _$jscoverage['plugins/source.js'][22]++; + return ({setContent: (function (content) { + _$jscoverage['plugins/source.js'][24]++; + textarea.value = content; +}), getContent: (function () { + _$jscoverage['plugins/source.js'][27]++; + return textarea.value; +}), select: (function () { + _$jscoverage['plugins/source.js'][30]++; + var range; + _$jscoverage['plugins/source.js'][31]++; + if (browser.ie) { + _$jscoverage['plugins/source.js'][32]++; + range = textarea.createTextRange(); + _$jscoverage['plugins/source.js'][33]++; + range.collapse(true); + _$jscoverage['plugins/source.js'][34]++; + range.select(); + } + else { + _$jscoverage['plugins/source.js'][37]++; + textarea.setSelectionRange(0, 0); + _$jscoverage['plugins/source.js'][38]++; + textarea.focus(); + } +}), dispose: (function () { + _$jscoverage['plugins/source.js'][42]++; + holder.removeChild(textarea); + _$jscoverage['plugins/source.js'][44]++; + holder.onresize = null; + _$jscoverage['plugins/source.js'][45]++; + textarea = null; + _$jscoverage['plugins/source.js'][46]++; + holder = null; +})}); +}), codemirror: (function (editor, holder) { + _$jscoverage['plugins/source.js'][52]++; + var codeEditor = window.CodeMirror(holder, {mode: "text/html", tabMode: "indent", lineNumbers: true, lineWrapping: true}); + _$jscoverage['plugins/source.js'][58]++; + var dom = codeEditor.getWrapperElement(); + _$jscoverage['plugins/source.js'][59]++; + dom.style.cssText = "position:absolute;left:0;top:0;width:100%;height:100%;font-family:consolas,\"Courier new\",monospace;font-size:13px;"; + _$jscoverage['plugins/source.js'][60]++; + codeEditor.getScrollerElement().style.cssText = "position:absolute;left:0;top:0;width:100%;height:100%;"; + _$jscoverage['plugins/source.js'][61]++; + codeEditor.refresh(); + _$jscoverage['plugins/source.js'][62]++; + return ({getCodeMirror: (function () { + _$jscoverage['plugins/source.js'][64]++; + return codeEditor; +}), setContent: (function (content) { + _$jscoverage['plugins/source.js'][67]++; + codeEditor.setValue(content); +}), getContent: (function () { + _$jscoverage['plugins/source.js'][70]++; + return codeEditor.getValue(); +}), select: (function () { + _$jscoverage['plugins/source.js'][73]++; + codeEditor.focus(); +}), dispose: (function () { + _$jscoverage['plugins/source.js'][76]++; + holder.removeChild(dom); + _$jscoverage['plugins/source.js'][77]++; + dom = null; + _$jscoverage['plugins/source.js'][78]++; + codeEditor = null; +})}); +})}; + _$jscoverage['plugins/source.js'][84]++; + UE.plugins.source = (function () { + _$jscoverage['plugins/source.js'][85]++; + var me = this; + _$jscoverage['plugins/source.js'][86]++; + var opt = this.options; + _$jscoverage['plugins/source.js'][87]++; + var sourceMode = false; + _$jscoverage['plugins/source.js'][88]++; + var sourceEditor; + _$jscoverage['plugins/source.js'][90]++; + opt.sourceEditor = (browser.ie? "textarea": (opt.sourceEditor || "codemirror")); + _$jscoverage['plugins/source.js'][92]++; + me.setOpt({sourceEditorFirst: false}); + _$jscoverage['plugins/source.js'][95]++; + function createSourceEditor(holder) { + _$jscoverage['plugins/source.js'][96]++; + return (sourceEditors[(((opt.sourceEditor == "codemirror") && window.CodeMirror)? "codemirror": "textarea")])(me, holder); +} + _$jscoverage['plugins/source.js'][99]++; + var bakCssText; + _$jscoverage['plugins/source.js'][101]++; + var oldGetContent = me.getContent, bakAddress; + _$jscoverage['plugins/source.js'][127]++; + me.commands.source = {execCommand: (function () { + _$jscoverage['plugins/source.js'][130]++; + sourceMode = (! sourceMode); + _$jscoverage['plugins/source.js'][131]++; + if (sourceMode) { + _$jscoverage['plugins/source.js'][132]++; + bakAddress = me.selection.getRange().createAddress(false, true); + _$jscoverage['plugins/source.js'][133]++; + (me.undoManger && me.undoManger.save(true)); + _$jscoverage['plugins/source.js'][134]++; + if (browser.gecko) { + _$jscoverage['plugins/source.js'][135]++; + me.body.contentEditable = false; + } + _$jscoverage['plugins/source.js'][138]++; + bakCssText = me.iframe.style.cssText; + _$jscoverage['plugins/source.js'][139]++; + me.iframe.style.cssText += "position:absolute;left:-32768px;top:-32768px;"; + _$jscoverage['plugins/source.js'][142]++; + me.fireEvent("beforegetcontent"); + _$jscoverage['plugins/source.js'][143]++; + var root = UE.htmlparser(me.body.innerHTML); + _$jscoverage['plugins/source.js'][144]++; + me.filterOutputRule(root); + _$jscoverage['plugins/source.js'][145]++; + root.traversal((function (node) { + _$jscoverage['plugins/source.js'][146]++; + if ((node.type == "element")) { + _$jscoverage['plugins/source.js'][147]++; + switch (node.tagName) { + case "td": + case "th": + case "caption": + _$jscoverage['plugins/source.js'][151]++; + if ((node.children && (node.children.length == 1))) { + _$jscoverage['plugins/source.js'][152]++; + if ((node.firstChild().tagName == "br")) { + _$jscoverage['plugins/source.js'][153]++; + node.removeChild(node.firstChild()); + } + } + _$jscoverage['plugins/source.js'][155]++; + ; + _$jscoverage['plugins/source.js'][156]++; + break; + case "pre": + _$jscoverage['plugins/source.js'][158]++; + node.innerText(node.innerText().replace(/ /g, " ")); + } + } +})); + _$jscoverage['plugins/source.js'][164]++; + me.fireEvent("aftergetcontent"); + _$jscoverage['plugins/source.js'][166]++; + var content = root.toHtml(true); + _$jscoverage['plugins/source.js'][168]++; + sourceEditor = createSourceEditor(me.iframe.parentNode); + _$jscoverage['plugins/source.js'][170]++; + sourceEditor.setContent(content); + _$jscoverage['plugins/source.js'][171]++; + setTimeout((function () { + _$jscoverage['plugins/source.js'][172]++; + sourceEditor.select(); + _$jscoverage['plugins/source.js'][173]++; + me.addListener("fullscreenchanged", (function () { + _$jscoverage['plugins/source.js'][174]++; + try { + _$jscoverage['plugins/source.js'][175]++; + sourceEditor.getCodeMirror().refresh(); + } + catch (e) { + } +})); +})); + _$jscoverage['plugins/source.js'][180]++; + me.getContent = (function () { + _$jscoverage['plugins/source.js'][181]++; + return (sourceEditor.getContent() || ("

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

    ")); +}); + } + else { + _$jscoverage['plugins/source.js'][184]++; + me.iframe.style.cssText = bakCssText; + _$jscoverage['plugins/source.js'][185]++; + var cont = (sourceEditor.getContent() || ("

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

    ")); + _$jscoverage['plugins/source.js'][187]++; + cont = cont.replace(new RegExp("[\\r\\t\\n ]*]*)>", "g"), (function (a, b) { + _$jscoverage['plugins/source.js'][188]++; + if ((b && (! dtd.$inlineWithA[b.toLowerCase()]))) { + _$jscoverage['plugins/source.js'][189]++; + return a.replace(/(^[\n\r\t ]*)|([\n\r\t ]*$)/g, ""); + } + _$jscoverage['plugins/source.js'][191]++; + return a.replace(/(^[\n\r\t]*)|([\n\r\t]*$)/g, ""); +})); + _$jscoverage['plugins/source.js'][193]++; + me.setContent(cont); + _$jscoverage['plugins/source.js'][194]++; + sourceEditor.dispose(); + _$jscoverage['plugins/source.js'][195]++; + sourceEditor = null; + _$jscoverage['plugins/source.js'][197]++; + me.getContent = oldGetContent; + _$jscoverage['plugins/source.js'][198]++; + var first = me.body.firstChild; + _$jscoverage['plugins/source.js'][200]++; + if ((! first)) { + _$jscoverage['plugins/source.js'][201]++; + me.body.innerHTML = ("

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

    "); + _$jscoverage['plugins/source.js'][202]++; + first = me.body.firstChild; + } + _$jscoverage['plugins/source.js'][206]++; + (me.undoManger && me.undoManger.save(true)); + _$jscoverage['plugins/source.js'][208]++; + if (browser.gecko) { + _$jscoverage['plugins/source.js'][210]++; + var input = document.createElement("input"); + _$jscoverage['plugins/source.js'][211]++; + input.style.cssText = "position:absolute;left:0;top:-32768px"; + _$jscoverage['plugins/source.js'][213]++; + document.body.appendChild(input); + _$jscoverage['plugins/source.js'][215]++; + me.body.contentEditable = false; + _$jscoverage['plugins/source.js'][216]++; + setTimeout((function () { + _$jscoverage['plugins/source.js'][217]++; + domUtils.setViewportOffset(input, {left: -32768, top: 0}); + _$jscoverage['plugins/source.js'][218]++; + input.focus(); + _$jscoverage['plugins/source.js'][219]++; + setTimeout((function () { + _$jscoverage['plugins/source.js'][220]++; + me.body.contentEditable = true; + _$jscoverage['plugins/source.js'][221]++; + me.selection.getRange().moveToAddress(bakAddress).select(true); + _$jscoverage['plugins/source.js'][222]++; + domUtils.remove(input); +})); +})); + } + else { + _$jscoverage['plugins/source.js'][228]++; + try { + _$jscoverage['plugins/source.js'][229]++; + me.selection.getRange().moveToAddress(bakAddress).select(true); + } + catch (e) { + } + } + } + _$jscoverage['plugins/source.js'][234]++; + this.fireEvent("sourcemodechanged", sourceMode); +}), queryCommandState: (function () { + _$jscoverage['plugins/source.js'][237]++; + return (sourceMode | 0); +}), notNeedUndo: 1}; + _$jscoverage['plugins/source.js'][241]++; + var oldQueryCommandState = me.queryCommandState; + _$jscoverage['plugins/source.js'][243]++; + me.queryCommandState = (function (cmdName) { + _$jscoverage['plugins/source.js'][244]++; + cmdName = cmdName.toLowerCase(); + _$jscoverage['plugins/source.js'][245]++; + if (sourceMode) { + _$jscoverage['plugins/source.js'][247]++; + return ((cmdName in {"source": 1, "fullscreen": 1})? 1: -1); + } + _$jscoverage['plugins/source.js'][252]++; + return oldQueryCommandState.apply(this, arguments); +}); + _$jscoverage['plugins/source.js'][255]++; + if ((opt.sourceEditor == "codemirror")) { + _$jscoverage['plugins/source.js'][257]++; + me.addListener("ready", (function () { + _$jscoverage['plugins/source.js'][258]++; + utils.loadFile(document, {src: (opt.codeMirrorJsUrl || (opt.UEDITOR_HOME_URL + "third-party/codemirror/codemirror.js")), tag: "script", type: "text/javascript", defer: "defer"}, (function () { + _$jscoverage['plugins/source.js'][264]++; + if (opt.sourceEditorFirst) { + _$jscoverage['plugins/source.js'][265]++; + setTimeout((function () { + _$jscoverage['plugins/source.js'][266]++; + me.execCommand("source"); +}), 0); + } +})); + _$jscoverage['plugins/source.js'][270]++; + 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/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/table.action.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/table.action.js new file mode 100644 index 000000000..f42a061c2 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/table.action.js @@ -0,0 +1,3173 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/table.action.js']) { + _$jscoverage['plugins/table.action.js'] = []; + _$jscoverage['plugins/table.action.js'][8] = 0; + _$jscoverage['plugins/table.action.js'][9] = 0; + _$jscoverage['plugins/table.action.js'][29] = 0; + _$jscoverage['plugins/table.action.js'][32] = 0; + _$jscoverage['plugins/table.action.js'][35] = 0; + _$jscoverage['plugins/table.action.js'][38] = 0; + _$jscoverage['plugins/table.action.js'][41] = 0; + _$jscoverage['plugins/table.action.js'][44] = 0; + _$jscoverage['plugins/table.action.js'][45] = 0; + _$jscoverage['plugins/table.action.js'][46] = 0; + _$jscoverage['plugins/table.action.js'][47] = 0; + _$jscoverage['plugins/table.action.js'][48] = 0; + _$jscoverage['plugins/table.action.js'][49] = 0; + _$jscoverage['plugins/table.action.js'][50] = 0; + _$jscoverage['plugins/table.action.js'][51] = 0; + _$jscoverage['plugins/table.action.js'][52] = 0; + _$jscoverage['plugins/table.action.js'][54] = 0; + _$jscoverage['plugins/table.action.js'][56] = 0; + _$jscoverage['plugins/table.action.js'][63] = 0; + _$jscoverage['plugins/table.action.js'][72] = 0; + _$jscoverage['plugins/table.action.js'][76] = 0; + _$jscoverage['plugins/table.action.js'][86] = 0; + _$jscoverage['plugins/table.action.js'][87] = 0; + _$jscoverage['plugins/table.action.js'][115] = 0; + _$jscoverage['plugins/table.action.js'][116] = 0; + _$jscoverage['plugins/table.action.js'][128] = 0; + _$jscoverage['plugins/table.action.js'][130] = 0; + _$jscoverage['plugins/table.action.js'][131] = 0; + _$jscoverage['plugins/table.action.js'][132] = 0; + _$jscoverage['plugins/table.action.js'][134] = 0; + _$jscoverage['plugins/table.action.js'][136] = 0; + _$jscoverage['plugins/table.action.js'][137] = 0; + _$jscoverage['plugins/table.action.js'][139] = 0; + _$jscoverage['plugins/table.action.js'][140] = 0; + _$jscoverage['plugins/table.action.js'][141] = 0; + _$jscoverage['plugins/table.action.js'][142] = 0; + _$jscoverage['plugins/table.action.js'][144] = 0; + _$jscoverage['plugins/table.action.js'][146] = 0; + _$jscoverage['plugins/table.action.js'][149] = 0; + _$jscoverage['plugins/table.action.js'][151] = 0; + _$jscoverage['plugins/table.action.js'][152] = 0; + _$jscoverage['plugins/table.action.js'][153] = 0; + _$jscoverage['plugins/table.action.js'][154] = 0; + _$jscoverage['plugins/table.action.js'][155] = 0; + _$jscoverage['plugins/table.action.js'][156] = 0; + _$jscoverage['plugins/table.action.js'][158] = 0; + _$jscoverage['plugins/table.action.js'][163] = 0; + _$jscoverage['plugins/table.action.js'][165] = 0; + _$jscoverage['plugins/table.action.js'][166] = 0; + _$jscoverage['plugins/table.action.js'][167] = 0; + _$jscoverage['plugins/table.action.js'][168] = 0; + _$jscoverage['plugins/table.action.js'][169] = 0; + _$jscoverage['plugins/table.action.js'][171] = 0; + _$jscoverage['plugins/table.action.js'][172] = 0; + _$jscoverage['plugins/table.action.js'][177] = 0; + _$jscoverage['plugins/table.action.js'][179] = 0; + _$jscoverage['plugins/table.action.js'][181] = 0; + _$jscoverage['plugins/table.action.js'][182] = 0; + _$jscoverage['plugins/table.action.js'][183] = 0; + _$jscoverage['plugins/table.action.js'][185] = 0; + _$jscoverage['plugins/table.action.js'][186] = 0; + _$jscoverage['plugins/table.action.js'][188] = 0; + _$jscoverage['plugins/table.action.js'][189] = 0; + _$jscoverage['plugins/table.action.js'][192] = 0; + _$jscoverage['plugins/table.action.js'][193] = 0; + _$jscoverage['plugins/table.action.js'][195] = 0; + _$jscoverage['plugins/table.action.js'][196] = 0; + _$jscoverage['plugins/table.action.js'][197] = 0; + _$jscoverage['plugins/table.action.js'][198] = 0; + _$jscoverage['plugins/table.action.js'][201] = 0; + _$jscoverage['plugins/table.action.js'][202] = 0; + _$jscoverage['plugins/table.action.js'][203] = 0; + _$jscoverage['plugins/table.action.js'][204] = 0; + _$jscoverage['plugins/table.action.js'][205] = 0; + _$jscoverage['plugins/table.action.js'][213] = 0; + _$jscoverage['plugins/table.action.js'][214] = 0; + _$jscoverage['plugins/table.action.js'][215] = 0; + _$jscoverage['plugins/table.action.js'][216] = 0; + _$jscoverage['plugins/table.action.js'][217] = 0; + _$jscoverage['plugins/table.action.js'][218] = 0; + _$jscoverage['plugins/table.action.js'][219] = 0; + _$jscoverage['plugins/table.action.js'][220] = 0; + _$jscoverage['plugins/table.action.js'][223] = 0; + _$jscoverage['plugins/table.action.js'][224] = 0; + _$jscoverage['plugins/table.action.js'][225] = 0; + _$jscoverage['plugins/table.action.js'][227] = 0; + _$jscoverage['plugins/table.action.js'][234] = 0; + _$jscoverage['plugins/table.action.js'][235] = 0; + _$jscoverage['plugins/table.action.js'][236] = 0; + _$jscoverage['plugins/table.action.js'][239] = 0; + _$jscoverage['plugins/table.action.js'][240] = 0; + _$jscoverage['plugins/table.action.js'][241] = 0; + _$jscoverage['plugins/table.action.js'][242] = 0; + _$jscoverage['plugins/table.action.js'][243] = 0; + _$jscoverage['plugins/table.action.js'][244] = 0; + _$jscoverage['plugins/table.action.js'][245] = 0; + _$jscoverage['plugins/table.action.js'][246] = 0; + _$jscoverage['plugins/table.action.js'][248] = 0; + _$jscoverage['plugins/table.action.js'][249] = 0; + _$jscoverage['plugins/table.action.js'][250] = 0; + _$jscoverage['plugins/table.action.js'][251] = 0; + _$jscoverage['plugins/table.action.js'][252] = 0; + _$jscoverage['plugins/table.action.js'][253] = 0; + _$jscoverage['plugins/table.action.js'][254] = 0; + _$jscoverage['plugins/table.action.js'][255] = 0; + _$jscoverage['plugins/table.action.js'][256] = 0; + _$jscoverage['plugins/table.action.js'][257] = 0; + _$jscoverage['plugins/table.action.js'][258] = 0; + _$jscoverage['plugins/table.action.js'][260] = 0; + _$jscoverage['plugins/table.action.js'][261] = 0; + _$jscoverage['plugins/table.action.js'][262] = 0; + _$jscoverage['plugins/table.action.js'][263] = 0; + _$jscoverage['plugins/table.action.js'][264] = 0; + _$jscoverage['plugins/table.action.js'][265] = 0; + _$jscoverage['plugins/table.action.js'][267] = 0; + _$jscoverage['plugins/table.action.js'][268] = 0; + _$jscoverage['plugins/table.action.js'][269] = 0; + _$jscoverage['plugins/table.action.js'][270] = 0; + _$jscoverage['plugins/table.action.js'][271] = 0; + _$jscoverage['plugins/table.action.js'][273] = 0; + _$jscoverage['plugins/table.action.js'][274] = 0; + _$jscoverage['plugins/table.action.js'][275] = 0; + _$jscoverage['plugins/table.action.js'][276] = 0; + _$jscoverage['plugins/table.action.js'][277] = 0; + _$jscoverage['plugins/table.action.js'][278] = 0; + _$jscoverage['plugins/table.action.js'][279] = 0; + _$jscoverage['plugins/table.action.js'][280] = 0; + _$jscoverage['plugins/table.action.js'][284] = 0; + _$jscoverage['plugins/table.action.js'][285] = 0; + _$jscoverage['plugins/table.action.js'][286] = 0; + _$jscoverage['plugins/table.action.js'][287] = 0; + _$jscoverage['plugins/table.action.js'][288] = 0; + _$jscoverage['plugins/table.action.js'][290] = 0; + _$jscoverage['plugins/table.action.js'][291] = 0; + _$jscoverage['plugins/table.action.js'][292] = 0; + _$jscoverage['plugins/table.action.js'][294] = 0; + _$jscoverage['plugins/table.action.js'][295] = 0; + _$jscoverage['plugins/table.action.js'][296] = 0; + _$jscoverage['plugins/table.action.js'][297] = 0; + _$jscoverage['plugins/table.action.js'][300] = 0; + _$jscoverage['plugins/table.action.js'][301] = 0; + _$jscoverage['plugins/table.action.js'][302] = 0; + _$jscoverage['plugins/table.action.js'][303] = 0; + _$jscoverage['plugins/table.action.js'][304] = 0; + _$jscoverage['plugins/table.action.js'][306] = 0; + _$jscoverage['plugins/table.action.js'][307] = 0; + _$jscoverage['plugins/table.action.js'][308] = 0; + _$jscoverage['plugins/table.action.js'][309] = 0; + _$jscoverage['plugins/table.action.js'][310] = 0; + _$jscoverage['plugins/table.action.js'][311] = 0; + _$jscoverage['plugins/table.action.js'][313] = 0; + _$jscoverage['plugins/table.action.js'][314] = 0; + _$jscoverage['plugins/table.action.js'][316] = 0; + _$jscoverage['plugins/table.action.js'][319] = 0; + _$jscoverage['plugins/table.action.js'][320] = 0; + _$jscoverage['plugins/table.action.js'][321] = 0; + _$jscoverage['plugins/table.action.js'][322] = 0; + _$jscoverage['plugins/table.action.js'][323] = 0; + _$jscoverage['plugins/table.action.js'][324] = 0; + _$jscoverage['plugins/table.action.js'][325] = 0; + _$jscoverage['plugins/table.action.js'][326] = 0; + _$jscoverage['plugins/table.action.js'][330] = 0; + _$jscoverage['plugins/table.action.js'][332] = 0; + _$jscoverage['plugins/table.action.js'][333] = 0; + _$jscoverage['plugins/table.action.js'][334] = 0; + _$jscoverage['plugins/table.action.js'][335] = 0; + _$jscoverage['plugins/table.action.js'][336] = 0; + _$jscoverage['plugins/table.action.js'][337] = 0; + _$jscoverage['plugins/table.action.js'][338] = 0; + _$jscoverage['plugins/table.action.js'][340] = 0; + _$jscoverage['plugins/table.action.js'][341] = 0; + _$jscoverage['plugins/table.action.js'][345] = 0; + _$jscoverage['plugins/table.action.js'][348] = 0; + _$jscoverage['plugins/table.action.js'][352] = 0; + _$jscoverage['plugins/table.action.js'][353] = 0; + _$jscoverage['plugins/table.action.js'][354] = 0; + _$jscoverage['plugins/table.action.js'][355] = 0; + _$jscoverage['plugins/table.action.js'][357] = 0; + _$jscoverage['plugins/table.action.js'][358] = 0; + _$jscoverage['plugins/table.action.js'][359] = 0; + _$jscoverage['plugins/table.action.js'][360] = 0; + _$jscoverage['plugins/table.action.js'][361] = 0; + _$jscoverage['plugins/table.action.js'][362] = 0; + _$jscoverage['plugins/table.action.js'][364] = 0; + _$jscoverage['plugins/table.action.js'][365] = 0; + _$jscoverage['plugins/table.action.js'][368] = 0; + _$jscoverage['plugins/table.action.js'][369] = 0; + _$jscoverage['plugins/table.action.js'][370] = 0; + _$jscoverage['plugins/table.action.js'][371] = 0; + _$jscoverage['plugins/table.action.js'][372] = 0; + _$jscoverage['plugins/table.action.js'][373] = 0; + _$jscoverage['plugins/table.action.js'][375] = 0; + _$jscoverage['plugins/table.action.js'][380] = 0; + _$jscoverage['plugins/table.action.js'][384] = 0; + _$jscoverage['plugins/table.action.js'][385] = 0; + _$jscoverage['plugins/table.action.js'][386] = 0; + _$jscoverage['plugins/table.action.js'][387] = 0; + _$jscoverage['plugins/table.action.js'][388] = 0; + _$jscoverage['plugins/table.action.js'][392] = 0; + _$jscoverage['plugins/table.action.js'][393] = 0; + _$jscoverage['plugins/table.action.js'][395] = 0; + _$jscoverage['plugins/table.action.js'][396] = 0; + _$jscoverage['plugins/table.action.js'][397] = 0; + _$jscoverage['plugins/table.action.js'][398] = 0; + _$jscoverage['plugins/table.action.js'][399] = 0; + _$jscoverage['plugins/table.action.js'][401] = 0; + _$jscoverage['plugins/table.action.js'][402] = 0; + _$jscoverage['plugins/table.action.js'][403] = 0; + _$jscoverage['plugins/table.action.js'][404] = 0; + _$jscoverage['plugins/table.action.js'][410] = 0; + _$jscoverage['plugins/table.action.js'][411] = 0; + _$jscoverage['plugins/table.action.js'][417] = 0; + _$jscoverage['plugins/table.action.js'][418] = 0; + _$jscoverage['plugins/table.action.js'][420] = 0; + _$jscoverage['plugins/table.action.js'][421] = 0; + _$jscoverage['plugins/table.action.js'][422] = 0; + _$jscoverage['plugins/table.action.js'][423] = 0; + _$jscoverage['plugins/table.action.js'][424] = 0; + _$jscoverage['plugins/table.action.js'][425] = 0; + _$jscoverage['plugins/table.action.js'][426] = 0; + _$jscoverage['plugins/table.action.js'][427] = 0; + _$jscoverage['plugins/table.action.js'][428] = 0; + _$jscoverage['plugins/table.action.js'][430] = 0; + _$jscoverage['plugins/table.action.js'][431] = 0; + _$jscoverage['plugins/table.action.js'][432] = 0; + _$jscoverage['plugins/table.action.js'][433] = 0; + _$jscoverage['plugins/table.action.js'][437] = 0; + _$jscoverage['plugins/table.action.js'][438] = 0; + _$jscoverage['plugins/table.action.js'][439] = 0; + _$jscoverage['plugins/table.action.js'][440] = 0; + _$jscoverage['plugins/table.action.js'][441] = 0; + _$jscoverage['plugins/table.action.js'][445] = 0; + _$jscoverage['plugins/table.action.js'][446] = 0; + _$jscoverage['plugins/table.action.js'][448] = 0; + _$jscoverage['plugins/table.action.js'][449] = 0; + _$jscoverage['plugins/table.action.js'][450] = 0; + _$jscoverage['plugins/table.action.js'][452] = 0; + _$jscoverage['plugins/table.action.js'][453] = 0; + _$jscoverage['plugins/table.action.js'][454] = 0; + _$jscoverage['plugins/table.action.js'][455] = 0; + _$jscoverage['plugins/table.action.js'][457] = 0; + _$jscoverage['plugins/table.action.js'][458] = 0; + _$jscoverage['plugins/table.action.js'][459] = 0; + _$jscoverage['plugins/table.action.js'][460] = 0; + _$jscoverage['plugins/table.action.js'][461] = 0; + _$jscoverage['plugins/table.action.js'][475] = 0; + _$jscoverage['plugins/table.action.js'][476] = 0; + _$jscoverage['plugins/table.action.js'][477] = 0; + _$jscoverage['plugins/table.action.js'][478] = 0; + _$jscoverage['plugins/table.action.js'][479] = 0; + _$jscoverage['plugins/table.action.js'][480] = 0; + _$jscoverage['plugins/table.action.js'][482] = 0; + _$jscoverage['plugins/table.action.js'][485] = 0; + _$jscoverage['plugins/table.action.js'][486] = 0; + _$jscoverage['plugins/table.action.js'][487] = 0; + _$jscoverage['plugins/table.action.js'][489] = 0; + _$jscoverage['plugins/table.action.js'][492] = 0; + _$jscoverage['plugins/table.action.js'][494] = 0; + _$jscoverage['plugins/table.action.js'][495] = 0; + _$jscoverage['plugins/table.action.js'][496] = 0; + _$jscoverage['plugins/table.action.js'][497] = 0; + _$jscoverage['plugins/table.action.js'][498] = 0; + _$jscoverage['plugins/table.action.js'][499] = 0; + _$jscoverage['plugins/table.action.js'][501] = 0; + _$jscoverage['plugins/table.action.js'][504] = 0; + _$jscoverage['plugins/table.action.js'][505] = 0; + _$jscoverage['plugins/table.action.js'][506] = 0; + _$jscoverage['plugins/table.action.js'][508] = 0; + _$jscoverage['plugins/table.action.js'][515] = 0; + _$jscoverage['plugins/table.action.js'][518] = 0; + _$jscoverage['plugins/table.action.js'][520] = 0; + _$jscoverage['plugins/table.action.js'][521] = 0; + _$jscoverage['plugins/table.action.js'][522] = 0; + _$jscoverage['plugins/table.action.js'][523] = 0; + _$jscoverage['plugins/table.action.js'][529] = 0; + _$jscoverage['plugins/table.action.js'][530] = 0; + _$jscoverage['plugins/table.action.js'][531] = 0; + _$jscoverage['plugins/table.action.js'][535] = 0; + _$jscoverage['plugins/table.action.js'][537] = 0; + _$jscoverage['plugins/table.action.js'][538] = 0; + _$jscoverage['plugins/table.action.js'][541] = 0; + _$jscoverage['plugins/table.action.js'][542] = 0; + _$jscoverage['plugins/table.action.js'][543] = 0; + _$jscoverage['plugins/table.action.js'][547] = 0; + _$jscoverage['plugins/table.action.js'][548] = 0; + _$jscoverage['plugins/table.action.js'][552] = 0; + _$jscoverage['plugins/table.action.js'][553] = 0; + _$jscoverage['plugins/table.action.js'][555] = 0; + _$jscoverage['plugins/table.action.js'][556] = 0; + _$jscoverage['plugins/table.action.js'][559] = 0; + _$jscoverage['plugins/table.action.js'][560] = 0; + _$jscoverage['plugins/table.action.js'][561] = 0; + _$jscoverage['plugins/table.action.js'][563] = 0; + _$jscoverage['plugins/table.action.js'][564] = 0; + _$jscoverage['plugins/table.action.js'][567] = 0; + _$jscoverage['plugins/table.action.js'][568] = 0; + _$jscoverage['plugins/table.action.js'][569] = 0; + _$jscoverage['plugins/table.action.js'][570] = 0; + _$jscoverage['plugins/table.action.js'][571] = 0; + _$jscoverage['plugins/table.action.js'][574] = 0; + _$jscoverage['plugins/table.action.js'][576] = 0; + _$jscoverage['plugins/table.action.js'][577] = 0; + _$jscoverage['plugins/table.action.js'][578] = 0; + _$jscoverage['plugins/table.action.js'][579] = 0; + _$jscoverage['plugins/table.action.js'][580] = 0; + _$jscoverage['plugins/table.action.js'][582] = 0; + _$jscoverage['plugins/table.action.js'][585] = 0; + _$jscoverage['plugins/table.action.js'][586] = 0; + _$jscoverage['plugins/table.action.js'][587] = 0; + _$jscoverage['plugins/table.action.js'][588] = 0; + _$jscoverage['plugins/table.action.js'][589] = 0; + _$jscoverage['plugins/table.action.js'][590] = 0; + _$jscoverage['plugins/table.action.js'][591] = 0; + _$jscoverage['plugins/table.action.js'][594] = 0; + _$jscoverage['plugins/table.action.js'][598] = 0; + _$jscoverage['plugins/table.action.js'][599] = 0; + _$jscoverage['plugins/table.action.js'][601] = 0; + _$jscoverage['plugins/table.action.js'][602] = 0; + _$jscoverage['plugins/table.action.js'][604] = 0; + _$jscoverage['plugins/table.action.js'][605] = 0; + _$jscoverage['plugins/table.action.js'][606] = 0; + _$jscoverage['plugins/table.action.js'][608] = 0; + _$jscoverage['plugins/table.action.js'][609] = 0; + _$jscoverage['plugins/table.action.js'][610] = 0; + _$jscoverage['plugins/table.action.js'][611] = 0; + _$jscoverage['plugins/table.action.js'][612] = 0; + _$jscoverage['plugins/table.action.js'][615] = 0; + _$jscoverage['plugins/table.action.js'][616] = 0; + _$jscoverage['plugins/table.action.js'][617] = 0; + _$jscoverage['plugins/table.action.js'][618] = 0; + _$jscoverage['plugins/table.action.js'][619] = 0; + _$jscoverage['plugins/table.action.js'][623] = 0; + _$jscoverage['plugins/table.action.js'][624] = 0; + _$jscoverage['plugins/table.action.js'][626] = 0; + _$jscoverage['plugins/table.action.js'][627] = 0; + _$jscoverage['plugins/table.action.js'][630] = 0; + _$jscoverage['plugins/table.action.js'][631] = 0; + _$jscoverage['plugins/table.action.js'][632] = 0; + _$jscoverage['plugins/table.action.js'][634] = 0; + _$jscoverage['plugins/table.action.js'][635] = 0; + _$jscoverage['plugins/table.action.js'][636] = 0; + _$jscoverage['plugins/table.action.js'][638] = 0; + _$jscoverage['plugins/table.action.js'][639] = 0; + _$jscoverage['plugins/table.action.js'][641] = 0; + _$jscoverage['plugins/table.action.js'][642] = 0; + _$jscoverage['plugins/table.action.js'][644] = 0; + _$jscoverage['plugins/table.action.js'][650] = 0; + _$jscoverage['plugins/table.action.js'][651] = 0; + _$jscoverage['plugins/table.action.js'][653] = 0; + _$jscoverage['plugins/table.action.js'][656] = 0; + _$jscoverage['plugins/table.action.js'][657] = 0; + _$jscoverage['plugins/table.action.js'][661] = 0; + _$jscoverage['plugins/table.action.js'][662] = 0; + _$jscoverage['plugins/table.action.js'][663] = 0; + _$jscoverage['plugins/table.action.js'][664] = 0; + _$jscoverage['plugins/table.action.js'][665] = 0; + _$jscoverage['plugins/table.action.js'][666] = 0; + _$jscoverage['plugins/table.action.js'][667] = 0; + _$jscoverage['plugins/table.action.js'][668] = 0; + _$jscoverage['plugins/table.action.js'][669] = 0; + _$jscoverage['plugins/table.action.js'][671] = 0; + _$jscoverage['plugins/table.action.js'][673] = 0; + _$jscoverage['plugins/table.action.js'][674] = 0; + _$jscoverage['plugins/table.action.js'][675] = 0; + _$jscoverage['plugins/table.action.js'][676] = 0; + _$jscoverage['plugins/table.action.js'][677] = 0; + _$jscoverage['plugins/table.action.js'][678] = 0; + _$jscoverage['plugins/table.action.js'][679] = 0; + _$jscoverage['plugins/table.action.js'][682] = 0; + _$jscoverage['plugins/table.action.js'][683] = 0; + _$jscoverage['plugins/table.action.js'][684] = 0; + _$jscoverage['plugins/table.action.js'][685] = 0; + _$jscoverage['plugins/table.action.js'][689] = 0; + _$jscoverage['plugins/table.action.js'][690] = 0; + _$jscoverage['plugins/table.action.js'][691] = 0; + _$jscoverage['plugins/table.action.js'][692] = 0; + _$jscoverage['plugins/table.action.js'][693] = 0; + _$jscoverage['plugins/table.action.js'][695] = 0; + _$jscoverage['plugins/table.action.js'][697] = 0; + _$jscoverage['plugins/table.action.js'][707] = 0; + _$jscoverage['plugins/table.action.js'][708] = 0; + _$jscoverage['plugins/table.action.js'][709] = 0; + _$jscoverage['plugins/table.action.js'][712] = 0; + _$jscoverage['plugins/table.action.js'][713] = 0; + _$jscoverage['plugins/table.action.js'][714] = 0; + _$jscoverage['plugins/table.action.js'][715] = 0; + _$jscoverage['plugins/table.action.js'][719] = 0; + _$jscoverage['plugins/table.action.js'][720] = 0; + _$jscoverage['plugins/table.action.js'][721] = 0; + _$jscoverage['plugins/table.action.js'][722] = 0; + _$jscoverage['plugins/table.action.js'][723] = 0; + _$jscoverage['plugins/table.action.js'][726] = 0; + _$jscoverage['plugins/table.action.js'][727] = 0; + _$jscoverage['plugins/table.action.js'][728] = 0; + _$jscoverage['plugins/table.action.js'][729] = 0; + _$jscoverage['plugins/table.action.js'][731] = 0; + _$jscoverage['plugins/table.action.js'][732] = 0; + _$jscoverage['plugins/table.action.js'][733] = 0; + _$jscoverage['plugins/table.action.js'][736] = 0; + _$jscoverage['plugins/table.action.js'][740] = 0; + _$jscoverage['plugins/table.action.js'][741] = 0; + _$jscoverage['plugins/table.action.js'][742] = 0; + _$jscoverage['plugins/table.action.js'][744] = 0; + _$jscoverage['plugins/table.action.js'][750] = 0; + _$jscoverage['plugins/table.action.js'][752] = 0; + _$jscoverage['plugins/table.action.js'][753] = 0; + _$jscoverage['plugins/table.action.js'][756] = 0; + _$jscoverage['plugins/table.action.js'][759] = 0; + _$jscoverage['plugins/table.action.js'][763] = 0; + _$jscoverage['plugins/table.action.js'][765] = 0; + _$jscoverage['plugins/table.action.js'][767] = 0; + _$jscoverage['plugins/table.action.js'][768] = 0; + _$jscoverage['plugins/table.action.js'][769] = 0; + _$jscoverage['plugins/table.action.js'][770] = 0; + _$jscoverage['plugins/table.action.js'][772] = 0; + _$jscoverage['plugins/table.action.js'][777] = 0; + _$jscoverage['plugins/table.action.js'][778] = 0; + _$jscoverage['plugins/table.action.js'][779] = 0; + _$jscoverage['plugins/table.action.js'][780] = 0; + _$jscoverage['plugins/table.action.js'][781] = 0; + _$jscoverage['plugins/table.action.js'][782] = 0; + _$jscoverage['plugins/table.action.js'][783] = 0; + _$jscoverage['plugins/table.action.js'][784] = 0; + _$jscoverage['plugins/table.action.js'][785] = 0; + _$jscoverage['plugins/table.action.js'][786] = 0; + _$jscoverage['plugins/table.action.js'][788] = 0; + _$jscoverage['plugins/table.action.js'][791] = 0; + _$jscoverage['plugins/table.action.js'][793] = 0; + _$jscoverage['plugins/table.action.js'][794] = 0; + _$jscoverage['plugins/table.action.js'][795] = 0; + _$jscoverage['plugins/table.action.js'][796] = 0; + _$jscoverage['plugins/table.action.js'][799] = 0; + _$jscoverage['plugins/table.action.js'][800] = 0; + _$jscoverage['plugins/table.action.js'][801] = 0; + _$jscoverage['plugins/table.action.js'][802] = 0; + _$jscoverage['plugins/table.action.js'][803] = 0; + _$jscoverage['plugins/table.action.js'][804] = 0; + _$jscoverage['plugins/table.action.js'][806] = 0; + _$jscoverage['plugins/table.action.js'][807] = 0; + _$jscoverage['plugins/table.action.js'][808] = 0; + _$jscoverage['plugins/table.action.js'][809] = 0; + _$jscoverage['plugins/table.action.js'][810] = 0; + _$jscoverage['plugins/table.action.js'][813] = 0; + _$jscoverage['plugins/table.action.js'][817] = 0; + _$jscoverage['plugins/table.action.js'][821] = 0; + _$jscoverage['plugins/table.action.js'][825] = 0; + _$jscoverage['plugins/table.action.js'][827] = 0; + _$jscoverage['plugins/table.action.js'][828] = 0; + _$jscoverage['plugins/table.action.js'][829] = 0; + _$jscoverage['plugins/table.action.js'][830] = 0; + _$jscoverage['plugins/table.action.js'][831] = 0; + _$jscoverage['plugins/table.action.js'][834] = 0; + _$jscoverage['plugins/table.action.js'][838] = 0; + _$jscoverage['plugins/table.action.js'][839] = 0; + _$jscoverage['plugins/table.action.js'][841] = 0; + _$jscoverage['plugins/table.action.js'][842] = 0; + _$jscoverage['plugins/table.action.js'][843] = 0; + _$jscoverage['plugins/table.action.js'][844] = 0; + _$jscoverage['plugins/table.action.js'][845] = 0; + _$jscoverage['plugins/table.action.js'][846] = 0; + _$jscoverage['plugins/table.action.js'][847] = 0; + _$jscoverage['plugins/table.action.js'][848] = 0; + _$jscoverage['plugins/table.action.js'][850] = 0; + _$jscoverage['plugins/table.action.js'][851] = 0; + _$jscoverage['plugins/table.action.js'][853] = 0; + _$jscoverage['plugins/table.action.js'][854] = 0; + _$jscoverage['plugins/table.action.js'][856] = 0; + _$jscoverage['plugins/table.action.js'][857] = 0; + _$jscoverage['plugins/table.action.js'][859] = 0; + _$jscoverage['plugins/table.action.js'][860] = 0; + _$jscoverage['plugins/table.action.js'][862] = 0; + _$jscoverage['plugins/table.action.js'][864] = 0; + _$jscoverage['plugins/table.action.js'][866] = 0; + _$jscoverage['plugins/table.action.js'][867] = 0; + _$jscoverage['plugins/table.action.js'][868] = 0; + _$jscoverage['plugins/table.action.js'][872] = 0; + _$jscoverage['plugins/table.action.js'][873] = 0; + _$jscoverage['plugins/table.action.js'][874] = 0; + _$jscoverage['plugins/table.action.js'][878] = 0; + _$jscoverage['plugins/table.action.js'][879] = 0; + _$jscoverage['plugins/table.action.js'][882] = 0; + _$jscoverage['plugins/table.action.js'][897] = 0; + _$jscoverage['plugins/table.action.js'][898] = 0; + _$jscoverage['plugins/table.action.js'][901] = 0; + _$jscoverage['plugins/table.action.js'][902] = 0; + _$jscoverage['plugins/table.action.js'][904] = 0; + _$jscoverage['plugins/table.action.js'][906] = 0; + _$jscoverage['plugins/table.action.js'][915] = 0; + _$jscoverage['plugins/table.action.js'][916] = 0; + _$jscoverage['plugins/table.action.js'][917] = 0; + _$jscoverage['plugins/table.action.js'][918] = 0; + _$jscoverage['plugins/table.action.js'][924] = 0; + _$jscoverage['plugins/table.action.js'][925] = 0; + _$jscoverage['plugins/table.action.js'][927] = 0; + _$jscoverage['plugins/table.action.js'][934] = 0; + _$jscoverage['plugins/table.action.js'][935] = 0; + _$jscoverage['plugins/table.action.js'][936] = 0; + _$jscoverage['plugins/table.action.js'][938] = 0; + _$jscoverage['plugins/table.action.js'][940] = 0; + _$jscoverage['plugins/table.action.js'][947] = 0; + _$jscoverage['plugins/table.action.js'][948] = 0; + _$jscoverage['plugins/table.action.js'][949] = 0; + _$jscoverage['plugins/table.action.js'][950] = 0; + _$jscoverage['plugins/table.action.js'][951] = 0; + _$jscoverage['plugins/table.action.js'][952] = 0; + _$jscoverage['plugins/table.action.js'][953] = 0; + _$jscoverage['plugins/table.action.js'][955] = 0; + _$jscoverage['plugins/table.action.js'][958] = 0; + _$jscoverage['plugins/table.action.js'][960] = 0; + _$jscoverage['plugins/table.action.js'][968] = 0; + _$jscoverage['plugins/table.action.js'][970] = 0; + _$jscoverage['plugins/table.action.js'][973] = 0; + _$jscoverage['plugins/table.action.js'][974] = 0; + _$jscoverage['plugins/table.action.js'][975] = 0; + _$jscoverage['plugins/table.action.js'][976] = 0; + _$jscoverage['plugins/table.action.js'][977] = 0; + _$jscoverage['plugins/table.action.js'][979] = 0; + _$jscoverage['plugins/table.action.js'][989] = 0; + _$jscoverage['plugins/table.action.js'][990] = 0; + _$jscoverage['plugins/table.action.js'][993] = 0; + _$jscoverage['plugins/table.action.js'][995] = 0; + _$jscoverage['plugins/table.action.js'][999] = 0; + _$jscoverage['plugins/table.action.js'][1006] = 0; + _$jscoverage['plugins/table.action.js'][1008] = 0; + _$jscoverage['plugins/table.action.js'][1017] = 0; + _$jscoverage['plugins/table.action.js'][1024] = 0; + _$jscoverage['plugins/table.action.js'][1026] = 0; + _$jscoverage['plugins/table.action.js'][1028] = 0; + _$jscoverage['plugins/table.action.js'][1037] = 0; + _$jscoverage['plugins/table.action.js'][1038] = 0; + _$jscoverage['plugins/table.action.js'][1040] = 0; + _$jscoverage['plugins/table.action.js'][1041] = 0; + _$jscoverage['plugins/table.action.js'][1044] = 0; + _$jscoverage['plugins/table.action.js'][1045] = 0; + _$jscoverage['plugins/table.action.js'][1047] = 0; + _$jscoverage['plugins/table.action.js'][1048] = 0; + _$jscoverage['plugins/table.action.js'][1050] = 0; + _$jscoverage['plugins/table.action.js'][1051] = 0; + _$jscoverage['plugins/table.action.js'][1053] = 0; + _$jscoverage['plugins/table.action.js'][1054] = 0; + _$jscoverage['plugins/table.action.js'][1056] = 0; + _$jscoverage['plugins/table.action.js'][1059] = 0; + _$jscoverage['plugins/table.action.js'][1061] = 0; + _$jscoverage['plugins/table.action.js'][1062] = 0; + _$jscoverage['plugins/table.action.js'][1065] = 0; + _$jscoverage['plugins/table.action.js'][1071] = 0; + _$jscoverage['plugins/table.action.js'][1072] = 0; + _$jscoverage['plugins/table.action.js'][1075] = 0; + _$jscoverage['plugins/table.action.js'][1076] = 0; + _$jscoverage['plugins/table.action.js'][1077] = 0; + _$jscoverage['plugins/table.action.js'][1078] = 0; + _$jscoverage['plugins/table.action.js'][1079] = 0; + _$jscoverage['plugins/table.action.js'][1082] = 0; + _$jscoverage['plugins/table.action.js'][1083] = 0; + _$jscoverage['plugins/table.action.js'][1084] = 0; + _$jscoverage['plugins/table.action.js'][1086] = 0; + _$jscoverage['plugins/table.action.js'][1087] = 0; + _$jscoverage['plugins/table.action.js'][1088] = 0; + _$jscoverage['plugins/table.action.js'][1094] = 0; + _$jscoverage['plugins/table.action.js'][1100] = 0; + _$jscoverage['plugins/table.action.js'][1101] = 0; + _$jscoverage['plugins/table.action.js'][1102] = 0; + _$jscoverage['plugins/table.action.js'][1106] = 0; + _$jscoverage['plugins/table.action.js'][1107] = 0; + _$jscoverage['plugins/table.action.js'][1108] = 0; + _$jscoverage['plugins/table.action.js'][1109] = 0; + _$jscoverage['plugins/table.action.js'][1110] = 0; + _$jscoverage['plugins/table.action.js'][1111] = 0; + _$jscoverage['plugins/table.action.js'][1112] = 0; + _$jscoverage['plugins/table.action.js'][1114] = 0; + _$jscoverage['plugins/table.action.js'][1116] = 0; + _$jscoverage['plugins/table.action.js'][1117] = 0; + _$jscoverage['plugins/table.action.js'][1118] = 0; + _$jscoverage['plugins/table.action.js'][1119] = 0; + _$jscoverage['plugins/table.action.js'][1121] = 0; + _$jscoverage['plugins/table.action.js'][1122] = 0; + _$jscoverage['plugins/table.action.js'][1123] = 0; + _$jscoverage['plugins/table.action.js'][1124] = 0; + _$jscoverage['plugins/table.action.js'][1128] = 0; + _$jscoverage['plugins/table.action.js'][1129] = 0; + _$jscoverage['plugins/table.action.js'][1133] = 0; + _$jscoverage['plugins/table.action.js'][1135] = 0; + _$jscoverage['plugins/table.action.js'][1137] = 0; + _$jscoverage['plugins/table.action.js'][1140] = 0; + _$jscoverage['plugins/table.action.js'][1142] = 0; + _$jscoverage['plugins/table.action.js'][1146] = 0; + _$jscoverage['plugins/table.action.js'][1148] = 0; + _$jscoverage['plugins/table.action.js'][1152] = 0; + _$jscoverage['plugins/table.action.js'][1155] = 0; + _$jscoverage['plugins/table.action.js'][1157] = 0; + _$jscoverage['plugins/table.action.js'][1159] = 0; + _$jscoverage['plugins/table.action.js'][1161] = 0; + _$jscoverage['plugins/table.action.js'][1162] = 0; + _$jscoverage['plugins/table.action.js'][1163] = 0; + _$jscoverage['plugins/table.action.js'][1166] = 0; + _$jscoverage['plugins/table.action.js'][1170] = 0; + _$jscoverage['plugins/table.action.js'][1172] = 0; + _$jscoverage['plugins/table.action.js'][1174] = 0; + _$jscoverage['plugins/table.action.js'][1194] = 0; + _$jscoverage['plugins/table.action.js'][1196] = 0; + _$jscoverage['plugins/table.action.js'][1199] = 0; + _$jscoverage['plugins/table.action.js'][1200] = 0; + _$jscoverage['plugins/table.action.js'][1202] = 0; + _$jscoverage['plugins/table.action.js'][1203] = 0; + _$jscoverage['plugins/table.action.js'][1204] = 0; + _$jscoverage['plugins/table.action.js'][1205] = 0; + _$jscoverage['plugins/table.action.js'][1206] = 0; + _$jscoverage['plugins/table.action.js'][1209] = 0; + _$jscoverage['plugins/table.action.js'][1210] = 0; + _$jscoverage['plugins/table.action.js'][1211] = 0; + _$jscoverage['plugins/table.action.js'][1212] = 0; + _$jscoverage['plugins/table.action.js'][1215] = 0; + _$jscoverage['plugins/table.action.js'][1222] = 0; + _$jscoverage['plugins/table.action.js'][1224] = 0; + _$jscoverage['plugins/table.action.js'][1225] = 0; + _$jscoverage['plugins/table.action.js'][1228] = 0; + _$jscoverage['plugins/table.action.js'][1231] = 0; + _$jscoverage['plugins/table.action.js'][1233] = 0; + _$jscoverage['plugins/table.action.js'][1234] = 0; + _$jscoverage['plugins/table.action.js'][1239] = 0; + _$jscoverage['plugins/table.action.js'][1241] = 0; + _$jscoverage['plugins/table.action.js'][1244] = 0; + _$jscoverage['plugins/table.action.js'][1246] = 0; + _$jscoverage['plugins/table.action.js'][1248] = 0; + _$jscoverage['plugins/table.action.js'][1249] = 0; + _$jscoverage['plugins/table.action.js'][1254] = 0; + _$jscoverage['plugins/table.action.js'][1258] = 0; + _$jscoverage['plugins/table.action.js'][1259] = 0; + _$jscoverage['plugins/table.action.js'][1260] = 0; + _$jscoverage['plugins/table.action.js'][1263] = 0; + _$jscoverage['plugins/table.action.js'][1265] = 0; + _$jscoverage['plugins/table.action.js'][1268] = 0; + _$jscoverage['plugins/table.action.js'][1270] = 0; + _$jscoverage['plugins/table.action.js'][1271] = 0; + _$jscoverage['plugins/table.action.js'][1272] = 0; + _$jscoverage['plugins/table.action.js'][1277] = 0; + _$jscoverage['plugins/table.action.js'][1282] = 0; + _$jscoverage['plugins/table.action.js'][1284] = 0; + _$jscoverage['plugins/table.action.js'][1286] = 0; + _$jscoverage['plugins/table.action.js'][1287] = 0; + _$jscoverage['plugins/table.action.js'][1289] = 0; + _$jscoverage['plugins/table.action.js'][1290] = 0; + _$jscoverage['plugins/table.action.js'][1291] = 0; + _$jscoverage['plugins/table.action.js'][1293] = 0; + _$jscoverage['plugins/table.action.js'][1294] = 0; + _$jscoverage['plugins/table.action.js'][1295] = 0; + _$jscoverage['plugins/table.action.js'][1296] = 0; + _$jscoverage['plugins/table.action.js'][1297] = 0; + _$jscoverage['plugins/table.action.js'][1299] = 0; + _$jscoverage['plugins/table.action.js'][1300] = 0; + _$jscoverage['plugins/table.action.js'][1303] = 0; + _$jscoverage['plugins/table.action.js'][1305] = 0; + _$jscoverage['plugins/table.action.js'][1306] = 0; + _$jscoverage['plugins/table.action.js'][1309] = 0; + _$jscoverage['plugins/table.action.js'][1311] = 0; + _$jscoverage['plugins/table.action.js'][1313] = 0; + _$jscoverage['plugins/table.action.js'][1314] = 0; + _$jscoverage['plugins/table.action.js'][1316] = 0; + _$jscoverage['plugins/table.action.js'][1321] = 0; + _$jscoverage['plugins/table.action.js'][1322] = 0; + _$jscoverage['plugins/table.action.js'][1325] = 0; + _$jscoverage['plugins/table.action.js'][1327] = 0; + _$jscoverage['plugins/table.action.js'][1328] = 0; + _$jscoverage['plugins/table.action.js'][1329] = 0; + _$jscoverage['plugins/table.action.js'][1335] = 0; + _$jscoverage['plugins/table.action.js'][1336] = 0; + _$jscoverage['plugins/table.action.js'][1338] = 0; + _$jscoverage['plugins/table.action.js'][1342] = 0; + _$jscoverage['plugins/table.action.js'][1343] = 0; + _$jscoverage['plugins/table.action.js'][1344] = 0; + _$jscoverage['plugins/table.action.js'][1345] = 0; + _$jscoverage['plugins/table.action.js'][1346] = 0; + _$jscoverage['plugins/table.action.js'][1347] = 0; + _$jscoverage['plugins/table.action.js'][1350] = 0; + _$jscoverage['plugins/table.action.js'][1353] = 0; + _$jscoverage['plugins/table.action.js'][1354] = 0; + _$jscoverage['plugins/table.action.js'][1356] = 0; + _$jscoverage['plugins/table.action.js'][1358] = 0; + _$jscoverage['plugins/table.action.js'][1360] = 0; + _$jscoverage['plugins/table.action.js'][1361] = 0; + _$jscoverage['plugins/table.action.js'][1363] = 0; + _$jscoverage['plugins/table.action.js'][1366] = 0; + _$jscoverage['plugins/table.action.js'][1368] = 0; + _$jscoverage['plugins/table.action.js'][1369] = 0; + _$jscoverage['plugins/table.action.js'][1371] = 0; + _$jscoverage['plugins/table.action.js'][1372] = 0; + _$jscoverage['plugins/table.action.js'][1375] = 0; + _$jscoverage['plugins/table.action.js'][1376] = 0; + _$jscoverage['plugins/table.action.js'][1378] = 0; + _$jscoverage['plugins/table.action.js'][1379] = 0; + _$jscoverage['plugins/table.action.js'][1380] = 0; + _$jscoverage['plugins/table.action.js'][1383] = 0; + _$jscoverage['plugins/table.action.js'][1384] = 0; + _$jscoverage['plugins/table.action.js'][1385] = 0; + _$jscoverage['plugins/table.action.js'][1386] = 0; + _$jscoverage['plugins/table.action.js'][1387] = 0; + _$jscoverage['plugins/table.action.js'][1388] = 0; + _$jscoverage['plugins/table.action.js'][1389] = 0; + _$jscoverage['plugins/table.action.js'][1392] = 0; + _$jscoverage['plugins/table.action.js'][1394] = 0; + _$jscoverage['plugins/table.action.js'][1395] = 0; + _$jscoverage['plugins/table.action.js'][1396] = 0; + _$jscoverage['plugins/table.action.js'][1397] = 0; + _$jscoverage['plugins/table.action.js'][1399] = 0; + _$jscoverage['plugins/table.action.js'][1402] = 0; + _$jscoverage['plugins/table.action.js'][1403] = 0; + _$jscoverage['plugins/table.action.js'][1404] = 0; + _$jscoverage['plugins/table.action.js'][1407] = 0; + _$jscoverage['plugins/table.action.js'][1408] = 0; + _$jscoverage['plugins/table.action.js'][1412] = 0; + _$jscoverage['plugins/table.action.js'][1413] = 0; + _$jscoverage['plugins/table.action.js'][1415] = 0; + _$jscoverage['plugins/table.action.js'][1418] = 0; + _$jscoverage['plugins/table.action.js'][1420] = 0; + _$jscoverage['plugins/table.action.js'][1421] = 0; + _$jscoverage['plugins/table.action.js'][1424] = 0; + _$jscoverage['plugins/table.action.js'][1426] = 0; + _$jscoverage['plugins/table.action.js'][1428] = 0; + _$jscoverage['plugins/table.action.js'][1431] = 0; + _$jscoverage['plugins/table.action.js'][1432] = 0; + _$jscoverage['plugins/table.action.js'][1433] = 0; + _$jscoverage['plugins/table.action.js'][1434] = 0; + _$jscoverage['plugins/table.action.js'][1435] = 0; + _$jscoverage['plugins/table.action.js'][1436] = 0; + _$jscoverage['plugins/table.action.js'][1438] = 0; + _$jscoverage['plugins/table.action.js'][1439] = 0; + _$jscoverage['plugins/table.action.js'][1443] = 0; + _$jscoverage['plugins/table.action.js'][1446] = 0; + _$jscoverage['plugins/table.action.js'][1447] = 0; + _$jscoverage['plugins/table.action.js'][1449] = 0; + _$jscoverage['plugins/table.action.js'][1450] = 0; + _$jscoverage['plugins/table.action.js'][1451] = 0; + _$jscoverage['plugins/table.action.js'][1454] = 0; + _$jscoverage['plugins/table.action.js'][1455] = 0; + _$jscoverage['plugins/table.action.js'][1456] = 0; + _$jscoverage['plugins/table.action.js'][1459] = 0; + _$jscoverage['plugins/table.action.js'][1461] = 0; + _$jscoverage['plugins/table.action.js'][1462] = 0; + _$jscoverage['plugins/table.action.js'][1465] = 0; + _$jscoverage['plugins/table.action.js'][1468] = 0; + _$jscoverage['plugins/table.action.js'][1469] = 0; + _$jscoverage['plugins/table.action.js'][1472] = 0; + _$jscoverage['plugins/table.action.js'][1474] = 0; + _$jscoverage['plugins/table.action.js'][1476] = 0; + _$jscoverage['plugins/table.action.js'][1478] = 0; + _$jscoverage['plugins/table.action.js'][1480] = 0; + _$jscoverage['plugins/table.action.js'][1481] = 0; + _$jscoverage['plugins/table.action.js'][1487] = 0; + _$jscoverage['plugins/table.action.js'][1488] = 0; + _$jscoverage['plugins/table.action.js'][1496] = 0; + _$jscoverage['plugins/table.action.js'][1497] = 0; + _$jscoverage['plugins/table.action.js'][1500] = 0; + _$jscoverage['plugins/table.action.js'][1501] = 0; + _$jscoverage['plugins/table.action.js'][1502] = 0; + _$jscoverage['plugins/table.action.js'][1503] = 0; + _$jscoverage['plugins/table.action.js'][1504] = 0; + _$jscoverage['plugins/table.action.js'][1507] = 0; + _$jscoverage['plugins/table.action.js'][1508] = 0; + _$jscoverage['plugins/table.action.js'][1518] = 0; + _$jscoverage['plugins/table.action.js'][1520] = 0; + _$jscoverage['plugins/table.action.js'][1521] = 0; + _$jscoverage['plugins/table.action.js'][1524] = 0; + _$jscoverage['plugins/table.action.js'][1525] = 0; + _$jscoverage['plugins/table.action.js'][1529] = 0; + _$jscoverage['plugins/table.action.js'][1534] = 0; + _$jscoverage['plugins/table.action.js'][1536] = 0; + _$jscoverage['plugins/table.action.js'][1537] = 0; + _$jscoverage['plugins/table.action.js'][1539] = 0; + _$jscoverage['plugins/table.action.js'][1542] = 0; + _$jscoverage['plugins/table.action.js'][1545] = 0; + _$jscoverage['plugins/table.action.js'][1547] = 0; + _$jscoverage['plugins/table.action.js'][1549] = 0; + _$jscoverage['plugins/table.action.js'][1552] = 0; + _$jscoverage['plugins/table.action.js'][1554] = 0; + _$jscoverage['plugins/table.action.js'][1556] = 0; + _$jscoverage['plugins/table.action.js'][1558] = 0; + _$jscoverage['plugins/table.action.js'][1563] = 0; + _$jscoverage['plugins/table.action.js'][1565] = 0; + _$jscoverage['plugins/table.action.js'][1567] = 0; + _$jscoverage['plugins/table.action.js'][1568] = 0; + _$jscoverage['plugins/table.action.js'][1573] = 0; + _$jscoverage['plugins/table.action.js'][1581] = 0; + _$jscoverage['plugins/table.action.js'][1589] = 0; + _$jscoverage['plugins/table.action.js'][1591] = 0; + _$jscoverage['plugins/table.action.js'][1593] = 0; + _$jscoverage['plugins/table.action.js'][1595] = 0; + _$jscoverage['plugins/table.action.js'][1599] = 0; + _$jscoverage['plugins/table.action.js'][1603] = 0; + _$jscoverage['plugins/table.action.js'][1606] = 0; + _$jscoverage['plugins/table.action.js'][1608] = 0; + _$jscoverage['plugins/table.action.js'][1609] = 0; + _$jscoverage['plugins/table.action.js'][1612] = 0; + _$jscoverage['plugins/table.action.js'][1615] = 0; + _$jscoverage['plugins/table.action.js'][1617] = 0; + _$jscoverage['plugins/table.action.js'][1620] = 0; + _$jscoverage['plugins/table.action.js'][1622] = 0; + _$jscoverage['plugins/table.action.js'][1625] = 0; + _$jscoverage['plugins/table.action.js'][1626] = 0; + _$jscoverage['plugins/table.action.js'][1634] = 0; + _$jscoverage['plugins/table.action.js'][1636] = 0; + _$jscoverage['plugins/table.action.js'][1640] = 0; + _$jscoverage['plugins/table.action.js'][1642] = 0; + _$jscoverage['plugins/table.action.js'][1648] = 0; + _$jscoverage['plugins/table.action.js'][1650] = 0; + _$jscoverage['plugins/table.action.js'][1654] = 0; + _$jscoverage['plugins/table.action.js'][1656] = 0; + _$jscoverage['plugins/table.action.js'][1657] = 0; + _$jscoverage['plugins/table.action.js'][1661] = 0; + _$jscoverage['plugins/table.action.js'][1668] = 0; + _$jscoverage['plugins/table.action.js'][1670] = 0; + _$jscoverage['plugins/table.action.js'][1672] = 0; + _$jscoverage['plugins/table.action.js'][1674] = 0; + _$jscoverage['plugins/table.action.js'][1676] = 0; + _$jscoverage['plugins/table.action.js'][1679] = 0; + _$jscoverage['plugins/table.action.js'][1682] = 0; + _$jscoverage['plugins/table.action.js'][1687] = 0; + _$jscoverage['plugins/table.action.js'][1691] = 0; + _$jscoverage['plugins/table.action.js'][1693] = 0; + _$jscoverage['plugins/table.action.js'][1695] = 0; + _$jscoverage['plugins/table.action.js'][1702] = 0; + _$jscoverage['plugins/table.action.js'][1703] = 0; + _$jscoverage['plugins/table.action.js'][1705] = 0; + _$jscoverage['plugins/table.action.js'][1706] = 0; + _$jscoverage['plugins/table.action.js'][1708] = 0; + _$jscoverage['plugins/table.action.js'][1710] = 0; + _$jscoverage['plugins/table.action.js'][1712] = 0; + _$jscoverage['plugins/table.action.js'][1714] = 0; + _$jscoverage['plugins/table.action.js'][1716] = 0; + _$jscoverage['plugins/table.action.js'][1718] = 0; + _$jscoverage['plugins/table.action.js'][1720] = 0; + _$jscoverage['plugins/table.action.js'][1721] = 0; + _$jscoverage['plugins/table.action.js'][1723] = 0; + _$jscoverage['plugins/table.action.js'][1725] = 0; + _$jscoverage['plugins/table.action.js'][1727] = 0; + _$jscoverage['plugins/table.action.js'][1731] = 0; + _$jscoverage['plugins/table.action.js'][1733] = 0; + _$jscoverage['plugins/table.action.js'][1737] = 0; + _$jscoverage['plugins/table.action.js'][1738] = 0; + _$jscoverage['plugins/table.action.js'][1739] = 0; + _$jscoverage['plugins/table.action.js'][1740] = 0; + _$jscoverage['plugins/table.action.js'][1749] = 0; + _$jscoverage['plugins/table.action.js'][1752] = 0; + _$jscoverage['plugins/table.action.js'][1753] = 0; + _$jscoverage['plugins/table.action.js'][1754] = 0; + _$jscoverage['plugins/table.action.js'][1755] = 0; + _$jscoverage['plugins/table.action.js'][1756] = 0; + _$jscoverage['plugins/table.action.js'][1765] = 0; + _$jscoverage['plugins/table.action.js'][1766] = 0; + _$jscoverage['plugins/table.action.js'][1767] = 0; + _$jscoverage['plugins/table.action.js'][1773] = 0; + _$jscoverage['plugins/table.action.js'][1775] = 0; + _$jscoverage['plugins/table.action.js'][1776] = 0; + _$jscoverage['plugins/table.action.js'][1777] = 0; + _$jscoverage['plugins/table.action.js'][1779] = 0; + _$jscoverage['plugins/table.action.js'][1781] = 0; + _$jscoverage['plugins/table.action.js'][1782] = 0; + _$jscoverage['plugins/table.action.js'][1792] = 0; + _$jscoverage['plugins/table.action.js'][1793] = 0; + _$jscoverage['plugins/table.action.js'][1794] = 0; + _$jscoverage['plugins/table.action.js'][1795] = 0; + _$jscoverage['plugins/table.action.js'][1796] = 0; + _$jscoverage['plugins/table.action.js'][1797] = 0; + _$jscoverage['plugins/table.action.js'][1798] = 0; + _$jscoverage['plugins/table.action.js'][1799] = 0; + _$jscoverage['plugins/table.action.js'][1800] = 0; + _$jscoverage['plugins/table.action.js'][1802] = 0; + _$jscoverage['plugins/table.action.js'][1809] = 0; + _$jscoverage['plugins/table.action.js'][1810] = 0; + _$jscoverage['plugins/table.action.js'][1811] = 0; + _$jscoverage['plugins/table.action.js'][1817] = 0; + _$jscoverage['plugins/table.action.js'][1819] = 0; + _$jscoverage['plugins/table.action.js'][1822] = 0; + _$jscoverage['plugins/table.action.js'][1823] = 0; + _$jscoverage['plugins/table.action.js'][1826] = 0; + _$jscoverage['plugins/table.action.js'][1830] = 0; + _$jscoverage['plugins/table.action.js'][1831] = 0; + _$jscoverage['plugins/table.action.js'][1834] = 0; + _$jscoverage['plugins/table.action.js'][1836] = 0; + _$jscoverage['plugins/table.action.js'][1839] = 0; + _$jscoverage['plugins/table.action.js'][1840] = 0; + _$jscoverage['plugins/table.action.js'][1843] = 0; + _$jscoverage['plugins/table.action.js'][1845] = 0; + _$jscoverage['plugins/table.action.js'][1848] = 0; + _$jscoverage['plugins/table.action.js'][1849] = 0; + _$jscoverage['plugins/table.action.js'][1856] = 0; +} +_$jscoverage['plugins/table.action.js'].source = ["/*"," * 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/default/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:2px solid #BBB;background:#F7F7F7;}' +"," '.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;"," html.html = div[browser.ie ? '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 ' +"," ( isFullCol && isFullRow ? 'width=\"' + width + '\"' : '') +"," '>' + table.innerHTML.replace(/>\\s*</g, '><').replace(/\\bth\\b/gi, \"td\") + '</table>')"," }"," 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);"," 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 = '&nbsp;'"," }"," }"," });"," 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 = '&nbsp;'"," }"," }"," });"," table.onmouseover = function () {"," me.fireEvent('tablemouseover', table);"," };"," table.onmousemove = function () {"," me.fireEvent('tablemousemove', table);"," me.options.tableDragable && toggleDragButton(true, this, me);"," };"," 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 );"," });",""," 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 = '&nbsp;'"," }"," });"," });"," 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.ie ? '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;",""," if( !startTd ) return;"," var state = Math.abs( userActionStatus.x - evt.clientX ) >= Math.abs( userActionStatus.y - evt.clientY ) ? 'h' : 'v';","// 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.ie ? 'empty' : 'removeAllRanges']();",""," singleClickState = 0;"," dragLine = me.document.getElementById('ue_tableDragLine');",""," 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.ie ? '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,f55,255\\))/ig.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;"," }","","};"]; +_$jscoverage['plugins/table.action.js'][8]++; +UE.plugins.table = (function () { + _$jscoverage['plugins/table.action.js'][9]++; + var me = this, tabTimer = null, tableDragTimer = null, tableResizeTimer = null, cellMinWidth = 5, isInResizeBuffer = false, cellBorderWidth = 5, offsetOfTableCell = 10, singleClickState = 0, userActionStatus = null, dblclickTime = 360, UT = UE.UETable, getUETable = (function (tdOrTable) { + _$jscoverage['plugins/table.action.js'][29]++; + return UT.getUETable(tdOrTable); +}), getUETableBySelected = (function (editor) { + _$jscoverage['plugins/table.action.js'][32]++; + return UT.getUETableBySelected(editor); +}), getDefaultValue = (function (editor, table) { + _$jscoverage['plugins/table.action.js'][35]++; + return UT.getDefaultValue(editor, table); +}), removeSelectedClass = (function (cells) { + _$jscoverage['plugins/table.action.js'][38]++; + return UT.removeSelectedClass(cells); +}); + _$jscoverage['plugins/table.action.js'][41]++; + function showError(e) { +} + _$jscoverage['plugins/table.action.js'][44]++; + me.ready((function () { + _$jscoverage['plugins/table.action.js'][45]++; + var me = this; + _$jscoverage['plugins/table.action.js'][46]++; + var orgGetText = me.selection.getText; + _$jscoverage['plugins/table.action.js'][47]++; + me.selection.getText = (function () { + _$jscoverage['plugins/table.action.js'][48]++; + var table = getUETableBySelected(me); + _$jscoverage['plugins/table.action.js'][49]++; + if (table) { + _$jscoverage['plugins/table.action.js'][50]++; + var str = ""; + _$jscoverage['plugins/table.action.js'][51]++; + utils.each(table.selectedTds, (function (td) { + _$jscoverage['plugins/table.action.js'][52]++; + str += td[(browser.ie? "innerText": "textContent")]; +})); + _$jscoverage['plugins/table.action.js'][54]++; + return str; + } + else { + _$jscoverage['plugins/table.action.js'][56]++; + return orgGetText.call(me.selection); + } +}); +})); + _$jscoverage['plugins/table.action.js'][63]++; + var startTd = null, currentTd = null, onDrag = "", onBorder = false, dragButton = null, dragOver = false, dragLine = null, dragTd = null; + _$jscoverage['plugins/table.action.js'][72]++; + var mousedown = false, needIEHack = true; + _$jscoverage['plugins/table.action.js'][76]++; + me.setOpt({"maxColNum": 20, "maxRowNum": 100, "defaultCols": 5, "defaultRows": 5, "tdvalign": "top", "cursorpath": (me.options.UEDITOR_HOME_URL + "themes/default/images/cursor_"), "tableDragable": false, "classList": ["ue-table-interlace-color-single", "ue-table-interlace-color-double"]}); + _$jscoverage['plugins/table.action.js'][86]++; + me.getUETable = getUETable; + _$jscoverage['plugins/table.action.js'][87]++; + 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}; + _$jscoverage['plugins/table.action.js'][115]++; + me.ready((function () { + _$jscoverage['plugins/table.action.js'][116]++; + 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:2px solid #BBB;background:#F7F7F7;}.ue-table-interlace-color-single{ background-color: #fcfcfc; } .ue-table-interlace-color-double{ background-color: #f7faff; }td p{margin:0;padding:0;}", me.document); + _$jscoverage['plugins/table.action.js'][128]++; + var tableCopyList, isFullCol, isFullRow; + _$jscoverage['plugins/table.action.js'][130]++; + me.addListener("keydown", (function (cmd, evt) { + _$jscoverage['plugins/table.action.js'][131]++; + var me = this; + _$jscoverage['plugins/table.action.js'][132]++; + var keyCode = (evt.keyCode || evt.which); + _$jscoverage['plugins/table.action.js'][134]++; + if ((keyCode == 8)) { + _$jscoverage['plugins/table.action.js'][136]++; + var ut = getUETableBySelected(me); + _$jscoverage['plugins/table.action.js'][137]++; + if ((ut && ut.selectedTds.length)) { + _$jscoverage['plugins/table.action.js'][139]++; + if (ut.isFullCol()) { + _$jscoverage['plugins/table.action.js'][140]++; + me.execCommand("deletecol"); + } + else { + _$jscoverage['plugins/table.action.js'][141]++; + if (ut.isFullRow()) { + _$jscoverage['plugins/table.action.js'][142]++; + me.execCommand("deleterow"); + } + else { + _$jscoverage['plugins/table.action.js'][144]++; + me.fireEvent("delcells"); + } + } + _$jscoverage['plugins/table.action.js'][146]++; + domUtils.preventDefault(evt); + } + _$jscoverage['plugins/table.action.js'][149]++; + var caption = domUtils.findParentByTagName(me.selection.getStart(), "caption", true), range = me.selection.getRange(); + _$jscoverage['plugins/table.action.js'][151]++; + if ((range.collapsed && caption && isEmptyBlock(caption))) { + _$jscoverage['plugins/table.action.js'][152]++; + me.fireEvent("saveScene"); + _$jscoverage['plugins/table.action.js'][153]++; + var table = caption.parentNode; + _$jscoverage['plugins/table.action.js'][154]++; + domUtils.remove(caption); + _$jscoverage['plugins/table.action.js'][155]++; + if (table) { + _$jscoverage['plugins/table.action.js'][156]++; + range.setStart(table.rows[0].cells[0], 0).setCursor(false, true); + } + _$jscoverage['plugins/table.action.js'][158]++; + me.fireEvent("saveScene"); + } + } + _$jscoverage['plugins/table.action.js'][163]++; + if ((keyCode == 46)) { + _$jscoverage['plugins/table.action.js'][165]++; + ut = getUETableBySelected(me); + _$jscoverage['plugins/table.action.js'][166]++; + if (ut) { + _$jscoverage['plugins/table.action.js'][167]++; + me.fireEvent("saveScene"); + _$jscoverage['plugins/table.action.js'][168]++; + for (var i = 0, ci; (ci = ut.selectedTds[(i++)]);) { + _$jscoverage['plugins/table.action.js'][169]++; + domUtils.fillNode(me.document, ci); +} + _$jscoverage['plugins/table.action.js'][171]++; + me.fireEvent("saveScene"); + _$jscoverage['plugins/table.action.js'][172]++; + domUtils.preventDefault(evt); + } + } + _$jscoverage['plugins/table.action.js'][177]++; + if ((keyCode == 13)) { + _$jscoverage['plugins/table.action.js'][179]++; + var rng = me.selection.getRange(), caption = domUtils.findParentByTagName(rng.startContainer, "caption", true); + _$jscoverage['plugins/table.action.js'][181]++; + if (caption) { + _$jscoverage['plugins/table.action.js'][182]++; + var table = domUtils.findParentByTagName(caption, "table"); + _$jscoverage['plugins/table.action.js'][183]++; + if ((! rng.collapsed)) { + _$jscoverage['plugins/table.action.js'][185]++; + rng.deleteContents(); + _$jscoverage['plugins/table.action.js'][186]++; + me.fireEvent("saveScene"); + } + else { + _$jscoverage['plugins/table.action.js'][188]++; + if (caption) { + _$jscoverage['plugins/table.action.js'][189]++; + rng.setStart(table.rows[0].cells[0], 0).setCursor(false, true); + } + } + _$jscoverage['plugins/table.action.js'][192]++; + domUtils.preventDefault(evt); + _$jscoverage['plugins/table.action.js'][193]++; + return; + } + _$jscoverage['plugins/table.action.js'][195]++; + if (rng.collapsed) { + _$jscoverage['plugins/table.action.js'][196]++; + var table = domUtils.findParentByTagName(rng.startContainer, "table"); + _$jscoverage['plugins/table.action.js'][197]++; + if (table) { + _$jscoverage['plugins/table.action.js'][198]++; + var cell = table.rows[0].cells[0], start = domUtils.findParentByTagName(me.selection.getStart(), ["td", "th"], true), preNode = table.previousSibling; + _$jscoverage['plugins/table.action.js'][201]++; + if (((cell === start) && ((! preNode) || ((preNode.nodeType == 1) && (preNode.tagName == "TABLE"))) && domUtils.isStartInblock(rng))) { + _$jscoverage['plugins/table.action.js'][202]++; + var first = domUtils.findParent(me.selection.getStart(), (function (n) { + _$jscoverage['plugins/table.action.js'][202]++; + return domUtils.isBlockElm(n); +}), true); + _$jscoverage['plugins/table.action.js'][203]++; + if ((first && (/t(h|d)/i.test(first.tagName) || (first === start.firstChild)))) { + _$jscoverage['plugins/table.action.js'][204]++; + me.execCommand("insertparagraphbeforetable"); + _$jscoverage['plugins/table.action.js'][205]++; + domUtils.preventDefault(evt); + } + } + } + } + } + _$jscoverage['plugins/table.action.js'][213]++; + if (((evt.ctrlKey || evt.metaKey) && (evt.keyCode == "67"))) { + _$jscoverage['plugins/table.action.js'][214]++; + tableCopyList = null; + _$jscoverage['plugins/table.action.js'][215]++; + var ut = getUETableBySelected(me); + _$jscoverage['plugins/table.action.js'][216]++; + if (ut) { + _$jscoverage['plugins/table.action.js'][217]++; + var tds = ut.selectedTds; + _$jscoverage['plugins/table.action.js'][218]++; + isFullCol = ut.isFullCol(); + _$jscoverage['plugins/table.action.js'][219]++; + isFullRow = ut.isFullRow(); + _$jscoverage['plugins/table.action.js'][220]++; + tableCopyList = [[ut.cloneCell(tds[0], null, true)]]; + _$jscoverage['plugins/table.action.js'][223]++; + for (var i = 1, ci = ci; (ci = tds[i]); (i++)) { + _$jscoverage['plugins/table.action.js'][224]++; + if ((ci.parentNode !== tds[(i - 1)].parentNode)) { + _$jscoverage['plugins/table.action.js'][225]++; + tableCopyList.push([ut.cloneCell(ci, null, true)]); + } + else { + _$jscoverage['plugins/table.action.js'][227]++; + tableCopyList[(tableCopyList.length - 1)].push(ut.cloneCell(ci, null, true)); + } +} + } + } +})); + _$jscoverage['plugins/table.action.js'][234]++; + me.addListener("tablehasdeleted", (function () { + _$jscoverage['plugins/table.action.js'][235]++; + toggleDraggableState(this, false, "", null); + _$jscoverage['plugins/table.action.js'][236]++; + if (dragButton) { + _$jscoverage['plugins/table.action.js'][236]++; + domUtils.remove(dragButton); + } +})); + _$jscoverage['plugins/table.action.js'][239]++; + me.addListener("beforepaste", (function (cmd, html) { + _$jscoverage['plugins/table.action.js'][240]++; + var me = this; + _$jscoverage['plugins/table.action.js'][241]++; + var rng = me.selection.getRange(); + _$jscoverage['plugins/table.action.js'][242]++; + if (domUtils.findParentByTagName(rng.startContainer, "caption", true)) { + _$jscoverage['plugins/table.action.js'][243]++; + var div = me.document.createElement("div"); + _$jscoverage['plugins/table.action.js'][244]++; + div.innerHTML = html.html; + _$jscoverage['plugins/table.action.js'][245]++; + html.html = div[(browser.ie? "innerText": "textContent")]; + _$jscoverage['plugins/table.action.js'][246]++; + return; + } + _$jscoverage['plugins/table.action.js'][248]++; + var table = getUETableBySelected(me); + _$jscoverage['plugins/table.action.js'][249]++; + if (tableCopyList) { + _$jscoverage['plugins/table.action.js'][250]++; + me.fireEvent("saveScene"); + _$jscoverage['plugins/table.action.js'][251]++; + var rng = me.selection.getRange(); + _$jscoverage['plugins/table.action.js'][252]++; + var td = domUtils.findParentByTagName(rng.startContainer, ["td", "th"], true), tmpNode, preNode; + _$jscoverage['plugins/table.action.js'][253]++; + if (td) { + _$jscoverage['plugins/table.action.js'][254]++; + var ut = getUETable(td); + _$jscoverage['plugins/table.action.js'][255]++; + if (isFullRow) { + _$jscoverage['plugins/table.action.js'][256]++; + var rowIndex = ut.getCellInfo(td).rowIndex; + _$jscoverage['plugins/table.action.js'][257]++; + if ((td.tagName == "TH")) { + _$jscoverage['plugins/table.action.js'][258]++; + (rowIndex++); + } + _$jscoverage['plugins/table.action.js'][260]++; + for (var i = 0, ci; (ci = tableCopyList[(i++)]);) { + _$jscoverage['plugins/table.action.js'][261]++; + var tr = ut.insertRow((rowIndex++), "td"); + _$jscoverage['plugins/table.action.js'][262]++; + for (var j = 0, cj; (cj = ci[j]); (j++)) { + _$jscoverage['plugins/table.action.js'][263]++; + var cell = tr.cells[j]; + _$jscoverage['plugins/table.action.js'][264]++; + if ((! cell)) { + _$jscoverage['plugins/table.action.js'][265]++; + cell = tr.insertCell(j); + } + _$jscoverage['plugins/table.action.js'][267]++; + cell.innerHTML = cj.innerHTML; + _$jscoverage['plugins/table.action.js'][268]++; + (cj.getAttribute("width") && cell.setAttribute("width", cj.getAttribute("width"))); + _$jscoverage['plugins/table.action.js'][269]++; + (cj.getAttribute("vAlign") && cell.setAttribute("vAlign", cj.getAttribute("vAlign"))); + _$jscoverage['plugins/table.action.js'][270]++; + (cj.getAttribute("align") && cell.setAttribute("align", cj.getAttribute("align"))); + _$jscoverage['plugins/table.action.js'][271]++; + (cj.style.cssText && (cell.style.cssText = cj.style.cssText)); +} + _$jscoverage['plugins/table.action.js'][273]++; + for (var j = 0, cj = cj; (cj = tr.cells[j]); (j++)) { + _$jscoverage['plugins/table.action.js'][274]++; + if ((! ci[j])) { + _$jscoverage['plugins/table.action.js'][275]++; + break; + } + _$jscoverage['plugins/table.action.js'][276]++; + cj.innerHTML = ci[j].innerHTML; + _$jscoverage['plugins/table.action.js'][277]++; + (ci[j].getAttribute("width") && cj.setAttribute("width", ci[j].getAttribute("width"))); + _$jscoverage['plugins/table.action.js'][278]++; + (ci[j].getAttribute("vAlign") && cj.setAttribute("vAlign", ci[j].getAttribute("vAlign"))); + _$jscoverage['plugins/table.action.js'][279]++; + (ci[j].getAttribute("align") && cj.setAttribute("align", ci[j].getAttribute("align"))); + _$jscoverage['plugins/table.action.js'][280]++; + (ci[j].style.cssText && (cj.style.cssText = ci[j].style.cssText)); +} +} + } + else { + _$jscoverage['plugins/table.action.js'][284]++; + if (isFullCol) { + _$jscoverage['plugins/table.action.js'][285]++; + cellInfo = ut.getCellInfo(td); + _$jscoverage['plugins/table.action.js'][286]++; + var maxColNum = 0; + _$jscoverage['plugins/table.action.js'][287]++; + for (var j = 0, ci = tableCopyList[0], cj = cj; (cj = ci[(j++)]);) { + _$jscoverage['plugins/table.action.js'][288]++; + maxColNum += (cj.colSpan || 1); +} + _$jscoverage['plugins/table.action.js'][290]++; + me.__hasEnterExecCommand = true; + _$jscoverage['plugins/table.action.js'][291]++; + for (i = 0; (i < maxColNum); (i++)) { + _$jscoverage['plugins/table.action.js'][292]++; + me.execCommand("insertcol"); +} + _$jscoverage['plugins/table.action.js'][294]++; + me.__hasEnterExecCommand = false; + _$jscoverage['plugins/table.action.js'][295]++; + td = ut.table.rows[0].cells[cellInfo.cellIndex]; + _$jscoverage['plugins/table.action.js'][296]++; + if ((td.tagName == "TH")) { + _$jscoverage['plugins/table.action.js'][297]++; + td = ut.table.rows[1].cells[cellInfo.cellIndex]; + } + } + _$jscoverage['plugins/table.action.js'][300]++; + for (var i = 0, ci = ci; (ci = tableCopyList[(i++)]);) { + _$jscoverage['plugins/table.action.js'][301]++; + tmpNode = td; + _$jscoverage['plugins/table.action.js'][302]++; + for (var j = 0, cj = cj; (cj = ci[(j++)]);) { + _$jscoverage['plugins/table.action.js'][303]++; + if (td) { + _$jscoverage['plugins/table.action.js'][304]++; + td.innerHTML = cj.innerHTML; + _$jscoverage['plugins/table.action.js'][306]++; + (cj.getAttribute("width") && td.setAttribute("width", cj.getAttribute("width"))); + _$jscoverage['plugins/table.action.js'][307]++; + (cj.getAttribute("vAlign") && td.setAttribute("vAlign", cj.getAttribute("vAlign"))); + _$jscoverage['plugins/table.action.js'][308]++; + (cj.getAttribute("align") && td.setAttribute("align", cj.getAttribute("align"))); + _$jscoverage['plugins/table.action.js'][309]++; + (cj.style.cssText && (td.style.cssText = cj.style.cssText)); + _$jscoverage['plugins/table.action.js'][310]++; + preNode = td; + _$jscoverage['plugins/table.action.js'][311]++; + td = td.nextSibling; + } + else { + _$jscoverage['plugins/table.action.js'][313]++; + var cloneTd = cj.cloneNode(true); + _$jscoverage['plugins/table.action.js'][314]++; + domUtils.removeAttributes(cloneTd, ["class", "rowSpan", "colSpan"]); + _$jscoverage['plugins/table.action.js'][316]++; + preNode.parentNode.appendChild(cloneTd); + } +} + _$jscoverage['plugins/table.action.js'][319]++; + td = ut.getNextCell(tmpNode, true, true); + _$jscoverage['plugins/table.action.js'][320]++; + if ((! tableCopyList[i])) { + _$jscoverage['plugins/table.action.js'][321]++; + break; + } + _$jscoverage['plugins/table.action.js'][322]++; + if ((! td)) { + _$jscoverage['plugins/table.action.js'][323]++; + var cellInfo = ut.getCellInfo(tmpNode); + _$jscoverage['plugins/table.action.js'][324]++; + ut.table.insertRow(ut.table.rows.length); + _$jscoverage['plugins/table.action.js'][325]++; + ut.update(); + _$jscoverage['plugins/table.action.js'][326]++; + td = ut.getVSideCell(tmpNode, true); + } +} + } + _$jscoverage['plugins/table.action.js'][330]++; + ut.update(); + } + else { + _$jscoverage['plugins/table.action.js'][332]++; + table = me.document.createElement("table"); + _$jscoverage['plugins/table.action.js'][333]++; + for (var i = 0, ci = ci; (ci = tableCopyList[(i++)]);) { + _$jscoverage['plugins/table.action.js'][334]++; + var tr = table.insertRow(table.rows.length); + _$jscoverage['plugins/table.action.js'][335]++; + for (var j = 0, cj = cj; (cj = ci[(j++)]);) { + _$jscoverage['plugins/table.action.js'][336]++; + cloneTd = UT.cloneCell(cj, null, true); + _$jscoverage['plugins/table.action.js'][337]++; + domUtils.removeAttributes(cloneTd, ["class"]); + _$jscoverage['plugins/table.action.js'][338]++; + tr.appendChild(cloneTd); +} + _$jscoverage['plugins/table.action.js'][340]++; + if (((j == 2) && (cloneTd.rowSpan > 1))) { + _$jscoverage['plugins/table.action.js'][341]++; + cloneTd.rowSpan = 1; + } +} + _$jscoverage['plugins/table.action.js'][345]++; + 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)); + _$jscoverage['plugins/table.action.js'][348]++; + me.execCommand("insertHTML", ("" + table.innerHTML.replace(/>\s*<").replace(/\bth\b/gi, "td") + "
    ")); + } + _$jscoverage['plugins/table.action.js'][352]++; + me.fireEvent("contentchange"); + _$jscoverage['plugins/table.action.js'][353]++; + me.fireEvent("saveScene"); + _$jscoverage['plugins/table.action.js'][354]++; + html.html = ""; + _$jscoverage['plugins/table.action.js'][355]++; + return true; + } + else { + _$jscoverage['plugins/table.action.js'][357]++; + var div = me.document.createElement("div"), tables; + _$jscoverage['plugins/table.action.js'][358]++; + div.innerHTML = html.html; + _$jscoverage['plugins/table.action.js'][359]++; + tables = div.getElementsByTagName("table"); + _$jscoverage['plugins/table.action.js'][360]++; + if (domUtils.findParentByTagName(me.selection.getStart(), "table")) { + _$jscoverage['plugins/table.action.js'][361]++; + utils.each(tables, (function (t) { + _$jscoverage['plugins/table.action.js'][362]++; + domUtils.remove(t); +})); + _$jscoverage['plugins/table.action.js'][364]++; + if (domUtils.findParentByTagName(me.selection.getStart(), "caption", true)) { + _$jscoverage['plugins/table.action.js'][365]++; + div.innerHTML = div[(browser.ie? "innerText": "textContent")]; + } + } + else { + _$jscoverage['plugins/table.action.js'][368]++; + utils.each(tables, (function (table) { + _$jscoverage['plugins/table.action.js'][369]++; + removeStyleSize(table, true); + _$jscoverage['plugins/table.action.js'][370]++; + domUtils.removeAttributes(table, ["style", "border"]); + _$jscoverage['plugins/table.action.js'][371]++; + utils.each(domUtils.getElementsByTagName(table, "td"), (function (td) { + _$jscoverage['plugins/table.action.js'][372]++; + if (isEmptyBlock(td)) { + _$jscoverage['plugins/table.action.js'][373]++; + domUtils.fillNode(me.document, td); + } + _$jscoverage['plugins/table.action.js'][375]++; + removeStyleSize(td, true); +})); +})); + } + _$jscoverage['plugins/table.action.js'][380]++; + html.html = div.innerHTML; + } +})); + _$jscoverage['plugins/table.action.js'][384]++; + me.addListener("afterpaste", (function () { + _$jscoverage['plugins/table.action.js'][385]++; + utils.each(domUtils.getElementsByTagName(me.body, "table"), (function (table) { + _$jscoverage['plugins/table.action.js'][386]++; + if ((table.offsetWidth > me.body.offsetWidth)) { + _$jscoverage['plugins/table.action.js'][387]++; + var defaultValue = getDefaultValue(me, table); + _$jscoverage['plugins/table.action.js'][388]++; + 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"); + } +})); +})); + _$jscoverage['plugins/table.action.js'][392]++; + me.addListener("blur", (function () { + _$jscoverage['plugins/table.action.js'][393]++; + tableCopyList = null; +})); + _$jscoverage['plugins/table.action.js'][395]++; + var timer; + _$jscoverage['plugins/table.action.js'][396]++; + me.addListener("keydown", (function () { + _$jscoverage['plugins/table.action.js'][397]++; + clearTimeout(timer); + _$jscoverage['plugins/table.action.js'][398]++; + timer = setTimeout((function () { + _$jscoverage['plugins/table.action.js'][399]++; + var rng = me.selection.getRange(), cell = domUtils.findParentByTagName(rng.startContainer, ["th", "td"], true); + _$jscoverage['plugins/table.action.js'][401]++; + if (cell) { + _$jscoverage['plugins/table.action.js'][402]++; + var table = cell.parentNode.parentNode.parentNode; + _$jscoverage['plugins/table.action.js'][403]++; + if ((table.offsetWidth > table.getAttribute("width"))) { + _$jscoverage['plugins/table.action.js'][404]++; + cell.style.wordBreak = "break-all"; + } + } +}), 100); +})); + _$jscoverage['plugins/table.action.js'][410]++; + me.addListener("selectionchange", (function () { + _$jscoverage['plugins/table.action.js'][411]++; + toggleDraggableState(me, false, "", null); +})); + _$jscoverage['plugins/table.action.js'][417]++; + me.addListener("contentchange", (function () { + _$jscoverage['plugins/table.action.js'][418]++; + var me = this; + _$jscoverage['plugins/table.action.js'][420]++; + hideDragLine(me); + _$jscoverage['plugins/table.action.js'][421]++; + if (getUETableBySelected(me)) { + _$jscoverage['plugins/table.action.js'][421]++; + return; + } + _$jscoverage['plugins/table.action.js'][422]++; + var rng = me.selection.getRange(); + _$jscoverage['plugins/table.action.js'][423]++; + var start = rng.startContainer; + _$jscoverage['plugins/table.action.js'][424]++; + start = domUtils.findParentByTagName(start, ["td", "th"], true); + _$jscoverage['plugins/table.action.js'][425]++; + utils.each(domUtils.getElementsByTagName(me.document, "table"), (function (table) { + _$jscoverage['plugins/table.action.js'][426]++; + if ((me.fireEvent("excludetable", table) === true)) { + _$jscoverage['plugins/table.action.js'][426]++; + return; + } + _$jscoverage['plugins/table.action.js'][427]++; + table.ueTable = new UT(table); + _$jscoverage['plugins/table.action.js'][428]++; + utils.each(domUtils.getElementsByTagName(me.document, "td"), (function (td) { + _$jscoverage['plugins/table.action.js'][430]++; + if ((domUtils.isEmptyBlock(td) && (td !== start))) { + _$jscoverage['plugins/table.action.js'][431]++; + domUtils.fillNode(me.document, td); + _$jscoverage['plugins/table.action.js'][432]++; + if ((browser.ie && (browser.version == 6))) { + _$jscoverage['plugins/table.action.js'][433]++; + td.innerHTML = " "; + } + } +})); + _$jscoverage['plugins/table.action.js'][437]++; + utils.each(domUtils.getElementsByTagName(me.document, "th"), (function (th) { + _$jscoverage['plugins/table.action.js'][438]++; + if ((domUtils.isEmptyBlock(th) && (th !== start))) { + _$jscoverage['plugins/table.action.js'][439]++; + domUtils.fillNode(me.document, th); + _$jscoverage['plugins/table.action.js'][440]++; + if ((browser.ie && (browser.version == 6))) { + _$jscoverage['plugins/table.action.js'][441]++; + th.innerHTML = " "; + } + } +})); + _$jscoverage['plugins/table.action.js'][445]++; + table.onmouseover = (function () { + _$jscoverage['plugins/table.action.js'][446]++; + me.fireEvent("tablemouseover", table); +}); + _$jscoverage['plugins/table.action.js'][448]++; + table.onmousemove = (function () { + _$jscoverage['plugins/table.action.js'][449]++; + me.fireEvent("tablemousemove", table); + _$jscoverage['plugins/table.action.js'][450]++; + (me.options.tableDragable && toggleDragButton(true, this, me)); +}); + _$jscoverage['plugins/table.action.js'][452]++; + table.onmouseout = (function () { + _$jscoverage['plugins/table.action.js'][453]++; + me.fireEvent("tablemouseout", table); + _$jscoverage['plugins/table.action.js'][454]++; + toggleDraggableState(me, false, "", null); + _$jscoverage['plugins/table.action.js'][455]++; + hideDragLine(me); +}); + _$jscoverage['plugins/table.action.js'][457]++; + table.onclick = (function (evt) { + _$jscoverage['plugins/table.action.js'][458]++; + evt = (me.window.event || evt); + _$jscoverage['plugins/table.action.js'][459]++; + var target = getParentTdOrTh((evt.target || evt.srcElement)); + _$jscoverage['plugins/table.action.js'][460]++; + if ((! target)) { + _$jscoverage['plugins/table.action.js'][460]++; + return; + } + _$jscoverage['plugins/table.action.js'][461]++; + var ut = getUETable(target), table = ut.table, cellInfo = ut.getCellInfo(target), cellsRange, rng = me.selection.getRange(); + _$jscoverage['plugins/table.action.js'][475]++; + if (inTableSide(table, target, evt, true)) { + _$jscoverage['plugins/table.action.js'][476]++; + var endTdCol = ut.getCell(ut.indexTable[(ut.rowsNum - 1)][cellInfo.colIndex].rowIndex, ut.indexTable[(ut.rowsNum - 1)][cellInfo.colIndex].cellIndex); + _$jscoverage['plugins/table.action.js'][477]++; + if ((evt.shiftKey && ut.selectedTds.length)) { + _$jscoverage['plugins/table.action.js'][478]++; + if ((ut.selectedTds[0] !== endTdCol)) { + _$jscoverage['plugins/table.action.js'][479]++; + cellsRange = ut.getCellsRange(ut.selectedTds[0], endTdCol); + _$jscoverage['plugins/table.action.js'][480]++; + ut.setSelected(cellsRange); + } + else { + _$jscoverage['plugins/table.action.js'][482]++; + (rng && rng.selectNodeContents(endTdCol).select()); + } + } + else { + _$jscoverage['plugins/table.action.js'][485]++; + if ((target !== endTdCol)) { + _$jscoverage['plugins/table.action.js'][486]++; + cellsRange = ut.getCellsRange(target, endTdCol); + _$jscoverage['plugins/table.action.js'][487]++; + ut.setSelected(cellsRange); + } + else { + _$jscoverage['plugins/table.action.js'][489]++; + (rng && rng.selectNodeContents(endTdCol).select()); + } + } + _$jscoverage['plugins/table.action.js'][492]++; + return; + } + _$jscoverage['plugins/table.action.js'][494]++; + if (inTableSide(table, target, evt)) { + _$jscoverage['plugins/table.action.js'][495]++; + var endTdRow = ut.getCell(ut.indexTable[cellInfo.rowIndex][(ut.colsNum - 1)].rowIndex, ut.indexTable[cellInfo.rowIndex][(ut.colsNum - 1)].cellIndex); + _$jscoverage['plugins/table.action.js'][496]++; + if ((evt.shiftKey && ut.selectedTds.length)) { + _$jscoverage['plugins/table.action.js'][497]++; + if ((ut.selectedTds[0] !== endTdRow)) { + _$jscoverage['plugins/table.action.js'][498]++; + cellsRange = ut.getCellsRange(ut.selectedTds[0], endTdRow); + _$jscoverage['plugins/table.action.js'][499]++; + ut.setSelected(cellsRange); + } + else { + _$jscoverage['plugins/table.action.js'][501]++; + (rng && rng.selectNodeContents(endTdRow).select()); + } + } + else { + _$jscoverage['plugins/table.action.js'][504]++; + if ((target !== endTdRow)) { + _$jscoverage['plugins/table.action.js'][505]++; + cellsRange = ut.getCellsRange(target, endTdRow); + _$jscoverage['plugins/table.action.js'][506]++; + ut.setSelected(cellsRange); + } + else { + _$jscoverage['plugins/table.action.js'][508]++; + (rng && rng.selectNodeContents(endTdRow).select()); + } + } + } +}); +})); + _$jscoverage['plugins/table.action.js'][515]++; + switchBorderColor(me, true); +})); + _$jscoverage['plugins/table.action.js'][518]++; + domUtils.on(me.document, "mousemove", mouseMoveEvent); + _$jscoverage['plugins/table.action.js'][520]++; + domUtils.on(me.document, "mouseout", (function (evt) { + _$jscoverage['plugins/table.action.js'][521]++; + var target = (evt.target || evt.srcElement); + _$jscoverage['plugins/table.action.js'][522]++; + if ((target.tagName == "TABLE")) { + _$jscoverage['plugins/table.action.js'][523]++; + toggleDraggableState(me, false, "", null); + } +})); + _$jscoverage['plugins/table.action.js'][529]++; + me.addListener("interlacetable", (function (type, table, classList) { + _$jscoverage['plugins/table.action.js'][530]++; + if ((! table)) { + _$jscoverage['plugins/table.action.js'][530]++; + return; + } + _$jscoverage['plugins/table.action.js'][531]++; + var me = this, rows = table.rows, len = rows.length, getClass = (function (list, index, repeat) { + _$jscoverage['plugins/table.action.js'][535]++; + return (list[index]? list[index]: (repeat? list[(index % list.length)]: "")); +}); + _$jscoverage['plugins/table.action.js'][537]++; + for (var i = 0; (i < len); (i++)) { + _$jscoverage['plugins/table.action.js'][538]++; + rows[i].className = getClass((classList || me.options.classList), i, true); +} +})); + _$jscoverage['plugins/table.action.js'][541]++; + me.addListener("uninterlacetable", (function (type, table) { + _$jscoverage['plugins/table.action.js'][542]++; + if ((! table)) { + _$jscoverage['plugins/table.action.js'][542]++; + return; + } + _$jscoverage['plugins/table.action.js'][543]++; + var me = this, rows = table.rows, classList = me.options.classList, len = rows.length; + _$jscoverage['plugins/table.action.js'][547]++; + for (var i = 0; (i < len); (i++)) { + _$jscoverage['plugins/table.action.js'][548]++; + domUtils.removeClasses(rows[i], classList); +} +})); + _$jscoverage['plugins/table.action.js'][552]++; + me.addListener("mousedown", mouseDownEvent); + _$jscoverage['plugins/table.action.js'][553]++; + me.addListener("mouseup", mouseUpEvent); + _$jscoverage['plugins/table.action.js'][555]++; + domUtils.on(me.body, "dragstart", (function (evt) { + _$jscoverage['plugins/table.action.js'][556]++; + mouseUpEvent.call(me, "dragstart", evt); +})); + _$jscoverage['plugins/table.action.js'][559]++; + var currentRowIndex = 0; + _$jscoverage['plugins/table.action.js'][560]++; + me.addListener("mousedown", (function () { + _$jscoverage['plugins/table.action.js'][561]++; + currentRowIndex = 0; +})); + _$jscoverage['plugins/table.action.js'][563]++; + me.addListener("tabkeydown", (function () { + _$jscoverage['plugins/table.action.js'][564]++; + var range = this.selection.getRange(), common = range.getCommonAncestor(true, true), table = domUtils.findParentByTagName(common, "table"); + _$jscoverage['plugins/table.action.js'][567]++; + if (table) { + _$jscoverage['plugins/table.action.js'][568]++; + if (domUtils.findParentByTagName(common, "caption", true)) { + _$jscoverage['plugins/table.action.js'][569]++; + var cell = domUtils.getElementsByTagName(table, "th td"); + _$jscoverage['plugins/table.action.js'][570]++; + if ((cell && cell.length)) { + _$jscoverage['plugins/table.action.js'][571]++; + range.setStart(cell[0], 0).setCursor(false, true); + } + } + else { + _$jscoverage['plugins/table.action.js'][574]++; + var cell = domUtils.findParentByTagName(common, ["td", "th"], true), ua = getUETable(cell); + _$jscoverage['plugins/table.action.js'][576]++; + currentRowIndex = ((cell.rowSpan > 1)? currentRowIndex: ua.getCellInfo(cell).rowIndex); + _$jscoverage['plugins/table.action.js'][577]++; + var nextCell = ua.getTabNextCell(cell, currentRowIndex); + _$jscoverage['plugins/table.action.js'][578]++; + if (nextCell) { + _$jscoverage['plugins/table.action.js'][579]++; + if (isEmptyBlock(nextCell)) { + _$jscoverage['plugins/table.action.js'][580]++; + range.setStart(nextCell, 0).setCursor(false, true); + } + else { + _$jscoverage['plugins/table.action.js'][582]++; + range.selectNodeContents(nextCell).select(); + } + } + else { + _$jscoverage['plugins/table.action.js'][585]++; + me.fireEvent("saveScene"); + _$jscoverage['plugins/table.action.js'][586]++; + me.__hasEnterExecCommand = true; + _$jscoverage['plugins/table.action.js'][587]++; + this.execCommand("insertrownext"); + _$jscoverage['plugins/table.action.js'][588]++; + me.__hasEnterExecCommand = false; + _$jscoverage['plugins/table.action.js'][589]++; + range = this.selection.getRange(); + _$jscoverage['plugins/table.action.js'][590]++; + range.setStart(table.rows[(table.rows.length - 1)].cells[0], 0).setCursor(); + _$jscoverage['plugins/table.action.js'][591]++; + me.fireEvent("saveScene"); + } + } + _$jscoverage['plugins/table.action.js'][594]++; + return true; + } +})); + _$jscoverage['plugins/table.action.js'][598]++; + (browser.ie && me.addListener("selectionchange", (function () { + _$jscoverage['plugins/table.action.js'][599]++; + toggleDraggableState(this, false, "", null); +}))); + _$jscoverage['plugins/table.action.js'][601]++; + me.addListener("keydown", (function (type, evt) { + _$jscoverage['plugins/table.action.js'][602]++; + var me = this; + _$jscoverage['plugins/table.action.js'][604]++; + var keyCode = (evt.keyCode || evt.which); + _$jscoverage['plugins/table.action.js'][605]++; + if (((keyCode == 8) || (keyCode == 46))) { + _$jscoverage['plugins/table.action.js'][606]++; + return; + } + _$jscoverage['plugins/table.action.js'][608]++; + var notCtrlKey = ((! evt.ctrlKey) && (! evt.metaKey) && (! evt.shiftKey) && (! evt.altKey)); + _$jscoverage['plugins/table.action.js'][609]++; + (notCtrlKey && removeSelectedClass(domUtils.getElementsByTagName(me.body, "td"))); + _$jscoverage['plugins/table.action.js'][610]++; + var ut = getUETableBySelected(me); + _$jscoverage['plugins/table.action.js'][611]++; + if ((! ut)) { + _$jscoverage['plugins/table.action.js'][611]++; + return; + } + _$jscoverage['plugins/table.action.js'][612]++; + (notCtrlKey && ut.clearSelected()); +})); + _$jscoverage['plugins/table.action.js'][615]++; + me.addListener("beforegetcontent", (function () { + _$jscoverage['plugins/table.action.js'][616]++; + switchBorderColor(this, false); + _$jscoverage['plugins/table.action.js'][617]++; + (browser.ie && utils.each(this.document.getElementsByTagName("caption"), (function (ci) { + _$jscoverage['plugins/table.action.js'][618]++; + if (domUtils.isEmptyNode(ci)) { + _$jscoverage['plugins/table.action.js'][619]++; + ci.innerHTML = " "; + } +}))); +})); + _$jscoverage['plugins/table.action.js'][623]++; + me.addListener("aftergetcontent", (function () { + _$jscoverage['plugins/table.action.js'][624]++; + switchBorderColor(this, true); +})); + _$jscoverage['plugins/table.action.js'][626]++; + me.addListener("getAllHtml", (function () { + _$jscoverage['plugins/table.action.js'][627]++; + removeSelectedClass(me.document.getElementsByTagName("td")); +})); + _$jscoverage['plugins/table.action.js'][630]++; + me.addListener("fullscreenchanged", (function (type, fullscreen) { + _$jscoverage['plugins/table.action.js'][631]++; + if ((! fullscreen)) { + _$jscoverage['plugins/table.action.js'][632]++; + var ratio = (this.body.offsetWidth / document.body.offsetWidth), tables = domUtils.getElementsByTagName(this.body, "table"); + _$jscoverage['plugins/table.action.js'][634]++; + utils.each(tables, (function (table) { + _$jscoverage['plugins/table.action.js'][635]++; + if ((table.offsetWidth < me.body.offsetWidth)) { + _$jscoverage['plugins/table.action.js'][635]++; + return false; + } + _$jscoverage['plugins/table.action.js'][636]++; + var tds = domUtils.getElementsByTagName(table, "td"), backWidths = []; + _$jscoverage['plugins/table.action.js'][638]++; + utils.each(tds, (function (td) { + _$jscoverage['plugins/table.action.js'][639]++; + backWidths.push(td.offsetWidth); +})); + _$jscoverage['plugins/table.action.js'][641]++; + for (var i = 0, td; (td = tds[i]); (i++)) { + _$jscoverage['plugins/table.action.js'][642]++; + td.setAttribute("width", Math.floor((backWidths[i] * ratio))); +} + _$jscoverage['plugins/table.action.js'][644]++; + table.setAttribute("width", Math.floor(getTableWidth(me, needIEHack, getDefaultValue(me)))); +})); + } +})); + _$jscoverage['plugins/table.action.js'][650]++; + var oldExecCommand = me.execCommand; + _$jscoverage['plugins/table.action.js'][651]++; + me.execCommand = (function (cmd, datatat) { + _$jscoverage['plugins/table.action.js'][653]++; + var me = this, args = arguments; + _$jscoverage['plugins/table.action.js'][656]++; + cmd = cmd.toLowerCase(); + _$jscoverage['plugins/table.action.js'][657]++; + var ut = getUETableBySelected(me), tds, range = new (dom.Range)(me.document), cmdFun = (me.commands[cmd] || UE.commands[cmd]), result; + _$jscoverage['plugins/table.action.js'][661]++; + if ((! cmdFun)) { + _$jscoverage['plugins/table.action.js'][661]++; + return; + } + _$jscoverage['plugins/table.action.js'][662]++; + if ((ut && (! commands[cmd]) && (! cmdFun.notNeedUndo) && (! me.__hasEnterExecCommand))) { + _$jscoverage['plugins/table.action.js'][663]++; + me.__hasEnterExecCommand = true; + _$jscoverage['plugins/table.action.js'][664]++; + me.fireEvent("beforeexeccommand", cmd); + _$jscoverage['plugins/table.action.js'][665]++; + tds = ut.selectedTds; + _$jscoverage['plugins/table.action.js'][666]++; + var lastState = -2, lastValue = -2, value, state; + _$jscoverage['plugins/table.action.js'][667]++; + for (var i = 0, td; (td = tds[i]); (i++)) { + _$jscoverage['plugins/table.action.js'][668]++; + if (isEmptyBlock(td)) { + _$jscoverage['plugins/table.action.js'][669]++; + range.setStart(td, 0).setCursor(false, true); + } + else { + _$jscoverage['plugins/table.action.js'][671]++; + range.selectNode(td).select(true); + } + _$jscoverage['plugins/table.action.js'][673]++; + state = me.queryCommandState(cmd); + _$jscoverage['plugins/table.action.js'][674]++; + value = me.queryCommandValue(cmd); + _$jscoverage['plugins/table.action.js'][675]++; + if ((state != -1)) { + _$jscoverage['plugins/table.action.js'][676]++; + if (((lastState !== state) || (lastValue !== value))) { + _$jscoverage['plugins/table.action.js'][677]++; + me._ignoreContentChange = true; + _$jscoverage['plugins/table.action.js'][678]++; + result = oldExecCommand.apply(me, arguments); + _$jscoverage['plugins/table.action.js'][679]++; + me._ignoreContentChange = false; + } + _$jscoverage['plugins/table.action.js'][682]++; + lastState = me.queryCommandState(cmd); + _$jscoverage['plugins/table.action.js'][683]++; + lastValue = me.queryCommandValue(cmd); + _$jscoverage['plugins/table.action.js'][684]++; + if (domUtils.isEmptyBlock(td)) { + _$jscoverage['plugins/table.action.js'][685]++; + domUtils.fillNode(me.document, td); + } + } +} + _$jscoverage['plugins/table.action.js'][689]++; + range.setStart(tds[0], 0).shrinkBoundary(true).setCursor(false, true); + _$jscoverage['plugins/table.action.js'][690]++; + me.fireEvent("contentchange"); + _$jscoverage['plugins/table.action.js'][691]++; + me.fireEvent("afterexeccommand", cmd); + _$jscoverage['plugins/table.action.js'][692]++; + me.__hasEnterExecCommand = false; + _$jscoverage['plugins/table.action.js'][693]++; + me._selectionChange(); + } + else { + _$jscoverage['plugins/table.action.js'][695]++; + result = oldExecCommand.apply(me, arguments); + } + _$jscoverage['plugins/table.action.js'][697]++; + return result; +}); +})); + _$jscoverage['plugins/table.action.js'][707]++; + function removeStyleSize(obj, replaceToProperty) { + _$jscoverage['plugins/table.action.js'][708]++; + removeStyle(obj, "width", true); + _$jscoverage['plugins/table.action.js'][709]++; + removeStyle(obj, "height", true); +} + _$jscoverage['plugins/table.action.js'][712]++; + function removeStyle(obj, styleName, replaceToProperty) { + _$jscoverage['plugins/table.action.js'][713]++; + if (obj.style[styleName]) { + _$jscoverage['plugins/table.action.js'][714]++; + (replaceToProperty && obj.setAttribute(styleName, parseInt(obj.style[styleName], 10))); + _$jscoverage['plugins/table.action.js'][715]++; + obj.style[styleName] = ""; + } +} + _$jscoverage['plugins/table.action.js'][719]++; + function getParentTdOrTh(ele) { + _$jscoverage['plugins/table.action.js'][720]++; + if (((ele.tagName == "TD") || (ele.tagName == "TH"))) { + _$jscoverage['plugins/table.action.js'][720]++; + return ele; + } + _$jscoverage['plugins/table.action.js'][721]++; + var td; + _$jscoverage['plugins/table.action.js'][722]++; + if ((td = (domUtils.findParentByTagName(ele, "td", true) || domUtils.findParentByTagName(ele, "th", true)))) { + _$jscoverage['plugins/table.action.js'][722]++; + return td; + } + _$jscoverage['plugins/table.action.js'][723]++; + return null; +} + _$jscoverage['plugins/table.action.js'][726]++; + function isEmptyBlock(node) { + _$jscoverage['plugins/table.action.js'][727]++; + var reg = new RegExp(domUtils.fillChar, "g"); + _$jscoverage['plugins/table.action.js'][728]++; + if ((node[(browser.ie? "innerText": "textContent")].replace(/^\s*$/, "").replace(reg, "").length > 0)) { + _$jscoverage['plugins/table.action.js'][729]++; + return 0; + } + _$jscoverage['plugins/table.action.js'][731]++; + for (var n in dtd.$isNotEmpty) { + _$jscoverage['plugins/table.action.js'][732]++; + if (node.getElementsByTagName(n).length) { + _$jscoverage['plugins/table.action.js'][733]++; + return 0; + } +} + _$jscoverage['plugins/table.action.js'][736]++; + return 1; +} + _$jscoverage['plugins/table.action.js'][740]++; + function mouseCoords(evt) { + _$jscoverage['plugins/table.action.js'][741]++; + if ((evt.pageX || evt.pageY)) { + _$jscoverage['plugins/table.action.js'][742]++; + return ({x: evt.pageX, y: evt.pageY}); + } + _$jscoverage['plugins/table.action.js'][744]++; + return ({x: ((evt.clientX + me.document.body.scrollLeft) - me.document.body.clientLeft), y: ((evt.clientY + me.document.body.scrollTop) - me.document.body.clientTop)}); +} + _$jscoverage['plugins/table.action.js'][750]++; + function mouseMoveEvent(evt) { + _$jscoverage['plugins/table.action.js'][752]++; + if (isEditorDisabled()) { + _$jscoverage['plugins/table.action.js'][753]++; + return; + } + _$jscoverage['plugins/table.action.js'][756]++; + try { + _$jscoverage['plugins/table.action.js'][759]++; + var target = getParentTdOrTh((evt.target || evt.srcElement)), pos; + _$jscoverage['plugins/table.action.js'][763]++; + if (isInResizeBuffer) { + _$jscoverage['plugins/table.action.js'][765]++; + me.body.style.webkitUserSelect = "none"; + _$jscoverage['plugins/table.action.js'][767]++; + if (((Math.abs((userActionStatus.x - evt.clientX)) > offsetOfTableCell) || (Math.abs((userActionStatus.y - evt.clientY)) > offsetOfTableCell))) { + _$jscoverage['plugins/table.action.js'][768]++; + clearTableDragTimer(); + _$jscoverage['plugins/table.action.js'][769]++; + isInResizeBuffer = false; + _$jscoverage['plugins/table.action.js'][770]++; + singleClickState = 0; + _$jscoverage['plugins/table.action.js'][772]++; + tableBorderDrag(evt); + } + } + _$jscoverage['plugins/table.action.js'][777]++; + if ((onDrag && dragTd)) { + _$jscoverage['plugins/table.action.js'][778]++; + singleClickState = 0; + _$jscoverage['plugins/table.action.js'][779]++; + me.body.style.webkitUserSelect = "none"; + _$jscoverage['plugins/table.action.js'][780]++; + (me.selection.getNative()[(browser.ie? "empty": "removeAllRanges")])(); + _$jscoverage['plugins/table.action.js'][781]++; + pos = mouseCoords(evt); + _$jscoverage['plugins/table.action.js'][782]++; + toggleDraggableState(me, true, onDrag, pos, target); + _$jscoverage['plugins/table.action.js'][783]++; + if ((onDrag == "h")) { + _$jscoverage['plugins/table.action.js'][784]++; + dragLine.style.left = (getPermissionX(dragTd, evt) + "px"); + } + else { + _$jscoverage['plugins/table.action.js'][785]++; + if ((onDrag == "v")) { + _$jscoverage['plugins/table.action.js'][786]++; + dragLine.style.top = (getPermissionY(dragTd, evt) + "px"); + } + } + _$jscoverage['plugins/table.action.js'][788]++; + return; + } + _$jscoverage['plugins/table.action.js'][791]++; + if (target) { + _$jscoverage['plugins/table.action.js'][793]++; + if ((me.fireEvent("excludetable", target) === true)) { + _$jscoverage['plugins/table.action.js'][794]++; + return; + } + _$jscoverage['plugins/table.action.js'][795]++; + pos = mouseCoords(evt); + _$jscoverage['plugins/table.action.js'][796]++; + var state = getRelation(target, pos), table = domUtils.findParentByTagName(target, "table", true); + _$jscoverage['plugins/table.action.js'][799]++; + if (inTableSide(table, target, evt, true)) { + _$jscoverage['plugins/table.action.js'][800]++; + if ((me.fireEvent("excludetable", table) === true)) { + _$jscoverage['plugins/table.action.js'][800]++; + return; + } + _$jscoverage['plugins/table.action.js'][801]++; + me.body.style.cursor = ("url(" + me.options.cursorpath + "h.png),pointer"); + } + else { + _$jscoverage['plugins/table.action.js'][802]++; + if (inTableSide(table, target, evt)) { + _$jscoverage['plugins/table.action.js'][803]++; + if ((me.fireEvent("excludetable", table) === true)) { + _$jscoverage['plugins/table.action.js'][803]++; + return; + } + _$jscoverage['plugins/table.action.js'][804]++; + me.body.style.cursor = ("url(" + me.options.cursorpath + "v.png),pointer"); + } + else { + _$jscoverage['plugins/table.action.js'][806]++; + me.body.style.cursor = "text"; + _$jscoverage['plugins/table.action.js'][807]++; + var curCell = target; + _$jscoverage['plugins/table.action.js'][808]++; + if (/\d/.test(state)) { + _$jscoverage['plugins/table.action.js'][809]++; + state = state.replace(/\d/, ""); + _$jscoverage['plugins/table.action.js'][810]++; + target = getUETable(target).getPreviewCell(target, (state == "v")); + } + _$jscoverage['plugins/table.action.js'][813]++; + toggleDraggableState(me, (target? (! (! state)): false), (target? state: ""), pos, target); + } + } + } + else { + _$jscoverage['plugins/table.action.js'][817]++; + toggleDragButton(false, table, me); + } + } + catch (e) { + _$jscoverage['plugins/table.action.js'][821]++; + showError(e); + } +} + _$jscoverage['plugins/table.action.js'][825]++; + var dragButtonTimer; + _$jscoverage['plugins/table.action.js'][827]++; + function toggleDragButton(show, table, editor) { + _$jscoverage['plugins/table.action.js'][828]++; + if ((! show)) { + _$jscoverage['plugins/table.action.js'][829]++; + if (dragOver) { + _$jscoverage['plugins/table.action.js'][829]++; + return; + } + _$jscoverage['plugins/table.action.js'][830]++; + dragButtonTimer = setTimeout((function () { + _$jscoverage['plugins/table.action.js'][831]++; + ((! dragOver) && dragButton && dragButton.parentNode && dragButton.parentNode.removeChild(dragButton)); +}), 2000); + } + else { + _$jscoverage['plugins/table.action.js'][834]++; + createDragButton(table, editor); + } +} + _$jscoverage['plugins/table.action.js'][838]++; + function createDragButton(table, editor) { + _$jscoverage['plugins/table.action.js'][839]++; + var pos = domUtils.getXY(table), doc = table.ownerDocument; + _$jscoverage['plugins/table.action.js'][841]++; + if ((dragButton && dragButton.parentNode)) { + _$jscoverage['plugins/table.action.js'][841]++; + return dragButton; + } + _$jscoverage['plugins/table.action.js'][842]++; + dragButton = doc.createElement("div"); + _$jscoverage['plugins/table.action.js'][843]++; + dragButton.contentEditable = false; + _$jscoverage['plugins/table.action.js'][844]++; + dragButton.innerHTML = ""; + _$jscoverage['plugins/table.action.js'][845]++; + 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;"); + _$jscoverage['plugins/table.action.js'][846]++; + domUtils.unSelectable(dragButton); + _$jscoverage['plugins/table.action.js'][847]++; + dragButton.onmouseover = (function (evt) { + _$jscoverage['plugins/table.action.js'][848]++; + dragOver = true; +}); + _$jscoverage['plugins/table.action.js'][850]++; + dragButton.onmouseout = (function (evt) { + _$jscoverage['plugins/table.action.js'][851]++; + dragOver = false; +}); + _$jscoverage['plugins/table.action.js'][853]++; + domUtils.on(dragButton, "click", (function (type, evt) { + _$jscoverage['plugins/table.action.js'][854]++; + doClick(evt, this); +})); + _$jscoverage['plugins/table.action.js'][856]++; + domUtils.on(dragButton, "dblclick", (function (type, evt) { + _$jscoverage['plugins/table.action.js'][857]++; + doDblClick(evt); +})); + _$jscoverage['plugins/table.action.js'][859]++; + domUtils.on(dragButton, "dragstart", (function (type, evt) { + _$jscoverage['plugins/table.action.js'][860]++; + domUtils.preventDefault(evt); +})); + _$jscoverage['plugins/table.action.js'][862]++; + var timer; + _$jscoverage['plugins/table.action.js'][864]++; + function doClick(evt, button) { + _$jscoverage['plugins/table.action.js'][866]++; + clearTimeout(timer); + _$jscoverage['plugins/table.action.js'][867]++; + timer = setTimeout((function () { + _$jscoverage['plugins/table.action.js'][868]++; + editor.fireEvent("tableClicked", table, button); +}), 300); +} + _$jscoverage['plugins/table.action.js'][872]++; + function doDblClick(evt) { + _$jscoverage['plugins/table.action.js'][873]++; + clearTimeout(timer); + _$jscoverage['plugins/table.action.js'][874]++; + var ut = getUETable(table), start = table.rows[0].cells[0], end = ut.getLastCell(), range = ut.getCellsRange(start, end); + _$jscoverage['plugins/table.action.js'][878]++; + editor.selection.getRange().setStart(start, 0).setCursor(false, true); + _$jscoverage['plugins/table.action.js'][879]++; + ut.setSelected(range); +} + _$jscoverage['plugins/table.action.js'][882]++; + doc.body.appendChild(dragButton); +} + _$jscoverage['plugins/table.action.js'][897]++; + function inTableSide(table, cell, evt, top) { + _$jscoverage['plugins/table.action.js'][898]++; + var pos = mouseCoords(evt), state = getRelation(cell, pos); + _$jscoverage['plugins/table.action.js'][901]++; + if (top) { + _$jscoverage['plugins/table.action.js'][902]++; + var caption = table.getElementsByTagName("caption")[0], capHeight = (caption? caption.offsetHeight: 0); + _$jscoverage['plugins/table.action.js'][904]++; + return ((state == "v1") && ((pos.y - domUtils.getXY(table).y - capHeight) < 8)); + } + else { + _$jscoverage['plugins/table.action.js'][906]++; + return ((state == "h1") && ((pos.x - domUtils.getXY(table).x) < 8)); + } +} + _$jscoverage['plugins/table.action.js'][915]++; + function getPermissionX(dragTd, evt) { + _$jscoverage['plugins/table.action.js'][916]++; + var ut = getUETable(dragTd); + _$jscoverage['plugins/table.action.js'][917]++; + if (ut) { + _$jscoverage['plugins/table.action.js'][918]++; + 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))); + _$jscoverage['plugins/table.action.js'][924]++; + left += cellMinWidth; + _$jscoverage['plugins/table.action.js'][925]++; + right -= cellMinWidth; + _$jscoverage['plugins/table.action.js'][927]++; + return ((mouseX < left)? left: ((mouseX > right)? right: mouseX)); + } +} + _$jscoverage['plugins/table.action.js'][934]++; + function getPermissionY(dragTd, evt) { + _$jscoverage['plugins/table.action.js'][935]++; + try { + _$jscoverage['plugins/table.action.js'][936]++; + var top = domUtils.getXY(dragTd).y, mousePosY = mouseCoords(evt).y; + _$jscoverage['plugins/table.action.js'][938]++; + return ((mousePosY < top)? top: mousePosY); + } + catch (e) { + _$jscoverage['plugins/table.action.js'][940]++; + showError(e); + } +} + _$jscoverage['plugins/table.action.js'][947]++; + function toggleDraggableState(editor, draggable, dir, mousePos, cell) { + _$jscoverage['plugins/table.action.js'][948]++; + try { + _$jscoverage['plugins/table.action.js'][949]++; + editor.body.style.cursor = ((dir == "h")? "col-resize": ((dir == "v")? "row-resize": "text")); + _$jscoverage['plugins/table.action.js'][950]++; + if (browser.ie) { + _$jscoverage['plugins/table.action.js'][951]++; + if ((dir && (! mousedown) && (! getUETableBySelected(editor)))) { + _$jscoverage['plugins/table.action.js'][952]++; + getDragLine(editor, editor.document); + _$jscoverage['plugins/table.action.js'][953]++; + showDragLineAt(dir, cell); + } + else { + _$jscoverage['plugins/table.action.js'][955]++; + hideDragLine(editor); + } + } + _$jscoverage['plugins/table.action.js'][958]++; + onBorder = draggable; + } + catch (e) { + _$jscoverage['plugins/table.action.js'][960]++; + showError(e); + } +} + _$jscoverage['plugins/table.action.js'][968]++; + function getResizeLineByUETable() { + _$jscoverage['plugins/table.action.js'][970]++; + var lineId = "_UETableResizeLine", line = this.document.getElementById(lineId); + _$jscoverage['plugins/table.action.js'][973]++; + if ((! line)) { + _$jscoverage['plugins/table.action.js'][974]++; + line = this.document.createElement("div"); + _$jscoverage['plugins/table.action.js'][975]++; + line.id = lineId; + _$jscoverage['plugins/table.action.js'][976]++; + line.contnetEditable = false; + _$jscoverage['plugins/table.action.js'][977]++; + line.setAttribute("unselectable", "on"); + _$jscoverage['plugins/table.action.js'][979]++; + var styles = {width: ((2 * cellBorderWidth) + 1 + "px"), position: "absolute", "z-index": 100000, cursor: "col-resize", background: "red", display: "none"}; + _$jscoverage['plugins/table.action.js'][989]++; + line.onmouseout = (function () { + _$jscoverage['plugins/table.action.js'][990]++; + this.style.display = "none"; +}); + _$jscoverage['plugins/table.action.js'][993]++; + utils.extend(line.style, styles); + _$jscoverage['plugins/table.action.js'][995]++; + this.document.body.appendChild(line); + } + _$jscoverage['plugins/table.action.js'][999]++; + return line; +} + _$jscoverage['plugins/table.action.js'][1006]++; + function updateResizeLine(cell, uetable) { + _$jscoverage['plugins/table.action.js'][1008]++; + 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")}; + _$jscoverage['plugins/table.action.js'][1017]++; + utils.extend(line.style, styles); +} + _$jscoverage['plugins/table.action.js'][1024]++; + function showResizeLine(cell) { + _$jscoverage['plugins/table.action.js'][1026]++; + var uetable = getUETable(cell); + _$jscoverage['plugins/table.action.js'][1028]++; + updateResizeLine.call(this, cell, uetable); +} + _$jscoverage['plugins/table.action.js'][1037]++; + function getRelation(ele, mousePos) { + _$jscoverage['plugins/table.action.js'][1038]++; + var elePos = domUtils.getXY(ele); + _$jscoverage['plugins/table.action.js'][1040]++; + if ((! elePos)) { + _$jscoverage['plugins/table.action.js'][1041]++; + return ""; + } + _$jscoverage['plugins/table.action.js'][1044]++; + if ((((elePos.x + ele.offsetWidth) - mousePos.x) < cellBorderWidth)) { + _$jscoverage['plugins/table.action.js'][1045]++; + return "h"; + } + _$jscoverage['plugins/table.action.js'][1047]++; + if (((mousePos.x - elePos.x) < cellBorderWidth)) { + _$jscoverage['plugins/table.action.js'][1048]++; + return "h1"; + } + _$jscoverage['plugins/table.action.js'][1050]++; + if ((((elePos.y + ele.offsetHeight) - mousePos.y) < cellBorderWidth)) { + _$jscoverage['plugins/table.action.js'][1051]++; + return "v"; + } + _$jscoverage['plugins/table.action.js'][1053]++; + if (((mousePos.y - elePos.y) < cellBorderWidth)) { + _$jscoverage['plugins/table.action.js'][1054]++; + return "v1"; + } + _$jscoverage['plugins/table.action.js'][1056]++; + return ""; +} + _$jscoverage['plugins/table.action.js'][1059]++; + function mouseDownEvent(type, evt) { + _$jscoverage['plugins/table.action.js'][1061]++; + if (isEditorDisabled()) { + _$jscoverage['plugins/table.action.js'][1062]++; + return; + } + _$jscoverage['plugins/table.action.js'][1065]++; + userActionStatus = {x: evt.clientX, y: evt.clientY}; + _$jscoverage['plugins/table.action.js'][1071]++; + if ((evt.button == 2)) { + _$jscoverage['plugins/table.action.js'][1072]++; + var ut = getUETableBySelected(me), flag = false; + _$jscoverage['plugins/table.action.js'][1075]++; + if (ut) { + _$jscoverage['plugins/table.action.js'][1076]++; + var td = getTargetTd(me, evt); + _$jscoverage['plugins/table.action.js'][1077]++; + utils.each(ut.selectedTds, (function (ti) { + _$jscoverage['plugins/table.action.js'][1078]++; + if ((ti === td)) { + _$jscoverage['plugins/table.action.js'][1079]++; + flag = true; + } +})); + _$jscoverage['plugins/table.action.js'][1082]++; + if ((! flag)) { + _$jscoverage['plugins/table.action.js'][1083]++; + removeSelectedClass(domUtils.getElementsByTagName(me.body, "th td")); + _$jscoverage['plugins/table.action.js'][1084]++; + ut.clearSelected(); + } + else { + _$jscoverage['plugins/table.action.js'][1086]++; + td = ut.selectedTds[0]; + _$jscoverage['plugins/table.action.js'][1087]++; + setTimeout((function () { + _$jscoverage['plugins/table.action.js'][1088]++; + me.selection.getRange().setStart(td, 0).setCursor(false, true); +}), 0); + } + } + } + else { + _$jscoverage['plugins/table.action.js'][1094]++; + tableClickHander(evt); + } +} + _$jscoverage['plugins/table.action.js'][1100]++; + function clearTableTimer() { + _$jscoverage['plugins/table.action.js'][1101]++; + (tabTimer && clearTimeout(tabTimer)); + _$jscoverage['plugins/table.action.js'][1102]++; + tabTimer = null; +} + _$jscoverage['plugins/table.action.js'][1106]++; + function tableDbclickHandler(evt) { + _$jscoverage['plugins/table.action.js'][1107]++; + singleClickState = 0; + _$jscoverage['plugins/table.action.js'][1108]++; + evt = (evt || me.window.event); + _$jscoverage['plugins/table.action.js'][1109]++; + var target = getParentTdOrTh((evt.target || evt.srcElement)); + _$jscoverage['plugins/table.action.js'][1110]++; + if (target) { + _$jscoverage['plugins/table.action.js'][1111]++; + var h; + _$jscoverage['plugins/table.action.js'][1112]++; + if ((h = getRelation(target, mouseCoords(evt)))) { + _$jscoverage['plugins/table.action.js'][1114]++; + hideDragLine(me); + _$jscoverage['plugins/table.action.js'][1116]++; + if ((h == "h1")) { + _$jscoverage['plugins/table.action.js'][1117]++; + h = "h"; + _$jscoverage['plugins/table.action.js'][1118]++; + if (inTableSide(domUtils.findParentByTagName(target, "table"), target, evt)) { + _$jscoverage['plugins/table.action.js'][1119]++; + me.execCommand("adaptbywindow"); + } + else { + _$jscoverage['plugins/table.action.js'][1121]++; + target = getUETable(target).getPreviewCell(target); + _$jscoverage['plugins/table.action.js'][1122]++; + if (target) { + _$jscoverage['plugins/table.action.js'][1123]++; + var rng = me.selection.getRange(); + _$jscoverage['plugins/table.action.js'][1124]++; + rng.selectNodeContents(target).setCursor(true, true); + } + } + } + _$jscoverage['plugins/table.action.js'][1128]++; + if ((h == "h")) { + _$jscoverage['plugins/table.action.js'][1129]++; + var ut = getUETable(target), table = ut.table, cells = getCellsByMoveBorder(target, table, true); + _$jscoverage['plugins/table.action.js'][1133]++; + cells = extractArray(cells, "left"); + _$jscoverage['plugins/table.action.js'][1135]++; + ut.width = ut.offsetWidth; + _$jscoverage['plugins/table.action.js'][1137]++; + var oldWidth = [], newWidth = []; + _$jscoverage['plugins/table.action.js'][1140]++; + utils.each(cells, (function (cell) { + _$jscoverage['plugins/table.action.js'][1142]++; + oldWidth.push(cell.offsetWidth); +})); + _$jscoverage['plugins/table.action.js'][1146]++; + utils.each(cells, (function (cell) { + _$jscoverage['plugins/table.action.js'][1148]++; + cell.removeAttribute("width"); +})); + _$jscoverage['plugins/table.action.js'][1152]++; + window.setTimeout((function () { + _$jscoverage['plugins/table.action.js'][1155]++; + var changeable = true; + _$jscoverage['plugins/table.action.js'][1157]++; + utils.each(cells, (function (cell, index) { + _$jscoverage['plugins/table.action.js'][1159]++; + var width = cell.offsetWidth; + _$jscoverage['plugins/table.action.js'][1161]++; + if ((width > oldWidth[index])) { + _$jscoverage['plugins/table.action.js'][1162]++; + changeable = false; + _$jscoverage['plugins/table.action.js'][1163]++; + return false; + } + _$jscoverage['plugins/table.action.js'][1166]++; + newWidth.push(width); +})); + _$jscoverage['plugins/table.action.js'][1170]++; + var change = (changeable? newWidth: oldWidth); + _$jscoverage['plugins/table.action.js'][1172]++; + utils.each(cells, (function (cell, index) { + _$jscoverage['plugins/table.action.js'][1174]++; + cell.width = (change[index] - getTabcellSpace()); +})); +}), 0); + } + } + } +} + _$jscoverage['plugins/table.action.js'][1194]++; + function tableClickHander(evt) { + _$jscoverage['plugins/table.action.js'][1196]++; + removeSelectedClass(domUtils.getElementsByTagName(me.body, "td th")); + _$jscoverage['plugins/table.action.js'][1199]++; + utils.each(me.document.getElementsByTagName("table"), (function (t) { + _$jscoverage['plugins/table.action.js'][1200]++; + t.ueTable = null; +})); + _$jscoverage['plugins/table.action.js'][1202]++; + startTd = getTargetTd(me, evt); + _$jscoverage['plugins/table.action.js'][1203]++; + if ((! startTd)) { + _$jscoverage['plugins/table.action.js'][1203]++; + return; + } + _$jscoverage['plugins/table.action.js'][1204]++; + var table = domUtils.findParentByTagName(startTd, "table", true); + _$jscoverage['plugins/table.action.js'][1205]++; + ut = getUETable(table); + _$jscoverage['plugins/table.action.js'][1206]++; + (ut && ut.clearSelected()); + _$jscoverage['plugins/table.action.js'][1209]++; + if ((! onBorder)) { + _$jscoverage['plugins/table.action.js'][1210]++; + me.document.body.style.webkitUserSelect = ""; + _$jscoverage['plugins/table.action.js'][1211]++; + mousedown = true; + _$jscoverage['plugins/table.action.js'][1212]++; + me.addListener("mouseover", mouseOverEvent); + } + else { + _$jscoverage['plugins/table.action.js'][1215]++; + borderActionHandler(evt); + } +} + _$jscoverage['plugins/table.action.js'][1222]++; + function borderActionHandler(evt) { + _$jscoverage['plugins/table.action.js'][1224]++; + if (browser.ie) { + _$jscoverage['plugins/table.action.js'][1225]++; + evt = reconstruct(evt); + } + _$jscoverage['plugins/table.action.js'][1228]++; + clearTableDragTimer(); + _$jscoverage['plugins/table.action.js'][1231]++; + isInResizeBuffer = true; + _$jscoverage['plugins/table.action.js'][1233]++; + tableDragTimer = setTimeout((function () { + _$jscoverage['plugins/table.action.js'][1234]++; + tableBorderDrag(evt); +}), dblclickTime); +} + _$jscoverage['plugins/table.action.js'][1239]++; + function extractArray(originArr, key) { + _$jscoverage['plugins/table.action.js'][1241]++; + var result = [], tmp = null; + _$jscoverage['plugins/table.action.js'][1244]++; + for (var i = 0, len = originArr.length; (i < len); (i++)) { + _$jscoverage['plugins/table.action.js'][1246]++; + tmp = originArr[i][key]; + _$jscoverage['plugins/table.action.js'][1248]++; + if (tmp) { + _$jscoverage['plugins/table.action.js'][1249]++; + result.push(tmp); + } +} + _$jscoverage['plugins/table.action.js'][1254]++; + return result; +} + _$jscoverage['plugins/table.action.js'][1258]++; + function clearTableDragTimer() { + _$jscoverage['plugins/table.action.js'][1259]++; + (tableDragTimer && clearTimeout(tableDragTimer)); + _$jscoverage['plugins/table.action.js'][1260]++; + tableDragTimer = null; +} + _$jscoverage['plugins/table.action.js'][1263]++; + function reconstruct(obj) { + _$jscoverage['plugins/table.action.js'][1265]++; + var attrs = ["pageX", "pageY", "clientX", "clientY", "srcElement", "target"], newObj = {}; + _$jscoverage['plugins/table.action.js'][1268]++; + if (obj) { + _$jscoverage['plugins/table.action.js'][1270]++; + for (var i = 0, key, val; (key = attrs[i]); (i++)) { + _$jscoverage['plugins/table.action.js'][1271]++; + val = obj[key]; + _$jscoverage['plugins/table.action.js'][1272]++; + (val && (newObj[key] = val)); +} + } + _$jscoverage['plugins/table.action.js'][1277]++; + return newObj; +} + _$jscoverage['plugins/table.action.js'][1282]++; + function tableBorderDrag(evt) { + _$jscoverage['plugins/table.action.js'][1284]++; + isInResizeBuffer = false; + _$jscoverage['plugins/table.action.js'][1286]++; + if ((! startTd)) { + _$jscoverage['plugins/table.action.js'][1286]++; + return; + } + _$jscoverage['plugins/table.action.js'][1287]++; + var state = ((Math.abs((userActionStatus.x - evt.clientX)) >= Math.abs((userActionStatus.y - evt.clientY)))? "h": "v"); + _$jscoverage['plugins/table.action.js'][1289]++; + if (/\d/.test(state)) { + _$jscoverage['plugins/table.action.js'][1290]++; + state = state.replace(/\d/, ""); + _$jscoverage['plugins/table.action.js'][1291]++; + startTd = getUETable(startTd).getPreviewCell(startTd, (state == "v")); + } + _$jscoverage['plugins/table.action.js'][1293]++; + hideDragLine(me); + _$jscoverage['plugins/table.action.js'][1294]++; + getDragLine(me, me.document); + _$jscoverage['plugins/table.action.js'][1295]++; + me.fireEvent("saveScene"); + _$jscoverage['plugins/table.action.js'][1296]++; + showDragLineAt(state, startTd); + _$jscoverage['plugins/table.action.js'][1297]++; + mousedown = true; + _$jscoverage['plugins/table.action.js'][1299]++; + onDrag = state; + _$jscoverage['plugins/table.action.js'][1300]++; + dragTd = startTd; +} + _$jscoverage['plugins/table.action.js'][1303]++; + function mouseUpEvent(type, evt) { + _$jscoverage['plugins/table.action.js'][1305]++; + if (isEditorDisabled()) { + _$jscoverage['plugins/table.action.js'][1306]++; + return; + } + _$jscoverage['plugins/table.action.js'][1309]++; + clearTableDragTimer(); + _$jscoverage['plugins/table.action.js'][1311]++; + isInResizeBuffer = false; + _$jscoverage['plugins/table.action.js'][1313]++; + if (onBorder) { + _$jscoverage['plugins/table.action.js'][1314]++; + singleClickState = ((++singleClickState) % 3); + _$jscoverage['plugins/table.action.js'][1316]++; + userActionStatus = {x: evt.clientX, y: evt.clientY}; + _$jscoverage['plugins/table.action.js'][1321]++; + tableResizeTimer = setTimeout((function () { + _$jscoverage['plugins/table.action.js'][1322]++; + ((singleClickState > 0) && (singleClickState--)); +}), dblclickTime); + _$jscoverage['plugins/table.action.js'][1325]++; + if ((singleClickState === 2)) { + _$jscoverage['plugins/table.action.js'][1327]++; + singleClickState = 0; + _$jscoverage['plugins/table.action.js'][1328]++; + tableDbclickHandler(evt); + _$jscoverage['plugins/table.action.js'][1329]++; + return; + } + } + _$jscoverage['plugins/table.action.js'][1335]++; + if ((evt.button == 2)) { + _$jscoverage['plugins/table.action.js'][1335]++; + return; + } + _$jscoverage['plugins/table.action.js'][1336]++; + var me = this; + _$jscoverage['plugins/table.action.js'][1338]++; + var range = me.selection.getRange(), start = domUtils.findParentByTagName(range.startContainer, "table", true), end = domUtils.findParentByTagName(range.endContainer, "table", true); + _$jscoverage['plugins/table.action.js'][1342]++; + if ((start || end)) { + _$jscoverage['plugins/table.action.js'][1343]++; + if ((start === end)) { + _$jscoverage['plugins/table.action.js'][1344]++; + start = domUtils.findParentByTagName(range.startContainer, ["td", "th", "caption"], true); + _$jscoverage['plugins/table.action.js'][1345]++; + end = domUtils.findParentByTagName(range.endContainer, ["td", "th", "caption"], true); + _$jscoverage['plugins/table.action.js'][1346]++; + if ((start !== end)) { + _$jscoverage['plugins/table.action.js'][1347]++; + me.selection.clearRange(); + } + } + else { + _$jscoverage['plugins/table.action.js'][1350]++; + me.selection.clearRange(); + } + } + _$jscoverage['plugins/table.action.js'][1353]++; + mousedown = false; + _$jscoverage['plugins/table.action.js'][1354]++; + me.document.body.style.webkitUserSelect = ""; + _$jscoverage['plugins/table.action.js'][1356]++; + if ((onDrag && dragTd)) { + _$jscoverage['plugins/table.action.js'][1358]++; + (me.selection.getNative()[(browser.ie? "empty": "removeAllRanges")])(); + _$jscoverage['plugins/table.action.js'][1360]++; + singleClickState = 0; + _$jscoverage['plugins/table.action.js'][1361]++; + dragLine = me.document.getElementById("ue_tableDragLine"); + _$jscoverage['plugins/table.action.js'][1363]++; + var dragTdPos = domUtils.getXY(dragTd), dragLinePos = domUtils.getXY(dragLine); + _$jscoverage['plugins/table.action.js'][1366]++; + switch (onDrag) { + case "h": + _$jscoverage['plugins/table.action.js'][1368]++; + changeColWidth(dragTd, (dragLinePos.x - dragTdPos.x)); + _$jscoverage['plugins/table.action.js'][1369]++; + break; + case "v": + _$jscoverage['plugins/table.action.js'][1371]++; + changeRowHeight(dragTd, (dragLinePos.y - dragTdPos.y - dragTd.offsetHeight)); + _$jscoverage['plugins/table.action.js'][1372]++; + break; + default: + } + _$jscoverage['plugins/table.action.js'][1375]++; + onDrag = ""; + _$jscoverage['plugins/table.action.js'][1376]++; + dragTd = null; + _$jscoverage['plugins/table.action.js'][1378]++; + hideDragLine(me); + _$jscoverage['plugins/table.action.js'][1379]++; + me.fireEvent("saveScene"); + _$jscoverage['plugins/table.action.js'][1380]++; + return; + } + _$jscoverage['plugins/table.action.js'][1383]++; + if ((! startTd)) { + _$jscoverage['plugins/table.action.js'][1384]++; + var target = domUtils.findParentByTagName((evt.target || evt.srcElement), "td", true); + _$jscoverage['plugins/table.action.js'][1385]++; + if ((! target)) { + _$jscoverage['plugins/table.action.js'][1385]++; + target = domUtils.findParentByTagName((evt.target || evt.srcElement), "th", true); + } + _$jscoverage['plugins/table.action.js'][1386]++; + if ((target && ((target.tagName == "TD") || (target.tagName == "TH")))) { + _$jscoverage['plugins/table.action.js'][1387]++; + if ((me.fireEvent("excludetable", target) === true)) { + _$jscoverage['plugins/table.action.js'][1387]++; + return; + } + _$jscoverage['plugins/table.action.js'][1388]++; + range = new (dom.Range)(me.document); + _$jscoverage['plugins/table.action.js'][1389]++; + range.setStart(target, 0).setCursor(false, true); + } + } + else { + _$jscoverage['plugins/table.action.js'][1392]++; + var ut = getUETable(startTd), cell = (ut? ut.selectedTds[0]: null); + _$jscoverage['plugins/table.action.js'][1394]++; + if (cell) { + _$jscoverage['plugins/table.action.js'][1395]++; + range = new (dom.Range)(me.document); + _$jscoverage['plugins/table.action.js'][1396]++; + if (domUtils.isEmptyBlock(cell)) { + _$jscoverage['plugins/table.action.js'][1397]++; + range.setStart(cell, 0).setCursor(false, true); + } + else { + _$jscoverage['plugins/table.action.js'][1399]++; + range.selectNodeContents(cell).shrinkBoundary().setCursor(false, true); + } + } + else { + _$jscoverage['plugins/table.action.js'][1402]++; + range = me.selection.getRange().shrinkBoundary(); + _$jscoverage['plugins/table.action.js'][1403]++; + if ((! range.collapsed)) { + _$jscoverage['plugins/table.action.js'][1404]++; + var start = domUtils.findParentByTagName(range.startContainer, ["td", "th"], true), end = domUtils.findParentByTagName(range.endContainer, ["td", "th"], true); + _$jscoverage['plugins/table.action.js'][1407]++; + if (((start && (! end)) || ((! start) && end) || (start && end && (start !== end)))) { + _$jscoverage['plugins/table.action.js'][1408]++; + range.setCursor(false, true); + } + } + } + _$jscoverage['plugins/table.action.js'][1412]++; + startTd = null; + _$jscoverage['plugins/table.action.js'][1413]++; + me.removeListener("mouseover", mouseOverEvent); + } + _$jscoverage['plugins/table.action.js'][1415]++; + me._selectionChange(250, evt); +} + _$jscoverage['plugins/table.action.js'][1418]++; + function mouseOverEvent(type, evt) { + _$jscoverage['plugins/table.action.js'][1420]++; + if (isEditorDisabled()) { + _$jscoverage['plugins/table.action.js'][1421]++; + return; + } + _$jscoverage['plugins/table.action.js'][1424]++; + var me = this, tar = (evt.target || evt.srcElement); + _$jscoverage['plugins/table.action.js'][1426]++; + currentTd = (domUtils.findParentByTagName(tar, "td", true) || domUtils.findParentByTagName(tar, "th", true)); + _$jscoverage['plugins/table.action.js'][1428]++; + if ((startTd && currentTd && (((startTd.tagName == "TD") && (currentTd.tagName == "TD")) || ((startTd.tagName == "TH") && (currentTd.tagName == "TH"))) && (domUtils.findParentByTagName(startTd, "table") == domUtils.findParentByTagName(currentTd, "table")))) { + _$jscoverage['plugins/table.action.js'][1431]++; + var ut = getUETable(currentTd); + _$jscoverage['plugins/table.action.js'][1432]++; + if ((startTd != currentTd)) { + _$jscoverage['plugins/table.action.js'][1433]++; + me.document.body.style.webkitUserSelect = "none"; + _$jscoverage['plugins/table.action.js'][1434]++; + (me.selection.getNative()[(browser.ie? "empty": "removeAllRanges")])(); + _$jscoverage['plugins/table.action.js'][1435]++; + var range = ut.getCellsRange(startTd, currentTd); + _$jscoverage['plugins/table.action.js'][1436]++; + ut.setSelected(range); + } + else { + _$jscoverage['plugins/table.action.js'][1438]++; + me.document.body.style.webkitUserSelect = ""; + _$jscoverage['plugins/table.action.js'][1439]++; + ut.clearSelected(); + } + } + _$jscoverage['plugins/table.action.js'][1443]++; + (evt.preventDefault? evt.preventDefault(): (evt.returnValue = false)); +} + _$jscoverage['plugins/table.action.js'][1446]++; + function setCellHeight(cell, height, backHeight) { + _$jscoverage['plugins/table.action.js'][1447]++; + var lineHight = parseInt(domUtils.getComputedStyle(cell, "line-height"), 10), tmpHeight = (backHeight + height); + _$jscoverage['plugins/table.action.js'][1449]++; + height = ((tmpHeight < lineHight)? lineHight: tmpHeight); + _$jscoverage['plugins/table.action.js'][1450]++; + if (cell.style.height) { + _$jscoverage['plugins/table.action.js'][1450]++; + cell.style.height = ""; + } + _$jscoverage['plugins/table.action.js'][1451]++; + ((cell.rowSpan == 1)? cell.setAttribute("height", height): (cell.removeAttribute && cell.removeAttribute("height"))); +} + _$jscoverage['plugins/table.action.js'][1454]++; + function getWidth(cell) { + _$jscoverage['plugins/table.action.js'][1455]++; + if ((! cell)) { + _$jscoverage['plugins/table.action.js'][1455]++; + return 0; + } + _$jscoverage['plugins/table.action.js'][1456]++; + return parseInt(domUtils.getComputedStyle(cell, "width"), 10); +} + _$jscoverage['plugins/table.action.js'][1459]++; + function changeColWidth(cell, changeValue) { + _$jscoverage['plugins/table.action.js'][1461]++; + var ut = getUETable(cell); + _$jscoverage['plugins/table.action.js'][1462]++; + if (ut) { + _$jscoverage['plugins/table.action.js'][1465]++; + var table = ut.table, cells = getCellsByMoveBorder(cell, table); + _$jscoverage['plugins/table.action.js'][1468]++; + table.style.width = ""; + _$jscoverage['plugins/table.action.js'][1469]++; + table.removeAttribute("width"); + _$jscoverage['plugins/table.action.js'][1472]++; + changeValue = correctChangeValue(changeValue, cell, cells); + _$jscoverage['plugins/table.action.js'][1474]++; + if (cell.nextSibling) { + _$jscoverage['plugins/table.action.js'][1476]++; + var i = 0; + _$jscoverage['plugins/table.action.js'][1478]++; + utils.each(cells, (function (cellGroup) { + _$jscoverage['plugins/table.action.js'][1480]++; + cellGroup.left.width = ((+ cellGroup.left.width) + changeValue); + _$jscoverage['plugins/table.action.js'][1481]++; + (cellGroup.right && (cellGroup.right.width = ((+ cellGroup.right.width) - changeValue))); +})); + } + else { + _$jscoverage['plugins/table.action.js'][1487]++; + utils.each(cells, (function (cellGroup) { + _$jscoverage['plugins/table.action.js'][1488]++; + cellGroup.left.width -= (- changeValue); +})); + } + } +} + _$jscoverage['plugins/table.action.js'][1496]++; + function isEditorDisabled() { + _$jscoverage['plugins/table.action.js'][1497]++; + return (me.body.contentEditable === "false"); +} + _$jscoverage['plugins/table.action.js'][1500]++; + function changeRowHeight(td, changeValue) { + _$jscoverage['plugins/table.action.js'][1501]++; + if ((Math.abs(changeValue) < 10)) { + _$jscoverage['plugins/table.action.js'][1501]++; + return; + } + _$jscoverage['plugins/table.action.js'][1502]++; + var ut = getUETable(td); + _$jscoverage['plugins/table.action.js'][1503]++; + if (ut) { + _$jscoverage['plugins/table.action.js'][1504]++; + var cells = ut.getSameEndPosCells(td, "y"), backHeight = (cells[0]? cells[0].offsetHeight: 0); + _$jscoverage['plugins/table.action.js'][1507]++; + for (var i = 0, cell; (cell = cells[(i++)]);) { + _$jscoverage['plugins/table.action.js'][1508]++; + setCellHeight(cell, changeValue, backHeight); +} + } +} + _$jscoverage['plugins/table.action.js'][1518]++; + function getCellsByMoveBorder(cell, table, isContainMergeCell) { + _$jscoverage['plugins/table.action.js'][1520]++; + if ((! table)) { + _$jscoverage['plugins/table.action.js'][1521]++; + table = domUtils.findParentByTagName(cell, "table"); + } + _$jscoverage['plugins/table.action.js'][1524]++; + if ((! table)) { + _$jscoverage['plugins/table.action.js'][1525]++; + return null; + } + _$jscoverage['plugins/table.action.js'][1529]++; + var index = domUtils.getNodeIndex(cell), temp = cell, rows = table.rows, colIndex = 0; + _$jscoverage['plugins/table.action.js'][1534]++; + while (temp) { + _$jscoverage['plugins/table.action.js'][1536]++; + if ((temp.nodeType === 1)) { + _$jscoverage['plugins/table.action.js'][1537]++; + colIndex += (temp.colSpan || 1); + } + _$jscoverage['plugins/table.action.js'][1539]++; + temp = temp.previousSibling; +} + _$jscoverage['plugins/table.action.js'][1542]++; + temp = null; + _$jscoverage['plugins/table.action.js'][1545]++; + var borderCells = []; + _$jscoverage['plugins/table.action.js'][1547]++; + utils.each(rows, (function (tabRow) { + _$jscoverage['plugins/table.action.js'][1549]++; + var cells = tabRow.cells, currIndex = 0; + _$jscoverage['plugins/table.action.js'][1552]++; + utils.each(cells, (function (tabCell) { + _$jscoverage['plugins/table.action.js'][1554]++; + currIndex += (tabCell.colSpan || 1); + _$jscoverage['plugins/table.action.js'][1556]++; + if ((currIndex === colIndex)) { + _$jscoverage['plugins/table.action.js'][1558]++; + borderCells.push({left: tabCell, right: (tabCell.nextSibling || null)}); + _$jscoverage['plugins/table.action.js'][1563]++; + return false; + } + else { + _$jscoverage['plugins/table.action.js'][1565]++; + if ((currIndex > colIndex)) { + _$jscoverage['plugins/table.action.js'][1567]++; + if (isContainMergeCell) { + _$jscoverage['plugins/table.action.js'][1568]++; + borderCells.push({left: tabCell}); + } + _$jscoverage['plugins/table.action.js'][1573]++; + return false; + } + } +})); +})); + _$jscoverage['plugins/table.action.js'][1581]++; + return borderCells; +} + _$jscoverage['plugins/table.action.js'][1589]++; + function getMinWidthByTableCells(cells) { + _$jscoverage['plugins/table.action.js'][1591]++; + var minWidth = Number.MAX_VALUE; + _$jscoverage['plugins/table.action.js'][1593]++; + for (var i = 0, curCell; (curCell = cells[i]); (i++)) { + _$jscoverage['plugins/table.action.js'][1595]++; + minWidth = Math.min(minWidth, (curCell.width || getTableCellWidth(curCell))); +} + _$jscoverage['plugins/table.action.js'][1599]++; + return minWidth; +} + _$jscoverage['plugins/table.action.js'][1603]++; + function correctChangeValue(changeValue, relatedCell, cells) { + _$jscoverage['plugins/table.action.js'][1606]++; + changeValue -= getTabcellSpace(); + _$jscoverage['plugins/table.action.js'][1608]++; + if ((changeValue < 0)) { + _$jscoverage['plugins/table.action.js'][1609]++; + return 0; + } + _$jscoverage['plugins/table.action.js'][1612]++; + changeValue -= getTableCellWidth(relatedCell); + _$jscoverage['plugins/table.action.js'][1615]++; + var direction = ((changeValue < 0)? "left": "right"); + _$jscoverage['plugins/table.action.js'][1617]++; + changeValue = Math.abs(changeValue); + _$jscoverage['plugins/table.action.js'][1620]++; + utils.each(cells, (function (cellGroup) { + _$jscoverage['plugins/table.action.js'][1622]++; + var curCell = cellGroup[direction]; + _$jscoverage['plugins/table.action.js'][1625]++; + if (curCell) { + _$jscoverage['plugins/table.action.js'][1626]++; + changeValue = Math.min(changeValue, (getTableCellWidth(curCell) - cellMinWidth)); + } +})); + _$jscoverage['plugins/table.action.js'][1634]++; + changeValue = ((changeValue < 0)? 0: changeValue); + _$jscoverage['plugins/table.action.js'][1636]++; + return ((direction === "left")? (- changeValue): changeValue); +} + _$jscoverage['plugins/table.action.js'][1640]++; + function getTableCellWidth(cell) { + _$jscoverage['plugins/table.action.js'][1642]++; + var width = 0, offset = 0, width = (cell.offsetWidth - getTabcellSpace()); + _$jscoverage['plugins/table.action.js'][1648]++; + if ((! cell.nextSibling)) { + _$jscoverage['plugins/table.action.js'][1650]++; + width -= getTableCellOffset(cell); + } + _$jscoverage['plugins/table.action.js'][1654]++; + width = ((width < 0)? 0: width); + _$jscoverage['plugins/table.action.js'][1656]++; + try { + _$jscoverage['plugins/table.action.js'][1657]++; + cell.width = width; + } + catch (e) { + } + _$jscoverage['plugins/table.action.js'][1661]++; + return width; +} + _$jscoverage['plugins/table.action.js'][1668]++; + function getTableCellOffset(cell) { + _$jscoverage['plugins/table.action.js'][1670]++; + tab = domUtils.findParentByTagName(cell, "table", false); + _$jscoverage['plugins/table.action.js'][1672]++; + if ((tab.offsetVal === undefined)) { + _$jscoverage['plugins/table.action.js'][1674]++; + var prev = cell.previousSibling; + _$jscoverage['plugins/table.action.js'][1676]++; + if (prev) { + _$jscoverage['plugins/table.action.js'][1679]++; + tab.offsetVal = (((cell.offsetWidth - prev.offsetWidth) === UT.borderWidth)? UT.borderWidth: 0); + } + else { + _$jscoverage['plugins/table.action.js'][1682]++; + tab.offsetVal = 0; + } + } + _$jscoverage['plugins/table.action.js'][1687]++; + return tab.offsetVal; +} + _$jscoverage['plugins/table.action.js'][1691]++; + function getTabcellSpace() { + _$jscoverage['plugins/table.action.js'][1693]++; + if ((UT.tabcellSpace === undefined)) { + _$jscoverage['plugins/table.action.js'][1695]++; + 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; + _$jscoverage['plugins/table.action.js'][1702]++; + tabcell.style.cssText = "border: 0;"; + _$jscoverage['plugins/table.action.js'][1703]++; + tabcell.width = 1; + _$jscoverage['plugins/table.action.js'][1705]++; + trow.appendChild(tabcell); + _$jscoverage['plugins/table.action.js'][1706]++; + trow.appendChild((mirror = tabcell.cloneNode(false))); + _$jscoverage['plugins/table.action.js'][1708]++; + tbody.appendChild(trow); + _$jscoverage['plugins/table.action.js'][1710]++; + tab.appendChild(tbody); + _$jscoverage['plugins/table.action.js'][1712]++; + tab.style.cssText = "visibility: hidden;"; + _$jscoverage['plugins/table.action.js'][1714]++; + me.body.appendChild(tab); + _$jscoverage['plugins/table.action.js'][1716]++; + UT.paddingSpace = (tabcell.offsetWidth - 1); + _$jscoverage['plugins/table.action.js'][1718]++; + var tmpTabWidth = tab.offsetWidth; + _$jscoverage['plugins/table.action.js'][1720]++; + tabcell.style.cssText = ""; + _$jscoverage['plugins/table.action.js'][1721]++; + mirror.style.cssText = ""; + _$jscoverage['plugins/table.action.js'][1723]++; + UT.borderWidth = ((tab.offsetWidth - tmpTabWidth) / 3); + _$jscoverage['plugins/table.action.js'][1725]++; + UT.tabcellSpace = (UT.paddingSpace + UT.borderWidth); + _$jscoverage['plugins/table.action.js'][1727]++; + me.body.removeChild(tab); + } + _$jscoverage['plugins/table.action.js'][1731]++; + getTabcellSpace = (function () { + _$jscoverage['plugins/table.action.js'][1731]++; + return UT.tabcellSpace; +}); + _$jscoverage['plugins/table.action.js'][1733]++; + return UT.tabcellSpace; +} + _$jscoverage['plugins/table.action.js'][1737]++; + function getDragLine(editor, doc) { + _$jscoverage['plugins/table.action.js'][1738]++; + if (mousedown) { + _$jscoverage['plugins/table.action.js'][1738]++; + return; + } + _$jscoverage['plugins/table.action.js'][1739]++; + dragLine = editor.document.createElement("div"); + _$jscoverage['plugins/table.action.js'][1740]++; + 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)"}); + _$jscoverage['plugins/table.action.js'][1749]++; + editor.body.appendChild(dragLine); +} + _$jscoverage['plugins/table.action.js'][1752]++; + function hideDragLine(editor) { + _$jscoverage['plugins/table.action.js'][1753]++; + if (mousedown) { + _$jscoverage['plugins/table.action.js'][1753]++; + return; + } + _$jscoverage['plugins/table.action.js'][1754]++; + var line; + _$jscoverage['plugins/table.action.js'][1755]++; + while ((line = editor.document.getElementById("ue_tableDragLine"))) { + _$jscoverage['plugins/table.action.js'][1756]++; + domUtils.remove(line); +} +} + _$jscoverage['plugins/table.action.js'][1765]++; + function showDragLineAt(state, cell) { + _$jscoverage['plugins/table.action.js'][1766]++; + if ((! cell)) { + _$jscoverage['plugins/table.action.js'][1766]++; + return; + } + _$jscoverage['plugins/table.action.js'][1767]++; + 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; + _$jscoverage['plugins/table.action.js'][1773]++; + switch (state) { + case "h": + _$jscoverage['plugins/table.action.js'][1775]++; + css = ("height:" + height + "px;top:" + (tablePos.y + ((caption.length > 0)? caption[0].offsetHeight: 0)) + "px;left:" + (cellPos.x + cell.offsetWidth)); + _$jscoverage['plugins/table.action.js'][1776]++; + dragLine.style.cssText = (css + "px;position: absolute;display:block;background-color:blue;width:1px;border:0; color:blue;opacity:.3;filter:alpha(opacity=30)"); + _$jscoverage['plugins/table.action.js'][1777]++; + break; + case "v": + _$jscoverage['plugins/table.action.js'][1779]++; + css = ("width:" + width + "px;left:" + tablePos.x + "px;top:" + (cellPos.y + cell.offsetHeight)); + _$jscoverage['plugins/table.action.js'][1781]++; + 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)"); + _$jscoverage['plugins/table.action.js'][1782]++; + break; + default: + } +} + _$jscoverage['plugins/table.action.js'][1792]++; + function switchBorderColor(editor, flag) { + _$jscoverage['plugins/table.action.js'][1793]++; + var tableArr = domUtils.getElementsByTagName(editor.body, "table"), color; + _$jscoverage['plugins/table.action.js'][1794]++; + for (var i = 0, node; (node = tableArr[(i++)]);) { + _$jscoverage['plugins/table.action.js'][1795]++; + var td = domUtils.getElementsByTagName(node, "td"); + _$jscoverage['plugins/table.action.js'][1796]++; + if (td[0]) { + _$jscoverage['plugins/table.action.js'][1797]++; + if (flag) { + _$jscoverage['plugins/table.action.js'][1798]++; + color = td[0].style.borderColor.replace(/\s/g, ""); + _$jscoverage['plugins/table.action.js'][1799]++; + if (/(#ffffff)|(rgb\(255,f55,255\))/gi.test(color)) { + _$jscoverage['plugins/table.action.js'][1800]++; + domUtils.addClass(node, "noBorderTable"); + } + } + else { + _$jscoverage['plugins/table.action.js'][1802]++; + domUtils.removeClasses(node, "noBorderTable"); + } + } +} +} + _$jscoverage['plugins/table.action.js'][1809]++; + function getTableWidth(editor, needIEHack, defaultValue) { + _$jscoverage['plugins/table.action.js'][1810]++; + var body = editor.body; + _$jscoverage['plugins/table.action.js'][1811]++; + return (body.offsetWidth - (needIEHack? (parseInt(domUtils.getComputedStyle(body, "margin-left"), 10) * 2): 0) - (defaultValue.tableBorder * 2) - (editor.options.offsetWidth || 0)); +} + _$jscoverage['plugins/table.action.js'][1817]++; + function getTargetTd(editor, evt) { + _$jscoverage['plugins/table.action.js'][1819]++; + var target = domUtils.findParentByTagName((evt.target || evt.srcElement), ["td", "th"], true), dir = null; + _$jscoverage['plugins/table.action.js'][1822]++; + if ((! target)) { + _$jscoverage['plugins/table.action.js'][1823]++; + return null; + } + _$jscoverage['plugins/table.action.js'][1826]++; + dir = getRelation(target, mouseCoords(evt)); + _$jscoverage['plugins/table.action.js'][1830]++; + if ((! target)) { + _$jscoverage['plugins/table.action.js'][1831]++; + return null; + } + _$jscoverage['plugins/table.action.js'][1834]++; + if (((dir === "h1") && target.previousSibling)) { + _$jscoverage['plugins/table.action.js'][1836]++; + var position = domUtils.getXY(target), cellWidth = target.offsetWidth; + _$jscoverage['plugins/table.action.js'][1839]++; + if ((Math.abs(((position.x + cellWidth) - evt.clientX)) > (cellWidth / 3))) { + _$jscoverage['plugins/table.action.js'][1840]++; + target = target.previousSibling; + } + } + else { + _$jscoverage['plugins/table.action.js'][1843]++; + if (((dir === "v1") && target.parentNode.previousSibling)) { + _$jscoverage['plugins/table.action.js'][1845]++; + var position = domUtils.getXY(target), cellHeight = target.offsetHeight; + _$jscoverage['plugins/table.action.js'][1848]++; + if ((Math.abs(((position.y + cellHeight) - evt.clientY)) > (cellHeight / 3))) { + _$jscoverage['plugins/table.action.js'][1849]++; + target = target.parentNode.previousSibling.firstChild; + } + } + } + _$jscoverage['plugins/table.action.js'][1856]++; + return ((target && (! (editor.fireEvent("excludetable", target) === true)))? target: null); +} +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/table.cmds.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/table.cmds.js new file mode 100644 index 000000000..f90fa6651 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/table.cmds.js @@ -0,0 +1,1622 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/table.cmds.js']) { + _$jscoverage['plugins/table.cmds.js'] = []; + _$jscoverage['plugins/table.cmds.js'][8] = 0; + _$jscoverage['plugins/table.cmds.js'][9] = 0; + _$jscoverage['plugins/table.cmds.js'][10] = 0; + _$jscoverage['plugins/table.cmds.js'][12] = 0; + _$jscoverage['plugins/table.cmds.js'][15] = 0; + _$jscoverage['plugins/table.cmds.js'][18] = 0; + _$jscoverage['plugins/table.cmds.js'][21] = 0; + _$jscoverage['plugins/table.cmds.js'][25] = 0; + _$jscoverage['plugins/table.cmds.js'][27] = 0; + _$jscoverage['plugins/table.cmds.js'][30] = 0; + _$jscoverage['plugins/table.cmds.js'][31] = 0; + _$jscoverage['plugins/table.cmds.js'][34] = 0; + _$jscoverage['plugins/table.cmds.js'][35] = 0; + _$jscoverage['plugins/table.cmds.js'][36] = 0; + _$jscoverage['plugins/table.cmds.js'][37] = 0; + _$jscoverage['plugins/table.cmds.js'][39] = 0; + _$jscoverage['plugins/table.cmds.js'][42] = 0; + _$jscoverage['plugins/table.cmds.js'][45] = 0; + _$jscoverage['plugins/table.cmds.js'][46] = 0; + _$jscoverage['plugins/table.cmds.js'][52] = 0; + _$jscoverage['plugins/table.cmds.js'][53] = 0; + _$jscoverage['plugins/table.cmds.js'][56] = 0; + _$jscoverage['plugins/table.cmds.js'][59] = 0; + _$jscoverage['plugins/table.cmds.js'][64] = 0; + _$jscoverage['plugins/table.cmds.js'][65] = 0; + _$jscoverage['plugins/table.cmds.js'][69] = 0; + _$jscoverage['plugins/table.cmds.js'][71] = 0; + _$jscoverage['plugins/table.cmds.js'][74] = 0; + _$jscoverage['plugins/table.cmds.js'][75] = 0; + _$jscoverage['plugins/table.cmds.js'][76] = 0; + _$jscoverage['plugins/table.cmds.js'][77] = 0; + _$jscoverage['plugins/table.cmds.js'][78] = 0; + _$jscoverage['plugins/table.cmds.js'][79] = 0; + _$jscoverage['plugins/table.cmds.js'][84] = 0; + _$jscoverage['plugins/table.cmds.js'][86] = 0; + _$jscoverage['plugins/table.cmds.js'][87] = 0; + _$jscoverage['plugins/table.cmds.js'][90] = 0; + _$jscoverage['plugins/table.cmds.js'][91] = 0; + _$jscoverage['plugins/table.cmds.js'][92] = 0; + _$jscoverage['plugins/table.cmds.js'][93] = 0; + _$jscoverage['plugins/table.cmds.js'][94] = 0; + _$jscoverage['plugins/table.cmds.js'][95] = 0; + _$jscoverage['plugins/table.cmds.js'][98] = 0; + _$jscoverage['plugins/table.cmds.js'][100] = 0; + _$jscoverage['plugins/table.cmds.js'][101] = 0; + _$jscoverage['plugins/table.cmds.js'][102] = 0; + _$jscoverage['plugins/table.cmds.js'][103] = 0; + _$jscoverage['plugins/table.cmds.js'][105] = 0; + _$jscoverage['plugins/table.cmds.js'][107] = 0; + _$jscoverage['plugins/table.cmds.js'][108] = 0; + _$jscoverage['plugins/table.cmds.js'][114] = 0; + _$jscoverage['plugins/table.cmds.js'][116] = 0; + _$jscoverage['plugins/table.cmds.js'][119] = 0; + _$jscoverage['plugins/table.cmds.js'][120] = 0; + _$jscoverage['plugins/table.cmds.js'][121] = 0; + _$jscoverage['plugins/table.cmds.js'][122] = 0; + _$jscoverage['plugins/table.cmds.js'][127] = 0; + _$jscoverage['plugins/table.cmds.js'][129] = 0; + _$jscoverage['plugins/table.cmds.js'][132] = 0; + _$jscoverage['plugins/table.cmds.js'][133] = 0; + _$jscoverage['plugins/table.cmds.js'][134] = 0; + _$jscoverage['plugins/table.cmds.js'][135] = 0; + _$jscoverage['plugins/table.cmds.js'][140] = 0; + _$jscoverage['plugins/table.cmds.js'][142] = 0; + _$jscoverage['plugins/table.cmds.js'][143] = 0; + _$jscoverage['plugins/table.cmds.js'][144] = 0; + _$jscoverage['plugins/table.cmds.js'][146] = 0; + _$jscoverage['plugins/table.cmds.js'][149] = 0; + _$jscoverage['plugins/table.cmds.js'][150] = 0; + _$jscoverage['plugins/table.cmds.js'][151] = 0; + _$jscoverage['plugins/table.cmds.js'][152] = 0; + _$jscoverage['plugins/table.cmds.js'][153] = 0; + _$jscoverage['plugins/table.cmds.js'][154] = 0; + _$jscoverage['plugins/table.cmds.js'][155] = 0; + _$jscoverage['plugins/table.cmds.js'][160] = 0; + _$jscoverage['plugins/table.cmds.js'][162] = 0; + _$jscoverage['plugins/table.cmds.js'][164] = 0; + _$jscoverage['plugins/table.cmds.js'][165] = 0; + _$jscoverage['plugins/table.cmds.js'][167] = 0; + _$jscoverage['plugins/table.cmds.js'][170] = 0; + _$jscoverage['plugins/table.cmds.js'][172] = 0; + _$jscoverage['plugins/table.cmds.js'][173] = 0; + _$jscoverage['plugins/table.cmds.js'][174] = 0; + _$jscoverage['plugins/table.cmds.js'][175] = 0; + _$jscoverage['plugins/table.cmds.js'][180] = 0; + _$jscoverage['plugins/table.cmds.js'][182] = 0; + _$jscoverage['plugins/table.cmds.js'][183] = 0; + _$jscoverage['plugins/table.cmds.js'][184] = 0; + _$jscoverage['plugins/table.cmds.js'][185] = 0; + _$jscoverage['plugins/table.cmds.js'][187] = 0; + _$jscoverage['plugins/table.cmds.js'][190] = 0; + _$jscoverage['plugins/table.cmds.js'][191] = 0; + _$jscoverage['plugins/table.cmds.js'][192] = 0; + _$jscoverage['plugins/table.cmds.js'][194] = 0; + _$jscoverage['plugins/table.cmds.js'][195] = 0; + _$jscoverage['plugins/table.cmds.js'][198] = 0; + _$jscoverage['plugins/table.cmds.js'][200] = 0; + _$jscoverage['plugins/table.cmds.js'][201] = 0; + _$jscoverage['plugins/table.cmds.js'][202] = 0; + _$jscoverage['plugins/table.cmds.js'][203] = 0; + _$jscoverage['plugins/table.cmds.js'][205] = 0; + _$jscoverage['plugins/table.cmds.js'][208] = 0; + _$jscoverage['plugins/table.cmds.js'][209] = 0; + _$jscoverage['plugins/table.cmds.js'][210] = 0; + _$jscoverage['plugins/table.cmds.js'][212] = 0; + _$jscoverage['plugins/table.cmds.js'][213] = 0; + _$jscoverage['plugins/table.cmds.js'][217] = 0; + _$jscoverage['plugins/table.cmds.js'][219] = 0; + _$jscoverage['plugins/table.cmds.js'][220] = 0; + _$jscoverage['plugins/table.cmds.js'][221] = 0; + _$jscoverage['plugins/table.cmds.js'][222] = 0; + _$jscoverage['plugins/table.cmds.js'][223] = 0; + _$jscoverage['plugins/table.cmds.js'][225] = 0; + _$jscoverage['plugins/table.cmds.js'][226] = 0; + _$jscoverage['plugins/table.cmds.js'][227] = 0; + _$jscoverage['plugins/table.cmds.js'][231] = 0; + _$jscoverage['plugins/table.cmds.js'][233] = 0; + _$jscoverage['plugins/table.cmds.js'][235] = 0; + _$jscoverage['plugins/table.cmds.js'][236] = 0; + _$jscoverage['plugins/table.cmds.js'][239] = 0; + _$jscoverage['plugins/table.cmds.js'][241] = 0; + _$jscoverage['plugins/table.cmds.js'][243] = 0; + _$jscoverage['plugins/table.cmds.js'][244] = 0; + _$jscoverage['plugins/table.cmds.js'][245] = 0; + _$jscoverage['plugins/table.cmds.js'][246] = 0; + _$jscoverage['plugins/table.cmds.js'][249] = 0; + _$jscoverage['plugins/table.cmds.js'][250] = 0; + _$jscoverage['plugins/table.cmds.js'][252] = 0; + _$jscoverage['plugins/table.cmds.js'][256] = 0; + _$jscoverage['plugins/table.cmds.js'][258] = 0; + _$jscoverage['plugins/table.cmds.js'][260] = 0; + _$jscoverage['plugins/table.cmds.js'][261] = 0; + _$jscoverage['plugins/table.cmds.js'][264] = 0; + _$jscoverage['plugins/table.cmds.js'][266] = 0; + _$jscoverage['plugins/table.cmds.js'][269] = 0; + _$jscoverage['plugins/table.cmds.js'][270] = 0; + _$jscoverage['plugins/table.cmds.js'][271] = 0; + _$jscoverage['plugins/table.cmds.js'][272] = 0; + _$jscoverage['plugins/table.cmds.js'][273] = 0; + _$jscoverage['plugins/table.cmds.js'][274] = 0; + _$jscoverage['plugins/table.cmds.js'][275] = 0; + _$jscoverage['plugins/table.cmds.js'][277] = 0; + _$jscoverage['plugins/table.cmds.js'][279] = 0; + _$jscoverage['plugins/table.cmds.js'][285] = 0; + _$jscoverage['plugins/table.cmds.js'][287] = 0; + _$jscoverage['plugins/table.cmds.js'][289] = 0; + _$jscoverage['plugins/table.cmds.js'][292] = 0; + _$jscoverage['plugins/table.cmds.js'][294] = 0; + _$jscoverage['plugins/table.cmds.js'][300] = 0; + _$jscoverage['plugins/table.cmds.js'][301] = 0; + _$jscoverage['plugins/table.cmds.js'][303] = 0; + _$jscoverage['plugins/table.cmds.js'][304] = 0; + _$jscoverage['plugins/table.cmds.js'][305] = 0; + _$jscoverage['plugins/table.cmds.js'][308] = 0; + _$jscoverage['plugins/table.cmds.js'][309] = 0; + _$jscoverage['plugins/table.cmds.js'][313] = 0; + _$jscoverage['plugins/table.cmds.js'][315] = 0; + _$jscoverage['plugins/table.cmds.js'][317] = 0; + _$jscoverage['plugins/table.cmds.js'][320] = 0; + _$jscoverage['plugins/table.cmds.js'][322] = 0; + _$jscoverage['plugins/table.cmds.js'][328] = 0; + _$jscoverage['plugins/table.cmds.js'][329] = 0; + _$jscoverage['plugins/table.cmds.js'][331] = 0; + _$jscoverage['plugins/table.cmds.js'][332] = 0; + _$jscoverage['plugins/table.cmds.js'][333] = 0; + _$jscoverage['plugins/table.cmds.js'][336] = 0; + _$jscoverage['plugins/table.cmds.js'][337] = 0; + _$jscoverage['plugins/table.cmds.js'][340] = 0; + _$jscoverage['plugins/table.cmds.js'][342] = 0; + _$jscoverage['plugins/table.cmds.js'][343] = 0; + _$jscoverage['plugins/table.cmds.js'][344] = 0; + _$jscoverage['plugins/table.cmds.js'][348] = 0; + _$jscoverage['plugins/table.cmds.js'][355] = 0; + _$jscoverage['plugins/table.cmds.js'][356] = 0; + _$jscoverage['plugins/table.cmds.js'][358] = 0; + _$jscoverage['plugins/table.cmds.js'][359] = 0; + _$jscoverage['plugins/table.cmds.js'][362] = 0; + _$jscoverage['plugins/table.cmds.js'][363] = 0; + _$jscoverage['plugins/table.cmds.js'][364] = 0; + _$jscoverage['plugins/table.cmds.js'][365] = 0; + _$jscoverage['plugins/table.cmds.js'][366] = 0; + _$jscoverage['plugins/table.cmds.js'][367] = 0; + _$jscoverage['plugins/table.cmds.js'][370] = 0; + _$jscoverage['plugins/table.cmds.js'][371] = 0; + _$jscoverage['plugins/table.cmds.js'][373] = 0; + _$jscoverage['plugins/table.cmds.js'][374] = 0; + _$jscoverage['plugins/table.cmds.js'][377] = 0; + _$jscoverage['plugins/table.cmds.js'][380] = 0; + _$jscoverage['plugins/table.cmds.js'][382] = 0; + _$jscoverage['plugins/table.cmds.js'][384] = 0; + _$jscoverage['plugins/table.cmds.js'][387] = 0; + _$jscoverage['plugins/table.cmds.js'][389] = 0; + _$jscoverage['plugins/table.cmds.js'][390] = 0; + _$jscoverage['plugins/table.cmds.js'][395] = 0; + _$jscoverage['plugins/table.cmds.js'][396] = 0; + _$jscoverage['plugins/table.cmds.js'][398] = 0; + _$jscoverage['plugins/table.cmds.js'][399] = 0; + _$jscoverage['plugins/table.cmds.js'][400] = 0; + _$jscoverage['plugins/table.cmds.js'][403] = 0; + _$jscoverage['plugins/table.cmds.js'][406] = 0; + _$jscoverage['plugins/table.cmds.js'][408] = 0; + _$jscoverage['plugins/table.cmds.js'][410] = 0; + _$jscoverage['plugins/table.cmds.js'][413] = 0; + _$jscoverage['plugins/table.cmds.js'][415] = 0; + _$jscoverage['plugins/table.cmds.js'][419] = 0; + _$jscoverage['plugins/table.cmds.js'][420] = 0; + _$jscoverage['plugins/table.cmds.js'][422] = 0; + _$jscoverage['plugins/table.cmds.js'][423] = 0; + _$jscoverage['plugins/table.cmds.js'][424] = 0; + _$jscoverage['plugins/table.cmds.js'][427] = 0; + _$jscoverage['plugins/table.cmds.js'][431] = 0; + _$jscoverage['plugins/table.cmds.js'][433] = 0; + _$jscoverage['plugins/table.cmds.js'][434] = 0; + _$jscoverage['plugins/table.cmds.js'][437] = 0; + _$jscoverage['plugins/table.cmds.js'][443] = 0; + _$jscoverage['plugins/table.cmds.js'][444] = 0; + _$jscoverage['plugins/table.cmds.js'][446] = 0; + _$jscoverage['plugins/table.cmds.js'][447] = 0; + _$jscoverage['plugins/table.cmds.js'][450] = 0; + _$jscoverage['plugins/table.cmds.js'][453] = 0; + _$jscoverage['plugins/table.cmds.js'][454] = 0; + _$jscoverage['plugins/table.cmds.js'][455] = 0; + _$jscoverage['plugins/table.cmds.js'][456] = 0; + _$jscoverage['plugins/table.cmds.js'][457] = 0; + _$jscoverage['plugins/table.cmds.js'][460] = 0; + _$jscoverage['plugins/table.cmds.js'][461] = 0; + _$jscoverage['plugins/table.cmds.js'][463] = 0; + _$jscoverage['plugins/table.cmds.js'][464] = 0; + _$jscoverage['plugins/table.cmds.js'][466] = 0; + _$jscoverage['plugins/table.cmds.js'][467] = 0; + _$jscoverage['plugins/table.cmds.js'][474] = 0; + _$jscoverage['plugins/table.cmds.js'][476] = 0; + _$jscoverage['plugins/table.cmds.js'][478] = 0; + _$jscoverage['plugins/table.cmds.js'][479] = 0; + _$jscoverage['plugins/table.cmds.js'][480] = 0; + _$jscoverage['plugins/table.cmds.js'][481] = 0; + _$jscoverage['plugins/table.cmds.js'][484] = 0; + _$jscoverage['plugins/table.cmds.js'][486] = 0; + _$jscoverage['plugins/table.cmds.js'][488] = 0; + _$jscoverage['plugins/table.cmds.js'][489] = 0; + _$jscoverage['plugins/table.cmds.js'][492] = 0; + _$jscoverage['plugins/table.cmds.js'][494] = 0; + _$jscoverage['plugins/table.cmds.js'][496] = 0; + _$jscoverage['plugins/table.cmds.js'][497] = 0; + _$jscoverage['plugins/table.cmds.js'][498] = 0; + _$jscoverage['plugins/table.cmds.js'][499] = 0; + _$jscoverage['plugins/table.cmds.js'][502] = 0; + _$jscoverage['plugins/table.cmds.js'][504] = 0; + _$jscoverage['plugins/table.cmds.js'][506] = 0; + _$jscoverage['plugins/table.cmds.js'][507] = 0; + _$jscoverage['plugins/table.cmds.js'][510] = 0; + _$jscoverage['plugins/table.cmds.js'][512] = 0; + _$jscoverage['plugins/table.cmds.js'][514] = 0; + _$jscoverage['plugins/table.cmds.js'][515] = 0; + _$jscoverage['plugins/table.cmds.js'][516] = 0; + _$jscoverage['plugins/table.cmds.js'][517] = 0; + _$jscoverage['plugins/table.cmds.js'][520] = 0; + _$jscoverage['plugins/table.cmds.js'][522] = 0; + _$jscoverage['plugins/table.cmds.js'][524] = 0; + _$jscoverage['plugins/table.cmds.js'][525] = 0; + _$jscoverage['plugins/table.cmds.js'][530] = 0; + _$jscoverage['plugins/table.cmds.js'][533] = 0; + _$jscoverage['plugins/table.cmds.js'][536] = 0; + _$jscoverage['plugins/table.cmds.js'][538] = 0; + _$jscoverage['plugins/table.cmds.js'][539] = 0; + _$jscoverage['plugins/table.cmds.js'][540] = 0; + _$jscoverage['plugins/table.cmds.js'][542] = 0; + _$jscoverage['plugins/table.cmds.js'][543] = 0; + _$jscoverage['plugins/table.cmds.js'][544] = 0; + _$jscoverage['plugins/table.cmds.js'][546] = 0; + _$jscoverage['plugins/table.cmds.js'][553] = 0; + _$jscoverage['plugins/table.cmds.js'][555] = 0; + _$jscoverage['plugins/table.cmds.js'][556] = 0; + _$jscoverage['plugins/table.cmds.js'][557] = 0; + _$jscoverage['plugins/table.cmds.js'][560] = 0; + _$jscoverage['plugins/table.cmds.js'][563] = 0; + _$jscoverage['plugins/table.cmds.js'][564] = 0; + _$jscoverage['plugins/table.cmds.js'][568] = 0; + _$jscoverage['plugins/table.cmds.js'][569] = 0; + _$jscoverage['plugins/table.cmds.js'][570] = 0; + _$jscoverage['plugins/table.cmds.js'][572] = 0; + _$jscoverage['plugins/table.cmds.js'][575] = 0; + _$jscoverage['plugins/table.cmds.js'][576] = 0; + _$jscoverage['plugins/table.cmds.js'][577] = 0; + _$jscoverage['plugins/table.cmds.js'][578] = 0; + _$jscoverage['plugins/table.cmds.js'][579] = 0; + _$jscoverage['plugins/table.cmds.js'][582] = 0; + _$jscoverage['plugins/table.cmds.js'][583] = 0; + _$jscoverage['plugins/table.cmds.js'][586] = 0; + _$jscoverage['plugins/table.cmds.js'][587] = 0; + _$jscoverage['plugins/table.cmds.js'][588] = 0; + _$jscoverage['plugins/table.cmds.js'][590] = 0; + _$jscoverage['plugins/table.cmds.js'][592] = 0; + _$jscoverage['plugins/table.cmds.js'][593] = 0; + _$jscoverage['plugins/table.cmds.js'][594] = 0; + _$jscoverage['plugins/table.cmds.js'][599] = 0; + _$jscoverage['plugins/table.cmds.js'][600] = 0; + _$jscoverage['plugins/table.cmds.js'][605] = 0; + _$jscoverage['plugins/table.cmds.js'][607] = 0; + _$jscoverage['plugins/table.cmds.js'][608] = 0; + _$jscoverage['plugins/table.cmds.js'][609] = 0; + _$jscoverage['plugins/table.cmds.js'][610] = 0; + _$jscoverage['plugins/table.cmds.js'][613] = 0; + _$jscoverage['plugins/table.cmds.js'][616] = 0; + _$jscoverage['plugins/table.cmds.js'][617] = 0; + _$jscoverage['plugins/table.cmds.js'][622] = 0; + _$jscoverage['plugins/table.cmds.js'][623] = 0; + _$jscoverage['plugins/table.cmds.js'][627] = 0; + _$jscoverage['plugins/table.cmds.js'][628] = 0; + _$jscoverage['plugins/table.cmds.js'][630] = 0; + _$jscoverage['plugins/table.cmds.js'][631] = 0; + _$jscoverage['plugins/table.cmds.js'][634] = 0; + _$jscoverage['plugins/table.cmds.js'][635] = 0; + _$jscoverage['plugins/table.cmds.js'][637] = 0; + _$jscoverage['plugins/table.cmds.js'][641] = 0; + _$jscoverage['plugins/table.cmds.js'][642] = 0; + _$jscoverage['plugins/table.cmds.js'][643] = 0; + _$jscoverage['plugins/table.cmds.js'][645] = 0; + _$jscoverage['plugins/table.cmds.js'][648] = 0; + _$jscoverage['plugins/table.cmds.js'][649] = 0; + _$jscoverage['plugins/table.cmds.js'][651] = 0; + _$jscoverage['plugins/table.cmds.js'][653] = 0; + _$jscoverage['plugins/table.cmds.js'][656] = 0; + _$jscoverage['plugins/table.cmds.js'][657] = 0; + _$jscoverage['plugins/table.cmds.js'][658] = 0; + _$jscoverage['plugins/table.cmds.js'][659] = 0; + _$jscoverage['plugins/table.cmds.js'][660] = 0; + _$jscoverage['plugins/table.cmds.js'][665] = 0; + _$jscoverage['plugins/table.cmds.js'][666] = 0; + _$jscoverage['plugins/table.cmds.js'][672] = 0; + _$jscoverage['plugins/table.cmds.js'][674] = 0; + _$jscoverage['plugins/table.cmds.js'][677] = 0; + _$jscoverage['plugins/table.cmds.js'][680] = 0; + _$jscoverage['plugins/table.cmds.js'][681] = 0; + _$jscoverage['plugins/table.cmds.js'][683] = 0; + _$jscoverage['plugins/table.cmds.js'][684] = 0; + _$jscoverage['plugins/table.cmds.js'][686] = 0; + _$jscoverage['plugins/table.cmds.js'][687] = 0; + _$jscoverage['plugins/table.cmds.js'][689] = 0; + _$jscoverage['plugins/table.cmds.js'][691] = 0; + _$jscoverage['plugins/table.cmds.js'][692] = 0; + _$jscoverage['plugins/table.cmds.js'][702] = 0; + _$jscoverage['plugins/table.cmds.js'][704] = 0; + _$jscoverage['plugins/table.cmds.js'][705] = 0; + _$jscoverage['plugins/table.cmds.js'][708] = 0; + _$jscoverage['plugins/table.cmds.js'][710] = 0; + _$jscoverage['plugins/table.cmds.js'][715] = 0; + _$jscoverage['plugins/table.cmds.js'][717] = 0; + _$jscoverage['plugins/table.cmds.js'][719] = 0; + _$jscoverage['plugins/table.cmds.js'][726] = 0; + _$jscoverage['plugins/table.cmds.js'][728] = 0; + _$jscoverage['plugins/table.cmds.js'][729] = 0; + _$jscoverage['plugins/table.cmds.js'][731] = 0; + _$jscoverage['plugins/table.cmds.js'][734] = 0; + _$jscoverage['plugins/table.cmds.js'][738] = 0; + _$jscoverage['plugins/table.cmds.js'][739] = 0; + _$jscoverage['plugins/table.cmds.js'][745] = 0; + _$jscoverage['plugins/table.cmds.js'][747] = 0; + _$jscoverage['plugins/table.cmds.js'][750] = 0; + _$jscoverage['plugins/table.cmds.js'][752] = 0; + _$jscoverage['plugins/table.cmds.js'][753] = 0; + _$jscoverage['plugins/table.cmds.js'][757] = 0; + _$jscoverage['plugins/table.cmds.js'][758] = 0; + _$jscoverage['plugins/table.cmds.js'][764] = 0; + _$jscoverage['plugins/table.cmds.js'][766] = 0; + _$jscoverage['plugins/table.cmds.js'][769] = 0; + _$jscoverage['plugins/table.cmds.js'][772] = 0; + _$jscoverage['plugins/table.cmds.js'][773] = 0; + _$jscoverage['plugins/table.cmds.js'][775] = 0; + _$jscoverage['plugins/table.cmds.js'][776] = 0; + _$jscoverage['plugins/table.cmds.js'][779] = 0; + _$jscoverage['plugins/table.cmds.js'][780] = 0; + _$jscoverage['plugins/table.cmds.js'][785] = 0; + _$jscoverage['plugins/table.cmds.js'][787] = 0; + _$jscoverage['plugins/table.cmds.js'][789] = 0; + _$jscoverage['plugins/table.cmds.js'][790] = 0; + _$jscoverage['plugins/table.cmds.js'][792] = 0; + _$jscoverage['plugins/table.cmds.js'][793] = 0; + _$jscoverage['plugins/table.cmds.js'][795] = 0; + _$jscoverage['plugins/table.cmds.js'][798] = 0; + _$jscoverage['plugins/table.cmds.js'][805] = 0; + _$jscoverage['plugins/table.cmds.js'][806] = 0; + _$jscoverage['plugins/table.cmds.js'][810] = 0; + _$jscoverage['plugins/table.cmds.js'][812] = 0; + _$jscoverage['plugins/table.cmds.js'][815] = 0; + _$jscoverage['plugins/table.cmds.js'][816] = 0; + _$jscoverage['plugins/table.cmds.js'][819] = 0; + _$jscoverage['plugins/table.cmds.js'][821] = 0; + _$jscoverage['plugins/table.cmds.js'][824] = 0; + _$jscoverage['plugins/table.cmds.js'][825] = 0; + _$jscoverage['plugins/table.cmds.js'][826] = 0; + _$jscoverage['plugins/table.cmds.js'][827] = 0; + _$jscoverage['plugins/table.cmds.js'][831] = 0; + _$jscoverage['plugins/table.cmds.js'][833] = 0; + _$jscoverage['plugins/table.cmds.js'][834] = 0; + _$jscoverage['plugins/table.cmds.js'][835] = 0; + _$jscoverage['plugins/table.cmds.js'][836] = 0; + _$jscoverage['plugins/table.cmds.js'][838] = 0; + _$jscoverage['plugins/table.cmds.js'][841] = 0; + _$jscoverage['plugins/table.cmds.js'][843] = 0; + _$jscoverage['plugins/table.cmds.js'][847] = 0; + _$jscoverage['plugins/table.cmds.js'][849] = 0; + _$jscoverage['plugins/table.cmds.js'][850] = 0; + _$jscoverage['plugins/table.cmds.js'][851] = 0; + _$jscoverage['plugins/table.cmds.js'][852] = 0; + _$jscoverage['plugins/table.cmds.js'][855] = 0; + _$jscoverage['plugins/table.cmds.js'][857] = 0; + _$jscoverage['plugins/table.cmds.js'][861] = 0; + _$jscoverage['plugins/table.cmds.js'][862] = 0; + _$jscoverage['plugins/table.cmds.js'][863] = 0; + _$jscoverage['plugins/table.cmds.js'][864] = 0; + _$jscoverage['plugins/table.cmds.js'][866] = 0; + _$jscoverage['plugins/table.cmds.js'][867] = 0; + _$jscoverage['plugins/table.cmds.js'][872] = 0; + _$jscoverage['plugins/table.cmds.js'][873] = 0; + _$jscoverage['plugins/table.cmds.js'][874] = 0; + _$jscoverage['plugins/table.cmds.js'][875] = 0; + _$jscoverage['plugins/table.cmds.js'][877] = 0; + _$jscoverage['plugins/table.cmds.js'][878] = 0; + _$jscoverage['plugins/table.cmds.js'][879] = 0; + _$jscoverage['plugins/table.cmds.js'][880] = 0; + _$jscoverage['plugins/table.cmds.js'][885] = 0; + _$jscoverage['plugins/table.cmds.js'][886] = 0; + _$jscoverage['plugins/table.cmds.js'][887] = 0; + _$jscoverage['plugins/table.cmds.js'][890] = 0; + _$jscoverage['plugins/table.cmds.js'][891] = 0; + _$jscoverage['plugins/table.cmds.js'][892] = 0; + _$jscoverage['plugins/table.cmds.js'][893] = 0; + _$jscoverage['plugins/table.cmds.js'][894] = 0; + _$jscoverage['plugins/table.cmds.js'][896] = 0; +} +_$jscoverage['plugins/table.cmds.js'].source = ["/*"," * 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('<tr>');"," for (var c = 0; c < colsNum; c++) {"," html.push('<td width=\"' + tdWidth + '\" vAlign=\"' + opt.tdvalign + '\" >' + (browser.ie ? domUtils.fillChar : '<br/>') + '</td>')"," }"," html.push('</tr>')"," }"," //禁止指定table-width"," return '<table><tbody>' + html.join('') + '</tbody></table>'"," }",""," 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 ? '&nbsp;' : '<br />';"," 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 : '<br/>'"," });"," 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 : '<br/>';"," 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.getElementsByTagName('th').length == 0 ? 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.getElementsByTagName('th').length ? 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[\"mergeright\"] = {"," queryCommandState: function (cmd) {"," var tableItems = getTableItemsByRange(this);"," if (!tableItems.cell) return -1;"," var ut = getUETable(tableItems.table);"," if (ut.selectedTds.length) return -1;"," var cellInfo = ut.getCellInfo(tableItems.cell),"," rightColIndex = cellInfo.colIndex + cellInfo.colSpan;"," if (rightColIndex >= ut.colsNum) return -1;"," var rightCellInfo = ut.indexTable[cellInfo.rowIndex][rightColIndex];"," 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),"," cell = tableItems.cell;"," if (!cell || cell.tagName == \"TH\") return -1;"," var ut = getUETable(tableItems.table);"," if (ut.selectedTds.length)return -1;"," var cellInfo = ut.getCellInfo(tableItems.cell),"," downRowIndex = cellInfo.rowIndex + cellInfo.rowSpan;"," // 如果处于最下边则不能f向右合并"," if (downRowIndex >= ut.rowsNum) return -1;"," var downCellInfo = ut.indexTable[downRowIndex][cellInfo.colIndex];"," // 当且仅当两个Cell的开始列号和结束列号一致时能进行合并"," return (downCellInfo.colIndex == cellInfo.colIndex"," && downCellInfo.colSpan == cellInfo.colSpan) && tableItems.cell.tagName !== 'TH' ? 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\" && 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);"," if (!tableItems.cell) {"," return -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') && 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);"," if (!tableItems.cell) return -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/ig.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/ig.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['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).select();"," }"," };",""," UE.commands[\"enablesort\"] = UE.commands[\"disablesort\"] = {"," queryCommandState: function () {"," return getTableItemsByRange(this).table ? 0 : -1;"," },"," execCommand: function (cmd) {"," var table = getTableItemsByRange(this).table;"," table.setAttribute(\"data-sort\", cmd == \"enablesort\" ? \"sortEnabled\" : \"sortDisabled\");"," }"," };"," UE.commands[\"settablebackground\"] = {"," queryCommandState: function () {"," return getSelectedArr(this).length > 1 ? 0 : -1;"," },"," execCommand: function (cmd, value) {"," var table, 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);"," }"," }"," };",""," function resetTdWidth(table, editor) {"," var tds = table.getElementsByTagName(\"td\");"," utils.each(tds, function (td) {"," td.removeAttribute(\"width\");"," });"," table.setAttribute('width', getTableWidth(editor, true, getDefaultValue(editor, table)));"," setTimeout(function () {"," utils.each(tds, function (td) {"," (td.colSpan == 1) && td.setAttribute(\"width\", td.offsetWidth + \"\");"," })"," }, 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 [];"," }"," }","})();"]; +_$jscoverage['plugins/table.cmds.js'][8]++; +; +_$jscoverage['plugins/table.cmds.js'][9]++; +(function () { + _$jscoverage['plugins/table.cmds.js'][10]++; + var UT = UE.UETable, getTableItemsByRange = (function (editor) { + _$jscoverage['plugins/table.cmds.js'][12]++; + return UT.getTableItemsByRange(editor); +}), getUETableBySelected = (function (editor) { + _$jscoverage['plugins/table.cmds.js'][15]++; + return UT.getUETableBySelected(editor); +}), getDefaultValue = (function (editor, table) { + _$jscoverage['plugins/table.cmds.js'][18]++; + return UT.getDefaultValue(editor, table); +}), getUETable = (function (tdOrTable) { + _$jscoverage['plugins/table.cmds.js'][21]++; + return UT.getUETable(tdOrTable); +}); + _$jscoverage['plugins/table.cmds.js'][25]++; + UE.commands.inserttable = {queryCommandState: (function () { + _$jscoverage['plugins/table.cmds.js'][27]++; + return (getTableItemsByRange(this).table? -1: 0); +}), execCommand: (function (cmd, opt) { + _$jscoverage['plugins/table.cmds.js'][30]++; + function createTable(opt, tdWidth) { + _$jscoverage['plugins/table.cmds.js'][31]++; + var html = [], rowsNum = opt.numRows, colsNum = opt.numCols; + _$jscoverage['plugins/table.cmds.js'][34]++; + for (var r = 0; (r < rowsNum); (r++)) { + _$jscoverage['plugins/table.cmds.js'][35]++; + html.push(""); + _$jscoverage['plugins/table.cmds.js'][36]++; + for (var c = 0; (c < colsNum); (c++)) { + _$jscoverage['plugins/table.cmds.js'][37]++; + html.push(("" + (browser.ie? domUtils.fillChar: "
    ") + "")); +} + _$jscoverage['plugins/table.cmds.js'][39]++; + html.push(""); +} + _$jscoverage['plugins/table.cmds.js'][42]++; + return ("" + html.join("") + "
    "); +} + _$jscoverage['plugins/table.cmds.js'][45]++; + if ((! opt)) { + _$jscoverage['plugins/table.cmds.js'][46]++; + opt = utils.extend({}, {numCols: this.options.defaultCols, numRows: this.options.defaultRows, tdvalign: this.options.tdvalign}); + } + _$jscoverage['plugins/table.cmds.js'][52]++; + var me = this; + _$jscoverage['plugins/table.cmds.js'][53]++; + var range = this.selection.getRange(), start = range.startContainer, firstParentBlock = (domUtils.findParent(start, (function (node) { + _$jscoverage['plugins/table.cmds.js'][56]++; + return domUtils.isBlockElm(node); +}), true) || me.body); + _$jscoverage['plugins/table.cmds.js'][59]++; + var defaultValue = getDefaultValue(me), tableWidth = firstParentBlock.offsetWidth, tdWidth = Math.floor(((tableWidth / opt.numCols) - (defaultValue.tdPadding * 2) - defaultValue.tdBorder)); + _$jscoverage['plugins/table.cmds.js'][64]++; + ((! opt.tdvalign) && (opt.tdvalign = me.options.tdvalign)); + _$jscoverage['plugins/table.cmds.js'][65]++; + me.execCommand("inserthtml", createTable(opt, tdWidth)); +})}; + _$jscoverage['plugins/table.cmds.js'][69]++; + UE.commands.insertparagraphbeforetable = {queryCommandState: (function () { + _$jscoverage['plugins/table.cmds.js'][71]++; + return (getTableItemsByRange(this).cell? 0: -1); +}), execCommand: (function () { + _$jscoverage['plugins/table.cmds.js'][74]++; + var table = getTableItemsByRange(this).table; + _$jscoverage['plugins/table.cmds.js'][75]++; + if (table) { + _$jscoverage['plugins/table.cmds.js'][76]++; + var p = this.document.createElement("p"); + _$jscoverage['plugins/table.cmds.js'][77]++; + p.innerHTML = (browser.ie? " ": "
    "); + _$jscoverage['plugins/table.cmds.js'][78]++; + table.parentNode.insertBefore(p, table); + _$jscoverage['plugins/table.cmds.js'][79]++; + this.selection.getRange().setStart(p, 0).setCursor(); + } +})}; + _$jscoverage['plugins/table.cmds.js'][84]++; + UE.commands.deletetable = {queryCommandState: (function () { + _$jscoverage['plugins/table.cmds.js'][86]++; + var rng = this.selection.getRange(); + _$jscoverage['plugins/table.cmds.js'][87]++; + return (domUtils.findParentByTagName(rng.startContainer, "table", true)? 0: -1); +}), execCommand: (function (cmd, table) { + _$jscoverage['plugins/table.cmds.js'][90]++; + var rng = this.selection.getRange(); + _$jscoverage['plugins/table.cmds.js'][91]++; + table = (table || domUtils.findParentByTagName(rng.startContainer, "table", true)); + _$jscoverage['plugins/table.cmds.js'][92]++; + if (table) { + _$jscoverage['plugins/table.cmds.js'][93]++; + var next = table.nextSibling; + _$jscoverage['plugins/table.cmds.js'][94]++; + if ((! next)) { + _$jscoverage['plugins/table.cmds.js'][95]++; + next = domUtils.createElement(this.document, "p", {"innerHTML": (browser.ie? domUtils.fillChar: "
    ")}); + _$jscoverage['plugins/table.cmds.js'][98]++; + table.parentNode.insertBefore(next, table); + } + _$jscoverage['plugins/table.cmds.js'][100]++; + domUtils.remove(table); + _$jscoverage['plugins/table.cmds.js'][101]++; + rng = this.selection.getRange(); + _$jscoverage['plugins/table.cmds.js'][102]++; + if ((next.nodeType == 3)) { + _$jscoverage['plugins/table.cmds.js'][103]++; + rng.setStartBefore(next); + } + else { + _$jscoverage['plugins/table.cmds.js'][105]++; + rng.setStart(next, 0); + } + _$jscoverage['plugins/table.cmds.js'][107]++; + rng.setCursor(false, true); + _$jscoverage['plugins/table.cmds.js'][108]++; + this.fireEvent("tablehasdeleted"); + } +})}; + _$jscoverage['plugins/table.cmds.js'][114]++; + UE.commands.cellalign = {queryCommandState: (function () { + _$jscoverage['plugins/table.cmds.js'][116]++; + return (getSelectedArr(this).length? 0: -1); +}), execCommand: (function (cmd, align) { + _$jscoverage['plugins/table.cmds.js'][119]++; + var selectedTds = getSelectedArr(this); + _$jscoverage['plugins/table.cmds.js'][120]++; + if (selectedTds.length) { + _$jscoverage['plugins/table.cmds.js'][121]++; + for (var i = 0, ci; (ci = selectedTds[(i++)]);) { + _$jscoverage['plugins/table.cmds.js'][122]++; + ci.setAttribute("align", align); +} + } +})}; + _$jscoverage['plugins/table.cmds.js'][127]++; + UE.commands.cellvalign = {queryCommandState: (function () { + _$jscoverage['plugins/table.cmds.js'][129]++; + return (getSelectedArr(this).length? 0: -1); +}), execCommand: (function (cmd, valign) { + _$jscoverage['plugins/table.cmds.js'][132]++; + var selectedTds = getSelectedArr(this); + _$jscoverage['plugins/table.cmds.js'][133]++; + if (selectedTds.length) { + _$jscoverage['plugins/table.cmds.js'][134]++; + for (var i = 0, ci; (ci = selectedTds[(i++)]);) { + _$jscoverage['plugins/table.cmds.js'][135]++; + ci.setAttribute("vAlign", valign); +} + } +})}; + _$jscoverage['plugins/table.cmds.js'][140]++; + UE.commands.insertcaption = {queryCommandState: (function () { + _$jscoverage['plugins/table.cmds.js'][142]++; + var table = getTableItemsByRange(this).table; + _$jscoverage['plugins/table.cmds.js'][143]++; + if (table) { + _$jscoverage['plugins/table.cmds.js'][144]++; + return ((table.getElementsByTagName("caption").length == 0)? 1: -1); + } + _$jscoverage['plugins/table.cmds.js'][146]++; + return -1; +}), execCommand: (function () { + _$jscoverage['plugins/table.cmds.js'][149]++; + var table = getTableItemsByRange(this).table; + _$jscoverage['plugins/table.cmds.js'][150]++; + if (table) { + _$jscoverage['plugins/table.cmds.js'][151]++; + var caption = this.document.createElement("caption"); + _$jscoverage['plugins/table.cmds.js'][152]++; + caption.innerHTML = (browser.ie? domUtils.fillChar: "
    "); + _$jscoverage['plugins/table.cmds.js'][153]++; + table.insertBefore(caption, table.firstChild); + _$jscoverage['plugins/table.cmds.js'][154]++; + var range = this.selection.getRange(); + _$jscoverage['plugins/table.cmds.js'][155]++; + range.setStart(caption, 0).setCursor(); + } +})}; + _$jscoverage['plugins/table.cmds.js'][160]++; + UE.commands.deletecaption = {queryCommandState: (function () { + _$jscoverage['plugins/table.cmds.js'][162]++; + var rng = this.selection.getRange(), table = domUtils.findParentByTagName(rng.startContainer, "table"); + _$jscoverage['plugins/table.cmds.js'][164]++; + if (table) { + _$jscoverage['plugins/table.cmds.js'][165]++; + return ((table.getElementsByTagName("caption").length == 0)? -1: 1); + } + _$jscoverage['plugins/table.cmds.js'][167]++; + return -1; +}), execCommand: (function () { + _$jscoverage['plugins/table.cmds.js'][170]++; + var rng = this.selection.getRange(), table = domUtils.findParentByTagName(rng.startContainer, "table"); + _$jscoverage['plugins/table.cmds.js'][172]++; + if (table) { + _$jscoverage['plugins/table.cmds.js'][173]++; + domUtils.remove(table.getElementsByTagName("caption")[0]); + _$jscoverage['plugins/table.cmds.js'][174]++; + var range = this.selection.getRange(); + _$jscoverage['plugins/table.cmds.js'][175]++; + range.setStart(table.rows[0].cells[0], 0).setCursor(); + } +})}; + _$jscoverage['plugins/table.cmds.js'][180]++; + UE.commands.inserttitle = {queryCommandState: (function () { + _$jscoverage['plugins/table.cmds.js'][182]++; + var table = getTableItemsByRange(this).table; + _$jscoverage['plugins/table.cmds.js'][183]++; + if (table) { + _$jscoverage['plugins/table.cmds.js'][184]++; + var firstRow = table.rows[0]; + _$jscoverage['plugins/table.cmds.js'][185]++; + return ((firstRow.getElementsByTagName("th").length == 0)? 0: -1); + } + _$jscoverage['plugins/table.cmds.js'][187]++; + return -1; +}), execCommand: (function () { + _$jscoverage['plugins/table.cmds.js'][190]++; + var table = getTableItemsByRange(this).table; + _$jscoverage['plugins/table.cmds.js'][191]++; + if (table) { + _$jscoverage['plugins/table.cmds.js'][192]++; + getUETable(table).insertRow(0, "th"); + } + _$jscoverage['plugins/table.cmds.js'][194]++; + var th = table.getElementsByTagName("th")[0]; + _$jscoverage['plugins/table.cmds.js'][195]++; + this.selection.getRange().setStart(th, 0).setCursor(false, true); +})}; + _$jscoverage['plugins/table.cmds.js'][198]++; + UE.commands.deletetitle = {queryCommandState: (function () { + _$jscoverage['plugins/table.cmds.js'][200]++; + var table = getTableItemsByRange(this).table; + _$jscoverage['plugins/table.cmds.js'][201]++; + if (table) { + _$jscoverage['plugins/table.cmds.js'][202]++; + var firstRow = table.rows[0]; + _$jscoverage['plugins/table.cmds.js'][203]++; + return (firstRow.getElementsByTagName("th").length? 0: -1); + } + _$jscoverage['plugins/table.cmds.js'][205]++; + return -1; +}), execCommand: (function () { + _$jscoverage['plugins/table.cmds.js'][208]++; + var table = getTableItemsByRange(this).table; + _$jscoverage['plugins/table.cmds.js'][209]++; + if (table) { + _$jscoverage['plugins/table.cmds.js'][210]++; + domUtils.remove(table.rows[0]); + } + _$jscoverage['plugins/table.cmds.js'][212]++; + var td = table.getElementsByTagName("td")[0]; + _$jscoverage['plugins/table.cmds.js'][213]++; + this.selection.getRange().setStart(td, 0).setCursor(false, true); +})}; + _$jscoverage['plugins/table.cmds.js'][217]++; + UE.commands.mergeright = {queryCommandState: (function (cmd) { + _$jscoverage['plugins/table.cmds.js'][219]++; + var tableItems = getTableItemsByRange(this); + _$jscoverage['plugins/table.cmds.js'][220]++; + if ((! tableItems.cell)) { + _$jscoverage['plugins/table.cmds.js'][220]++; + return -1; + } + _$jscoverage['plugins/table.cmds.js'][221]++; + var ut = getUETable(tableItems.table); + _$jscoverage['plugins/table.cmds.js'][222]++; + if (ut.selectedTds.length) { + _$jscoverage['plugins/table.cmds.js'][222]++; + return -1; + } + _$jscoverage['plugins/table.cmds.js'][223]++; + var cellInfo = ut.getCellInfo(tableItems.cell), rightColIndex = (cellInfo.colIndex + cellInfo.colSpan); + _$jscoverage['plugins/table.cmds.js'][225]++; + if ((rightColIndex >= ut.colsNum)) { + _$jscoverage['plugins/table.cmds.js'][225]++; + return -1; + } + _$jscoverage['plugins/table.cmds.js'][226]++; + var rightCellInfo = ut.indexTable[cellInfo.rowIndex][rightColIndex]; + _$jscoverage['plugins/table.cmds.js'][227]++; + return (((rightCellInfo.rowIndex == cellInfo.rowIndex) && (rightCellInfo.rowSpan == cellInfo.rowSpan))? 0: -1); +}), execCommand: (function (cmd) { + _$jscoverage['plugins/table.cmds.js'][231]++; + var rng = this.selection.getRange(), bk = rng.createBookmark(true); + _$jscoverage['plugins/table.cmds.js'][233]++; + var cell = getTableItemsByRange(this).cell, ut = getUETable(cell); + _$jscoverage['plugins/table.cmds.js'][235]++; + ut.mergeRight(cell); + _$jscoverage['plugins/table.cmds.js'][236]++; + rng.moveToBookmark(bk).select(); +})}; + _$jscoverage['plugins/table.cmds.js'][239]++; + UE.commands.mergedown = {queryCommandState: (function (cmd) { + _$jscoverage['plugins/table.cmds.js'][241]++; + var tableItems = getTableItemsByRange(this), cell = tableItems.cell; + _$jscoverage['plugins/table.cmds.js'][243]++; + if (((! cell) || (cell.tagName == "TH"))) { + _$jscoverage['plugins/table.cmds.js'][243]++; + return -1; + } + _$jscoverage['plugins/table.cmds.js'][244]++; + var ut = getUETable(tableItems.table); + _$jscoverage['plugins/table.cmds.js'][245]++; + if (ut.selectedTds.length) { + _$jscoverage['plugins/table.cmds.js'][245]++; + return -1; + } + _$jscoverage['plugins/table.cmds.js'][246]++; + var cellInfo = ut.getCellInfo(tableItems.cell), downRowIndex = (cellInfo.rowIndex + cellInfo.rowSpan); + _$jscoverage['plugins/table.cmds.js'][249]++; + if ((downRowIndex >= ut.rowsNum)) { + _$jscoverage['plugins/table.cmds.js'][249]++; + return -1; + } + _$jscoverage['plugins/table.cmds.js'][250]++; + var downCellInfo = ut.indexTable[downRowIndex][cellInfo.colIndex]; + _$jscoverage['plugins/table.cmds.js'][252]++; + return (((downCellInfo.colIndex == cellInfo.colIndex) && (downCellInfo.colSpan == cellInfo.colSpan) && (tableItems.cell.tagName !== "TH"))? 0: -1); +}), execCommand: (function () { + _$jscoverage['plugins/table.cmds.js'][256]++; + var rng = this.selection.getRange(), bk = rng.createBookmark(true); + _$jscoverage['plugins/table.cmds.js'][258]++; + var cell = getTableItemsByRange(this).cell, ut = getUETable(cell); + _$jscoverage['plugins/table.cmds.js'][260]++; + ut.mergeDown(cell); + _$jscoverage['plugins/table.cmds.js'][261]++; + rng.moveToBookmark(bk).select(); +})}; + _$jscoverage['plugins/table.cmds.js'][264]++; + UE.commands.mergecells = {queryCommandState: (function () { + _$jscoverage['plugins/table.cmds.js'][266]++; + return (getUETableBySelected(this)? 0: -1); +}), execCommand: (function () { + _$jscoverage['plugins/table.cmds.js'][269]++; + var ut = getUETableBySelected(this); + _$jscoverage['plugins/table.cmds.js'][270]++; + if ((ut && ut.selectedTds.length)) { + _$jscoverage['plugins/table.cmds.js'][271]++; + var cell = ut.selectedTds[0]; + _$jscoverage['plugins/table.cmds.js'][272]++; + ut.mergeRange(); + _$jscoverage['plugins/table.cmds.js'][273]++; + var rng = this.selection.getRange(); + _$jscoverage['plugins/table.cmds.js'][274]++; + if (domUtils.isEmptyBlock(cell)) { + _$jscoverage['plugins/table.cmds.js'][275]++; + rng.setStart(cell, 0).collapse(true); + } + else { + _$jscoverage['plugins/table.cmds.js'][277]++; + rng.selectNodeContents(cell); + } + _$jscoverage['plugins/table.cmds.js'][279]++; + rng.select(); + } +})}; + _$jscoverage['plugins/table.cmds.js'][285]++; + UE.commands.insertrow = {queryCommandState: (function () { + _$jscoverage['plugins/table.cmds.js'][287]++; + var tableItems = getTableItemsByRange(this), cell = tableItems.cell; + _$jscoverage['plugins/table.cmds.js'][289]++; + return ((cell && (cell.tagName == "TD") && (getUETable(tableItems.table).rowsNum < this.options.maxRowNum))? 0: -1); +}), execCommand: (function () { + _$jscoverage['plugins/table.cmds.js'][292]++; + var rng = this.selection.getRange(), bk = rng.createBookmark(true); + _$jscoverage['plugins/table.cmds.js'][294]++; + var tableItems = getTableItemsByRange(this), cell = tableItems.cell, table = tableItems.table, ut = getUETable(table), cellInfo = ut.getCellInfo(cell); + _$jscoverage['plugins/table.cmds.js'][300]++; + if ((! ut.selectedTds.length)) { + _$jscoverage['plugins/table.cmds.js'][301]++; + ut.insertRow(cellInfo.rowIndex, cell); + } + else { + _$jscoverage['plugins/table.cmds.js'][303]++; + var range = ut.cellsRange; + _$jscoverage['plugins/table.cmds.js'][304]++; + for (var i = 0, len = ((range.endRowIndex - range.beginRowIndex) + 1); (i < len); (i++)) { + _$jscoverage['plugins/table.cmds.js'][305]++; + ut.insertRow(range.beginRowIndex, cell); +} + } + _$jscoverage['plugins/table.cmds.js'][308]++; + rng.moveToBookmark(bk).select(); + _$jscoverage['plugins/table.cmds.js'][309]++; + if ((table.getAttribute("interlaced") === "enabled")) { + _$jscoverage['plugins/table.cmds.js'][309]++; + this.fireEvent("interlacetable", table); + } +})}; + _$jscoverage['plugins/table.cmds.js'][313]++; + UE.commands.insertrownext = {queryCommandState: (function () { + _$jscoverage['plugins/table.cmds.js'][315]++; + var tableItems = getTableItemsByRange(this), cell = tableItems.cell; + _$jscoverage['plugins/table.cmds.js'][317]++; + return ((cell && (cell.tagName == "TD") && (getUETable(tableItems.table).rowsNum < this.options.maxRowNum))? 0: -1); +}), execCommand: (function () { + _$jscoverage['plugins/table.cmds.js'][320]++; + var rng = this.selection.getRange(), bk = rng.createBookmark(true); + _$jscoverage['plugins/table.cmds.js'][322]++; + var tableItems = getTableItemsByRange(this), cell = tableItems.cell, table = tableItems.table, ut = getUETable(table), cellInfo = ut.getCellInfo(cell); + _$jscoverage['plugins/table.cmds.js'][328]++; + if ((! ut.selectedTds.length)) { + _$jscoverage['plugins/table.cmds.js'][329]++; + ut.insertRow((cellInfo.rowIndex + cellInfo.rowSpan), cell); + } + else { + _$jscoverage['plugins/table.cmds.js'][331]++; + var range = ut.cellsRange; + _$jscoverage['plugins/table.cmds.js'][332]++; + for (var i = 0, len = ((range.endRowIndex - range.beginRowIndex) + 1); (i < len); (i++)) { + _$jscoverage['plugins/table.cmds.js'][333]++; + ut.insertRow((range.endRowIndex + 1), cell); +} + } + _$jscoverage['plugins/table.cmds.js'][336]++; + rng.moveToBookmark(bk).select(); + _$jscoverage['plugins/table.cmds.js'][337]++; + if ((table.getAttribute("interlaced") === "enabled")) { + _$jscoverage['plugins/table.cmds.js'][337]++; + this.fireEvent("interlacetable", table); + } +})}; + _$jscoverage['plugins/table.cmds.js'][340]++; + UE.commands.deleterow = {queryCommandState: (function () { + _$jscoverage['plugins/table.cmds.js'][342]++; + var tableItems = getTableItemsByRange(this); + _$jscoverage['plugins/table.cmds.js'][343]++; + if ((! tableItems.cell)) { + _$jscoverage['plugins/table.cmds.js'][344]++; + return -1; + } +}), execCommand: (function () { + _$jscoverage['plugins/table.cmds.js'][348]++; + 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(); + _$jscoverage['plugins/table.cmds.js'][355]++; + if (utils.isEmptyObject(cellsRange)) { + _$jscoverage['plugins/table.cmds.js'][356]++; + ut.deleteRow(cellInfo.rowIndex); + } + else { + _$jscoverage['plugins/table.cmds.js'][358]++; + for (var i = cellsRange.beginRowIndex; (i < (cellsRange.endRowIndex + 1)); (i++)) { + _$jscoverage['plugins/table.cmds.js'][359]++; + ut.deleteRow(cellsRange.beginRowIndex); +} + } + _$jscoverage['plugins/table.cmds.js'][362]++; + var table = ut.table; + _$jscoverage['plugins/table.cmds.js'][363]++; + if ((! table.getElementsByTagName("td").length)) { + _$jscoverage['plugins/table.cmds.js'][364]++; + var nextSibling = table.nextSibling; + _$jscoverage['plugins/table.cmds.js'][365]++; + domUtils.remove(table); + _$jscoverage['plugins/table.cmds.js'][366]++; + if (nextSibling) { + _$jscoverage['plugins/table.cmds.js'][367]++; + rng.setStart(nextSibling, 0).setCursor(false, true); + } + } + else { + _$jscoverage['plugins/table.cmds.js'][370]++; + if (((cellInfo.rowSpan == 1) || (cellInfo.rowSpan == ((cellsRange.endRowIndex - cellsRange.beginRowIndex) + 1)))) { + _$jscoverage['plugins/table.cmds.js'][371]++; + if ((nextCell || preCell)) { + _$jscoverage['plugins/table.cmds.js'][371]++; + rng.selectNodeContents((nextCell || preCell)).setCursor(false, true); + } + } + else { + _$jscoverage['plugins/table.cmds.js'][373]++; + var newCell = ut.getCell(cellInfo.rowIndex, ut.indexTable[cellInfo.rowIndex][cellInfo.colIndex].cellIndex); + _$jscoverage['plugins/table.cmds.js'][374]++; + if (newCell) { + _$jscoverage['plugins/table.cmds.js'][374]++; + rng.selectNodeContents(newCell).setCursor(false, true); + } + } + } + _$jscoverage['plugins/table.cmds.js'][377]++; + if ((table.getAttribute("interlaced") === "enabled")) { + _$jscoverage['plugins/table.cmds.js'][377]++; + this.fireEvent("interlacetable", table); + } +})}; + _$jscoverage['plugins/table.cmds.js'][380]++; + UE.commands.insertcol = {queryCommandState: (function (cmd) { + _$jscoverage['plugins/table.cmds.js'][382]++; + var tableItems = getTableItemsByRange(this), cell = tableItems.cell; + _$jscoverage['plugins/table.cmds.js'][384]++; + return ((cell && ((cell.tagName == "TD") || (cell.tagName == "TH")) && (getUETable(tableItems.table).colsNum < this.options.maxColNum))? 0: -1); +}), execCommand: (function (cmd) { + _$jscoverage['plugins/table.cmds.js'][387]++; + var rng = this.selection.getRange(), bk = rng.createBookmark(true); + _$jscoverage['plugins/table.cmds.js'][389]++; + if ((this.queryCommandState(cmd) == -1)) { + _$jscoverage['plugins/table.cmds.js'][389]++; + return; + } + _$jscoverage['plugins/table.cmds.js'][390]++; + var cell = getTableItemsByRange(this).cell, ut = getUETable(cell), cellInfo = ut.getCellInfo(cell); + _$jscoverage['plugins/table.cmds.js'][395]++; + if ((! ut.selectedTds.length)) { + _$jscoverage['plugins/table.cmds.js'][396]++; + ut.insertCol(cellInfo.colIndex, cell); + } + else { + _$jscoverage['plugins/table.cmds.js'][398]++; + var range = ut.cellsRange; + _$jscoverage['plugins/table.cmds.js'][399]++; + for (var i = 0, len = ((range.endColIndex - range.beginColIndex) + 1); (i < len); (i++)) { + _$jscoverage['plugins/table.cmds.js'][400]++; + ut.insertCol(range.beginColIndex, cell); +} + } + _$jscoverage['plugins/table.cmds.js'][403]++; + rng.moveToBookmark(bk).select(true); +})}; + _$jscoverage['plugins/table.cmds.js'][406]++; + UE.commands.insertcolnext = {queryCommandState: (function () { + _$jscoverage['plugins/table.cmds.js'][408]++; + var tableItems = getTableItemsByRange(this), cell = tableItems.cell; + _$jscoverage['plugins/table.cmds.js'][410]++; + return ((cell && (getUETable(tableItems.table).colsNum < this.options.maxColNum))? 0: -1); +}), execCommand: (function () { + _$jscoverage['plugins/table.cmds.js'][413]++; + var rng = this.selection.getRange(), bk = rng.createBookmark(true); + _$jscoverage['plugins/table.cmds.js'][415]++; + var cell = getTableItemsByRange(this).cell, ut = getUETable(cell), cellInfo = ut.getCellInfo(cell); + _$jscoverage['plugins/table.cmds.js'][419]++; + if ((! ut.selectedTds.length)) { + _$jscoverage['plugins/table.cmds.js'][420]++; + ut.insertCol((cellInfo.colIndex + cellInfo.colSpan), cell); + } + else { + _$jscoverage['plugins/table.cmds.js'][422]++; + var range = ut.cellsRange; + _$jscoverage['plugins/table.cmds.js'][423]++; + for (var i = 0, len = ((range.endColIndex - range.beginColIndex) + 1); (i < len); (i++)) { + _$jscoverage['plugins/table.cmds.js'][424]++; + ut.insertCol((range.endColIndex + 1), cell); +} + } + _$jscoverage['plugins/table.cmds.js'][427]++; + rng.moveToBookmark(bk).select(); +})}; + _$jscoverage['plugins/table.cmds.js'][431]++; + UE.commands.deletecol = {queryCommandState: (function () { + _$jscoverage['plugins/table.cmds.js'][433]++; + var tableItems = getTableItemsByRange(this); + _$jscoverage['plugins/table.cmds.js'][434]++; + if ((! tableItems.cell)) { + _$jscoverage['plugins/table.cmds.js'][434]++; + return -1; + } +}), execCommand: (function () { + _$jscoverage['plugins/table.cmds.js'][437]++; + var cell = getTableItemsByRange(this).cell, ut = getUETable(cell), range = ut.cellsRange, cellInfo = ut.getCellInfo(cell), preCell = ut.getHSideCell(cell), nextCell = ut.getHSideCell(cell, true); + _$jscoverage['plugins/table.cmds.js'][443]++; + if (utils.isEmptyObject(range)) { + _$jscoverage['plugins/table.cmds.js'][444]++; + ut.deleteCol(cellInfo.colIndex); + } + else { + _$jscoverage['plugins/table.cmds.js'][446]++; + for (var i = range.beginColIndex; (i < (range.endColIndex + 1)); (i++)) { + _$jscoverage['plugins/table.cmds.js'][447]++; + ut.deleteCol(range.beginColIndex); +} + } + _$jscoverage['plugins/table.cmds.js'][450]++; + var table = ut.table, rng = this.selection.getRange(); + _$jscoverage['plugins/table.cmds.js'][453]++; + if ((! table.getElementsByTagName("td").length)) { + _$jscoverage['plugins/table.cmds.js'][454]++; + var nextSibling = table.nextSibling; + _$jscoverage['plugins/table.cmds.js'][455]++; + domUtils.remove(table); + _$jscoverage['plugins/table.cmds.js'][456]++; + if (nextSibling) { + _$jscoverage['plugins/table.cmds.js'][457]++; + rng.setStart(nextSibling, 0).setCursor(false, true); + } + } + else { + _$jscoverage['plugins/table.cmds.js'][460]++; + if (domUtils.inDoc(cell, this.document)) { + _$jscoverage['plugins/table.cmds.js'][461]++; + rng.setStart(cell, 0).setCursor(false, true); + } + else { + _$jscoverage['plugins/table.cmds.js'][463]++; + if ((nextCell && domUtils.inDoc(nextCell, this.document))) { + _$jscoverage['plugins/table.cmds.js'][464]++; + rng.selectNodeContents(nextCell).setCursor(false, true); + } + else { + _$jscoverage['plugins/table.cmds.js'][466]++; + if ((preCell && domUtils.inDoc(preCell, this.document))) { + _$jscoverage['plugins/table.cmds.js'][467]++; + rng.selectNodeContents(preCell).setCursor(true, true); + } + } + } + } +})}; + _$jscoverage['plugins/table.cmds.js'][474]++; + UE.commands.splittocells = {queryCommandState: (function () { + _$jscoverage['plugins/table.cmds.js'][476]++; + var tableItems = getTableItemsByRange(this), cell = tableItems.cell; + _$jscoverage['plugins/table.cmds.js'][478]++; + if ((! cell)) { + _$jscoverage['plugins/table.cmds.js'][478]++; + return -1; + } + _$jscoverage['plugins/table.cmds.js'][479]++; + var ut = getUETable(tableItems.table); + _$jscoverage['plugins/table.cmds.js'][480]++; + if ((ut.selectedTds.length > 0)) { + _$jscoverage['plugins/table.cmds.js'][480]++; + return -1; + } + _$jscoverage['plugins/table.cmds.js'][481]++; + return ((cell && ((cell.colSpan > 1) || (cell.rowSpan > 1)))? 0: -1); +}), execCommand: (function () { + _$jscoverage['plugins/table.cmds.js'][484]++; + var rng = this.selection.getRange(), bk = rng.createBookmark(true); + _$jscoverage['plugins/table.cmds.js'][486]++; + var cell = getTableItemsByRange(this).cell, ut = getUETable(cell); + _$jscoverage['plugins/table.cmds.js'][488]++; + ut.splitToCells(cell); + _$jscoverage['plugins/table.cmds.js'][489]++; + rng.moveToBookmark(bk).select(); +})}; + _$jscoverage['plugins/table.cmds.js'][492]++; + UE.commands.splittorows = {queryCommandState: (function () { + _$jscoverage['plugins/table.cmds.js'][494]++; + var tableItems = getTableItemsByRange(this), cell = tableItems.cell; + _$jscoverage['plugins/table.cmds.js'][496]++; + if ((! cell)) { + _$jscoverage['plugins/table.cmds.js'][496]++; + return -1; + } + _$jscoverage['plugins/table.cmds.js'][497]++; + var ut = getUETable(tableItems.table); + _$jscoverage['plugins/table.cmds.js'][498]++; + if ((ut.selectedTds.length > 0)) { + _$jscoverage['plugins/table.cmds.js'][498]++; + return -1; + } + _$jscoverage['plugins/table.cmds.js'][499]++; + return ((cell && (cell.rowSpan > 1))? 0: -1); +}), execCommand: (function () { + _$jscoverage['plugins/table.cmds.js'][502]++; + var rng = this.selection.getRange(), bk = rng.createBookmark(true); + _$jscoverage['plugins/table.cmds.js'][504]++; + var cell = getTableItemsByRange(this).cell, ut = getUETable(cell); + _$jscoverage['plugins/table.cmds.js'][506]++; + ut.splitToRows(cell); + _$jscoverage['plugins/table.cmds.js'][507]++; + rng.moveToBookmark(bk).select(); +})}; + _$jscoverage['plugins/table.cmds.js'][510]++; + UE.commands.splittocols = {queryCommandState: (function () { + _$jscoverage['plugins/table.cmds.js'][512]++; + var tableItems = getTableItemsByRange(this), cell = tableItems.cell; + _$jscoverage['plugins/table.cmds.js'][514]++; + if ((! cell)) { + _$jscoverage['plugins/table.cmds.js'][514]++; + return -1; + } + _$jscoverage['plugins/table.cmds.js'][515]++; + var ut = getUETable(tableItems.table); + _$jscoverage['plugins/table.cmds.js'][516]++; + if ((ut.selectedTds.length > 0)) { + _$jscoverage['plugins/table.cmds.js'][516]++; + return -1; + } + _$jscoverage['plugins/table.cmds.js'][517]++; + return ((cell && (cell.colSpan > 1))? 0: -1); +}), execCommand: (function () { + _$jscoverage['plugins/table.cmds.js'][520]++; + var rng = this.selection.getRange(), bk = rng.createBookmark(true); + _$jscoverage['plugins/table.cmds.js'][522]++; + var cell = getTableItemsByRange(this).cell, ut = getUETable(cell); + _$jscoverage['plugins/table.cmds.js'][524]++; + ut.splitToCols(cell); + _$jscoverage['plugins/table.cmds.js'][525]++; + rng.moveToBookmark(bk).select(); +})}; + _$jscoverage['plugins/table.cmds.js'][530]++; + UE.commands.adaptbytext = (UE.commands.adaptbywindow = {queryCommandState: (function () { + _$jscoverage['plugins/table.cmds.js'][533]++; + return (getTableItemsByRange(this).table? 0: -1); +}), execCommand: (function (cmd) { + _$jscoverage['plugins/table.cmds.js'][536]++; + var tableItems = getTableItemsByRange(this), table = tableItems.table; + _$jscoverage['plugins/table.cmds.js'][538]++; + if (table) { + _$jscoverage['plugins/table.cmds.js'][539]++; + if ((cmd == "adaptbywindow")) { + _$jscoverage['plugins/table.cmds.js'][540]++; + resetTdWidth(table, this); + } + else { + _$jscoverage['plugins/table.cmds.js'][542]++; + var cells = domUtils.getElementsByTagName(table, "td th"); + _$jscoverage['plugins/table.cmds.js'][543]++; + utils.each(cells, (function (cell) { + _$jscoverage['plugins/table.cmds.js'][544]++; + cell.removeAttribute("width"); +})); + _$jscoverage['plugins/table.cmds.js'][546]++; + table.removeAttribute("width"); + } + } +})}); + _$jscoverage['plugins/table.cmds.js'][553]++; + UE.commands.averagedistributecol = {queryCommandState: (function () { + _$jscoverage['plugins/table.cmds.js'][555]++; + var ut = getUETableBySelected(this); + _$jscoverage['plugins/table.cmds.js'][556]++; + if ((! ut)) { + _$jscoverage['plugins/table.cmds.js'][556]++; + return -1; + } + _$jscoverage['plugins/table.cmds.js'][557]++; + return ((ut.isFullRow() || ut.isFullCol())? 0: -1); +}), execCommand: (function (cmd) { + _$jscoverage['plugins/table.cmds.js'][560]++; + var me = this, ut = getUETableBySelected(me); + _$jscoverage['plugins/table.cmds.js'][563]++; + function getAverageWidth() { + _$jscoverage['plugins/table.cmds.js'][564]++; + var tb = ut.table, averageWidth, sumWidth = 0, colsNum = 0, tbAttr = getDefaultValue(me, tb); + _$jscoverage['plugins/table.cmds.js'][568]++; + if (ut.isFullRow()) { + _$jscoverage['plugins/table.cmds.js'][569]++; + sumWidth = tb.offsetWidth; + _$jscoverage['plugins/table.cmds.js'][570]++; + colsNum = ut.colsNum; + } + else { + _$jscoverage['plugins/table.cmds.js'][572]++; + var begin = ut.cellsRange.beginColIndex, end = ut.cellsRange.endColIndex, node; + _$jscoverage['plugins/table.cmds.js'][575]++; + for (var i = begin; (i <= end);) { + _$jscoverage['plugins/table.cmds.js'][576]++; + node = ut.selectedTds[i]; + _$jscoverage['plugins/table.cmds.js'][577]++; + sumWidth += node.offsetWidth; + _$jscoverage['plugins/table.cmds.js'][578]++; + i += node.colSpan; + _$jscoverage['plugins/table.cmds.js'][579]++; + colsNum += 1; +} + } + _$jscoverage['plugins/table.cmds.js'][582]++; + averageWidth = (Math.ceil((sumWidth / colsNum)) - (tbAttr.tdBorder * 2) - (tbAttr.tdPadding * 2)); + _$jscoverage['plugins/table.cmds.js'][583]++; + return averageWidth; +} + _$jscoverage['plugins/table.cmds.js'][586]++; + function setAverageWidth(averageWidth) { + _$jscoverage['plugins/table.cmds.js'][587]++; + utils.each(domUtils.getElementsByTagName(ut.table, "th"), (function (node) { + _$jscoverage['plugins/table.cmds.js'][588]++; + node.setAttribute("width", ""); +})); + _$jscoverage['plugins/table.cmds.js'][590]++; + var cells = (ut.isFullRow()? domUtils.getElementsByTagName(ut.table, "td"): ut.selectedTds); + _$jscoverage['plugins/table.cmds.js'][592]++; + utils.each(cells, (function (node) { + _$jscoverage['plugins/table.cmds.js'][593]++; + if ((node.colSpan == 1)) { + _$jscoverage['plugins/table.cmds.js'][594]++; + node.setAttribute("width", averageWidth); + } +})); +} + _$jscoverage['plugins/table.cmds.js'][599]++; + if ((ut && ut.selectedTds.length)) { + _$jscoverage['plugins/table.cmds.js'][600]++; + setAverageWidth(getAverageWidth()); + } +})}; + _$jscoverage['plugins/table.cmds.js'][605]++; + UE.commands.averagedistributerow = {queryCommandState: (function () { + _$jscoverage['plugins/table.cmds.js'][607]++; + var ut = getUETableBySelected(this); + _$jscoverage['plugins/table.cmds.js'][608]++; + if ((! ut)) { + _$jscoverage['plugins/table.cmds.js'][608]++; + return -1; + } + _$jscoverage['plugins/table.cmds.js'][609]++; + if ((ut.selectedTds && /th/gi.test(ut.selectedTds[0].tagName))) { + _$jscoverage['plugins/table.cmds.js'][609]++; + return -1; + } + _$jscoverage['plugins/table.cmds.js'][610]++; + return ((ut.isFullRow() || ut.isFullCol())? 0: -1); +}), execCommand: (function (cmd) { + _$jscoverage['plugins/table.cmds.js'][613]++; + var me = this, ut = getUETableBySelected(me); + _$jscoverage['plugins/table.cmds.js'][616]++; + function getAverageHeight() { + _$jscoverage['plugins/table.cmds.js'][617]++; + var averageHeight, rowNum, sumHeight = 0, tb = ut.table, tbAttr = getDefaultValue(me, tb), tdpadding = parseInt(domUtils.getComputedStyle(tb.getElementsByTagName("td")[0], "padding-top")); + _$jscoverage['plugins/table.cmds.js'][622]++; + if (ut.isFullCol()) { + _$jscoverage['plugins/table.cmds.js'][623]++; + var captionArr = domUtils.getElementsByTagName(tb, "caption"), thArr = domUtils.getElementsByTagName(tb, "th"), captionHeight, thHeight; + _$jscoverage['plugins/table.cmds.js'][627]++; + if ((captionArr.length > 0)) { + _$jscoverage['plugins/table.cmds.js'][628]++; + captionHeight = captionArr[0].offsetHeight; + } + _$jscoverage['plugins/table.cmds.js'][630]++; + if ((thArr.length > 0)) { + _$jscoverage['plugins/table.cmds.js'][631]++; + thHeight = thArr[0].offsetHeight; + } + _$jscoverage['plugins/table.cmds.js'][634]++; + sumHeight = (tb.offsetHeight - (captionHeight || 0) - (thHeight || 0)); + _$jscoverage['plugins/table.cmds.js'][635]++; + rowNum = ((thArr.length == 0)? ut.rowsNum: (ut.rowsNum - 1)); + } + else { + _$jscoverage['plugins/table.cmds.js'][637]++; + var begin = ut.cellsRange.beginRowIndex, end = ut.cellsRange.endRowIndex, count = 0, trs = domUtils.getElementsByTagName(tb, "tr"); + _$jscoverage['plugins/table.cmds.js'][641]++; + for (var i = begin; (i <= end); (i++)) { + _$jscoverage['plugins/table.cmds.js'][642]++; + sumHeight += trs[i].offsetHeight; + _$jscoverage['plugins/table.cmds.js'][643]++; + count += 1; +} + _$jscoverage['plugins/table.cmds.js'][645]++; + rowNum = count; + } + _$jscoverage['plugins/table.cmds.js'][648]++; + if ((browser.ie && (browser.version < 9))) { + _$jscoverage['plugins/table.cmds.js'][649]++; + averageHeight = Math.ceil((sumHeight / rowNum)); + } + else { + _$jscoverage['plugins/table.cmds.js'][651]++; + averageHeight = (Math.ceil((sumHeight / rowNum)) - (tbAttr.tdBorder * 2) - (tdpadding * 2)); + } + _$jscoverage['plugins/table.cmds.js'][653]++; + return averageHeight; +} + _$jscoverage['plugins/table.cmds.js'][656]++; + function setAverageHeight(averageHeight) { + _$jscoverage['plugins/table.cmds.js'][657]++; + var cells = (ut.isFullCol()? domUtils.getElementsByTagName(ut.table, "td"): ut.selectedTds); + _$jscoverage['plugins/table.cmds.js'][658]++; + utils.each(cells, (function (node) { + _$jscoverage['plugins/table.cmds.js'][659]++; + if ((node.rowSpan == 1)) { + _$jscoverage['plugins/table.cmds.js'][660]++; + node.setAttribute("height", averageHeight); + } +})); +} + _$jscoverage['plugins/table.cmds.js'][665]++; + if ((ut && ut.selectedTds.length)) { + _$jscoverage['plugins/table.cmds.js'][666]++; + setAverageHeight(getAverageHeight()); + } +})}; + _$jscoverage['plugins/table.cmds.js'][672]++; + UE.commands.cellalignment = {queryCommandState: (function () { + _$jscoverage['plugins/table.cmds.js'][674]++; + return (getTableItemsByRange(this).table? 0: -1); +}), execCommand: (function (cmd, data) { + _$jscoverage['plugins/table.cmds.js'][677]++; + var me = this, ut = getUETableBySelected(me); + _$jscoverage['plugins/table.cmds.js'][680]++; + if ((! ut)) { + _$jscoverage['plugins/table.cmds.js'][681]++; + var start = me.selection.getStart(), cell = (start && domUtils.findParentByTagName(start, ["td", "th", "caption"], true)); + _$jscoverage['plugins/table.cmds.js'][683]++; + if ((! /caption/gi.test(cell.tagName))) { + _$jscoverage['plugins/table.cmds.js'][684]++; + domUtils.setAttributes(cell, data); + } + else { + _$jscoverage['plugins/table.cmds.js'][686]++; + cell.style.textAlign = data.align; + _$jscoverage['plugins/table.cmds.js'][687]++; + cell.style.verticalAlign = data.vAlign; + } + _$jscoverage['plugins/table.cmds.js'][689]++; + me.selection.getRange().setCursor(true); + } + else { + _$jscoverage['plugins/table.cmds.js'][691]++; + utils.each(ut.selectedTds, (function (cell) { + _$jscoverage['plugins/table.cmds.js'][692]++; + domUtils.setAttributes(cell, data); +})); + } +}), queryCommandValue: (function (cmd) { + _$jscoverage['plugins/table.cmds.js'][702]++; + var activeMenuCell = getTableItemsByRange(this).cell; + _$jscoverage['plugins/table.cmds.js'][704]++; + if ((! activeMenuCell)) { + _$jscoverage['plugins/table.cmds.js'][705]++; + activeMenuCell = getSelectedArr(this)[0]; + } + _$jscoverage['plugins/table.cmds.js'][708]++; + if ((! activeMenuCell)) { + _$jscoverage['plugins/table.cmds.js'][710]++; + return null; + } + else { + _$jscoverage['plugins/table.cmds.js'][715]++; + var cells = UE.UETable.getUETable(activeMenuCell).selectedTds; + _$jscoverage['plugins/table.cmds.js'][717]++; + ((! cells.length) && (cells = activeMenuCell)); + _$jscoverage['plugins/table.cmds.js'][719]++; + return UE.UETable.getTableCellAlignState(cells); + } +})}; + _$jscoverage['plugins/table.cmds.js'][726]++; + UE.commands.tablealignment = {queryCommandState: (function () { + _$jscoverage['plugins/table.cmds.js'][728]++; + if ((browser.ie && (browser.version < 8))) { + _$jscoverage['plugins/table.cmds.js'][729]++; + return -1; + } + _$jscoverage['plugins/table.cmds.js'][731]++; + return (getTableItemsByRange(this).table? 0: -1); +}), execCommand: (function (cmd, value) { + _$jscoverage['plugins/table.cmds.js'][734]++; + var me = this, start = me.selection.getStart(), table = (start && domUtils.findParentByTagName(start, ["table"], true)); + _$jscoverage['plugins/table.cmds.js'][738]++; + if (table) { + _$jscoverage['plugins/table.cmds.js'][739]++; + table.setAttribute("align", value); + } +})}; + _$jscoverage['plugins/table.cmds.js'][745]++; + UE.commands.edittable = {queryCommandState: (function () { + _$jscoverage['plugins/table.cmds.js'][747]++; + return (getTableItemsByRange(this).table? 0: -1); +}), execCommand: (function (cmd, color) { + _$jscoverage['plugins/table.cmds.js'][750]++; + var rng = this.selection.getRange(), table = domUtils.findParentByTagName(rng.startContainer, "table"); + _$jscoverage['plugins/table.cmds.js'][752]++; + if (table) { + _$jscoverage['plugins/table.cmds.js'][753]++; + var arr = domUtils.getElementsByTagName(table, "td").concat(domUtils.getElementsByTagName(table, "th"), domUtils.getElementsByTagName(table, "caption")); + _$jscoverage['plugins/table.cmds.js'][757]++; + utils.each(arr, (function (node) { + _$jscoverage['plugins/table.cmds.js'][758]++; + node.style.borderColor = color; +})); + } +})}; + _$jscoverage['plugins/table.cmds.js'][764]++; + UE.commands.edittd = {queryCommandState: (function () { + _$jscoverage['plugins/table.cmds.js'][766]++; + return (getTableItemsByRange(this).table? 0: -1); +}), execCommand: (function (cmd, bkColor) { + _$jscoverage['plugins/table.cmds.js'][769]++; + var me = this, ut = getUETableBySelected(me); + _$jscoverage['plugins/table.cmds.js'][772]++; + if ((! ut)) { + _$jscoverage['plugins/table.cmds.js'][773]++; + var start = me.selection.getStart(), cell = (start && domUtils.findParentByTagName(start, ["td", "th", "caption"], true)); + _$jscoverage['plugins/table.cmds.js'][775]++; + if (cell) { + _$jscoverage['plugins/table.cmds.js'][776]++; + cell.style.backgroundColor = bkColor; + } + } + else { + _$jscoverage['plugins/table.cmds.js'][779]++; + utils.each(ut.selectedTds, (function (cell) { + _$jscoverage['plugins/table.cmds.js'][780]++; + cell.style.backgroundColor = bkColor; +})); + } +})}; + _$jscoverage['plugins/table.cmds.js'][785]++; + UE.commands.sorttable = {queryCommandState: (function () { + _$jscoverage['plugins/table.cmds.js'][787]++; + var me = this, tableItems = getTableItemsByRange(me); + _$jscoverage['plugins/table.cmds.js'][789]++; + if ((! tableItems.cell)) { + _$jscoverage['plugins/table.cmds.js'][789]++; + return -1; + } + _$jscoverage['plugins/table.cmds.js'][790]++; + var table = tableItems.table, cells = table.getElementsByTagName("td"); + _$jscoverage['plugins/table.cmds.js'][792]++; + for (var i = 0, cell; (cell = cells[(i++)]);) { + _$jscoverage['plugins/table.cmds.js'][793]++; + if (((cell.rowSpan != 1) || (cell.colSpan != 1))) { + _$jscoverage['plugins/table.cmds.js'][793]++; + return -1; + } +} + _$jscoverage['plugins/table.cmds.js'][795]++; + return 0; +}), execCommand: (function (cmd, fn) { + _$jscoverage['plugins/table.cmds.js'][798]++; + 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); + _$jscoverage['plugins/table.cmds.js'][805]++; + ut.sortTable(cellInfo.cellIndex, fn); + _$jscoverage['plugins/table.cmds.js'][806]++; + range.moveToBookmark(bk).select(); +})}; + _$jscoverage['plugins/table.cmds.js'][810]++; + UE.commands.enablesort = (UE.commands.disablesort = {queryCommandState: (function () { + _$jscoverage['plugins/table.cmds.js'][812]++; + return (getTableItemsByRange(this).table? 0: -1); +}), execCommand: (function (cmd) { + _$jscoverage['plugins/table.cmds.js'][815]++; + var table = getTableItemsByRange(this).table; + _$jscoverage['plugins/table.cmds.js'][816]++; + table.setAttribute("data-sort", ((cmd == "enablesort")? "sortEnabled": "sortDisabled")); +})}); + _$jscoverage['plugins/table.cmds.js'][819]++; + UE.commands.settablebackground = {queryCommandState: (function () { + _$jscoverage['plugins/table.cmds.js'][821]++; + return ((getSelectedArr(this).length > 1)? 0: -1); +}), execCommand: (function (cmd, value) { + _$jscoverage['plugins/table.cmds.js'][824]++; + var table, cells, ut; + _$jscoverage['plugins/table.cmds.js'][825]++; + cells = getSelectedArr(this); + _$jscoverage['plugins/table.cmds.js'][826]++; + ut = getUETable(cells[0]); + _$jscoverage['plugins/table.cmds.js'][827]++; + ut.setBackground(cells, value); +})}; + _$jscoverage['plugins/table.cmds.js'][831]++; + UE.commands.cleartablebackground = {queryCommandState: (function () { + _$jscoverage['plugins/table.cmds.js'][833]++; + var cells = getSelectedArr(this); + _$jscoverage['plugins/table.cmds.js'][834]++; + if ((! cells.length)) { + _$jscoverage['plugins/table.cmds.js'][834]++; + return -1; + } + _$jscoverage['plugins/table.cmds.js'][835]++; + for (var i = 0, cell; (cell = cells[(i++)]);) { + _$jscoverage['plugins/table.cmds.js'][836]++; + if ((cell.style.backgroundColor !== "")) { + _$jscoverage['plugins/table.cmds.js'][836]++; + return 0; + } +} + _$jscoverage['plugins/table.cmds.js'][838]++; + return -1; +}), execCommand: (function () { + _$jscoverage['plugins/table.cmds.js'][841]++; + var cells = getSelectedArr(this), ut = getUETable(cells[0]); + _$jscoverage['plugins/table.cmds.js'][843]++; + ut.removeBackground(cells); +})}; + _$jscoverage['plugins/table.cmds.js'][847]++; + UE.commands.interlacetable = (UE.commands.uninterlacetable = {queryCommandState: (function (cmd) { + _$jscoverage['plugins/table.cmds.js'][849]++; + var table = getTableItemsByRange(this).table; + _$jscoverage['plugins/table.cmds.js'][850]++; + if ((! table)) { + _$jscoverage['plugins/table.cmds.js'][850]++; + return -1; + } + _$jscoverage['plugins/table.cmds.js'][851]++; + var interlaced = table.getAttribute("interlaced"); + _$jscoverage['plugins/table.cmds.js'][852]++; + if ((cmd == "interlacetable")) { + _$jscoverage['plugins/table.cmds.js'][855]++; + return ((interlaced === "enabled")? -1: 0); + } + else { + _$jscoverage['plugins/table.cmds.js'][857]++; + return (((! interlaced) || (interlaced === "disabled"))? -1: 0); + } +}), execCommand: (function (cmd, classList) { + _$jscoverage['plugins/table.cmds.js'][861]++; + var table = getTableItemsByRange(this).table; + _$jscoverage['plugins/table.cmds.js'][862]++; + if ((cmd == "interlacetable")) { + _$jscoverage['plugins/table.cmds.js'][863]++; + table.setAttribute("interlaced", "enabled"); + _$jscoverage['plugins/table.cmds.js'][864]++; + this.fireEvent("interlacetable", table, classList); + } + else { + _$jscoverage['plugins/table.cmds.js'][866]++; + table.setAttribute("interlaced", "disabled"); + _$jscoverage['plugins/table.cmds.js'][867]++; + this.fireEvent("uninterlacetable", table); + } +})}); + _$jscoverage['plugins/table.cmds.js'][872]++; + function resetTdWidth(table, editor) { + _$jscoverage['plugins/table.cmds.js'][873]++; + var tds = table.getElementsByTagName("td"); + _$jscoverage['plugins/table.cmds.js'][874]++; + utils.each(tds, (function (td) { + _$jscoverage['plugins/table.cmds.js'][875]++; + td.removeAttribute("width"); +})); + _$jscoverage['plugins/table.cmds.js'][877]++; + table.setAttribute("width", getTableWidth(editor, true, getDefaultValue(editor, table))); + _$jscoverage['plugins/table.cmds.js'][878]++; + setTimeout((function () { + _$jscoverage['plugins/table.cmds.js'][879]++; + utils.each(tds, (function (td) { + _$jscoverage['plugins/table.cmds.js'][880]++; + ((td.colSpan == 1) && td.setAttribute("width", (td.offsetWidth + ""))); +})); +}), 0); +} + _$jscoverage['plugins/table.cmds.js'][885]++; + function getTableWidth(editor, needIEHack, defaultValue) { + _$jscoverage['plugins/table.cmds.js'][886]++; + var body = editor.body; + _$jscoverage['plugins/table.cmds.js'][887]++; + return (body.offsetWidth - (needIEHack? (parseInt(domUtils.getComputedStyle(body, "margin-left"), 10) * 2): 0) - (defaultValue.tableBorder * 2) - (editor.options.offsetWidth || 0)); +} + _$jscoverage['plugins/table.cmds.js'][890]++; + function getSelectedArr(editor) { + _$jscoverage['plugins/table.cmds.js'][891]++; + var cell = getTableItemsByRange(editor).cell; + _$jscoverage['plugins/table.cmds.js'][892]++; + if (cell) { + _$jscoverage['plugins/table.cmds.js'][893]++; + var ut = getUETable(cell); + _$jscoverage['plugins/table.cmds.js'][894]++; + return (ut.selectedTds.length? ut.selectedTds: [cell]); + } + else { + _$jscoverage['plugins/table.cmds.js'][896]++; + return []; + } +} +})(); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/table.core.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/table.core.js new file mode 100644 index 000000000..1b675a02d --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/table.core.js @@ -0,0 +1,2011 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/table.core.js']) { + _$jscoverage['plugins/table.core.js'] = []; + _$jscoverage['plugins/table.core.js'][13] = 0; + _$jscoverage['plugins/table.core.js'][14] = 0; + _$jscoverage['plugins/table.core.js'][15] = 0; + _$jscoverage['plugins/table.core.js'][16] = 0; + _$jscoverage['plugins/table.core.js'][17] = 0; + _$jscoverage['plugins/table.core.js'][18] = 0; + _$jscoverage['plugins/table.core.js'][19] = 0; + _$jscoverage['plugins/table.core.js'][23] = 0; + _$jscoverage['plugins/table.core.js'][24] = 0; + _$jscoverage['plugins/table.core.js'][25] = 0; + _$jscoverage['plugins/table.core.js'][28] = 0; + _$jscoverage['plugins/table.core.js'][29] = 0; + _$jscoverage['plugins/table.core.js'][30] = 0; + _$jscoverage['plugins/table.core.js'][33] = 0; + _$jscoverage['plugins/table.core.js'][34] = 0; + _$jscoverage['plugins/table.core.js'][35] = 0; + _$jscoverage['plugins/table.core.js'][36] = 0; + _$jscoverage['plugins/table.core.js'][38] = 0; + _$jscoverage['plugins/table.core.js'][39] = 0; + _$jscoverage['plugins/table.core.js'][40] = 0; + _$jscoverage['plugins/table.core.js'][43] = 0; + _$jscoverage['plugins/table.core.js'][45] = 0; + _$jscoverage['plugins/table.core.js'][46] = 0; + _$jscoverage['plugins/table.core.js'][47] = 0; + _$jscoverage['plugins/table.core.js'][56] = 0; + _$jscoverage['plugins/table.core.js'][58] = 0; + _$jscoverage['plugins/table.core.js'][60] = 0; + _$jscoverage['plugins/table.core.js'][65] = 0; + _$jscoverage['plugins/table.core.js'][67] = 0; + _$jscoverage['plugins/table.core.js'][69] = 0; + _$jscoverage['plugins/table.core.js'][71] = 0; + _$jscoverage['plugins/table.core.js'][72] = 0; + _$jscoverage['plugins/table.core.js'][73] = 0; + _$jscoverage['plugins/table.core.js'][74] = 0; + _$jscoverage['plugins/table.core.js'][75] = 0; + _$jscoverage['plugins/table.core.js'][80] = 0; + _$jscoverage['plugins/table.core.js'][84] = 0; + _$jscoverage['plugins/table.core.js'][92] = 0; + _$jscoverage['plugins/table.core.js'][93] = 0; + _$jscoverage['plugins/table.core.js'][96] = 0; + _$jscoverage['plugins/table.core.js'][97] = 0; + _$jscoverage['plugins/table.core.js'][101] = 0; + _$jscoverage['plugins/table.core.js'][106] = 0; + _$jscoverage['plugins/table.core.js'][113] = 0; + _$jscoverage['plugins/table.core.js'][114] = 0; + _$jscoverage['plugins/table.core.js'][115] = 0; + _$jscoverage['plugins/table.core.js'][116] = 0; + _$jscoverage['plugins/table.core.js'][118] = 0; + _$jscoverage['plugins/table.core.js'][121] = 0; + _$jscoverage['plugins/table.core.js'][122] = 0; + _$jscoverage['plugins/table.core.js'][128] = 0; + _$jscoverage['plugins/table.core.js'][129] = 0; + _$jscoverage['plugins/table.core.js'][130] = 0; + _$jscoverage['plugins/table.core.js'][131] = 0; + _$jscoverage['plugins/table.core.js'][132] = 0; + _$jscoverage['plugins/table.core.js'][133] = 0; + _$jscoverage['plugins/table.core.js'][134] = 0; + _$jscoverage['plugins/table.core.js'][135] = 0; + _$jscoverage['plugins/table.core.js'][136] = 0; + _$jscoverage['plugins/table.core.js'][137] = 0; + _$jscoverage['plugins/table.core.js'][138] = 0; + _$jscoverage['plugins/table.core.js'][139] = 0; + _$jscoverage['plugins/table.core.js'][140] = 0; + _$jscoverage['plugins/table.core.js'][146] = 0; + _$jscoverage['plugins/table.core.js'][147] = 0; + _$jscoverage['plugins/table.core.js'][148] = 0; + _$jscoverage['plugins/table.core.js'][149] = 0; + _$jscoverage['plugins/table.core.js'][150] = 0; + _$jscoverage['plugins/table.core.js'][151] = 0; + _$jscoverage['plugins/table.core.js'][152] = 0; + _$jscoverage['plugins/table.core.js'][153] = 0; + _$jscoverage['plugins/table.core.js'][164] = 0; + _$jscoverage['plugins/table.core.js'][165] = 0; + _$jscoverage['plugins/table.core.js'][166] = 0; + _$jscoverage['plugins/table.core.js'][167] = 0; + _$jscoverage['plugins/table.core.js'][168] = 0; + _$jscoverage['plugins/table.core.js'][170] = 0; + _$jscoverage['plugins/table.core.js'][173] = 0; + _$jscoverage['plugins/table.core.js'][174] = 0; + _$jscoverage['plugins/table.core.js'][175] = 0; + _$jscoverage['plugins/table.core.js'][177] = 0; + _$jscoverage['plugins/table.core.js'][178] = 0; + _$jscoverage['plugins/table.core.js'][179] = 0; + _$jscoverage['plugins/table.core.js'][180] = 0; + _$jscoverage['plugins/table.core.js'][181] = 0; + _$jscoverage['plugins/table.core.js'][184] = 0; + _$jscoverage['plugins/table.core.js'][185] = 0; + _$jscoverage['plugins/table.core.js'][187] = 0; + _$jscoverage['plugins/table.core.js'][188] = 0; + _$jscoverage['plugins/table.core.js'][189] = 0; + _$jscoverage['plugins/table.core.js'][190] = 0; + _$jscoverage['plugins/table.core.js'][191] = 0; + _$jscoverage['plugins/table.core.js'][192] = 0; + _$jscoverage['plugins/table.core.js'][193] = 0; + _$jscoverage['plugins/table.core.js'][194] = 0; + _$jscoverage['plugins/table.core.js'][197] = 0; + _$jscoverage['plugins/table.core.js'][199] = 0; + _$jscoverage['plugins/table.core.js'][200] = 0; + _$jscoverage['plugins/table.core.js'][201] = 0; + _$jscoverage['plugins/table.core.js'][202] = 0; + _$jscoverage['plugins/table.core.js'][203] = 0; + _$jscoverage['plugins/table.core.js'][205] = 0; + _$jscoverage['plugins/table.core.js'][207] = 0; + _$jscoverage['plugins/table.core.js'][213] = 0; + _$jscoverage['plugins/table.core.js'][214] = 0; + _$jscoverage['plugins/table.core.js'][215] = 0; + _$jscoverage['plugins/table.core.js'][216] = 0; + _$jscoverage['plugins/table.core.js'][217] = 0; + _$jscoverage['plugins/table.core.js'][218] = 0; + _$jscoverage['plugins/table.core.js'][219] = 0; + _$jscoverage['plugins/table.core.js'][220] = 0; + _$jscoverage['plugins/table.core.js'][221] = 0; + _$jscoverage['plugins/table.core.js'][223] = 0; + _$jscoverage['plugins/table.core.js'][229] = 0; + _$jscoverage['plugins/table.core.js'][230] = 0; + _$jscoverage['plugins/table.core.js'][232] = 0; + _$jscoverage['plugins/table.core.js'][243] = 0; + _$jscoverage['plugins/table.core.js'][244] = 0; + _$jscoverage['plugins/table.core.js'][246] = 0; + _$jscoverage['plugins/table.core.js'][249] = 0; + _$jscoverage['plugins/table.core.js'][251] = 0; + _$jscoverage['plugins/table.core.js'][252] = 0; + _$jscoverage['plugins/table.core.js'][254] = 0; + _$jscoverage['plugins/table.core.js'][256] = 0; + _$jscoverage['plugins/table.core.js'][260] = 0; + _$jscoverage['plugins/table.core.js'][264] = 0; + _$jscoverage['plugins/table.core.js'][265] = 0; + _$jscoverage['plugins/table.core.js'][267] = 0; + _$jscoverage['plugins/table.core.js'][268] = 0; + _$jscoverage['plugins/table.core.js'][269] = 0; + _$jscoverage['plugins/table.core.js'][270] = 0; + _$jscoverage['plugins/table.core.js'][274] = 0; + _$jscoverage['plugins/table.core.js'][283] = 0; + _$jscoverage['plugins/table.core.js'][284] = 0; + _$jscoverage['plugins/table.core.js'][286] = 0; + _$jscoverage['plugins/table.core.js'][289] = 0; + _$jscoverage['plugins/table.core.js'][291] = 0; + _$jscoverage['plugins/table.core.js'][293] = 0; + _$jscoverage['plugins/table.core.js'][294] = 0; + _$jscoverage['plugins/table.core.js'][296] = 0; + _$jscoverage['plugins/table.core.js'][303] = 0; + _$jscoverage['plugins/table.core.js'][304] = 0; + _$jscoverage['plugins/table.core.js'][308] = 0; + _$jscoverage['plugins/table.core.js'][309] = 0; + _$jscoverage['plugins/table.core.js'][310] = 0; + _$jscoverage['plugins/table.core.js'][311] = 0; + _$jscoverage['plugins/table.core.js'][313] = 0; + _$jscoverage['plugins/table.core.js'][314] = 0; + _$jscoverage['plugins/table.core.js'][317] = 0; + _$jscoverage['plugins/table.core.js'][318] = 0; + _$jscoverage['plugins/table.core.js'][320] = 0; + _$jscoverage['plugins/table.core.js'][324] = 0; + _$jscoverage['plugins/table.core.js'][326] = 0; + _$jscoverage['plugins/table.core.js'][330] = 0; + _$jscoverage['plugins/table.core.js'][337] = 0; + _$jscoverage['plugins/table.core.js'][338] = 0; + _$jscoverage['plugins/table.core.js'][340] = 0; + _$jscoverage['plugins/table.core.js'][341] = 0; + _$jscoverage['plugins/table.core.js'][342] = 0; + _$jscoverage['plugins/table.core.js'][343] = 0; + _$jscoverage['plugins/table.core.js'][344] = 0; + _$jscoverage['plugins/table.core.js'][345] = 0; + _$jscoverage['plugins/table.core.js'][346] = 0; + _$jscoverage['plugins/table.core.js'][347] = 0; + _$jscoverage['plugins/table.core.js'][351] = 0; + _$jscoverage['plugins/table.core.js'][353] = 0; + _$jscoverage['plugins/table.core.js'][360] = 0; + _$jscoverage['plugins/table.core.js'][361] = 0; + _$jscoverage['plugins/table.core.js'][362] = 0; + _$jscoverage['plugins/table.core.js'][363] = 0; + _$jscoverage['plugins/table.core.js'][364] = 0; + _$jscoverage['plugins/table.core.js'][368] = 0; + _$jscoverage['plugins/table.core.js'][369] = 0; + _$jscoverage['plugins/table.core.js'][371] = 0; + _$jscoverage['plugins/table.core.js'][372] = 0; + _$jscoverage['plugins/table.core.js'][373] = 0; + _$jscoverage['plugins/table.core.js'][374] = 0; + _$jscoverage['plugins/table.core.js'][377] = 0; + _$jscoverage['plugins/table.core.js'][378] = 0; + _$jscoverage['plugins/table.core.js'][380] = 0; + _$jscoverage['plugins/table.core.js'][381] = 0; + _$jscoverage['plugins/table.core.js'][383] = 0; + _$jscoverage['plugins/table.core.js'][387] = 0; + _$jscoverage['plugins/table.core.js'][388] = 0; + _$jscoverage['plugins/table.core.js'][389] = 0; + _$jscoverage['plugins/table.core.js'][390] = 0; + _$jscoverage['plugins/table.core.js'][402] = 0; + _$jscoverage['plugins/table.core.js'][403] = 0; + _$jscoverage['plugins/table.core.js'][404] = 0; + _$jscoverage['plugins/table.core.js'][405] = 0; + _$jscoverage['plugins/table.core.js'][406] = 0; + _$jscoverage['plugins/table.core.js'][407] = 0; + _$jscoverage['plugins/table.core.js'][408] = 0; + _$jscoverage['plugins/table.core.js'][409] = 0; + _$jscoverage['plugins/table.core.js'][410] = 0; + _$jscoverage['plugins/table.core.js'][411] = 0; + _$jscoverage['plugins/table.core.js'][412] = 0; + _$jscoverage['plugins/table.core.js'][423] = 0; + _$jscoverage['plugins/table.core.js'][425] = 0; + _$jscoverage['plugins/table.core.js'][426] = 0; + _$jscoverage['plugins/table.core.js'][427] = 0; + _$jscoverage['plugins/table.core.js'][430] = 0; + _$jscoverage['plugins/table.core.js'][431] = 0; + _$jscoverage['plugins/table.core.js'][435] = 0; + _$jscoverage['plugins/table.core.js'][436] = 0; + _$jscoverage['plugins/table.core.js'][449] = 0; + _$jscoverage['plugins/table.core.js'][450] = 0; + _$jscoverage['plugins/table.core.js'][454] = 0; + _$jscoverage['plugins/table.core.js'][455] = 0; + _$jscoverage['plugins/table.core.js'][456] = 0; + _$jscoverage['plugins/table.core.js'][457] = 0; + _$jscoverage['plugins/table.core.js'][465] = 0; + _$jscoverage['plugins/table.core.js'][471] = 0; + _$jscoverage['plugins/table.core.js'][472] = 0; + _$jscoverage['plugins/table.core.js'][473] = 0; + _$jscoverage['plugins/table.core.js'][479] = 0; + _$jscoverage['plugins/table.core.js'][480] = 0; + _$jscoverage['plugins/table.core.js'][486] = 0; + _$jscoverage['plugins/table.core.js'][487] = 0; + _$jscoverage['plugins/table.core.js'][488] = 0; + _$jscoverage['plugins/table.core.js'][489] = 0; + _$jscoverage['plugins/table.core.js'][490] = 0; + _$jscoverage['plugins/table.core.js'][491] = 0; + _$jscoverage['plugins/table.core.js'][496] = 0; + _$jscoverage['plugins/table.core.js'][497] = 0; + _$jscoverage['plugins/table.core.js'][498] = 0; + _$jscoverage['plugins/table.core.js'][499] = 0; + _$jscoverage['plugins/table.core.js'][500] = 0; + _$jscoverage['plugins/table.core.js'][501] = 0; + _$jscoverage['plugins/table.core.js'][506] = 0; + _$jscoverage['plugins/table.core.js'][507] = 0; + _$jscoverage['plugins/table.core.js'][508] = 0; + _$jscoverage['plugins/table.core.js'][509] = 0; + _$jscoverage['plugins/table.core.js'][510] = 0; + _$jscoverage['plugins/table.core.js'][511] = 0; + _$jscoverage['plugins/table.core.js'][516] = 0; + _$jscoverage['plugins/table.core.js'][517] = 0; + _$jscoverage['plugins/table.core.js'][518] = 0; + _$jscoverage['plugins/table.core.js'][519] = 0; + _$jscoverage['plugins/table.core.js'][520] = 0; + _$jscoverage['plugins/table.core.js'][521] = 0; + _$jscoverage['plugins/table.core.js'][526] = 0; + _$jscoverage['plugins/table.core.js'][527] = 0; + _$jscoverage['plugins/table.core.js'][530] = 0; + _$jscoverage['plugins/table.core.js'][539] = 0; + _$jscoverage['plugins/table.core.js'][540] = 0; + _$jscoverage['plugins/table.core.js'][542] = 0; + _$jscoverage['plugins/table.core.js'][543] = 0; + _$jscoverage['plugins/table.core.js'][550] = 0; + _$jscoverage['plugins/table.core.js'][552] = 0; + _$jscoverage['plugins/table.core.js'][557] = 0; + _$jscoverage['plugins/table.core.js'][567] = 0; + _$jscoverage['plugins/table.core.js'][568] = 0; + _$jscoverage['plugins/table.core.js'][573] = 0; + _$jscoverage['plugins/table.core.js'][574] = 0; + _$jscoverage['plugins/table.core.js'][575] = 0; + _$jscoverage['plugins/table.core.js'][576] = 0; + _$jscoverage['plugins/table.core.js'][577] = 0; + _$jscoverage['plugins/table.core.js'][579] = 0; + _$jscoverage['plugins/table.core.js'][580] = 0; + _$jscoverage['plugins/table.core.js'][581] = 0; + _$jscoverage['plugins/table.core.js'][582] = 0; + _$jscoverage['plugins/table.core.js'][583] = 0; + _$jscoverage['plugins/table.core.js'][585] = 0; + _$jscoverage['plugins/table.core.js'][588] = 0; + _$jscoverage['plugins/table.core.js'][594] = 0; + _$jscoverage['plugins/table.core.js'][595] = 0; + _$jscoverage['plugins/table.core.js'][596] = 0; + _$jscoverage['plugins/table.core.js'][602] = 0; + _$jscoverage['plugins/table.core.js'][603] = 0; + _$jscoverage['plugins/table.core.js'][604] = 0; + _$jscoverage['plugins/table.core.js'][605] = 0; + _$jscoverage['plugins/table.core.js'][608] = 0; + _$jscoverage['plugins/table.core.js'][609] = 0; + _$jscoverage['plugins/table.core.js'][612] = 0; + _$jscoverage['plugins/table.core.js'][616] = 0; + _$jscoverage['plugins/table.core.js'][625] = 0; + _$jscoverage['plugins/table.core.js'][626] = 0; + _$jscoverage['plugins/table.core.js'][628] = 0; + _$jscoverage['plugins/table.core.js'][631] = 0; + _$jscoverage['plugins/table.core.js'][633] = 0; + _$jscoverage['plugins/table.core.js'][635] = 0; + _$jscoverage['plugins/table.core.js'][636] = 0; + _$jscoverage['plugins/table.core.js'][638] = 0; + _$jscoverage['plugins/table.core.js'][642] = 0; + _$jscoverage['plugins/table.core.js'][643] = 0; + _$jscoverage['plugins/table.core.js'][645] = 0; + _$jscoverage['plugins/table.core.js'][648] = 0; + _$jscoverage['plugins/table.core.js'][650] = 0; + _$jscoverage['plugins/table.core.js'][652] = 0; + _$jscoverage['plugins/table.core.js'][654] = 0; + _$jscoverage['plugins/table.core.js'][656] = 0; + _$jscoverage['plugins/table.core.js'][663] = 0; + _$jscoverage['plugins/table.core.js'][664] = 0; + _$jscoverage['plugins/table.core.js'][665] = 0; + _$jscoverage['plugins/table.core.js'][666] = 0; + _$jscoverage['plugins/table.core.js'][668] = 0; + _$jscoverage['plugins/table.core.js'][669] = 0; + _$jscoverage['plugins/table.core.js'][670] = 0; + _$jscoverage['plugins/table.core.js'][672] = 0; + _$jscoverage['plugins/table.core.js'][673] = 0; + _$jscoverage['plugins/table.core.js'][680] = 0; + _$jscoverage['plugins/table.core.js'][685] = 0; + _$jscoverage['plugins/table.core.js'][687] = 0; + _$jscoverage['plugins/table.core.js'][689] = 0; + _$jscoverage['plugins/table.core.js'][691] = 0; + _$jscoverage['plugins/table.core.js'][692] = 0; + _$jscoverage['plugins/table.core.js'][698] = 0; + _$jscoverage['plugins/table.core.js'][702] = 0; + _$jscoverage['plugins/table.core.js'][703] = 0; + _$jscoverage['plugins/table.core.js'][704] = 0; + _$jscoverage['plugins/table.core.js'][705] = 0; + _$jscoverage['plugins/table.core.js'][706] = 0; + _$jscoverage['plugins/table.core.js'][713] = 0; + _$jscoverage['plugins/table.core.js'][716] = 0; + _$jscoverage['plugins/table.core.js'][717] = 0; + _$jscoverage['plugins/table.core.js'][719] = 0; + _$jscoverage['plugins/table.core.js'][720] = 0; + _$jscoverage['plugins/table.core.js'][724] = 0; + _$jscoverage['plugins/table.core.js'][725] = 0; + _$jscoverage['plugins/table.core.js'][726] = 0; + _$jscoverage['plugins/table.core.js'][727] = 0; + _$jscoverage['plugins/table.core.js'][728] = 0; + _$jscoverage['plugins/table.core.js'][732] = 0; + _$jscoverage['plugins/table.core.js'][733] = 0; + _$jscoverage['plugins/table.core.js'][734] = 0; + _$jscoverage['plugins/table.core.js'][735] = 0; + _$jscoverage['plugins/table.core.js'][736] = 0; + _$jscoverage['plugins/table.core.js'][737] = 0; + _$jscoverage['plugins/table.core.js'][740] = 0; + _$jscoverage['plugins/table.core.js'][741] = 0; + _$jscoverage['plugins/table.core.js'][743] = 0; + _$jscoverage['plugins/table.core.js'][744] = 0; + _$jscoverage['plugins/table.core.js'][745] = 0; + _$jscoverage['plugins/table.core.js'][748] = 0; + _$jscoverage['plugins/table.core.js'][749] = 0; + _$jscoverage['plugins/table.core.js'][750] = 0; + _$jscoverage['plugins/table.core.js'][753] = 0; + _$jscoverage['plugins/table.core.js'][755] = 0; + _$jscoverage['plugins/table.core.js'][761] = 0; + _$jscoverage['plugins/table.core.js'][766] = 0; + _$jscoverage['plugins/table.core.js'][767] = 0; + _$jscoverage['plugins/table.core.js'][768] = 0; + _$jscoverage['plugins/table.core.js'][769] = 0; + _$jscoverage['plugins/table.core.js'][770] = 0; + _$jscoverage['plugins/table.core.js'][771] = 0; + _$jscoverage['plugins/table.core.js'][774] = 0; + _$jscoverage['plugins/table.core.js'][776] = 0; + _$jscoverage['plugins/table.core.js'][777] = 0; + _$jscoverage['plugins/table.core.js'][779] = 0; + _$jscoverage['plugins/table.core.js'][780] = 0; + _$jscoverage['plugins/table.core.js'][781] = 0; + _$jscoverage['plugins/table.core.js'][783] = 0; + _$jscoverage['plugins/table.core.js'][784] = 0; + _$jscoverage['plugins/table.core.js'][785] = 0; + _$jscoverage['plugins/table.core.js'][790] = 0; + _$jscoverage['plugins/table.core.js'][791] = 0; + _$jscoverage['plugins/table.core.js'][798] = 0; + _$jscoverage['plugins/table.core.js'][802] = 0; + _$jscoverage['plugins/table.core.js'][803] = 0; + _$jscoverage['plugins/table.core.js'][805] = 0; + _$jscoverage['plugins/table.core.js'][806] = 0; + _$jscoverage['plugins/table.core.js'][807] = 0; + _$jscoverage['plugins/table.core.js'][808] = 0; + _$jscoverage['plugins/table.core.js'][809] = 0; + _$jscoverage['plugins/table.core.js'][810] = 0; + _$jscoverage['plugins/table.core.js'][811] = 0; + _$jscoverage['plugins/table.core.js'][815] = 0; + _$jscoverage['plugins/table.core.js'][816] = 0; + _$jscoverage['plugins/table.core.js'][818] = 0; + _$jscoverage['plugins/table.core.js'][820] = 0; + _$jscoverage['plugins/table.core.js'][822] = 0; + _$jscoverage['plugins/table.core.js'][826] = 0; + _$jscoverage['plugins/table.core.js'][828] = 0; + _$jscoverage['plugins/table.core.js'][829] = 0; + _$jscoverage['plugins/table.core.js'][830] = 0; + _$jscoverage['plugins/table.core.js'][833] = 0; + _$jscoverage['plugins/table.core.js'][834] = 0; + _$jscoverage['plugins/table.core.js'][835] = 0; + _$jscoverage['plugins/table.core.js'][836] = 0; + _$jscoverage['plugins/table.core.js'][838] = 0; + _$jscoverage['plugins/table.core.js'][839] = 0; + _$jscoverage['plugins/table.core.js'][840] = 0; + _$jscoverage['plugins/table.core.js'][841] = 0; + _$jscoverage['plugins/table.core.js'][843] = 0; + _$jscoverage['plugins/table.core.js'][846] = 0; + _$jscoverage['plugins/table.core.js'][847] = 0; + _$jscoverage['plugins/table.core.js'][849] = 0; + _$jscoverage['plugins/table.core.js'][852] = 0; + _$jscoverage['plugins/table.core.js'][855] = 0; + _$jscoverage['plugins/table.core.js'][860] = 0; + _$jscoverage['plugins/table.core.js'][861] = 0; + _$jscoverage['plugins/table.core.js'][862] = 0; + _$jscoverage['plugins/table.core.js'][863] = 0; + _$jscoverage['plugins/table.core.js'][864] = 0; + _$jscoverage['plugins/table.core.js'][865] = 0; + _$jscoverage['plugins/table.core.js'][866] = 0; + _$jscoverage['plugins/table.core.js'][867] = 0; + _$jscoverage['plugins/table.core.js'][870] = 0; + _$jscoverage['plugins/table.core.js'][871] = 0; + _$jscoverage['plugins/table.core.js'][872] = 0; + _$jscoverage['plugins/table.core.js'][873] = 0; + _$jscoverage['plugins/table.core.js'][874] = 0; + _$jscoverage['plugins/table.core.js'][879] = 0; + _$jscoverage['plugins/table.core.js'][880] = 0; + _$jscoverage['plugins/table.core.js'][881] = 0; + _$jscoverage['plugins/table.core.js'][882] = 0; + _$jscoverage['plugins/table.core.js'][883] = 0; + _$jscoverage['plugins/table.core.js'][884] = 0; + _$jscoverage['plugins/table.core.js'][885] = 0; + _$jscoverage['plugins/table.core.js'][886] = 0; + _$jscoverage['plugins/table.core.js'][887] = 0; + _$jscoverage['plugins/table.core.js'][888] = 0; + _$jscoverage['plugins/table.core.js'][889] = 0; + _$jscoverage['plugins/table.core.js'][891] = 0; + _$jscoverage['plugins/table.core.js'][893] = 0; + _$jscoverage['plugins/table.core.js'][896] = 0; + _$jscoverage['plugins/table.core.js'][897] = 0; + _$jscoverage['plugins/table.core.js'][898] = 0; + _$jscoverage['plugins/table.core.js'][899] = 0; + _$jscoverage['plugins/table.core.js'][900] = 0; + _$jscoverage['plugins/table.core.js'][902] = 0; + _$jscoverage['plugins/table.core.js'][903] = 0; + _$jscoverage['plugins/table.core.js'][905] = 0; + _$jscoverage['plugins/table.core.js'][906] = 0; + _$jscoverage['plugins/table.core.js'][907] = 0; + _$jscoverage['plugins/table.core.js'][908] = 0; + _$jscoverage['plugins/table.core.js'][910] = 0; + _$jscoverage['plugins/table.core.js'][912] = 0; + _$jscoverage['plugins/table.core.js'][916] = 0; + _$jscoverage['plugins/table.core.js'][917] = 0; + _$jscoverage['plugins/table.core.js'][920] = 0; + _$jscoverage['plugins/table.core.js'][922] = 0; + _$jscoverage['plugins/table.core.js'][923] = 0; + _$jscoverage['plugins/table.core.js'][924] = 0; + _$jscoverage['plugins/table.core.js'][926] = 0; + _$jscoverage['plugins/table.core.js'][927] = 0; + _$jscoverage['plugins/table.core.js'][928] = 0; + _$jscoverage['plugins/table.core.js'][932] = 0; + _$jscoverage['plugins/table.core.js'][938] = 0; + _$jscoverage['plugins/table.core.js'][939] = 0; + _$jscoverage['plugins/table.core.js'][943] = 0; + _$jscoverage['plugins/table.core.js'][944] = 0; + _$jscoverage['plugins/table.core.js'][945] = 0; + _$jscoverage['plugins/table.core.js'][946] = 0; + _$jscoverage['plugins/table.core.js'][948] = 0; + _$jscoverage['plugins/table.core.js'][949] = 0; + _$jscoverage['plugins/table.core.js'][951] = 0; + _$jscoverage['plugins/table.core.js'][953] = 0; + _$jscoverage['plugins/table.core.js'][955] = 0; + _$jscoverage['plugins/table.core.js'][956] = 0; + _$jscoverage['plugins/table.core.js'][959] = 0; + _$jscoverage['plugins/table.core.js'][961] = 0; + _$jscoverage['plugins/table.core.js'][962] = 0; + _$jscoverage['plugins/table.core.js'][966] = 0; + _$jscoverage['plugins/table.core.js'][971] = 0; + _$jscoverage['plugins/table.core.js'][972] = 0; + _$jscoverage['plugins/table.core.js'][974] = 0; + _$jscoverage['plugins/table.core.js'][975] = 0; + _$jscoverage['plugins/table.core.js'][976] = 0; + _$jscoverage['plugins/table.core.js'][978] = 0; + _$jscoverage['plugins/table.core.js'][979] = 0; + _$jscoverage['plugins/table.core.js'][980] = 0; + _$jscoverage['plugins/table.core.js'][981] = 0; + _$jscoverage['plugins/table.core.js'][982] = 0; + _$jscoverage['plugins/table.core.js'][983] = 0; + _$jscoverage['plugins/table.core.js'][985] = 0; + _$jscoverage['plugins/table.core.js'][987] = 0; + _$jscoverage['plugins/table.core.js'][988] = 0; + _$jscoverage['plugins/table.core.js'][991] = 0; + _$jscoverage['plugins/table.core.js'][993] = 0; + _$jscoverage['plugins/table.core.js'][994] = 0; + _$jscoverage['plugins/table.core.js'][996] = 0; + _$jscoverage['plugins/table.core.js'][997] = 0; + _$jscoverage['plugins/table.core.js'][999] = 0; + _$jscoverage['plugins/table.core.js'][1002] = 0; + _$jscoverage['plugins/table.core.js'][1009] = 0; + _$jscoverage['plugins/table.core.js'][1010] = 0; + _$jscoverage['plugins/table.core.js'][1011] = 0; + _$jscoverage['plugins/table.core.js'][1013] = 0; + _$jscoverage['plugins/table.core.js'][1014] = 0; + _$jscoverage['plugins/table.core.js'][1015] = 0; + _$jscoverage['plugins/table.core.js'][1017] = 0; + _$jscoverage['plugins/table.core.js'][1018] = 0; + _$jscoverage['plugins/table.core.js'][1019] = 0; + _$jscoverage['plugins/table.core.js'][1020] = 0; + _$jscoverage['plugins/table.core.js'][1021] = 0; + _$jscoverage['plugins/table.core.js'][1022] = 0; + _$jscoverage['plugins/table.core.js'][1023] = 0; + _$jscoverage['plugins/table.core.js'][1026] = 0; + _$jscoverage['plugins/table.core.js'][1027] = 0; + _$jscoverage['plugins/table.core.js'][1028] = 0; + _$jscoverage['plugins/table.core.js'][1029] = 0; + _$jscoverage['plugins/table.core.js'][1030] = 0; + _$jscoverage['plugins/table.core.js'][1031] = 0; + _$jscoverage['plugins/table.core.js'][1032] = 0; + _$jscoverage['plugins/table.core.js'][1034] = 0; + _$jscoverage['plugins/table.core.js'][1036] = 0; + _$jscoverage['plugins/table.core.js'][1037] = 0; + _$jscoverage['plugins/table.core.js'][1040] = 0; + _$jscoverage['plugins/table.core.js'][1041] = 0; + _$jscoverage['plugins/table.core.js'][1042] = 0; + _$jscoverage['plugins/table.core.js'][1043] = 0; + _$jscoverage['plugins/table.core.js'][1047] = 0; + _$jscoverage['plugins/table.core.js'][1048] = 0; + _$jscoverage['plugins/table.core.js'][1049] = 0; + _$jscoverage['plugins/table.core.js'][1052] = 0; + _$jscoverage['plugins/table.core.js'][1053] = 0; + _$jscoverage['plugins/table.core.js'][1054] = 0; + _$jscoverage['plugins/table.core.js'][1056] = 0; + _$jscoverage['plugins/table.core.js'][1057] = 0; + _$jscoverage['plugins/table.core.js'][1058] = 0; + _$jscoverage['plugins/table.core.js'][1059] = 0; + _$jscoverage['plugins/table.core.js'][1060] = 0; + _$jscoverage['plugins/table.core.js'][1063] = 0; + _$jscoverage['plugins/table.core.js'][1067] = 0; + _$jscoverage['plugins/table.core.js'][1071] = 0; + _$jscoverage['plugins/table.core.js'][1074] = 0; + _$jscoverage['plugins/table.core.js'][1076] = 0; + _$jscoverage['plugins/table.core.js'][1079] = 0; + _$jscoverage['plugins/table.core.js'][1084] = 0; + _$jscoverage['plugins/table.core.js'][1085] = 0; + _$jscoverage['plugins/table.core.js'][1087] = 0; + _$jscoverage['plugins/table.core.js'][1088] = 0; + _$jscoverage['plugins/table.core.js'][1090] = 0; + _$jscoverage['plugins/table.core.js'][1091] = 0; + _$jscoverage['plugins/table.core.js'][1093] = 0; + _$jscoverage['plugins/table.core.js'][1094] = 0; + _$jscoverage['plugins/table.core.js'][1098] = 0; + _$jscoverage['plugins/table.core.js'][1099] = 0; + _$jscoverage['plugins/table.core.js'][1100] = 0; + _$jscoverage['plugins/table.core.js'][1101] = 0; + _$jscoverage['plugins/table.core.js'][1103] = 0; + _$jscoverage['plugins/table.core.js'][1104] = 0; + _$jscoverage['plugins/table.core.js'][1106] = 0; + _$jscoverage['plugins/table.core.js'][1109] = 0; + _$jscoverage['plugins/table.core.js'][1110] = 0; + _$jscoverage['plugins/table.core.js'][1111] = 0; + _$jscoverage['plugins/table.core.js'][1113] = 0; + _$jscoverage['plugins/table.core.js'][1114] = 0; + _$jscoverage['plugins/table.core.js'][1115] = 0; + _$jscoverage['plugins/table.core.js'][1117] = 0; + _$jscoverage['plugins/table.core.js'][1121] = 0; + _$jscoverage['plugins/table.core.js'][1122] = 0; + _$jscoverage['plugins/table.core.js'][1123] = 0; + _$jscoverage['plugins/table.core.js'][1125] = 0; + _$jscoverage['plugins/table.core.js'][1126] = 0; + _$jscoverage['plugins/table.core.js'][1130] = 0; + _$jscoverage['plugins/table.core.js'][1134] = 0; + _$jscoverage['plugins/table.core.js'][1136] = 0; + _$jscoverage['plugins/table.core.js'][1137] = 0; + _$jscoverage['plugins/table.core.js'][1138] = 0; + _$jscoverage['plugins/table.core.js'][1143] = 0; + _$jscoverage['plugins/table.core.js'][1144] = 0; + _$jscoverage['plugins/table.core.js'][1150] = 0; +} +_$jscoverage['plugins/table.core.js'].source = ["/*"," * 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 = start.nextSibling;"," }",""," //在table或者td边缘有可能存在选中tr的情况"," var cell = start && domUtils.findParentByTagName(start, [\"td\", \"th\"], true),"," tr = cell && cell.parentNode,"," caption = start && domUtils.findParentByTagName(start, 'caption', true),"," table = caption ? caption.parentNode : tr && tr.parentNode.parentNode;",""," 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 : \"<br />\");"," },"," 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"," };"," }",""," },"," /*"," * 获取单元格的索引信息"," */"," 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,"," width = parseInt((table.offsetWidth - numCols * 20 - numCols - 1) / numCols, 10);"," //首行直接插入,无需考虑部分单元格被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);"," }"," } 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);"," }"," }"," }"," //框选时插入不触发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);",""," 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);"," }"," 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);"," }"," 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\");"," 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);"," },"," 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];"," }"," }"," //th不参与排序"," flag && trArray.splice(0, 1);"," trArray = utils.sort(trArray,function (tr1, tr2) {"," var txt = function(node){"," return node.innerText||node.textContent;"," };"," return compareFn ? (typeof compareFn === \"number\" ? compareFn : compareFn.call(this, tr1.cells[sortByCellIndex], tr2.cells[sortByCellIndex])) : function () {"," var value1 = txt(tr1.cells[sortByCellIndex]),"," value2 = txt(tr2.cells[sortByCellIndex]);"," return value1.localeCompare(value2);"," }();"," });"," 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])"," }"," },"," 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) {"," }","})();"]; +_$jscoverage['plugins/table.core.js'][13]++; +(function () { + _$jscoverage['plugins/table.core.js'][14]++; + var UETable = (UE.UETable = (function (table) { + _$jscoverage['plugins/table.core.js'][15]++; + this.table = table; + _$jscoverage['plugins/table.core.js'][16]++; + this.indexTable = []; + _$jscoverage['plugins/table.core.js'][17]++; + this.selectedTds = []; + _$jscoverage['plugins/table.core.js'][18]++; + this.cellsRange = {}; + _$jscoverage['plugins/table.core.js'][19]++; + this.update(table); +})); + _$jscoverage['plugins/table.core.js'][23]++; + UETable.removeSelectedClass = (function (cells) { + _$jscoverage['plugins/table.core.js'][24]++; + utils.each(cells, (function (cell) { + _$jscoverage['plugins/table.core.js'][25]++; + domUtils.removeClasses(cell, "selectTdClass"); +})); +}); + _$jscoverage['plugins/table.core.js'][28]++; + UETable.addSelectedClass = (function (cells) { + _$jscoverage['plugins/table.core.js'][29]++; + utils.each(cells, (function (cell) { + _$jscoverage['plugins/table.core.js'][30]++; + domUtils.addClass(cell, "selectTdClass"); +})); +}); + _$jscoverage['plugins/table.core.js'][33]++; + UETable.isEmptyBlock = (function (node) { + _$jscoverage['plugins/table.core.js'][34]++; + var reg = new RegExp(domUtils.fillChar, "g"); + _$jscoverage['plugins/table.core.js'][35]++; + if ((node[(browser.ie? "innerText": "textContent")].replace(/^\s*$/, "").replace(reg, "").length > 0)) { + _$jscoverage['plugins/table.core.js'][36]++; + return 0; + } + _$jscoverage['plugins/table.core.js'][38]++; + for (var i in dtd.$isNotEmpty) { + _$jscoverage['plugins/table.core.js'][38]++; + if (dtd.$isNotEmpty.hasOwnProperty(i)) { + _$jscoverage['plugins/table.core.js'][39]++; + if (node.getElementsByTagName(i).length) { + _$jscoverage['plugins/table.core.js'][40]++; + return 0; + } + } +} + _$jscoverage['plugins/table.core.js'][43]++; + return 1; +}); + _$jscoverage['plugins/table.core.js'][45]++; + UETable.getWidth = (function (cell) { + _$jscoverage['plugins/table.core.js'][46]++; + if ((! cell)) { + _$jscoverage['plugins/table.core.js'][46]++; + return 0; + } + _$jscoverage['plugins/table.core.js'][47]++; + return parseInt(domUtils.getComputedStyle(cell, "width"), 10); +}); + _$jscoverage['plugins/table.core.js'][56]++; + UETable.getTableCellAlignState = (function (cells) { + _$jscoverage['plugins/table.core.js'][58]++; + ((! utils.isArray(cells)) && (cells = [cells])); + _$jscoverage['plugins/table.core.js'][60]++; + var result = {}, status = ["align", "valign"], tempStatus = null, isSame = true; + _$jscoverage['plugins/table.core.js'][65]++; + utils.each(cells, (function (cellNode) { + _$jscoverage['plugins/table.core.js'][67]++; + utils.each(status, (function (currentState) { + _$jscoverage['plugins/table.core.js'][69]++; + tempStatus = cellNode.getAttribute(currentState); + _$jscoverage['plugins/table.core.js'][71]++; + if (((! result[currentState]) && tempStatus)) { + _$jscoverage['plugins/table.core.js'][72]++; + result[currentState] = tempStatus; + } + else { + _$jscoverage['plugins/table.core.js'][73]++; + if (((! result[currentState]) || (tempStatus !== result[currentState]))) { + _$jscoverage['plugins/table.core.js'][74]++; + isSame = false; + _$jscoverage['plugins/table.core.js'][75]++; + return false; + } + } +})); + _$jscoverage['plugins/table.core.js'][80]++; + return isSame; +})); + _$jscoverage['plugins/table.core.js'][84]++; + return (isSame? result: null); +}); + _$jscoverage['plugins/table.core.js'][92]++; + UETable.getTableItemsByRange = (function (editor) { + _$jscoverage['plugins/table.core.js'][93]++; + var start = editor.selection.getStart(); + _$jscoverage['plugins/table.core.js'][96]++; + if ((start && start.id && (start.id.indexOf("_baidu_bookmark_start_") === 0))) { + _$jscoverage['plugins/table.core.js'][97]++; + start = start.nextSibling; + } + _$jscoverage['plugins/table.core.js'][101]++; + var cell = (start && domUtils.findParentByTagName(start, ["td", "th"], true)), tr = (cell && cell.parentNode), caption = (start && domUtils.findParentByTagName(start, "caption", true)), table = (caption? caption.parentNode: (tr && tr.parentNode.parentNode)); + _$jscoverage['plugins/table.core.js'][106]++; + return ({cell: cell, tr: tr, table: table, caption: caption}); +}); + _$jscoverage['plugins/table.core.js'][113]++; + UETable.getUETableBySelected = (function (editor) { + _$jscoverage['plugins/table.core.js'][114]++; + var table = UETable.getTableItemsByRange(editor).table; + _$jscoverage['plugins/table.core.js'][115]++; + if ((table && table.ueTable && table.ueTable.selectedTds.length)) { + _$jscoverage['plugins/table.core.js'][116]++; + return table.ueTable; + } + _$jscoverage['plugins/table.core.js'][118]++; + return null; +}); + _$jscoverage['plugins/table.core.js'][121]++; + UETable.getDefaultValue = (function (editor, table) { + _$jscoverage['plugins/table.core.js'][122]++; + var borderMap = {thin: "0px", medium: "1px", thick: "2px"}, tableBorder, tdPadding, tdBorder, tmpValue; + _$jscoverage['plugins/table.core.js'][128]++; + if ((! table)) { + _$jscoverage['plugins/table.core.js'][129]++; + table = editor.document.createElement("table"); + _$jscoverage['plugins/table.core.js'][130]++; + table.insertRow(0).insertCell(0).innerHTML = "xxx"; + _$jscoverage['plugins/table.core.js'][131]++; + editor.body.appendChild(table); + _$jscoverage['plugins/table.core.js'][132]++; + var td = table.getElementsByTagName("td")[0]; + _$jscoverage['plugins/table.core.js'][133]++; + tmpValue = domUtils.getComputedStyle(table, "border-left-width"); + _$jscoverage['plugins/table.core.js'][134]++; + tableBorder = parseInt((borderMap[tmpValue] || tmpValue), 10); + _$jscoverage['plugins/table.core.js'][135]++; + tmpValue = domUtils.getComputedStyle(td, "padding-left"); + _$jscoverage['plugins/table.core.js'][136]++; + tdPadding = parseInt((borderMap[tmpValue] || tmpValue), 10); + _$jscoverage['plugins/table.core.js'][137]++; + tmpValue = domUtils.getComputedStyle(td, "border-left-width"); + _$jscoverage['plugins/table.core.js'][138]++; + tdBorder = parseInt((borderMap[tmpValue] || tmpValue), 10); + _$jscoverage['plugins/table.core.js'][139]++; + domUtils.remove(table); + _$jscoverage['plugins/table.core.js'][140]++; + return ({tableBorder: tableBorder, tdPadding: tdPadding, tdBorder: tdBorder}); + } + else { + _$jscoverage['plugins/table.core.js'][146]++; + td = table.getElementsByTagName("td")[0]; + _$jscoverage['plugins/table.core.js'][147]++; + tmpValue = domUtils.getComputedStyle(table, "border-left-width"); + _$jscoverage['plugins/table.core.js'][148]++; + tableBorder = parseInt((borderMap[tmpValue] || tmpValue), 10); + _$jscoverage['plugins/table.core.js'][149]++; + tmpValue = domUtils.getComputedStyle(td, "padding-left"); + _$jscoverage['plugins/table.core.js'][150]++; + tdPadding = parseInt((borderMap[tmpValue] || tmpValue), 10); + _$jscoverage['plugins/table.core.js'][151]++; + tmpValue = domUtils.getComputedStyle(td, "border-left-width"); + _$jscoverage['plugins/table.core.js'][152]++; + tdBorder = parseInt((borderMap[tmpValue] || tmpValue), 10); + _$jscoverage['plugins/table.core.js'][153]++; + return ({tableBorder: tableBorder, tdPadding: tdPadding, tdBorder: tdBorder}); + } +}); + _$jscoverage['plugins/table.core.js'][164]++; + UETable.getUETable = (function (tdOrTable) { + _$jscoverage['plugins/table.core.js'][165]++; + var tag = tdOrTable.tagName.toLowerCase(); + _$jscoverage['plugins/table.core.js'][166]++; + tdOrTable = (((tag == "td") || (tag == "th") || (tag == "caption"))? domUtils.findParentByTagName(tdOrTable, "table", true): tdOrTable); + _$jscoverage['plugins/table.core.js'][167]++; + if ((! tdOrTable.ueTable)) { + _$jscoverage['plugins/table.core.js'][168]++; + tdOrTable.ueTable = new UETable(tdOrTable); + } + _$jscoverage['plugins/table.core.js'][170]++; + return tdOrTable.ueTable; +}); + _$jscoverage['plugins/table.core.js'][173]++; + UETable.cloneCell = (function (cell, ignoreMerge, keepPro) { + _$jscoverage['plugins/table.core.js'][174]++; + if (((! cell) || utils.isString(cell))) { + _$jscoverage['plugins/table.core.js'][175]++; + return this.table.ownerDocument.createElement((cell || "td")); + } + _$jscoverage['plugins/table.core.js'][177]++; + var flag = domUtils.hasClass(cell, "selectTdClass"); + _$jscoverage['plugins/table.core.js'][178]++; + (flag && domUtils.removeClasses(cell, "selectTdClass")); + _$jscoverage['plugins/table.core.js'][179]++; + var tmpCell = cell.cloneNode(true); + _$jscoverage['plugins/table.core.js'][180]++; + if (ignoreMerge) { + _$jscoverage['plugins/table.core.js'][181]++; + tmpCell.rowSpan = (tmpCell.colSpan = 1); + } + _$jscoverage['plugins/table.core.js'][184]++; + ((! keepPro) && domUtils.removeAttributes(tmpCell, "width height")); + _$jscoverage['plugins/table.core.js'][185]++; + ((! keepPro) && domUtils.removeAttributes(tmpCell, "style")); + _$jscoverage['plugins/table.core.js'][187]++; + tmpCell.style.borderLeftStyle = ""; + _$jscoverage['plugins/table.core.js'][188]++; + tmpCell.style.borderTopStyle = ""; + _$jscoverage['plugins/table.core.js'][189]++; + tmpCell.style.borderLeftColor = cell.style.borderRightColor; + _$jscoverage['plugins/table.core.js'][190]++; + tmpCell.style.borderLeftWidth = cell.style.borderRightWidth; + _$jscoverage['plugins/table.core.js'][191]++; + tmpCell.style.borderTopColor = cell.style.borderBottomColor; + _$jscoverage['plugins/table.core.js'][192]++; + tmpCell.style.borderTopWidth = cell.style.borderBottomWidth; + _$jscoverage['plugins/table.core.js'][193]++; + (flag && domUtils.addClass(cell, "selectTdClass")); + _$jscoverage['plugins/table.core.js'][194]++; + return tmpCell; +}); + _$jscoverage['plugins/table.core.js'][197]++; + UETable.prototype = {getMaxRows: (function () { + _$jscoverage['plugins/table.core.js'][199]++; + var rows = this.table.rows, maxLen = 1; + _$jscoverage['plugins/table.core.js'][200]++; + for (var i = 0, row; (row = rows[i]); (i++)) { + _$jscoverage['plugins/table.core.js'][201]++; + var currentMax = 1; + _$jscoverage['plugins/table.core.js'][202]++; + for (var j = 0, cj; (cj = row.cells[(j++)]);) { + _$jscoverage['plugins/table.core.js'][203]++; + currentMax = Math.max((cj.rowSpan || 1), currentMax); +} + _$jscoverage['plugins/table.core.js'][205]++; + maxLen = Math.max((currentMax + i), maxLen); +} + _$jscoverage['plugins/table.core.js'][207]++; + return maxLen; +}), getMaxCols: (function () { + _$jscoverage['plugins/table.core.js'][213]++; + var rows = this.table.rows, maxLen = 0, cellRows = {}; + _$jscoverage['plugins/table.core.js'][214]++; + for (var i = 0, row; (row = rows[i]); (i++)) { + _$jscoverage['plugins/table.core.js'][215]++; + var cellsNum = 0; + _$jscoverage['plugins/table.core.js'][216]++; + for (var j = 0, cj; (cj = row.cells[(j++)]);) { + _$jscoverage['plugins/table.core.js'][217]++; + cellsNum += (cj.colSpan || 1); + _$jscoverage['plugins/table.core.js'][218]++; + if ((cj.rowSpan && (cj.rowSpan > 1))) { + _$jscoverage['plugins/table.core.js'][219]++; + for (var k = 1; (k < cj.rowSpan); (k++)) { + _$jscoverage['plugins/table.core.js'][220]++; + if ((! cellRows[("row_" + (i + k))])) { + _$jscoverage['plugins/table.core.js'][221]++; + cellRows[("row_" + (i + k))] = (cj.colSpan || 1); + } + else { + _$jscoverage['plugins/table.core.js'][223]++; + (cellRows[("row_" + (i + k))]++); + } +} + } +} + _$jscoverage['plugins/table.core.js'][229]++; + cellsNum += (cellRows[("row_" + i)] || 0); + _$jscoverage['plugins/table.core.js'][230]++; + maxLen = Math.max(cellsNum, maxLen); +} + _$jscoverage['plugins/table.core.js'][232]++; + return maxLen; +}), getCellColIndex: (function (cell) { +}), getHSideCell: (function (cell, right) { + _$jscoverage['plugins/table.core.js'][243]++; + try { + _$jscoverage['plugins/table.core.js'][244]++; + var cellInfo = this.getCellInfo(cell), previewRowIndex, previewColIndex; + _$jscoverage['plugins/table.core.js'][246]++; + var len = this.selectedTds.length, range = this.cellsRange; + _$jscoverage['plugins/table.core.js'][249]++; + if ((((! right) && ((! len)? (! cellInfo.colIndex): (! range.beginColIndex))) || (right && ((! len)? (cellInfo.colIndex == (this.colsNum - 1)): (range.endColIndex == (this.colsNum - 1)))))) { + _$jscoverage['plugins/table.core.js'][249]++; + return null; + } + _$jscoverage['plugins/table.core.js'][251]++; + previewRowIndex = ((! len)? cellInfo.rowIndex: range.beginRowIndex); + _$jscoverage['plugins/table.core.js'][252]++; + previewColIndex = ((! right)? ((! len)? ((cellInfo.colIndex < 1)? 0: (cellInfo.colIndex - 1)): (range.beginColIndex - 1)): ((! len)? (cellInfo.colIndex + 1): (range.endColIndex + 1))); + _$jscoverage['plugins/table.core.js'][254]++; + return this.getCell(this.indexTable[previewRowIndex][previewColIndex].rowIndex, this.indexTable[previewRowIndex][previewColIndex].cellIndex); + } + catch (e) { + _$jscoverage['plugins/table.core.js'][256]++; + showError(e); + } +}), getTabNextCell: (function (cell, preRowIndex) { + _$jscoverage['plugins/table.core.js'][260]++; + var cellInfo = this.getCellInfo(cell), rowIndex = (preRowIndex || cellInfo.rowIndex), colIndex = (cellInfo.colIndex + 1 + (cellInfo.colSpan - 1)), nextCell; + _$jscoverage['plugins/table.core.js'][264]++; + try { + _$jscoverage['plugins/table.core.js'][265]++; + nextCell = this.getCell(this.indexTable[rowIndex][colIndex].rowIndex, this.indexTable[rowIndex][colIndex].cellIndex); + } + catch (e) { + _$jscoverage['plugins/table.core.js'][267]++; + try { + _$jscoverage['plugins/table.core.js'][268]++; + rowIndex = ((rowIndex * 1) + 1); + _$jscoverage['plugins/table.core.js'][269]++; + colIndex = 0; + _$jscoverage['plugins/table.core.js'][270]++; + nextCell = this.getCell(this.indexTable[rowIndex][colIndex].rowIndex, this.indexTable[rowIndex][colIndex].cellIndex); + } + catch (e) { + } + } + _$jscoverage['plugins/table.core.js'][274]++; + return nextCell; +}), getVSideCell: (function (cell, bottom, ignoreRange) { + _$jscoverage['plugins/table.core.js'][283]++; + try { + _$jscoverage['plugins/table.core.js'][284]++; + var cellInfo = this.getCellInfo(cell), nextRowIndex, nextColIndex; + _$jscoverage['plugins/table.core.js'][286]++; + var len = (this.selectedTds.length && (! ignoreRange)), range = this.cellsRange; + _$jscoverage['plugins/table.core.js'][289]++; + if ((((! bottom) && (cellInfo.rowIndex == 0)) || (bottom && ((! len)? ((cellInfo.rowIndex + cellInfo.rowSpan) > (this.rowsNum - 1)): (range.endRowIndex == (this.rowsNum - 1)))))) { + _$jscoverage['plugins/table.core.js'][289]++; + return null; + } + _$jscoverage['plugins/table.core.js'][291]++; + nextRowIndex = ((! bottom)? ((! len)? (cellInfo.rowIndex - 1): (range.beginRowIndex - 1)): ((! len)? (cellInfo.rowIndex + cellInfo.rowSpan): (range.endRowIndex + 1))); + _$jscoverage['plugins/table.core.js'][293]++; + nextColIndex = ((! len)? cellInfo.colIndex: range.beginColIndex); + _$jscoverage['plugins/table.core.js'][294]++; + return this.getCell(this.indexTable[nextRowIndex][nextColIndex].rowIndex, this.indexTable[nextRowIndex][nextColIndex].cellIndex); + } + catch (e) { + _$jscoverage['plugins/table.core.js'][296]++; + showError(e); + } +}), getSameEndPosCells: (function (cell, xOrY) { + _$jscoverage['plugins/table.core.js'][303]++; + try { + _$jscoverage['plugins/table.core.js'][304]++; + var flag = (xOrY.toLowerCase() === "x"), end = (domUtils.getXY(cell)[(flag? "x": "y")] + cell[("offset" + (flag? "Width": "Height"))]), rows = this.table.rows, cells = null, returns = []; + _$jscoverage['plugins/table.core.js'][308]++; + for (var i = 0; (i < this.rowsNum); (i++)) { + _$jscoverage['plugins/table.core.js'][309]++; + cells = rows[i].cells; + _$jscoverage['plugins/table.core.js'][310]++; + for (var j = 0, tmpCell; (tmpCell = cells[(j++)]);) { + _$jscoverage['plugins/table.core.js'][311]++; + var tmpEnd = (domUtils.getXY(tmpCell)[(flag? "x": "y")] + tmpCell[("offset" + (flag? "Width": "Height"))]); + _$jscoverage['plugins/table.core.js'][313]++; + if (((tmpEnd > end) && flag)) { + _$jscoverage['plugins/table.core.js'][313]++; + break; + } + _$jscoverage['plugins/table.core.js'][314]++; + if (((cell == tmpCell) || (end == tmpEnd))) { + _$jscoverage['plugins/table.core.js'][317]++; + if ((tmpCell[(flag? "colSpan": "rowSpan")] == 1)) { + _$jscoverage['plugins/table.core.js'][318]++; + returns.push(tmpCell); + } + _$jscoverage['plugins/table.core.js'][320]++; + if (flag) { + _$jscoverage['plugins/table.core.js'][320]++; + break; + } + } +} +} + _$jscoverage['plugins/table.core.js'][324]++; + return returns; + } + catch (e) { + _$jscoverage['plugins/table.core.js'][326]++; + showError(e); + } +}), setCellContent: (function (cell, content) { + _$jscoverage['plugins/table.core.js'][330]++; + cell.innerHTML = (content || (browser.ie? domUtils.fillChar: "
    ")); +}), cloneCell: UETable.cloneCell, getSameStartPosXCells: (function (cell) { + _$jscoverage['plugins/table.core.js'][337]++; + try { + _$jscoverage['plugins/table.core.js'][338]++; + var start = (domUtils.getXY(cell).x + cell.offsetWidth), rows = this.table.rows, cells, returns = []; + _$jscoverage['plugins/table.core.js'][340]++; + for (var i = 0; (i < this.rowsNum); (i++)) { + _$jscoverage['plugins/table.core.js'][341]++; + cells = rows[i].cells; + _$jscoverage['plugins/table.core.js'][342]++; + for (var j = 0, tmpCell; (tmpCell = cells[(j++)]);) { + _$jscoverage['plugins/table.core.js'][343]++; + var tmpStart = domUtils.getXY(tmpCell).x; + _$jscoverage['plugins/table.core.js'][344]++; + if ((tmpStart > start)) { + _$jscoverage['plugins/table.core.js'][344]++; + break; + } + _$jscoverage['plugins/table.core.js'][345]++; + if (((tmpStart == start) && (tmpCell.colSpan == 1))) { + _$jscoverage['plugins/table.core.js'][346]++; + returns.push(tmpCell); + _$jscoverage['plugins/table.core.js'][347]++; + break; + } +} +} + _$jscoverage['plugins/table.core.js'][351]++; + return returns; + } + catch (e) { + _$jscoverage['plugins/table.core.js'][353]++; + showError(e); + } +}), update: (function (table) { + _$jscoverage['plugins/table.core.js'][360]++; + this.table = (table || this.table); + _$jscoverage['plugins/table.core.js'][361]++; + this.selectedTds = []; + _$jscoverage['plugins/table.core.js'][362]++; + this.cellsRange = {}; + _$jscoverage['plugins/table.core.js'][363]++; + this.indexTable = []; + _$jscoverage['plugins/table.core.js'][364]++; + var rows = this.table.rows, rowsNum = this.getMaxRows(), dNum = (rowsNum - rows.length), colsNum = this.getMaxCols(); + _$jscoverage['plugins/table.core.js'][368]++; + while ((dNum--)) { + _$jscoverage['plugins/table.core.js'][369]++; + this.table.insertRow(rows.length); +} + _$jscoverage['plugins/table.core.js'][371]++; + this.rowsNum = rowsNum; + _$jscoverage['plugins/table.core.js'][372]++; + this.colsNum = colsNum; + _$jscoverage['plugins/table.core.js'][373]++; + for (var i = 0, len = rows.length; (i < len); (i++)) { + _$jscoverage['plugins/table.core.js'][374]++; + this.indexTable[i] = new Array(colsNum); +} + _$jscoverage['plugins/table.core.js'][377]++; + for (var rowIndex = 0, row; (row = rows[rowIndex]); (rowIndex++)) { + _$jscoverage['plugins/table.core.js'][378]++; + for (var cellIndex = 0, cell, cells = row.cells; (cell = cells[cellIndex]); (cellIndex++)) { + _$jscoverage['plugins/table.core.js'][380]++; + if ((cell.rowSpan > rowsNum)) { + _$jscoverage['plugins/table.core.js'][381]++; + cell.rowSpan = rowsNum; + } + _$jscoverage['plugins/table.core.js'][383]++; + var colIndex = cellIndex, rowSpan = (cell.rowSpan || 1), colSpan = (cell.colSpan || 1); + _$jscoverage['plugins/table.core.js'][387]++; + while (this.indexTable[rowIndex][colIndex]) { + _$jscoverage['plugins/table.core.js'][387]++; + (colIndex++); +} + _$jscoverage['plugins/table.core.js'][388]++; + for (var j = 0; (j < rowSpan); (j++)) { + _$jscoverage['plugins/table.core.js'][389]++; + for (var k = 0; (k < colSpan); (k++)) { + _$jscoverage['plugins/table.core.js'][390]++; + this.indexTable[(rowIndex + j)][(colIndex + k)] = {rowIndex: rowIndex, cellIndex: cellIndex, colIndex: colIndex, rowSpan: rowSpan, colSpan: colSpan}; +} +} +} +} + _$jscoverage['plugins/table.core.js'][402]++; + for (j = 0; (j < rowsNum); (j++)) { + _$jscoverage['plugins/table.core.js'][403]++; + for (k = 0; (k < colsNum); (k++)) { + _$jscoverage['plugins/table.core.js'][404]++; + if ((this.indexTable[j][k] === undefined)) { + _$jscoverage['plugins/table.core.js'][405]++; + row = rows[j]; + _$jscoverage['plugins/table.core.js'][406]++; + cell = row.cells[(row.cells.length - 1)]; + _$jscoverage['plugins/table.core.js'][407]++; + cell = (cell? cell.cloneNode(true): this.table.ownerDocument.createElement("td")); + _$jscoverage['plugins/table.core.js'][408]++; + this.setCellContent(cell); + _$jscoverage['plugins/table.core.js'][409]++; + if ((cell.colSpan !== 1)) { + _$jscoverage['plugins/table.core.js'][409]++; + cell.colSpan = 1; + } + _$jscoverage['plugins/table.core.js'][410]++; + if ((cell.rowSpan !== 1)) { + _$jscoverage['plugins/table.core.js'][410]++; + cell.rowSpan = 1; + } + _$jscoverage['plugins/table.core.js'][411]++; + row.appendChild(cell); + _$jscoverage['plugins/table.core.js'][412]++; + this.indexTable[j][k] = {rowIndex: j, cellIndex: cell.cellIndex, colIndex: k, rowSpan: 1, colSpan: 1}; + } +} +} + _$jscoverage['plugins/table.core.js'][423]++; + var tds = domUtils.getElementsByTagName(this.table, "td"), selectTds = []; + _$jscoverage['plugins/table.core.js'][425]++; + utils.each(tds, (function (td) { + _$jscoverage['plugins/table.core.js'][426]++; + if (domUtils.hasClass(td, "selectTdClass")) { + _$jscoverage['plugins/table.core.js'][427]++; + selectTds.push(td); + } +})); + _$jscoverage['plugins/table.core.js'][430]++; + if (selectTds.length) { + _$jscoverage['plugins/table.core.js'][431]++; + var start = selectTds[0], end = selectTds[(selectTds.length - 1)], startInfo = this.getCellInfo(start), endInfo = this.getCellInfo(end); + _$jscoverage['plugins/table.core.js'][435]++; + this.selectedTds = selectTds; + _$jscoverage['plugins/table.core.js'][436]++; + this.cellsRange = {beginRowIndex: startInfo.rowIndex, beginColIndex: startInfo.colIndex, endRowIndex: ((endInfo.rowIndex + endInfo.rowSpan) - 1), endColIndex: ((endInfo.colIndex + endInfo.colSpan) - 1)}; + } +}), getCellInfo: (function (cell) { + _$jscoverage['plugins/table.core.js'][449]++; + if ((! cell)) { + _$jscoverage['plugins/table.core.js'][449]++; + return; + } + _$jscoverage['plugins/table.core.js'][450]++; + var cellIndex = cell.cellIndex, rowIndex = cell.parentNode.rowIndex, rowInfo = this.indexTable[rowIndex], numCols = this.colsNum; + _$jscoverage['plugins/table.core.js'][454]++; + for (var colIndex = cellIndex; (colIndex < numCols); (colIndex++)) { + _$jscoverage['plugins/table.core.js'][455]++; + var cellInfo = rowInfo[colIndex]; + _$jscoverage['plugins/table.core.js'][456]++; + if (((cellInfo.rowIndex === rowIndex) && (cellInfo.cellIndex === cellIndex))) { + _$jscoverage['plugins/table.core.js'][457]++; + return cellInfo; + } +} +}), getCell: (function (rowIndex, cellIndex) { + _$jscoverage['plugins/table.core.js'][465]++; + return (((rowIndex < this.rowsNum) && this.table.rows[rowIndex].cells[cellIndex]) || null); +}), deleteCell: (function (cell, rowIndex) { + _$jscoverage['plugins/table.core.js'][471]++; + rowIndex = (((typeof rowIndex) == "number")? rowIndex: cell.parentNode.rowIndex); + _$jscoverage['plugins/table.core.js'][472]++; + var row = this.table.rows[rowIndex]; + _$jscoverage['plugins/table.core.js'][473]++; + row.deleteCell(cell.cellIndex); +}), getCellsRange: (function (cellA, cellB) { + _$jscoverage['plugins/table.core.js'][479]++; + function checkRange(beginRowIndex, beginColIndex, endRowIndex, endColIndex) { + _$jscoverage['plugins/table.core.js'][480]++; + var tmpBeginRowIndex = beginRowIndex, tmpBeginColIndex = beginColIndex, tmpEndRowIndex = endRowIndex, tmpEndColIndex = endColIndex, cellInfo, colIndex, rowIndex; + _$jscoverage['plugins/table.core.js'][486]++; + if ((beginRowIndex > 0)) { + _$jscoverage['plugins/table.core.js'][487]++; + for (colIndex = beginColIndex; (colIndex < endColIndex); (colIndex++)) { + _$jscoverage['plugins/table.core.js'][488]++; + cellInfo = me.indexTable[beginRowIndex][colIndex]; + _$jscoverage['plugins/table.core.js'][489]++; + rowIndex = cellInfo.rowIndex; + _$jscoverage['plugins/table.core.js'][490]++; + if ((rowIndex < beginRowIndex)) { + _$jscoverage['plugins/table.core.js'][491]++; + tmpBeginRowIndex = Math.min(rowIndex, tmpBeginRowIndex); + } +} + } + _$jscoverage['plugins/table.core.js'][496]++; + if ((endColIndex < me.colsNum)) { + _$jscoverage['plugins/table.core.js'][497]++; + for (rowIndex = beginRowIndex; (rowIndex < endRowIndex); (rowIndex++)) { + _$jscoverage['plugins/table.core.js'][498]++; + cellInfo = me.indexTable[rowIndex][endColIndex]; + _$jscoverage['plugins/table.core.js'][499]++; + colIndex = ((cellInfo.colIndex + cellInfo.colSpan) - 1); + _$jscoverage['plugins/table.core.js'][500]++; + if ((colIndex > endColIndex)) { + _$jscoverage['plugins/table.core.js'][501]++; + tmpEndColIndex = Math.max(colIndex, tmpEndColIndex); + } +} + } + _$jscoverage['plugins/table.core.js'][506]++; + if ((endRowIndex < me.rowsNum)) { + _$jscoverage['plugins/table.core.js'][507]++; + for (colIndex = beginColIndex; (colIndex < endColIndex); (colIndex++)) { + _$jscoverage['plugins/table.core.js'][508]++; + cellInfo = me.indexTable[endRowIndex][colIndex]; + _$jscoverage['plugins/table.core.js'][509]++; + rowIndex = ((cellInfo.rowIndex + cellInfo.rowSpan) - 1); + _$jscoverage['plugins/table.core.js'][510]++; + if ((rowIndex > endRowIndex)) { + _$jscoverage['plugins/table.core.js'][511]++; + tmpEndRowIndex = Math.max(rowIndex, tmpEndRowIndex); + } +} + } + _$jscoverage['plugins/table.core.js'][516]++; + if ((beginColIndex > 0)) { + _$jscoverage['plugins/table.core.js'][517]++; + for (rowIndex = beginRowIndex; (rowIndex < endRowIndex); (rowIndex++)) { + _$jscoverage['plugins/table.core.js'][518]++; + cellInfo = me.indexTable[rowIndex][beginColIndex]; + _$jscoverage['plugins/table.core.js'][519]++; + colIndex = cellInfo.colIndex; + _$jscoverage['plugins/table.core.js'][520]++; + if ((colIndex < beginColIndex)) { + _$jscoverage['plugins/table.core.js'][521]++; + tmpBeginColIndex = Math.min(cellInfo.colIndex, tmpBeginColIndex); + } +} + } + _$jscoverage['plugins/table.core.js'][526]++; + if (((tmpBeginRowIndex != beginRowIndex) || (tmpBeginColIndex != beginColIndex) || (tmpEndRowIndex != endRowIndex) || (tmpEndColIndex != endColIndex))) { + _$jscoverage['plugins/table.core.js'][527]++; + return checkRange(tmpBeginRowIndex, tmpBeginColIndex, tmpEndRowIndex, tmpEndColIndex); + } + else { + _$jscoverage['plugins/table.core.js'][530]++; + return ({beginRowIndex: beginRowIndex, beginColIndex: beginColIndex, endRowIndex: endRowIndex, endColIndex: endColIndex}); + } +} + _$jscoverage['plugins/table.core.js'][539]++; + try { + _$jscoverage['plugins/table.core.js'][540]++; + var me = this, cellAInfo = me.getCellInfo(cellA); + _$jscoverage['plugins/table.core.js'][542]++; + if ((cellA === cellB)) { + _$jscoverage['plugins/table.core.js'][543]++; + return ({beginRowIndex: cellAInfo.rowIndex, beginColIndex: cellAInfo.colIndex, endRowIndex: ((cellAInfo.rowIndex + cellAInfo.rowSpan) - 1), endColIndex: ((cellAInfo.colIndex + cellAInfo.colSpan) - 1)}); + } + _$jscoverage['plugins/table.core.js'][550]++; + var cellBInfo = me.getCellInfo(cellB); + _$jscoverage['plugins/table.core.js'][552]++; + 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)); + _$jscoverage['plugins/table.core.js'][557]++; + return checkRange(beginRowIndex, beginColIndex, endRowIndex, endColIndex); + } + catch (e) { + } +}), getCells: (function (range) { + _$jscoverage['plugins/table.core.js'][567]++; + this.clearSelected(); + _$jscoverage['plugins/table.core.js'][568]++; + var beginRowIndex = range.beginRowIndex, beginColIndex = range.beginColIndex, endRowIndex = range.endRowIndex, endColIndex = range.endColIndex, cellInfo, rowIndex, colIndex, tdHash = {}, returnTds = []; + _$jscoverage['plugins/table.core.js'][573]++; + for (var i = beginRowIndex; (i <= endRowIndex); (i++)) { + _$jscoverage['plugins/table.core.js'][574]++; + for (var j = beginColIndex; (j <= endColIndex); (j++)) { + _$jscoverage['plugins/table.core.js'][575]++; + cellInfo = this.indexTable[i][j]; + _$jscoverage['plugins/table.core.js'][576]++; + rowIndex = cellInfo.rowIndex; + _$jscoverage['plugins/table.core.js'][577]++; + colIndex = cellInfo.colIndex; + _$jscoverage['plugins/table.core.js'][579]++; + var key = (rowIndex + "|" + colIndex); + _$jscoverage['plugins/table.core.js'][580]++; + if (tdHash[key]) { + _$jscoverage['plugins/table.core.js'][580]++; + continue; + } + _$jscoverage['plugins/table.core.js'][581]++; + tdHash[key] = 1; + _$jscoverage['plugins/table.core.js'][582]++; + if (((rowIndex < i) || (colIndex < j) || (((rowIndex + cellInfo.rowSpan) - 1) > endRowIndex) || (((colIndex + cellInfo.colSpan) - 1) > endColIndex))) { + _$jscoverage['plugins/table.core.js'][583]++; + return null; + } + _$jscoverage['plugins/table.core.js'][585]++; + returnTds.push(this.getCell(rowIndex, cellInfo.cellIndex)); +} +} + _$jscoverage['plugins/table.core.js'][588]++; + return returnTds; +}), clearSelected: (function () { + _$jscoverage['plugins/table.core.js'][594]++; + UETable.removeSelectedClass(this.selectedTds); + _$jscoverage['plugins/table.core.js'][595]++; + this.selectedTds = []; + _$jscoverage['plugins/table.core.js'][596]++; + this.cellsRange = {}; +}), setSelected: (function (range) { + _$jscoverage['plugins/table.core.js'][602]++; + var cells = this.getCells(range); + _$jscoverage['plugins/table.core.js'][603]++; + UETable.addSelectedClass(cells); + _$jscoverage['plugins/table.core.js'][604]++; + this.selectedTds = cells; + _$jscoverage['plugins/table.core.js'][605]++; + this.cellsRange = range; +}), isFullRow: (function () { + _$jscoverage['plugins/table.core.js'][608]++; + var range = this.cellsRange; + _$jscoverage['plugins/table.core.js'][609]++; + return (((range.endColIndex - range.beginColIndex) + 1) == this.colsNum); +}), isFullCol: (function () { + _$jscoverage['plugins/table.core.js'][612]++; + var range = this.cellsRange, table = this.table, ths = table.getElementsByTagName("th"), rows = ((range.endRowIndex - range.beginRowIndex) + 1); + _$jscoverage['plugins/table.core.js'][616]++; + return ((! ths.length)? (rows == this.rowsNum): ((rows == this.rowsNum) || (rows == (this.rowsNum - 1)))); +}), getNextCell: (function (cell, bottom, ignoreRange) { + _$jscoverage['plugins/table.core.js'][625]++; + try { + _$jscoverage['plugins/table.core.js'][626]++; + var cellInfo = this.getCellInfo(cell), nextRowIndex, nextColIndex; + _$jscoverage['plugins/table.core.js'][628]++; + var len = (this.selectedTds.length && (! ignoreRange)), range = this.cellsRange; + _$jscoverage['plugins/table.core.js'][631]++; + if ((((! bottom) && (cellInfo.rowIndex == 0)) || (bottom && ((! len)? ((cellInfo.rowIndex + cellInfo.rowSpan) > (this.rowsNum - 1)): (range.endRowIndex == (this.rowsNum - 1)))))) { + _$jscoverage['plugins/table.core.js'][631]++; + return null; + } + _$jscoverage['plugins/table.core.js'][633]++; + nextRowIndex = ((! bottom)? ((! len)? (cellInfo.rowIndex - 1): (range.beginRowIndex - 1)): ((! len)? (cellInfo.rowIndex + cellInfo.rowSpan): (range.endRowIndex + 1))); + _$jscoverage['plugins/table.core.js'][635]++; + nextColIndex = ((! len)? cellInfo.colIndex: range.beginColIndex); + _$jscoverage['plugins/table.core.js'][636]++; + return this.getCell(this.indexTable[nextRowIndex][nextColIndex].rowIndex, this.indexTable[nextRowIndex][nextColIndex].cellIndex); + } + catch (e) { + _$jscoverage['plugins/table.core.js'][638]++; + showError(e); + } +}), getPreviewCell: (function (cell, top) { + _$jscoverage['plugins/table.core.js'][642]++; + try { + _$jscoverage['plugins/table.core.js'][643]++; + var cellInfo = this.getCellInfo(cell), previewRowIndex, previewColIndex; + _$jscoverage['plugins/table.core.js'][645]++; + var len = this.selectedTds.length, range = this.cellsRange; + _$jscoverage['plugins/table.core.js'][648]++; + if ((((! top) && ((! len)? (! cellInfo.colIndex): (! range.beginColIndex))) || (top && ((! len)? (cellInfo.rowIndex > (this.colsNum - 1)): (range.endColIndex == (this.colsNum - 1)))))) { + _$jscoverage['plugins/table.core.js'][648]++; + return null; + } + _$jscoverage['plugins/table.core.js'][650]++; + previewRowIndex = ((! top)? ((! len)? cellInfo.rowIndex: range.beginRowIndex): ((! len)? ((cellInfo.rowIndex < 1)? 0: (cellInfo.rowIndex - 1)): range.beginRowIndex)); + _$jscoverage['plugins/table.core.js'][652]++; + previewColIndex = ((! top)? ((! len)? ((cellInfo.colIndex < 1)? 0: (cellInfo.colIndex - 1)): (range.beginColIndex - 1)): ((! len)? cellInfo.colIndex: (range.endColIndex + 1))); + _$jscoverage['plugins/table.core.js'][654]++; + return this.getCell(this.indexTable[previewRowIndex][previewColIndex].rowIndex, this.indexTable[previewRowIndex][previewColIndex].cellIndex); + } + catch (e) { + _$jscoverage['plugins/table.core.js'][656]++; + showError(e); + } +}), moveContent: (function (cellTo, cellFrom) { + _$jscoverage['plugins/table.core.js'][663]++; + if (UETable.isEmptyBlock(cellFrom)) { + _$jscoverage['plugins/table.core.js'][663]++; + return; + } + _$jscoverage['plugins/table.core.js'][664]++; + if (UETable.isEmptyBlock(cellTo)) { + _$jscoverage['plugins/table.core.js'][665]++; + cellTo.innerHTML = cellFrom.innerHTML; + _$jscoverage['plugins/table.core.js'][666]++; + return; + } + _$jscoverage['plugins/table.core.js'][668]++; + var child = cellTo.lastChild; + _$jscoverage['plugins/table.core.js'][669]++; + if (((child.nodeType == 3) || (! dtd.$block[child.tagName]))) { + _$jscoverage['plugins/table.core.js'][670]++; + cellTo.appendChild(cellTo.ownerDocument.createElement("br")); + } + _$jscoverage['plugins/table.core.js'][672]++; + while ((child = cellFrom.firstChild)) { + _$jscoverage['plugins/table.core.js'][673]++; + cellTo.appendChild(child); +} +}), mergeRight: (function (cell) { + _$jscoverage['plugins/table.core.js'][680]++; + var cellInfo = this.getCellInfo(cell), rightColIndex = (cellInfo.colIndex + cellInfo.colSpan), rightCellInfo = this.indexTable[cellInfo.rowIndex][rightColIndex], rightCell = this.getCell(rightCellInfo.rowIndex, rightCellInfo.cellIndex); + _$jscoverage['plugins/table.core.js'][685]++; + cell.colSpan = (cellInfo.colSpan + rightCellInfo.colSpan); + _$jscoverage['plugins/table.core.js'][687]++; + cell.removeAttribute("width"); + _$jscoverage['plugins/table.core.js'][689]++; + this.moveContent(cell, rightCell); + _$jscoverage['plugins/table.core.js'][691]++; + this.deleteCell(rightCell, rightCellInfo.rowIndex); + _$jscoverage['plugins/table.core.js'][692]++; + this.update(); +}), mergeDown: (function (cell) { + _$jscoverage['plugins/table.core.js'][698]++; + var cellInfo = this.getCellInfo(cell), downRowIndex = (cellInfo.rowIndex + cellInfo.rowSpan), downCellInfo = this.indexTable[downRowIndex][cellInfo.colIndex], downCell = this.getCell(downCellInfo.rowIndex, downCellInfo.cellIndex); + _$jscoverage['plugins/table.core.js'][702]++; + cell.rowSpan = (cellInfo.rowSpan + downCellInfo.rowSpan); + _$jscoverage['plugins/table.core.js'][703]++; + cell.removeAttribute("height"); + _$jscoverage['plugins/table.core.js'][704]++; + this.moveContent(cell, downCell); + _$jscoverage['plugins/table.core.js'][705]++; + this.deleteCell(downCell, downCellInfo.rowIndex); + _$jscoverage['plugins/table.core.js'][706]++; + this.update(); +}), mergeRange: (function () { + _$jscoverage['plugins/table.core.js'][713]++; + var range = this.cellsRange, leftTopCell = this.getCell(range.beginRowIndex, this.indexTable[range.beginRowIndex][range.beginColIndex].cellIndex); + _$jscoverage['plugins/table.core.js'][716]++; + if (((leftTopCell.tagName == "TH") && (range.endRowIndex !== range.beginRowIndex))) { + _$jscoverage['plugins/table.core.js'][717]++; + var index = this.indexTable, info = this.getCellInfo(leftTopCell); + _$jscoverage['plugins/table.core.js'][719]++; + leftTopCell = this.getCell(1, index[1][info.colIndex].cellIndex); + _$jscoverage['plugins/table.core.js'][720]++; + range = this.getCellsRange(leftTopCell, this.getCell(index[(this.rowsNum - 1)][info.colIndex].rowIndex, index[(this.rowsNum - 1)][info.colIndex].cellIndex)); + } + _$jscoverage['plugins/table.core.js'][724]++; + var cells = this.getCells(range); + _$jscoverage['plugins/table.core.js'][725]++; + for (var i = 0, ci; (ci = cells[(i++)]);) { + _$jscoverage['plugins/table.core.js'][726]++; + if ((ci !== leftTopCell)) { + _$jscoverage['plugins/table.core.js'][727]++; + this.moveContent(leftTopCell, ci); + _$jscoverage['plugins/table.core.js'][728]++; + this.deleteCell(ci); + } +} + _$jscoverage['plugins/table.core.js'][732]++; + leftTopCell.rowSpan = ((range.endRowIndex - range.beginRowIndex) + 1); + _$jscoverage['plugins/table.core.js'][733]++; + ((leftTopCell.rowSpan > 1) && leftTopCell.removeAttribute("height")); + _$jscoverage['plugins/table.core.js'][734]++; + leftTopCell.colSpan = ((range.endColIndex - range.beginColIndex) + 1); + _$jscoverage['plugins/table.core.js'][735]++; + ((leftTopCell.colSpan > 1) && leftTopCell.removeAttribute("width")); + _$jscoverage['plugins/table.core.js'][736]++; + if (((leftTopCell.rowSpan == this.rowsNum) && (leftTopCell.colSpan != 1))) { + _$jscoverage['plugins/table.core.js'][737]++; + leftTopCell.colSpan = 1; + } + _$jscoverage['plugins/table.core.js'][740]++; + if (((leftTopCell.colSpan == this.colsNum) && (leftTopCell.rowSpan != 1))) { + _$jscoverage['plugins/table.core.js'][741]++; + var rowIndex = leftTopCell.parentNode.rowIndex; + _$jscoverage['plugins/table.core.js'][743]++; + if (this.table.deleteRow) { + _$jscoverage['plugins/table.core.js'][744]++; + for (var i = (rowIndex + 1), curIndex = (rowIndex + 1), len = leftTopCell.rowSpan; (i < len); (i++)) { + _$jscoverage['plugins/table.core.js'][745]++; + this.table.deleteRow(curIndex); +} + } + else { + _$jscoverage['plugins/table.core.js'][748]++; + for (var i = 0, len = (leftTopCell.rowSpan - 1); (i < len); (i++)) { + _$jscoverage['plugins/table.core.js'][749]++; + var row = this.table.rows[(rowIndex + 1)]; + _$jscoverage['plugins/table.core.js'][750]++; + row.parentNode.removeChild(row); +} + } + _$jscoverage['plugins/table.core.js'][753]++; + leftTopCell.rowSpan = 1; + } + _$jscoverage['plugins/table.core.js'][755]++; + this.update(); +}), insertRow: (function (rowIndex, sourceCell) { + _$jscoverage['plugins/table.core.js'][761]++; + var numCols = this.colsNum, table = this.table, row = table.insertRow(rowIndex), cell, width = parseInt(((table.offsetWidth - (numCols * 20) - numCols - 1) / numCols), 10); + _$jscoverage['plugins/table.core.js'][766]++; + if (((rowIndex == 0) || (rowIndex == this.rowsNum))) { + _$jscoverage['plugins/table.core.js'][767]++; + for (var colIndex = 0; (colIndex < numCols); (colIndex++)) { + _$jscoverage['plugins/table.core.js'][768]++; + cell = this.cloneCell(sourceCell, true); + _$jscoverage['plugins/table.core.js'][769]++; + this.setCellContent(cell); + _$jscoverage['plugins/table.core.js'][770]++; + (cell.getAttribute("vAlign") && cell.setAttribute("vAlign", cell.getAttribute("vAlign"))); + _$jscoverage['plugins/table.core.js'][771]++; + row.appendChild(cell); +} + } + else { + _$jscoverage['plugins/table.core.js'][774]++; + var infoRow = this.indexTable[rowIndex], cellIndex = 0; + _$jscoverage['plugins/table.core.js'][776]++; + for (colIndex = 0; (colIndex < numCols); (colIndex++)) { + _$jscoverage['plugins/table.core.js'][777]++; + var cellInfo = infoRow[colIndex]; + _$jscoverage['plugins/table.core.js'][779]++; + if ((cellInfo.rowIndex < rowIndex)) { + _$jscoverage['plugins/table.core.js'][780]++; + cell = this.getCell(cellInfo.rowIndex, cellInfo.cellIndex); + _$jscoverage['plugins/table.core.js'][781]++; + cell.rowSpan = (cellInfo.rowSpan + 1); + } + else { + _$jscoverage['plugins/table.core.js'][783]++; + cell = this.cloneCell(sourceCell, true); + _$jscoverage['plugins/table.core.js'][784]++; + this.setCellContent(cell); + _$jscoverage['plugins/table.core.js'][785]++; + row.appendChild(cell); + } +} + } + _$jscoverage['plugins/table.core.js'][790]++; + this.update(); + _$jscoverage['plugins/table.core.js'][791]++; + return row; +}), deleteRow: (function (rowIndex) { + _$jscoverage['plugins/table.core.js'][798]++; + var row = this.table.rows[rowIndex], infoRow = this.indexTable[rowIndex], colsNum = this.colsNum, count = 0; + _$jscoverage['plugins/table.core.js'][802]++; + for (var colIndex = 0; (colIndex < colsNum);) { + _$jscoverage['plugins/table.core.js'][803]++; + var cellInfo = infoRow[colIndex], cell = this.getCell(cellInfo.rowIndex, cellInfo.cellIndex); + _$jscoverage['plugins/table.core.js'][805]++; + if ((cell.rowSpan > 1)) { + _$jscoverage['plugins/table.core.js'][806]++; + if ((cellInfo.rowIndex == rowIndex)) { + _$jscoverage['plugins/table.core.js'][807]++; + var clone = cell.cloneNode(true); + _$jscoverage['plugins/table.core.js'][808]++; + clone.rowSpan = (cell.rowSpan - 1); + _$jscoverage['plugins/table.core.js'][809]++; + clone.innerHTML = ""; + _$jscoverage['plugins/table.core.js'][810]++; + cell.rowSpan = 1; + _$jscoverage['plugins/table.core.js'][811]++; + var nextRowIndex = (rowIndex + 1), nextRow = this.table.rows[nextRowIndex], insertCellIndex, preMerged = (this.getPreviewMergedCellsNum(nextRowIndex, colIndex) - count); + _$jscoverage['plugins/table.core.js'][815]++; + if ((preMerged < colIndex)) { + _$jscoverage['plugins/table.core.js'][816]++; + insertCellIndex = (colIndex - preMerged - 1); + _$jscoverage['plugins/table.core.js'][818]++; + domUtils.insertAfter(nextRow.cells[insertCellIndex], clone); + } + else { + _$jscoverage['plugins/table.core.js'][820]++; + if (nextRow.cells.length) { + _$jscoverage['plugins/table.core.js'][820]++; + nextRow.insertBefore(clone, nextRow.cells[0]); + } + } + _$jscoverage['plugins/table.core.js'][822]++; + count += 1; + } + } + _$jscoverage['plugins/table.core.js'][826]++; + colIndex += (cell.colSpan || 1); +} + _$jscoverage['plugins/table.core.js'][828]++; + var deleteTds = [], cacheMap = {}; + _$jscoverage['plugins/table.core.js'][829]++; + for (colIndex = 0; (colIndex < colsNum); (colIndex++)) { + _$jscoverage['plugins/table.core.js'][830]++; + var tmpRowIndex = infoRow[colIndex].rowIndex, tmpCellIndex = infoRow[colIndex].cellIndex, key = (tmpRowIndex + "_" + tmpCellIndex); + _$jscoverage['plugins/table.core.js'][833]++; + if (cacheMap[key]) { + _$jscoverage['plugins/table.core.js'][833]++; + continue; + } + _$jscoverage['plugins/table.core.js'][834]++; + cacheMap[key] = 1; + _$jscoverage['plugins/table.core.js'][835]++; + cell = this.getCell(tmpRowIndex, tmpCellIndex); + _$jscoverage['plugins/table.core.js'][836]++; + deleteTds.push(cell); +} + _$jscoverage['plugins/table.core.js'][838]++; + var mergeTds = []; + _$jscoverage['plugins/table.core.js'][839]++; + utils.each(deleteTds, (function (td) { + _$jscoverage['plugins/table.core.js'][840]++; + if ((td.rowSpan == 1)) { + _$jscoverage['plugins/table.core.js'][841]++; + td.parentNode.removeChild(td); + } + else { + _$jscoverage['plugins/table.core.js'][843]++; + mergeTds.push(td); + } +})); + _$jscoverage['plugins/table.core.js'][846]++; + utils.each(mergeTds, (function (td) { + _$jscoverage['plugins/table.core.js'][847]++; + (td.rowSpan--); +})); + _$jscoverage['plugins/table.core.js'][849]++; + row.parentNode.removeChild(row); + _$jscoverage['plugins/table.core.js'][852]++; + this.update(); +}), insertCol: (function (colIndex, sourceCell, defaultValue) { + _$jscoverage['plugins/table.core.js'][855]++; + var rowsNum = this.rowsNum, rowIndex = 0, tableRow, cell, backWidth = parseInt(((this.table.offsetWidth - ((this.colsNum + 1) * 20) - (this.colsNum + 1)) / (this.colsNum + 1)), 10); + _$jscoverage['plugins/table.core.js'][860]++; + function replaceTdToTh(rowIndex, cell, tableRow) { + _$jscoverage['plugins/table.core.js'][861]++; + if ((rowIndex == 0)) { + _$jscoverage['plugins/table.core.js'][862]++; + var th = (cell.nextSibling || cell.previousSibling); + _$jscoverage['plugins/table.core.js'][863]++; + if ((th.tagName == "TH")) { + _$jscoverage['plugins/table.core.js'][864]++; + th = cell.ownerDocument.createElement("th"); + _$jscoverage['plugins/table.core.js'][865]++; + th.appendChild(cell.firstChild); + _$jscoverage['plugins/table.core.js'][866]++; + tableRow.insertBefore(th, cell); + _$jscoverage['plugins/table.core.js'][867]++; + domUtils.remove(cell); + } + } + else { + _$jscoverage['plugins/table.core.js'][870]++; + if ((cell.tagName == "TH")) { + _$jscoverage['plugins/table.core.js'][871]++; + var td = cell.ownerDocument.createElement("td"); + _$jscoverage['plugins/table.core.js'][872]++; + td.appendChild(cell.firstChild); + _$jscoverage['plugins/table.core.js'][873]++; + tableRow.insertBefore(td, cell); + _$jscoverage['plugins/table.core.js'][874]++; + domUtils.remove(cell); + } + } +} + _$jscoverage['plugins/table.core.js'][879]++; + var preCell; + _$jscoverage['plugins/table.core.js'][880]++; + if (((colIndex == 0) || (colIndex == this.colsNum))) { + _$jscoverage['plugins/table.core.js'][881]++; + for (; (rowIndex < rowsNum); (rowIndex++)) { + _$jscoverage['plugins/table.core.js'][882]++; + tableRow = this.table.rows[rowIndex]; + _$jscoverage['plugins/table.core.js'][883]++; + preCell = tableRow.cells[((colIndex == 0)? colIndex: tableRow.cells.length)]; + _$jscoverage['plugins/table.core.js'][884]++; + cell = this.cloneCell(sourceCell, true); + _$jscoverage['plugins/table.core.js'][885]++; + this.setCellContent(cell); + _$jscoverage['plugins/table.core.js'][886]++; + cell.setAttribute("vAlign", cell.getAttribute("vAlign")); + _$jscoverage['plugins/table.core.js'][887]++; + (preCell && cell.setAttribute("width", preCell.getAttribute("width"))); + _$jscoverage['plugins/table.core.js'][888]++; + if ((! colIndex)) { + _$jscoverage['plugins/table.core.js'][889]++; + tableRow.insertBefore(cell, tableRow.cells[0]); + } + else { + _$jscoverage['plugins/table.core.js'][891]++; + domUtils.insertAfter(tableRow.cells[(tableRow.cells.length - 1)], cell); + } + _$jscoverage['plugins/table.core.js'][893]++; + replaceTdToTh(rowIndex, cell, tableRow); +} + } + else { + _$jscoverage['plugins/table.core.js'][896]++; + for (; (rowIndex < rowsNum); (rowIndex++)) { + _$jscoverage['plugins/table.core.js'][897]++; + var cellInfo = this.indexTable[rowIndex][colIndex]; + _$jscoverage['plugins/table.core.js'][898]++; + if ((cellInfo.colIndex < colIndex)) { + _$jscoverage['plugins/table.core.js'][899]++; + cell = this.getCell(cellInfo.rowIndex, cellInfo.cellIndex); + _$jscoverage['plugins/table.core.js'][900]++; + cell.colSpan = (cellInfo.colSpan + 1); + } + else { + _$jscoverage['plugins/table.core.js'][902]++; + tableRow = this.table.rows[rowIndex]; + _$jscoverage['plugins/table.core.js'][903]++; + preCell = tableRow.cells[cellInfo.cellIndex]; + _$jscoverage['plugins/table.core.js'][905]++; + cell = this.cloneCell(sourceCell, true); + _$jscoverage['plugins/table.core.js'][906]++; + this.setCellContent(cell); + _$jscoverage['plugins/table.core.js'][907]++; + cell.setAttribute("vAlign", cell.getAttribute("vAlign")); + _$jscoverage['plugins/table.core.js'][908]++; + (preCell && cell.setAttribute("width", preCell.getAttribute("width"))); + _$jscoverage['plugins/table.core.js'][910]++; + (preCell? tableRow.insertBefore(cell, preCell): tableRow.appendChild(cell)); + } + _$jscoverage['plugins/table.core.js'][912]++; + replaceTdToTh(rowIndex, cell, tableRow); +} + } + _$jscoverage['plugins/table.core.js'][916]++; + this.update(); + _$jscoverage['plugins/table.core.js'][917]++; + this.updateWidth(backWidth, (defaultValue || {tdPadding: 10, tdBorder: 1})); +}), updateWidth: (function (width, defaultValue) { + _$jscoverage['plugins/table.core.js'][920]++; + var table = this.table, tmpWidth = ((UETable.getWidth(table) - (defaultValue.tdPadding * 2) - defaultValue.tdBorder) + width); + _$jscoverage['plugins/table.core.js'][922]++; + if ((tmpWidth < table.ownerDocument.body.offsetWidth)) { + _$jscoverage['plugins/table.core.js'][923]++; + table.setAttribute("width", tmpWidth); + _$jscoverage['plugins/table.core.js'][924]++; + return; + } + _$jscoverage['plugins/table.core.js'][926]++; + var tds = domUtils.getElementsByTagName(this.table, "td"); + _$jscoverage['plugins/table.core.js'][927]++; + utils.each(tds, (function (td) { + _$jscoverage['plugins/table.core.js'][928]++; + td.setAttribute("width", width); +})); +}), deleteCol: (function (colIndex) { + _$jscoverage['plugins/table.core.js'][932]++; + var indexTable = this.indexTable, tableRows = this.table.rows, backTableWidth = this.table.getAttribute("width"), backTdWidth = 0, rowsNum = this.rowsNum, cacheMap = {}; + _$jscoverage['plugins/table.core.js'][938]++; + for (var rowIndex = 0; (rowIndex < rowsNum);) { + _$jscoverage['plugins/table.core.js'][939]++; + var infoRow = indexTable[rowIndex], cellInfo = infoRow[colIndex], key = (cellInfo.rowIndex + "_" + cellInfo.colIndex); + _$jscoverage['plugins/table.core.js'][943]++; + if (cacheMap[key]) { + _$jscoverage['plugins/table.core.js'][943]++; + continue; + } + _$jscoverage['plugins/table.core.js'][944]++; + cacheMap[key] = 1; + _$jscoverage['plugins/table.core.js'][945]++; + var cell = this.getCell(cellInfo.rowIndex, cellInfo.cellIndex); + _$jscoverage['plugins/table.core.js'][946]++; + if ((! backTdWidth)) { + _$jscoverage['plugins/table.core.js'][946]++; + backTdWidth = (cell && parseInt((cell.offsetWidth / cell.colSpan), 10).toFixed(0)); + } + _$jscoverage['plugins/table.core.js'][948]++; + if ((cell.colSpan > 1)) { + _$jscoverage['plugins/table.core.js'][949]++; + (cell.colSpan--); + } + else { + _$jscoverage['plugins/table.core.js'][951]++; + tableRows[rowIndex].deleteCell(cellInfo.cellIndex); + } + _$jscoverage['plugins/table.core.js'][953]++; + rowIndex += (cellInfo.rowSpan || 1); +} + _$jscoverage['plugins/table.core.js'][955]++; + this.table.setAttribute("width", (backTableWidth - backTdWidth)); + _$jscoverage['plugins/table.core.js'][956]++; + this.update(); +}), splitToCells: (function (cell) { + _$jscoverage['plugins/table.core.js'][959]++; + var me = this, cells = this.splitToRows(cell); + _$jscoverage['plugins/table.core.js'][961]++; + utils.each(cells, (function (cell) { + _$jscoverage['plugins/table.core.js'][962]++; + me.splitToCols(cell); +})); +}), splitToRows: (function (cell) { + _$jscoverage['plugins/table.core.js'][966]++; + var cellInfo = this.getCellInfo(cell), rowIndex = cellInfo.rowIndex, colIndex = cellInfo.colIndex, results = []; + _$jscoverage['plugins/table.core.js'][971]++; + cell.rowSpan = 1; + _$jscoverage['plugins/table.core.js'][972]++; + results.push(cell); + _$jscoverage['plugins/table.core.js'][974]++; + for (var i = rowIndex, endRow = (rowIndex + cellInfo.rowSpan); (i < endRow); (i++)) { + _$jscoverage['plugins/table.core.js'][975]++; + if ((i == rowIndex)) { + _$jscoverage['plugins/table.core.js'][975]++; + continue; + } + _$jscoverage['plugins/table.core.js'][976]++; + var tableRow = this.table.rows[i], tmpCell = tableRow.insertCell((colIndex - this.getPreviewMergedCellsNum(i, colIndex))); + _$jscoverage['plugins/table.core.js'][978]++; + tmpCell.colSpan = cellInfo.colSpan; + _$jscoverage['plugins/table.core.js'][979]++; + this.setCellContent(tmpCell); + _$jscoverage['plugins/table.core.js'][980]++; + tmpCell.setAttribute("vAlign", cell.getAttribute("vAlign")); + _$jscoverage['plugins/table.core.js'][981]++; + tmpCell.setAttribute("align", cell.getAttribute("align")); + _$jscoverage['plugins/table.core.js'][982]++; + if (cell.style.cssText) { + _$jscoverage['plugins/table.core.js'][983]++; + tmpCell.style.cssText = cell.style.cssText; + } + _$jscoverage['plugins/table.core.js'][985]++; + results.push(tmpCell); +} + _$jscoverage['plugins/table.core.js'][987]++; + this.update(); + _$jscoverage['plugins/table.core.js'][988]++; + return results; +}), getPreviewMergedCellsNum: (function (rowIndex, colIndex) { + _$jscoverage['plugins/table.core.js'][991]++; + var indexRow = this.indexTable[rowIndex], num = 0; + _$jscoverage['plugins/table.core.js'][993]++; + for (var i = 0; (i < colIndex);) { + _$jscoverage['plugins/table.core.js'][994]++; + var colSpan = indexRow[i].colSpan, tmpRowIndex = indexRow[i].rowIndex; + _$jscoverage['plugins/table.core.js'][996]++; + num += (colSpan - ((tmpRowIndex == rowIndex)? 1: 0)); + _$jscoverage['plugins/table.core.js'][997]++; + i += colSpan; +} + _$jscoverage['plugins/table.core.js'][999]++; + return num; +}), splitToCols: (function (cell) { + _$jscoverage['plugins/table.core.js'][1002]++; + var backWidth = ((cell.offsetWidth / cell.colSpan) - 22).toFixed(0), cellInfo = this.getCellInfo(cell), rowIndex = cellInfo.rowIndex, colIndex = cellInfo.colIndex, results = []; + _$jscoverage['plugins/table.core.js'][1009]++; + cell.colSpan = 1; + _$jscoverage['plugins/table.core.js'][1010]++; + cell.setAttribute("width", backWidth); + _$jscoverage['plugins/table.core.js'][1011]++; + results.push(cell); + _$jscoverage['plugins/table.core.js'][1013]++; + for (var j = colIndex, endCol = (colIndex + cellInfo.colSpan); (j < endCol); (j++)) { + _$jscoverage['plugins/table.core.js'][1014]++; + if ((j == colIndex)) { + _$jscoverage['plugins/table.core.js'][1014]++; + continue; + } + _$jscoverage['plugins/table.core.js'][1015]++; + var tableRow = this.table.rows[rowIndex], tmpCell = tableRow.insertCell((this.indexTable[rowIndex][j].cellIndex + 1)); + _$jscoverage['plugins/table.core.js'][1017]++; + tmpCell.rowSpan = cellInfo.rowSpan; + _$jscoverage['plugins/table.core.js'][1018]++; + this.setCellContent(tmpCell); + _$jscoverage['plugins/table.core.js'][1019]++; + tmpCell.setAttribute("vAlign", cell.getAttribute("vAlign")); + _$jscoverage['plugins/table.core.js'][1020]++; + tmpCell.setAttribute("align", cell.getAttribute("align")); + _$jscoverage['plugins/table.core.js'][1021]++; + tmpCell.setAttribute("width", backWidth); + _$jscoverage['plugins/table.core.js'][1022]++; + if (cell.style.cssText) { + _$jscoverage['plugins/table.core.js'][1023]++; + tmpCell.style.cssText = cell.style.cssText; + } + _$jscoverage['plugins/table.core.js'][1026]++; + if ((cell.tagName == "TH")) { + _$jscoverage['plugins/table.core.js'][1027]++; + var th = cell.ownerDocument.createElement("th"); + _$jscoverage['plugins/table.core.js'][1028]++; + th.appendChild(tmpCell.firstChild); + _$jscoverage['plugins/table.core.js'][1029]++; + th.setAttribute("vAlign", cell.getAttribute("vAlign")); + _$jscoverage['plugins/table.core.js'][1030]++; + th.rowSpan = tmpCell.rowSpan; + _$jscoverage['plugins/table.core.js'][1031]++; + tableRow.insertBefore(th, tmpCell); + _$jscoverage['plugins/table.core.js'][1032]++; + domUtils.remove(tmpCell); + } + _$jscoverage['plugins/table.core.js'][1034]++; + results.push(tmpCell); +} + _$jscoverage['plugins/table.core.js'][1036]++; + this.update(); + _$jscoverage['plugins/table.core.js'][1037]++; + return results; +}), isLastCell: (function (cell, rowsNum, colsNum) { + _$jscoverage['plugins/table.core.js'][1040]++; + rowsNum = (rowsNum || this.rowsNum); + _$jscoverage['plugins/table.core.js'][1041]++; + colsNum = (colsNum || this.colsNum); + _$jscoverage['plugins/table.core.js'][1042]++; + var cellInfo = this.getCellInfo(cell); + _$jscoverage['plugins/table.core.js'][1043]++; + return (((cellInfo.rowIndex + cellInfo.rowSpan) == rowsNum) && ((cellInfo.colIndex + cellInfo.colSpan) == colsNum)); +}), getLastCell: (function (cells) { + _$jscoverage['plugins/table.core.js'][1047]++; + cells = (cells || this.table.getElementsByTagName("td")); + _$jscoverage['plugins/table.core.js'][1048]++; + var firstInfo = this.getCellInfo(cells[0]); + _$jscoverage['plugins/table.core.js'][1049]++; + var me = this, last = cells[0], tr = last.parentNode, cellsNum = 0, cols = 0, rows; + _$jscoverage['plugins/table.core.js'][1052]++; + utils.each(cells, (function (cell) { + _$jscoverage['plugins/table.core.js'][1053]++; + if ((cell.parentNode == tr)) { + _$jscoverage['plugins/table.core.js'][1053]++; + cols += (cell.colSpan || 1); + } + _$jscoverage['plugins/table.core.js'][1054]++; + cellsNum += ((cell.rowSpan * cell.colSpan) || 1); +})); + _$jscoverage['plugins/table.core.js'][1056]++; + rows = (cellsNum / cols); + _$jscoverage['plugins/table.core.js'][1057]++; + utils.each(cells, (function (cell) { + _$jscoverage['plugins/table.core.js'][1058]++; + if (me.isLastCell(cell, rows, cols)) { + _$jscoverage['plugins/table.core.js'][1059]++; + last = cell; + _$jscoverage['plugins/table.core.js'][1060]++; + return false; + } +})); + _$jscoverage['plugins/table.core.js'][1063]++; + return last; +}), selectRow: (function (rowIndex) { + _$jscoverage['plugins/table.core.js'][1067]++; + 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); + _$jscoverage['plugins/table.core.js'][1071]++; + this.setSelected(range); +}), selectTable: (function () { + _$jscoverage['plugins/table.core.js'][1074]++; + var tds = this.table.getElementsByTagName("td"), range = this.getCellsRange(tds[0], tds[(tds.length - 1)]); + _$jscoverage['plugins/table.core.js'][1076]++; + this.setSelected(range); +}), sortTable: (function (sortByCellIndex, compareFn) { + _$jscoverage['plugins/table.core.js'][1079]++; + var table = this.table, rows = table.rows, trArray = [], flag = (rows[0].cells[0].tagName === "TH"), lastRowIndex = 0; + _$jscoverage['plugins/table.core.js'][1084]++; + if (this.selectedTds.length) { + _$jscoverage['plugins/table.core.js'][1085]++; + var range = this.cellsRange, len = (range.endRowIndex + 1); + _$jscoverage['plugins/table.core.js'][1087]++; + for (var i = range.beginRowIndex; (i < len); (i++)) { + _$jscoverage['plugins/table.core.js'][1088]++; + trArray[i] = rows[i]; +} + _$jscoverage['plugins/table.core.js'][1090]++; + trArray.splice(0, range.beginRowIndex); + _$jscoverage['plugins/table.core.js'][1091]++; + lastRowIndex = (((range.endRowIndex + 1) === this.rowsNum)? 0: (range.endRowIndex + 1)); + } + else { + _$jscoverage['plugins/table.core.js'][1093]++; + for (var i = 0, len = rows.length; (i < len); (i++)) { + _$jscoverage['plugins/table.core.js'][1094]++; + trArray[i] = rows[i]; +} + } + _$jscoverage['plugins/table.core.js'][1098]++; + (flag && trArray.splice(0, 1)); + _$jscoverage['plugins/table.core.js'][1099]++; + trArray = utils.sort(trArray, (function (tr1, tr2) { + _$jscoverage['plugins/table.core.js'][1100]++; + var txt = (function (node) { + _$jscoverage['plugins/table.core.js'][1101]++; + return (node.innerText || node.textContent); +}); + _$jscoverage['plugins/table.core.js'][1103]++; + return (compareFn? (((typeof compareFn) === "number")? compareFn: compareFn.call(this, tr1.cells[sortByCellIndex], tr2.cells[sortByCellIndex])): (function () { + _$jscoverage['plugins/table.core.js'][1104]++; + var value1 = txt(tr1.cells[sortByCellIndex]), value2 = txt(tr2.cells[sortByCellIndex]); + _$jscoverage['plugins/table.core.js'][1106]++; + return value1.localeCompare(value2); +})()); +})); + _$jscoverage['plugins/table.core.js'][1109]++; + var fragment = table.ownerDocument.createDocumentFragment(); + _$jscoverage['plugins/table.core.js'][1110]++; + for (var j = 0, len = trArray.length; (j < len); (j++)) { + _$jscoverage['plugins/table.core.js'][1111]++; + fragment.appendChild(trArray[j]); +} + _$jscoverage['plugins/table.core.js'][1113]++; + var tbody = table.getElementsByTagName("tbody")[0]; + _$jscoverage['plugins/table.core.js'][1114]++; + if ((! lastRowIndex)) { + _$jscoverage['plugins/table.core.js'][1115]++; + tbody.appendChild(fragment); + } + else { + _$jscoverage['plugins/table.core.js'][1117]++; + tbody.insertBefore(fragment, rows[(((lastRowIndex - range.endRowIndex) + range.beginRowIndex) - 1)]); + } +}), setBackground: (function (cells, value) { + _$jscoverage['plugins/table.core.js'][1121]++; + if (((typeof value) === "string")) { + _$jscoverage['plugins/table.core.js'][1122]++; + utils.each(cells, (function (cell) { + _$jscoverage['plugins/table.core.js'][1123]++; + cell.style.backgroundColor = value; +})); + } + else { + _$jscoverage['plugins/table.core.js'][1125]++; + if (((typeof value) === "object")) { + _$jscoverage['plugins/table.core.js'][1126]++; + value = utils.extend({repeat: true, colorList: ["#ddd", "#fff"]}, value); + _$jscoverage['plugins/table.core.js'][1130]++; + var rowIndex = this.getCellInfo(cells[0]).rowIndex, count = 0, colors = value.colorList, getColor = (function (list, index, repeat) { + _$jscoverage['plugins/table.core.js'][1134]++; + return (list[index]? list[index]: (repeat? list[(index % list.length)]: "")); +}); + _$jscoverage['plugins/table.core.js'][1136]++; + for (var i = 0, cell; (cell = cells[(i++)]);) { + _$jscoverage['plugins/table.core.js'][1137]++; + var cellInfo = this.getCellInfo(cell); + _$jscoverage['plugins/table.core.js'][1138]++; + cell.style.backgroundColor = getColor(colors, (((rowIndex + count) == cellInfo.rowIndex)? count: (++count)), value.repeat); +} + } + } +}), removeBackground: (function (cells) { + _$jscoverage['plugins/table.core.js'][1143]++; + utils.each(cells, (function (cell) { + _$jscoverage['plugins/table.core.js'][1144]++; + cell.style.backgroundColor = ""; +})); +})}; + _$jscoverage['plugins/table.core.js'][1150]++; + function showError(e) { +} +})(); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/template.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/template.js new file mode 100644 index 000000000..f46cd1d8b --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/template.js @@ -0,0 +1,108 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/template.js']) { + _$jscoverage['plugins/template.js'] = []; + _$jscoverage['plugins/template.js'][2] = 0; + _$jscoverage['plugins/template.js'][3] = 0; + _$jscoverage['plugins/template.js'][5] = 0; + _$jscoverage['plugins/template.js'][8] = 0; + _$jscoverage['plugins/template.js'][9] = 0; + _$jscoverage['plugins/template.js'][11] = 0; + _$jscoverage['plugins/template.js'][12] = 0; + _$jscoverage['plugins/template.js'][13] = 0; + _$jscoverage['plugins/template.js'][16] = 0; + _$jscoverage['plugins/template.js'][18] = 0; + _$jscoverage['plugins/template.js'][19] = 0; + _$jscoverage['plugins/template.js'][20] = 0; + _$jscoverage['plugins/template.js'][21] = 0; + _$jscoverage['plugins/template.js'][22] = 0; + _$jscoverage['plugins/template.js'][23] = 0; + _$jscoverage['plugins/template.js'][24] = 0; + _$jscoverage['plugins/template.js'][27] = 0; + _$jscoverage['plugins/template.js'][28] = 0; +} +_$jscoverage['plugins/template.js'].source = ["","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\"]);"," }"," }"," }"," });","};"]; +_$jscoverage['plugins/template.js'][2]++; +UE.plugins.template = (function () { + _$jscoverage['plugins/template.js'][3]++; + UE.commands.template = {execCommand: (function (cmd, obj) { + _$jscoverage['plugins/template.js'][5]++; + (obj.html && this.execCommand("inserthtml", obj.html)); +})}; + _$jscoverage['plugins/template.js'][8]++; + this.addListener("click", (function (type, evt) { + _$jscoverage['plugins/template.js'][9]++; + var el = (evt.target || evt.srcElement), range = this.selection.getRange(); + _$jscoverage['plugins/template.js'][11]++; + var tnode = domUtils.findParent(el, (function (node) { + _$jscoverage['plugins/template.js'][12]++; + if ((node.className && domUtils.hasClass(node, "ue_t"))) { + _$jscoverage['plugins/template.js'][13]++; + return node; + } +}), true); + _$jscoverage['plugins/template.js'][16]++; + (tnode && range.selectNode(tnode).shrinkBoundary().select()); +})); + _$jscoverage['plugins/template.js'][18]++; + this.addListener("keydown", (function (type, evt) { + _$jscoverage['plugins/template.js'][19]++; + var range = this.selection.getRange(); + _$jscoverage['plugins/template.js'][20]++; + if ((! range.collapsed)) { + _$jscoverage['plugins/template.js'][21]++; + if (((! evt.ctrlKey) && (! evt.metaKey) && (! evt.shiftKey) && (! evt.altKey))) { + _$jscoverage['plugins/template.js'][22]++; + var tnode = domUtils.findParent(range.startContainer, (function (node) { + _$jscoverage['plugins/template.js'][23]++; + if ((node.className && domUtils.hasClass(node, "ue_t"))) { + _$jscoverage['plugins/template.js'][24]++; + return node; + } +}), true); + _$jscoverage['plugins/template.js'][27]++; + if (tnode) { + _$jscoverage['plugins/template.js'][28]++; + domUtils.removeClasses(tnode, ["ue_t"]); + } + } + } +})); +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/time.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/time.js new file mode 100644 index 000000000..d9a0725a5 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/time.js @@ -0,0 +1,53 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/time.js']) { + _$jscoverage['plugins/time.js'] = []; + _$jscoverage['plugins/time.js'][28] = 0; + _$jscoverage['plugins/time.js'][30] = 0; + _$jscoverage['plugins/time.js'][31] = 0; +} +_$jscoverage['plugins/time.js'].source = ["/**"," * 插入时间和日期"," * @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){"," var date = new Date;"," this.execCommand('insertHtml',cmd == \"time\" ?"," (date.getHours()+\":\"+ (date.getMinutes()<10 ? \"0\"+date.getMinutes() : date.getMinutes())+\":\"+(date.getSeconds()<10 ? \"0\"+date.getSeconds() : date.getSeconds())) :"," (date.getFullYear()+\"-\"+((date.getMonth()+1)<10 ? \"0\"+(date.getMonth()+1) : date.getMonth()+1)+\"-\"+(date.getDate()<10?\"0\"+date.getDate():date.getDate())));"," }","};","","",""]; +_$jscoverage['plugins/time.js'][28]++; +UE.commands.time = (UE.commands.date = {execCommand: (function (cmd) { + _$jscoverage['plugins/time.js'][30]++; + var date = new Date(); + _$jscoverage['plugins/time.js'][31]++; + this.execCommand("insertHtml", ((cmd == "time")? (date.getHours() + ":" + ((date.getMinutes() < 10)? ("0" + date.getMinutes()): date.getMinutes()) + ":" + ((date.getSeconds() < 10)? ("0" + date.getSeconds()): date.getSeconds())): (date.getFullYear() + "-" + (((date.getMonth() + 1) < 10)? ("0" + (date.getMonth() + 1)): (date.getMonth() + 1)) + "-" + ((date.getDate() < 10)? ("0" + date.getDate()): date.getDate())))); +})}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/undo.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/undo.js new file mode 100644 index 000000000..a4e260b61 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/undo.js @@ -0,0 +1,568 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/undo.js']) { + _$jscoverage['plugins/undo.js'] = []; + _$jscoverage['plugins/undo.js'][10] = 0; + _$jscoverage['plugins/undo.js'][11] = 0; + _$jscoverage['plugins/undo.js'][12] = 0; + _$jscoverage['plugins/undo.js'][16] = 0; + _$jscoverage['plugins/undo.js'][19] = 0; + _$jscoverage['plugins/undo.js'][20] = 0; + _$jscoverage['plugins/undo.js'][21] = 0; + _$jscoverage['plugins/undo.js'][22] = 0; + _$jscoverage['plugins/undo.js'][23] = 0; + _$jscoverage['plugins/undo.js'][24] = 0; + _$jscoverage['plugins/undo.js'][25] = 0; + _$jscoverage['plugins/undo.js'][27] = 0; + _$jscoverage['plugins/undo.js'][30] = 0; + _$jscoverage['plugins/undo.js'][31] = 0; + _$jscoverage['plugins/undo.js'][32] = 0; + _$jscoverage['plugins/undo.js'][34] = 0; + _$jscoverage['plugins/undo.js'][35] = 0; + _$jscoverage['plugins/undo.js'][37] = 0; + _$jscoverage['plugins/undo.js'][40] = 0; + _$jscoverage['plugins/undo.js'][41] = 0; + _$jscoverage['plugins/undo.js'][42] = 0; + _$jscoverage['plugins/undo.js'][43] = 0; + _$jscoverage['plugins/undo.js'][44] = 0; + _$jscoverage['plugins/undo.js'][45] = 0; + _$jscoverage['plugins/undo.js'][46] = 0; + _$jscoverage['plugins/undo.js'][47] = 0; + _$jscoverage['plugins/undo.js'][48] = 0; + _$jscoverage['plugins/undo.js'][49] = 0; + _$jscoverage['plugins/undo.js'][51] = 0; + _$jscoverage['plugins/undo.js'][52] = 0; + _$jscoverage['plugins/undo.js'][53] = 0; + _$jscoverage['plugins/undo.js'][54] = 0; + _$jscoverage['plugins/undo.js'][57] = 0; + _$jscoverage['plugins/undo.js'][60] = 0; + _$jscoverage['plugins/undo.js'][61] = 0; + _$jscoverage['plugins/undo.js'][62] = 0; + _$jscoverage['plugins/undo.js'][63] = 0; + _$jscoverage['plugins/undo.js'][64] = 0; + _$jscoverage['plugins/undo.js'][65] = 0; + _$jscoverage['plugins/undo.js'][68] = 0; + _$jscoverage['plugins/undo.js'][72] = 0; + _$jscoverage['plugins/undo.js'][73] = 0; + _$jscoverage['plugins/undo.js'][74] = 0; + _$jscoverage['plugins/undo.js'][75] = 0; + _$jscoverage['plugins/undo.js'][76] = 0; + _$jscoverage['plugins/undo.js'][77] = 0; + _$jscoverage['plugins/undo.js'][78] = 0; + _$jscoverage['plugins/undo.js'][81] = 0; + _$jscoverage['plugins/undo.js'][82] = 0; + _$jscoverage['plugins/undo.js'][84] = 0; + _$jscoverage['plugins/undo.js'][85] = 0; + _$jscoverage['plugins/undo.js'][86] = 0; + _$jscoverage['plugins/undo.js'][87] = 0; + _$jscoverage['plugins/undo.js'][92] = 0; + _$jscoverage['plugins/undo.js'][93] = 0; + _$jscoverage['plugins/undo.js'][94] = 0; + _$jscoverage['plugins/undo.js'][97] = 0; + _$jscoverage['plugins/undo.js'][98] = 0; + _$jscoverage['plugins/undo.js'][100] = 0; + _$jscoverage['plugins/undo.js'][103] = 0; + _$jscoverage['plugins/undo.js'][104] = 0; + _$jscoverage['plugins/undo.js'][105] = 0; + _$jscoverage['plugins/undo.js'][107] = 0; + _$jscoverage['plugins/undo.js'][108] = 0; + _$jscoverage['plugins/undo.js'][109] = 0; + _$jscoverage['plugins/undo.js'][110] = 0; + _$jscoverage['plugins/undo.js'][111] = 0; + _$jscoverage['plugins/undo.js'][112] = 0; + _$jscoverage['plugins/undo.js'][116] = 0; + _$jscoverage['plugins/undo.js'][118] = 0; + _$jscoverage['plugins/undo.js'][123] = 0; + _$jscoverage['plugins/undo.js'][124] = 0; + _$jscoverage['plugins/undo.js'][125] = 0; + _$jscoverage['plugins/undo.js'][128] = 0; + _$jscoverage['plugins/undo.js'][131] = 0; + _$jscoverage['plugins/undo.js'][133] = 0; + _$jscoverage['plugins/undo.js'][134] = 0; + _$jscoverage['plugins/undo.js'][136] = 0; + _$jscoverage['plugins/undo.js'][137] = 0; + _$jscoverage['plugins/undo.js'][139] = 0; + _$jscoverage['plugins/undo.js'][140] = 0; + _$jscoverage['plugins/undo.js'][142] = 0; + _$jscoverage['plugins/undo.js'][145] = 0; + _$jscoverage['plugins/undo.js'][146] = 0; + _$jscoverage['plugins/undo.js'][147] = 0; + _$jscoverage['plugins/undo.js'][149] = 0; + _$jscoverage['plugins/undo.js'][150] = 0; + _$jscoverage['plugins/undo.js'][151] = 0; + _$jscoverage['plugins/undo.js'][152] = 0; + _$jscoverage['plugins/undo.js'][153] = 0; + _$jscoverage['plugins/undo.js'][154] = 0; + _$jscoverage['plugins/undo.js'][156] = 0; + _$jscoverage['plugins/undo.js'][157] = 0; + _$jscoverage['plugins/undo.js'][158] = 0; + _$jscoverage['plugins/undo.js'][162] = 0; + _$jscoverage['plugins/undo.js'][163] = 0; + _$jscoverage['plugins/undo.js'][164] = 0; + _$jscoverage['plugins/undo.js'][165] = 0; + _$jscoverage['plugins/undo.js'][168] = 0; + _$jscoverage['plugins/undo.js'][169] = 0; + _$jscoverage['plugins/undo.js'][170] = 0; + _$jscoverage['plugins/undo.js'][173] = 0; + _$jscoverage['plugins/undo.js'][174] = 0; + _$jscoverage['plugins/undo.js'][176] = 0; + _$jscoverage['plugins/undo.js'][177] = 0; + _$jscoverage['plugins/undo.js'][178] = 0; + _$jscoverage['plugins/undo.js'][181] = 0; + _$jscoverage['plugins/undo.js'][183] = 0; + _$jscoverage['plugins/undo.js'][186] = 0; + _$jscoverage['plugins/undo.js'][191] = 0; + _$jscoverage['plugins/undo.js'][200] = 0; + _$jscoverage['plugins/undo.js'][201] = 0; + _$jscoverage['plugins/undo.js'][202] = 0; + _$jscoverage['plugins/undo.js'][203] = 0; + _$jscoverage['plugins/undo.js'][205] = 0; + _$jscoverage['plugins/undo.js'][206] = 0; + _$jscoverage['plugins/undo.js'][210] = 0; + _$jscoverage['plugins/undo.js'][215] = 0; + _$jscoverage['plugins/undo.js'][216] = 0; + _$jscoverage['plugins/undo.js'][218] = 0; + _$jscoverage['plugins/undo.js'][219] = 0; + _$jscoverage['plugins/undo.js'][220] = 0; + _$jscoverage['plugins/undo.js'][221] = 0; + _$jscoverage['plugins/undo.js'][222] = 0; + _$jscoverage['plugins/undo.js'][224] = 0; + _$jscoverage['plugins/undo.js'][225] = 0; + _$jscoverage['plugins/undo.js'][226] = 0; + _$jscoverage['plugins/undo.js'][227] = 0; + _$jscoverage['plugins/undo.js'][229] = 0; + _$jscoverage['plugins/undo.js'][230] = 0; + _$jscoverage['plugins/undo.js'][232] = 0; + _$jscoverage['plugins/undo.js'][233] = 0; + _$jscoverage['plugins/undo.js'][235] = 0; + _$jscoverage['plugins/undo.js'][236] = 0; + _$jscoverage['plugins/undo.js'][237] = 0; + _$jscoverage['plugins/undo.js'][238] = 0; + _$jscoverage['plugins/undo.js'][240] = 0; + _$jscoverage['plugins/undo.js'][241] = 0; + _$jscoverage['plugins/undo.js'][242] = 0; + _$jscoverage['plugins/undo.js'][243] = 0; + _$jscoverage['plugins/undo.js'][244] = 0; + _$jscoverage['plugins/undo.js'][245] = 0; + _$jscoverage['plugins/undo.js'][248] = 0; + _$jscoverage['plugins/undo.js'][250] = 0; + _$jscoverage['plugins/undo.js'][253] = 0; + _$jscoverage['plugins/undo.js'][254] = 0; + _$jscoverage['plugins/undo.js'][255] = 0; + _$jscoverage['plugins/undo.js'][256] = 0; + _$jscoverage['plugins/undo.js'][260] = 0; + _$jscoverage['plugins/undo.js'][261] = 0; + _$jscoverage['plugins/undo.js'][262] = 0; + _$jscoverage['plugins/undo.js'][263] = 0; + _$jscoverage['plugins/undo.js'][264] = 0; + _$jscoverage['plugins/undo.js'][265] = 0; + _$jscoverage['plugins/undo.js'][266] = 0; + _$jscoverage['plugins/undo.js'][267] = 0; +} +_$jscoverage['plugins/undo.js'].source = ["///import core","///commands 撤销和重做","///commandsName Undo,Redo","///commandsTitle 撤销,重做","/*"," * @description 回退"," * @author zhanyi"," */","","UE.plugins['undo'] = function () {"," var saveSceneTimer;"," var me = this,"," maxUndoCount = me.options.maxUndoCount || 20,"," maxInputCount = me.options.maxInputCount || 20,"," fillchar = new RegExp(domUtils.fillChar + '|<\\/hr>', 'gi');// ie会产生多余的</hr>"," 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(/>&nbsp;</g, '><').replace(/\\s*</g, '<').replace(/>\\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 &&"," ( 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){",""," if (cont.selection.getRange().collapsed)"," cont.fireEvent('contentchange');"," 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;"," }"," }"," });","","};"]; +_$jscoverage['plugins/undo.js'][10]++; +UE.plugins.undo = (function () { + _$jscoverage['plugins/undo.js'][11]++; + var saveSceneTimer; + _$jscoverage['plugins/undo.js'][12]++; + var me = this, maxUndoCount = (me.options.maxUndoCount || 20), maxInputCount = (me.options.maxInputCount || 20), fillchar = new RegExp((domUtils.fillChar + "|"), "gi"); + _$jscoverage['plugins/undo.js'][16]++; + var noNeedFillCharTags = {ol: 1, ul: 1, table: 1, tbody: 1, tr: 1, body: 1}; + _$jscoverage['plugins/undo.js'][19]++; + var orgState = me.options.autoClearEmptyNode; + _$jscoverage['plugins/undo.js'][20]++; + function compareAddr(indexA, indexB) { + _$jscoverage['plugins/undo.js'][21]++; + if ((indexA.length != indexB.length)) { + _$jscoverage['plugins/undo.js'][22]++; + return 0; + } + _$jscoverage['plugins/undo.js'][23]++; + for (var i = 0, l = indexA.length; (i < l); (i++)) { + _$jscoverage['plugins/undo.js'][24]++; + if ((indexA[i] != indexB[i])) { + _$jscoverage['plugins/undo.js'][25]++; + return 0; + } +} + _$jscoverage['plugins/undo.js'][27]++; + return 1; +} + _$jscoverage['plugins/undo.js'][30]++; + function compareRangeAddress(rngAddrA, rngAddrB) { + _$jscoverage['plugins/undo.js'][31]++; + if ((rngAddrA.collapsed != rngAddrB.collapsed)) { + _$jscoverage['plugins/undo.js'][32]++; + return 0; + } + _$jscoverage['plugins/undo.js'][34]++; + if (((! compareAddr(rngAddrA.startAddress, rngAddrB.startAddress)) || (! compareAddr(rngAddrA.endAddress, rngAddrB.endAddress)))) { + _$jscoverage['plugins/undo.js'][35]++; + return 0; + } + _$jscoverage['plugins/undo.js'][37]++; + return 1; +} + _$jscoverage['plugins/undo.js'][40]++; + function UndoManager() { + _$jscoverage['plugins/undo.js'][41]++; + this.list = []; + _$jscoverage['plugins/undo.js'][42]++; + this.index = 0; + _$jscoverage['plugins/undo.js'][43]++; + this.hasUndo = false; + _$jscoverage['plugins/undo.js'][44]++; + this.hasRedo = false; + _$jscoverage['plugins/undo.js'][45]++; + this.undo = (function () { + _$jscoverage['plugins/undo.js'][46]++; + if (this.hasUndo) { + _$jscoverage['plugins/undo.js'][47]++; + if (((! this.list[(this.index - 1)]) && (this.list.length == 1))) { + _$jscoverage['plugins/undo.js'][48]++; + this.reset(); + _$jscoverage['plugins/undo.js'][49]++; + return; + } + _$jscoverage['plugins/undo.js'][51]++; + while ((this.list[this.index].content == this.list[(this.index - 1)].content)) { + _$jscoverage['plugins/undo.js'][52]++; + (this.index--); + _$jscoverage['plugins/undo.js'][53]++; + if ((this.index == 0)) { + _$jscoverage['plugins/undo.js'][54]++; + return this.restore(0); + } +} + _$jscoverage['plugins/undo.js'][57]++; + this.restore((--this.index)); + } +}); + _$jscoverage['plugins/undo.js'][60]++; + this.redo = (function () { + _$jscoverage['plugins/undo.js'][61]++; + if (this.hasRedo) { + _$jscoverage['plugins/undo.js'][62]++; + while ((this.list[this.index].content == this.list[(this.index + 1)].content)) { + _$jscoverage['plugins/undo.js'][63]++; + (this.index++); + _$jscoverage['plugins/undo.js'][64]++; + if ((this.index == (this.list.length - 1))) { + _$jscoverage['plugins/undo.js'][65]++; + return this.restore(this.index); + } +} + _$jscoverage['plugins/undo.js'][68]++; + this.restore((++this.index)); + } +}); + _$jscoverage['plugins/undo.js'][72]++; + this.restore = (function () { + _$jscoverage['plugins/undo.js'][73]++; + var me = this.editor; + _$jscoverage['plugins/undo.js'][74]++; + var scene = this.list[this.index]; + _$jscoverage['plugins/undo.js'][75]++; + var root = UE.htmlparser(scene.content.replace(fillchar, "")); + _$jscoverage['plugins/undo.js'][76]++; + me.options.autoClearEmptyNode = false; + _$jscoverage['plugins/undo.js'][77]++; + me.filterInputRule(root); + _$jscoverage['plugins/undo.js'][78]++; + me.options.autoClearEmptyNode = orgState; + _$jscoverage['plugins/undo.js'][81]++; + me.document.body.innerHTML = root.toHtml(); + _$jscoverage['plugins/undo.js'][82]++; + me.fireEvent("afterscencerestore"); + _$jscoverage['plugins/undo.js'][84]++; + if (browser.ie) { + _$jscoverage['plugins/undo.js'][85]++; + utils.each(domUtils.getElementsByTagName(me.document, "td th caption p"), (function (node) { + _$jscoverage['plugins/undo.js'][86]++; + if (domUtils.isEmptyNode(node)) { + _$jscoverage['plugins/undo.js'][87]++; + domUtils.fillNode(me.document, node); + } +})); + } + _$jscoverage['plugins/undo.js'][92]++; + try { + _$jscoverage['plugins/undo.js'][93]++; + var rng = new (dom.Range)(me.document).moveToAddress(scene.address); + _$jscoverage['plugins/undo.js'][94]++; + rng.select(noNeedFillCharTags[rng.startContainer.nodeName.toLowerCase()]); + } + catch (e) { + } + _$jscoverage['plugins/undo.js'][97]++; + this.update(); + _$jscoverage['plugins/undo.js'][98]++; + this.clearKey(); + _$jscoverage['plugins/undo.js'][100]++; + me.fireEvent("reset", true); +}); + _$jscoverage['plugins/undo.js'][103]++; + this.getScene = (function () { + _$jscoverage['plugins/undo.js'][104]++; + var me = this.editor; + _$jscoverage['plugins/undo.js'][105]++; + var rng = me.selection.getRange(), rngAddress = rng.createAddress(false, true); + _$jscoverage['plugins/undo.js'][107]++; + me.fireEvent("beforegetscene"); + _$jscoverage['plugins/undo.js'][108]++; + var root = UE.htmlparser(me.body.innerHTML); + _$jscoverage['plugins/undo.js'][109]++; + me.options.autoClearEmptyNode = false; + _$jscoverage['plugins/undo.js'][110]++; + me.filterOutputRule(root); + _$jscoverage['plugins/undo.js'][111]++; + me.options.autoClearEmptyNode = orgState; + _$jscoverage['plugins/undo.js'][112]++; + var cont = root.toHtml(); + _$jscoverage['plugins/undo.js'][116]++; + me.fireEvent("aftergetscene"); + _$jscoverage['plugins/undo.js'][118]++; + return ({address: rngAddress, content: cont}); +}); + _$jscoverage['plugins/undo.js'][123]++; + this.save = (function (notCompareRange, notSetCursor) { + _$jscoverage['plugins/undo.js'][124]++; + clearTimeout(saveSceneTimer); + _$jscoverage['plugins/undo.js'][125]++; + var currentScene = this.getScene(notSetCursor), lastScene = this.list[this.index]; + _$jscoverage['plugins/undo.js'][128]++; + if ((lastScene && (lastScene.content == currentScene.content) && (notCompareRange? 1: compareRangeAddress(lastScene.address, currentScene.address)))) { + _$jscoverage['plugins/undo.js'][131]++; + return; + } + _$jscoverage['plugins/undo.js'][133]++; + this.list = this.list.slice(0, (this.index + 1)); + _$jscoverage['plugins/undo.js'][134]++; + this.list.push(currentScene); + _$jscoverage['plugins/undo.js'][136]++; + if ((this.list.length > maxUndoCount)) { + _$jscoverage['plugins/undo.js'][137]++; + this.list.shift(); + } + _$jscoverage['plugins/undo.js'][139]++; + this.index = (this.list.length - 1); + _$jscoverage['plugins/undo.js'][140]++; + this.clearKey(); + _$jscoverage['plugins/undo.js'][142]++; + this.update(); +}); + _$jscoverage['plugins/undo.js'][145]++; + this.update = (function () { + _$jscoverage['plugins/undo.js'][146]++; + this.hasRedo = (! (! this.list[(this.index + 1)])); + _$jscoverage['plugins/undo.js'][147]++; + this.hasUndo = (! (! this.list[(this.index - 1)])); +}); + _$jscoverage['plugins/undo.js'][149]++; + this.reset = (function () { + _$jscoverage['plugins/undo.js'][150]++; + this.list = []; + _$jscoverage['plugins/undo.js'][151]++; + this.index = 0; + _$jscoverage['plugins/undo.js'][152]++; + this.hasUndo = false; + _$jscoverage['plugins/undo.js'][153]++; + this.hasRedo = false; + _$jscoverage['plugins/undo.js'][154]++; + this.clearKey(); +}); + _$jscoverage['plugins/undo.js'][156]++; + this.clearKey = (function () { + _$jscoverage['plugins/undo.js'][157]++; + keycont = 0; + _$jscoverage['plugins/undo.js'][158]++; + lastKeyCode = null; +}); +} + _$jscoverage['plugins/undo.js'][162]++; + me.undoManger = new UndoManager(); + _$jscoverage['plugins/undo.js'][163]++; + me.undoManger.editor = me; + _$jscoverage['plugins/undo.js'][164]++; + function saveScene() { + _$jscoverage['plugins/undo.js'][165]++; + this.undoManger.save(); +} + _$jscoverage['plugins/undo.js'][168]++; + me.addListener("saveScene", (function () { + _$jscoverage['plugins/undo.js'][169]++; + var args = Array.prototype.splice.call(arguments, 1); + _$jscoverage['plugins/undo.js'][170]++; + this.undoManger.save.apply(this.undoManger, args); +})); + _$jscoverage['plugins/undo.js'][173]++; + me.addListener("beforeexeccommand", saveScene); + _$jscoverage['plugins/undo.js'][174]++; + me.addListener("afterexeccommand", saveScene); + _$jscoverage['plugins/undo.js'][176]++; + me.addListener("reset", (function (type, exclude) { + _$jscoverage['plugins/undo.js'][177]++; + if ((! exclude)) { + _$jscoverage['plugins/undo.js'][178]++; + this.undoManger.reset(); + } +})); + _$jscoverage['plugins/undo.js'][181]++; + me.commands.redo = (me.commands.undo = {execCommand: (function (cmdName) { + _$jscoverage['plugins/undo.js'][183]++; + (this.undoManger[cmdName])(); +}), queryCommandState: (function (cmdName) { + _$jscoverage['plugins/undo.js'][186]++; + return (this.undoManger[("has" + ((cmdName.toLowerCase() == "undo")? "Undo": "Redo"))]? 0: -1); +}), notNeedUndo: 1}); + _$jscoverage['plugins/undo.js'][191]++; + var keys = {16: 1, 17: 1, 18: 1, 37: 1, 38: 1, 39: 1, 40: 1}, keycont = 0, lastKeyCode; + _$jscoverage['plugins/undo.js'][200]++; + var inputType = false; + _$jscoverage['plugins/undo.js'][201]++; + me.addListener("ready", (function () { + _$jscoverage['plugins/undo.js'][202]++; + domUtils.on(this.body, "compositionstart", (function () { + _$jscoverage['plugins/undo.js'][203]++; + inputType = true; +})); + _$jscoverage['plugins/undo.js'][205]++; + domUtils.on(this.body, "compositionend", (function () { + _$jscoverage['plugins/undo.js'][206]++; + inputType = false; +})); +})); + _$jscoverage['plugins/undo.js'][210]++; + me.addshortcutkey({"Undo": "ctrl+90", "Redo": "ctrl+89"}); + _$jscoverage['plugins/undo.js'][215]++; + var isCollapsed = true; + _$jscoverage['plugins/undo.js'][216]++; + me.addListener("keydown", (function (type, evt) { + _$jscoverage['plugins/undo.js'][218]++; + var me = this; + _$jscoverage['plugins/undo.js'][219]++; + var keyCode = (evt.keyCode || evt.which); + _$jscoverage['plugins/undo.js'][220]++; + if (((! keys[keyCode]) && (! evt.ctrlKey) && (! evt.metaKey) && (! evt.shiftKey) && (! evt.altKey))) { + _$jscoverage['plugins/undo.js'][221]++; + if (inputType) { + _$jscoverage['plugins/undo.js'][222]++; + return; + } + _$jscoverage['plugins/undo.js'][224]++; + if ((! me.selection.getRange().collapsed)) { + _$jscoverage['plugins/undo.js'][225]++; + me.undoManger.save(false, true); + _$jscoverage['plugins/undo.js'][226]++; + isCollapsed = false; + _$jscoverage['plugins/undo.js'][227]++; + return; + } + _$jscoverage['plugins/undo.js'][229]++; + if ((me.undoManger.list.length == 0)) { + _$jscoverage['plugins/undo.js'][230]++; + me.undoManger.save(true); + } + _$jscoverage['plugins/undo.js'][232]++; + clearTimeout(saveSceneTimer); + _$jscoverage['plugins/undo.js'][233]++; + function save(cont) { + _$jscoverage['plugins/undo.js'][235]++; + if (cont.selection.getRange().collapsed) { + _$jscoverage['plugins/undo.js'][236]++; + cont.fireEvent("contentchange"); + } + _$jscoverage['plugins/undo.js'][237]++; + cont.undoManger.save(false, true); + _$jscoverage['plugins/undo.js'][238]++; + cont.fireEvent("selectionchange"); +} + _$jscoverage['plugins/undo.js'][240]++; + saveSceneTimer = setTimeout((function () { + _$jscoverage['plugins/undo.js'][241]++; + if (inputType) { + _$jscoverage['plugins/undo.js'][242]++; + var interalTimer = setInterval((function () { + _$jscoverage['plugins/undo.js'][243]++; + if ((! inputType)) { + _$jscoverage['plugins/undo.js'][244]++; + save(me); + _$jscoverage['plugins/undo.js'][245]++; + clearInterval(interalTimer); + } +}), 300); + _$jscoverage['plugins/undo.js'][248]++; + return; + } + _$jscoverage['plugins/undo.js'][250]++; + save(me); +}), 200); + _$jscoverage['plugins/undo.js'][253]++; + lastKeyCode = keyCode; + _$jscoverage['plugins/undo.js'][254]++; + (keycont++); + _$jscoverage['plugins/undo.js'][255]++; + if ((keycont >= maxInputCount)) { + _$jscoverage['plugins/undo.js'][256]++; + save(me); + } + } +})); + _$jscoverage['plugins/undo.js'][260]++; + me.addListener("keyup", (function (type, evt) { + _$jscoverage['plugins/undo.js'][261]++; + var keyCode = (evt.keyCode || evt.which); + _$jscoverage['plugins/undo.js'][262]++; + if (((! keys[keyCode]) && (! evt.ctrlKey) && (! evt.metaKey) && (! evt.shiftKey) && (! evt.altKey))) { + _$jscoverage['plugins/undo.js'][263]++; + if (inputType) { + _$jscoverage['plugins/undo.js'][264]++; + return; + } + _$jscoverage['plugins/undo.js'][265]++; + if ((! isCollapsed)) { + _$jscoverage['plugins/undo.js'][266]++; + this.undoManger.save(false, true); + _$jscoverage['plugins/undo.js'][267]++; + isCollapsed = true; + } + } +})); +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/video.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/video.js new file mode 100644 index 000000000..95e37bd9d --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/video.js @@ -0,0 +1,138 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/video.js']) { + _$jscoverage['plugins/video.js'] = []; + _$jscoverage['plugins/video.js'][7] = 0; + _$jscoverage['plugins/video.js'][9] = 0; + _$jscoverage['plugins/video.js'][21] = 0; + _$jscoverage['plugins/video.js'][22] = 0; + _$jscoverage['plugins/video.js'][33] = 0; + _$jscoverage['plugins/video.js'][34] = 0; + _$jscoverage['plugins/video.js'][35] = 0; + _$jscoverage['plugins/video.js'][37] = 0; + _$jscoverage['plugins/video.js'][38] = 0; + _$jscoverage['plugins/video.js'][43] = 0; + _$jscoverage['plugins/video.js'][44] = 0; + _$jscoverage['plugins/video.js'][46] = 0; + _$jscoverage['plugins/video.js'][47] = 0; + _$jscoverage['plugins/video.js'][93] = 0; + _$jscoverage['plugins/video.js'][95] = 0; + _$jscoverage['plugins/video.js'][96] = 0; + _$jscoverage['plugins/video.js'][97] = 0; + _$jscoverage['plugins/video.js'][98] = 0; + _$jscoverage['plugins/video.js'][99] = 0; + _$jscoverage['plugins/video.js'][101] = 0; + _$jscoverage['plugins/video.js'][102] = 0; + _$jscoverage['plugins/video.js'][103] = 0; + _$jscoverage['plugins/video.js'][104] = 0; + _$jscoverage['plugins/video.js'][105] = 0; + _$jscoverage['plugins/video.js'][106] = 0; + _$jscoverage['plugins/video.js'][107] = 0; + _$jscoverage['plugins/video.js'][111] = 0; + _$jscoverage['plugins/video.js'][113] = 0; +} +_$jscoverage['plugins/video.js'].source = ["/**"," * video插件, 为UEditor提供视频插入支持"," * @file"," * @since 1.2.6.1"," */","","UE.plugins['video'] = function (){",""," var me =this,"," div;",""," /*"," * 创建插入视频字符窜"," * @param url 视频地址"," * @param width 视频宽度"," * @param height 视频高度"," * @param align 视频对齐"," * @param toEmbed 是否以flash代替显示"," * @param addParagraph 是否需要添加P 标签"," */"," function creatInsertStr(url,width,height,id,align,toEmbed){"," return !toEmbed ?",""," '<img ' + (id ? 'id=\"' + id+'\"' : '') + ' width=\"'+ width +'\" height=\"' + height + '\" _url=\"'+url+'\" class=\"edui-faked-video\"' +"," ' src=\"' + me.options.UEDITOR_HOME_URL+'themes/default/images/spacer.gif\" style=\"background:url('+me.options.UEDITOR_HOME_URL+'themes/default/images/videologo.gif) no-repeat center center; border:1px solid gray;'+(align ? 'float:' + align + ';': '')+'\" />'",""," :"," '<embed type=\"application/x-shockwave-flash\" class=\"edui-faked-video\" pluginspage=\"http://www.macromedia.com/go/getflashplayer\"' +"," ' src=\"' + url + '\" width=\"' + width + '\" height=\"' + height + '\"' + (align ? ' style=\"float:' + align + '\"': '') +"," ' wmode=\"transparent\" play=\"true\" loop=\"false\" menu=\"false\" allowscriptaccess=\"never\" allowfullscreen=\"true\" >';"," }",""," function switchImgAndEmbed(root,img2embed){"," utils.each(root.getNodesByTagName(img2embed ? 'img' : 'embed'),function(node){"," if(node.getAttr('class') == 'edui-faked-video'){",""," var html = creatInsertStr( img2embed ? node.getAttr('_url') : node.getAttr('src'),node.getAttr('width'),node.getAttr('height'),null,node.getStyle('float') || '',img2embed);"," node.parentNode.replaceChild(UE.uNode.createElement(html),node)"," }"," })"," }",""," me.addOutputRule(function(root){"," switchImgAndEmbed(root,true)"," });"," me.addInputRule(function(root){"," switchImgAndEmbed(root)"," });",""," /**"," * 插入视频"," * @command insertvideo"," * @method execCommand"," * @param { String } cmd 命令字符串"," * @param { KeyValueMap } videoObj 键值对对象, 描述一个视频的所有属性"," * @example"," * ```javascript"," *"," * //editor 是编辑器实例"," * editor.execCommand( 'insertvideo', {"," *"," * } );"," * ```"," */",""," /**"," * 插入视频"," * @command insertvideo"," * @method execCommand"," * @param { String } cmd 命令字符串"," * @param { Array } videoArr 需要插入的视频的数组, 其中的每一个元素都是一个键值对对象, 描述了一个视频的所有属性"," * @example"," * ```javascript"," *"," * //editor 是编辑器实例"," * editor.execCommand( 'insertvideo', [ ] );"," * ```"," */",""," /**"," * 查询当前光标所在处是否是一个视频"," * @command insertvideo"," * @method queryCommandState"," * @param { String } cmd 需要查询的命令字符串"," * @return { int } 如果当前光标所在处的元素是一个视频对象, 则返回1,否则返回0"," * @example"," * ```javascript"," *"," * //editor 是编辑器实例"," * editor.queryCommandState( 'insertvideo' );"," * ```"," */"," me.commands[\"insertvideo\"] = {"," execCommand: function (cmd, videoObjs){"," videoObjs = utils.isArray(videoObjs)?videoObjs:[videoObjs];"," var html = [],id = 'tmpVedio';"," for(var i=0,vi,len = videoObjs.length;i<len;i++){"," vi = videoObjs[i];"," html.push(creatInsertStr( vi.url, vi.width || 420, vi.height || 280, id + i,null,false));"," }"," 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)"," }"," },"," queryCommandState : function(){"," var img = me.selection.getRange().getClosedNode(),"," flag = img && (img.className == \"edui-faked-video\");"," return flag ? 1 : 0;"," }"," };","};"]; +_$jscoverage['plugins/video.js'][7]++; +UE.plugins.video = (function () { + _$jscoverage['plugins/video.js'][9]++; + var me = this, div; + _$jscoverage['plugins/video.js'][21]++; + function creatInsertStr(url, width, height, id, align, toEmbed) { + _$jscoverage['plugins/video.js'][22]++; + return ((! toEmbed)? (""): ("")); +} + _$jscoverage['plugins/video.js'][33]++; + function switchImgAndEmbed(root, img2embed) { + _$jscoverage['plugins/video.js'][34]++; + utils.each(root.getNodesByTagName((img2embed? "img": "embed")), (function (node) { + _$jscoverage['plugins/video.js'][35]++; + if ((node.getAttr("class") == "edui-faked-video")) { + _$jscoverage['plugins/video.js'][37]++; + var html = creatInsertStr((img2embed? node.getAttr("_url"): node.getAttr("src")), node.getAttr("width"), node.getAttr("height"), null, (node.getStyle("float") || ""), img2embed); + _$jscoverage['plugins/video.js'][38]++; + node.parentNode.replaceChild(UE.uNode.createElement(html), node); + } +})); +} + _$jscoverage['plugins/video.js'][43]++; + me.addOutputRule((function (root) { + _$jscoverage['plugins/video.js'][44]++; + switchImgAndEmbed(root, true); +})); + _$jscoverage['plugins/video.js'][46]++; + me.addInputRule((function (root) { + _$jscoverage['plugins/video.js'][47]++; + switchImgAndEmbed(root); +})); + _$jscoverage['plugins/video.js'][93]++; + me.commands.insertvideo = {execCommand: (function (cmd, videoObjs) { + _$jscoverage['plugins/video.js'][95]++; + videoObjs = (utils.isArray(videoObjs)? videoObjs: [videoObjs]); + _$jscoverage['plugins/video.js'][96]++; + var html = [], id = "tmpVedio"; + _$jscoverage['plugins/video.js'][97]++; + for (var i = 0, vi, len = videoObjs.length; (i < len); (i++)) { + _$jscoverage['plugins/video.js'][98]++; + vi = videoObjs[i]; + _$jscoverage['plugins/video.js'][99]++; + html.push(creatInsertStr(vi.url, (vi.width || 420), (vi.height || 280), (id + i), null, false)); +} + _$jscoverage['plugins/video.js'][101]++; + me.execCommand("inserthtml", html.join(""), true); + _$jscoverage['plugins/video.js'][102]++; + var rng = this.selection.getRange(); + _$jscoverage['plugins/video.js'][103]++; + for (var i = 0, len = videoObjs.length; (i < len); (i++)) { + _$jscoverage['plugins/video.js'][104]++; + var img = this.document.getElementById(("tmpVedio" + i)); + _$jscoverage['plugins/video.js'][105]++; + domUtils.removeAttributes(img, "id"); + _$jscoverage['plugins/video.js'][106]++; + rng.selectNode(img).select(); + _$jscoverage['plugins/video.js'][107]++; + me.execCommand("imagefloat", videoObjs[i].align); +} +}), queryCommandState: (function () { + _$jscoverage['plugins/video.js'][111]++; + var img = me.selection.getRange().getClosedNode(), flag = (img && (img.className == "edui-faked-video")); + _$jscoverage['plugins/video.js'][113]++; + return (flag? 1: 0); +})}; +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/webapp.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/webapp.js new file mode 100644 index 000000000..75660c5ce --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/webapp.js @@ -0,0 +1,119 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/webapp.js']) { + _$jscoverage['plugins/webapp.js'] = []; + _$jscoverage['plugins/webapp.js'][28] = 0; + _$jscoverage['plugins/webapp.js'][29] = 0; + _$jscoverage['plugins/webapp.js'][30] = 0; + _$jscoverage['plugins/webapp.js'][31] = 0; + _$jscoverage['plugins/webapp.js'][39] = 0; + _$jscoverage['plugins/webapp.js'][40] = 0; + _$jscoverage['plugins/webapp.js'][42] = 0; + _$jscoverage['plugins/webapp.js'][43] = 0; + _$jscoverage['plugins/webapp.js'][44] = 0; + _$jscoverage['plugins/webapp.js'][46] = 0; + _$jscoverage['plugins/webapp.js'][47] = 0; + _$jscoverage['plugins/webapp.js'][48] = 0; + _$jscoverage['plugins/webapp.js'][52] = 0; + _$jscoverage['plugins/webapp.js'][53] = 0; + _$jscoverage['plugins/webapp.js'][55] = 0; + _$jscoverage['plugins/webapp.js'][56] = 0; + _$jscoverage['plugins/webapp.js'][58] = 0; + _$jscoverage['plugins/webapp.js'][59] = 0; + _$jscoverage['plugins/webapp.js'][60] = 0; + _$jscoverage['plugins/webapp.js'][62] = 0; + _$jscoverage['plugins/webapp.js'][65] = 0; + _$jscoverage['plugins/webapp.js'][67] = 0; +} +_$jscoverage['plugins/webapp.js'].source = ["/**"," * 百度应用"," * @file"," * @since 1.2.6.1"," */","","","/**"," * 在当前光标处插入一个百度应用, 需要百度APPKey"," * @command webapp"," * @method execCommand"," * @param { KeyValueMap } 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 ? '<p>' : '') + '<img title=\"'+obj.title+'\" width=\"' + obj.width + '\" height=\"' + obj.height + '\"' +"," ' src=\"' + me.options.UEDITOR_HOME_URL + 'themes/default/images/spacer.gif\" style=\"background:url(' + obj.logo+') no-repeat center center; border:1px solid gray;\" class=\"edui-faked-webapp\" _url=\"' + obj.url + '\" />' +"," (addParagraph ? '</p>' : '')"," :"," '<iframe class=\"edui-faked-webapp\" title=\"'+obj.title+'\" width=\"' + obj.width + '\" height=\"' + obj.height + '\" scrolling=\"no\" frameborder=\"0\" src=\"' + obj.url + '\" logo_url = '+obj.logo+'></iframe>';"," }",""," 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 ) );"," }"," };","};"]; +_$jscoverage['plugins/webapp.js'][28]++; +UE.plugins.webapp = (function () { + _$jscoverage['plugins/webapp.js'][29]++; + var me = this; + _$jscoverage['plugins/webapp.js'][30]++; + function createInsertStr(obj, toIframe, addParagraph) { + _$jscoverage['plugins/webapp.js'][31]++; + return ((! toIframe)? ((addParagraph? "

    ": "") + "" + (addParagraph? "

    ": "")): ("")); +} + _$jscoverage['plugins/webapp.js'][39]++; + function switchImgAndIframe(img2frame) { + _$jscoverage['plugins/webapp.js'][40]++; + var tmpdiv, nodes = domUtils.getElementsByTagName(me.document, ((! img2frame)? "iframe": "img")); + _$jscoverage['plugins/webapp.js'][42]++; + for (var i = 0, node; (node = nodes[(i++)]);) { + _$jscoverage['plugins/webapp.js'][43]++; + if ((node.className != "edui-faked-webapp")) { + _$jscoverage['plugins/webapp.js'][44]++; + continue; + } + _$jscoverage['plugins/webapp.js'][46]++; + tmpdiv = me.document.createElement("div"); + _$jscoverage['plugins/webapp.js'][47]++; + 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); + _$jscoverage['plugins/webapp.js'][48]++; + node.parentNode.replaceChild(tmpdiv.firstChild, node); +} +} + _$jscoverage['plugins/webapp.js'][52]++; + me.addListener("beforegetcontent", (function () { + _$jscoverage['plugins/webapp.js'][53]++; + switchImgAndIframe(true); +})); + _$jscoverage['plugins/webapp.js'][55]++; + me.addListener("aftersetcontent", (function () { + _$jscoverage['plugins/webapp.js'][56]++; + switchImgAndIframe(false); +})); + _$jscoverage['plugins/webapp.js'][58]++; + me.addListener("aftergetcontent", (function (cmdName) { + _$jscoverage['plugins/webapp.js'][59]++; + if (((cmdName == "aftergetcontent") && me.queryCommandState("source"))) { + _$jscoverage['plugins/webapp.js'][60]++; + return; + } + _$jscoverage['plugins/webapp.js'][62]++; + switchImgAndIframe(false); +})); + _$jscoverage['plugins/webapp.js'][65]++; + me.commands.webapp = {execCommand: (function (cmd, obj) { + _$jscoverage['plugins/webapp.js'][67]++; + me.execCommand("inserthtml", createInsertStr(obj, false, true)); +})}; +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/wordcount.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/wordcount.js new file mode 100644 index 000000000..08a67d399 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/wordcount.js @@ -0,0 +1,90 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/wordcount.js']) { + _$jscoverage['plugins/wordcount.js'] = []; + _$jscoverage['plugins/wordcount.js'][13] = 0; + _$jscoverage['plugins/wordcount.js'][14] = 0; + _$jscoverage['plugins/wordcount.js'][15] = 0; + _$jscoverage['plugins/wordcount.js'][16] = 0; + _$jscoverage['plugins/wordcount.js'][18] = 0; + _$jscoverage['plugins/wordcount.js'][19] = 0; + _$jscoverage['plugins/wordcount.js'][20] = 0; + _$jscoverage['plugins/wordcount.js'][21] = 0; + _$jscoverage['plugins/wordcount.js'][22] = 0; + _$jscoverage['plugins/wordcount.js'][25] = 0; + _$jscoverage['plugins/wordcount.js'][26] = 0; + _$jscoverage['plugins/wordcount.js'][27] = 0; + _$jscoverage['plugins/wordcount.js'][28] = 0; +} +_$jscoverage['plugins/wordcount.js'].source = ["///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.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)"," })"," });","};"]; +_$jscoverage['plugins/wordcount.js'][13]++; +UE.plugins.wordcount = (function () { + _$jscoverage['plugins/wordcount.js'][14]++; + var me = this; + _$jscoverage['plugins/wordcount.js'][15]++; + me.addListener("contentchange", (function () { + _$jscoverage['plugins/wordcount.js'][16]++; + me.fireEvent("wordcount"); +})); + _$jscoverage['plugins/wordcount.js'][18]++; + var timer; + _$jscoverage['plugins/wordcount.js'][19]++; + me.addListener("ready", (function () { + _$jscoverage['plugins/wordcount.js'][20]++; + var me = this; + _$jscoverage['plugins/wordcount.js'][21]++; + domUtils.on(me.body, "keyup", (function (evt) { + _$jscoverage['plugins/wordcount.js'][22]++; + var code = (evt.keyCode || evt.which), ignores = {"16": 1, "18": 1, "20": 1, "37": 1, "38": 1, "39": 1, "40": 1}; + _$jscoverage['plugins/wordcount.js'][25]++; + if ((code in ignores)) { + _$jscoverage['plugins/wordcount.js'][25]++; + return; + } + _$jscoverage['plugins/wordcount.js'][26]++; + clearTimeout(timer); + _$jscoverage['plugins/wordcount.js'][27]++; + timer = setTimeout((function () { + _$jscoverage['plugins/wordcount.js'][28]++; + me.fireEvent("wordcount"); +}), 200); +})); +})); +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/wordimage.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/wordimage.js new file mode 100644 index 000000000..04237c9b1 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/plugins/wordimage.js @@ -0,0 +1,113 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['plugins/wordimage.js']) { + _$jscoverage['plugins/wordimage.js'] = []; + _$jscoverage['plugins/wordimage.js'][7] = 0; + _$jscoverage['plugins/wordimage.js'][8] = 0; + _$jscoverage['plugins/wordimage.js'][10] = 0; + _$jscoverage['plugins/wordimage.js'][11] = 0; + _$jscoverage['plugins/wordimage.js'][12] = 0; + _$jscoverage['plugins/wordimage.js'][16] = 0; + _$jscoverage['plugins/wordimage.js'][17] = 0; + _$jscoverage['plugins/wordimage.js'][53] = 0; + _$jscoverage['plugins/wordimage.js'][55] = 0; + _$jscoverage['plugins/wordimage.js'][56] = 0; + _$jscoverage['plugins/wordimage.js'][57] = 0; + _$jscoverage['plugins/wordimage.js'][58] = 0; + _$jscoverage['plugins/wordimage.js'][59] = 0; + _$jscoverage['plugins/wordimage.js'][61] = 0; + _$jscoverage['plugins/wordimage.js'][62] = 0; + _$jscoverage['plugins/wordimage.js'][66] = 0; + _$jscoverage['plugins/wordimage.js'][67] = 0; + _$jscoverage['plugins/wordimage.js'][68] = 0; + _$jscoverage['plugins/wordimage.js'][69] = 0; + _$jscoverage['plugins/wordimage.js'][72] = 0; +} +_$jscoverage['plugins/wordimage.js'].source = ["/**"," * 本地图片引导上传插件"," * @file"," * @since 1.2.6.1"," */","","UE.plugins[\"wordimage\"] = function () {"," var me = this,"," images;"," me.addInputRule(function (root) {"," utils.each(root.getNodesByTagName('img'), function (img) {"," var attrs = img.attrs,"," flag = parseInt(attrs.width) < 128 || parseInt(attrs.height) < 43,"," opt = me.options,"," src = opt.UEDITOR_HOME_URL + 'themes/default/images/spacer.gif';"," if (attrs['_src'] && attrs['_src'].indexOf(\"file:///\")!==-1) {"," img.setAttr({"," width:attrs.width,"," height:attrs.height,"," alt:attrs.alt,"," word_img:attrs._src,"," src: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'"," })"," }"," })"," });",""," /**"," * 粘贴word文档的内容时,运行该命令,会把编辑区域里的word图片地址,赋值到editor.word_img的数组里面"," * @command wordimage"," * @method execCommand"," * @param { String } cmd 命令字符串"," * @example"," * ```javascript"," * editor.execCommand( 'wordimage');"," * ```"," */",""," /**"," * 查询当前是否有word文档粘贴进来的图片"," * @command wordimage"," * @method queryCommandState"," * @param { String } cmd 命令字符串"," * @return { int } 如果当前编辑区域有word文档的粘贴进来的图片,则返回1,否则返回-1"," * @example"," * ```javascript"," * editor.queryCommandState( 'wordimage' );"," * ```"," */",""," me.commands['wordimage'] = {"," execCommand:function () {"," images = domUtils.getElementsByTagName(me.document.body, \"img\");"," var urlList = [];"," for (var i = 0, ci; ci = images[i++];) {"," var url = ci.getAttribute(\"word_img\");"," url && urlList.push(url);"," }"," if (images.length) {"," this[\"word_img\"] = urlList;"," }"," },"," queryCommandState:function () {"," images = domUtils.getElementsByTagName(me.document.body, \"img\");"," for (var i = 0, ci; ci = images[i++];) {"," if (ci.getAttribute(\"word_img\")) {"," return 1;"," }"," }"," return -1;"," }"," };","","};"]; +_$jscoverage['plugins/wordimage.js'][7]++; +UE.plugins.wordimage = (function () { + _$jscoverage['plugins/wordimage.js'][8]++; + var me = this, images; + _$jscoverage['plugins/wordimage.js'][10]++; + me.addInputRule((function (root) { + _$jscoverage['plugins/wordimage.js'][11]++; + utils.each(root.getNodesByTagName("img"), (function (img) { + _$jscoverage['plugins/wordimage.js'][12]++; + var attrs = img.attrs, flag = ((parseInt(attrs.width) < 128) || (parseInt(attrs.height) < 43)), opt = me.options, src = (opt.UEDITOR_HOME_URL + "themes/default/images/spacer.gif"); + _$jscoverage['plugins/wordimage.js'][16]++; + if ((attrs._src && (attrs._src.indexOf("file:///") !== -1))) { + _$jscoverage['plugins/wordimage.js'][17]++; + img.setAttr({width: attrs.width, height: attrs.height, alt: attrs.alt, word_img: attrs._src, src: 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")}); + } +})); +})); + _$jscoverage['plugins/wordimage.js'][53]++; + me.commands.wordimage = {execCommand: (function () { + _$jscoverage['plugins/wordimage.js'][55]++; + images = domUtils.getElementsByTagName(me.document.body, "img"); + _$jscoverage['plugins/wordimage.js'][56]++; + var urlList = []; + _$jscoverage['plugins/wordimage.js'][57]++; + for (var i = 0, ci; (ci = images[(i++)]);) { + _$jscoverage['plugins/wordimage.js'][58]++; + var url = ci.getAttribute("word_img"); + _$jscoverage['plugins/wordimage.js'][59]++; + (url && urlList.push(url)); +} + _$jscoverage['plugins/wordimage.js'][61]++; + if (images.length) { + _$jscoverage['plugins/wordimage.js'][62]++; + this.word_img = urlList; + } +}), queryCommandState: (function () { + _$jscoverage['plugins/wordimage.js'][66]++; + images = domUtils.getElementsByTagName(me.document.body, "img"); + _$jscoverage['plugins/wordimage.js'][67]++; + for (var i = 0, ci; (ci = images[(i++)]);) { + _$jscoverage['plugins/wordimage.js'][68]++; + if (ci.getAttribute("word_img")) { + _$jscoverage['plugins/wordimage.js'][69]++; + return 1; + } +} + _$jscoverage['plugins/wordimage.js'][72]++; + return -1; +})}; +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/autotypesetbutton.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/autotypesetbutton.js new file mode 100644 index 000000000..3cf697733 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/autotypesetbutton.js @@ -0,0 +1,207 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['ui/autotypesetbutton.js']) { + _$jscoverage['ui/autotypesetbutton.js'] = []; + _$jscoverage['ui/autotypesetbutton.js'][6] = 0; + _$jscoverage['ui/autotypesetbutton.js'][7] = 0; + _$jscoverage['ui/autotypesetbutton.js'][12] = 0; + _$jscoverage['ui/autotypesetbutton.js'][13] = 0; + _$jscoverage['ui/autotypesetbutton.js'][15] = 0; + _$jscoverage['ui/autotypesetbutton.js'][16] = 0; + _$jscoverage['ui/autotypesetbutton.js'][22] = 0; + _$jscoverage['ui/autotypesetbutton.js'][24] = 0; + _$jscoverage['ui/autotypesetbutton.js'][26] = 0; + _$jscoverage['ui/autotypesetbutton.js'][27] = 0; + _$jscoverage['ui/autotypesetbutton.js'][28] = 0; + _$jscoverage['ui/autotypesetbutton.js'][29] = 0; + _$jscoverage['ui/autotypesetbutton.js'][30] = 0; + _$jscoverage['ui/autotypesetbutton.js'][31] = 0; + _$jscoverage['ui/autotypesetbutton.js'][32] = 0; + _$jscoverage['ui/autotypesetbutton.js'][33] = 0; + _$jscoverage['ui/autotypesetbutton.js'][35] = 0; + _$jscoverage['ui/autotypesetbutton.js'][36] = 0; + _$jscoverage['ui/autotypesetbutton.js'][37] = 0; + _$jscoverage['ui/autotypesetbutton.js'][38] = 0; + _$jscoverage['ui/autotypesetbutton.js'][39] = 0; + _$jscoverage['ui/autotypesetbutton.js'][44] = 0; + _$jscoverage['ui/autotypesetbutton.js'][49] = 0; + _$jscoverage['ui/autotypesetbutton.js'][50] = 0; + _$jscoverage['ui/autotypesetbutton.js'][51] = 0; + _$jscoverage['ui/autotypesetbutton.js'][52] = 0; + _$jscoverage['ui/autotypesetbutton.js'][55] = 0; + _$jscoverage['ui/autotypesetbutton.js'][57] = 0; + _$jscoverage['ui/autotypesetbutton.js'][59] = 0; + _$jscoverage['ui/autotypesetbutton.js'][60] = 0; + _$jscoverage['ui/autotypesetbutton.js'][66] = 0; + _$jscoverage['ui/autotypesetbutton.js'][67] = 0; + _$jscoverage['ui/autotypesetbutton.js'][68] = 0; + _$jscoverage['ui/autotypesetbutton.js'][69] = 0; + _$jscoverage['ui/autotypesetbutton.js'][70] = 0; + _$jscoverage['ui/autotypesetbutton.js'][74] = 0; + _$jscoverage['ui/autotypesetbutton.js'][75] = 0; + _$jscoverage['ui/autotypesetbutton.js'][76] = 0; + _$jscoverage['ui/autotypesetbutton.js'][77] = 0; + _$jscoverage['ui/autotypesetbutton.js'][78] = 0; + _$jscoverage['ui/autotypesetbutton.js'][81] = 0; + _$jscoverage['ui/autotypesetbutton.js'][82] = 0; + _$jscoverage['ui/autotypesetbutton.js'][83] = 0; + _$jscoverage['ui/autotypesetbutton.js'][84] = 0; + _$jscoverage['ui/autotypesetbutton.js'][86] = 0; + _$jscoverage['ui/autotypesetbutton.js'][88] = 0; + _$jscoverage['ui/autotypesetbutton.js'][91] = 0; +} +_$jscoverage['ui/autotypesetbutton.js'].source = ["///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 = me.editor.options.autotypeset,"," 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/ig.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;"," }"," }"," }"," }"," 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 : '';"," }",""," me.editor.options.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()"," };"," flag = 1;"," });"," this.initSplitButton();"," }"," };"," utils.inherits(AutoTypeSetButton, SplitButton);","","})();"]; +_$jscoverage['ui/autotypesetbutton.js'][6]++; +(function () { + _$jscoverage['ui/autotypesetbutton.js'][7]++; + 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) { + _$jscoverage['ui/autotypesetbutton.js'][12]++; + this.initOptions(options); + _$jscoverage['ui/autotypesetbutton.js'][13]++; + this.initAutoTypeSetButton(); +})); + _$jscoverage['ui/autotypesetbutton.js'][15]++; + function getPara(me) { + _$jscoverage['ui/autotypesetbutton.js'][16]++; + var opt = me.editor.options.autotypeset, cont = me.getDom(), editorId = me.editor.uid, inputType = null, attrName = null, ipts = domUtils.getElementsByTagName(cont, "input"); + _$jscoverage['ui/autotypesetbutton.js'][22]++; + for (var i = (ipts.length - 1), ipt; (ipt = ipts[(i--)]);) { + _$jscoverage['ui/autotypesetbutton.js'][24]++; + inputType = ipt.getAttribute("type"); + _$jscoverage['ui/autotypesetbutton.js'][26]++; + if ((inputType == "checkbox")) { + _$jscoverage['ui/autotypesetbutton.js'][27]++; + attrName = ipt.getAttribute("name"); + _$jscoverage['ui/autotypesetbutton.js'][28]++; + (opt[attrName] && (delete opt[attrName])); + _$jscoverage['ui/autotypesetbutton.js'][29]++; + if (ipt.checked) { + _$jscoverage['ui/autotypesetbutton.js'][30]++; + var attrValue = document.getElementById((attrName + "Value" + editorId)); + _$jscoverage['ui/autotypesetbutton.js'][31]++; + if (attrValue) { + _$jscoverage['ui/autotypesetbutton.js'][32]++; + if (/input/gi.test(attrValue.tagName)) { + _$jscoverage['ui/autotypesetbutton.js'][33]++; + opt[attrName] = attrValue.value; + } + else { + _$jscoverage['ui/autotypesetbutton.js'][35]++; + var iptChilds = attrValue.getElementsByTagName("input"); + _$jscoverage['ui/autotypesetbutton.js'][36]++; + for (var j = (iptChilds.length - 1), iptchild; (iptchild = iptChilds[(j--)]);) { + _$jscoverage['ui/autotypesetbutton.js'][37]++; + if (iptchild.checked) { + _$jscoverage['ui/autotypesetbutton.js'][38]++; + opt[attrName] = iptchild.value; + _$jscoverage['ui/autotypesetbutton.js'][39]++; + break; + } +} + } + } + else { + _$jscoverage['ui/autotypesetbutton.js'][44]++; + opt[attrName] = true; + } + } + } +} + _$jscoverage['ui/autotypesetbutton.js'][49]++; + var selects = domUtils.getElementsByTagName(cont, "select"); + _$jscoverage['ui/autotypesetbutton.js'][50]++; + for (var i = 0, si; (si = selects[(i++)]);) { + _$jscoverage['ui/autotypesetbutton.js'][51]++; + var attr = si.getAttribute("name"); + _$jscoverage['ui/autotypesetbutton.js'][52]++; + opt[attr] = (opt[attr]? si.value: ""); +} + _$jscoverage['ui/autotypesetbutton.js'][55]++; + me.editor.options.autotypeset = opt; +} + _$jscoverage['ui/autotypesetbutton.js'][57]++; + AutoTypeSetButton.prototype = {initAutoTypeSetButton: (function () { + _$jscoverage['ui/autotypesetbutton.js'][59]++; + var me = this; + _$jscoverage['ui/autotypesetbutton.js'][60]++; + this.popup = new Popup({content: new AutoTypeSetPicker({editor: me.editor}), "editor": me.editor, hide: (function () { + _$jscoverage['ui/autotypesetbutton.js'][66]++; + if (((! this._hidden) && this.getDom())) { + _$jscoverage['ui/autotypesetbutton.js'][67]++; + getPara(this); + _$jscoverage['ui/autotypesetbutton.js'][68]++; + this.getDom().style.display = "none"; + _$jscoverage['ui/autotypesetbutton.js'][69]++; + this._hidden = true; + _$jscoverage['ui/autotypesetbutton.js'][70]++; + this.fireEvent("hide"); + } +})}); + _$jscoverage['ui/autotypesetbutton.js'][74]++; + var flag = 0; + _$jscoverage['ui/autotypesetbutton.js'][75]++; + this.popup.addListener("postRenderAfter", (function () { + _$jscoverage['ui/autotypesetbutton.js'][76]++; + var popupUI = this; + _$jscoverage['ui/autotypesetbutton.js'][77]++; + if (flag) { + _$jscoverage['ui/autotypesetbutton.js'][77]++; + return; + } + _$jscoverage['ui/autotypesetbutton.js'][78]++; + var cont = this.getDom(), btn = cont.getElementsByTagName("button")[0]; + _$jscoverage['ui/autotypesetbutton.js'][81]++; + btn.onclick = (function () { + _$jscoverage['ui/autotypesetbutton.js'][82]++; + getPara(popupUI); + _$jscoverage['ui/autotypesetbutton.js'][83]++; + me.editor.execCommand("autotypeset"); + _$jscoverage['ui/autotypesetbutton.js'][84]++; + popupUI.hide(); +}); + _$jscoverage['ui/autotypesetbutton.js'][86]++; + flag = 1; +})); + _$jscoverage['ui/autotypesetbutton.js'][88]++; + this.initSplitButton(); +})}; + _$jscoverage['ui/autotypesetbutton.js'][91]++; + utils.inherits(AutoTypeSetButton, SplitButton); +})(); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/autotypesetpicker.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/autotypesetpicker.js new file mode 100644 index 000000000..e499278aa --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/autotypesetpicker.js @@ -0,0 +1,80 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['ui/autotypesetpicker.js']) { + _$jscoverage['ui/autotypesetpicker.js'] = []; + _$jscoverage['ui/autotypesetpicker.js'][3] = 0; + _$jscoverage['ui/autotypesetpicker.js'][4] = 0; + _$jscoverage['ui/autotypesetpicker.js'][7] = 0; + _$jscoverage['ui/autotypesetpicker.js'][8] = 0; + _$jscoverage['ui/autotypesetpicker.js'][9] = 0; + _$jscoverage['ui/autotypesetpicker.js'][11] = 0; + _$jscoverage['ui/autotypesetpicker.js'][13] = 0; + _$jscoverage['ui/autotypesetpicker.js'][16] = 0; + _$jscoverage['ui/autotypesetpicker.js'][20] = 0; + _$jscoverage['ui/autotypesetpicker.js'][23] = 0; + _$jscoverage['ui/autotypesetpicker.js'][48] = 0; +} +_$jscoverage['ui/autotypesetpicker.js'].source = ["///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;",""," return '<div id=\"##\" class=\"edui-autotypesetpicker %%\">' +"," '<div class=\"edui-autotypesetpicker-body\">' +"," '<table >' +"," '<tr><td nowrap colspan=\"2\"><input type=\"checkbox\" name=\"mergeEmptyline\" ' + (opt[\"mergeEmptyline\"] ? \"checked\" : \"\" ) + '>' + lang.mergeLine + '</td><td colspan=\"2\"><input type=\"checkbox\" name=\"removeEmptyline\" ' + (opt[\"removeEmptyline\"] ? \"checked\" : \"\" ) + '>' + lang.delLine + '</td></tr>' +"," '<tr><td nowrap colspan=\"2\"><input type=\"checkbox\" name=\"removeClass\" ' + (opt[\"removeClass\"] ? \"checked\" : \"\" ) + '>' + lang.removeFormat + '</td><td colspan=\"2\"><input type=\"checkbox\" name=\"indent\" ' + (opt[\"indent\"] ? \"checked\" : \"\" ) + '>' + lang.indent + '</td></tr>' +"," '<tr><td nowrap colspan=\"2\"><input type=\"checkbox\" name=\"textAlign\" ' + (opt[\"textAlign\"] ? \"checked\" : \"\" ) + '>' + lang.alignment + '</td><td colspan=\"2\" id=\"' + textAlignInputName + '\"><input type=\"radio\" name=\"'+ textAlignInputName +'\" value=\"left\" ' + ((opt[\"textAlign\"] && opt[\"textAlign\"] == \"left\") ? \"checked\" : \"\") + '>' + me.getLang(\"justifyleft\") + '<input type=\"radio\" name=\"'+ textAlignInputName +'\" value=\"center\" ' + ((opt[\"textAlign\"] && opt[\"textAlign\"] == \"center\") ? \"checked\" : \"\") + '>' + me.getLang(\"justifycenter\") + '<input type=\"radio\" name=\"'+ textAlignInputName +'\" value=\"right\" ' + ((opt[\"textAlign\"] && opt[\"textAlign\"] == \"right\") ? \"checked\" : \"\") + '>' + me.getLang(\"justifyright\") + ' </tr>' +"," '<tr><td nowrap colspan=\"2\"><input type=\"checkbox\" name=\"imageBlockLine\" ' + (opt[\"imageBlockLine\"] ? \"checked\" : \"\" ) + '>' + lang.imageFloat + '</td>' +"," '<td nowrap colspan=\"2\" id=\"'+ imageBlockInputName +'\">' +"," '<input type=\"radio\" name=\"'+ imageBlockInputName +'\" value=\"none\" ' + ((opt[\"imageBlockLine\"] && opt[\"imageBlockLine\"] == \"none\") ? \"checked\" : \"\") + '>' + me.getLang(\"default\") +"," '<input type=\"radio\" name=\"'+ imageBlockInputName +'\" value=\"left\" ' + ((opt[\"imageBlockLine\"] && opt[\"imageBlockLine\"] == \"left\") ? \"checked\" : \"\") + '>' + me.getLang(\"justifyleft\") +"," '<input type=\"radio\" name=\"'+ imageBlockInputName +'\" value=\"center\" ' + ((opt[\"imageBlockLine\"] && opt[\"imageBlockLine\"] == \"center\") ? \"checked\" : \"\") + '>' + me.getLang(\"justifycenter\") +"," '<input type=\"radio\" name=\"'+ imageBlockInputName +'\" value=\"right\" ' + ((opt[\"imageBlockLine\"] && opt[\"imageBlockLine\"] == \"right\") ? \"checked\" : \"\") + '>' + me.getLang(\"justifyright\") + '</tr>' +",""," '<tr><td nowrap colspan=\"2\"><input type=\"checkbox\" name=\"clearFontSize\" ' + (opt[\"clearFontSize\"] ? \"checked\" : \"\" ) + '>' + lang.removeFontsize + '</td><td colspan=\"2\"><input type=\"checkbox\" name=\"clearFontFamily\" ' + (opt[\"clearFontFamily\"] ? \"checked\" : \"\" ) + '>' + lang.removeFontFamily + '</td></tr>' +"," '<tr><td nowrap colspan=\"4\"><input type=\"checkbox\" name=\"removeEmptyNode\" ' + (opt[\"removeEmptyNode\"] ? \"checked\" : \"\" ) + '>' + lang.removeHtml + '</td></tr>' +"," '<tr><td nowrap colspan=\"4\"><input type=\"checkbox\" name=\"pasteFilter\" ' + (opt[\"pasteFilter\"] ? \"checked\" : \"\" ) + '>' + lang.pasteFilter + '</td></tr>' +"," '<tr><td nowrap colspan=\"4\" align=\"right\"><button >' + lang.run + '</button></td></tr>' +"," '</table>' +"," '</div>' +"," '</div>';","",""," },"," _UIBase_render:UIBase.prototype.render"," };"," utils.inherits(AutoTypeSetPicker, UIBase);","})();"]; +_$jscoverage['ui/autotypesetpicker.js'][3]++; +(function () { + _$jscoverage['ui/autotypesetpicker.js'][4]++; + var utils = baidu.editor.utils, UIBase = baidu.editor.ui.UIBase; + _$jscoverage['ui/autotypesetpicker.js'][7]++; + var AutoTypeSetPicker = (baidu.editor.ui.AutoTypeSetPicker = (function (options) { + _$jscoverage['ui/autotypesetpicker.js'][8]++; + this.initOptions(options); + _$jscoverage['ui/autotypesetpicker.js'][9]++; + this.initAutoTypeSetPicker(); +})); + _$jscoverage['ui/autotypesetpicker.js'][11]++; + AutoTypeSetPicker.prototype = {initAutoTypeSetPicker: (function () { + _$jscoverage['ui/autotypesetpicker.js'][13]++; + this.initUIBase(); +}), getHtmlTpl: (function () { + _$jscoverage['ui/autotypesetpicker.js'][16]++; + var me = this.editor, opt = me.options.autotypeset, lang = me.getLang("autoTypeSet"); + _$jscoverage['ui/autotypesetpicker.js'][20]++; + var textAlignInputName = ("textAlignValue" + me.uid), imageBlockInputName = ("imageBlockLineValue" + me.uid); + _$jscoverage['ui/autotypesetpicker.js'][23]++; + 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 + "
    " + "
    " + "
    "); +}), _UIBase_render: UIBase.prototype.render}; + _$jscoverage['ui/autotypesetpicker.js'][48]++; + utils.inherits(AutoTypeSetPicker, UIBase); +})(); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/breakline.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/breakline.js new file mode 100644 index 000000000..35d6745eb --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/breakline.js @@ -0,0 +1,71 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['ui/breakline.js']) { + _$jscoverage['ui/breakline.js'] = []; + _$jscoverage['ui/breakline.js'][1] = 0; + _$jscoverage['ui/breakline.js'][2] = 0; + _$jscoverage['ui/breakline.js'][5] = 0; + _$jscoverage['ui/breakline.js'][6] = 0; + _$jscoverage['ui/breakline.js'][8] = 0; + _$jscoverage['ui/breakline.js'][11] = 0; + _$jscoverage['ui/breakline.js'][14] = 0; + _$jscoverage['ui/breakline.js'][17] = 0; +} +_$jscoverage['ui/breakline.js'].source = ["(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 '<br/>';"," }"," };"," utils.inherits(Breakline, UIBase);","","})();"]; +_$jscoverage['ui/breakline.js'][1]++; +(function () { + _$jscoverage['ui/breakline.js'][2]++; + var utils = baidu.editor.utils, UIBase = baidu.editor.ui.UIBase, Breakline = (baidu.editor.ui.Breakline = (function (options) { + _$jscoverage['ui/breakline.js'][5]++; + this.initOptions(options); + _$jscoverage['ui/breakline.js'][6]++; + this.initSeparator(); +})); + _$jscoverage['ui/breakline.js'][8]++; + Breakline.prototype = {uiName: "Breakline", initSeparator: (function () { + _$jscoverage['ui/breakline.js'][11]++; + this.initUIBase(); +}), getHtmlTpl: (function () { + _$jscoverage['ui/breakline.js'][14]++; + return "
    "; +})}; + _$jscoverage['ui/breakline.js'][17]++; + utils.inherits(Breakline, UIBase); +})(); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/button.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/button.js new file mode 100644 index 000000000..5346f333f --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/button.js @@ -0,0 +1,92 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['ui/button.js']) { + _$jscoverage['ui/button.js'] = []; + _$jscoverage['ui/button.js'][4] = 0; + _$jscoverage['ui/button.js'][5] = 0; + _$jscoverage['ui/button.js'][9] = 0; + _$jscoverage['ui/button.js'][10] = 0; + _$jscoverage['ui/button.js'][12] = 0; + _$jscoverage['ui/button.js'][19] = 0; + _$jscoverage['ui/button.js'][20] = 0; + _$jscoverage['ui/button.js'][23] = 0; + _$jscoverage['ui/button.js'][34] = 0; + _$jscoverage['ui/button.js'][35] = 0; + _$jscoverage['ui/button.js'][38] = 0; + _$jscoverage['ui/button.js'][39] = 0; + _$jscoverage['ui/button.js'][43] = 0; + _$jscoverage['ui/button.js'][44] = 0; +} +_$jscoverage['ui/button.js'].source = ["///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){"," this.initOptions(options);"," this.initButton();"," };"," Button.prototype = {"," uiName: 'button',"," label: '',"," title: '',"," showIcon: true,"," showText: true,"," initButton: function (){"," this.initUIBase();"," this.Stateful_init();"," },"," getHtmlTpl: function (){"," return '<div id=\"##\" class=\"edui-box %%\">' +"," '<div id=\"##_state\" stateful>' +"," '<div class=\"%%-wrap\"><div id=\"##_body\" unselectable=\"on\" ' + (this.title ? 'title=\"' + this.title + '\"' : '') +"," ' class=\"%%-body\" onmousedown=\"return false;\" onclick=\"return $$._onClick();\">' +"," (this.showIcon ? '<div class=\"edui-box edui-icon\"></div>' : '') +"," (this.showText ? '<div class=\"edui-box edui-label\">' + this.label + '</div>' : '') +"," '</div>' +"," '</div>' +"," '</div></div>';"," },"," postRender: function (){"," this.Stateful_postRender();"," this.setDisabled(this.disabled)"," },"," _onClick: function (){"," if (!this.isDisabled()) {"," this.fireEvent('click');"," }"," }"," };"," utils.inherits(Button, UIBase);"," utils.extend(Button.prototype, Stateful);","","})();"]; +_$jscoverage['ui/button.js'][4]++; +(function () { + _$jscoverage['ui/button.js'][5]++; + var utils = baidu.editor.utils, UIBase = baidu.editor.ui.UIBase, Stateful = baidu.editor.ui.Stateful, Button = (baidu.editor.ui.Button = (function (options) { + _$jscoverage['ui/button.js'][9]++; + this.initOptions(options); + _$jscoverage['ui/button.js'][10]++; + this.initButton(); +})); + _$jscoverage['ui/button.js'][12]++; + Button.prototype = {uiName: "button", label: "", title: "", showIcon: true, showText: true, initButton: (function () { + _$jscoverage['ui/button.js'][19]++; + this.initUIBase(); + _$jscoverage['ui/button.js'][20]++; + this.Stateful_init(); +}), getHtmlTpl: (function () { + _$jscoverage['ui/button.js'][23]++; + return ("
    " + "
    " + "
    " + (this.showIcon? "
    ": "") + (this.showText? ("
    " + this.label + "
    "): "") + "
    " + "
    " + "
    "); +}), postRender: (function () { + _$jscoverage['ui/button.js'][34]++; + this.Stateful_postRender(); + _$jscoverage['ui/button.js'][35]++; + this.setDisabled(this.disabled); +}), _onClick: (function () { + _$jscoverage['ui/button.js'][38]++; + if ((! this.isDisabled())) { + _$jscoverage['ui/button.js'][39]++; + this.fireEvent("click"); + } +})}; + _$jscoverage['ui/button.js'][43]++; + utils.inherits(Button, UIBase); + _$jscoverage['ui/button.js'][44]++; + utils.extend(Button.prototype, Stateful); +})(); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/cellalignpicker.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/cellalignpicker.js new file mode 100644 index 000000000..5634b1c3c --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/cellalignpicker.js @@ -0,0 +1,134 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['ui/cellalignpicker.js']) { + _$jscoverage['ui/cellalignpicker.js'] = []; + _$jscoverage['ui/cellalignpicker.js'][3] = 0; + _$jscoverage['ui/cellalignpicker.js'][4] = 0; + _$jscoverage['ui/cellalignpicker.js'][14] = 0; + _$jscoverage['ui/cellalignpicker.js'][15] = 0; + _$jscoverage['ui/cellalignpicker.js'][16] = 0; + _$jscoverage['ui/cellalignpicker.js'][17] = 0; + _$jscoverage['ui/cellalignpicker.js'][19] = 0; + _$jscoverage['ui/cellalignpicker.js'][23] = 0; + _$jscoverage['ui/cellalignpicker.js'][40] = 0; + _$jscoverage['ui/cellalignpicker.js'][41] = 0; + _$jscoverage['ui/cellalignpicker.js'][46] = 0; + _$jscoverage['ui/cellalignpicker.js'][47] = 0; + _$jscoverage['ui/cellalignpicker.js'][51] = 0; + _$jscoverage['ui/cellalignpicker.js'][58] = 0; + _$jscoverage['ui/cellalignpicker.js'][60] = 0; + _$jscoverage['ui/cellalignpicker.js'][61] = 0; + _$jscoverage['ui/cellalignpicker.js'][63] = 0; + _$jscoverage['ui/cellalignpicker.js'][65] = 0; + _$jscoverage['ui/cellalignpicker.js'][67] = 0; + _$jscoverage['ui/cellalignpicker.js'][71] = 0; + _$jscoverage['ui/cellalignpicker.js'][80] = 0; + _$jscoverage['ui/cellalignpicker.js'][83] = 0; + _$jscoverage['ui/cellalignpicker.js'][84] = 0; + _$jscoverage['ui/cellalignpicker.js'][85] = 0; + _$jscoverage['ui/cellalignpicker.js'][86] = 0; + _$jscoverage['ui/cellalignpicker.js'][91] = 0; + _$jscoverage['ui/cellalignpicker.js'][92] = 0; +} +_$jscoverage['ui/cellalignpicker.js'].source = ["///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('<tr>');",""," tmpl.push( '<td index=\"'+ i +'\" ' + tempClassName + ' stateful><div class=\"edui-icon edui-'+ alignType[ tempIndex ] +'\"></div></td>' );",""," tempIndex === 2 && tmpl.push('</tr>');",""," }",""," return '<div id=\"##\" class=\"edui-cellalignpicker %%\">' +"," '<div class=\"edui-cellalignpicker-body\">' +"," '<table onclick=\"$$._onClick(event);\">' +"," tmpl.join('') +"," '</table>' +"," '</div>' +"," '</div>';"," },"," 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);","})();","","",""]; +_$jscoverage['ui/cellalignpicker.js'][3]++; +(function () { + _$jscoverage['ui/cellalignpicker.js'][4]++; + var utils = baidu.editor.utils, Popup = baidu.editor.ui.Popup, Stateful = baidu.editor.ui.Stateful, UIBase = baidu.editor.ui.UIBase; + _$jscoverage['ui/cellalignpicker.js'][14]++; + var CellAlignPicker = (baidu.editor.ui.CellAlignPicker = (function (options) { + _$jscoverage['ui/cellalignpicker.js'][15]++; + this.initOptions(options); + _$jscoverage['ui/cellalignpicker.js'][16]++; + this.initSelected(); + _$jscoverage['ui/cellalignpicker.js'][17]++; + this.initCellAlignPicker(); +})); + _$jscoverage['ui/cellalignpicker.js'][19]++; + CellAlignPicker.prototype = {initSelected: (function () { + _$jscoverage['ui/cellalignpicker.js'][23]++; + var status = {valign: {top: 0, middle: 1, bottom: 2}, align: {left: 0, center: 1, right: 2}, count: 3}, result = -1; + _$jscoverage['ui/cellalignpicker.js'][40]++; + if (this.selected) { + _$jscoverage['ui/cellalignpicker.js'][41]++; + this.selectedIndex = ((status.valign[this.selected.valign] * status.count) + status.align[this.selected.align]); + } +}), initCellAlignPicker: (function () { + _$jscoverage['ui/cellalignpicker.js'][46]++; + this.initUIBase(); + _$jscoverage['ui/cellalignpicker.js'][47]++; + this.Stateful_init(); +}), getHtmlTpl: (function () { + _$jscoverage['ui/cellalignpicker.js'][51]++; + var alignType = ["left", "center", "right"], COUNT = 9, tempClassName = null, tempIndex = -1, tmpl = []; + _$jscoverage['ui/cellalignpicker.js'][58]++; + for (var i = 0; (i < COUNT); (i++)) { + _$jscoverage['ui/cellalignpicker.js'][60]++; + tempClassName = ((this.selectedIndex === i)? " class=\"edui-cellalign-selected\" ": ""); + _$jscoverage['ui/cellalignpicker.js'][61]++; + tempIndex = (i % 3); + _$jscoverage['ui/cellalignpicker.js'][63]++; + ((tempIndex === 0) && tmpl.push("")); + _$jscoverage['ui/cellalignpicker.js'][65]++; + tmpl.push(("
    ")); + _$jscoverage['ui/cellalignpicker.js'][67]++; + ((tempIndex === 2) && tmpl.push("")); +} + _$jscoverage['ui/cellalignpicker.js'][71]++; + return ("
    " + "
    " + "" + tmpl.join("") + "
    " + "
    " + "
    "); +}), getStateDom: (function () { + _$jscoverage['ui/cellalignpicker.js'][80]++; + return this.target; +}), _onClick: (function (evt) { + _$jscoverage['ui/cellalignpicker.js'][83]++; + var target = (evt.target || evt.srcElement); + _$jscoverage['ui/cellalignpicker.js'][84]++; + if (/icon/.test(target.className)) { + _$jscoverage['ui/cellalignpicker.js'][85]++; + this.items[target.parentNode.getAttribute("index")].onclick(); + _$jscoverage['ui/cellalignpicker.js'][86]++; + Popup.postHide(evt); + } +}), _UIBase_render: UIBase.prototype.render}; + _$jscoverage['ui/cellalignpicker.js'][91]++; + utils.inherits(CellAlignPicker, UIBase); + _$jscoverage['ui/cellalignpicker.js'][92]++; + utils.extend(CellAlignPicker.prototype, Stateful, true); +})(); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/colorbutton.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/colorbutton.js new file mode 100644 index 000000000..00b61978b --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/colorbutton.js @@ -0,0 +1,117 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['ui/colorbutton.js']) { + _$jscoverage['ui/colorbutton.js'] = []; + _$jscoverage['ui/colorbutton.js'][6] = 0; + _$jscoverage['ui/colorbutton.js'][7] = 0; + _$jscoverage['ui/colorbutton.js'][13] = 0; + _$jscoverage['ui/colorbutton.js'][14] = 0; + _$jscoverage['ui/colorbutton.js'][16] = 0; + _$jscoverage['ui/colorbutton.js'][18] = 0; + _$jscoverage['ui/colorbutton.js'][19] = 0; + _$jscoverage['ui/colorbutton.js'][24] = 0; + _$jscoverage['ui/colorbutton.js'][27] = 0; + _$jscoverage['ui/colorbutton.js'][32] = 0; + _$jscoverage['ui/colorbutton.js'][36] = 0; + _$jscoverage['ui/colorbutton.js'][37] = 0; + _$jscoverage['ui/colorbutton.js'][40] = 0; + _$jscoverage['ui/colorbutton.js'][43] = 0; + _$jscoverage['ui/colorbutton.js'][44] = 0; + _$jscoverage['ui/colorbutton.js'][47] = 0; + _$jscoverage['ui/colorbutton.js'][48] = 0; + _$jscoverage['ui/colorbutton.js'][49] = 0; + _$jscoverage['ui/colorbutton.js'][53] = 0; + _$jscoverage['ui/colorbutton.js'][54] = 0; + _$jscoverage['ui/colorbutton.js'][58] = 0; +} +_$jscoverage['ui/colorbutton.js'].source = ["///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('<div id=\"' + this.id + '_colorlump\" class=\"edui-colorlump\"></div>')"," );"," 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);","","})();"]; +_$jscoverage['ui/colorbutton.js'][6]++; +(function () { + _$jscoverage['ui/colorbutton.js'][7]++; + 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) { + _$jscoverage['ui/colorbutton.js'][13]++; + this.initOptions(options); + _$jscoverage['ui/colorbutton.js'][14]++; + this.initColorButton(); +})); + _$jscoverage['ui/colorbutton.js'][16]++; + ColorButton.prototype = {initColorButton: (function () { + _$jscoverage['ui/colorbutton.js'][18]++; + var me = this; + _$jscoverage['ui/colorbutton.js'][19]++; + this.popup = new Popup({content: new ColorPicker({noColorText: me.editor.getLang("clearColor"), editor: me.editor, onpickcolor: (function (t, color) { + _$jscoverage['ui/colorbutton.js'][24]++; + me._onPickColor(color); +}), onpicknocolor: (function (t, color) { + _$jscoverage['ui/colorbutton.js'][27]++; + me._onPickNoColor(color); +})}), editor: me.editor}); + _$jscoverage['ui/colorbutton.js'][32]++; + this.initSplitButton(); +}), _SplitButton_postRender: SplitButton.prototype.postRender, postRender: (function () { + _$jscoverage['ui/colorbutton.js'][36]++; + this._SplitButton_postRender(); + _$jscoverage['ui/colorbutton.js'][37]++; + this.getDom("button_body").appendChild(uiUtils.createElementByHtml(("
    "))); + _$jscoverage['ui/colorbutton.js'][40]++; + this.getDom().className += " edui-colorbutton"; +}), setColor: (function (color) { + _$jscoverage['ui/colorbutton.js'][43]++; + this.getDom("colorlump").style.backgroundColor = color; + _$jscoverage['ui/colorbutton.js'][44]++; + this.color = color; +}), _onPickColor: (function (color) { + _$jscoverage['ui/colorbutton.js'][47]++; + if ((this.fireEvent("pickcolor", color) !== false)) { + _$jscoverage['ui/colorbutton.js'][48]++; + this.setColor(color); + _$jscoverage['ui/colorbutton.js'][49]++; + this.popup.hide(); + } +}), _onPickNoColor: (function (color) { + _$jscoverage['ui/colorbutton.js'][53]++; + if ((this.fireEvent("picknocolor") !== false)) { + _$jscoverage['ui/colorbutton.js'][54]++; + this.popup.hide(); + } +})}; + _$jscoverage['ui/colorbutton.js'][58]++; + utils.inherits(ColorButton, SplitButton); +})(); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/colorpicker.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/colorpicker.js new file mode 100644 index 000000000..959014f93 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/colorpicker.js @@ -0,0 +1,136 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['ui/colorpicker.js']) { + _$jscoverage['ui/colorpicker.js'] = []; + _$jscoverage['ui/colorpicker.js'][3] = 0; + _$jscoverage['ui/colorpicker.js'][4] = 0; + _$jscoverage['ui/colorpicker.js'][7] = 0; + _$jscoverage['ui/colorpicker.js'][8] = 0; + _$jscoverage['ui/colorpicker.js'][9] = 0; + _$jscoverage['ui/colorpicker.js'][12] = 0; + _$jscoverage['ui/colorpicker.js'][14] = 0; + _$jscoverage['ui/colorpicker.js'][17] = 0; + _$jscoverage['ui/colorpicker.js'][18] = 0; + _$jscoverage['ui/colorpicker.js'][19] = 0; + _$jscoverage['ui/colorpicker.js'][20] = 0; + _$jscoverage['ui/colorpicker.js'][24] = 0; + _$jscoverage['ui/colorpicker.js'][25] = 0; + _$jscoverage['ui/colorpicker.js'][26] = 0; + _$jscoverage['ui/colorpicker.js'][27] = 0; + _$jscoverage['ui/colorpicker.js'][31] = 0; + _$jscoverage['ui/colorpicker.js'][34] = 0; + _$jscoverage['ui/colorpicker.js'][37] = 0; + _$jscoverage['ui/colorpicker.js'][39] = 0; + _$jscoverage['ui/colorpicker.js'][48] = 0; + _$jscoverage['ui/colorpicker.js'][49] = 0; + _$jscoverage['ui/colorpicker.js'][57] = 0; + _$jscoverage['ui/colorpicker.js'][58] = 0; + _$jscoverage['ui/colorpicker.js'][59] = 0; + _$jscoverage['ui/colorpicker.js'][61] = 0; + _$jscoverage['ui/colorpicker.js'][71] = 0; + _$jscoverage['ui/colorpicker.js'][72] = 0; +} +_$jscoverage['ui/colorpicker.js'].source = ["///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 = '<div id=\"##\" class=\"edui-colorpicker %%\">' +"," '<div class=\"edui-colorpicker-topbar edui-clearfix\">' +"," '<div unselectable=\"on\" id=\"##_preview\" class=\"edui-colorpicker-preview\"></div>' +"," '<div unselectable=\"on\" class=\"edui-colorpicker-nocolor\" onclick=\"$$._onPickNoColor(event, this);\">'+ noColorText +'</div>' +"," '</div>' +"," '<table class=\"edui-box\" style=\"border-collapse: collapse;\" onmouseover=\"$$._onTableOver(event, this);\" onmouseout=\"$$._onTableOut(event, this);\" onclick=\"return $$._onTableClick(event, this);\" cellspacing=\"0\" cellpadding=\"0\">' +"," '<tr style=\"border-bottom: 1px solid #ddd;font-size: 13px;line-height: 25px;color:#39C;padding-top: 2px\"><td colspan=\"10\">'+editor.getLang(\"themeColor\")+'</td> </tr>'+"," '<tr class=\"edui-colorpicker-tablefirstrow\" >';"," for (var i=0; i<COLORS.length; i++) {"," if (i && i%10 === 0) {"," html += '</tr>'+(i==60?'<tr style=\"border-bottom: 1px solid #ddd;font-size: 13px;line-height: 25px;color:#39C;\"><td colspan=\"10\">'+editor.getLang(\"standardColor\")+'</td></tr>':'')+'<tr'+(i==60?' class=\"edui-colorpicker-tablefirstrow\"':'')+'>';"," }"," html += i<70 ? '<td style=\"padding: 0 2px;\"><a hidefocus title=\"'+COLORS[i]+'\" onclick=\"return false;\" href=\"javascript:\" unselectable=\"on\" class=\"edui-box edui-colorpicker-colorcell\"' +"," ' data-color=\"#'+ COLORS[i] +'\"'+"," ' style=\"background-color:#'+ COLORS[i] +';border:solid #ccc;'+"," (i<10 || i>=60?'border-width:1px;':"," i>=10&&i<20?'border-width:1px 1px 0 1px;':",""," 'border-width:0 1px 0 1px;')+"," '\"' +"," '></a></td>':'';"," }"," html += '</tr></table></div>';"," return html;"," }","})();"]; +_$jscoverage['ui/colorpicker.js'][3]++; +(function () { + _$jscoverage['ui/colorpicker.js'][4]++; + var utils = baidu.editor.utils, UIBase = baidu.editor.ui.UIBase, ColorPicker = (baidu.editor.ui.ColorPicker = (function (options) { + _$jscoverage['ui/colorpicker.js'][7]++; + this.initOptions(options); + _$jscoverage['ui/colorpicker.js'][8]++; + this.noColorText = (this.noColorText || this.editor.getLang("clearColor")); + _$jscoverage['ui/colorpicker.js'][9]++; + this.initUIBase(); +})); + _$jscoverage['ui/colorpicker.js'][12]++; + ColorPicker.prototype = {getHtmlTpl: (function () { + _$jscoverage['ui/colorpicker.js'][14]++; + return genColorPicker(this.noColorText, this.editor); +}), _onTableClick: (function (evt) { + _$jscoverage['ui/colorpicker.js'][17]++; + var tgt = (evt.target || evt.srcElement); + _$jscoverage['ui/colorpicker.js'][18]++; + var color = tgt.getAttribute("data-color"); + _$jscoverage['ui/colorpicker.js'][19]++; + if (color) { + _$jscoverage['ui/colorpicker.js'][20]++; + this.fireEvent("pickcolor", color); + } +}), _onTableOver: (function (evt) { + _$jscoverage['ui/colorpicker.js'][24]++; + var tgt = (evt.target || evt.srcElement); + _$jscoverage['ui/colorpicker.js'][25]++; + var color = tgt.getAttribute("data-color"); + _$jscoverage['ui/colorpicker.js'][26]++; + if (color) { + _$jscoverage['ui/colorpicker.js'][27]++; + this.getDom("preview").style.backgroundColor = color; + } +}), _onTableOut: (function () { + _$jscoverage['ui/colorpicker.js'][31]++; + this.getDom("preview").style.backgroundColor = ""; +}), _onPickNoColor: (function () { + _$jscoverage['ui/colorpicker.js'][34]++; + this.fireEvent("picknocolor"); +})}; + _$jscoverage['ui/colorpicker.js'][37]++; + utils.inherits(ColorPicker, UIBase); + _$jscoverage['ui/colorpicker.js'][39]++; + 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(","); + _$jscoverage['ui/colorpicker.js'][48]++; + function genColorPicker(noColorText, editor) { + _$jscoverage['ui/colorpicker.js'][49]++; + var html = ("
    " + "
    " + "
    " + "
    " + noColorText + "
    " + "
    " + "" + "" + ""); + _$jscoverage['ui/colorpicker.js'][57]++; + for (var i = 0; (i < COLORS.length); (i++)) { + _$jscoverage['ui/colorpicker.js'][58]++; + if ((i && ((i % 10) === 0))) { + _$jscoverage['ui/colorpicker.js'][59]++; + html += ("" + ((i == 60)? (""): "") + ""); + } + _$jscoverage['ui/colorpicker.js'][61]++; + html += ((i < 70)? (""): ""); +} + _$jscoverage['ui/colorpicker.js'][71]++; + 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;")) + "\"" + ">
    "; + _$jscoverage['ui/colorpicker.js'][72]++; + return html; +} +})(); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/combox.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/combox.js new file mode 100644 index 000000000..dfb61613d --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/combox.js @@ -0,0 +1,198 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['ui/combox.js']) { + _$jscoverage['ui/combox.js'] = []; + _$jscoverage['ui/combox.js'][5] = 0; + _$jscoverage['ui/combox.js'][7] = 0; + _$jscoverage['ui/combox.js'][12] = 0; + _$jscoverage['ui/combox.js'][13] = 0; + _$jscoverage['ui/combox.js'][15] = 0; + _$jscoverage['ui/combox.js'][18] = 0; + _$jscoverage['ui/combox.js'][19] = 0; + _$jscoverage['ui/combox.js'][20] = 0; + _$jscoverage['ui/combox.js'][21] = 0; + _$jscoverage['ui/combox.js'][22] = 0; + _$jscoverage['ui/combox.js'][23] = 0; + _$jscoverage['ui/combox.js'][24] = 0; + _$jscoverage['ui/combox.js'][25] = 0; + _$jscoverage['ui/combox.js'][28] = 0; + _$jscoverage['ui/combox.js'][36] = 0; + _$jscoverage['ui/combox.js'][40] = 0; + _$jscoverage['ui/combox.js'][41] = 0; + _$jscoverage['ui/combox.js'][42] = 0; + _$jscoverage['ui/combox.js'][45] = 0; + _$jscoverage['ui/combox.js'][46] = 0; + _$jscoverage['ui/combox.js'][47] = 0; + _$jscoverage['ui/combox.js'][48] = 0; + _$jscoverage['ui/combox.js'][49] = 0; + _$jscoverage['ui/combox.js'][52] = 0; + _$jscoverage['ui/combox.js'][55] = 0; + _$jscoverage['ui/combox.js'][56] = 0; + _$jscoverage['ui/combox.js'][57] = 0; + _$jscoverage['ui/combox.js'][58] = 0; + _$jscoverage['ui/combox.js'][59] = 0; + _$jscoverage['ui/combox.js'][61] = 0; + _$jscoverage['ui/combox.js'][62] = 0; + _$jscoverage['ui/combox.js'][63] = 0; + _$jscoverage['ui/combox.js'][67] = 0; + _$jscoverage['ui/combox.js'][68] = 0; + _$jscoverage['ui/combox.js'][71] = 0; + _$jscoverage['ui/combox.js'][74] = 0; + _$jscoverage['ui/combox.js'][75] = 0; + _$jscoverage['ui/combox.js'][76] = 0; + _$jscoverage['ui/combox.js'][79] = 0; + _$jscoverage['ui/combox.js'][82] = 0; + _$jscoverage['ui/combox.js'][85] = 0; + _$jscoverage['ui/combox.js'][86] = 0; + _$jscoverage['ui/combox.js'][87] = 0; + _$jscoverage['ui/combox.js'][88] = 0; + _$jscoverage['ui/combox.js'][92] = 0; +} +_$jscoverage['ui/combox.js'].source = ["///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',"," 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);","})();"]; +_$jscoverage['ui/combox.js'][5]++; +(function () { + _$jscoverage['ui/combox.js'][7]++; + 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) { + _$jscoverage['ui/combox.js'][12]++; + this.initOptions(options); + _$jscoverage['ui/combox.js'][13]++; + this.initCombox(); +})); + _$jscoverage['ui/combox.js'][15]++; + Combox.prototype = {uiName: "combox", initCombox: (function () { + _$jscoverage['ui/combox.js'][18]++; + var me = this; + _$jscoverage['ui/combox.js'][19]++; + this.items = (this.items || []); + _$jscoverage['ui/combox.js'][20]++; + for (var i = 0; (i < this.items.length); (i++)) { + _$jscoverage['ui/combox.js'][21]++; + var item = this.items[i]; + _$jscoverage['ui/combox.js'][22]++; + item.uiName = "listitem"; + _$jscoverage['ui/combox.js'][23]++; + item.index = i; + _$jscoverage['ui/combox.js'][24]++; + item.onclick = (function () { + _$jscoverage['ui/combox.js'][25]++; + me.selectByIndex(this.index); +}); +} + _$jscoverage['ui/combox.js'][28]++; + this.popup = new Menu({items: this.items, uiName: "list", editor: this.editor, captureWheel: true, combox: this}); + _$jscoverage['ui/combox.js'][36]++; + this.initSplitButton(); +}), _SplitButton_postRender: SplitButton.prototype.postRender, postRender: (function () { + _$jscoverage['ui/combox.js'][40]++; + this._SplitButton_postRender(); + _$jscoverage['ui/combox.js'][41]++; + this.setLabel((this.label || "")); + _$jscoverage['ui/combox.js'][42]++; + this.setValue((this.initValue || "")); +}), showPopup: (function () { + _$jscoverage['ui/combox.js'][45]++; + var rect = uiUtils.getClientRect(this.getDom()); + _$jscoverage['ui/combox.js'][46]++; + rect.top += 1; + _$jscoverage['ui/combox.js'][47]++; + rect.bottom -= 1; + _$jscoverage['ui/combox.js'][48]++; + rect.height -= 2; + _$jscoverage['ui/combox.js'][49]++; + this.popup.showAnchorRect(rect); +}), getValue: (function () { + _$jscoverage['ui/combox.js'][52]++; + return this.value; +}), setValue: (function (value) { + _$jscoverage['ui/combox.js'][55]++; + var index = this.indexByValue(value); + _$jscoverage['ui/combox.js'][56]++; + if ((index != -1)) { + _$jscoverage['ui/combox.js'][57]++; + this.selectedIndex = index; + _$jscoverage['ui/combox.js'][58]++; + this.setLabel(this.items[index].label); + _$jscoverage['ui/combox.js'][59]++; + this.value = this.items[index].value; + } + else { + _$jscoverage['ui/combox.js'][61]++; + this.selectedIndex = -1; + _$jscoverage['ui/combox.js'][62]++; + this.setLabel(this.getLabelForUnknowValue(value)); + _$jscoverage['ui/combox.js'][63]++; + this.value = value; + } +}), setLabel: (function (label) { + _$jscoverage['ui/combox.js'][67]++; + this.getDom("button_body").innerHTML = label; + _$jscoverage['ui/combox.js'][68]++; + this.label = label; +}), getLabelForUnknowValue: (function (value) { + _$jscoverage['ui/combox.js'][71]++; + return value; +}), indexByValue: (function (value) { + _$jscoverage['ui/combox.js'][74]++; + for (var i = 0; (i < this.items.length); (i++)) { + _$jscoverage['ui/combox.js'][75]++; + if ((value == this.items[i].value)) { + _$jscoverage['ui/combox.js'][76]++; + return i; + } +} + _$jscoverage['ui/combox.js'][79]++; + return -1; +}), getItem: (function (index) { + _$jscoverage['ui/combox.js'][82]++; + return this.items[index]; +}), selectByIndex: (function (index) { + _$jscoverage['ui/combox.js'][85]++; + if (((index < this.items.length) && (this.fireEvent("select", index) !== false))) { + _$jscoverage['ui/combox.js'][86]++; + this.selectedIndex = index; + _$jscoverage['ui/combox.js'][87]++; + this.value = this.items[index].value; + _$jscoverage['ui/combox.js'][88]++; + this.setLabel(this.items[index].label); + } +})}; + _$jscoverage['ui/combox.js'][92]++; + utils.inherits(Combox, SplitButton); +})(); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/dialog.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/dialog.js new file mode 100644 index 000000000..798216438 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/dialog.js @@ -0,0 +1,535 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['ui/dialog.js']) { + _$jscoverage['ui/dialog.js'] = []; + _$jscoverage['ui/dialog.js'][5] = 0; + _$jscoverage['ui/dialog.js'][6] = 0; + _$jscoverage['ui/dialog.js'][13] = 0; + _$jscoverage['ui/dialog.js'][19] = 0; + _$jscoverage['ui/dialog.js'][24] = 0; + _$jscoverage['ui/dialog.js'][26] = 0; + _$jscoverage['ui/dialog.js'][27] = 0; + _$jscoverage['ui/dialog.js'][28] = 0; + _$jscoverage['ui/dialog.js'][32] = 0; + _$jscoverage['ui/dialog.js'][34] = 0; + _$jscoverage['ui/dialog.js'][35] = 0; + _$jscoverage['ui/dialog.js'][39] = 0; + _$jscoverage['ui/dialog.js'][43] = 0; + _$jscoverage['ui/dialog.js'][48] = 0; + _$jscoverage['ui/dialog.js'][51] = 0; + _$jscoverage['ui/dialog.js'][52] = 0; + _$jscoverage['ui/dialog.js'][53] = 0; + _$jscoverage['ui/dialog.js'][54] = 0; + _$jscoverage['ui/dialog.js'][60] = 0; + _$jscoverage['ui/dialog.js'][65] = 0; + _$jscoverage['ui/dialog.js'][66] = 0; + _$jscoverage['ui/dialog.js'][67] = 0; + _$jscoverage['ui/dialog.js'][68] = 0; + _$jscoverage['ui/dialog.js'][71] = 0; + _$jscoverage['ui/dialog.js'][72] = 0; + _$jscoverage['ui/dialog.js'][73] = 0; + _$jscoverage['ui/dialog.js'][74] = 0; + _$jscoverage['ui/dialog.js'][75] = 0; + _$jscoverage['ui/dialog.js'][76] = 0; + _$jscoverage['ui/dialog.js'][77] = 0; + _$jscoverage['ui/dialog.js'][79] = 0; + _$jscoverage['ui/dialog.js'][80] = 0; + _$jscoverage['ui/dialog.js'][81] = 0; + _$jscoverage['ui/dialog.js'][83] = 0; + _$jscoverage['ui/dialog.js'][84] = 0; + _$jscoverage['ui/dialog.js'][87] = 0; + _$jscoverage['ui/dialog.js'][88] = 0; + _$jscoverage['ui/dialog.js'][89] = 0; + _$jscoverage['ui/dialog.js'][90] = 0; + _$jscoverage['ui/dialog.js'][91] = 0; + _$jscoverage['ui/dialog.js'][92] = 0; + _$jscoverage['ui/dialog.js'][93] = 0; + _$jscoverage['ui/dialog.js'][94] = 0; + _$jscoverage['ui/dialog.js'][98] = 0; + _$jscoverage['ui/dialog.js'][99] = 0; + _$jscoverage['ui/dialog.js'][101] = 0; + _$jscoverage['ui/dialog.js'][104] = 0; + _$jscoverage['ui/dialog.js'][105] = 0; + _$jscoverage['ui/dialog.js'][106] = 0; + _$jscoverage['ui/dialog.js'][107] = 0; + _$jscoverage['ui/dialog.js'][108] = 0; + _$jscoverage['ui/dialog.js'][111] = 0; + _$jscoverage['ui/dialog.js'][114] = 0; + _$jscoverage['ui/dialog.js'][116] = 0; + _$jscoverage['ui/dialog.js'][117] = 0; + _$jscoverage['ui/dialog.js'][118] = 0; + _$jscoverage['ui/dialog.js'][119] = 0; + _$jscoverage['ui/dialog.js'][121] = 0; + _$jscoverage['ui/dialog.js'][126] = 0; + _$jscoverage['ui/dialog.js'][140] = 0; + _$jscoverage['ui/dialog.js'][141] = 0; + _$jscoverage['ui/dialog.js'][142] = 0; + _$jscoverage['ui/dialog.js'][144] = 0; + _$jscoverage['ui/dialog.js'][145] = 0; + _$jscoverage['ui/dialog.js'][146] = 0; + _$jscoverage['ui/dialog.js'][148] = 0; + _$jscoverage['ui/dialog.js'][149] = 0; + _$jscoverage['ui/dialog.js'][150] = 0; + _$jscoverage['ui/dialog.js'][152] = 0; + _$jscoverage['ui/dialog.js'][153] = 0; + _$jscoverage['ui/dialog.js'][155] = 0; + _$jscoverage['ui/dialog.js'][156] = 0; + _$jscoverage['ui/dialog.js'][157] = 0; + _$jscoverage['ui/dialog.js'][160] = 0; + _$jscoverage['ui/dialog.js'][161] = 0; + _$jscoverage['ui/dialog.js'][162] = 0; + _$jscoverage['ui/dialog.js'][163] = 0; + _$jscoverage['ui/dialog.js'][169] = 0; + _$jscoverage['ui/dialog.js'][171] = 0; + _$jscoverage['ui/dialog.js'][172] = 0; + _$jscoverage['ui/dialog.js'][173] = 0; + _$jscoverage['ui/dialog.js'][176] = 0; + _$jscoverage['ui/dialog.js'][177] = 0; + _$jscoverage['ui/dialog.js'][178] = 0; + _$jscoverage['ui/dialog.js'][180] = 0; + _$jscoverage['ui/dialog.js'][182] = 0; + _$jscoverage['ui/dialog.js'][184] = 0; + _$jscoverage['ui/dialog.js'][185] = 0; + _$jscoverage['ui/dialog.js'][186] = 0; + _$jscoverage['ui/dialog.js'][187] = 0; + _$jscoverage['ui/dialog.js'][188] = 0; + _$jscoverage['ui/dialog.js'][195] = 0; + _$jscoverage['ui/dialog.js'][196] = 0; + _$jscoverage['ui/dialog.js'][205] = 0; + _$jscoverage['ui/dialog.js'][208] = 0; + _$jscoverage['ui/dialog.js'][209] = 0; + _$jscoverage['ui/dialog.js'][210] = 0; + _$jscoverage['ui/dialog.js'][211] = 0; + _$jscoverage['ui/dialog.js'][212] = 0; + _$jscoverage['ui/dialog.js'][215] = 0; + _$jscoverage['ui/dialog.js'][216] = 0; + _$jscoverage['ui/dialog.js'][217] = 0; + _$jscoverage['ui/dialog.js'][218] = 0; + _$jscoverage['ui/dialog.js'][219] = 0; + _$jscoverage['ui/dialog.js'][221] = 0; + _$jscoverage['ui/dialog.js'][222] = 0; + _$jscoverage['ui/dialog.js'][223] = 0; + _$jscoverage['ui/dialog.js'][226] = 0; + _$jscoverage['ui/dialog.js'][227] = 0; + _$jscoverage['ui/dialog.js'][228] = 0; + _$jscoverage['ui/dialog.js'][234] = 0; + _$jscoverage['ui/dialog.js'][235] = 0; + _$jscoverage['ui/dialog.js'][236] = 0; + _$jscoverage['ui/dialog.js'][242] = 0; + _$jscoverage['ui/dialog.js'][243] = 0; + _$jscoverage['ui/dialog.js'][246] = 0; + _$jscoverage['ui/dialog.js'][247] = 0; + _$jscoverage['ui/dialog.js'][250] = 0; + _$jscoverage['ui/dialog.js'][251] = 0; + _$jscoverage['ui/dialog.js'][252] = 0; + _$jscoverage['ui/dialog.js'][253] = 0; + _$jscoverage['ui/dialog.js'][257] = 0; + _$jscoverage['ui/dialog.js'][260] = 0; + _$jscoverage['ui/dialog.js'][261] = 0; + _$jscoverage['ui/dialog.js'][262] = 0; + _$jscoverage['ui/dialog.js'][263] = 0; + _$jscoverage['ui/dialog.js'][264] = 0; + _$jscoverage['ui/dialog.js'][268] = 0; + _$jscoverage['ui/dialog.js'][270] = 0; + _$jscoverage['ui/dialog.js'][271] = 0; + _$jscoverage['ui/dialog.js'][273] = 0; + _$jscoverage['ui/dialog.js'][274] = 0; + _$jscoverage['ui/dialog.js'][277] = 0; + _$jscoverage['ui/dialog.js'][278] = 0; + _$jscoverage['ui/dialog.js'][279] = 0; + _$jscoverage['ui/dialog.js'][280] = 0; + _$jscoverage['ui/dialog.js'][285] = 0; + _$jscoverage['ui/dialog.js'][288] = 0; + _$jscoverage['ui/dialog.js'][289] = 0; + _$jscoverage['ui/dialog.js'][293] = 0; +} +_$jscoverage['ui/dialog.js'].source = ["///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){"," 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;"," Dialog.prototype = {"," draggable: false,"," uiName: 'dialog',"," initDialog: function (){"," var me = this,"," theme=this.editor.options.theme;"," this.initUIBase();"," this.modalMask = (modalMask || (modalMask = new Mask({"," className: 'edui-dialog-modalmask',"," theme:theme"," })));"," 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);"," }"," });"," if (this.buttons) {"," for (var i=0; i<this.buttons.length; i++) {"," if (!(this.buttons[i] instanceof Button)) {"," this.buttons[i] = new Button(this.buttons[i]);"," }"," }"," }"," },"," 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 (){"," this.getDom().style.display = '';"," var vpRect = uiUtils.getViewportRect();"," 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';"," }"," this._show();"," },"," getContentHtml: function (){"," var contentHtml = '';"," if (typeof this.content == 'string') {"," contentHtml = this.content;"," } else if (this.iframeUrl) {"," contentHtml = '<span id=\"'+ this.id +'_contmask\" class=\"dialogcontmask\"></span><iframe id=\"'+ this.id +"," '_iframe\" class=\"%%-iframe\" height=\"100%\" width=\"100%\" frameborder=\"0\" src=\"'+ this.iframeUrl +'\"></iframe>';"," }"," 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 = '<div class=\"%%-foot\">' +"," '<div id=\"##_buttons\" class=\"%%-buttons\">' + buff.join('') + '</div>' +"," '</div>';"," }",""," return '<div id=\"##\" class=\"%%\"><div class=\"%%-wrap\"><div id=\"##_body\" class=\"%%-body\">' +"," '<div class=\"%%-shadow\"></div>' +"," '<div id=\"##_titlebar\" class=\"%%-titlebar\">' +"," '<div class=\"%%-draghandle\" onmousedown=\"$$._onTitlebarMouseDown(event, this);\">' +"," '<span class=\"%%-caption\">' + (this.title || '') + '</span>' +"," '</div>' +"," this.closeButton.renderHtml() +"," '</div>' +"," '<div id=\"##_content\" class=\"%%-content\">'+ ( this.autoReset ? '' : this.getContentHtml()) +'</div>' +"," footHtml +"," '</div></div></div>';"," },"," 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) {"," this.getDom().style.display = 'none';"," this.getDom().style.zIndex = '';"," 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){}"," }"," },"," _onCloseButtonClick: function (evt, el){"," this.close(false);"," },"," close: function (ok){"," if (this.fireEvent('close', ok) !== false) {"," this._hide();"," }"," }"," };"," utils.inherits(Dialog, UIBase);","})();"]; +_$jscoverage['ui/dialog.js'][5]++; +(function () { + _$jscoverage['ui/dialog.js'][6]++; + 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) { + _$jscoverage['ui/dialog.js'][13]++; + this.initOptions(utils.extend({autoReset: true, draggable: true, onok: (function () { +}), oncancel: (function () { +}), onclose: (function (t, ok) { + _$jscoverage['ui/dialog.js'][19]++; + return (ok? this.onok(): this.oncancel()); +}), holdScroll: false}, options)); + _$jscoverage['ui/dialog.js'][24]++; + this.initDialog(); +})); + _$jscoverage['ui/dialog.js'][26]++; + var modalMask; + _$jscoverage['ui/dialog.js'][27]++; + var dragMask; + _$jscoverage['ui/dialog.js'][28]++; + Dialog.prototype = {draggable: false, uiName: "dialog", initDialog: (function () { + _$jscoverage['ui/dialog.js'][32]++; + var me = this, theme = this.editor.options.theme; + _$jscoverage['ui/dialog.js'][34]++; + this.initUIBase(); + _$jscoverage['ui/dialog.js'][35]++; + this.modalMask = (modalMask || (modalMask = new Mask({className: "edui-dialog-modalmask", theme: theme}))); + _$jscoverage['ui/dialog.js'][39]++; + this.dragMask = (dragMask || (dragMask = new Mask({className: "edui-dialog-dragmask", theme: theme}))); + _$jscoverage['ui/dialog.js'][43]++; + this.closeButton = new Button({className: "edui-dialog-closebutton", title: me.closeDialog, theme: theme, onclick: (function () { + _$jscoverage['ui/dialog.js'][48]++; + me.close(false); +})}); + _$jscoverage['ui/dialog.js'][51]++; + if (this.buttons) { + _$jscoverage['ui/dialog.js'][52]++; + for (var i = 0; (i < this.buttons.length); (i++)) { + _$jscoverage['ui/dialog.js'][53]++; + if ((! (this.buttons[i] instanceof Button))) { + _$jscoverage['ui/dialog.js'][54]++; + this.buttons[i] = new Button(this.buttons[i]); + } +} + } +}), fitSize: (function () { + _$jscoverage['ui/dialog.js'][60]++; + var popBodyEl = this.getDom("body"); + _$jscoverage['ui/dialog.js'][65]++; + var size = this.mesureSize(); + _$jscoverage['ui/dialog.js'][66]++; + popBodyEl.style.width = (size.width + "px"); + _$jscoverage['ui/dialog.js'][67]++; + popBodyEl.style.height = (size.height + "px"); + _$jscoverage['ui/dialog.js'][68]++; + return size; +}), safeSetOffset: (function (offset) { + _$jscoverage['ui/dialog.js'][71]++; + var me = this; + _$jscoverage['ui/dialog.js'][72]++; + var el = me.getDom(); + _$jscoverage['ui/dialog.js'][73]++; + var vpRect = uiUtils.getViewportRect(); + _$jscoverage['ui/dialog.js'][74]++; + var rect = uiUtils.getClientRect(el); + _$jscoverage['ui/dialog.js'][75]++; + var left = offset.left; + _$jscoverage['ui/dialog.js'][76]++; + if (((left + rect.width) > vpRect.right)) { + _$jscoverage['ui/dialog.js'][77]++; + left = (vpRect.right - rect.width); + } + _$jscoverage['ui/dialog.js'][79]++; + var top = offset.top; + _$jscoverage['ui/dialog.js'][80]++; + if (((top + rect.height) > vpRect.bottom)) { + _$jscoverage['ui/dialog.js'][81]++; + top = (vpRect.bottom - rect.height); + } + _$jscoverage['ui/dialog.js'][83]++; + el.style.left = (Math.max(left, 0) + "px"); + _$jscoverage['ui/dialog.js'][84]++; + el.style.top = (Math.max(top, 0) + "px"); +}), showAtCenter: (function () { + _$jscoverage['ui/dialog.js'][87]++; + this.getDom().style.display = ""; + _$jscoverage['ui/dialog.js'][88]++; + var vpRect = uiUtils.getViewportRect(); + _$jscoverage['ui/dialog.js'][89]++; + var popSize = this.fitSize(); + _$jscoverage['ui/dialog.js'][90]++; + var titleHeight = (this.getDom("titlebar").offsetHeight | 0); + _$jscoverage['ui/dialog.js'][91]++; + var left = ((vpRect.width / 2) - (popSize.width / 2)); + _$jscoverage['ui/dialog.js'][92]++; + var top = ((vpRect.height / 2) - ((popSize.height - titleHeight) / 2) - titleHeight); + _$jscoverage['ui/dialog.js'][93]++; + var popEl = this.getDom(); + _$jscoverage['ui/dialog.js'][94]++; + this.safeSetOffset({left: Math.max((left | 0), 0), top: Math.max((top | 0), 0)}); + _$jscoverage['ui/dialog.js'][98]++; + if ((! domUtils.hasClass(popEl, "edui-state-centered"))) { + _$jscoverage['ui/dialog.js'][99]++; + popEl.className += " edui-state-centered"; + } + _$jscoverage['ui/dialog.js'][101]++; + this._show(); +}), getContentHtml: (function () { + _$jscoverage['ui/dialog.js'][104]++; + var contentHtml = ""; + _$jscoverage['ui/dialog.js'][105]++; + if (((typeof this.content) == "string")) { + _$jscoverage['ui/dialog.js'][106]++; + contentHtml = this.content; + } + else { + _$jscoverage['ui/dialog.js'][107]++; + if (this.iframeUrl) { + _$jscoverage['ui/dialog.js'][108]++; + contentHtml = (""); + } + } + _$jscoverage['ui/dialog.js'][111]++; + return contentHtml; +}), getHtmlTpl: (function () { + _$jscoverage['ui/dialog.js'][114]++; + var footHtml = ""; + _$jscoverage['ui/dialog.js'][116]++; + if (this.buttons) { + _$jscoverage['ui/dialog.js'][117]++; + var buff = []; + _$jscoverage['ui/dialog.js'][118]++; + for (var i = 0; (i < this.buttons.length); (i++)) { + _$jscoverage['ui/dialog.js'][119]++; + buff[i] = this.buttons[i].renderHtml(); +} + _$jscoverage['ui/dialog.js'][121]++; + footHtml = ("
    " + "
    " + buff.join("") + "
    " + "
    "); + } + _$jscoverage['ui/dialog.js'][126]++; + return ("
    " + "
    " + "
    " + "
    " + "" + (this.title || "") + "" + "
    " + this.closeButton.renderHtml() + "
    " + "
    " + (this.autoReset? "": this.getContentHtml()) + "
    " + footHtml + "
    "); +}), postRender: (function () { + _$jscoverage['ui/dialog.js'][140]++; + if ((! this.modalMask.getDom())) { + _$jscoverage['ui/dialog.js'][141]++; + this.modalMask.render(); + _$jscoverage['ui/dialog.js'][142]++; + this.modalMask.hide(); + } + _$jscoverage['ui/dialog.js'][144]++; + if ((! this.dragMask.getDom())) { + _$jscoverage['ui/dialog.js'][145]++; + this.dragMask.render(); + _$jscoverage['ui/dialog.js'][146]++; + this.dragMask.hide(); + } + _$jscoverage['ui/dialog.js'][148]++; + var me = this; + _$jscoverage['ui/dialog.js'][149]++; + this.addListener("show", (function () { + _$jscoverage['ui/dialog.js'][150]++; + me.modalMask.show((this.getDom().style.zIndex - 2)); +})); + _$jscoverage['ui/dialog.js'][152]++; + this.addListener("hide", (function () { + _$jscoverage['ui/dialog.js'][153]++; + me.modalMask.hide(); +})); + _$jscoverage['ui/dialog.js'][155]++; + if (this.buttons) { + _$jscoverage['ui/dialog.js'][156]++; + for (var i = 0; (i < this.buttons.length); (i++)) { + _$jscoverage['ui/dialog.js'][157]++; + this.buttons[i].postRender(); +} + } + _$jscoverage['ui/dialog.js'][160]++; + domUtils.on(window, "resize", (function () { + _$jscoverage['ui/dialog.js'][161]++; + setTimeout((function () { + _$jscoverage['ui/dialog.js'][162]++; + if ((! me.isHidden())) { + _$jscoverage['ui/dialog.js'][163]++; + me.safeSetOffset(uiUtils.getClientRect(me.getDom())); + } +})); +})); + _$jscoverage['ui/dialog.js'][169]++; + if (this.holdScroll) { + _$jscoverage['ui/dialog.js'][171]++; + if ((! me.iframeUrl)) { + _$jscoverage['ui/dialog.js'][172]++; + domUtils.on(document.getElementById((me.id + "_iframe")), ((! browser.gecko)? "mousewheel": "DOMMouseScroll"), (function (e) { + _$jscoverage['ui/dialog.js'][173]++; + domUtils.preventDefault(e); +})); + } + else { + _$jscoverage['ui/dialog.js'][176]++; + me.addListener("dialogafterreset", (function () { + _$jscoverage['ui/dialog.js'][177]++; + window.setTimeout((function () { + _$jscoverage['ui/dialog.js'][178]++; + var iframeWindow = document.getElementById((me.id + "_iframe")).contentWindow; + _$jscoverage['ui/dialog.js'][180]++; + if (browser.ie) { + _$jscoverage['ui/dialog.js'][182]++; + var timer = window.setInterval((function () { + _$jscoverage['ui/dialog.js'][184]++; + if ((iframeWindow.document && iframeWindow.document.body)) { + _$jscoverage['ui/dialog.js'][185]++; + window.clearInterval(timer); + _$jscoverage['ui/dialog.js'][186]++; + timer = null; + _$jscoverage['ui/dialog.js'][187]++; + domUtils.on(iframeWindow.document.body, ((! browser.gecko)? "mousewheel": "DOMMouseScroll"), (function (e) { + _$jscoverage['ui/dialog.js'][188]++; + domUtils.preventDefault(e); +})); + } +}), 100); + } + else { + _$jscoverage['ui/dialog.js'][195]++; + domUtils.on(iframeWindow, ((! browser.gecko)? "mousewheel": "DOMMouseScroll"), (function (e) { + _$jscoverage['ui/dialog.js'][196]++; + domUtils.preventDefault(e); +})); + } +}), 1); +})); + } + } + _$jscoverage['ui/dialog.js'][205]++; + this._hide(); +}), mesureSize: (function () { + _$jscoverage['ui/dialog.js'][208]++; + var body = this.getDom("body"); + _$jscoverage['ui/dialog.js'][209]++; + var width = uiUtils.getClientRect(this.getDom("content")).width; + _$jscoverage['ui/dialog.js'][210]++; + var dialogBodyStyle = body.style; + _$jscoverage['ui/dialog.js'][211]++; + dialogBodyStyle.width = width; + _$jscoverage['ui/dialog.js'][212]++; + return uiUtils.getClientRect(body); +}), _onTitlebarMouseDown: (function (evt, el) { + _$jscoverage['ui/dialog.js'][215]++; + if (this.draggable) { + _$jscoverage['ui/dialog.js'][216]++; + var rect; + _$jscoverage['ui/dialog.js'][217]++; + var vpRect = uiUtils.getViewportRect(); + _$jscoverage['ui/dialog.js'][218]++; + var me = this; + _$jscoverage['ui/dialog.js'][219]++; + uiUtils.startDrag(evt, {ondragstart: (function () { + _$jscoverage['ui/dialog.js'][221]++; + rect = uiUtils.getClientRect(me.getDom()); + _$jscoverage['ui/dialog.js'][222]++; + me.getDom("contmask").style.visibility = "visible"; + _$jscoverage['ui/dialog.js'][223]++; + me.dragMask.show((me.getDom().style.zIndex - 1)); +}), ondragmove: (function (x, y) { + _$jscoverage['ui/dialog.js'][226]++; + var left = (rect.left + x); + _$jscoverage['ui/dialog.js'][227]++; + var top = (rect.top + y); + _$jscoverage['ui/dialog.js'][228]++; + me.safeSetOffset({left: left, top: top}); +}), ondragstop: (function () { + _$jscoverage['ui/dialog.js'][234]++; + me.getDom("contmask").style.visibility = "hidden"; + _$jscoverage['ui/dialog.js'][235]++; + domUtils.removeClasses(me.getDom(), ["edui-state-centered"]); + _$jscoverage['ui/dialog.js'][236]++; + me.dragMask.hide(); +})}); + } +}), reset: (function () { + _$jscoverage['ui/dialog.js'][242]++; + this.getDom("content").innerHTML = this.getContentHtml(); + _$jscoverage['ui/dialog.js'][243]++; + this.fireEvent("dialogafterreset"); +}), _show: (function () { + _$jscoverage['ui/dialog.js'][246]++; + if (this._hidden) { + _$jscoverage['ui/dialog.js'][247]++; + this.getDom().style.display = ""; + _$jscoverage['ui/dialog.js'][250]++; + (this.editor.container.style.zIndex && (this.getDom().style.zIndex = ((this.editor.container.style.zIndex * 1) + 10))); + _$jscoverage['ui/dialog.js'][251]++; + this._hidden = false; + _$jscoverage['ui/dialog.js'][252]++; + this.fireEvent("show"); + _$jscoverage['ui/dialog.js'][253]++; + baidu.editor.ui.uiUtils.getFixedLayer().style.zIndex = (this.getDom().style.zIndex - 4); + } +}), isHidden: (function () { + _$jscoverage['ui/dialog.js'][257]++; + return this._hidden; +}), _hide: (function () { + _$jscoverage['ui/dialog.js'][260]++; + if ((! this._hidden)) { + _$jscoverage['ui/dialog.js'][261]++; + this.getDom().style.display = "none"; + _$jscoverage['ui/dialog.js'][262]++; + this.getDom().style.zIndex = ""; + _$jscoverage['ui/dialog.js'][263]++; + this._hidden = true; + _$jscoverage['ui/dialog.js'][264]++; + this.fireEvent("hide"); + } +}), open: (function () { + _$jscoverage['ui/dialog.js'][268]++; + if (this.autoReset) { + _$jscoverage['ui/dialog.js'][270]++; + try { + _$jscoverage['ui/dialog.js'][271]++; + this.reset(); + } + catch (e) { + _$jscoverage['ui/dialog.js'][273]++; + this.render(); + _$jscoverage['ui/dialog.js'][274]++; + this.open(); + } + } + _$jscoverage['ui/dialog.js'][277]++; + this.showAtCenter(); + _$jscoverage['ui/dialog.js'][278]++; + if (this.iframeUrl) { + _$jscoverage['ui/dialog.js'][279]++; + try { + _$jscoverage['ui/dialog.js'][280]++; + this.getDom("iframe").focus(); + } + catch (ex) { + } + } +}), _onCloseButtonClick: (function (evt, el) { + _$jscoverage['ui/dialog.js'][285]++; + this.close(false); +}), close: (function (ok) { + _$jscoverage['ui/dialog.js'][288]++; + if ((this.fireEvent("close", ok) !== false)) { + _$jscoverage['ui/dialog.js'][289]++; + this._hide(); + } +})}; + _$jscoverage['ui/dialog.js'][293]++; + utils.inherits(Dialog, UIBase); +})(); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/editor.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/editor.js new file mode 100644 index 000000000..254ce39da --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/editor.js @@ -0,0 +1,1531 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['ui/editor.js']) { + _$jscoverage['ui/editor.js'] = []; + _$jscoverage['ui/editor.js'][5] = 0; + _$jscoverage['ui/editor.js'][6] = 0; + _$jscoverage['ui/editor.js'][10] = 0; + _$jscoverage['ui/editor.js'][12] = 0; + _$jscoverage['ui/editor.js'][13] = 0; + _$jscoverage['ui/editor.js'][14] = 0; + _$jscoverage['ui/editor.js'][17] = 0; + _$jscoverage['ui/editor.js'][20] = 0; + _$jscoverage['ui/editor.js'][21] = 0; + _$jscoverage['ui/editor.js'][22] = 0; + _$jscoverage['ui/editor.js'][23] = 0; + _$jscoverage['ui/editor.js'][24] = 0; + _$jscoverage['ui/editor.js'][27] = 0; + _$jscoverage['ui/editor.js'][29] = 0; + _$jscoverage['ui/editor.js'][30] = 0; + _$jscoverage['ui/editor.js'][32] = 0; + _$jscoverage['ui/editor.js'][33] = 0; + _$jscoverage['ui/editor.js'][36] = 0; + _$jscoverage['ui/editor.js'][39] = 0; + _$jscoverage['ui/editor.js'][40] = 0; + _$jscoverage['ui/editor.js'][42] = 0; + _$jscoverage['ui/editor.js'][43] = 0; + _$jscoverage['ui/editor.js'][44] = 0; + _$jscoverage['ui/editor.js'][45] = 0; + _$jscoverage['ui/editor.js'][47] = 0; + _$jscoverage['ui/editor.js'][48] = 0; + _$jscoverage['ui/editor.js'][50] = 0; + _$jscoverage['ui/editor.js'][51] = 0; + _$jscoverage['ui/editor.js'][52] = 0; + _$jscoverage['ui/editor.js'][53] = 0; + _$jscoverage['ui/editor.js'][55] = 0; + _$jscoverage['ui/editor.js'][57] = 0; + _$jscoverage['ui/editor.js'][59] = 0; + _$jscoverage['ui/editor.js'][60] = 0; + _$jscoverage['ui/editor.js'][61] = 0; + _$jscoverage['ui/editor.js'][62] = 0; + _$jscoverage['ui/editor.js'][65] = 0; + _$jscoverage['ui/editor.js'][66] = 0; + _$jscoverage['ui/editor.js'][71] = 0; + _$jscoverage['ui/editor.js'][72] = 0; + _$jscoverage['ui/editor.js'][73] = 0; + _$jscoverage['ui/editor.js'][74] = 0; + _$jscoverage['ui/editor.js'][77] = 0; + _$jscoverage['ui/editor.js'][78] = 0; + _$jscoverage['ui/editor.js'][79] = 0; + _$jscoverage['ui/editor.js'][81] = 0; + _$jscoverage['ui/editor.js'][84] = 0; + _$jscoverage['ui/editor.js'][85] = 0; + _$jscoverage['ui/editor.js'][86] = 0; + _$jscoverage['ui/editor.js'][87] = 0; + _$jscoverage['ui/editor.js'][88] = 0; + _$jscoverage['ui/editor.js'][89] = 0; + _$jscoverage['ui/editor.js'][94] = 0; + _$jscoverage['ui/editor.js'][96] = 0; + _$jscoverage['ui/editor.js'][99] = 0; + _$jscoverage['ui/editor.js'][100] = 0; + _$jscoverage['ui/editor.js'][101] = 0; + _$jscoverage['ui/editor.js'][102] = 0; + _$jscoverage['ui/editor.js'][103] = 0; + _$jscoverage['ui/editor.js'][104] = 0; + _$jscoverage['ui/editor.js'][109] = 0; + _$jscoverage['ui/editor.js'][110] = 0; + _$jscoverage['ui/editor.js'][111] = 0; + _$jscoverage['ui/editor.js'][112] = 0; + _$jscoverage['ui/editor.js'][115] = 0; + _$jscoverage['ui/editor.js'][117] = 0; + _$jscoverage['ui/editor.js'][118] = 0; + _$jscoverage['ui/editor.js'][122] = 0; + _$jscoverage['ui/editor.js'][123] = 0; + _$jscoverage['ui/editor.js'][125] = 0; + _$jscoverage['ui/editor.js'][126] = 0; + _$jscoverage['ui/editor.js'][127] = 0; + _$jscoverage['ui/editor.js'][128] = 0; + _$jscoverage['ui/editor.js'][129] = 0; + _$jscoverage['ui/editor.js'][132] = 0; + _$jscoverage['ui/editor.js'][133] = 0; + _$jscoverage['ui/editor.js'][135] = 0; + _$jscoverage['ui/editor.js'][136] = 0; + _$jscoverage['ui/editor.js'][142] = 0; + _$jscoverage['ui/editor.js'][147] = 0; + _$jscoverage['ui/editor.js'][148] = 0; + _$jscoverage['ui/editor.js'][150] = 0; + _$jscoverage['ui/editor.js'][151] = 0; + _$jscoverage['ui/editor.js'][152] = 0; + _$jscoverage['ui/editor.js'][153] = 0; + _$jscoverage['ui/editor.js'][155] = 0; + _$jscoverage['ui/editor.js'][159] = 0; + _$jscoverage['ui/editor.js'][160] = 0; + _$jscoverage['ui/editor.js'][161] = 0; + _$jscoverage['ui/editor.js'][163] = 0; + _$jscoverage['ui/editor.js'][164] = 0; + _$jscoverage['ui/editor.js'][168] = 0; + _$jscoverage['ui/editor.js'][173] = 0; + _$jscoverage['ui/editor.js'][174] = 0; + _$jscoverage['ui/editor.js'][177] = 0; + _$jscoverage['ui/editor.js'][178] = 0; + _$jscoverage['ui/editor.js'][182] = 0; + _$jscoverage['ui/editor.js'][183] = 0; + _$jscoverage['ui/editor.js'][187] = 0; + _$jscoverage['ui/editor.js'][188] = 0; + _$jscoverage['ui/editor.js'][189] = 0; + _$jscoverage['ui/editor.js'][191] = 0; + _$jscoverage['ui/editor.js'][192] = 0; + _$jscoverage['ui/editor.js'][194] = 0; + _$jscoverage['ui/editor.js'][195] = 0; + _$jscoverage['ui/editor.js'][197] = 0; + _$jscoverage['ui/editor.js'][198] = 0; + _$jscoverage['ui/editor.js'][200] = 0; + _$jscoverage['ui/editor.js'][201] = 0; + _$jscoverage['ui/editor.js'][202] = 0; + _$jscoverage['ui/editor.js'][203] = 0; + _$jscoverage['ui/editor.js'][206] = 0; + _$jscoverage['ui/editor.js'][207] = 0; + _$jscoverage['ui/editor.js'][208] = 0; + _$jscoverage['ui/editor.js'][211] = 0; + _$jscoverage['ui/editor.js'][212] = 0; + _$jscoverage['ui/editor.js'][215] = 0; + _$jscoverage['ui/editor.js'][216] = 0; + _$jscoverage['ui/editor.js'][217] = 0; + _$jscoverage['ui/editor.js'][220] = 0; + _$jscoverage['ui/editor.js'][223] = 0; + _$jscoverage['ui/editor.js'][224] = 0; + _$jscoverage['ui/editor.js'][225] = 0; + _$jscoverage['ui/editor.js'][226] = 0; + _$jscoverage['ui/editor.js'][227] = 0; + _$jscoverage['ui/editor.js'][228] = 0; + _$jscoverage['ui/editor.js'][229] = 0; + _$jscoverage['ui/editor.js'][232] = 0; + _$jscoverage['ui/editor.js'][233] = 0; + _$jscoverage['ui/editor.js'][234] = 0; + _$jscoverage['ui/editor.js'][235] = 0; + _$jscoverage['ui/editor.js'][237] = 0; + _$jscoverage['ui/editor.js'][241] = 0; + _$jscoverage['ui/editor.js'][242] = 0; + _$jscoverage['ui/editor.js'][243] = 0; + _$jscoverage['ui/editor.js'][246] = 0; + _$jscoverage['ui/editor.js'][247] = 0; + _$jscoverage['ui/editor.js'][248] = 0; + _$jscoverage['ui/editor.js'][249] = 0; + _$jscoverage['ui/editor.js'][251] = 0; + _$jscoverage['ui/editor.js'][252] = 0; + _$jscoverage['ui/editor.js'][254] = 0; + _$jscoverage['ui/editor.js'][255] = 0; + _$jscoverage['ui/editor.js'][257] = 0; + _$jscoverage['ui/editor.js'][258] = 0; + _$jscoverage['ui/editor.js'][260] = 0; + _$jscoverage['ui/editor.js'][261] = 0; + _$jscoverage['ui/editor.js'][263] = 0; + _$jscoverage['ui/editor.js'][264] = 0; + _$jscoverage['ui/editor.js'][265] = 0; + _$jscoverage['ui/editor.js'][269] = 0; + _$jscoverage['ui/editor.js'][271] = 0; + _$jscoverage['ui/editor.js'][272] = 0; + _$jscoverage['ui/editor.js'][274] = 0; + _$jscoverage['ui/editor.js'][275] = 0; + _$jscoverage['ui/editor.js'][277] = 0; + _$jscoverage['ui/editor.js'][284] = 0; + _$jscoverage['ui/editor.js'][287] = 0; + _$jscoverage['ui/editor.js'][288] = 0; + _$jscoverage['ui/editor.js'][289] = 0; + _$jscoverage['ui/editor.js'][290] = 0; + _$jscoverage['ui/editor.js'][291] = 0; + _$jscoverage['ui/editor.js'][292] = 0; + _$jscoverage['ui/editor.js'][293] = 0; + _$jscoverage['ui/editor.js'][295] = 0; + _$jscoverage['ui/editor.js'][296] = 0; + _$jscoverage['ui/editor.js'][298] = 0; + _$jscoverage['ui/editor.js'][302] = 0; + _$jscoverage['ui/editor.js'][306] = 0; + _$jscoverage['ui/editor.js'][307] = 0; + _$jscoverage['ui/editor.js'][308] = 0; + _$jscoverage['ui/editor.js'][309] = 0; + _$jscoverage['ui/editor.js'][311] = 0; + _$jscoverage['ui/editor.js'][318] = 0; + _$jscoverage['ui/editor.js'][319] = 0; + _$jscoverage['ui/editor.js'][320] = 0; + _$jscoverage['ui/editor.js'][321] = 0; + _$jscoverage['ui/editor.js'][322] = 0; + _$jscoverage['ui/editor.js'][323] = 0; + _$jscoverage['ui/editor.js'][324] = 0; + _$jscoverage['ui/editor.js'][325] = 0; + _$jscoverage['ui/editor.js'][326] = 0; + _$jscoverage['ui/editor.js'][327] = 0; + _$jscoverage['ui/editor.js'][328] = 0; + _$jscoverage['ui/editor.js'][329] = 0; + _$jscoverage['ui/editor.js'][330] = 0; + _$jscoverage['ui/editor.js'][332] = 0; + _$jscoverage['ui/editor.js'][333] = 0; + _$jscoverage['ui/editor.js'][335] = 0; + _$jscoverage['ui/editor.js'][336] = 0; + _$jscoverage['ui/editor.js'][340] = 0; + _$jscoverage['ui/editor.js'][341] = 0; + _$jscoverage['ui/editor.js'][342] = 0; + _$jscoverage['ui/editor.js'][344] = 0; + _$jscoverage['ui/editor.js'][347] = 0; + _$jscoverage['ui/editor.js'][352] = 0; + _$jscoverage['ui/editor.js'][354] = 0; + _$jscoverage['ui/editor.js'][356] = 0; + _$jscoverage['ui/editor.js'][359] = 0; + _$jscoverage['ui/editor.js'][361] = 0; + _$jscoverage['ui/editor.js'][364] = 0; + _$jscoverage['ui/editor.js'][388] = 0; + _$jscoverage['ui/editor.js'][389] = 0; + _$jscoverage['ui/editor.js'][392] = 0; + _$jscoverage['ui/editor.js'][393] = 0; + _$jscoverage['ui/editor.js'][394] = 0; + _$jscoverage['ui/editor.js'][396] = 0; + _$jscoverage['ui/editor.js'][400] = 0; + _$jscoverage['ui/editor.js'][402] = 0; + _$jscoverage['ui/editor.js'][403] = 0; + _$jscoverage['ui/editor.js'][404] = 0; + _$jscoverage['ui/editor.js'][405] = 0; + _$jscoverage['ui/editor.js'][406] = 0; + _$jscoverage['ui/editor.js'][408] = 0; + _$jscoverage['ui/editor.js'][409] = 0; + _$jscoverage['ui/editor.js'][410] = 0; + _$jscoverage['ui/editor.js'][411] = 0; + _$jscoverage['ui/editor.js'][412] = 0; + _$jscoverage['ui/editor.js'][413] = 0; + _$jscoverage['ui/editor.js'][415] = 0; + _$jscoverage['ui/editor.js'][416] = 0; + _$jscoverage['ui/editor.js'][417] = 0; + _$jscoverage['ui/editor.js'][418] = 0; + _$jscoverage['ui/editor.js'][420] = 0; + _$jscoverage['ui/editor.js'][421] = 0; + _$jscoverage['ui/editor.js'][423] = 0; + _$jscoverage['ui/editor.js'][424] = 0; + _$jscoverage['ui/editor.js'][427] = 0; + _$jscoverage['ui/editor.js'][428] = 0; + _$jscoverage['ui/editor.js'][429] = 0; + _$jscoverage['ui/editor.js'][430] = 0; + _$jscoverage['ui/editor.js'][431] = 0; + _$jscoverage['ui/editor.js'][432] = 0; + _$jscoverage['ui/editor.js'][434] = 0; + _$jscoverage['ui/editor.js'][435] = 0; + _$jscoverage['ui/editor.js'][436] = 0; + _$jscoverage['ui/editor.js'][438] = 0; + _$jscoverage['ui/editor.js'][439] = 0; + _$jscoverage['ui/editor.js'][440] = 0; + _$jscoverage['ui/editor.js'][441] = 0; + _$jscoverage['ui/editor.js'][442] = 0; + _$jscoverage['ui/editor.js'][445] = 0; + _$jscoverage['ui/editor.js'][446] = 0; + _$jscoverage['ui/editor.js'][447] = 0; + _$jscoverage['ui/editor.js'][448] = 0; + _$jscoverage['ui/editor.js'][450] = 0; + _$jscoverage['ui/editor.js'][451] = 0; + _$jscoverage['ui/editor.js'][452] = 0; + _$jscoverage['ui/editor.js'][453] = 0; + _$jscoverage['ui/editor.js'][454] = 0; + _$jscoverage['ui/editor.js'][455] = 0; + _$jscoverage['ui/editor.js'][456] = 0; + _$jscoverage['ui/editor.js'][457] = 0; + _$jscoverage['ui/editor.js'][458] = 0; + _$jscoverage['ui/editor.js'][459] = 0; + _$jscoverage['ui/editor.js'][460] = 0; + _$jscoverage['ui/editor.js'][461] = 0; + _$jscoverage['ui/editor.js'][466] = 0; + _$jscoverage['ui/editor.js'][467] = 0; + _$jscoverage['ui/editor.js'][468] = 0; + _$jscoverage['ui/editor.js'][474] = 0; + _$jscoverage['ui/editor.js'][475] = 0; + _$jscoverage['ui/editor.js'][476] = 0; + _$jscoverage['ui/editor.js'][477] = 0; + _$jscoverage['ui/editor.js'][478] = 0; + _$jscoverage['ui/editor.js'][480] = 0; + _$jscoverage['ui/editor.js'][481] = 0; + _$jscoverage['ui/editor.js'][482] = 0; + _$jscoverage['ui/editor.js'][491] = 0; + _$jscoverage['ui/editor.js'][492] = 0; + _$jscoverage['ui/editor.js'][494] = 0; + _$jscoverage['ui/editor.js'][495] = 0; + _$jscoverage['ui/editor.js'][496] = 0; + _$jscoverage['ui/editor.js'][498] = 0; + _$jscoverage['ui/editor.js'][501] = 0; + _$jscoverage['ui/editor.js'][505] = 0; + _$jscoverage['ui/editor.js'][506] = 0; + _$jscoverage['ui/editor.js'][507] = 0; + _$jscoverage['ui/editor.js'][508] = 0; + _$jscoverage['ui/editor.js'][512] = 0; + _$jscoverage['ui/editor.js'][513] = 0; + _$jscoverage['ui/editor.js'][514] = 0; + _$jscoverage['ui/editor.js'][515] = 0; + _$jscoverage['ui/editor.js'][518] = 0; + _$jscoverage['ui/editor.js'][527] = 0; + _$jscoverage['ui/editor.js'][536] = 0; + _$jscoverage['ui/editor.js'][537] = 0; + _$jscoverage['ui/editor.js'][539] = 0; + _$jscoverage['ui/editor.js'][540] = 0; + _$jscoverage['ui/editor.js'][543] = 0; + _$jscoverage['ui/editor.js'][546] = 0; + _$jscoverage['ui/editor.js'][547] = 0; + _$jscoverage['ui/editor.js'][548] = 0; + _$jscoverage['ui/editor.js'][551] = 0; + _$jscoverage['ui/editor.js'][553] = 0; + _$jscoverage['ui/editor.js'][554] = 0; + _$jscoverage['ui/editor.js'][555] = 0; + _$jscoverage['ui/editor.js'][558] = 0; + _$jscoverage['ui/editor.js'][559] = 0; + _$jscoverage['ui/editor.js'][560] = 0; + _$jscoverage['ui/editor.js'][561] = 0; + _$jscoverage['ui/editor.js'][562] = 0; + _$jscoverage['ui/editor.js'][563] = 0; + _$jscoverage['ui/editor.js'][567] = 0; + _$jscoverage['ui/editor.js'][568] = 0; + _$jscoverage['ui/editor.js'][569] = 0; + _$jscoverage['ui/editor.js'][570] = 0; + _$jscoverage['ui/editor.js'][571] = 0; + _$jscoverage['ui/editor.js'][572] = 0; + _$jscoverage['ui/editor.js'][573] = 0; + _$jscoverage['ui/editor.js'][575] = 0; + _$jscoverage['ui/editor.js'][576] = 0; + _$jscoverage['ui/editor.js'][577] = 0; + _$jscoverage['ui/editor.js'][579] = 0; + _$jscoverage['ui/editor.js'][580] = 0; + _$jscoverage['ui/editor.js'][581] = 0; + _$jscoverage['ui/editor.js'][585] = 0; + _$jscoverage['ui/editor.js'][586] = 0; + _$jscoverage['ui/editor.js'][587] = 0; + _$jscoverage['ui/editor.js'][588] = 0; + _$jscoverage['ui/editor.js'][589] = 0; + _$jscoverage['ui/editor.js'][591] = 0; + _$jscoverage['ui/editor.js'][593] = 0; + _$jscoverage['ui/editor.js'][594] = 0; + _$jscoverage['ui/editor.js'][596] = 0; + _$jscoverage['ui/editor.js'][597] = 0; + _$jscoverage['ui/editor.js'][598] = 0; + _$jscoverage['ui/editor.js'][599] = 0; + _$jscoverage['ui/editor.js'][602] = 0; + _$jscoverage['ui/editor.js'][603] = 0; + _$jscoverage['ui/editor.js'][604] = 0; + _$jscoverage['ui/editor.js'][606] = 0; + _$jscoverage['ui/editor.js'][609] = 0; + _$jscoverage['ui/editor.js'][611] = 0; + _$jscoverage['ui/editor.js'][612] = 0; + _$jscoverage['ui/editor.js'][613] = 0; + _$jscoverage['ui/editor.js'][614] = 0; + _$jscoverage['ui/editor.js'][616] = 0; + _$jscoverage['ui/editor.js'][617] = 0; + _$jscoverage['ui/editor.js'][618] = 0; + _$jscoverage['ui/editor.js'][619] = 0; + _$jscoverage['ui/editor.js'][623] = 0; + _$jscoverage['ui/editor.js'][626] = 0; + _$jscoverage['ui/editor.js'][627] = 0; + _$jscoverage['ui/editor.js'][628] = 0; + _$jscoverage['ui/editor.js'][630] = 0; + _$jscoverage['ui/editor.js'][631] = 0; + _$jscoverage['ui/editor.js'][634] = 0; + _$jscoverage['ui/editor.js'][635] = 0; + _$jscoverage['ui/editor.js'][636] = 0; + _$jscoverage['ui/editor.js'][639] = 0; + _$jscoverage['ui/editor.js'][641] = 0; + _$jscoverage['ui/editor.js'][642] = 0; + _$jscoverage['ui/editor.js'][643] = 0; + _$jscoverage['ui/editor.js'][647] = 0; + _$jscoverage['ui/editor.js'][648] = 0; + _$jscoverage['ui/editor.js'][650] = 0; + _$jscoverage['ui/editor.js'][651] = 0; + _$jscoverage['ui/editor.js'][652] = 0; + _$jscoverage['ui/editor.js'][656] = 0; + _$jscoverage['ui/editor.js'][659] = 0; + _$jscoverage['ui/editor.js'][662] = 0; + _$jscoverage['ui/editor.js'][663] = 0; + _$jscoverage['ui/editor.js'][664] = 0; + _$jscoverage['ui/editor.js'][666] = 0; + _$jscoverage['ui/editor.js'][670] = 0; + _$jscoverage['ui/editor.js'][673] = 0; + _$jscoverage['ui/editor.js'][676] = 0; + _$jscoverage['ui/editor.js'][677] = 0; + _$jscoverage['ui/editor.js'][678] = 0; + _$jscoverage['ui/editor.js'][679] = 0; + _$jscoverage['ui/editor.js'][686] = 0; + _$jscoverage['ui/editor.js'][687] = 0; + _$jscoverage['ui/editor.js'][688] = 0; + _$jscoverage['ui/editor.js'][689] = 0; + _$jscoverage['ui/editor.js'][690] = 0; + _$jscoverage['ui/editor.js'][692] = 0; + _$jscoverage['ui/editor.js'][693] = 0; + _$jscoverage['ui/editor.js'][694] = 0; + _$jscoverage['ui/editor.js'][695] = 0; + _$jscoverage['ui/editor.js'][698] = 0; + _$jscoverage['ui/editor.js'][699] = 0; + _$jscoverage['ui/editor.js'][700] = 0; + _$jscoverage['ui/editor.js'][701] = 0; + _$jscoverage['ui/editor.js'][703] = 0; + _$jscoverage['ui/editor.js'][704] = 0; + _$jscoverage['ui/editor.js'][705] = 0; + _$jscoverage['ui/editor.js'][706] = 0; + _$jscoverage['ui/editor.js'][707] = 0; + _$jscoverage['ui/editor.js'][708] = 0; + _$jscoverage['ui/editor.js'][712] = 0; + _$jscoverage['ui/editor.js'][713] = 0; + _$jscoverage['ui/editor.js'][714] = 0; + _$jscoverage['ui/editor.js'][715] = 0; + _$jscoverage['ui/editor.js'][716] = 0; + _$jscoverage['ui/editor.js'][719] = 0; + _$jscoverage['ui/editor.js'][720] = 0; + _$jscoverage['ui/editor.js'][722] = 0; + _$jscoverage['ui/editor.js'][723] = 0; + _$jscoverage['ui/editor.js'][727] = 0; + _$jscoverage['ui/editor.js'][728] = 0; + _$jscoverage['ui/editor.js'][729] = 0; + _$jscoverage['ui/editor.js'][731] = 0; + _$jscoverage['ui/editor.js'][732] = 0; + _$jscoverage['ui/editor.js'][733] = 0; + _$jscoverage['ui/editor.js'][734] = 0; + _$jscoverage['ui/editor.js'][735] = 0; + _$jscoverage['ui/editor.js'][736] = 0; + _$jscoverage['ui/editor.js'][738] = 0; + _$jscoverage['ui/editor.js'][739] = 0; + _$jscoverage['ui/editor.js'][741] = 0; + _$jscoverage['ui/editor.js'][743] = 0; + _$jscoverage['ui/editor.js'][744] = 0; + _$jscoverage['ui/editor.js'][746] = 0; + _$jscoverage['ui/editor.js'][748] = 0; + _$jscoverage['ui/editor.js'][749] = 0; + _$jscoverage['ui/editor.js'][753] = 0; + _$jscoverage['ui/editor.js'][754] = 0; + _$jscoverage['ui/editor.js'][756] = 0; + _$jscoverage['ui/editor.js'][757] = 0; + _$jscoverage['ui/editor.js'][758] = 0; + _$jscoverage['ui/editor.js'][763] = 0; + _$jscoverage['ui/editor.js'][788] = 0; + _$jscoverage['ui/editor.js'][789] = 0; + _$jscoverage['ui/editor.js'][790] = 0; + _$jscoverage['ui/editor.js'][791] = 0; + _$jscoverage['ui/editor.js'][792] = 0; + _$jscoverage['ui/editor.js'][794] = 0; + _$jscoverage['ui/editor.js'][798] = 0; + _$jscoverage['ui/editor.js'][799] = 0; + _$jscoverage['ui/editor.js'][800] = 0; + _$jscoverage['ui/editor.js'][801] = 0; + _$jscoverage['ui/editor.js'][802] = 0; +} +_$jscoverage['ui/editor.js'].source = ["///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;",""," //display bottom-bar label based on config"," if (editor.options.elementPathEnabled) {"," editor.ui.getDom('elementpath').innerHTML = '<div class=\"edui-editor-breadcrumb\">' + editor.getLang(\"elementPathTip\") + ':</div>';"," }"," 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');"," 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 () {"," editor._iframe = popup.anchorEl;"," 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/ig.test(el.tagName)) {"," var html = popup.formatHtml("," '<nobr>' + editor.getLang(\"property\") + ': <span onclick=$$._setIframeAlign(-2) class=\"edui-clickable\">' + editor.getLang(\"default\") + '</span>&nbsp;&nbsp;<span onclick=$$._setIframeAlign(-1) class=\"edui-clickable\">' + editor.getLang(\"justifyleft\") + '</span>&nbsp;&nbsp;<span onclick=$$._setIframeAlign(1) class=\"edui-clickable\">' + editor.getLang(\"justifyright\") + '</span>&nbsp;&nbsp;' +"," ' <span onclick=\"$$._updateIframe( this);\" class=\"edui-clickable\">' + editor.getLang(\"modify\") + '</span></nobr>');"," 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) {"," dialogName = \"insertvideoDialog\""," }"," if (img.className.indexOf(\"edui-faked-webapp\") != -1) {"," dialogName = \"webappDialog\""," }"," if (img.src.indexOf(\"http://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("," '<nobr>' + editor.getLang(\"property\") + ': <span onclick=$$._onImgEditButtonClick(\"anchorDialog\") class=\"edui-clickable\">' + editor.getLang(\"modify\") + '</span>&nbsp;&nbsp;' +"," '<span onclick=$$._onRemoveButtonClick(\\'anchor\\') class=\"edui-clickable\">' + editor.getLang(\"delete\") + '</span></nobr>');"," }"," if (img.getAttribute(\"word_img\")) {"," //todo 放到dialog去做查询"," editor.word_img = [img.getAttribute(\"word_img\")];"," dialogName = \"wordimageDialog\""," }"," if (!dialogs[dialogName]) {"," return;"," }"," str = '<nobr>' + editor.getLang(\"property\") + ': '+"," '<span onclick=$$._onImgSetFloat(\"none\") class=\"edui-clickable\">' + editor.getLang(\"default\") + '</span>&nbsp;&nbsp;' +"," '<span onclick=$$._onImgSetFloat(\"left\") class=\"edui-clickable\">' + editor.getLang(\"justifyleft\") + '</span>&nbsp;&nbsp;' +"," '<span onclick=$$._onImgSetFloat(\"right\") class=\"edui-clickable\">' + editor.getLang(\"justifyright\") + '</span>&nbsp;&nbsp;' +"," '<span onclick=$$._onImgSetFloat(\"center\") class=\"edui-clickable\">' + editor.getLang(\"justifycenter\") + '</span>&nbsp;&nbsp;'+"," '<span onclick=\"$$._onImgEditButtonClick(\\'' + dialogName + '\\');\" class=\"edui-clickable\">' + editor.getLang(\"modify\") + '</span></nobr>';",""," !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 += '<div style=\"height:5px;\"></div>'"," }"," html += popup.formatHtml("," '<nobr>' + editor.getLang(\"anthorMsg\") + ': <a target=\"_blank\" href=\"' + url + '\" title=\"' + url + '\" >' + txt + '</a>' +"," ' <span class=\"edui-clickable\" onclick=\"$$._onEditButtonClick();\">' + editor.getLang(\"modify\") + '</span>' +"," ' <span class=\"edui-clickable\" onclick=\"$$._onRemoveButtonClick(\\'unlink\\');\"> ' + editor.getLang(\"clear\") + '</span></nobr>');"," 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 = [];"," 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';"," }"," if (baidu.editor.ui[toolbarItem]) {"," toolbarItemUi = new baidu.editor.ui[toolbarItem](editor);"," }",""," //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;"," }"," this.toolbars = toolbarUis;"," },"," getHtmlTpl:function () {"," return '<div id=\"##\" class=\"%%\">' +"," '<div id=\"##_toolbarbox\" class=\"%%-toolbarbox\">' +"," (this.toolbars.length ?"," '<div id=\"##_toolbarboxouter\" class=\"%%-toolbarboxouter\"><div class=\"%%-toolbarboxinner\">' +"," this.renderToolbarBoxHtml() +"," '</div></div>' : '') +"," '<div id=\"##_toolbarmsg\" class=\"%%-toolbarmsg\" style=\"display:none;\">' +"," '<div id = \"##_upload_dialog\" class=\"%%-toolbarmsg-upload\" onclick=\"$$.showWordImageDialog();\">' + this.editor.getLang(\"clickToUpload\") + '</div>' +"," '<div class=\"%%-toolbarmsg-close\" onclick=\"$$.hideToolbarMsg();\">x</div>' +"," '<div id=\"##_toolbarmsg_label\" class=\"%%-toolbarmsg-label\"></div>' +"," '<div style=\"height:0;overflow:hidden;clear:both;\"></div>' +"," '</div>' +"," '</div>' +"," '<div id=\"##_iframeholder\" class=\"%%-iframeholder\"></div>' +"," //modify wdcount by matao"," '<div id=\"##_bottombar\" class=\"%%-bottomContainer\"><table><tr>' +"," '<td id=\"##_elementpath\" class=\"%%-bottombar\"></td>' +"," '<td id=\"##_wordcount\" class=\"%%-wordcount\"></td>' +"," '<td id=\"##_scale\" class=\"%%-scale\"><div class=\"%%-icon\"></div></td>' +"," '</tr></table></div>' +"," '<div id=\"##_scalelayer\"></div>' +"," '</div>';"," },"," showWordImageDialog:function () {"," this.editor.execCommand(\"wordimage\", \"word_img\");"," 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';"," document.body.style.overflow = 'hidden';"," 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));"," //不手动调一下,会导致全屏失效"," 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('<span unselectable=\"on\" onclick=\"$$.editor.execCommand(&quot;elementpath&quot;, &quot;' + i + '&quot;);\">' + ci + '</span>');"," }"," bottom.innerHTML = '<div class=\"edui-editor-breadcrumb\" onmousedown=\"return false;\">' + this.editor.getLang(\"elementPathTip\") + ': ' + buff.join(' &gt; ') + '</div>';",""," } 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);"," }"," if (scalelayer) {"," scalelayer.style.display = \"none\";"," }"," clearSelection();"," domUtils.un(doc, \"mousemove\", move);"," domUtils.un(editorDocument, \"mouseup\", up);"," domUtils.un(doc, \"mouseup\", up);"," }",""," function clearSelection() {"," if (browser.ie)"," doc.selection.clear();"," else"," window.getSelection().removeAllRanges();"," }",""," this.enableScale = function () {"," //trace:2868"," if (editor.queryCommandState(\"source\") == 1) return;"," scale.style.display = \"\";"," this.scaleEnabled = true;"," domUtils.on(scale, \"mousedown\", down);"," };"," this.disableScale = function () {"," scale.style.display = \"none\";"," this.scaleEnabled = false;"," domUtils.un(scale, \"mousedown\", down);"," };"," },"," isFullScreen:function () {"," return this._fullscreen;"," },"," postRender:function () {"," UIBase.prototype.postRender.call(this);"," for (var i = 0; i < this.toolbars.length; i++) {"," this.toolbars[i].postRender();"," }"," var me = this;"," var timerId,"," domUtils = baidu.editor.dom.domUtils,"," updateFullScreenTime = function () {"," clearTimeout(timerId);"," timerId = setTimeout(function () {"," me._updateFullScreen();"," });"," };"," domUtils.on(window, 'resize', updateFullScreenTime);",""," me.addListener('destroy', function () {"," domUtils.un(window, 'resize', updateFullScreenTime);"," clearTimeout(timerId);"," })"," },"," showToolbarMsg:function (msg, flag) {"," this.getDom('toolbarmsg_label').innerHTML = msg;"," this.getDom('toolbarmsg').style.display = '';"," //"," if (!flag) {"," var w = this.getDom('upload_dialog');"," w.style.display = 'none';"," }"," },"," hideToolbarMsg:function () {"," this.getDom('toolbarmsg').style.display = 'none';"," },"," mapUrl:function (url) {"," return url ? url.replace('~/', this.editor.options.UEDITOR_HOME_URL || '') : ''"," },"," triggerLayout:function () {"," var dom = this.getDom();"," if (dom.style.zoom == '1') {"," dom.style.zoom = '100%';"," } else {"," dom.style.zoom = '1';"," }"," }"," };"," utils.inherits(EditorUI, baidu.editor.ui.UIBase);","",""," var instances = {};","",""," UE.ui.Editor = function (options) {"," var editor = new UE.Editor(options);"," editor.options.editor = editor;"," utils.loadFile(document, {"," href:editor.options.themePath + editor.options.theme + \"/_css/ueditor.css\","," 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/ig.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})+</g, '<')"," .replace(/>[\\n\\r\\t]+</g, '><');"," 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);"," holder.id && (newDiv.id = 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;"," }"," 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'));",""," }"," })"," };"," 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]"," }"," }","})();"]; +_$jscoverage['ui/editor.js'][5]++; +(function () { + _$jscoverage['ui/editor.js'][6]++; + var utils = baidu.editor.utils, uiUtils = baidu.editor.ui.uiUtils, UIBase = baidu.editor.ui.UIBase, domUtils = baidu.editor.dom.domUtils; + _$jscoverage['ui/editor.js'][10]++; + var nodeStack = []; + _$jscoverage['ui/editor.js'][12]++; + function EditorUI(options) { + _$jscoverage['ui/editor.js'][13]++; + this.initOptions(options); + _$jscoverage['ui/editor.js'][14]++; + this.initEditorUI(); +} + _$jscoverage['ui/editor.js'][17]++; + EditorUI.prototype = {uiName: "editor", initEditorUI: (function () { + _$jscoverage['ui/editor.js'][20]++; + this.editor.ui = this; + _$jscoverage['ui/editor.js'][21]++; + this._dialogs = {}; + _$jscoverage['ui/editor.js'][22]++; + this.initUIBase(); + _$jscoverage['ui/editor.js'][23]++; + this._initToolbars(); + _$jscoverage['ui/editor.js'][24]++; + var editor = this.editor, me = this; + _$jscoverage['ui/editor.js'][27]++; + editor.addListener("ready", (function () { + _$jscoverage['ui/editor.js'][29]++; + editor.getDialog = (function (name) { + _$jscoverage['ui/editor.js'][30]++; + return editor.ui._dialogs[(name + "Dialog")]; +}); + _$jscoverage['ui/editor.js'][32]++; + domUtils.on(editor.window, "scroll", (function (evt) { + _$jscoverage['ui/editor.js'][33]++; + baidu.editor.ui.Popup.postHide(evt); +})); + _$jscoverage['ui/editor.js'][36]++; + editor.ui._actualFrameWidth = editor.options.initialFrameWidth; + _$jscoverage['ui/editor.js'][39]++; + if (editor.options.elementPathEnabled) { + _$jscoverage['ui/editor.js'][40]++; + editor.ui.getDom("elementpath").innerHTML = ("
    " + editor.getLang("elementPathTip") + ":
    "); + } + _$jscoverage['ui/editor.js'][42]++; + if (editor.options.wordCount) { + _$jscoverage['ui/editor.js'][43]++; + function countFn() { + _$jscoverage['ui/editor.js'][44]++; + setCount(editor, me); + _$jscoverage['ui/editor.js'][45]++; + domUtils.un(editor.document, "click", arguments.callee); +} + _$jscoverage['ui/editor.js'][47]++; + domUtils.on(editor.document, "click", countFn); + _$jscoverage['ui/editor.js'][48]++; + editor.ui.getDom("wordcount").innerHTML = editor.getLang("wordCountTip"); + } + _$jscoverage['ui/editor.js'][50]++; + editor.ui._scale(); + _$jscoverage['ui/editor.js'][51]++; + if (editor.options.scaleEnabled) { + _$jscoverage['ui/editor.js'][52]++; + if (editor.autoHeightEnabled) { + _$jscoverage['ui/editor.js'][53]++; + editor.disableAutoHeight(); + } + _$jscoverage['ui/editor.js'][55]++; + me.enableScale(); + } + else { + _$jscoverage['ui/editor.js'][57]++; + me.disableScale(); + } + _$jscoverage['ui/editor.js'][59]++; + if (((! editor.options.elementPathEnabled) && (! editor.options.wordCount) && (! editor.options.scaleEnabled))) { + _$jscoverage['ui/editor.js'][60]++; + editor.ui.getDom("elementpath").style.display = "none"; + _$jscoverage['ui/editor.js'][61]++; + editor.ui.getDom("wordcount").style.display = "none"; + _$jscoverage['ui/editor.js'][62]++; + editor.ui.getDom("scale").style.display = "none"; + } + _$jscoverage['ui/editor.js'][65]++; + if ((! editor.selection.isFocus())) { + _$jscoverage['ui/editor.js'][65]++; + return; + } + _$jscoverage['ui/editor.js'][66]++; + editor.fireEvent("selectionchange", false, true); +})); + _$jscoverage['ui/editor.js'][71]++; + editor.addListener("mousedown", (function (t, evt) { + _$jscoverage['ui/editor.js'][72]++; + var el = (evt.target || evt.srcElement); + _$jscoverage['ui/editor.js'][73]++; + baidu.editor.ui.Popup.postHide(evt, el); + _$jscoverage['ui/editor.js'][74]++; + baidu.editor.ui.ShortCutMenu.postHide(evt); +})); + _$jscoverage['ui/editor.js'][77]++; + editor.addListener("delcells", (function () { + _$jscoverage['ui/editor.js'][78]++; + if (UE.ui.edittip) { + _$jscoverage['ui/editor.js'][79]++; + new (UE.ui.edittip)(editor); + } + _$jscoverage['ui/editor.js'][81]++; + editor.getDialog("edittip").open(); +})); + _$jscoverage['ui/editor.js'][84]++; + var pastePop, isPaste = false, timer; + _$jscoverage['ui/editor.js'][85]++; + editor.addListener("afterpaste", (function () { + _$jscoverage['ui/editor.js'][86]++; + if (editor.queryCommandState("pasteplain")) { + _$jscoverage['ui/editor.js'][87]++; + return; + } + _$jscoverage['ui/editor.js'][88]++; + if (baidu.editor.ui.PastePicker) { + _$jscoverage['ui/editor.js'][89]++; + pastePop = new (baidu.editor.ui.Popup)({content: new (baidu.editor.ui.PastePicker)({editor: editor}), editor: editor, className: "edui-wordpastepop"}); + _$jscoverage['ui/editor.js'][94]++; + pastePop.render(); + } + _$jscoverage['ui/editor.js'][96]++; + isPaste = true; +})); + _$jscoverage['ui/editor.js'][99]++; + editor.addListener("afterinserthtml", (function () { + _$jscoverage['ui/editor.js'][100]++; + clearTimeout(timer); + _$jscoverage['ui/editor.js'][101]++; + timer = setTimeout((function () { + _$jscoverage['ui/editor.js'][102]++; + if ((pastePop && (isPaste || editor.ui._isTransfer))) { + _$jscoverage['ui/editor.js'][103]++; + if (pastePop.isHidden()) { + _$jscoverage['ui/editor.js'][104]++; + var span = domUtils.createElement(editor.document, "span", {"style": "line-height:0px;", "innerHTML": "\ufeff"}), range = editor.selection.getRange(); + _$jscoverage['ui/editor.js'][109]++; + range.insertNode(span); + _$jscoverage['ui/editor.js'][110]++; + var tmp = getDomNode(span, "firstChild", "previousSibling"); + _$jscoverage['ui/editor.js'][111]++; + pastePop.showAnchor(((tmp.nodeType == 3)? tmp.parentNode: tmp)); + _$jscoverage['ui/editor.js'][112]++; + domUtils.remove(span); + } + else { + _$jscoverage['ui/editor.js'][115]++; + pastePop.show(); + } + _$jscoverage['ui/editor.js'][117]++; + (delete editor.ui._isTransfer); + _$jscoverage['ui/editor.js'][118]++; + isPaste = false; + } +}), 200); +})); + _$jscoverage['ui/editor.js'][122]++; + editor.addListener("contextmenu", (function (t, evt) { + _$jscoverage['ui/editor.js'][123]++; + baidu.editor.ui.Popup.postHide(evt); +})); + _$jscoverage['ui/editor.js'][125]++; + editor.addListener("keydown", (function (t, evt) { + _$jscoverage['ui/editor.js'][126]++; + if (pastePop) { + _$jscoverage['ui/editor.js'][126]++; + pastePop.dispose(evt); + } + _$jscoverage['ui/editor.js'][127]++; + var keyCode = (evt.keyCode || evt.which); + _$jscoverage['ui/editor.js'][128]++; + if ((evt.altKey && (keyCode == 90))) { + _$jscoverage['ui/editor.js'][129]++; + UE.ui.buttons.fullscreen.onclick(); + } +})); + _$jscoverage['ui/editor.js'][132]++; + editor.addListener("wordcount", (function (type) { + _$jscoverage['ui/editor.js'][133]++; + setCount(this, me); +})); + _$jscoverage['ui/editor.js'][135]++; + function setCount(editor, ui) { + _$jscoverage['ui/editor.js'][136]++; + editor.setOpt({wordCount: true, maximumWords: 10000, wordCountMsg: (editor.options.wordCountMsg || editor.getLang("wordCountMsg")), wordOverFlowMsg: (editor.options.wordOverFlowMsg || editor.getLang("wordOverFlowMsg"))}); + _$jscoverage['ui/editor.js'][142]++; + var opt = editor.options, max = opt.maximumWords, msg = opt.wordCountMsg, errMsg = opt.wordOverFlowMsg, countDom = ui.getDom("wordcount"); + _$jscoverage['ui/editor.js'][147]++; + if ((! opt.wordCount)) { + _$jscoverage['ui/editor.js'][148]++; + return; + } + _$jscoverage['ui/editor.js'][150]++; + var count = editor.getContentLength(true); + _$jscoverage['ui/editor.js'][151]++; + if ((count > max)) { + _$jscoverage['ui/editor.js'][152]++; + countDom.innerHTML = errMsg; + _$jscoverage['ui/editor.js'][153]++; + editor.fireEvent("wordcountoverflow"); + } + else { + _$jscoverage['ui/editor.js'][155]++; + countDom.innerHTML = msg.replace("{#leave}", (max - count)).replace("{#count}", count); + } +} + _$jscoverage['ui/editor.js'][159]++; + editor.addListener("selectionchange", (function () { + _$jscoverage['ui/editor.js'][160]++; + if (editor.options.elementPathEnabled) { + _$jscoverage['ui/editor.js'][161]++; + (me[(((editor.queryCommandState("elementpath") == -1)? "dis": "en") + "ableElementPath")])(); + } + _$jscoverage['ui/editor.js'][163]++; + if (editor.options.scaleEnabled) { + _$jscoverage['ui/editor.js'][164]++; + (me[(((editor.queryCommandState("scale") == -1)? "dis": "en") + "ableScale")])(); + } +})); + _$jscoverage['ui/editor.js'][168]++; + var popup = new (baidu.editor.ui.Popup)({editor: editor, content: "", className: "edui-bubble", _onEditButtonClick: (function () { + _$jscoverage['ui/editor.js'][173]++; + this.hide(); + _$jscoverage['ui/editor.js'][174]++; + editor.ui._dialogs.linkDialog.open(); +}), _onImgEditButtonClick: (function (name) { + _$jscoverage['ui/editor.js'][177]++; + this.hide(); + _$jscoverage['ui/editor.js'][178]++; + (editor.ui._dialogs[name] && editor.ui._dialogs[name].open()); +}), _onImgSetFloat: (function (value) { + _$jscoverage['ui/editor.js'][182]++; + this.hide(); + _$jscoverage['ui/editor.js'][183]++; + editor.execCommand("imagefloat", value); +}), _setIframeAlign: (function (value) { + _$jscoverage['ui/editor.js'][187]++; + var frame = popup.anchorEl; + _$jscoverage['ui/editor.js'][188]++; + var newFrame = frame.cloneNode(true); + _$jscoverage['ui/editor.js'][189]++; + switch (value) { + case -2: + _$jscoverage['ui/editor.js'][191]++; + newFrame.setAttribute("align", ""); + _$jscoverage['ui/editor.js'][192]++; + break; + case -1: + _$jscoverage['ui/editor.js'][194]++; + newFrame.setAttribute("align", "left"); + _$jscoverage['ui/editor.js'][195]++; + break; + case 1: + _$jscoverage['ui/editor.js'][197]++; + newFrame.setAttribute("align", "right"); + _$jscoverage['ui/editor.js'][198]++; + break; + } + _$jscoverage['ui/editor.js'][200]++; + frame.parentNode.insertBefore(newFrame, frame); + _$jscoverage['ui/editor.js'][201]++; + domUtils.remove(frame); + _$jscoverage['ui/editor.js'][202]++; + popup.anchorEl = newFrame; + _$jscoverage['ui/editor.js'][203]++; + popup.showAnchor(popup.anchorEl); +}), _updateIframe: (function () { + _$jscoverage['ui/editor.js'][206]++; + editor._iframe = popup.anchorEl; + _$jscoverage['ui/editor.js'][207]++; + editor.ui._dialogs.insertframeDialog.open(); + _$jscoverage['ui/editor.js'][208]++; + popup.hide(); +}), _onRemoveButtonClick: (function (cmdName) { + _$jscoverage['ui/editor.js'][211]++; + editor.execCommand(cmdName); + _$jscoverage['ui/editor.js'][212]++; + this.hide(); +}), queryAutoHide: (function (el) { + _$jscoverage['ui/editor.js'][215]++; + if ((el && (el.ownerDocument == editor.document))) { + _$jscoverage['ui/editor.js'][216]++; + if (((el.tagName.toLowerCase() == "img") || domUtils.findParentByTagName(el, "a", true))) { + _$jscoverage['ui/editor.js'][217]++; + return (el !== popup.anchorEl); + } + } + _$jscoverage['ui/editor.js'][220]++; + return baidu.editor.ui.Popup.prototype.queryAutoHide.call(this, el); +})}); + _$jscoverage['ui/editor.js'][223]++; + popup.render(); + _$jscoverage['ui/editor.js'][224]++; + if (editor.options.imagePopup) { + _$jscoverage['ui/editor.js'][225]++; + editor.addListener("mouseover", (function (t, evt) { + _$jscoverage['ui/editor.js'][226]++; + evt = (evt || window.event); + _$jscoverage['ui/editor.js'][227]++; + var el = (evt.target || evt.srcElement); + _$jscoverage['ui/editor.js'][228]++; + if ((editor.ui._dialogs.insertframeDialog && /iframe/gi.test(el.tagName))) { + _$jscoverage['ui/editor.js'][229]++; + var html = popup.formatHtml(("" + editor.getLang("property") + ": " + editor.getLang("default") + "  " + editor.getLang("justifyleft") + "  " + editor.getLang("justifyright") + "  " + " " + editor.getLang("modify") + "")); + _$jscoverage['ui/editor.js'][232]++; + if (html) { + _$jscoverage['ui/editor.js'][233]++; + popup.getDom("content").innerHTML = html; + _$jscoverage['ui/editor.js'][234]++; + popup.anchorEl = el; + _$jscoverage['ui/editor.js'][235]++; + popup.showAnchor(popup.anchorEl); + } + else { + _$jscoverage['ui/editor.js'][237]++; + popup.hide(); + } + } +})); + _$jscoverage['ui/editor.js'][241]++; + editor.addListener("selectionchange", (function (t, causeByUi) { + _$jscoverage['ui/editor.js'][242]++; + if ((! causeByUi)) { + _$jscoverage['ui/editor.js'][242]++; + return; + } + _$jscoverage['ui/editor.js'][243]++; + var html = "", str = "", img = editor.selection.getRange().getClosedNode(), dialogs = editor.ui._dialogs; + _$jscoverage['ui/editor.js'][246]++; + if ((img && (img.tagName == "IMG"))) { + _$jscoverage['ui/editor.js'][247]++; + var dialogName = "insertimageDialog"; + _$jscoverage['ui/editor.js'][248]++; + if ((img.className.indexOf("edui-faked-video") != -1)) { + _$jscoverage['ui/editor.js'][249]++; + dialogName = "insertvideoDialog"; + } + _$jscoverage['ui/editor.js'][251]++; + if ((img.className.indexOf("edui-faked-webapp") != -1)) { + _$jscoverage['ui/editor.js'][252]++; + dialogName = "webappDialog"; + } + _$jscoverage['ui/editor.js'][254]++; + if ((img.src.indexOf("http://api.map.baidu.com") != -1)) { + _$jscoverage['ui/editor.js'][255]++; + dialogName = "mapDialog"; + } + _$jscoverage['ui/editor.js'][257]++; + if ((img.className.indexOf("edui-faked-music") != -1)) { + _$jscoverage['ui/editor.js'][258]++; + dialogName = "musicDialog"; + } + _$jscoverage['ui/editor.js'][260]++; + if ((img.src.indexOf("http://maps.google.com/maps/api/staticmap") != -1)) { + _$jscoverage['ui/editor.js'][261]++; + dialogName = "gmapDialog"; + } + _$jscoverage['ui/editor.js'][263]++; + if (img.getAttribute("anchorname")) { + _$jscoverage['ui/editor.js'][264]++; + dialogName = "anchorDialog"; + _$jscoverage['ui/editor.js'][265]++; + html = popup.formatHtml(("" + editor.getLang("property") + ": " + editor.getLang("modify") + "  " + "" + editor.getLang("delete") + "")); + } + _$jscoverage['ui/editor.js'][269]++; + if (img.getAttribute("word_img")) { + _$jscoverage['ui/editor.js'][271]++; + editor.word_img = [img.getAttribute("word_img")]; + _$jscoverage['ui/editor.js'][272]++; + dialogName = "wordimageDialog"; + } + _$jscoverage['ui/editor.js'][274]++; + if ((! dialogs[dialogName])) { + _$jscoverage['ui/editor.js'][275]++; + return; + } + _$jscoverage['ui/editor.js'][277]++; + str = ("" + editor.getLang("property") + ": " + "" + editor.getLang("default") + "  " + "" + editor.getLang("justifyleft") + "  " + "" + editor.getLang("justifyright") + "  " + "" + editor.getLang("justifycenter") + "  " + "" + editor.getLang("modify") + ""); + _$jscoverage['ui/editor.js'][284]++; + ((! html) && (html = popup.formatHtml(str))); + } + _$jscoverage['ui/editor.js'][287]++; + if (editor.ui._dialogs.linkDialog) { + _$jscoverage['ui/editor.js'][288]++; + var link = editor.queryCommandValue("link"); + _$jscoverage['ui/editor.js'][289]++; + var url; + _$jscoverage['ui/editor.js'][290]++; + if ((link && (url = (link.getAttribute("_href") || link.getAttribute("href", 2))))) { + _$jscoverage['ui/editor.js'][291]++; + var txt = url; + _$jscoverage['ui/editor.js'][292]++; + if ((url.length > 30)) { + _$jscoverage['ui/editor.js'][293]++; + txt = (url.substring(0, 20) + "..."); + } + _$jscoverage['ui/editor.js'][295]++; + if (html) { + _$jscoverage['ui/editor.js'][296]++; + html += "
    "; + } + _$jscoverage['ui/editor.js'][298]++; + html += popup.formatHtml(("" + editor.getLang("anthorMsg") + ": " + txt + "" + " " + editor.getLang("modify") + "" + " " + editor.getLang("clear") + "")); + _$jscoverage['ui/editor.js'][302]++; + popup.showAnchor(link); + } + } + _$jscoverage['ui/editor.js'][306]++; + if (html) { + _$jscoverage['ui/editor.js'][307]++; + popup.getDom("content").innerHTML = html; + _$jscoverage['ui/editor.js'][308]++; + popup.anchorEl = (img || link); + _$jscoverage['ui/editor.js'][309]++; + popup.showAnchor(popup.anchorEl); + } + else { + _$jscoverage['ui/editor.js'][311]++; + popup.hide(); + } +})); + } +}), _initToolbars: (function () { + _$jscoverage['ui/editor.js'][318]++; + var editor = this.editor; + _$jscoverage['ui/editor.js'][319]++; + var toolbars = (this.toolbars || []); + _$jscoverage['ui/editor.js'][320]++; + var toolbarUis = []; + _$jscoverage['ui/editor.js'][321]++; + for (var i = 0; (i < toolbars.length); (i++)) { + _$jscoverage['ui/editor.js'][322]++; + var toolbar = toolbars[i]; + _$jscoverage['ui/editor.js'][323]++; + var toolbarUi = new (baidu.editor.ui.Toolbar)({theme: editor.options.theme}); + _$jscoverage['ui/editor.js'][324]++; + for (var j = 0; (j < toolbar.length); (j++)) { + _$jscoverage['ui/editor.js'][325]++; + var toolbarItem = toolbar[j]; + _$jscoverage['ui/editor.js'][326]++; + var toolbarItemUi = null; + _$jscoverage['ui/editor.js'][327]++; + if (((typeof toolbarItem) == "string")) { + _$jscoverage['ui/editor.js'][328]++; + toolbarItem = toolbarItem.toLowerCase(); + _$jscoverage['ui/editor.js'][329]++; + if ((toolbarItem == "|")) { + _$jscoverage['ui/editor.js'][330]++; + toolbarItem = "Separator"; + } + _$jscoverage['ui/editor.js'][332]++; + if ((toolbarItem == "||")) { + _$jscoverage['ui/editor.js'][333]++; + toolbarItem = "Breakline"; + } + _$jscoverage['ui/editor.js'][335]++; + if (baidu.editor.ui[toolbarItem]) { + _$jscoverage['ui/editor.js'][336]++; + toolbarItemUi = new (baidu.editor.ui[toolbarItem])(editor); + } + _$jscoverage['ui/editor.js'][340]++; + if ((toolbarItem == "fullscreen")) { + _$jscoverage['ui/editor.js'][341]++; + if ((toolbarUis && toolbarUis[0])) { + _$jscoverage['ui/editor.js'][342]++; + toolbarUis[0].items.splice(0, 0, toolbarItemUi); + } + else { + _$jscoverage['ui/editor.js'][344]++; + (toolbarItemUi && toolbarUi.items.splice(0, 0, toolbarItemUi)); + } + _$jscoverage['ui/editor.js'][347]++; + continue; + } + } + else { + _$jscoverage['ui/editor.js'][352]++; + toolbarItemUi = toolbarItem; + } + _$jscoverage['ui/editor.js'][354]++; + if ((toolbarItemUi && toolbarItemUi.id)) { + _$jscoverage['ui/editor.js'][356]++; + toolbarUi.add(toolbarItemUi); + } +} + _$jscoverage['ui/editor.js'][359]++; + toolbarUis[i] = toolbarUi; +} + _$jscoverage['ui/editor.js'][361]++; + this.toolbars = toolbarUis; +}), getHtmlTpl: (function () { + _$jscoverage['ui/editor.js'][364]++; + return ("
    " + "
    " + (this.toolbars.length? ("
    " + this.renderToolbarBoxHtml() + "
    "): "") + "
    " + "
    " + this.editor.getLang("clickToUpload") + "
    " + "
    x
    " + "
    " + "
    " + "
    " + "
    " + "
    " + "
    " + "" + "" + "" + "
    " + "
    " + "
    "); +}), showWordImageDialog: (function () { + _$jscoverage['ui/editor.js'][388]++; + this.editor.execCommand("wordimage", "word_img"); + _$jscoverage['ui/editor.js'][389]++; + this._dialogs.wordimageDialog.open(); +}), renderToolbarBoxHtml: (function () { + _$jscoverage['ui/editor.js'][392]++; + var buff = []; + _$jscoverage['ui/editor.js'][393]++; + for (var i = 0; (i < this.toolbars.length); (i++)) { + _$jscoverage['ui/editor.js'][394]++; + buff.push(this.toolbars[i].renderHtml()); +} + _$jscoverage['ui/editor.js'][396]++; + return buff.join(""); +}), setFullScreen: (function (fullscreen) { + _$jscoverage['ui/editor.js'][400]++; + var editor = this.editor, container = editor.container.parentNode.parentNode; + _$jscoverage['ui/editor.js'][402]++; + if ((this._fullscreen != fullscreen)) { + _$jscoverage['ui/editor.js'][403]++; + this._fullscreen = fullscreen; + _$jscoverage['ui/editor.js'][404]++; + this.editor.fireEvent("beforefullscreenchange", fullscreen); + _$jscoverage['ui/editor.js'][405]++; + if (baidu.editor.browser.gecko) { + _$jscoverage['ui/editor.js'][406]++; + var bk = editor.selection.getRange().createBookmark(); + } + _$jscoverage['ui/editor.js'][408]++; + if (fullscreen) { + _$jscoverage['ui/editor.js'][409]++; + while ((container.tagName != "BODY")) { + _$jscoverage['ui/editor.js'][410]++; + var position = baidu.editor.dom.domUtils.getComputedStyle(container, "position"); + _$jscoverage['ui/editor.js'][411]++; + nodeStack.push(position); + _$jscoverage['ui/editor.js'][412]++; + container.style.position = "static"; + _$jscoverage['ui/editor.js'][413]++; + container = container.parentNode; +} + _$jscoverage['ui/editor.js'][415]++; + this._bakHtmlOverflow = document.documentElement.style.overflow; + _$jscoverage['ui/editor.js'][416]++; + this._bakBodyOverflow = document.body.style.overflow; + _$jscoverage['ui/editor.js'][417]++; + this._bakAutoHeight = this.editor.autoHeightEnabled; + _$jscoverage['ui/editor.js'][418]++; + this._bakScrollTop = Math.max(document.documentElement.scrollTop, document.body.scrollTop); + _$jscoverage['ui/editor.js'][420]++; + this._bakEditorContaninerWidth = editor.iframe.parentNode.offsetWidth; + _$jscoverage['ui/editor.js'][421]++; + if (this._bakAutoHeight) { + _$jscoverage['ui/editor.js'][423]++; + editor.autoHeightEnabled = false; + _$jscoverage['ui/editor.js'][424]++; + this.editor.disableAutoHeight(); + } + _$jscoverage['ui/editor.js'][427]++; + document.documentElement.style.overflow = "hidden"; + _$jscoverage['ui/editor.js'][428]++; + document.body.style.overflow = "hidden"; + _$jscoverage['ui/editor.js'][429]++; + this._bakCssText = this.getDom().style.cssText; + _$jscoverage['ui/editor.js'][430]++; + this._bakCssText1 = this.getDom("iframeholder").style.cssText; + _$jscoverage['ui/editor.js'][431]++; + editor.iframe.parentNode.style.width = ""; + _$jscoverage['ui/editor.js'][432]++; + this._updateFullScreen(); + } + else { + _$jscoverage['ui/editor.js'][434]++; + while ((container.tagName != "BODY")) { + _$jscoverage['ui/editor.js'][435]++; + container.style.position = nodeStack.shift(); + _$jscoverage['ui/editor.js'][436]++; + container = container.parentNode; +} + _$jscoverage['ui/editor.js'][438]++; + this.getDom().style.cssText = this._bakCssText; + _$jscoverage['ui/editor.js'][439]++; + this.getDom("iframeholder").style.cssText = this._bakCssText1; + _$jscoverage['ui/editor.js'][440]++; + if (this._bakAutoHeight) { + _$jscoverage['ui/editor.js'][441]++; + editor.autoHeightEnabled = true; + _$jscoverage['ui/editor.js'][442]++; + this.editor.enableAutoHeight(); + } + _$jscoverage['ui/editor.js'][445]++; + document.documentElement.style.overflow = this._bakHtmlOverflow; + _$jscoverage['ui/editor.js'][446]++; + document.body.style.overflow = this._bakBodyOverflow; + _$jscoverage['ui/editor.js'][447]++; + editor.iframe.parentNode.style.width = (this._bakEditorContaninerWidth + "px"); + _$jscoverage['ui/editor.js'][448]++; + window.scrollTo(0, this._bakScrollTop); + } + _$jscoverage['ui/editor.js'][450]++; + if ((browser.gecko && (editor.body.contentEditable === "true"))) { + _$jscoverage['ui/editor.js'][451]++; + var input = document.createElement("input"); + _$jscoverage['ui/editor.js'][452]++; + document.body.appendChild(input); + _$jscoverage['ui/editor.js'][453]++; + editor.body.contentEditable = false; + _$jscoverage['ui/editor.js'][454]++; + setTimeout((function () { + _$jscoverage['ui/editor.js'][455]++; + input.focus(); + _$jscoverage['ui/editor.js'][456]++; + setTimeout((function () { + _$jscoverage['ui/editor.js'][457]++; + editor.body.contentEditable = true; + _$jscoverage['ui/editor.js'][458]++; + editor.fireEvent("fullscreenchanged", fullscreen); + _$jscoverage['ui/editor.js'][459]++; + editor.selection.getRange().moveToBookmark(bk).select(true); + _$jscoverage['ui/editor.js'][460]++; + baidu.editor.dom.domUtils.remove(input); + _$jscoverage['ui/editor.js'][461]++; + (fullscreen && window.scroll(0, 0)); +}), 0); +}), 0); + } + _$jscoverage['ui/editor.js'][466]++; + if ((editor.body.contentEditable === "true")) { + _$jscoverage['ui/editor.js'][467]++; + this.editor.fireEvent("fullscreenchanged", fullscreen); + _$jscoverage['ui/editor.js'][468]++; + this.triggerLayout(); + } + } +}), _updateFullScreen: (function () { + _$jscoverage['ui/editor.js'][474]++; + if (this._fullscreen) { + _$jscoverage['ui/editor.js'][475]++; + var vpRect = uiUtils.getViewportRect(); + _$jscoverage['ui/editor.js'][476]++; + 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)); + _$jscoverage['ui/editor.js'][477]++; + uiUtils.setViewportOffset(this.getDom(), {left: 0, top: (this.editor.options.topOffset || 0)}); + _$jscoverage['ui/editor.js'][478]++; + this.editor.setHeight((vpRect.height - this.getDom("toolbarbox").offsetHeight - this.getDom("bottombar").offsetHeight - (this.editor.options.topOffset || 0))); + _$jscoverage['ui/editor.js'][480]++; + if (browser.gecko) { + _$jscoverage['ui/editor.js'][481]++; + try { + _$jscoverage['ui/editor.js'][482]++; + window.onresize(); + } + catch (e) { + } + } + } +}), _updateElementPath: (function () { + _$jscoverage['ui/editor.js'][491]++; + var bottom = this.getDom("elementpath"), list; + _$jscoverage['ui/editor.js'][492]++; + if ((this.elementPathEnabled && (list = this.editor.queryCommandValue("elementpath")))) { + _$jscoverage['ui/editor.js'][494]++; + var buff = []; + _$jscoverage['ui/editor.js'][495]++; + for (var i = 0, ci; (ci = list[i]); (i++)) { + _$jscoverage['ui/editor.js'][496]++; + buff[i] = this.formatHtml(("" + ci + "")); +} + _$jscoverage['ui/editor.js'][498]++; + bottom.innerHTML = ("
    " + this.editor.getLang("elementPathTip") + ": " + buff.join(" > ") + "
    "); + } + else { + _$jscoverage['ui/editor.js'][501]++; + bottom.style.display = "none"; + } +}), disableElementPath: (function () { + _$jscoverage['ui/editor.js'][505]++; + var bottom = this.getDom("elementpath"); + _$jscoverage['ui/editor.js'][506]++; + bottom.innerHTML = ""; + _$jscoverage['ui/editor.js'][507]++; + bottom.style.display = "none"; + _$jscoverage['ui/editor.js'][508]++; + this.elementPathEnabled = false; +}), enableElementPath: (function () { + _$jscoverage['ui/editor.js'][512]++; + var bottom = this.getDom("elementpath"); + _$jscoverage['ui/editor.js'][513]++; + bottom.style.display = ""; + _$jscoverage['ui/editor.js'][514]++; + this.elementPathEnabled = true; + _$jscoverage['ui/editor.js'][515]++; + this._updateElementPath(); +}), _scale: (function () { + _$jscoverage['ui/editor.js'][518]++; + 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"); + _$jscoverage['ui/editor.js'][527]++; + var isMouseMove = false, position = null, minEditorHeight = 0, minEditorWidth = editor.options.minFrameWidth, pageX = 0, pageY = 0, scaleWidth = 0, scaleHeight = 0; + _$jscoverage['ui/editor.js'][536]++; + function down() { + _$jscoverage['ui/editor.js'][537]++; + position = domUtils.getXY(editorHolder); + _$jscoverage['ui/editor.js'][539]++; + if ((! minEditorHeight)) { + _$jscoverage['ui/editor.js'][540]++; + minEditorHeight = (editor.options.minFrameHeight + toolbarBox.offsetHeight + bottombar.offsetHeight); + } + _$jscoverage['ui/editor.js'][543]++; + 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)); + _$jscoverage['ui/editor.js'][546]++; + domUtils.on(doc, "mousemove", move); + _$jscoverage['ui/editor.js'][547]++; + domUtils.on(editorDocument, "mouseup", up); + _$jscoverage['ui/editor.js'][548]++; + domUtils.on(doc, "mouseup", up); +} + _$jscoverage['ui/editor.js'][551]++; + var me = this; + _$jscoverage['ui/editor.js'][553]++; + this.editor.addListener("fullscreenchanged", (function (e, fullScreen) { + _$jscoverage['ui/editor.js'][554]++; + if (fullScreen) { + _$jscoverage['ui/editor.js'][555]++; + me.disableScale(); + } + else { + _$jscoverage['ui/editor.js'][558]++; + if (me.editor.options.scaleEnabled) { + _$jscoverage['ui/editor.js'][559]++; + me.enableScale(); + _$jscoverage['ui/editor.js'][560]++; + var tmpNode = me.editor.document.createElement("span"); + _$jscoverage['ui/editor.js'][561]++; + me.editor.body.appendChild(tmpNode); + _$jscoverage['ui/editor.js'][562]++; + me.editor.body.style.height = (Math.max(domUtils.getXY(tmpNode).y, (me.editor.iframe.offsetHeight - 20)) + "px"); + _$jscoverage['ui/editor.js'][563]++; + domUtils.remove(tmpNode); + } + } +})); + _$jscoverage['ui/editor.js'][567]++; + function move(event) { + _$jscoverage['ui/editor.js'][568]++; + clearSelection(); + _$jscoverage['ui/editor.js'][569]++; + var e = (event || window.event); + _$jscoverage['ui/editor.js'][570]++; + pageX = (e.pageX || (doc.documentElement.scrollLeft + e.clientX)); + _$jscoverage['ui/editor.js'][571]++; + pageY = (e.pageY || (doc.documentElement.scrollTop + e.clientY)); + _$jscoverage['ui/editor.js'][572]++; + scaleWidth = (pageX - position.x); + _$jscoverage['ui/editor.js'][573]++; + scaleHeight = (pageY - position.y); + _$jscoverage['ui/editor.js'][575]++; + if ((scaleWidth >= minEditorWidth)) { + _$jscoverage['ui/editor.js'][576]++; + isMouseMove = true; + _$jscoverage['ui/editor.js'][577]++; + scalelayer.style.width = (scaleWidth + "px"); + } + _$jscoverage['ui/editor.js'][579]++; + if ((scaleHeight >= minEditorHeight)) { + _$jscoverage['ui/editor.js'][580]++; + isMouseMove = true; + _$jscoverage['ui/editor.js'][581]++; + scalelayer.style.height = (scaleHeight + "px"); + } +} + _$jscoverage['ui/editor.js'][585]++; + function up() { + _$jscoverage['ui/editor.js'][586]++; + if (isMouseMove) { + _$jscoverage['ui/editor.js'][587]++; + isMouseMove = false; + _$jscoverage['ui/editor.js'][588]++; + editor.ui._actualFrameWidth = (scalelayer.offsetWidth - 2); + _$jscoverage['ui/editor.js'][589]++; + editorHolder.style.width = (editor.ui._actualFrameWidth + "px"); + _$jscoverage['ui/editor.js'][591]++; + editor.setHeight((scalelayer.offsetHeight - bottombar.offsetHeight - toolbarBox.offsetHeight - 2)); + } + _$jscoverage['ui/editor.js'][593]++; + if (scalelayer) { + _$jscoverage['ui/editor.js'][594]++; + scalelayer.style.display = "none"; + } + _$jscoverage['ui/editor.js'][596]++; + clearSelection(); + _$jscoverage['ui/editor.js'][597]++; + domUtils.un(doc, "mousemove", move); + _$jscoverage['ui/editor.js'][598]++; + domUtils.un(editorDocument, "mouseup", up); + _$jscoverage['ui/editor.js'][599]++; + domUtils.un(doc, "mouseup", up); +} + _$jscoverage['ui/editor.js'][602]++; + function clearSelection() { + _$jscoverage['ui/editor.js'][603]++; + if (browser.ie) { + _$jscoverage['ui/editor.js'][604]++; + doc.selection.clear(); + } + else { + _$jscoverage['ui/editor.js'][606]++; + window.getSelection().removeAllRanges(); + } +} + _$jscoverage['ui/editor.js'][609]++; + this.enableScale = (function () { + _$jscoverage['ui/editor.js'][611]++; + if ((editor.queryCommandState("source") == 1)) { + _$jscoverage['ui/editor.js'][611]++; + return; + } + _$jscoverage['ui/editor.js'][612]++; + scale.style.display = ""; + _$jscoverage['ui/editor.js'][613]++; + this.scaleEnabled = true; + _$jscoverage['ui/editor.js'][614]++; + domUtils.on(scale, "mousedown", down); +}); + _$jscoverage['ui/editor.js'][616]++; + this.disableScale = (function () { + _$jscoverage['ui/editor.js'][617]++; + scale.style.display = "none"; + _$jscoverage['ui/editor.js'][618]++; + this.scaleEnabled = false; + _$jscoverage['ui/editor.js'][619]++; + domUtils.un(scale, "mousedown", down); +}); +}), isFullScreen: (function () { + _$jscoverage['ui/editor.js'][623]++; + return this._fullscreen; +}), postRender: (function () { + _$jscoverage['ui/editor.js'][626]++; + UIBase.prototype.postRender.call(this); + _$jscoverage['ui/editor.js'][627]++; + for (var i = 0; (i < this.toolbars.length); (i++)) { + _$jscoverage['ui/editor.js'][628]++; + this.toolbars[i].postRender(); +} + _$jscoverage['ui/editor.js'][630]++; + var me = this; + _$jscoverage['ui/editor.js'][631]++; + var timerId, domUtils = baidu.editor.dom.domUtils, updateFullScreenTime = (function () { + _$jscoverage['ui/editor.js'][634]++; + clearTimeout(timerId); + _$jscoverage['ui/editor.js'][635]++; + timerId = setTimeout((function () { + _$jscoverage['ui/editor.js'][636]++; + me._updateFullScreen(); +})); +}); + _$jscoverage['ui/editor.js'][639]++; + domUtils.on(window, "resize", updateFullScreenTime); + _$jscoverage['ui/editor.js'][641]++; + me.addListener("destroy", (function () { + _$jscoverage['ui/editor.js'][642]++; + domUtils.un(window, "resize", updateFullScreenTime); + _$jscoverage['ui/editor.js'][643]++; + clearTimeout(timerId); +})); +}), showToolbarMsg: (function (msg, flag) { + _$jscoverage['ui/editor.js'][647]++; + this.getDom("toolbarmsg_label").innerHTML = msg; + _$jscoverage['ui/editor.js'][648]++; + this.getDom("toolbarmsg").style.display = ""; + _$jscoverage['ui/editor.js'][650]++; + if ((! flag)) { + _$jscoverage['ui/editor.js'][651]++; + var w = this.getDom("upload_dialog"); + _$jscoverage['ui/editor.js'][652]++; + w.style.display = "none"; + } +}), hideToolbarMsg: (function () { + _$jscoverage['ui/editor.js'][656]++; + this.getDom("toolbarmsg").style.display = "none"; +}), mapUrl: (function (url) { + _$jscoverage['ui/editor.js'][659]++; + return (url? url.replace("~/", (this.editor.options.UEDITOR_HOME_URL || "")): ""); +}), triggerLayout: (function () { + _$jscoverage['ui/editor.js'][662]++; + var dom = this.getDom(); + _$jscoverage['ui/editor.js'][663]++; + if ((dom.style.zoom == "1")) { + _$jscoverage['ui/editor.js'][664]++; + dom.style.zoom = "100%"; + } + else { + _$jscoverage['ui/editor.js'][666]++; + dom.style.zoom = "1"; + } +})}; + _$jscoverage['ui/editor.js'][670]++; + utils.inherits(EditorUI, baidu.editor.ui.UIBase); + _$jscoverage['ui/editor.js'][673]++; + var instances = {}; + _$jscoverage['ui/editor.js'][676]++; + UE.ui.Editor = (function (options) { + _$jscoverage['ui/editor.js'][677]++; + var editor = new (UE.Editor)(options); + _$jscoverage['ui/editor.js'][678]++; + editor.options.editor = editor; + _$jscoverage['ui/editor.js'][679]++; + utils.loadFile(document, {href: (editor.options.themePath + editor.options.theme + "/_css/ueditor.css"), tag: "link", type: "text/css", rel: "stylesheet"}); + _$jscoverage['ui/editor.js'][686]++; + var oldRender = editor.render; + _$jscoverage['ui/editor.js'][687]++; + editor.render = (function (holder) { + _$jscoverage['ui/editor.js'][688]++; + if ((holder.constructor === String)) { + _$jscoverage['ui/editor.js'][689]++; + editor.key = holder; + _$jscoverage['ui/editor.js'][690]++; + instances[holder] = editor; + } + _$jscoverage['ui/editor.js'][692]++; + utils.domReady((function () { + _$jscoverage['ui/editor.js'][693]++; + (editor.langIsReady? renderUI(): editor.addListener("langReady", renderUI)); + _$jscoverage['ui/editor.js'][694]++; + function renderUI() { + _$jscoverage['ui/editor.js'][695]++; + editor.setOpt({labelMap: (editor.options.labelMap || editor.getLang("labelMap"))}); + _$jscoverage['ui/editor.js'][698]++; + new EditorUI(editor.options); + _$jscoverage['ui/editor.js'][699]++; + if (holder) { + _$jscoverage['ui/editor.js'][700]++; + if ((holder.constructor === String)) { + _$jscoverage['ui/editor.js'][701]++; + holder = document.getElementById(holder); + } + _$jscoverage['ui/editor.js'][703]++; + (holder && holder.getAttribute("name") && (editor.options.textarea = holder.getAttribute("name"))); + _$jscoverage['ui/editor.js'][704]++; + if ((holder && /script|textarea/gi.test(holder.tagName))) { + _$jscoverage['ui/editor.js'][705]++; + var newDiv = document.createElement("div"); + _$jscoverage['ui/editor.js'][706]++; + holder.parentNode.insertBefore(newDiv, holder); + _$jscoverage['ui/editor.js'][707]++; + var cont = (holder.value || holder.innerHTML); + _$jscoverage['ui/editor.js'][708]++; + 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]+<")); + _$jscoverage['ui/editor.js'][712]++; + (holder.className && (newDiv.className = holder.className)); + _$jscoverage['ui/editor.js'][713]++; + (holder.style.cssText && (newDiv.style.cssText = holder.style.cssText)); + _$jscoverage['ui/editor.js'][714]++; + if (/textarea/i.test(holder.tagName)) { + _$jscoverage['ui/editor.js'][715]++; + editor.textarea = holder; + _$jscoverage['ui/editor.js'][716]++; + editor.textarea.style.display = "none"; + } + else { + _$jscoverage['ui/editor.js'][719]++; + holder.parentNode.removeChild(holder); + _$jscoverage['ui/editor.js'][720]++; + (holder.id && (newDiv.id = holder.id)); + } + _$jscoverage['ui/editor.js'][722]++; + holder = newDiv; + _$jscoverage['ui/editor.js'][723]++; + holder.innerHTML = ""; + } + } + _$jscoverage['ui/editor.js'][727]++; + domUtils.addClass(holder, ("edui-" + editor.options.theme)); + _$jscoverage['ui/editor.js'][728]++; + editor.ui.render(holder); + _$jscoverage['ui/editor.js'][729]++; + var opt = editor.options; + _$jscoverage['ui/editor.js'][731]++; + editor.container = editor.ui.getDom(); + _$jscoverage['ui/editor.js'][732]++; + var parents = domUtils.findParents(holder, true); + _$jscoverage['ui/editor.js'][733]++; + var displays = []; + _$jscoverage['ui/editor.js'][734]++; + for (var i = 0, ci; (ci = parents[i]); (i++)) { + _$jscoverage['ui/editor.js'][735]++; + displays[i] = ci.style.display; + _$jscoverage['ui/editor.js'][736]++; + ci.style.display = "block"; +} + _$jscoverage['ui/editor.js'][738]++; + if (opt.initialFrameWidth) { + _$jscoverage['ui/editor.js'][739]++; + opt.minFrameWidth = opt.initialFrameWidth; + } + else { + _$jscoverage['ui/editor.js'][741]++; + opt.minFrameWidth = (opt.initialFrameWidth = holder.offsetWidth); + } + _$jscoverage['ui/editor.js'][743]++; + if (opt.initialFrameHeight) { + _$jscoverage['ui/editor.js'][744]++; + opt.minFrameHeight = opt.initialFrameHeight; + } + else { + _$jscoverage['ui/editor.js'][746]++; + opt.initialFrameHeight = (opt.minFrameHeight = holder.offsetHeight); + } + _$jscoverage['ui/editor.js'][748]++; + for (var i = 0, ci = ci; (ci = parents[i]); (i++)) { + _$jscoverage['ui/editor.js'][749]++; + ci.style.display = displays[i]; +} + _$jscoverage['ui/editor.js'][753]++; + if (holder.style.height) { + _$jscoverage['ui/editor.js'][754]++; + holder.style.height = ""; + } + _$jscoverage['ui/editor.js'][756]++; + editor.container.style.width = (opt.initialFrameWidth + (/%$/.test(opt.initialFrameWidth)? "": "px")); + _$jscoverage['ui/editor.js'][757]++; + editor.container.style.zIndex = opt.zIndex; + _$jscoverage['ui/editor.js'][758]++; + oldRender.call(editor, editor.ui.getDom("iframeholder")); +} +})); +}); + _$jscoverage['ui/editor.js'][763]++; + return editor; +}); + _$jscoverage['ui/editor.js'][788]++; + UE.getEditor = (function (id, opt) { + _$jscoverage['ui/editor.js'][789]++; + var editor = instances[id]; + _$jscoverage['ui/editor.js'][790]++; + if ((! editor)) { + _$jscoverage['ui/editor.js'][791]++; + editor = (instances[id] = new (UE.ui.Editor)(opt)); + _$jscoverage['ui/editor.js'][792]++; + editor.render(id); + } + _$jscoverage['ui/editor.js'][794]++; + return editor; +}); + _$jscoverage['ui/editor.js'][798]++; + UE.delEditor = (function (id) { + _$jscoverage['ui/editor.js'][799]++; + var editor; + _$jscoverage['ui/editor.js'][800]++; + if ((editor = instances[id])) { + _$jscoverage['ui/editor.js'][801]++; + (editor.key && editor.destroy()); + _$jscoverage['ui/editor.js'][802]++; + (delete instances[id]); + } +}); +})(); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/editorui.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/editorui.js new file mode 100644 index 000000000..61249dfff --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/editorui.js @@ -0,0 +1,1302 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['ui/editorui.js']) { + _$jscoverage['ui/editorui.js'] = []; + _$jscoverage['ui/editorui.js'][4] = 0; + _$jscoverage['ui/editorui.js'][5] = 0; + _$jscoverage['ui/editorui.js'][6] = 0; + _$jscoverage['ui/editorui.js'][7] = 0; + _$jscoverage['ui/editorui.js'][8] = 0; + _$jscoverage['ui/editorui.js'][10] = 0; + _$jscoverage['ui/editorui.js'][11] = 0; + _$jscoverage['ui/editorui.js'][12] = 0; + _$jscoverage['ui/editorui.js'][14] = 0; + _$jscoverage['ui/editorui.js'][15] = 0; + _$jscoverage['ui/editorui.js'][16] = 0; + _$jscoverage['ui/editorui.js'][17] = 0; + _$jscoverage['ui/editorui.js'][18] = 0; + _$jscoverage['ui/editorui.js'][20] = 0; + _$jscoverage['ui/editorui.js'][21] = 0; + _$jscoverage['ui/editorui.js'][23] = 0; + _$jscoverage['ui/editorui.js'][31] = 0; + _$jscoverage['ui/editorui.js'][34] = 0; + _$jscoverage['ui/editorui.js'][60] = 0; + _$jscoverage['ui/editorui.js'][68] = 0; + _$jscoverage['ui/editorui.js'][69] = 0; + _$jscoverage['ui/editorui.js'][70] = 0; + _$jscoverage['ui/editorui.js'][71] = 0; + _$jscoverage['ui/editorui.js'][72] = 0; + _$jscoverage['ui/editorui.js'][76] = 0; + _$jscoverage['ui/editorui.js'][81] = 0; + _$jscoverage['ui/editorui.js'][82] = 0; + _$jscoverage['ui/editorui.js'][83] = 0; + _$jscoverage['ui/editorui.js'][84] = 0; + _$jscoverage['ui/editorui.js'][85] = 0; + _$jscoverage['ui/editorui.js'][86] = 0; + _$jscoverage['ui/editorui.js'][88] = 0; + _$jscoverage['ui/editorui.js'][89] = 0; + _$jscoverage['ui/editorui.js'][90] = 0; + _$jscoverage['ui/editorui.js'][94] = 0; + _$jscoverage['ui/editorui.js'][100] = 0; + _$jscoverage['ui/editorui.js'][101] = 0; + _$jscoverage['ui/editorui.js'][106] = 0; + _$jscoverage['ui/editorui.js'][107] = 0; + _$jscoverage['ui/editorui.js'][111] = 0; + _$jscoverage['ui/editorui.js'][112] = 0; + _$jscoverage['ui/editorui.js'][113] = 0; + _$jscoverage['ui/editorui.js'][115] = 0; + _$jscoverage['ui/editorui.js'][119] = 0; + _$jscoverage['ui/editorui.js'][125] = 0; + _$jscoverage['ui/editorui.js'][127] = 0; + _$jscoverage['ui/editorui.js'][128] = 0; + _$jscoverage['ui/editorui.js'][129] = 0; + _$jscoverage['ui/editorui.js'][130] = 0; + _$jscoverage['ui/editorui.js'][131] = 0; + _$jscoverage['ui/editorui.js'][136] = 0; + _$jscoverage['ui/editorui.js'][139] = 0; + _$jscoverage['ui/editorui.js'][140] = 0; + _$jscoverage['ui/editorui.js'][141] = 0; + _$jscoverage['ui/editorui.js'][142] = 0; + _$jscoverage['ui/editorui.js'][144] = 0; + _$jscoverage['ui/editorui.js'][152] = 0; + _$jscoverage['ui/editorui.js'][153] = 0; + _$jscoverage['ui/editorui.js'][154] = 0; + _$jscoverage['ui/editorui.js'][155] = 0; + _$jscoverage['ui/editorui.js'][161] = 0; + _$jscoverage['ui/editorui.js'][164] = 0; + _$jscoverage['ui/editorui.js'][165] = 0; + _$jscoverage['ui/editorui.js'][166] = 0; + _$jscoverage['ui/editorui.js'][169] = 0; + _$jscoverage['ui/editorui.js'][172] = 0; + _$jscoverage['ui/editorui.js'][173] = 0; + _$jscoverage['ui/editorui.js'][174] = 0; + _$jscoverage['ui/editorui.js'][176] = 0; + _$jscoverage['ui/editorui.js'][182] = 0; + _$jscoverage['ui/editorui.js'][189] = 0; + _$jscoverage['ui/editorui.js'][190] = 0; + _$jscoverage['ui/editorui.js'][191] = 0; + _$jscoverage['ui/editorui.js'][193] = 0; + _$jscoverage['ui/editorui.js'][194] = 0; + _$jscoverage['ui/editorui.js'][196] = 0; + _$jscoverage['ui/editorui.js'][197] = 0; + _$jscoverage['ui/editorui.js'][198] = 0; + _$jscoverage['ui/editorui.js'][199] = 0; + _$jscoverage['ui/editorui.js'][201] = 0; + _$jscoverage['ui/editorui.js'][203] = 0; + _$jscoverage['ui/editorui.js'][204] = 0; + _$jscoverage['ui/editorui.js'][218] = 0; + _$jscoverage['ui/editorui.js'][226] = 0; + _$jscoverage['ui/editorui.js'][232] = 0; + _$jscoverage['ui/editorui.js'][235] = 0; + _$jscoverage['ui/editorui.js'][239] = 0; + _$jscoverage['ui/editorui.js'][240] = 0; + _$jscoverage['ui/editorui.js'][242] = 0; + _$jscoverage['ui/editorui.js'][243] = 0; + _$jscoverage['ui/editorui.js'][244] = 0; + _$jscoverage['ui/editorui.js'][245] = 0; + _$jscoverage['ui/editorui.js'][247] = 0; + _$jscoverage['ui/editorui.js'][249] = 0; + _$jscoverage['ui/editorui.js'][250] = 0; + _$jscoverage['ui/editorui.js'][251] = 0; + _$jscoverage['ui/editorui.js'][254] = 0; + _$jscoverage['ui/editorui.js'][256] = 0; + _$jscoverage['ui/editorui.js'][257] = 0; + _$jscoverage['ui/editorui.js'][264] = 0; + _$jscoverage['ui/editorui.js'][265] = 0; + _$jscoverage['ui/editorui.js'][267] = 0; + _$jscoverage['ui/editorui.js'][268] = 0; + _$jscoverage['ui/editorui.js'][270] = 0; + _$jscoverage['ui/editorui.js'][271] = 0; + _$jscoverage['ui/editorui.js'][272] = 0; + _$jscoverage['ui/editorui.js'][273] = 0; + _$jscoverage['ui/editorui.js'][278] = 0; + _$jscoverage['ui/editorui.js'][285] = 0; + _$jscoverage['ui/editorui.js'][286] = 0; + _$jscoverage['ui/editorui.js'][287] = 0; + _$jscoverage['ui/editorui.js'][291] = 0; + _$jscoverage['ui/editorui.js'][296] = 0; + _$jscoverage['ui/editorui.js'][297] = 0; + _$jscoverage['ui/editorui.js'][298] = 0; + _$jscoverage['ui/editorui.js'][299] = 0; + _$jscoverage['ui/editorui.js'][310] = 0; + _$jscoverage['ui/editorui.js'][318] = 0; + _$jscoverage['ui/editorui.js'][324] = 0; + _$jscoverage['ui/editorui.js'][325] = 0; + _$jscoverage['ui/editorui.js'][327] = 0; + _$jscoverage['ui/editorui.js'][328] = 0; + _$jscoverage['ui/editorui.js'][330] = 0; + _$jscoverage['ui/editorui.js'][333] = 0; + _$jscoverage['ui/editorui.js'][334] = 0; + _$jscoverage['ui/editorui.js'][335] = 0; + _$jscoverage['ui/editorui.js'][337] = 0; + _$jscoverage['ui/editorui.js'][338] = 0; + _$jscoverage['ui/editorui.js'][339] = 0; + _$jscoverage['ui/editorui.js'][344] = 0; + _$jscoverage['ui/editorui.js'][349] = 0; + _$jscoverage['ui/editorui.js'][353] = 0; + _$jscoverage['ui/editorui.js'][356] = 0; + _$jscoverage['ui/editorui.js'][362] = 0; + _$jscoverage['ui/editorui.js'][363] = 0; + _$jscoverage['ui/editorui.js'][364] = 0; + _$jscoverage['ui/editorui.js'][365] = 0; + _$jscoverage['ui/editorui.js'][369] = 0; + _$jscoverage['ui/editorui.js'][372] = 0; + _$jscoverage['ui/editorui.js'][373] = 0; + _$jscoverage['ui/editorui.js'][374] = 0; + _$jscoverage['ui/editorui.js'][375] = 0; + _$jscoverage['ui/editorui.js'][376] = 0; + _$jscoverage['ui/editorui.js'][377] = 0; + _$jscoverage['ui/editorui.js'][379] = 0; + _$jscoverage['ui/editorui.js'][380] = 0; + _$jscoverage['ui/editorui.js'][381] = 0; + _$jscoverage['ui/editorui.js'][382] = 0; + _$jscoverage['ui/editorui.js'][383] = 0; + _$jscoverage['ui/editorui.js'][386] = 0; + _$jscoverage['ui/editorui.js'][387] = 0; + _$jscoverage['ui/editorui.js'][393] = 0; + _$jscoverage['ui/editorui.js'][395] = 0; + _$jscoverage['ui/editorui.js'][397] = 0; + _$jscoverage['ui/editorui.js'][398] = 0; + _$jscoverage['ui/editorui.js'][399] = 0; + _$jscoverage['ui/editorui.js'][400] = 0; + _$jscoverage['ui/editorui.js'][401] = 0; + _$jscoverage['ui/editorui.js'][402] = 0; + _$jscoverage['ui/editorui.js'][403] = 0; + _$jscoverage['ui/editorui.js'][408] = 0; + _$jscoverage['ui/editorui.js'][414] = 0; + _$jscoverage['ui/editorui.js'][418] = 0; + _$jscoverage['ui/editorui.js'][421] = 0; + _$jscoverage['ui/editorui.js'][427] = 0; + _$jscoverage['ui/editorui.js'][428] = 0; + _$jscoverage['ui/editorui.js'][429] = 0; + _$jscoverage['ui/editorui.js'][430] = 0; + _$jscoverage['ui/editorui.js'][434] = 0; + _$jscoverage['ui/editorui.js'][437] = 0; + _$jscoverage['ui/editorui.js'][438] = 0; + _$jscoverage['ui/editorui.js'][439] = 0; + _$jscoverage['ui/editorui.js'][440] = 0; + _$jscoverage['ui/editorui.js'][441] = 0; + _$jscoverage['ui/editorui.js'][442] = 0; + _$jscoverage['ui/editorui.js'][444] = 0; + _$jscoverage['ui/editorui.js'][445] = 0; + _$jscoverage['ui/editorui.js'][447] = 0; + _$jscoverage['ui/editorui.js'][448] = 0; + _$jscoverage['ui/editorui.js'][454] = 0; + _$jscoverage['ui/editorui.js'][457] = 0; + _$jscoverage['ui/editorui.js'][458] = 0; + _$jscoverage['ui/editorui.js'][459] = 0; + _$jscoverage['ui/editorui.js'][460] = 0; + _$jscoverage['ui/editorui.js'][461] = 0; + _$jscoverage['ui/editorui.js'][462] = 0; + _$jscoverage['ui/editorui.js'][463] = 0; + _$jscoverage['ui/editorui.js'][464] = 0; + _$jscoverage['ui/editorui.js'][469] = 0; + _$jscoverage['ui/editorui.js'][474] = 0; + _$jscoverage['ui/editorui.js'][480] = 0; + _$jscoverage['ui/editorui.js'][483] = 0; + _$jscoverage['ui/editorui.js'][487] = 0; + _$jscoverage['ui/editorui.js'][488] = 0; + _$jscoverage['ui/editorui.js'][489] = 0; + _$jscoverage['ui/editorui.js'][490] = 0; + _$jscoverage['ui/editorui.js'][491] = 0; + _$jscoverage['ui/editorui.js'][492] = 0; + _$jscoverage['ui/editorui.js'][494] = 0; + _$jscoverage['ui/editorui.js'][495] = 0; + _$jscoverage['ui/editorui.js'][500] = 0; + _$jscoverage['ui/editorui.js'][503] = 0; + _$jscoverage['ui/editorui.js'][504] = 0; + _$jscoverage['ui/editorui.js'][505] = 0; + _$jscoverage['ui/editorui.js'][506] = 0; + _$jscoverage['ui/editorui.js'][507] = 0; + _$jscoverage['ui/editorui.js'][508] = 0; + _$jscoverage['ui/editorui.js'][509] = 0; + _$jscoverage['ui/editorui.js'][514] = 0; + _$jscoverage['ui/editorui.js'][518] = 0; + _$jscoverage['ui/editorui.js'][525] = 0; + _$jscoverage['ui/editorui.js'][528] = 0; + _$jscoverage['ui/editorui.js'][531] = 0; + _$jscoverage['ui/editorui.js'][532] = 0; + _$jscoverage['ui/editorui.js'][533] = 0; + _$jscoverage['ui/editorui.js'][534] = 0; + _$jscoverage['ui/editorui.js'][535] = 0; + _$jscoverage['ui/editorui.js'][536] = 0; + _$jscoverage['ui/editorui.js'][538] = 0; + _$jscoverage['ui/editorui.js'][539] = 0; + _$jscoverage['ui/editorui.js'][540] = 0; + _$jscoverage['ui/editorui.js'][541] = 0; + _$jscoverage['ui/editorui.js'][542] = 0; + _$jscoverage['ui/editorui.js'][544] = 0; + _$jscoverage['ui/editorui.js'][550] = 0; + _$jscoverage['ui/editorui.js'][555] = 0; + _$jscoverage['ui/editorui.js'][556] = 0; + _$jscoverage['ui/editorui.js'][558] = 0; + _$jscoverage['ui/editorui.js'][559] = 0; + _$jscoverage['ui/editorui.js'][560] = 0; + _$jscoverage['ui/editorui.js'][561] = 0; + _$jscoverage['ui/editorui.js'][562] = 0; + _$jscoverage['ui/editorui.js'][563] = 0; + _$jscoverage['ui/editorui.js'][564] = 0; + _$jscoverage['ui/editorui.js'][565] = 0; + _$jscoverage['ui/editorui.js'][566] = 0; + _$jscoverage['ui/editorui.js'][567] = 0; + _$jscoverage['ui/editorui.js'][572] = 0; + _$jscoverage['ui/editorui.js'][580] = 0; + _$jscoverage['ui/editorui.js'][587] = 0; + _$jscoverage['ui/editorui.js'][590] = 0; + _$jscoverage['ui/editorui.js'][593] = 0; + _$jscoverage['ui/editorui.js'][594] = 0; + _$jscoverage['ui/editorui.js'][595] = 0; + _$jscoverage['ui/editorui.js'][598] = 0; + _$jscoverage['ui/editorui.js'][601] = 0; + _$jscoverage['ui/editorui.js'][602] = 0; + _$jscoverage['ui/editorui.js'][603] = 0; + _$jscoverage['ui/editorui.js'][604] = 0; + _$jscoverage['ui/editorui.js'][605] = 0; + _$jscoverage['ui/editorui.js'][606] = 0; + _$jscoverage['ui/editorui.js'][608] = 0; + _$jscoverage['ui/editorui.js'][609] = 0; + _$jscoverage['ui/editorui.js'][610] = 0; + _$jscoverage['ui/editorui.js'][611] = 0; + _$jscoverage['ui/editorui.js'][612] = 0; + _$jscoverage['ui/editorui.js'][614] = 0; + _$jscoverage['ui/editorui.js'][620] = 0; + _$jscoverage['ui/editorui.js'][622] = 0; + _$jscoverage['ui/editorui.js'][623] = 0; + _$jscoverage['ui/editorui.js'][624] = 0; + _$jscoverage['ui/editorui.js'][629] = 0; + _$jscoverage['ui/editorui.js'][632] = 0; + _$jscoverage['ui/editorui.js'][635] = 0; + _$jscoverage['ui/editorui.js'][636] = 0; + _$jscoverage['ui/editorui.js'][637] = 0; + _$jscoverage['ui/editorui.js'][639] = 0; + _$jscoverage['ui/editorui.js'][642] = 0; + _$jscoverage['ui/editorui.js'][643] = 0; + _$jscoverage['ui/editorui.js'][644] = 0; + _$jscoverage['ui/editorui.js'][645] = 0; + _$jscoverage['ui/editorui.js'][646] = 0; + _$jscoverage['ui/editorui.js'][652] = 0; + _$jscoverage['ui/editorui.js'][656] = 0; + _$jscoverage['ui/editorui.js'][662] = 0; + _$jscoverage['ui/editorui.js'][663] = 0; + _$jscoverage['ui/editorui.js'][666] = 0; + _$jscoverage['ui/editorui.js'][667] = 0; + _$jscoverage['ui/editorui.js'][668] = 0; + _$jscoverage['ui/editorui.js'][669] = 0; + _$jscoverage['ui/editorui.js'][670] = 0; + _$jscoverage['ui/editorui.js'][672] = 0; + _$jscoverage['ui/editorui.js'][673] = 0; + _$jscoverage['ui/editorui.js'][674] = 0; + _$jscoverage['ui/editorui.js'][675] = 0; + _$jscoverage['ui/editorui.js'][678] = 0; + _$jscoverage['ui/editorui.js'][681] = 0; + _$jscoverage['ui/editorui.js'][682] = 0; + _$jscoverage['ui/editorui.js'][683] = 0; + _$jscoverage['ui/editorui.js'][684] = 0; + _$jscoverage['ui/editorui.js'][685] = 0; + _$jscoverage['ui/editorui.js'][686] = 0; + _$jscoverage['ui/editorui.js'][687] = 0; + _$jscoverage['ui/editorui.js'][688] = 0; + _$jscoverage['ui/editorui.js'][693] = 0; + _$jscoverage['ui/editorui.js'][697] = 0; + _$jscoverage['ui/editorui.js'][703] = 0; + _$jscoverage['ui/editorui.js'][704] = 0; + _$jscoverage['ui/editorui.js'][707] = 0; + _$jscoverage['ui/editorui.js'][708] = 0; + _$jscoverage['ui/editorui.js'][709] = 0; + _$jscoverage['ui/editorui.js'][710] = 0; + _$jscoverage['ui/editorui.js'][711] = 0; + _$jscoverage['ui/editorui.js'][713] = 0; + _$jscoverage['ui/editorui.js'][714] = 0; + _$jscoverage['ui/editorui.js'][715] = 0; + _$jscoverage['ui/editorui.js'][716] = 0; + _$jscoverage['ui/editorui.js'][719] = 0; + _$jscoverage['ui/editorui.js'][724] = 0; + _$jscoverage['ui/editorui.js'][725] = 0; + _$jscoverage['ui/editorui.js'][726] = 0; + _$jscoverage['ui/editorui.js'][727] = 0; + _$jscoverage['ui/editorui.js'][728] = 0; + _$jscoverage['ui/editorui.js'][730] = 0; + _$jscoverage['ui/editorui.js'][732] = 0; + _$jscoverage['ui/editorui.js'][733] = 0; + _$jscoverage['ui/editorui.js'][740] = 0; + _$jscoverage['ui/editorui.js'][746] = 0; + _$jscoverage['ui/editorui.js'][747] = 0; + _$jscoverage['ui/editorui.js'][750] = 0; + _$jscoverage['ui/editorui.js'][751] = 0; + _$jscoverage['ui/editorui.js'][752] = 0; + _$jscoverage['ui/editorui.js'][753] = 0; + _$jscoverage['ui/editorui.js'][754] = 0; + _$jscoverage['ui/editorui.js'][756] = 0; + _$jscoverage['ui/editorui.js'][757] = 0; + _$jscoverage['ui/editorui.js'][758] = 0; + _$jscoverage['ui/editorui.js'][759] = 0; + _$jscoverage['ui/editorui.js'][762] = 0; + _$jscoverage['ui/editorui.js'][767] = 0; + _$jscoverage['ui/editorui.js'][768] = 0; + _$jscoverage['ui/editorui.js'][769] = 0; + _$jscoverage['ui/editorui.js'][774] = 0; + _$jscoverage['ui/editorui.js'][775] = 0; + _$jscoverage['ui/editorui.js'][777] = 0; + _$jscoverage['ui/editorui.js'][780] = 0; + _$jscoverage['ui/editorui.js'][781] = 0; + _$jscoverage['ui/editorui.js'][782] = 0; + _$jscoverage['ui/editorui.js'][783] = 0; + _$jscoverage['ui/editorui.js'][784] = 0; + _$jscoverage['ui/editorui.js'][786] = 0; + _$jscoverage['ui/editorui.js'][790] = 0; + _$jscoverage['ui/editorui.js'][791] = 0; + _$jscoverage['ui/editorui.js'][792] = 0; + _$jscoverage['ui/editorui.js'][798] = 0; + _$jscoverage['ui/editorui.js'][800] = 0; + _$jscoverage['ui/editorui.js'][801] = 0; + _$jscoverage['ui/editorui.js'][803] = 0; + _$jscoverage['ui/editorui.js'][806] = 0; + _$jscoverage['ui/editorui.js'][807] = 0; + _$jscoverage['ui/editorui.js'][812] = 0; + _$jscoverage['ui/editorui.js'][815] = 0; + _$jscoverage['ui/editorui.js'][816] = 0; + _$jscoverage['ui/editorui.js'][817] = 0; + _$jscoverage['ui/editorui.js'][819] = 0; +} +_$jscoverage['ui/editorui.js'].source = ["//ui跟编辑器的适配層","//那个按钮弹出是dialog,是下拉筐等都是在这个js中配置","//自己写的ui也要在这里配置,放到baidu.editor.ui下边,当编辑器实例化的时候会根据ueditor.config中的toolbars找到相应的进行实例化","(function () {"," var utils = baidu.editor.utils;"," var editorui = baidu.editor.ui;"," var _Dialog = editorui.Dialog;"," editorui.buttons = {};",""," 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',"," //'highlightcode':'~/dialogs/highlightcode/highlightcode.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'"," };"," //为工具栏添加按钮,以下都是统一的按钮触发命令,所以写在一起"," var btnCmds = ['undo', 'redo', 'formatmatch',"," 'bold', 'italic', 'underline', 'fontborder', 'touppercase', 'tolowercase',"," 'strikethrough', 'subscript', 'superscript', 'source', 'indent', 'outdent',"," 'blockquote', 'pasteplain', 'pagebreak',"," 'selectall', 'print', 'preview', 'horizontal', 'removeformat', 'time', 'date', 'unlink',"," 'insertparagraphbeforetable', 'insertrow', 'insertcol', 'mergeright', 'mergedown', 'deleterow',"," 'deletecol', 'splittorows', 'splittocols', 'splittocells', 'mergecells', 'deletetable'];",""," for (var i = 0, ci; ci = btnCmds[i++];) {"," ci = ci.toLowerCase();"," editorui[ci] = function (cmd) {"," return function (editor) {"," var ui = new editorui.Button({"," className:'edui-for-' + cmd,"," title:editor.options.labelMap[cmd] || editor.getLang(\"labelMap.\" + cmd) || '',"," onclick:function () {"," editor.execCommand(cmd);"," },"," theme:editor.options.theme,"," showText:false"," });"," editorui.buttons[cmd] = ui;"," editor.addListener('selectionchange', function (type, causeByUi, uiReady) {"," var state = editor.queryCommandState(cmd);"," 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'],"," ok:['attachment', 'anchor', 'link', 'insertimage', 'map', 'gmap', 'insertframe', 'wordimage',"," 'insertvideo', 'insertframe', 'edittip', 'edittable', 'edittd', 'scrawl', 'template', 'music', 'background']",""," };",""," for (var p in dialogBtns) {"," (function (type, vals) {"," for (var i = 0, ci; ci = vals[i++];) {"," //todo opera下存在问题"," if (browser.opera && ci === \"searchreplace\") {"," continue;"," }"," (function (cmd) {"," editorui[cmd] = function (editor, iframeUrl, title) {"," iframeUrl = iframeUrl || (editor.options.iframeUrlMap || {})[cmd] || iframeUrlMap[cmd];"," title = editor.options.labelMap[cmd] || editor.getLang(\"labelMap.\" + cmd) || '';",""," var dialog;"," //没有iframeUrl不创建dialog"," if (iframeUrl) {"," dialog = new editorui.Dialog(utils.extend({"," iframeUrl:editor.ui.mapUrl(iframeUrl),"," editor:editor,"," className:'edui-for-' + cmd,"," title:title,"," holdScroll: cmd === 'insertimage',"," 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\":"," editor.execCommand(\"wordimage\", \"word_img\");"," if (editor.word_img) {"," dialog.render();"," dialog.open();"," }"," break;"," case \"scrawl\":"," if (editor.queryCommandState(\"scrawl\") != -1) {"," dialog.render();"," dialog.open();"," }",""," break;"," default:"," dialog.render();"," dialog.open();"," }"," }"," },"," theme:editor.options.theme,"," disabled:cmd == 'scrawl' && editor.queryCommandState(\"scrawl\") == -1"," });"," editorui.buttons[cmd] = ui;"," editor.addListener('selectionchange', function () {"," //只存在于右键菜单而无工具栏按钮的ui不需要检测状态"," var unNeedCheckState = {'edittable':1};"," if (cmd in unNeedCheckState)return;",""," var state = editor.queryCommandState(cmd);"," if (ui.getDom()) {"," ui.setDisabled(state == -1);"," ui.setChecked(state);"," }",""," });",""," return ui;"," };"," })(ci.toLowerCase())"," }"," })(p, dialogBtns[p])"," }",""," editorui.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 '<div class=\"edui-label %%-label\" >' + (this.label || '') + '</div>';"," }"," });"," });",""," 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 '<div class=\"edui-label %%-label\" style=\"font-family:' +"," utils.unhtml(this.value) + '\">' + (this.label || '') + '</div>';"," }"," });"," })(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 '<div class=\"edui-label %%-label\" style=\"line-height:1;font-size:' +"," this.value + '\">' + (this.label || '') + '</div>';"," }"," });"," }"," 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 '<div class=\"edui-label %%-label\"><span class=\"edui-for-' + this.value + '\">' + (this.label || '') + '</span></div>';"," }"," })"," }"," 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 '<div class=\"edui-label %%-label\">' + '<' + ck.tag + ' ' + (ck.className ? ' class=\"' + ck.className + '\"' : \"\")"," + (ck.style ? ' style=\"' + ck.style + '\"' : \"\") + '>' + ck.label + \"<\\/\" + ck.tag + \">\""," + '</div>';"," }"," });"," })(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;"," };","","})();"]; +_$jscoverage['ui/editorui.js'][4]++; +(function () { + _$jscoverage['ui/editorui.js'][5]++; + var utils = baidu.editor.utils; + _$jscoverage['ui/editorui.js'][6]++; + var editorui = baidu.editor.ui; + _$jscoverage['ui/editorui.js'][7]++; + var _Dialog = editorui.Dialog; + _$jscoverage['ui/editorui.js'][8]++; + editorui.buttons = {}; + _$jscoverage['ui/editorui.js'][10]++; + editorui.Dialog = (function (options) { + _$jscoverage['ui/editorui.js'][11]++; + var dialog = new _Dialog(options); + _$jscoverage['ui/editorui.js'][12]++; + dialog.addListener("hide", (function () { + _$jscoverage['ui/editorui.js'][14]++; + if (dialog.editor) { + _$jscoverage['ui/editorui.js'][15]++; + var editor = dialog.editor; + _$jscoverage['ui/editorui.js'][16]++; + try { + _$jscoverage['ui/editorui.js'][17]++; + if (browser.gecko) { + _$jscoverage['ui/editorui.js'][18]++; + var y = editor.window.scrollY, x = editor.window.scrollX; + _$jscoverage['ui/editorui.js'][20]++; + editor.body.focus(); + _$jscoverage['ui/editorui.js'][21]++; + editor.window.scrollTo(x, y); + } + else { + _$jscoverage['ui/editorui.js'][23]++; + editor.focus(); + } + } + catch (ex) { + } + } +})); + _$jscoverage['ui/editorui.js'][31]++; + return dialog; +}); + _$jscoverage['ui/editorui.js'][34]++; + 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", "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"}; + _$jscoverage['ui/editorui.js'][60]++; + var btnCmds = ["undo", "redo", "formatmatch", "bold", "italic", "underline", "fontborder", "touppercase", "tolowercase", "strikethrough", "subscript", "superscript", "source", "indent", "outdent", "blockquote", "pasteplain", "pagebreak", "selectall", "print", "preview", "horizontal", "removeformat", "time", "date", "unlink", "insertparagraphbeforetable", "insertrow", "insertcol", "mergeright", "mergedown", "deleterow", "deletecol", "splittorows", "splittocols", "splittocells", "mergecells", "deletetable"]; + _$jscoverage['ui/editorui.js'][68]++; + for (var i = 0, ci; (ci = btnCmds[(i++)]);) { + _$jscoverage['ui/editorui.js'][69]++; + ci = ci.toLowerCase(); + _$jscoverage['ui/editorui.js'][70]++; + editorui[ci] = (function (cmd) { + _$jscoverage['ui/editorui.js'][71]++; + return (function (editor) { + _$jscoverage['ui/editorui.js'][72]++; + var ui = new (editorui.Button)({className: ("edui-for-" + cmd), title: (editor.options.labelMap[cmd] || editor.getLang(("labelMap." + cmd)) || ""), onclick: (function () { + _$jscoverage['ui/editorui.js'][76]++; + editor.execCommand(cmd); +}), theme: editor.options.theme, showText: false}); + _$jscoverage['ui/editorui.js'][81]++; + editorui.buttons[cmd] = ui; + _$jscoverage['ui/editorui.js'][82]++; + editor.addListener("selectionchange", (function (type, causeByUi, uiReady) { + _$jscoverage['ui/editorui.js'][83]++; + var state = editor.queryCommandState(cmd); + _$jscoverage['ui/editorui.js'][84]++; + if ((state == -1)) { + _$jscoverage['ui/editorui.js'][85]++; + ui.setDisabled(true); + _$jscoverage['ui/editorui.js'][86]++; + ui.setChecked(false); + } + else { + _$jscoverage['ui/editorui.js'][88]++; + if ((! uiReady)) { + _$jscoverage['ui/editorui.js'][89]++; + ui.setDisabled(false); + _$jscoverage['ui/editorui.js'][90]++; + ui.setChecked(state); + } + } +})); + _$jscoverage['ui/editorui.js'][94]++; + return ui; +}); +})(ci); +} + _$jscoverage['ui/editorui.js'][100]++; + editorui.cleardoc = (function (editor) { + _$jscoverage['ui/editorui.js'][101]++; + var ui = new (editorui.Button)({className: "edui-for-cleardoc", title: (editor.options.labelMap.cleardoc || editor.getLang("labelMap.cleardoc") || ""), theme: editor.options.theme, onclick: (function () { + _$jscoverage['ui/editorui.js'][106]++; + if (confirm(editor.getLang("confirmClear"))) { + _$jscoverage['ui/editorui.js'][107]++; + editor.execCommand("cleardoc"); + } +})}); + _$jscoverage['ui/editorui.js'][111]++; + editorui.buttons.cleardoc = ui; + _$jscoverage['ui/editorui.js'][112]++; + editor.addListener("selectionchange", (function () { + _$jscoverage['ui/editorui.js'][113]++; + ui.setDisabled((editor.queryCommandState("cleardoc") == -1)); +})); + _$jscoverage['ui/editorui.js'][115]++; + return ui; +}); + _$jscoverage['ui/editorui.js'][119]++; + var typeset = {"justify": ["left", "right", "center", "justify"], "imagefloat": ["none", "left", "center", "right"], "directionality": ["ltr", "rtl"]}; + _$jscoverage['ui/editorui.js'][125]++; + for (var p in typeset) { + _$jscoverage['ui/editorui.js'][127]++; + (function (cmd, val) { + _$jscoverage['ui/editorui.js'][128]++; + for (var i = 0, ci; (ci = val[(i++)]);) { + _$jscoverage['ui/editorui.js'][129]++; + (function (cmd2) { + _$jscoverage['ui/editorui.js'][130]++; + editorui[(cmd.replace("float", "") + cmd2)] = (function (editor) { + _$jscoverage['ui/editorui.js'][131]++; + 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 () { + _$jscoverage['ui/editorui.js'][136]++; + editor.execCommand(cmd, cmd2); +})}); + _$jscoverage['ui/editorui.js'][139]++; + editorui.buttons[cmd] = ui; + _$jscoverage['ui/editorui.js'][140]++; + editor.addListener("selectionchange", (function (type, causeByUi, uiReady) { + _$jscoverage['ui/editorui.js'][141]++; + ui.setDisabled((editor.queryCommandState(cmd) == -1)); + _$jscoverage['ui/editorui.js'][142]++; + ui.setChecked(((editor.queryCommandValue(cmd) == cmd2) && (! uiReady))); +})); + _$jscoverage['ui/editorui.js'][144]++; + return ui; +}); +})(ci); +} +})(p, typeset[p]); +} + _$jscoverage['ui/editorui.js'][152]++; + for (var i = 0, ci = ci; (ci = ["backcolor", "forecolor"][(i++)]);) { + _$jscoverage['ui/editorui.js'][153]++; + editorui[ci] = (function (cmd) { + _$jscoverage['ui/editorui.js'][154]++; + return (function (editor) { + _$jscoverage['ui/editorui.js'][155]++; + 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) { + _$jscoverage['ui/editorui.js'][161]++; + editor.execCommand(cmd, color); +}), onpicknocolor: (function () { + _$jscoverage['ui/editorui.js'][164]++; + editor.execCommand(cmd, "default"); + _$jscoverage['ui/editorui.js'][165]++; + this.setColor("transparent"); + _$jscoverage['ui/editorui.js'][166]++; + this.color = "default"; +}), onbuttonclick: (function () { + _$jscoverage['ui/editorui.js'][169]++; + editor.execCommand(cmd, this.color); +})}); + _$jscoverage['ui/editorui.js'][172]++; + editorui.buttons[cmd] = ui; + _$jscoverage['ui/editorui.js'][173]++; + editor.addListener("selectionchange", (function () { + _$jscoverage['ui/editorui.js'][174]++; + ui.setDisabled((editor.queryCommandState(cmd) == -1)); +})); + _$jscoverage['ui/editorui.js'][176]++; + return ui; +}); +})(ci); +} + _$jscoverage['ui/editorui.js'][182]++; + var dialogBtns = {noOk: ["searchreplace", "help", "spechars", "webapp"], ok: ["attachment", "anchor", "link", "insertimage", "map", "gmap", "insertframe", "wordimage", "insertvideo", "insertframe", "edittip", "edittable", "edittd", "scrawl", "template", "music", "background"]}; + _$jscoverage['ui/editorui.js'][189]++; + for (var p = p in dialogBtns) { + _$jscoverage['ui/editorui.js'][190]++; + (function (type, vals) { + _$jscoverage['ui/editorui.js'][191]++; + for (var i = 0, ci; (ci = vals[(i++)]);) { + _$jscoverage['ui/editorui.js'][193]++; + if ((browser.opera && (ci === "searchreplace"))) { + _$jscoverage['ui/editorui.js'][194]++; + continue; + } + _$jscoverage['ui/editorui.js'][196]++; + (function (cmd) { + _$jscoverage['ui/editorui.js'][197]++; + editorui[cmd] = (function (editor, iframeUrl, title) { + _$jscoverage['ui/editorui.js'][198]++; + iframeUrl = (iframeUrl || (editor.options.iframeUrlMap || {})[cmd] || iframeUrlMap[cmd]); + _$jscoverage['ui/editorui.js'][199]++; + title = (editor.options.labelMap[cmd] || editor.getLang(("labelMap." + cmd)) || ""); + _$jscoverage['ui/editorui.js'][201]++; + var dialog; + _$jscoverage['ui/editorui.js'][203]++; + if (iframeUrl) { + _$jscoverage['ui/editorui.js'][204]++; + dialog = new (editorui.Dialog)(utils.extend({iframeUrl: editor.ui.mapUrl(iframeUrl), editor: editor, className: ("edui-for-" + cmd), title: title, holdScroll: (cmd === "insertimage"), closeDialog: editor.getLang("closeDialog")}, ((type == "ok")? {buttons: [{className: "edui-okbutton", label: editor.getLang("ok"), editor: editor, onclick: (function () { + _$jscoverage['ui/editorui.js'][218]++; + dialog.close(true); +})}, {className: "edui-cancelbutton", label: editor.getLang("cancel"), editor: editor, onclick: (function () { + _$jscoverage['ui/editorui.js'][226]++; + dialog.close(false); +})}]}: {}))); + _$jscoverage['ui/editorui.js'][232]++; + editor.ui._dialogs[(cmd + "Dialog")] = dialog; + } + _$jscoverage['ui/editorui.js'][235]++; + var ui = new (editorui.Button)({className: ("edui-for-" + cmd), title: title, onclick: (function () { + _$jscoverage['ui/editorui.js'][239]++; + if (dialog) { + _$jscoverage['ui/editorui.js'][240]++; + switch (cmd) { + case "wordimage": + _$jscoverage['ui/editorui.js'][242]++; + editor.execCommand("wordimage", "word_img"); + _$jscoverage['ui/editorui.js'][243]++; + if (editor.word_img) { + _$jscoverage['ui/editorui.js'][244]++; + dialog.render(); + _$jscoverage['ui/editorui.js'][245]++; + dialog.open(); + } + _$jscoverage['ui/editorui.js'][247]++; + break; + case "scrawl": + _$jscoverage['ui/editorui.js'][249]++; + if ((editor.queryCommandState("scrawl") != -1)) { + _$jscoverage['ui/editorui.js'][250]++; + dialog.render(); + _$jscoverage['ui/editorui.js'][251]++; + dialog.open(); + } + _$jscoverage['ui/editorui.js'][254]++; + break; + default: + _$jscoverage['ui/editorui.js'][256]++; + dialog.render(); + _$jscoverage['ui/editorui.js'][257]++; + dialog.open(); + } + } +}), theme: editor.options.theme, disabled: ((cmd == "scrawl") && (editor.queryCommandState("scrawl") == -1))}); + _$jscoverage['ui/editorui.js'][264]++; + editorui.buttons[cmd] = ui; + _$jscoverage['ui/editorui.js'][265]++; + editor.addListener("selectionchange", (function () { + _$jscoverage['ui/editorui.js'][267]++; + var unNeedCheckState = {"edittable": 1}; + _$jscoverage['ui/editorui.js'][268]++; + if ((cmd in unNeedCheckState)) { + _$jscoverage['ui/editorui.js'][268]++; + return; + } + _$jscoverage['ui/editorui.js'][270]++; + var state = editor.queryCommandState(cmd); + _$jscoverage['ui/editorui.js'][271]++; + if (ui.getDom()) { + _$jscoverage['ui/editorui.js'][272]++; + ui.setDisabled((state == -1)); + _$jscoverage['ui/editorui.js'][273]++; + ui.setChecked(state); + } +})); + _$jscoverage['ui/editorui.js'][278]++; + return ui; +}); +})(ci.toLowerCase()); +} +})(p, dialogBtns[p]); +} + _$jscoverage['ui/editorui.js'][285]++; + editorui.snapscreen = (function (editor, iframeUrl, title) { + _$jscoverage['ui/editorui.js'][286]++; + title = (editor.options.labelMap.snapscreen || editor.getLang("labelMap.snapscreen") || ""); + _$jscoverage['ui/editorui.js'][287]++; + var ui = new (editorui.Button)({className: "edui-for-snapscreen", title: title, onclick: (function () { + _$jscoverage['ui/editorui.js'][291]++; + editor.execCommand("snapscreen"); +}), theme: editor.options.theme}); + _$jscoverage['ui/editorui.js'][296]++; + editorui.buttons.snapscreen = ui; + _$jscoverage['ui/editorui.js'][297]++; + iframeUrl = (iframeUrl || (editor.options.iframeUrlMap || {}).snapscreen || iframeUrlMap.snapscreen); + _$jscoverage['ui/editorui.js'][298]++; + if (iframeUrl) { + _$jscoverage['ui/editorui.js'][299]++; + 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 () { + _$jscoverage['ui/editorui.js'][310]++; + dialog.close(true); +})}, {className: "edui-cancelbutton", label: editor.getLang("cancel"), editor: editor, onclick: (function () { + _$jscoverage['ui/editorui.js'][318]++; + dialog.close(false); +})}]}); + _$jscoverage['ui/editorui.js'][324]++; + dialog.render(); + _$jscoverage['ui/editorui.js'][325]++; + editor.ui._dialogs.snapscreenDialog = dialog; + } + _$jscoverage['ui/editorui.js'][327]++; + editor.addListener("selectionchange", (function () { + _$jscoverage['ui/editorui.js'][328]++; + ui.setDisabled((editor.queryCommandState("snapscreen") == -1)); +})); + _$jscoverage['ui/editorui.js'][330]++; + return ui; +}); + _$jscoverage['ui/editorui.js'][333]++; + editorui.insertcode = (function (editor, list, title) { + _$jscoverage['ui/editorui.js'][334]++; + list = (editor.options.insertcode || []); + _$jscoverage['ui/editorui.js'][335]++; + title = (editor.options.labelMap.insertcode || editor.getLang("labelMap.insertcode") || ""); + _$jscoverage['ui/editorui.js'][337]++; + var items = []; + _$jscoverage['ui/editorui.js'][338]++; + utils.each(list, (function (key, val) { + _$jscoverage['ui/editorui.js'][339]++; + items.push({label: key, value: val, theme: editor.options.theme, renderLabelHtml: (function () { + _$jscoverage['ui/editorui.js'][344]++; + return ("
    " + (this.label || "") + "
    "); +})}); +})); + _$jscoverage['ui/editorui.js'][349]++; + var ui = new (editorui.Combox)({editor: editor, items: items, onselect: (function (t, index) { + _$jscoverage['ui/editorui.js'][353]++; + editor.execCommand("insertcode", this.items[index].value); +}), onbuttonclick: (function () { + _$jscoverage['ui/editorui.js'][356]++; + this.showPopup(); +}), title: title, initValue: title, className: "edui-for-insertcode", indexByValue: (function (value) { + _$jscoverage['ui/editorui.js'][362]++; + if (value) { + _$jscoverage['ui/editorui.js'][363]++; + for (var i = 0, ci; (ci = this.items[i]); (i++)) { + _$jscoverage['ui/editorui.js'][364]++; + if ((ci.value.indexOf(value) != -1)) { + _$jscoverage['ui/editorui.js'][365]++; + return i; + } +} + } + _$jscoverage['ui/editorui.js'][369]++; + return -1; +})}); + _$jscoverage['ui/editorui.js'][372]++; + editorui.buttons.insertcode = ui; + _$jscoverage['ui/editorui.js'][373]++; + editor.addListener("selectionchange", (function (type, causeByUi, uiReady) { + _$jscoverage['ui/editorui.js'][374]++; + if ((! uiReady)) { + _$jscoverage['ui/editorui.js'][375]++; + var state = editor.queryCommandState("insertcode"); + _$jscoverage['ui/editorui.js'][376]++; + if ((state == -1)) { + _$jscoverage['ui/editorui.js'][377]++; + ui.setDisabled(true); + } + else { + _$jscoverage['ui/editorui.js'][379]++; + ui.setDisabled(false); + _$jscoverage['ui/editorui.js'][380]++; + var value = editor.queryCommandValue("insertcode"); + _$jscoverage['ui/editorui.js'][381]++; + if ((! value)) { + _$jscoverage['ui/editorui.js'][382]++; + ui.setValue(title); + _$jscoverage['ui/editorui.js'][383]++; + return; + } + _$jscoverage['ui/editorui.js'][386]++; + (value && (value = value.replace(/['"]/g, "").split(",")[0])); + _$jscoverage['ui/editorui.js'][387]++; + ui.setValue(value); + } + } +})); + _$jscoverage['ui/editorui.js'][393]++; + return ui; +}); + _$jscoverage['ui/editorui.js'][395]++; + editorui.fontfamily = (function (editor, list, title) { + _$jscoverage['ui/editorui.js'][397]++; + list = (editor.options.fontfamily || []); + _$jscoverage['ui/editorui.js'][398]++; + title = (editor.options.labelMap.fontfamily || editor.getLang("labelMap.fontfamily") || ""); + _$jscoverage['ui/editorui.js'][399]++; + if ((! list.length)) { + _$jscoverage['ui/editorui.js'][399]++; + return; + } + _$jscoverage['ui/editorui.js'][400]++; + for (var i = 0, ci, items = []; (ci = list[i]); (i++)) { + _$jscoverage['ui/editorui.js'][401]++; + var langLabel = (editor.getLang("fontfamily")[ci.name] || ""); + _$jscoverage['ui/editorui.js'][402]++; + (function (key, val) { + _$jscoverage['ui/editorui.js'][403]++; + items.push({label: key, value: val, theme: editor.options.theme, renderLabelHtml: (function () { + _$jscoverage['ui/editorui.js'][408]++; + return ("
    " + (this.label || "") + "
    "); +})}); +})((ci.label || langLabel), ci.val); +} + _$jscoverage['ui/editorui.js'][414]++; + var ui = new (editorui.Combox)({editor: editor, items: items, onselect: (function (t, index) { + _$jscoverage['ui/editorui.js'][418]++; + editor.execCommand("FontFamily", this.items[index].value); +}), onbuttonclick: (function () { + _$jscoverage['ui/editorui.js'][421]++; + this.showPopup(); +}), title: title, initValue: title, className: "edui-for-fontfamily", indexByValue: (function (value) { + _$jscoverage['ui/editorui.js'][427]++; + if (value) { + _$jscoverage['ui/editorui.js'][428]++; + for (var i = 0, ci; (ci = this.items[i]); (i++)) { + _$jscoverage['ui/editorui.js'][429]++; + if ((ci.value.indexOf(value) != -1)) { + _$jscoverage['ui/editorui.js'][430]++; + return i; + } +} + } + _$jscoverage['ui/editorui.js'][434]++; + return -1; +})}); + _$jscoverage['ui/editorui.js'][437]++; + editorui.buttons.fontfamily = ui; + _$jscoverage['ui/editorui.js'][438]++; + editor.addListener("selectionchange", (function (type, causeByUi, uiReady) { + _$jscoverage['ui/editorui.js'][439]++; + if ((! uiReady)) { + _$jscoverage['ui/editorui.js'][440]++; + var state = editor.queryCommandState("FontFamily"); + _$jscoverage['ui/editorui.js'][441]++; + if ((state == -1)) { + _$jscoverage['ui/editorui.js'][442]++; + ui.setDisabled(true); + } + else { + _$jscoverage['ui/editorui.js'][444]++; + ui.setDisabled(false); + _$jscoverage['ui/editorui.js'][445]++; + var value = editor.queryCommandValue("FontFamily"); + _$jscoverage['ui/editorui.js'][447]++; + (value && (value = value.replace(/['"]/g, "").split(",")[0])); + _$jscoverage['ui/editorui.js'][448]++; + ui.setValue(value); + } + } +})); + _$jscoverage['ui/editorui.js'][454]++; + return ui; +}); + _$jscoverage['ui/editorui.js'][457]++; + editorui.fontsize = (function (editor, list, title) { + _$jscoverage['ui/editorui.js'][458]++; + title = (editor.options.labelMap.fontsize || editor.getLang("labelMap.fontsize") || ""); + _$jscoverage['ui/editorui.js'][459]++; + list = (list || editor.options.fontsize || []); + _$jscoverage['ui/editorui.js'][460]++; + if ((! list.length)) { + _$jscoverage['ui/editorui.js'][460]++; + return; + } + _$jscoverage['ui/editorui.js'][461]++; + var items = []; + _$jscoverage['ui/editorui.js'][462]++; + for (var i = 0; (i < list.length); (i++)) { + _$jscoverage['ui/editorui.js'][463]++; + var size = (list[i] + "px"); + _$jscoverage['ui/editorui.js'][464]++; + items.push({label: size, value: size, theme: editor.options.theme, renderLabelHtml: (function () { + _$jscoverage['ui/editorui.js'][469]++; + return ("
    " + (this.label || "") + "
    "); +})}); +} + _$jscoverage['ui/editorui.js'][474]++; + var ui = new (editorui.Combox)({editor: editor, items: items, title: title, initValue: title, onselect: (function (t, index) { + _$jscoverage['ui/editorui.js'][480]++; + editor.execCommand("FontSize", this.items[index].value); +}), onbuttonclick: (function () { + _$jscoverage['ui/editorui.js'][483]++; + this.showPopup(); +}), className: "edui-for-fontsize"}); + _$jscoverage['ui/editorui.js'][487]++; + editorui.buttons.fontsize = ui; + _$jscoverage['ui/editorui.js'][488]++; + editor.addListener("selectionchange", (function (type, causeByUi, uiReady) { + _$jscoverage['ui/editorui.js'][489]++; + if ((! uiReady)) { + _$jscoverage['ui/editorui.js'][490]++; + var state = editor.queryCommandState("FontSize"); + _$jscoverage['ui/editorui.js'][491]++; + if ((state == -1)) { + _$jscoverage['ui/editorui.js'][492]++; + ui.setDisabled(true); + } + else { + _$jscoverage['ui/editorui.js'][494]++; + ui.setDisabled(false); + _$jscoverage['ui/editorui.js'][495]++; + ui.setValue(editor.queryCommandValue("FontSize")); + } + } +})); + _$jscoverage['ui/editorui.js'][500]++; + return ui; +}); + _$jscoverage['ui/editorui.js'][503]++; + editorui.paragraph = (function (editor, list, title) { + _$jscoverage['ui/editorui.js'][504]++; + title = (editor.options.labelMap.paragraph || editor.getLang("labelMap.paragraph") || ""); + _$jscoverage['ui/editorui.js'][505]++; + list = (editor.options.paragraph || []); + _$jscoverage['ui/editorui.js'][506]++; + if (utils.isEmptyObject(list)) { + _$jscoverage['ui/editorui.js'][506]++; + return; + } + _$jscoverage['ui/editorui.js'][507]++; + var items = []; + _$jscoverage['ui/editorui.js'][508]++; + for (var i in list) { + _$jscoverage['ui/editorui.js'][509]++; + items.push({value: i, label: (list[i] || editor.getLang("paragraph")[i]), theme: editor.options.theme, renderLabelHtml: (function () { + _$jscoverage['ui/editorui.js'][514]++; + return ("
    " + (this.label || "") + "
    "); +})}); +} + _$jscoverage['ui/editorui.js'][518]++; + var ui = new (editorui.Combox)({editor: editor, items: items, title: title, initValue: title, className: "edui-for-paragraph", onselect: (function (t, index) { + _$jscoverage['ui/editorui.js'][525]++; + editor.execCommand("Paragraph", this.items[index].value); +}), onbuttonclick: (function () { + _$jscoverage['ui/editorui.js'][528]++; + this.showPopup(); +})}); + _$jscoverage['ui/editorui.js'][531]++; + editorui.buttons.paragraph = ui; + _$jscoverage['ui/editorui.js'][532]++; + editor.addListener("selectionchange", (function (type, causeByUi, uiReady) { + _$jscoverage['ui/editorui.js'][533]++; + if ((! uiReady)) { + _$jscoverage['ui/editorui.js'][534]++; + var state = editor.queryCommandState("Paragraph"); + _$jscoverage['ui/editorui.js'][535]++; + if ((state == -1)) { + _$jscoverage['ui/editorui.js'][536]++; + ui.setDisabled(true); + } + else { + _$jscoverage['ui/editorui.js'][538]++; + ui.setDisabled(false); + _$jscoverage['ui/editorui.js'][539]++; + var value = editor.queryCommandValue("Paragraph"); + _$jscoverage['ui/editorui.js'][540]++; + var index = ui.indexByValue(value); + _$jscoverage['ui/editorui.js'][541]++; + if ((index != -1)) { + _$jscoverage['ui/editorui.js'][542]++; + ui.setValue(value); + } + else { + _$jscoverage['ui/editorui.js'][544]++; + ui.setValue(ui.initValue); + } + } + } +})); + _$jscoverage['ui/editorui.js'][550]++; + return ui; +}); + _$jscoverage['ui/editorui.js'][555]++; + editorui.customstyle = (function (editor) { + _$jscoverage['ui/editorui.js'][556]++; + var list = (editor.options.customstyle || []), title = (editor.options.labelMap.customstyle || editor.getLang("labelMap.customstyle") || ""); + _$jscoverage['ui/editorui.js'][558]++; + if ((! list.length)) { + _$jscoverage['ui/editorui.js'][558]++; + return; + } + _$jscoverage['ui/editorui.js'][559]++; + var langCs = editor.getLang("customstyle"); + _$jscoverage['ui/editorui.js'][560]++; + for (var i = 0, items = [], t; (t = list[(i++)]);) { + _$jscoverage['ui/editorui.js'][561]++; + (function (t) { + _$jscoverage['ui/editorui.js'][562]++; + var ck = {}; + _$jscoverage['ui/editorui.js'][563]++; + ck.label = (t.label? t.label: langCs[t.name]); + _$jscoverage['ui/editorui.js'][564]++; + ck.style = t.style; + _$jscoverage['ui/editorui.js'][565]++; + ck.className = t.className; + _$jscoverage['ui/editorui.js'][566]++; + ck.tag = t.tag; + _$jscoverage['ui/editorui.js'][567]++; + items.push({label: ck.label, value: ck, theme: editor.options.theme, renderLabelHtml: (function () { + _$jscoverage['ui/editorui.js'][572]++; + return ("
    " + "<" + ck.tag + " " + (ck.className? (" class=\"" + ck.className + "\""): "") + (ck.style? (" style=\"" + ck.style + "\""): "") + ">" + ck.label + "" + "
    "); +})}); +})(t); +} + _$jscoverage['ui/editorui.js'][580]++; + var ui = new (editorui.Combox)({editor: editor, items: items, title: title, initValue: title, className: "edui-for-customstyle", onselect: (function (t, index) { + _$jscoverage['ui/editorui.js'][587]++; + editor.execCommand("customstyle", this.items[index].value); +}), onbuttonclick: (function () { + _$jscoverage['ui/editorui.js'][590]++; + this.showPopup(); +}), indexByValue: (function (value) { + _$jscoverage['ui/editorui.js'][593]++; + for (var i = 0, ti; (ti = this.items[(i++)]);) { + _$jscoverage['ui/editorui.js'][594]++; + if ((ti.label == value)) { + _$jscoverage['ui/editorui.js'][595]++; + return (i - 1); + } +} + _$jscoverage['ui/editorui.js'][598]++; + return -1; +})}); + _$jscoverage['ui/editorui.js'][601]++; + editorui.buttons.customstyle = ui; + _$jscoverage['ui/editorui.js'][602]++; + editor.addListener("selectionchange", (function (type, causeByUi, uiReady) { + _$jscoverage['ui/editorui.js'][603]++; + if ((! uiReady)) { + _$jscoverage['ui/editorui.js'][604]++; + var state = editor.queryCommandState("customstyle"); + _$jscoverage['ui/editorui.js'][605]++; + if ((state == -1)) { + _$jscoverage['ui/editorui.js'][606]++; + ui.setDisabled(true); + } + else { + _$jscoverage['ui/editorui.js'][608]++; + ui.setDisabled(false); + _$jscoverage['ui/editorui.js'][609]++; + var value = editor.queryCommandValue("customstyle"); + _$jscoverage['ui/editorui.js'][610]++; + var index = ui.indexByValue(value); + _$jscoverage['ui/editorui.js'][611]++; + if ((index != -1)) { + _$jscoverage['ui/editorui.js'][612]++; + ui.setValue(value); + } + else { + _$jscoverage['ui/editorui.js'][614]++; + ui.setValue(ui.initValue); + } + } + } +})); + _$jscoverage['ui/editorui.js'][620]++; + return ui; +}); + _$jscoverage['ui/editorui.js'][622]++; + editorui.inserttable = (function (editor, iframeUrl, title) { + _$jscoverage['ui/editorui.js'][623]++; + title = (editor.options.labelMap.inserttable || editor.getLang("labelMap.inserttable") || ""); + _$jscoverage['ui/editorui.js'][624]++; + var ui = new (editorui.TableButton)({editor: editor, title: title, className: "edui-for-inserttable", onpicktable: (function (t, numCols, numRows) { + _$jscoverage['ui/editorui.js'][629]++; + editor.execCommand("InsertTable", {numRows: numRows, numCols: numCols, border: 1}); +}), onbuttonclick: (function () { + _$jscoverage['ui/editorui.js'][632]++; + this.showPopup(); +})}); + _$jscoverage['ui/editorui.js'][635]++; + editorui.buttons.inserttable = ui; + _$jscoverage['ui/editorui.js'][636]++; + editor.addListener("selectionchange", (function () { + _$jscoverage['ui/editorui.js'][637]++; + ui.setDisabled((editor.queryCommandState("inserttable") == -1)); +})); + _$jscoverage['ui/editorui.js'][639]++; + return ui; +}); + _$jscoverage['ui/editorui.js'][642]++; + editorui.lineheight = (function (editor) { + _$jscoverage['ui/editorui.js'][643]++; + var val = (editor.options.lineheight || []); + _$jscoverage['ui/editorui.js'][644]++; + if ((! val.length)) { + _$jscoverage['ui/editorui.js'][644]++; + return; + } + _$jscoverage['ui/editorui.js'][645]++; + for (var i = 0, ci, items = []; (ci = val[(i++)]);) { + _$jscoverage['ui/editorui.js'][646]++; + items.push({label: ci, value: ci, theme: editor.options.theme, onclick: (function () { + _$jscoverage['ui/editorui.js'][652]++; + editor.execCommand("lineheight", this.value); +})}); +} + _$jscoverage['ui/editorui.js'][656]++; + var ui = new (editorui.MenuButton)({editor: editor, className: "edui-for-lineheight", title: (editor.options.labelMap.lineheight || editor.getLang("labelMap.lineheight") || ""), items: items, onbuttonclick: (function () { + _$jscoverage['ui/editorui.js'][662]++; + var value = (editor.queryCommandValue("LineHeight") || this.value); + _$jscoverage['ui/editorui.js'][663]++; + editor.execCommand("LineHeight", value); +})}); + _$jscoverage['ui/editorui.js'][666]++; + editorui.buttons.lineheight = ui; + _$jscoverage['ui/editorui.js'][667]++; + editor.addListener("selectionchange", (function () { + _$jscoverage['ui/editorui.js'][668]++; + var state = editor.queryCommandState("LineHeight"); + _$jscoverage['ui/editorui.js'][669]++; + if ((state == -1)) { + _$jscoverage['ui/editorui.js'][670]++; + ui.setDisabled(true); + } + else { + _$jscoverage['ui/editorui.js'][672]++; + ui.setDisabled(false); + _$jscoverage['ui/editorui.js'][673]++; + var value = editor.queryCommandValue("LineHeight"); + _$jscoverage['ui/editorui.js'][674]++; + (value && ui.setValue((value + "").replace(/cm/, ""))); + _$jscoverage['ui/editorui.js'][675]++; + ui.setChecked(state); + } +})); + _$jscoverage['ui/editorui.js'][678]++; + return ui; +}); + _$jscoverage['ui/editorui.js'][681]++; + var rowspacings = ["top", "bottom"]; + _$jscoverage['ui/editorui.js'][682]++; + for (var r = 0, ri; (ri = rowspacings[(r++)]);) { + _$jscoverage['ui/editorui.js'][683]++; + (function (cmd) { + _$jscoverage['ui/editorui.js'][684]++; + editorui[("rowspacing" + cmd)] = (function (editor) { + _$jscoverage['ui/editorui.js'][685]++; + var val = (editor.options[("rowspacing" + cmd)] || []); + _$jscoverage['ui/editorui.js'][686]++; + if ((! val.length)) { + _$jscoverage['ui/editorui.js'][686]++; + return null; + } + _$jscoverage['ui/editorui.js'][687]++; + for (var i = 0, ci, items = []; (ci = val[(i++)]);) { + _$jscoverage['ui/editorui.js'][688]++; + items.push({label: ci, value: ci, theme: editor.options.theme, onclick: (function () { + _$jscoverage['ui/editorui.js'][693]++; + editor.execCommand("rowspacing", this.value, cmd); +})}); +} + _$jscoverage['ui/editorui.js'][697]++; + 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 () { + _$jscoverage['ui/editorui.js'][703]++; + var value = (editor.queryCommandValue("rowspacing", cmd) || this.value); + _$jscoverage['ui/editorui.js'][704]++; + editor.execCommand("rowspacing", value, cmd); +})}); + _$jscoverage['ui/editorui.js'][707]++; + editorui.buttons[cmd] = ui; + _$jscoverage['ui/editorui.js'][708]++; + editor.addListener("selectionchange", (function () { + _$jscoverage['ui/editorui.js'][709]++; + var state = editor.queryCommandState("rowspacing", cmd); + _$jscoverage['ui/editorui.js'][710]++; + if ((state == -1)) { + _$jscoverage['ui/editorui.js'][711]++; + ui.setDisabled(true); + } + else { + _$jscoverage['ui/editorui.js'][713]++; + ui.setDisabled(false); + _$jscoverage['ui/editorui.js'][714]++; + var value = editor.queryCommandValue("rowspacing", cmd); + _$jscoverage['ui/editorui.js'][715]++; + (value && ui.setValue((value + "").replace(/%/, ""))); + _$jscoverage['ui/editorui.js'][716]++; + ui.setChecked(state); + } +})); + _$jscoverage['ui/editorui.js'][719]++; + return ui; +}); +})(ri); +} + _$jscoverage['ui/editorui.js'][724]++; + var lists = ["insertorderedlist", "insertunorderedlist"]; + _$jscoverage['ui/editorui.js'][725]++; + for (var l = 0, cl; (cl = lists[(l++)]);) { + _$jscoverage['ui/editorui.js'][726]++; + (function (cmd) { + _$jscoverage['ui/editorui.js'][727]++; + editorui[cmd] = (function (editor) { + _$jscoverage['ui/editorui.js'][728]++; + var vals = editor.options[cmd], _onMenuClick = (function () { + _$jscoverage['ui/editorui.js'][730]++; + editor.execCommand(cmd, this.value); +}), items = []; + _$jscoverage['ui/editorui.js'][732]++; + for (var i in vals) { + _$jscoverage['ui/editorui.js'][733]++; + items.push({label: (vals[i] || editor.getLang()[cmd][i] || ""), value: i, theme: editor.options.theme, onclick: _onMenuClick}); +} + _$jscoverage['ui/editorui.js'][740]++; + var ui = new (editorui.MenuButton)({editor: editor, className: ("edui-for-" + cmd), title: (editor.getLang(("labelMap." + cmd)) || ""), "items": items, onbuttonclick: (function () { + _$jscoverage['ui/editorui.js'][746]++; + var value = (editor.queryCommandValue(cmd) || this.value); + _$jscoverage['ui/editorui.js'][747]++; + editor.execCommand(cmd, value); +})}); + _$jscoverage['ui/editorui.js'][750]++; + editorui.buttons[cmd] = ui; + _$jscoverage['ui/editorui.js'][751]++; + editor.addListener("selectionchange", (function () { + _$jscoverage['ui/editorui.js'][752]++; + var state = editor.queryCommandState(cmd); + _$jscoverage['ui/editorui.js'][753]++; + if ((state == -1)) { + _$jscoverage['ui/editorui.js'][754]++; + ui.setDisabled(true); + } + else { + _$jscoverage['ui/editorui.js'][756]++; + ui.setDisabled(false); + _$jscoverage['ui/editorui.js'][757]++; + var value = editor.queryCommandValue(cmd); + _$jscoverage['ui/editorui.js'][758]++; + ui.setValue(value); + _$jscoverage['ui/editorui.js'][759]++; + ui.setChecked(state); + } +})); + _$jscoverage['ui/editorui.js'][762]++; + return ui; +}); +})(cl); +} + _$jscoverage['ui/editorui.js'][767]++; + editorui.fullscreen = (function (editor, title) { + _$jscoverage['ui/editorui.js'][768]++; + title = (editor.options.labelMap.fullscreen || editor.getLang("labelMap.fullscreen") || ""); + _$jscoverage['ui/editorui.js'][769]++; + var ui = new (editorui.Button)({className: "edui-for-fullscreen", title: title, theme: editor.options.theme, onclick: (function () { + _$jscoverage['ui/editorui.js'][774]++; + if (editor.ui) { + _$jscoverage['ui/editorui.js'][775]++; + editor.ui.setFullScreen((! editor.ui.isFullScreen())); + } + _$jscoverage['ui/editorui.js'][777]++; + this.setChecked(editor.ui.isFullScreen()); +})}); + _$jscoverage['ui/editorui.js'][780]++; + editorui.buttons.fullscreen = ui; + _$jscoverage['ui/editorui.js'][781]++; + editor.addListener("selectionchange", (function () { + _$jscoverage['ui/editorui.js'][782]++; + var state = editor.queryCommandState("fullscreen"); + _$jscoverage['ui/editorui.js'][783]++; + ui.setDisabled((state == -1)); + _$jscoverage['ui/editorui.js'][784]++; + ui.setChecked(editor.ui.isFullScreen()); +})); + _$jscoverage['ui/editorui.js'][786]++; + return ui; +}); + _$jscoverage['ui/editorui.js'][790]++; + editorui.emotion = (function (editor, iframeUrl) { + _$jscoverage['ui/editorui.js'][791]++; + var cmd = "emotion"; + _$jscoverage['ui/editorui.js'][792]++; + 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]))}); + _$jscoverage['ui/editorui.js'][798]++; + editorui.buttons[cmd] = ui; + _$jscoverage['ui/editorui.js'][800]++; + editor.addListener("selectionchange", (function () { + _$jscoverage['ui/editorui.js'][801]++; + ui.setDisabled((editor.queryCommandState(cmd) == -1)); +})); + _$jscoverage['ui/editorui.js'][803]++; + return ui; +}); + _$jscoverage['ui/editorui.js'][806]++; + editorui.autotypeset = (function (editor) { + _$jscoverage['ui/editorui.js'][807]++; + var ui = new (editorui.AutoTypeSetButton)({editor: editor, title: (editor.options.labelMap.autotypeset || editor.getLang("labelMap.autotypeset") || ""), className: "edui-for-autotypeset", onbuttonclick: (function () { + _$jscoverage['ui/editorui.js'][812]++; + editor.execCommand("autotypeset"); +})}); + _$jscoverage['ui/editorui.js'][815]++; + editorui.buttons.autotypeset = ui; + _$jscoverage['ui/editorui.js'][816]++; + editor.addListener("selectionchange", (function () { + _$jscoverage['ui/editorui.js'][817]++; + ui.setDisabled((editor.queryCommandState("autotypeset") == -1)); +})); + _$jscoverage['ui/editorui.js'][819]++; + return ui; +}); +})(); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/mask.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/mask.js new file mode 100644 index 000000000..c9498ee73 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/mask.js @@ -0,0 +1,127 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['ui/mask.js']) { + _$jscoverage['ui/mask.js'] = []; + _$jscoverage['ui/mask.js'][3] = 0; + _$jscoverage['ui/mask.js'][4] = 0; + _$jscoverage['ui/mask.js'][9] = 0; + _$jscoverage['ui/mask.js'][10] = 0; + _$jscoverage['ui/mask.js'][11] = 0; + _$jscoverage['ui/mask.js'][13] = 0; + _$jscoverage['ui/mask.js'][15] = 0; + _$jscoverage['ui/mask.js'][18] = 0; + _$jscoverage['ui/mask.js'][19] = 0; + _$jscoverage['ui/mask.js'][20] = 0; + _$jscoverage['ui/mask.js'][21] = 0; + _$jscoverage['ui/mask.js'][22] = 0; + _$jscoverage['ui/mask.js'][28] = 0; + _$jscoverage['ui/mask.js'][29] = 0; + _$jscoverage['ui/mask.js'][30] = 0; + _$jscoverage['ui/mask.js'][33] = 0; + _$jscoverage['ui/mask.js'][34] = 0; + _$jscoverage['ui/mask.js'][37] = 0; + _$jscoverage['ui/mask.js'][40] = 0; + _$jscoverage['ui/mask.js'][43] = 0; + _$jscoverage['ui/mask.js'][44] = 0; + _$jscoverage['ui/mask.js'][45] = 0; + _$jscoverage['ui/mask.js'][46] = 0; + _$jscoverage['ui/mask.js'][49] = 0; +} +_$jscoverage['ui/mask.js'].source = ["///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 '<div id=\"##\" class=\"edui-mask %%\" onmousedown=\"return $$._onMouseDown(event, this);\"></div>';"," },"," 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;"," },"," _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);","})();"]; +_$jscoverage['ui/mask.js'][3]++; +(function () { + _$jscoverage['ui/mask.js'][4]++; + var utils = baidu.editor.utils, domUtils = baidu.editor.dom.domUtils, UIBase = baidu.editor.ui.UIBase, uiUtils = baidu.editor.ui.uiUtils; + _$jscoverage['ui/mask.js'][9]++; + var Mask = (baidu.editor.ui.Mask = (function (options) { + _$jscoverage['ui/mask.js'][10]++; + this.initOptions(options); + _$jscoverage['ui/mask.js'][11]++; + this.initUIBase(); +})); + _$jscoverage['ui/mask.js'][13]++; + Mask.prototype = {getHtmlTpl: (function () { + _$jscoverage['ui/mask.js'][15]++; + return "
    "; +}), postRender: (function () { + _$jscoverage['ui/mask.js'][18]++; + var me = this; + _$jscoverage['ui/mask.js'][19]++; + domUtils.on(window, "resize", (function () { + _$jscoverage['ui/mask.js'][20]++; + setTimeout((function () { + _$jscoverage['ui/mask.js'][21]++; + if ((! me.isHidden())) { + _$jscoverage['ui/mask.js'][22]++; + me._fill(); + } +})); +})); +}), show: (function (zIndex) { + _$jscoverage['ui/mask.js'][28]++; + this._fill(); + _$jscoverage['ui/mask.js'][29]++; + this.getDom().style.display = ""; + _$jscoverage['ui/mask.js'][30]++; + this.getDom().style.zIndex = zIndex; +}), hide: (function () { + _$jscoverage['ui/mask.js'][33]++; + this.getDom().style.display = "none"; + _$jscoverage['ui/mask.js'][34]++; + this.getDom().style.zIndex = ""; +}), isHidden: (function () { + _$jscoverage['ui/mask.js'][37]++; + return (this.getDom().style.display == "none"); +}), _onMouseDown: (function () { + _$jscoverage['ui/mask.js'][40]++; + return false; +}), _fill: (function () { + _$jscoverage['ui/mask.js'][43]++; + var el = this.getDom(); + _$jscoverage['ui/mask.js'][44]++; + var vpRect = uiUtils.getViewportRect(); + _$jscoverage['ui/mask.js'][45]++; + el.style.width = (vpRect.width + "px"); + _$jscoverage['ui/mask.js'][46]++; + el.style.height = (vpRect.height + "px"); +})}; + _$jscoverage['ui/mask.js'][49]++; + utils.inherits(Mask, UIBase); +})(); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/menu.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/menu.js new file mode 100644 index 000000000..8f001266a --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/menu.js @@ -0,0 +1,541 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['ui/menu.js']) { + _$jscoverage['ui/menu.js'] = []; + _$jscoverage['ui/menu.js'][5] = 0; + _$jscoverage['ui/menu.js'][6] = 0; + _$jscoverage['ui/menu.js'][15] = 0; + _$jscoverage['ui/menu.js'][16] = 0; + _$jscoverage['ui/menu.js'][19] = 0; + _$jscoverage['ui/menu.js'][21] = 0; + _$jscoverage['ui/menu.js'][26] = 0; + _$jscoverage['ui/menu.js'][29] = 0; + _$jscoverage['ui/menu.js'][33] = 0; + _$jscoverage['ui/menu.js'][34] = 0; + _$jscoverage['ui/menu.js'][35] = 0; + _$jscoverage['ui/menu.js'][38] = 0; + _$jscoverage['ui/menu.js'][39] = 0; + _$jscoverage['ui/menu.js'][40] = 0; + _$jscoverage['ui/menu.js'][41] = 0; + _$jscoverage['ui/menu.js'][42] = 0; + _$jscoverage['ui/menu.js'][43] = 0; + _$jscoverage['ui/menu.js'][44] = 0; + _$jscoverage['ui/menu.js'][45] = 0; + _$jscoverage['ui/menu.js'][50] = 0; + _$jscoverage['ui/menu.js'][54] = 0; + _$jscoverage['ui/menu.js'][55] = 0; + _$jscoverage['ui/menu.js'][59] = 0; + _$jscoverage['ui/menu.js'][60] = 0; + _$jscoverage['ui/menu.js'][62] = 0; + _$jscoverage['ui/menu.js'][63] = 0; + _$jscoverage['ui/menu.js'][64] = 0; + _$jscoverage['ui/menu.js'][65] = 0; + _$jscoverage['ui/menu.js'][67] = 0; + _$jscoverage['ui/menu.js'][71] = 0; + _$jscoverage['ui/menu.js'][72] = 0; + _$jscoverage['ui/menu.js'][73] = 0; + _$jscoverage['ui/menu.js'][74] = 0; + _$jscoverage['ui/menu.js'][75] = 0; + _$jscoverage['ui/menu.js'][77] = 0; + _$jscoverage['ui/menu.js'][78] = 0; + _$jscoverage['ui/menu.js'][79] = 0; + _$jscoverage['ui/menu.js'][80] = 0; + _$jscoverage['ui/menu.js'][81] = 0; + _$jscoverage['ui/menu.js'][82] = 0; + _$jscoverage['ui/menu.js'][85] = 0; + _$jscoverage['ui/menu.js'][88] = 0; + _$jscoverage['ui/menu.js'][89] = 0; + _$jscoverage['ui/menu.js'][90] = 0; + _$jscoverage['ui/menu.js'][92] = 0; + _$jscoverage['ui/menu.js'][93] = 0; + _$jscoverage['ui/menu.js'][94] = 0; + _$jscoverage['ui/menu.js'][95] = 0; + _$jscoverage['ui/menu.js'][101] = 0; + _$jscoverage['ui/menu.js'][102] = 0; + _$jscoverage['ui/menu.js'][103] = 0; + _$jscoverage['ui/menu.js'][104] = 0; + _$jscoverage['ui/menu.js'][105] = 0; + _$jscoverage['ui/menu.js'][106] = 0; + _$jscoverage['ui/menu.js'][109] = 0; + _$jscoverage['ui/menu.js'][112] = 0; + _$jscoverage['ui/menu.js'][113] = 0; + _$jscoverage['ui/menu.js'][115] = 0; + _$jscoverage['ui/menu.js'][118] = 0; + _$jscoverage['ui/menu.js'][121] = 0; + _$jscoverage['ui/menu.js'][127] = 0; + _$jscoverage['ui/menu.js'][128] = 0; + _$jscoverage['ui/menu.js'][129] = 0; + _$jscoverage['ui/menu.js'][130] = 0; + _$jscoverage['ui/menu.js'][131] = 0; + _$jscoverage['ui/menu.js'][132] = 0; + _$jscoverage['ui/menu.js'][133] = 0; + _$jscoverage['ui/menu.js'][136] = 0; + _$jscoverage['ui/menu.js'][138] = 0; + _$jscoverage['ui/menu.js'][143] = 0; + _$jscoverage['ui/menu.js'][144] = 0; + _$jscoverage['ui/menu.js'][148] = 0; + _$jscoverage['ui/menu.js'][149] = 0; + _$jscoverage['ui/menu.js'][150] = 0; + _$jscoverage['ui/menu.js'][154] = 0; + _$jscoverage['ui/menu.js'][158] = 0; + _$jscoverage['ui/menu.js'][165] = 0; + _$jscoverage['ui/menu.js'][172] = 0; + _$jscoverage['ui/menu.js'][173] = 0; + _$jscoverage['ui/menu.js'][174] = 0; + _$jscoverage['ui/menu.js'][175] = 0; + _$jscoverage['ui/menu.js'][176] = 0; + _$jscoverage['ui/menu.js'][179] = 0; + _$jscoverage['ui/menu.js'][180] = 0; + _$jscoverage['ui/menu.js'][181] = 0; + _$jscoverage['ui/menu.js'][182] = 0; + _$jscoverage['ui/menu.js'][183] = 0; + _$jscoverage['ui/menu.js'][185] = 0; + _$jscoverage['ui/menu.js'][186] = 0; + _$jscoverage['ui/menu.js'][187] = 0; + _$jscoverage['ui/menu.js'][188] = 0; + _$jscoverage['ui/menu.js'][190] = 0; + _$jscoverage['ui/menu.js'][191] = 0; + _$jscoverage['ui/menu.js'][193] = 0; + _$jscoverage['ui/menu.js'][194] = 0; + _$jscoverage['ui/menu.js'][195] = 0; + _$jscoverage['ui/menu.js'][198] = 0; + _$jscoverage['ui/menu.js'][199] = 0; + _$jscoverage['ui/menu.js'][200] = 0; + _$jscoverage['ui/menu.js'][201] = 0; + _$jscoverage['ui/menu.js'][203] = 0; + _$jscoverage['ui/menu.js'][206] = 0; + _$jscoverage['ui/menu.js'][207] = 0; + _$jscoverage['ui/menu.js'][208] = 0; + _$jscoverage['ui/menu.js'][211] = 0; + _$jscoverage['ui/menu.js'][212] = 0; + _$jscoverage['ui/menu.js'][213] = 0; + _$jscoverage['ui/menu.js'][214] = 0; + _$jscoverage['ui/menu.js'][215] = 0; + _$jscoverage['ui/menu.js'][216] = 0; + _$jscoverage['ui/menu.js'][217] = 0; + _$jscoverage['ui/menu.js'][218] = 0; + _$jscoverage['ui/menu.js'][223] = 0; + _$jscoverage['ui/menu.js'][224] = 0; + _$jscoverage['ui/menu.js'][225] = 0; + _$jscoverage['ui/menu.js'][226] = 0; + _$jscoverage['ui/menu.js'][227] = 0; + _$jscoverage['ui/menu.js'][228] = 0; + _$jscoverage['ui/menu.js'][229] = 0; + _$jscoverage['ui/menu.js'][230] = 0; + _$jscoverage['ui/menu.js'][232] = 0; + _$jscoverage['ui/menu.js'][238] = 0; + _$jscoverage['ui/menu.js'][243] = 0; + _$jscoverage['ui/menu.js'][246] = 0; + _$jscoverage['ui/menu.js'][247] = 0; + _$jscoverage['ui/menu.js'][251] = 0; + _$jscoverage['ui/menu.js'][252] = 0; + _$jscoverage['ui/menu.js'][253] = 0; + _$jscoverage['ui/menu.js'][254] = 0; + _$jscoverage['ui/menu.js'][256] = 0; + _$jscoverage['ui/menu.js'][261] = 0; + _$jscoverage['ui/menu.js'][262] = 0; + _$jscoverage['ui/menu.js'][263] = 0; + _$jscoverage['ui/menu.js'][264] = 0; + _$jscoverage['ui/menu.js'][265] = 0; + _$jscoverage['ui/menu.js'][266] = 0; + _$jscoverage['ui/menu.js'][267] = 0; + _$jscoverage['ui/menu.js'][268] = 0; + _$jscoverage['ui/menu.js'][271] = 0; + _$jscoverage['ui/menu.js'][274] = 0; + _$jscoverage['ui/menu.js'][275] = 0; +} +_$jscoverage['ui/menu.js'].source = ["///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 '<div class=\"edui-menuitem edui-menuseparator\"><div class=\"edui-menuseparator-inner\"></div></div>';"," },"," 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 ('<div class=\"%%-body\">' + buff.join('') + '</div>');"," },"," _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 '<div id=\"##\" class=\"%%\" stateful onclick=\"$$._onClick(event, this);\">' +"," '<div class=\"%%-body\">' +"," this.renderLabelHtml() +"," '</div>' +"," '</div>';"," },"," 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 '<div class=\"edui-arrow\"></div>' +"," '<div class=\"edui-box edui-icon\"></div>' +"," '<div class=\"edui-box edui-label %%-label\">' + (this.label || '') + '</div>';"," },"," 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);","})();"]; +_$jscoverage['ui/menu.js'][5]++; +(function () { + _$jscoverage['ui/menu.js'][6]++; + 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) { + _$jscoverage['ui/menu.js'][15]++; + this.initOptions(options); + _$jscoverage['ui/menu.js'][16]++; + this.initMenu(); +})); + _$jscoverage['ui/menu.js'][19]++; + var menuSeparator = {renderHtml: (function () { + _$jscoverage['ui/menu.js'][21]++; + return "
    "; +}), postRender: (function () { +}), queryAutoHide: (function () { + _$jscoverage['ui/menu.js'][26]++; + return true; +})}; + _$jscoverage['ui/menu.js'][29]++; + Menu.prototype = {items: null, uiName: "menu", initMenu: (function () { + _$jscoverage['ui/menu.js'][33]++; + this.items = (this.items || []); + _$jscoverage['ui/menu.js'][34]++; + this.initPopup(); + _$jscoverage['ui/menu.js'][35]++; + this.initItems(); +}), initItems: (function () { + _$jscoverage['ui/menu.js'][38]++; + for (var i = 0; (i < this.items.length); (i++)) { + _$jscoverage['ui/menu.js'][39]++; + var item = this.items[i]; + _$jscoverage['ui/menu.js'][40]++; + if ((item == "-")) { + _$jscoverage['ui/menu.js'][41]++; + this.items[i] = this.getSeparator(); + } + else { + _$jscoverage['ui/menu.js'][42]++; + if ((! (item instanceof MenuItem))) { + _$jscoverage['ui/menu.js'][43]++; + item.editor = this.editor; + _$jscoverage['ui/menu.js'][44]++; + item.theme = this.editor.options.theme; + _$jscoverage['ui/menu.js'][45]++; + this.items[i] = this.createItem(item); + } + } +} +}), getSeparator: (function () { + _$jscoverage['ui/menu.js'][50]++; + return menuSeparator; +}), createItem: (function (item) { + _$jscoverage['ui/menu.js'][54]++; + item.menu = this; + _$jscoverage['ui/menu.js'][55]++; + return new MenuItem(item); +}), _Popup_getContentHtmlTpl: Popup.prototype.getContentHtmlTpl, getContentHtmlTpl: (function () { + _$jscoverage['ui/menu.js'][59]++; + if ((this.items.length == 0)) { + _$jscoverage['ui/menu.js'][60]++; + return this._Popup_getContentHtmlTpl(); + } + _$jscoverage['ui/menu.js'][62]++; + var buff = []; + _$jscoverage['ui/menu.js'][63]++; + for (var i = 0; (i < this.items.length); (i++)) { + _$jscoverage['ui/menu.js'][64]++; + var item = this.items[i]; + _$jscoverage['ui/menu.js'][65]++; + buff[i] = item.renderHtml(); +} + _$jscoverage['ui/menu.js'][67]++; + return ("
    " + buff.join("") + "
    "); +}), _Popup_postRender: Popup.prototype.postRender, postRender: (function () { + _$jscoverage['ui/menu.js'][71]++; + var me = this; + _$jscoverage['ui/menu.js'][72]++; + for (var i = 0; (i < this.items.length); (i++)) { + _$jscoverage['ui/menu.js'][73]++; + var item = this.items[i]; + _$jscoverage['ui/menu.js'][74]++; + item.ownerMenu = this; + _$jscoverage['ui/menu.js'][75]++; + item.postRender(); +} + _$jscoverage['ui/menu.js'][77]++; + domUtils.on(this.getDom(), "mouseover", (function (evt) { + _$jscoverage['ui/menu.js'][78]++; + evt = (evt || event); + _$jscoverage['ui/menu.js'][79]++; + var rel = (evt.relatedTarget || evt.fromElement); + _$jscoverage['ui/menu.js'][80]++; + var el = me.getDom(); + _$jscoverage['ui/menu.js'][81]++; + if (((! uiUtils.contains(el, rel)) && (el !== rel))) { + _$jscoverage['ui/menu.js'][82]++; + me.fireEvent("over"); + } +})); + _$jscoverage['ui/menu.js'][85]++; + this._Popup_postRender(); +}), queryAutoHide: (function (el) { + _$jscoverage['ui/menu.js'][88]++; + if (el) { + _$jscoverage['ui/menu.js'][89]++; + if (uiUtils.contains(this.getDom(), el)) { + _$jscoverage['ui/menu.js'][90]++; + return false; + } + _$jscoverage['ui/menu.js'][92]++; + for (var i = 0; (i < this.items.length); (i++)) { + _$jscoverage['ui/menu.js'][93]++; + var item = this.items[i]; + _$jscoverage['ui/menu.js'][94]++; + if ((item.queryAutoHide(el) === false)) { + _$jscoverage['ui/menu.js'][95]++; + return false; + } +} + } +}), clearItems: (function () { + _$jscoverage['ui/menu.js'][101]++; + for (var i = 0; (i < this.items.length); (i++)) { + _$jscoverage['ui/menu.js'][102]++; + var item = this.items[i]; + _$jscoverage['ui/menu.js'][103]++; + clearTimeout(item._showingTimer); + _$jscoverage['ui/menu.js'][104]++; + clearTimeout(item._closingTimer); + _$jscoverage['ui/menu.js'][105]++; + if (item.subMenu) { + _$jscoverage['ui/menu.js'][106]++; + item.subMenu.destroy(); + } +} + _$jscoverage['ui/menu.js'][109]++; + this.items = []; +}), destroy: (function () { + _$jscoverage['ui/menu.js'][112]++; + if (this.getDom()) { + _$jscoverage['ui/menu.js'][113]++; + domUtils.remove(this.getDom()); + } + _$jscoverage['ui/menu.js'][115]++; + this.clearItems(); +}), dispose: (function () { + _$jscoverage['ui/menu.js'][118]++; + this.destroy(); +})}; + _$jscoverage['ui/menu.js'][121]++; + utils.inherits(Menu, Popup); + _$jscoverage['ui/menu.js'][127]++; + var MenuItem = (baidu.editor.ui.MenuItem = (function (options) { + _$jscoverage['ui/menu.js'][128]++; + this.initOptions(options); + _$jscoverage['ui/menu.js'][129]++; + this.initUIBase(); + _$jscoverage['ui/menu.js'][130]++; + this.Stateful_init(); + _$jscoverage['ui/menu.js'][131]++; + if ((this.subMenu && (! (this.subMenu instanceof Menu)))) { + _$jscoverage['ui/menu.js'][132]++; + if ((options.className && (options.className.indexOf("aligntd") != -1))) { + _$jscoverage['ui/menu.js'][133]++; + var me = this; + _$jscoverage['ui/menu.js'][136]++; + this.subMenu.selected = this.editor.queryCommandValue("cellalignment"); + _$jscoverage['ui/menu.js'][138]++; + this.subMenu = new Popup({content: new CellAlignPicker(this.subMenu), parentMenu: me, editor: me.editor, destroy: (function () { + _$jscoverage['ui/menu.js'][143]++; + if (this.getDom()) { + _$jscoverage['ui/menu.js'][144]++; + domUtils.remove(this.getDom()); + } +})}); + _$jscoverage['ui/menu.js'][148]++; + this.subMenu.addListener("postRenderAfter", (function () { + _$jscoverage['ui/menu.js'][149]++; + domUtils.on(this.getDom(), "mouseover", (function () { + _$jscoverage['ui/menu.js'][150]++; + me.addState("opened"); +})); +})); + } + else { + _$jscoverage['ui/menu.js'][154]++; + this.subMenu = new Menu(this.subMenu); + } + } +})); + _$jscoverage['ui/menu.js'][158]++; + MenuItem.prototype = {label: "", subMenu: null, ownerMenu: null, uiName: "menuitem", alwalysHoverable: true, getHtmlTpl: (function () { + _$jscoverage['ui/menu.js'][165]++; + return ("
    " + "
    " + this.renderLabelHtml() + "
    " + "
    "); +}), postRender: (function () { + _$jscoverage['ui/menu.js'][172]++; + var me = this; + _$jscoverage['ui/menu.js'][173]++; + this.addListener("over", (function () { + _$jscoverage['ui/menu.js'][174]++; + me.ownerMenu.fireEvent("submenuover", me); + _$jscoverage['ui/menu.js'][175]++; + if (me.subMenu) { + _$jscoverage['ui/menu.js'][176]++; + me.delayShowSubMenu(); + } +})); + _$jscoverage['ui/menu.js'][179]++; + if (this.subMenu) { + _$jscoverage['ui/menu.js'][180]++; + this.getDom().className += " edui-hassubmenu"; + _$jscoverage['ui/menu.js'][181]++; + this.subMenu.render(); + _$jscoverage['ui/menu.js'][182]++; + this.addListener("out", (function () { + _$jscoverage['ui/menu.js'][183]++; + me.delayHideSubMenu(); +})); + _$jscoverage['ui/menu.js'][185]++; + this.subMenu.addListener("over", (function () { + _$jscoverage['ui/menu.js'][186]++; + clearTimeout(me._closingTimer); + _$jscoverage['ui/menu.js'][187]++; + me._closingTimer = null; + _$jscoverage['ui/menu.js'][188]++; + me.addState("opened"); +})); + _$jscoverage['ui/menu.js'][190]++; + this.ownerMenu.addListener("hide", (function () { + _$jscoverage['ui/menu.js'][191]++; + me.hideSubMenu(); +})); + _$jscoverage['ui/menu.js'][193]++; + this.ownerMenu.addListener("submenuover", (function (t, subMenu) { + _$jscoverage['ui/menu.js'][194]++; + if ((subMenu !== me)) { + _$jscoverage['ui/menu.js'][195]++; + me.delayHideSubMenu(); + } +})); + _$jscoverage['ui/menu.js'][198]++; + this.subMenu._bakQueryAutoHide = this.subMenu.queryAutoHide; + _$jscoverage['ui/menu.js'][199]++; + this.subMenu.queryAutoHide = (function (el) { + _$jscoverage['ui/menu.js'][200]++; + if ((el && uiUtils.contains(me.getDom(), el))) { + _$jscoverage['ui/menu.js'][201]++; + return false; + } + _$jscoverage['ui/menu.js'][203]++; + return this._bakQueryAutoHide(el); +}); + } + _$jscoverage['ui/menu.js'][206]++; + this.getDom().style.tabIndex = "-1"; + _$jscoverage['ui/menu.js'][207]++; + uiUtils.makeUnselectable(this.getDom()); + _$jscoverage['ui/menu.js'][208]++; + this.Stateful_postRender(); +}), delayShowSubMenu: (function () { + _$jscoverage['ui/menu.js'][211]++; + var me = this; + _$jscoverage['ui/menu.js'][212]++; + if ((! me.isDisabled())) { + _$jscoverage['ui/menu.js'][213]++; + me.addState("opened"); + _$jscoverage['ui/menu.js'][214]++; + clearTimeout(me._showingTimer); + _$jscoverage['ui/menu.js'][215]++; + clearTimeout(me._closingTimer); + _$jscoverage['ui/menu.js'][216]++; + me._closingTimer = null; + _$jscoverage['ui/menu.js'][217]++; + me._showingTimer = setTimeout((function () { + _$jscoverage['ui/menu.js'][218]++; + me.showSubMenu(); +}), 250); + } +}), delayHideSubMenu: (function () { + _$jscoverage['ui/menu.js'][223]++; + var me = this; + _$jscoverage['ui/menu.js'][224]++; + if ((! me.isDisabled())) { + _$jscoverage['ui/menu.js'][225]++; + me.removeState("opened"); + _$jscoverage['ui/menu.js'][226]++; + clearTimeout(me._showingTimer); + _$jscoverage['ui/menu.js'][227]++; + if ((! me._closingTimer)) { + _$jscoverage['ui/menu.js'][228]++; + me._closingTimer = setTimeout((function () { + _$jscoverage['ui/menu.js'][229]++; + if ((! me.hasState("opened"))) { + _$jscoverage['ui/menu.js'][230]++; + me.hideSubMenu(); + } + _$jscoverage['ui/menu.js'][232]++; + me._closingTimer = null; +}), 400); + } + } +}), renderLabelHtml: (function () { + _$jscoverage['ui/menu.js'][238]++; + return ("
    " + "
    " + "
    " + (this.label || "") + "
    "); +}), getStateDom: (function () { + _$jscoverage['ui/menu.js'][243]++; + return this.getDom(); +}), queryAutoHide: (function (el) { + _$jscoverage['ui/menu.js'][246]++; + if ((this.subMenu && this.hasState("opened"))) { + _$jscoverage['ui/menu.js'][247]++; + return this.subMenu.queryAutoHide(el); + } +}), _onClick: (function (event, this_) { + _$jscoverage['ui/menu.js'][251]++; + if (this.hasState("disabled")) { + _$jscoverage['ui/menu.js'][251]++; + return; + } + _$jscoverage['ui/menu.js'][252]++; + if ((this.fireEvent("click", event, this_) !== false)) { + _$jscoverage['ui/menu.js'][253]++; + if (this.subMenu) { + _$jscoverage['ui/menu.js'][254]++; + this.showSubMenu(); + } + else { + _$jscoverage['ui/menu.js'][256]++; + Popup.postHide(event); + } + } +}), showSubMenu: (function () { + _$jscoverage['ui/menu.js'][261]++; + var rect = uiUtils.getClientRect(this.getDom()); + _$jscoverage['ui/menu.js'][262]++; + rect.right -= 5; + _$jscoverage['ui/menu.js'][263]++; + rect.left += 2; + _$jscoverage['ui/menu.js'][264]++; + rect.width -= 7; + _$jscoverage['ui/menu.js'][265]++; + rect.top -= 4; + _$jscoverage['ui/menu.js'][266]++; + rect.bottom += 4; + _$jscoverage['ui/menu.js'][267]++; + rect.height += 8; + _$jscoverage['ui/menu.js'][268]++; + this.subMenu.showAnchorRect(rect, true, true); +}), hideSubMenu: (function () { + _$jscoverage['ui/menu.js'][271]++; + this.subMenu.hide(); +})}; + _$jscoverage['ui/menu.js'][274]++; + utils.inherits(MenuItem, UIBase); + _$jscoverage['ui/menu.js'][275]++; + utils.extend(MenuItem.prototype, Stateful, true); +})(); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/menubutton.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/menubutton.js new file mode 100644 index 000000000..00f482ad9 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/menubutton.js @@ -0,0 +1,104 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['ui/menubutton.js']) { + _$jscoverage['ui/menubutton.js'] = []; + _$jscoverage['ui/menubutton.js'][5] = 0; + _$jscoverage['ui/menubutton.js'][6] = 0; + _$jscoverage['ui/menubutton.js'][10] = 0; + _$jscoverage['ui/menubutton.js'][11] = 0; + _$jscoverage['ui/menubutton.js'][13] = 0; + _$jscoverage['ui/menubutton.js'][15] = 0; + _$jscoverage['ui/menubutton.js'][16] = 0; + _$jscoverage['ui/menubutton.js'][17] = 0; + _$jscoverage['ui/menubutton.js'][22] = 0; + _$jscoverage['ui/menubutton.js'][23] = 0; + _$jscoverage['ui/menubutton.js'][24] = 0; + _$jscoverage['ui/menubutton.js'][25] = 0; + _$jscoverage['ui/menubutton.js'][26] = 0; + _$jscoverage['ui/menubutton.js'][27] = 0; + _$jscoverage['ui/menubutton.js'][28] = 0; + _$jscoverage['ui/menubutton.js'][32] = 0; + _$jscoverage['ui/menubutton.js'][35] = 0; + _$jscoverage['ui/menubutton.js'][39] = 0; +} +_$jscoverage['ui/menubutton.js'].source = ["///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);","})();"]; +_$jscoverage['ui/menubutton.js'][5]++; +(function () { + _$jscoverage['ui/menubutton.js'][6]++; + var utils = baidu.editor.utils, Menu = baidu.editor.ui.Menu, SplitButton = baidu.editor.ui.SplitButton, MenuButton = (baidu.editor.ui.MenuButton = (function (options) { + _$jscoverage['ui/menubutton.js'][10]++; + this.initOptions(options); + _$jscoverage['ui/menubutton.js'][11]++; + this.initMenuButton(); +})); + _$jscoverage['ui/menubutton.js'][13]++; + MenuButton.prototype = {initMenuButton: (function () { + _$jscoverage['ui/menubutton.js'][15]++; + var me = this; + _$jscoverage['ui/menubutton.js'][16]++; + this.uiName = "menubutton"; + _$jscoverage['ui/menubutton.js'][17]++; + this.popup = new Menu({items: me.items, className: me.className, editor: me.editor}); + _$jscoverage['ui/menubutton.js'][22]++; + this.popup.addListener("show", (function () { + _$jscoverage['ui/menubutton.js'][23]++; + var list = this; + _$jscoverage['ui/menubutton.js'][24]++; + for (var i = 0; (i < list.items.length); (i++)) { + _$jscoverage['ui/menubutton.js'][25]++; + list.items[i].removeState("checked"); + _$jscoverage['ui/menubutton.js'][26]++; + if ((list.items[i].value == me._value)) { + _$jscoverage['ui/menubutton.js'][27]++; + list.items[i].addState("checked"); + _$jscoverage['ui/menubutton.js'][28]++; + this.value = me._value; + } +} +})); + _$jscoverage['ui/menubutton.js'][32]++; + this.initSplitButton(); +}), setValue: (function (value) { + _$jscoverage['ui/menubutton.js'][35]++; + this._value = value; +})}; + _$jscoverage['ui/menubutton.js'][39]++; + utils.inherits(MenuButton, SplitButton); +})(); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/multiMenu.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/multiMenu.js new file mode 100644 index 000000000..78557ac8f --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/multiMenu.js @@ -0,0 +1,94 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['ui/multiMenu.js']) { + _$jscoverage['ui/multiMenu.js'] = []; + _$jscoverage['ui/multiMenu.js'][4] = 0; + _$jscoverage['ui/multiMenu.js'][5] = 0; + _$jscoverage['ui/multiMenu.js'][9] = 0; + _$jscoverage['ui/multiMenu.js'][10] = 0; + _$jscoverage['ui/multiMenu.js'][13] = 0; + _$jscoverage['ui/multiMenu.js'][15] = 0; + _$jscoverage['ui/multiMenu.js'][16] = 0; + _$jscoverage['ui/multiMenu.js'][21] = 0; + _$jscoverage['ui/multiMenu.js'][22] = 0; + _$jscoverage['ui/multiMenu.js'][23] = 0; + _$jscoverage['ui/multiMenu.js'][24] = 0; + _$jscoverage['ui/multiMenu.js'][30] = 0; + _$jscoverage['ui/multiMenu.js'][31] = 0; + _$jscoverage['ui/multiMenu.js'][33] = 0; + _$jscoverage['ui/multiMenu.js'][38] = 0; +} +_$jscoverage['ui/multiMenu.js'].source = ["///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 = '<iframe id=\"'+me.id+'_iframe\" src=\"'+ me.iframeUrl +'\" frameborder=\"0\"></iframe>';"," 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);","})();"]; +_$jscoverage['ui/multiMenu.js'][4]++; +(function () { + _$jscoverage['ui/multiMenu.js'][5]++; + var utils = baidu.editor.utils, Popup = baidu.editor.ui.Popup, SplitButton = baidu.editor.ui.SplitButton, MultiMenuPop = (baidu.editor.ui.MultiMenuPop = (function (options) { + _$jscoverage['ui/multiMenu.js'][9]++; + this.initOptions(options); + _$jscoverage['ui/multiMenu.js'][10]++; + this.initMultiMenu(); +})); + _$jscoverage['ui/multiMenu.js'][13]++; + MultiMenuPop.prototype = {initMultiMenu: (function () { + _$jscoverage['ui/multiMenu.js'][15]++; + var me = this; + _$jscoverage['ui/multiMenu.js'][16]++; + this.popup = new Popup({content: "", editor: me.editor, iframe_rendered: false, onshow: (function () { + _$jscoverage['ui/multiMenu.js'][21]++; + if ((! this.iframe_rendered)) { + _$jscoverage['ui/multiMenu.js'][22]++; + this.iframe_rendered = true; + _$jscoverage['ui/multiMenu.js'][23]++; + this.getDom("content").innerHTML = (""); + _$jscoverage['ui/multiMenu.js'][24]++; + (me.editor.container.style.zIndex && (this.getDom().style.zIndex = ((me.editor.container.style.zIndex * 1) + 1))); + } +})}); + _$jscoverage['ui/multiMenu.js'][30]++; + this.onbuttonclick = (function () { + _$jscoverage['ui/multiMenu.js'][31]++; + this.showPopup(); +}); + _$jscoverage['ui/multiMenu.js'][33]++; + this.initSplitButton(); +})}; + _$jscoverage['ui/multiMenu.js'][38]++; + utils.inherits(MultiMenuPop, SplitButton); +})(); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/pastepicker.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/pastepicker.js new file mode 100644 index 000000000..d17ca60dc --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/pastepicker.js @@ -0,0 +1,125 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['ui/pastepicker.js']) { + _$jscoverage['ui/pastepicker.js'] = []; + _$jscoverage['ui/pastepicker.js'][3] = 0; + _$jscoverage['ui/pastepicker.js'][4] = 0; + _$jscoverage['ui/pastepicker.js'][9] = 0; + _$jscoverage['ui/pastepicker.js'][10] = 0; + _$jscoverage['ui/pastepicker.js'][11] = 0; + _$jscoverage['ui/pastepicker.js'][13] = 0; + _$jscoverage['ui/pastepicker.js'][15] = 0; + _$jscoverage['ui/pastepicker.js'][16] = 0; + _$jscoverage['ui/pastepicker.js'][19] = 0; + _$jscoverage['ui/pastepicker.js'][34] = 0; + _$jscoverage['ui/pastepicker.js'][37] = 0; + _$jscoverage['ui/pastepicker.js'][38] = 0; + _$jscoverage['ui/pastepicker.js'][41] = 0; + _$jscoverage['ui/pastepicker.js'][45] = 0; + _$jscoverage['ui/pastepicker.js'][46] = 0; + _$jscoverage['ui/pastepicker.js'][48] = 0; + _$jscoverage['ui/pastepicker.js'][50] = 0; + _$jscoverage['ui/pastepicker.js'][51] = 0; + _$jscoverage['ui/pastepicker.js'][52] = 0; + _$jscoverage['ui/pastepicker.js'][54] = 0; + _$jscoverage['ui/pastepicker.js'][55] = 0; + _$jscoverage['ui/pastepicker.js'][60] = 0; + _$jscoverage['ui/pastepicker.js'][61] = 0; +} +_$jscoverage['ui/pastepicker.js'].source = ["///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 '<div class=\"edui-pasteicon\" onclick=\"$$._onClick(this)\"></div>' +"," '<div class=\"edui-pastecontainer\">' +"," '<div class=\"edui-title\">' + this.editor.getLang(\"pasteOpt\") + '</div>' +"," '<div class=\"edui-button\">' +"," '<div title=\"' + this.editor.getLang(\"pasteSourceFormat\") + '\" onclick=\"$$.format(false)\" stateful>' +"," '<div class=\"edui-richtxticon\"></div></div>' +"," '<div title=\"' + this.editor.getLang(\"tagFormat\") + '\" onclick=\"$$.format(2)\" stateful>' +"," '<div class=\"edui-tagicon\"></div></div>' +"," '<div title=\"' + this.editor.getLang(\"pasteTextFormat\") + '\" onclick=\"$$.format(true)\" stateful>' +"," '<div class=\"edui-plaintxticon\"></div></div>' +"," '</div>' +"," '</div>' +"," '</div>'"," },"," 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/ig.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);","})();","","","",""]; +_$jscoverage['ui/pastepicker.js'][3]++; +(function () { + _$jscoverage['ui/pastepicker.js'][4]++; + var utils = baidu.editor.utils, Stateful = baidu.editor.ui.Stateful, uiUtils = baidu.editor.ui.uiUtils, UIBase = baidu.editor.ui.UIBase; + _$jscoverage['ui/pastepicker.js'][9]++; + var PastePicker = (baidu.editor.ui.PastePicker = (function (options) { + _$jscoverage['ui/pastepicker.js'][10]++; + this.initOptions(options); + _$jscoverage['ui/pastepicker.js'][11]++; + this.initPastePicker(); +})); + _$jscoverage['ui/pastepicker.js'][13]++; + PastePicker.prototype = {initPastePicker: (function () { + _$jscoverage['ui/pastepicker.js'][15]++; + this.initUIBase(); + _$jscoverage['ui/pastepicker.js'][16]++; + this.Stateful_init(); +}), getHtmlTpl: (function () { + _$jscoverage['ui/pastepicker.js'][19]++; + return ("
    " + "
    " + "
    " + this.editor.getLang("pasteOpt") + "
    " + "
    " + "
    " + "
    " + "
    " + "
    " + "
    " + "
    " + "
    " + "
    " + "
    "); +}), getStateDom: (function () { + _$jscoverage['ui/pastepicker.js'][34]++; + return this.target; +}), format: (function (param) { + _$jscoverage['ui/pastepicker.js'][37]++; + this.editor.ui._isTransfer = true; + _$jscoverage['ui/pastepicker.js'][38]++; + this.editor.fireEvent("pasteTransfer", param); +}), _onClick: (function (cur) { + _$jscoverage['ui/pastepicker.js'][41]++; + var node = domUtils.getNextDomNode(cur), screenHt = uiUtils.getViewportRect().height, subPop = uiUtils.getClientRect(node); + _$jscoverage['ui/pastepicker.js'][45]++; + if (((subPop.top + subPop.height) > screenHt)) { + _$jscoverage['ui/pastepicker.js'][46]++; + node.style.top = (((- subPop.height) - cur.offsetHeight) + "px"); + } + else { + _$jscoverage['ui/pastepicker.js'][48]++; + node.style.top = ""; + } + _$jscoverage['ui/pastepicker.js'][50]++; + if (/hidden/gi.test(domUtils.getComputedStyle(node, "visibility"))) { + _$jscoverage['ui/pastepicker.js'][51]++; + node.style.visibility = "visible"; + _$jscoverage['ui/pastepicker.js'][52]++; + domUtils.addClass(cur, "edui-state-opened"); + } + else { + _$jscoverage['ui/pastepicker.js'][54]++; + node.style.visibility = "hidden"; + _$jscoverage['ui/pastepicker.js'][55]++; + domUtils.removeClasses(cur, "edui-state-opened"); + } +}), _UIBase_render: UIBase.prototype.render}; + _$jscoverage['ui/pastepicker.js'][60]++; + utils.inherits(PastePicker, UIBase); + _$jscoverage['ui/pastepicker.js'][61]++; + utils.extend(PastePicker.prototype, Stateful, true); +})(); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/popup.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/popup.js new file mode 100644 index 000000000..ced902dd1 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/popup.js @@ -0,0 +1,433 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['ui/popup.js']) { + _$jscoverage['ui/popup.js'] = []; + _$jscoverage['ui/popup.js'][3] = 0; + _$jscoverage['ui/popup.js'][4] = 0; + _$jscoverage['ui/popup.js'][9] = 0; + _$jscoverage['ui/popup.js'][10] = 0; + _$jscoverage['ui/popup.js'][13] = 0; + _$jscoverage['ui/popup.js'][14] = 0; + _$jscoverage['ui/popup.js'][15] = 0; + _$jscoverage['ui/popup.js'][16] = 0; + _$jscoverage['ui/popup.js'][17] = 0; + _$jscoverage['ui/popup.js'][18] = 0; + _$jscoverage['ui/popup.js'][19] = 0; + _$jscoverage['ui/popup.js'][20] = 0; + _$jscoverage['ui/popup.js'][25] = 0; + _$jscoverage['ui/popup.js'][26] = 0; + _$jscoverage['ui/popup.js'][29] = 0; + _$jscoverage['ui/popup.js'][31] = 0; + _$jscoverage['ui/popup.js'][33] = 0; + _$jscoverage['ui/popup.js'][41] = 0; + _$jscoverage['ui/popup.js'][42] = 0; + _$jscoverage['ui/popup.js'][45] = 0; + _$jscoverage['ui/popup.js'][56] = 0; + _$jscoverage['ui/popup.js'][57] = 0; + _$jscoverage['ui/popup.js'][58] = 0; + _$jscoverage['ui/popup.js'][60] = 0; + _$jscoverage['ui/popup.js'][62] = 0; + _$jscoverage['ui/popup.js'][70] = 0; + _$jscoverage['ui/popup.js'][71] = 0; + _$jscoverage['ui/popup.js'][75] = 0; + _$jscoverage['ui/popup.js'][77] = 0; + _$jscoverage['ui/popup.js'][79] = 0; + _$jscoverage['ui/popup.js'][85] = 0; + _$jscoverage['ui/popup.js'][86] = 0; + _$jscoverage['ui/popup.js'][87] = 0; + _$jscoverage['ui/popup.js'][91] = 0; + _$jscoverage['ui/popup.js'][93] = 0; + _$jscoverage['ui/popup.js'][95] = 0; + _$jscoverage['ui/popup.js'][96] = 0; + _$jscoverage['ui/popup.js'][98] = 0; + _$jscoverage['ui/popup.js'][101] = 0; + _$jscoverage['ui/popup.js'][103] = 0; + _$jscoverage['ui/popup.js'][107] = 0; + _$jscoverage['ui/popup.js'][116] = 0; + _$jscoverage['ui/popup.js'][118] = 0; + _$jscoverage['ui/popup.js'][120] = 0; + _$jscoverage['ui/popup.js'][127] = 0; + _$jscoverage['ui/popup.js'][128] = 0; + _$jscoverage['ui/popup.js'][129] = 0; + _$jscoverage['ui/popup.js'][132] = 0; + _$jscoverage['ui/popup.js'][133] = 0; + _$jscoverage['ui/popup.js'][137] = 0; + _$jscoverage['ui/popup.js'][138] = 0; + _$jscoverage['ui/popup.js'][141] = 0; + _$jscoverage['ui/popup.js'][142] = 0; + _$jscoverage['ui/popup.js'][144] = 0; + _$jscoverage['ui/popup.js'][145] = 0; + _$jscoverage['ui/popup.js'][146] = 0; + _$jscoverage['ui/popup.js'][147] = 0; + _$jscoverage['ui/popup.js'][148] = 0; + _$jscoverage['ui/popup.js'][149] = 0; + _$jscoverage['ui/popup.js'][150] = 0; + _$jscoverage['ui/popup.js'][152] = 0; + _$jscoverage['ui/popup.js'][154] = 0; + _$jscoverage['ui/popup.js'][155] = 0; + _$jscoverage['ui/popup.js'][156] = 0; + _$jscoverage['ui/popup.js'][157] = 0; + _$jscoverage['ui/popup.js'][160] = 0; + _$jscoverage['ui/popup.js'][163] = 0; + _$jscoverage['ui/popup.js'][164] = 0; + _$jscoverage['ui/popup.js'][165] = 0; + _$jscoverage['ui/popup.js'][166] = 0; + _$jscoverage['ui/popup.js'][168] = 0; + _$jscoverage['ui/popup.js'][169] = 0; + _$jscoverage['ui/popup.js'][170] = 0; + _$jscoverage['ui/popup.js'][171] = 0; + _$jscoverage['ui/popup.js'][172] = 0; + _$jscoverage['ui/popup.js'][173] = 0; + _$jscoverage['ui/popup.js'][175] = 0; + _$jscoverage['ui/popup.js'][176] = 0; + _$jscoverage['ui/popup.js'][177] = 0; + _$jscoverage['ui/popup.js'][178] = 0; + _$jscoverage['ui/popup.js'][181] = 0; + _$jscoverage['ui/popup.js'][182] = 0; + _$jscoverage['ui/popup.js'][186] = 0; + _$jscoverage['ui/popup.js'][187] = 0; + _$jscoverage['ui/popup.js'][188] = 0; + _$jscoverage['ui/popup.js'][189] = 0; + _$jscoverage['ui/popup.js'][190] = 0; + _$jscoverage['ui/popup.js'][195] = 0; + _$jscoverage['ui/popup.js'][196] = 0; + _$jscoverage['ui/popup.js'][197] = 0; + _$jscoverage['ui/popup.js'][205] = 0; + _$jscoverage['ui/popup.js'][208] = 0; + _$jscoverage['ui/popup.js'][209] = 0; + _$jscoverage['ui/popup.js'][210] = 0; + _$jscoverage['ui/popup.js'][211] = 0; + _$jscoverage['ui/popup.js'][215] = 0; + _$jscoverage['ui/popup.js'][219] = 0; + _$jscoverage['ui/popup.js'][222] = 0; + _$jscoverage['ui/popup.js'][223] = 0; + _$jscoverage['ui/popup.js'][226] = 0; + _$jscoverage['ui/popup.js'][227] = 0; + _$jscoverage['ui/popup.js'][228] = 0; + _$jscoverage['ui/popup.js'][229] = 0; + _$jscoverage['ui/popup.js'][230] = 0; + _$jscoverage['ui/popup.js'][235] = 0; + _$jscoverage['ui/popup.js'][238] = 0; + _$jscoverage['ui/popup.js'][240] = 0; + _$jscoverage['ui/popup.js'][241] = 0; + _$jscoverage['ui/popup.js'][242] = 0; + _$jscoverage['ui/popup.js'][244] = 0; + _$jscoverage['ui/popup.js'][245] = 0; +} +_$jscoverage['ui/popup.js'].source = ["///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/ig.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 '<div id=\"##\" class=\"edui-popup %%\" onmousedown=\"return false;\">' +"," ' <div id=\"##_body\" class=\"edui-popup-body\">' +"," ' <iframe style=\"position:absolute;z-index:-1;left:0;top:0;background-color: transparent;\" frameborder=\"0\" width=\"100%\" height=\"100%\" src=\"javascript:\"></iframe>' +"," ' <div class=\"edui-shadow\"></div>' +"," ' <div id=\"##_content\" class=\"edui-popup-content\">' +"," this.getContentHtmlTpl() +"," ' </div>' +"," ' </div>' +"," '</div>';"," },"," 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 = domUtils.getXY( this.combox.getDom() ).y,"," content = this.getDom('content'),"," me = this;",""," while( _top + _height > winHeight ) {"," _height -= 30;"," content.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';"," } 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._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;"," }",""," },"," 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 );"," } );","","})();"]; +_$jscoverage['ui/popup.js'][3]++; +(function () { + _$jscoverage['ui/popup.js'][4]++; + 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) { + _$jscoverage['ui/popup.js'][9]++; + this.initOptions(options); + _$jscoverage['ui/popup.js'][10]++; + this.initPopup(); +})); + _$jscoverage['ui/popup.js'][13]++; + var allPopups = []; + _$jscoverage['ui/popup.js'][14]++; + function closeAllPopup(evt, el) { + _$jscoverage['ui/popup.js'][15]++; + for (var i = 0; (i < allPopups.length); (i++)) { + _$jscoverage['ui/popup.js'][16]++; + var pop = allPopups[i]; + _$jscoverage['ui/popup.js'][17]++; + if ((! pop.isHidden())) { + _$jscoverage['ui/popup.js'][18]++; + if ((pop.queryAutoHide(el) !== false)) { + _$jscoverage['ui/popup.js'][19]++; + if ((evt && /scroll/gi.test(evt.type) && (pop.className == "edui-wordpastepop"))) { + _$jscoverage['ui/popup.js'][19]++; + return; + } + _$jscoverage['ui/popup.js'][20]++; + pop.hide(); + } + } +} + _$jscoverage['ui/popup.js'][25]++; + if (allPopups.length) { + _$jscoverage['ui/popup.js'][26]++; + pop.editor.fireEvent("afterhidepop"); + } +} + _$jscoverage['ui/popup.js'][29]++; + Popup.postHide = closeAllPopup; + _$jscoverage['ui/popup.js'][31]++; + var ANCHOR_CLASSES = ["edui-anchor-topleft", "edui-anchor-topright", "edui-anchor-bottomleft", "edui-anchor-bottomright"]; + _$jscoverage['ui/popup.js'][33]++; + Popup.prototype = {SHADOW_RADIUS: 5, content: null, _hidden: false, autoRender: true, canSideLeft: true, canSideUp: true, initPopup: (function () { + _$jscoverage['ui/popup.js'][41]++; + this.initUIBase(); + _$jscoverage['ui/popup.js'][42]++; + allPopups.push(this); +}), getHtmlTpl: (function () { + _$jscoverage['ui/popup.js'][45]++; + return ("
    " + "
    " + " " + "
    " + "
    " + this.getContentHtmlTpl() + "
    " + "
    " + "
    "); +}), getContentHtmlTpl: (function () { + _$jscoverage['ui/popup.js'][56]++; + if (this.content) { + _$jscoverage['ui/popup.js'][57]++; + if (((typeof this.content) == "string")) { + _$jscoverage['ui/popup.js'][58]++; + return this.content; + } + _$jscoverage['ui/popup.js'][60]++; + return this.content.renderHtml(); + } + else { + _$jscoverage['ui/popup.js'][62]++; + return ""; + } +}), _UIBase_postRender: UIBase.prototype.postRender, postRender: (function () { + _$jscoverage['ui/popup.js'][70]++; + if ((this.content instanceof UIBase)) { + _$jscoverage['ui/popup.js'][71]++; + this.content.postRender(); + } + _$jscoverage['ui/popup.js'][75]++; + if ((this.captureWheel && (! this.captured))) { + _$jscoverage['ui/popup.js'][77]++; + this.captured = true; + _$jscoverage['ui/popup.js'][79]++; + var winHeight = ((document.documentElement.clientHeight || document.body.clientHeight) - 80), _height = this.getDom().offsetHeight, _top = domUtils.getXY(this.combox.getDom()).y, content = this.getDom("content"), me = this; + _$jscoverage['ui/popup.js'][85]++; + while (((_top + _height) > winHeight)) { + _$jscoverage['ui/popup.js'][86]++; + _height -= 30; + _$jscoverage['ui/popup.js'][87]++; + content.style.height = (_height + "px"); +} + _$jscoverage['ui/popup.js'][91]++; + if (window.XMLHttpRequest) { + _$jscoverage['ui/popup.js'][93]++; + domUtils.on(content, (("onmousewheel" in document.body)? "mousewheel": "DOMMouseScroll"), (function (e) { + _$jscoverage['ui/popup.js'][95]++; + if (e.preventDefault) { + _$jscoverage['ui/popup.js'][96]++; + e.preventDefault(); + } + else { + _$jscoverage['ui/popup.js'][98]++; + e.returnValue = false; + } + _$jscoverage['ui/popup.js'][101]++; + if (e.wheelDelta) { + _$jscoverage['ui/popup.js'][103]++; + content.scrollTop -= ((e.wheelDelta / 120) * 60); + } + else { + _$jscoverage['ui/popup.js'][107]++; + content.scrollTop -= ((e.detail / -3) * 60); + } +})); + } + else { + _$jscoverage['ui/popup.js'][116]++; + domUtils.on(this.getDom(), "mousewheel", (function (e) { + _$jscoverage['ui/popup.js'][118]++; + e.returnValue = false; + _$jscoverage['ui/popup.js'][120]++; + me.getDom("content").scrollTop -= ((e.wheelDelta / 120) * 60); +})); + } + } + _$jscoverage['ui/popup.js'][127]++; + this.fireEvent("postRenderAfter"); + _$jscoverage['ui/popup.js'][128]++; + this.hide(true); + _$jscoverage['ui/popup.js'][129]++; + this._UIBase_postRender(); +}), _doAutoRender: (function () { + _$jscoverage['ui/popup.js'][132]++; + if (((! this.getDom()) && this.autoRender)) { + _$jscoverage['ui/popup.js'][133]++; + this.render(); + } +}), mesureSize: (function () { + _$jscoverage['ui/popup.js'][137]++; + var box = this.getDom("content"); + _$jscoverage['ui/popup.js'][138]++; + return uiUtils.getClientRect(box); +}), fitSize: (function () { + _$jscoverage['ui/popup.js'][141]++; + if ((this.captureWheel && this.sized)) { + _$jscoverage['ui/popup.js'][142]++; + return this.__size; + } + _$jscoverage['ui/popup.js'][144]++; + this.sized = true; + _$jscoverage['ui/popup.js'][145]++; + var popBodyEl = this.getDom("body"); + _$jscoverage['ui/popup.js'][146]++; + popBodyEl.style.width = ""; + _$jscoverage['ui/popup.js'][147]++; + popBodyEl.style.height = ""; + _$jscoverage['ui/popup.js'][148]++; + var size = this.mesureSize(); + _$jscoverage['ui/popup.js'][149]++; + if (this.captureWheel) { + _$jscoverage['ui/popup.js'][150]++; + popBodyEl.style.width = ((- (-20 - size.width)) + "px"); + } + else { + _$jscoverage['ui/popup.js'][152]++; + popBodyEl.style.width = (size.width + "px"); + } + _$jscoverage['ui/popup.js'][154]++; + popBodyEl.style.height = (size.height + "px"); + _$jscoverage['ui/popup.js'][155]++; + this.__size = size; + _$jscoverage['ui/popup.js'][156]++; + (this.captureWheel && (this.getDom("content").style.overflow = "auto")); + _$jscoverage['ui/popup.js'][157]++; + return size; +}), showAnchor: (function (element, hoz) { + _$jscoverage['ui/popup.js'][160]++; + this.showAnchorRect(uiUtils.getClientRect(element), hoz); +}), showAnchorRect: (function (rect, hoz, adj) { + _$jscoverage['ui/popup.js'][163]++; + this._doAutoRender(); + _$jscoverage['ui/popup.js'][164]++; + var vpRect = uiUtils.getViewportRect(); + _$jscoverage['ui/popup.js'][165]++; + this._show(); + _$jscoverage['ui/popup.js'][166]++; + var popSize = this.fitSize(); + _$jscoverage['ui/popup.js'][168]++; + var sideLeft, sideUp, left, top; + _$jscoverage['ui/popup.js'][169]++; + if (hoz) { + _$jscoverage['ui/popup.js'][170]++; + sideLeft = (this.canSideLeft && (((rect.right + popSize.width) > vpRect.right) && (rect.left > popSize.width))); + _$jscoverage['ui/popup.js'][171]++; + sideUp = (this.canSideUp && (((rect.top + popSize.height) > vpRect.bottom) && (rect.bottom > popSize.height))); + _$jscoverage['ui/popup.js'][172]++; + left = (sideLeft? (rect.left - popSize.width): rect.right); + _$jscoverage['ui/popup.js'][173]++; + top = (sideUp? (rect.bottom - popSize.height): rect.top); + } + else { + _$jscoverage['ui/popup.js'][175]++; + sideLeft = (this.canSideLeft && (((rect.right + popSize.width) > vpRect.right) && (rect.left > popSize.width))); + _$jscoverage['ui/popup.js'][176]++; + sideUp = (this.canSideUp && (((rect.top + popSize.height) > vpRect.bottom) && (rect.bottom > popSize.height))); + _$jscoverage['ui/popup.js'][177]++; + left = (sideLeft? (rect.right - popSize.width): rect.left); + _$jscoverage['ui/popup.js'][178]++; + top = (sideUp? (rect.top - popSize.height): rect.bottom); + } + _$jscoverage['ui/popup.js'][181]++; + var popEl = this.getDom(); + _$jscoverage['ui/popup.js'][182]++; + uiUtils.setViewportOffset(popEl, {left: left, top: top}); + _$jscoverage['ui/popup.js'][186]++; + domUtils.removeClasses(popEl, ANCHOR_CLASSES); + _$jscoverage['ui/popup.js'][187]++; + popEl.className += (" " + ANCHOR_CLASSES[(((sideUp? 1: 0) * 2) + (sideLeft? 1: 0))]); + _$jscoverage['ui/popup.js'][188]++; + if (this.editor) { + _$jscoverage['ui/popup.js'][189]++; + popEl.style.zIndex = ((this.editor.container.style.zIndex * 1) + 10); + _$jscoverage['ui/popup.js'][190]++; + baidu.editor.ui.uiUtils.getFixedLayer().style.zIndex = (popEl.style.zIndex - 1); + } +}), showAt: (function (offset) { + _$jscoverage['ui/popup.js'][195]++; + var left = offset.left; + _$jscoverage['ui/popup.js'][196]++; + var top = offset.top; + _$jscoverage['ui/popup.js'][197]++; + var rect = {left: left, top: top, right: left, bottom: top, height: 0, width: 0}; + _$jscoverage['ui/popup.js'][205]++; + this.showAnchorRect(rect, false, true); +}), _show: (function () { + _$jscoverage['ui/popup.js'][208]++; + if (this._hidden) { + _$jscoverage['ui/popup.js'][209]++; + var box = this.getDom(); + _$jscoverage['ui/popup.js'][210]++; + box.style.display = ""; + _$jscoverage['ui/popup.js'][211]++; + this._hidden = false; + _$jscoverage['ui/popup.js'][215]++; + this.fireEvent("show"); + } +}), isHidden: (function () { + _$jscoverage['ui/popup.js'][219]++; + return this._hidden; +}), show: (function () { + _$jscoverage['ui/popup.js'][222]++; + this._doAutoRender(); + _$jscoverage['ui/popup.js'][223]++; + this._show(); +}), hide: (function (notNofity) { + _$jscoverage['ui/popup.js'][226]++; + if (((! this._hidden) && this.getDom())) { + _$jscoverage['ui/popup.js'][227]++; + this.getDom().style.display = "none"; + _$jscoverage['ui/popup.js'][228]++; + this._hidden = true; + _$jscoverage['ui/popup.js'][229]++; + if ((! notNofity)) { + _$jscoverage['ui/popup.js'][230]++; + this.fireEvent("hide"); + } + } +}), queryAutoHide: (function (el) { + _$jscoverage['ui/popup.js'][235]++; + return ((! el) || (! uiUtils.contains(this.getDom(), el))); +})}; + _$jscoverage['ui/popup.js'][238]++; + utils.inherits(Popup, UIBase); + _$jscoverage['ui/popup.js'][240]++; + domUtils.on(document, "mousedown", (function (evt) { + _$jscoverage['ui/popup.js'][241]++; + var el = (evt.target || evt.srcElement); + _$jscoverage['ui/popup.js'][242]++; + closeAllPopup(evt, el); +})); + _$jscoverage['ui/popup.js'][244]++; + domUtils.on(window, "scroll", (function (evt, el) { + _$jscoverage['ui/popup.js'][245]++; + closeAllPopup(evt, el); +})); +})(); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/separator.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/separator.js new file mode 100644 index 000000000..1ea7a8980 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/separator.js @@ -0,0 +1,71 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['ui/separator.js']) { + _$jscoverage['ui/separator.js'] = []; + _$jscoverage['ui/separator.js'][1] = 0; + _$jscoverage['ui/separator.js'][2] = 0; + _$jscoverage['ui/separator.js'][5] = 0; + _$jscoverage['ui/separator.js'][6] = 0; + _$jscoverage['ui/separator.js'][8] = 0; + _$jscoverage['ui/separator.js'][11] = 0; + _$jscoverage['ui/separator.js'][14] = 0; + _$jscoverage['ui/separator.js'][17] = 0; +} +_$jscoverage['ui/separator.js'].source = ["(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 '<div id=\"##\" class=\"edui-box %%\"></div>';"," }"," };"," utils.inherits(Separator, UIBase);","","})();"]; +_$jscoverage['ui/separator.js'][1]++; +(function () { + _$jscoverage['ui/separator.js'][2]++; + var utils = baidu.editor.utils, UIBase = baidu.editor.ui.UIBase, Separator = (baidu.editor.ui.Separator = (function (options) { + _$jscoverage['ui/separator.js'][5]++; + this.initOptions(options); + _$jscoverage['ui/separator.js'][6]++; + this.initSeparator(); +})); + _$jscoverage['ui/separator.js'][8]++; + Separator.prototype = {uiName: "separator", initSeparator: (function () { + _$jscoverage['ui/separator.js'][11]++; + this.initUIBase(); +}), getHtmlTpl: (function () { + _$jscoverage['ui/separator.js'][14]++; + return "
    "; +})}; + _$jscoverage['ui/separator.js'][17]++; + utils.inherits(Separator, UIBase); +})(); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/shortcutmenu.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/shortcutmenu.js new file mode 100644 index 000000000..a15b2d07a --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/shortcutmenu.js @@ -0,0 +1,462 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['ui/shortcutmenu.js']) { + _$jscoverage['ui/shortcutmenu.js'] = []; + _$jscoverage['ui/shortcutmenu.js'][1] = 0; + _$jscoverage['ui/shortcutmenu.js'][2] = 0; + _$jscoverage['ui/shortcutmenu.js'][8] = 0; + _$jscoverage['ui/shortcutmenu.js'][12] = 0; + _$jscoverage['ui/shortcutmenu.js'][13] = 0; + _$jscoverage['ui/shortcutmenu.js'][14] = 0; + _$jscoverage['ui/shortcutmenu.js'][17] = 0; + _$jscoverage['ui/shortcutmenu.js'][19] = 0; + _$jscoverage['ui/shortcutmenu.js'][23] = 0; + _$jscoverage['ui/shortcutmenu.js'][24] = 0; + _$jscoverage['ui/shortcutmenu.js'][25] = 0; + _$jscoverage['ui/shortcutmenu.js'][26] = 0; + _$jscoverage['ui/shortcutmenu.js'][27] = 0; + _$jscoverage['ui/shortcutmenu.js'][30] = 0; + _$jscoverage['ui/shortcutmenu.js'][33] = 0; + _$jscoverage['ui/shortcutmenu.js'][34] = 0; + _$jscoverage['ui/shortcutmenu.js'][36] = 0; + _$jscoverage['ui/shortcutmenu.js'][39] = 0; + _$jscoverage['ui/shortcutmenu.js'][48] = 0; + _$jscoverage['ui/shortcutmenu.js'][49] = 0; + _$jscoverage['ui/shortcutmenu.js'][50] = 0; + _$jscoverage['ui/shortcutmenu.js'][51] = 0; + _$jscoverage['ui/shortcutmenu.js'][52] = 0; + _$jscoverage['ui/shortcutmenu.js'][53] = 0; + _$jscoverage['ui/shortcutmenu.js'][54] = 0; + _$jscoverage['ui/shortcutmenu.js'][55] = 0; + _$jscoverage['ui/shortcutmenu.js'][56] = 0; + _$jscoverage['ui/shortcutmenu.js'][59] = 0; + _$jscoverage['ui/shortcutmenu.js'][60] = 0; + _$jscoverage['ui/shortcutmenu.js'][61] = 0; + _$jscoverage['ui/shortcutmenu.js'][62] = 0; + _$jscoverage['ui/shortcutmenu.js'][63] = 0; + _$jscoverage['ui/shortcutmenu.js'][64] = 0; + _$jscoverage['ui/shortcutmenu.js'][71] = 0; + _$jscoverage['ui/shortcutmenu.js'][72] = 0; + _$jscoverage['ui/shortcutmenu.js'][73] = 0; + _$jscoverage['ui/shortcutmenu.js'][75] = 0; + _$jscoverage['ui/shortcutmenu.js'][76] = 0; + _$jscoverage['ui/shortcutmenu.js'][81] = 0; + _$jscoverage['ui/shortcutmenu.js'][82] = 0; + _$jscoverage['ui/shortcutmenu.js'][83] = 0; + _$jscoverage['ui/shortcutmenu.js'][89] = 0; + _$jscoverage['ui/shortcutmenu.js'][90] = 0; + _$jscoverage['ui/shortcutmenu.js'][91] = 0; + _$jscoverage['ui/shortcutmenu.js'][93] = 0; + _$jscoverage['ui/shortcutmenu.js'][94] = 0; + _$jscoverage['ui/shortcutmenu.js'][95] = 0; + _$jscoverage['ui/shortcutmenu.js'][101] = 0; + _$jscoverage['ui/shortcutmenu.js'][102] = 0; + _$jscoverage['ui/shortcutmenu.js'][104] = 0; + _$jscoverage['ui/shortcutmenu.js'][108] = 0; + _$jscoverage['ui/shortcutmenu.js'][109] = 0; + _$jscoverage['ui/shortcutmenu.js'][110] = 0; + _$jscoverage['ui/shortcutmenu.js'][111] = 0; + _$jscoverage['ui/shortcutmenu.js'][114] = 0; + _$jscoverage['ui/shortcutmenu.js'][115] = 0; + _$jscoverage['ui/shortcutmenu.js'][116] = 0; + _$jscoverage['ui/shortcutmenu.js'][119] = 0; + _$jscoverage['ui/shortcutmenu.js'][122] = 0; + _$jscoverage['ui/shortcutmenu.js'][127] = 0; + _$jscoverage['ui/shortcutmenu.js'][128] = 0; + _$jscoverage['ui/shortcutmenu.js'][129] = 0; + _$jscoverage['ui/shortcutmenu.js'][131] = 0; + _$jscoverage['ui/shortcutmenu.js'][132] = 0; + _$jscoverage['ui/shortcutmenu.js'][134] = 0; + _$jscoverage['ui/shortcutmenu.js'][137] = 0; + _$jscoverage['ui/shortcutmenu.js'][138] = 0; + _$jscoverage['ui/shortcutmenu.js'][139] = 0; + _$jscoverage['ui/shortcutmenu.js'][141] = 0; + _$jscoverage['ui/shortcutmenu.js'][142] = 0; + _$jscoverage['ui/shortcutmenu.js'][143] = 0; + _$jscoverage['ui/shortcutmenu.js'][144] = 0; + _$jscoverage['ui/shortcutmenu.js'][148] = 0; + _$jscoverage['ui/shortcutmenu.js'][149] = 0; + _$jscoverage['ui/shortcutmenu.js'][151] = 0; + _$jscoverage['ui/shortcutmenu.js'][152] = 0; + _$jscoverage['ui/shortcutmenu.js'][153] = 0; + _$jscoverage['ui/shortcutmenu.js'][154] = 0; + _$jscoverage['ui/shortcutmenu.js'][156] = 0; + _$jscoverage['ui/shortcutmenu.js'][157] = 0; + _$jscoverage['ui/shortcutmenu.js'][161] = 0; + _$jscoverage['ui/shortcutmenu.js'][162] = 0; + _$jscoverage['ui/shortcutmenu.js'][163] = 0; + _$jscoverage['ui/shortcutmenu.js'][164] = 0; + _$jscoverage['ui/shortcutmenu.js'][165] = 0; + _$jscoverage['ui/shortcutmenu.js'][169] = 0; + _$jscoverage['ui/shortcutmenu.js'][170] = 0; + _$jscoverage['ui/shortcutmenu.js'][171] = 0; + _$jscoverage['ui/shortcutmenu.js'][173] = 0; + _$jscoverage['ui/shortcutmenu.js'][174] = 0; + _$jscoverage['ui/shortcutmenu.js'][175] = 0; + _$jscoverage['ui/shortcutmenu.js'][179] = 0; + _$jscoverage['ui/shortcutmenu.js'][180] = 0; + _$jscoverage['ui/shortcutmenu.js'][182] = 0; + _$jscoverage['ui/shortcutmenu.js'][185] = 0; + _$jscoverage['ui/shortcutmenu.js'][186] = 0; + _$jscoverage['ui/shortcutmenu.js'][187] = 0; + _$jscoverage['ui/shortcutmenu.js'][192] = 0; + _$jscoverage['ui/shortcutmenu.js'][193] = 0; + _$jscoverage['ui/shortcutmenu.js'][194] = 0; + _$jscoverage['ui/shortcutmenu.js'][195] = 0; + _$jscoverage['ui/shortcutmenu.js'][196] = 0; + _$jscoverage['ui/shortcutmenu.js'][198] = 0; + _$jscoverage['ui/shortcutmenu.js'][200] = 0; + _$jscoverage['ui/shortcutmenu.js'][203] = 0; + _$jscoverage['ui/shortcutmenu.js'][209] = 0; + _$jscoverage['ui/shortcutmenu.js'][211] = 0; + _$jscoverage['ui/shortcutmenu.js'][212] = 0; + _$jscoverage['ui/shortcutmenu.js'][214] = 0; + _$jscoverage['ui/shortcutmenu.js'][217] = 0; + _$jscoverage['ui/shortcutmenu.js'][218] = 0; + _$jscoverage['ui/shortcutmenu.js'][219] = 0; + _$jscoverage['ui/shortcutmenu.js'][224] = 0; + _$jscoverage['ui/shortcutmenu.js'][225] = 0; + _$jscoverage['ui/shortcutmenu.js'][228] = 0; + _$jscoverage['ui/shortcutmenu.js'][229] = 0; +} +_$jscoverage['ui/shortcutmenu.js'].source = ["(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 '<div id=\"##\" class=\"%% edui-toolbar\" data-src=\"shortcutmenu\" onmousedown=\"return false;\" onselectstart=\"return false;\" >' +"," buff +"," '</div>';"," }"," };",""," 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);"," });","","}) ();"]; +_$jscoverage['ui/shortcutmenu.js'][1]++; +(function () { + _$jscoverage['ui/shortcutmenu.js'][2]++; + var UI = baidu.editor.ui, UIBase = UI.UIBase, uiUtils = UI.uiUtils, utils = baidu.editor.utils, domUtils = baidu.editor.dom.domUtils; + _$jscoverage['ui/shortcutmenu.js'][8]++; + var allMenus = [], timeID, isSubMenuShow = false; + _$jscoverage['ui/shortcutmenu.js'][12]++; + var ShortCutMenu = (UI.ShortCutMenu = (function (options) { + _$jscoverage['ui/shortcutmenu.js'][13]++; + this.initOptions(options); + _$jscoverage['ui/shortcutmenu.js'][14]++; + this.initShortCutMenu(); +})); + _$jscoverage['ui/shortcutmenu.js'][17]++; + ShortCutMenu.postHide = hideAllMenu; + _$jscoverage['ui/shortcutmenu.js'][19]++; + ShortCutMenu.prototype = {isHidden: true, SPACE: 5, initShortCutMenu: (function () { + _$jscoverage['ui/shortcutmenu.js'][23]++; + this.items = (this.items || []); + _$jscoverage['ui/shortcutmenu.js'][24]++; + this.initUIBase(); + _$jscoverage['ui/shortcutmenu.js'][25]++; + this.initItems(); + _$jscoverage['ui/shortcutmenu.js'][26]++; + this.initEvent(); + _$jscoverage['ui/shortcutmenu.js'][27]++; + allMenus.push(this); +}), initEvent: (function () { + _$jscoverage['ui/shortcutmenu.js'][30]++; + var me = this, doc = me.editor.document; + _$jscoverage['ui/shortcutmenu.js'][33]++; + domUtils.on(doc, "mousemove", (function (e) { + _$jscoverage['ui/shortcutmenu.js'][34]++; + if ((me.isHidden === false)) { + _$jscoverage['ui/shortcutmenu.js'][36]++; + if ((me.getSubMenuMark() || (me.eventType == "contextmenu"))) { + _$jscoverage['ui/shortcutmenu.js'][36]++; + return; + } + _$jscoverage['ui/shortcutmenu.js'][39]++; + var flag = true, el = me.getDom(), wt = el.offsetWidth, ht = el.offsetHeight, distanceX = ((wt / 2) + me.SPACE), distanceY = (ht / 2), x = Math.abs((e.screenX - me.left)), y = Math.abs((e.screenY - me.top)); + _$jscoverage['ui/shortcutmenu.js'][48]++; + clearTimeout(timeID); + _$jscoverage['ui/shortcutmenu.js'][49]++; + timeID = setTimeout((function () { + _$jscoverage['ui/shortcutmenu.js'][50]++; + if (((y > 0) && (y < distanceY))) { + _$jscoverage['ui/shortcutmenu.js'][51]++; + me.setOpacity(el, "1"); + } + else { + _$jscoverage['ui/shortcutmenu.js'][52]++; + if (((y > distanceY) && (y < (distanceY + 70)))) { + _$jscoverage['ui/shortcutmenu.js'][53]++; + me.setOpacity(el, "0.5"); + _$jscoverage['ui/shortcutmenu.js'][54]++; + flag = false; + } + else { + _$jscoverage['ui/shortcutmenu.js'][55]++; + if (((y > (distanceY + 70)) && (y < (distanceY + 140)))) { + _$jscoverage['ui/shortcutmenu.js'][56]++; + me.hide(); + } + } + } + _$jscoverage['ui/shortcutmenu.js'][59]++; + if ((flag && (x > 0) && (x < distanceX))) { + _$jscoverage['ui/shortcutmenu.js'][60]++; + me.setOpacity(el, "1"); + } + else { + _$jscoverage['ui/shortcutmenu.js'][61]++; + if (((x > distanceX) && (x < (distanceX + 70)))) { + _$jscoverage['ui/shortcutmenu.js'][62]++; + me.setOpacity(el, "0.5"); + } + else { + _$jscoverage['ui/shortcutmenu.js'][63]++; + if (((x > (distanceX + 70)) && (x < (distanceX + 140)))) { + _$jscoverage['ui/shortcutmenu.js'][64]++; + me.hide(); + } + } + } +})); + } +})); + _$jscoverage['ui/shortcutmenu.js'][71]++; + if (browser.chrome) { + _$jscoverage['ui/shortcutmenu.js'][72]++; + domUtils.on(doc, "mouseout", (function (e) { + _$jscoverage['ui/shortcutmenu.js'][73]++; + var relatedTgt = (e.relatedTarget || e.toElement); + _$jscoverage['ui/shortcutmenu.js'][75]++; + if (((relatedTgt == null) || (relatedTgt.tagName == "HTML"))) { + _$jscoverage['ui/shortcutmenu.js'][76]++; + me.hide(); + } +})); + } + _$jscoverage['ui/shortcutmenu.js'][81]++; + me.editor.addListener("afterhidepop", (function () { + _$jscoverage['ui/shortcutmenu.js'][82]++; + if ((! me.isHidden)) { + _$jscoverage['ui/shortcutmenu.js'][83]++; + isSubMenuShow = true; + } +})); +}), initItems: (function () { + _$jscoverage['ui/shortcutmenu.js'][89]++; + if (utils.isArray(this.items)) { + _$jscoverage['ui/shortcutmenu.js'][90]++; + for (var i = 0, len = this.items.length; (i < len); (i++)) { + _$jscoverage['ui/shortcutmenu.js'][91]++; + var item = this.items[i].toLowerCase(); + _$jscoverage['ui/shortcutmenu.js'][93]++; + if (UI[item]) { + _$jscoverage['ui/shortcutmenu.js'][94]++; + this.items[i] = new (UI[item])(this.editor); + _$jscoverage['ui/shortcutmenu.js'][95]++; + this.items[i].className += " edui-shortcutsubmenu "; + } +} + } +}), setOpacity: (function (el, value) { + _$jscoverage['ui/shortcutmenu.js'][101]++; + if ((browser.ie && (browser.version < 9))) { + _$jscoverage['ui/shortcutmenu.js'][102]++; + el.style.filter = ("alpha(opacity = " + (parseFloat(value) * 100) + ");"); + } + else { + _$jscoverage['ui/shortcutmenu.js'][104]++; + el.style.opacity = value; + } +}), getSubMenuMark: (function () { + _$jscoverage['ui/shortcutmenu.js'][108]++; + isSubMenuShow = false; + _$jscoverage['ui/shortcutmenu.js'][109]++; + var layerEle = uiUtils.getFixedLayer(); + _$jscoverage['ui/shortcutmenu.js'][110]++; + var list = domUtils.getElementsByTagName(layerEle, "div", (function (node) { + _$jscoverage['ui/shortcutmenu.js'][111]++; + return domUtils.hasClass(node, "edui-shortcutsubmenu edui-popup"); +})); + _$jscoverage['ui/shortcutmenu.js'][114]++; + for (var i = 0, node; (node = list[(i++)]);) { + _$jscoverage['ui/shortcutmenu.js'][115]++; + if ((node.style.display != "none")) { + _$jscoverage['ui/shortcutmenu.js'][116]++; + isSubMenuShow = true; + } +} + _$jscoverage['ui/shortcutmenu.js'][119]++; + return isSubMenuShow; +}), show: (function (e, hasContextmenu) { + _$jscoverage['ui/shortcutmenu.js'][122]++; + var me = this, offset = {}, el = this.getDom(), fixedlayer = uiUtils.getFixedLayer(); + _$jscoverage['ui/shortcutmenu.js'][127]++; + function setPos(offset) { + _$jscoverage['ui/shortcutmenu.js'][128]++; + if ((offset.left < 0)) { + _$jscoverage['ui/shortcutmenu.js'][129]++; + offset.left = 0; + } + _$jscoverage['ui/shortcutmenu.js'][131]++; + if ((offset.top < 0)) { + _$jscoverage['ui/shortcutmenu.js'][132]++; + offset.top = 0; + } + _$jscoverage['ui/shortcutmenu.js'][134]++; + el.style.cssText = ("position:absolute;left:" + offset.left + "px;top:" + offset.top + "px;"); +} + _$jscoverage['ui/shortcutmenu.js'][137]++; + function setPosByCxtMenu(menu) { + _$jscoverage['ui/shortcutmenu.js'][138]++; + if ((! menu.tagName)) { + _$jscoverage['ui/shortcutmenu.js'][139]++; + menu = menu.getDom(); + } + _$jscoverage['ui/shortcutmenu.js'][141]++; + offset.left = parseInt(menu.style.left); + _$jscoverage['ui/shortcutmenu.js'][142]++; + offset.top = parseInt(menu.style.top); + _$jscoverage['ui/shortcutmenu.js'][143]++; + offset.top -= (el.offsetHeight + 15); + _$jscoverage['ui/shortcutmenu.js'][144]++; + setPos(offset); +} + _$jscoverage['ui/shortcutmenu.js'][148]++; + me.eventType = e.type; + _$jscoverage['ui/shortcutmenu.js'][149]++; + el.style.cssText = "display:block;left:-9999px"; + _$jscoverage['ui/shortcutmenu.js'][151]++; + if (((e.type == "contextmenu") && hasContextmenu)) { + _$jscoverage['ui/shortcutmenu.js'][152]++; + var menu = domUtils.getElementsByTagName(fixedlayer, "div", "edui-contextmenu")[0]; + _$jscoverage['ui/shortcutmenu.js'][153]++; + if (menu) { + _$jscoverage['ui/shortcutmenu.js'][154]++; + setPosByCxtMenu(menu); + } + else { + _$jscoverage['ui/shortcutmenu.js'][156]++; + me.editor.addListener("aftershowcontextmenu", (function (type, menu) { + _$jscoverage['ui/shortcutmenu.js'][157]++; + setPosByCxtMenu(menu); +})); + } + } + else { + _$jscoverage['ui/shortcutmenu.js'][161]++; + offset = uiUtils.getViewportOffsetByEvent(e); + _$jscoverage['ui/shortcutmenu.js'][162]++; + offset.top -= (el.offsetHeight + me.SPACE); + _$jscoverage['ui/shortcutmenu.js'][163]++; + offset.left += (me.SPACE + 20); + _$jscoverage['ui/shortcutmenu.js'][164]++; + setPos(offset); + _$jscoverage['ui/shortcutmenu.js'][165]++; + me.setOpacity(el, 0.20000000000000001); + } + _$jscoverage['ui/shortcutmenu.js'][169]++; + me.isHidden = false; + _$jscoverage['ui/shortcutmenu.js'][170]++; + me.left = ((e.screenX + (el.offsetWidth / 2)) - me.SPACE); + _$jscoverage['ui/shortcutmenu.js'][171]++; + me.top = (e.screenY - (el.offsetHeight / 2) - me.SPACE); + _$jscoverage['ui/shortcutmenu.js'][173]++; + if (me.editor) { + _$jscoverage['ui/shortcutmenu.js'][174]++; + el.style.zIndex = ((me.editor.container.style.zIndex * 1) + 10); + _$jscoverage['ui/shortcutmenu.js'][175]++; + fixedlayer.style.zIndex = (el.style.zIndex - 1); + } +}), hide: (function () { + _$jscoverage['ui/shortcutmenu.js'][179]++; + if (this.getDom()) { + _$jscoverage['ui/shortcutmenu.js'][180]++; + this.getDom().style.display = "none"; + } + _$jscoverage['ui/shortcutmenu.js'][182]++; + this.isHidden = true; +}), postRender: (function () { + _$jscoverage['ui/shortcutmenu.js'][185]++; + if (utils.isArray(this.items)) { + _$jscoverage['ui/shortcutmenu.js'][186]++; + for (var i = 0, item; (item = this.items[(i++)]);) { + _$jscoverage['ui/shortcutmenu.js'][187]++; + item.postRender(); +} + } +}), getHtmlTpl: (function () { + _$jscoverage['ui/shortcutmenu.js'][192]++; + var buff; + _$jscoverage['ui/shortcutmenu.js'][193]++; + if (utils.isArray(this.items)) { + _$jscoverage['ui/shortcutmenu.js'][194]++; + buff = []; + _$jscoverage['ui/shortcutmenu.js'][195]++; + for (var i = 0; (i < this.items.length); (i++)) { + _$jscoverage['ui/shortcutmenu.js'][196]++; + buff[i] = this.items[i].renderHtml(); +} + _$jscoverage['ui/shortcutmenu.js'][198]++; + buff = buff.join(""); + } + else { + _$jscoverage['ui/shortcutmenu.js'][200]++; + buff = this.items; + } + _$jscoverage['ui/shortcutmenu.js'][203]++; + return ("
    " + buff + "
    "); +})}; + _$jscoverage['ui/shortcutmenu.js'][209]++; + utils.inherits(ShortCutMenu, UIBase); + _$jscoverage['ui/shortcutmenu.js'][211]++; + function hideAllMenu(e) { + _$jscoverage['ui/shortcutmenu.js'][212]++; + var tgt = (e.target || e.srcElement), cur = domUtils.findParent(tgt, (function (node) { + _$jscoverage['ui/shortcutmenu.js'][214]++; + return (domUtils.hasClass(node, "edui-shortcutmenu") || domUtils.hasClass(node, "edui-popup")); +}), true); + _$jscoverage['ui/shortcutmenu.js'][217]++; + if ((! cur)) { + _$jscoverage['ui/shortcutmenu.js'][218]++; + for (var i = 0, menu; (menu = allMenus[(i++)]);) { + _$jscoverage['ui/shortcutmenu.js'][219]++; + menu.hide(); +} + } +} + _$jscoverage['ui/shortcutmenu.js'][224]++; + domUtils.on(document, "mousedown", (function (e) { + _$jscoverage['ui/shortcutmenu.js'][225]++; + hideAllMenu(e); +})); + _$jscoverage['ui/shortcutmenu.js'][228]++; + domUtils.on(window, "scroll", (function (e) { + _$jscoverage['ui/shortcutmenu.js'][229]++; + hideAllMenu(e); +})); +})(); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/splitbutton.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/splitbutton.js new file mode 100644 index 000000000..9d7b95a5d --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/splitbutton.js @@ -0,0 +1,170 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['ui/splitbutton.js']) { + _$jscoverage['ui/splitbutton.js'] = []; + _$jscoverage['ui/splitbutton.js'][4] = 0; + _$jscoverage['ui/splitbutton.js'][5] = 0; + _$jscoverage['ui/splitbutton.js'][11] = 0; + _$jscoverage['ui/splitbutton.js'][12] = 0; + _$jscoverage['ui/splitbutton.js'][14] = 0; + _$jscoverage['ui/splitbutton.js'][19] = 0; + _$jscoverage['ui/splitbutton.js'][20] = 0; + _$jscoverage['ui/splitbutton.js'][21] = 0; + _$jscoverage['ui/splitbutton.js'][22] = 0; + _$jscoverage['ui/splitbutton.js'][23] = 0; + _$jscoverage['ui/splitbutton.js'][24] = 0; + _$jscoverage['ui/splitbutton.js'][25] = 0; + _$jscoverage['ui/splitbutton.js'][30] = 0; + _$jscoverage['ui/splitbutton.js'][31] = 0; + _$jscoverage['ui/splitbutton.js'][34] = 0; + _$jscoverage['ui/splitbutton.js'][35] = 0; + _$jscoverage['ui/splitbutton.js'][36] = 0; + _$jscoverage['ui/splitbutton.js'][38] = 0; + _$jscoverage['ui/splitbutton.js'][39] = 0; + _$jscoverage['ui/splitbutton.js'][40] = 0; + _$jscoverage['ui/splitbutton.js'][41] = 0; + _$jscoverage['ui/splitbutton.js'][46] = 0; + _$jscoverage['ui/splitbutton.js'][48] = 0; + _$jscoverage['ui/splitbutton.js'][51] = 0; + _$jscoverage['ui/splitbutton.js'][54] = 0; + _$jscoverage['ui/splitbutton.js'][57] = 0; + _$jscoverage['ui/splitbutton.js'][68] = 0; + _$jscoverage['ui/splitbutton.js'][69] = 0; + _$jscoverage['ui/splitbutton.js'][70] = 0; + _$jscoverage['ui/splitbutton.js'][71] = 0; + _$jscoverage['ui/splitbutton.js'][74] = 0; + _$jscoverage['ui/splitbutton.js'][75] = 0; + _$jscoverage['ui/splitbutton.js'][79] = 0; + _$jscoverage['ui/splitbutton.js'][80] = 0; + _$jscoverage['ui/splitbutton.js'][84] = 0; + _$jscoverage['ui/splitbutton.js'][85] = 0; +} +_$jscoverage['ui/splitbutton.js'].source = ["///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('<div id=\"' +"," this.popup.id + '_bordereraser\" class=\"edui-bordereraser edui-background\" style=\"width:' +"," (uiUtils.getClientRect(this.getDom()).width + 20) + 'px\"></div>')"," );"," popup.getDom().className += ' ' + this.className;"," }, this));"," this.popup = popup;"," },"," _onPopupShow: function (){"," this.addState('opened');"," },"," _onPopupHide: function (){"," this.removeState('opened');"," },"," getHtmlTpl: function (){"," return '<div id=\"##\" class=\"edui-box %%\">' +"," '<div '+ (this.title ? 'title=\"' + this.title + '\"' : '') +' id=\"##_state\" stateful><div class=\"%%-body\">' +"," '<div id=\"##_button_body\" class=\"edui-box edui-button-body\" onclick=\"$$._onButtonClick(event, this);\">' +"," '<div class=\"edui-box edui-icon\"></div>' +"," '</div>' +"," '<div class=\"edui-box edui-splitborder\"></div>' +"," '<div class=\"edui-box edui-arrow\" onclick=\"$$._onArrowClick();\"></div>' +"," '</div></div></div>';"," },"," 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);","","})();"]; +_$jscoverage['ui/splitbutton.js'][4]++; +(function () { + _$jscoverage['ui/splitbutton.js'][5]++; + 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) { + _$jscoverage['ui/splitbutton.js'][11]++; + this.initOptions(options); + _$jscoverage['ui/splitbutton.js'][12]++; + this.initSplitButton(); +})); + _$jscoverage['ui/splitbutton.js'][14]++; + SplitButton.prototype = {popup: null, uiName: "splitbutton", title: "", initSplitButton: (function () { + _$jscoverage['ui/splitbutton.js'][19]++; + this.initUIBase(); + _$jscoverage['ui/splitbutton.js'][20]++; + this.Stateful_init(); + _$jscoverage['ui/splitbutton.js'][21]++; + var me = this; + _$jscoverage['ui/splitbutton.js'][22]++; + if ((this.popup != null)) { + _$jscoverage['ui/splitbutton.js'][23]++; + var popup = this.popup; + _$jscoverage['ui/splitbutton.js'][24]++; + this.popup = null; + _$jscoverage['ui/splitbutton.js'][25]++; + this.setPopup(popup); + } +}), _UIBase_postRender: UIBase.prototype.postRender, postRender: (function () { + _$jscoverage['ui/splitbutton.js'][30]++; + this.Stateful_postRender(); + _$jscoverage['ui/splitbutton.js'][31]++; + this._UIBase_postRender(); +}), setPopup: (function (popup) { + _$jscoverage['ui/splitbutton.js'][34]++; + if ((this.popup === popup)) { + _$jscoverage['ui/splitbutton.js'][34]++; + return; + } + _$jscoverage['ui/splitbutton.js'][35]++; + if ((this.popup != null)) { + _$jscoverage['ui/splitbutton.js'][36]++; + this.popup.dispose(); + } + _$jscoverage['ui/splitbutton.js'][38]++; + popup.addListener("show", utils.bind(this._onPopupShow, this)); + _$jscoverage['ui/splitbutton.js'][39]++; + popup.addListener("hide", utils.bind(this._onPopupHide, this)); + _$jscoverage['ui/splitbutton.js'][40]++; + popup.addListener("postrender", utils.bind((function () { + _$jscoverage['ui/splitbutton.js'][41]++; + popup.getDom("body").appendChild(uiUtils.createElementByHtml(("
    "))); + _$jscoverage['ui/splitbutton.js'][46]++; + popup.getDom().className += (" " + this.className); +}), this)); + _$jscoverage['ui/splitbutton.js'][48]++; + this.popup = popup; +}), _onPopupShow: (function () { + _$jscoverage['ui/splitbutton.js'][51]++; + this.addState("opened"); +}), _onPopupHide: (function () { + _$jscoverage['ui/splitbutton.js'][54]++; + this.removeState("opened"); +}), getHtmlTpl: (function () { + _$jscoverage['ui/splitbutton.js'][57]++; + return ("
    " + "
    " + "
    " + "
    " + "
    " + "
    " + "
    " + "
    "); +}), showPopup: (function () { + _$jscoverage['ui/splitbutton.js'][68]++; + var rect = uiUtils.getClientRect(this.getDom()); + _$jscoverage['ui/splitbutton.js'][69]++; + rect.top -= this.popup.SHADOW_RADIUS; + _$jscoverage['ui/splitbutton.js'][70]++; + rect.height += this.popup.SHADOW_RADIUS; + _$jscoverage['ui/splitbutton.js'][71]++; + this.popup.showAnchorRect(rect); +}), _onArrowClick: (function (event, el) { + _$jscoverage['ui/splitbutton.js'][74]++; + if ((! this.isDisabled())) { + _$jscoverage['ui/splitbutton.js'][75]++; + this.showPopup(); + } +}), _onButtonClick: (function () { + _$jscoverage['ui/splitbutton.js'][79]++; + if ((! this.isDisabled())) { + _$jscoverage['ui/splitbutton.js'][80]++; + this.fireEvent("buttonclick"); + } +})}; + _$jscoverage['ui/splitbutton.js'][84]++; + utils.inherits(SplitButton, UIBase); + _$jscoverage['ui/splitbutton.js'][85]++; + utils.extend(SplitButton.prototype, Stateful, true); +})(); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/stateful.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/stateful.js new file mode 100644 index 000000000..61621e327 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/stateful.js @@ -0,0 +1,214 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['ui/stateful.js']) { + _$jscoverage['ui/stateful.js'] = []; + _$jscoverage['ui/stateful.js'][1] = 0; + _$jscoverage['ui/stateful.js'][2] = 0; + _$jscoverage['ui/stateful.js'][6] = 0; + _$jscoverage['ui/stateful.js'][15] = 0; + _$jscoverage['ui/stateful.js'][19] = 0; + _$jscoverage['ui/stateful.js'][20] = 0; + _$jscoverage['ui/stateful.js'][23] = 0; + _$jscoverage['ui/stateful.js'][25] = 0; + _$jscoverage['ui/stateful.js'][28] = 0; + _$jscoverage['ui/stateful.js'][29] = 0; + _$jscoverage['ui/stateful.js'][30] = 0; + _$jscoverage['ui/stateful.js'][31] = 0; + _$jscoverage['ui/stateful.js'][35] = 0; + _$jscoverage['ui/stateful.js'][36] = 0; + _$jscoverage['ui/stateful.js'][37] = 0; + _$jscoverage['ui/stateful.js'][38] = 0; + _$jscoverage['ui/stateful.js'][42] = 0; + _$jscoverage['ui/stateful.js'][43] = 0; + _$jscoverage['ui/stateful.js'][44] = 0; + _$jscoverage['ui/stateful.js'][48] = 0; + _$jscoverage['ui/stateful.js'][49] = 0; + _$jscoverage['ui/stateful.js'][50] = 0; + _$jscoverage['ui/stateful.js'][54] = 0; + _$jscoverage['ui/stateful.js'][55] = 0; + _$jscoverage['ui/stateful.js'][59] = 0; + _$jscoverage['ui/stateful.js'][60] = 0; + _$jscoverage['ui/stateful.js'][64] = 0; + _$jscoverage['ui/stateful.js'][65] = 0; + _$jscoverage['ui/stateful.js'][69] = 0; + _$jscoverage['ui/stateful.js'][72] = 0; + _$jscoverage['ui/stateful.js'][73] = 0; + _$jscoverage['ui/stateful.js'][77] = 0; + _$jscoverage['ui/stateful.js'][78] = 0; + _$jscoverage['ui/stateful.js'][82] = 0; + _$jscoverage['ui/stateful.js'][85] = 0; + _$jscoverage['ui/stateful.js'][88] = 0; + _$jscoverage['ui/stateful.js'][89] = 0; + _$jscoverage['ui/stateful.js'][91] = 0; + _$jscoverage['ui/stateful.js'][95] = 0; + _$jscoverage['ui/stateful.js'][98] = 0; + _$jscoverage['ui/stateful.js'][99] = 0; + _$jscoverage['ui/stateful.js'][100] = 0; + _$jscoverage['ui/stateful.js'][101] = 0; + _$jscoverage['ui/stateful.js'][102] = 0; + _$jscoverage['ui/stateful.js'][104] = 0; +} +_$jscoverage['ui/stateful.js'].source = ["(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');"," }"," }"," };","})();"]; +_$jscoverage['ui/stateful.js'][1]++; +(function () { + _$jscoverage['ui/stateful.js'][2]++; + var browser = baidu.editor.browser, domUtils = baidu.editor.dom.domUtils, uiUtils = baidu.editor.ui.uiUtils; + _$jscoverage['ui/stateful.js'][6]++; + 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);\"")); + _$jscoverage['ui/stateful.js'][15]++; + baidu.editor.ui.Stateful = {alwalysHoverable: false, target: null, Stateful_init: (function () { + _$jscoverage['ui/stateful.js'][19]++; + this._Stateful_dGetHtmlTpl = this.getHtmlTpl; + _$jscoverage['ui/stateful.js'][20]++; + this.getHtmlTpl = this.Stateful_getHtmlTpl; +}), Stateful_getHtmlTpl: (function () { + _$jscoverage['ui/stateful.js'][23]++; + var tpl = this._Stateful_dGetHtmlTpl(); + _$jscoverage['ui/stateful.js'][25]++; + return tpl.replace(/stateful/g, (function () { + _$jscoverage['ui/stateful.js'][25]++; + return TPL_STATEFUL; +})); +}), Stateful_onMouseEnter: (function (evt, el) { + _$jscoverage['ui/stateful.js'][28]++; + this.target = el; + _$jscoverage['ui/stateful.js'][29]++; + if (((! this.isDisabled()) || this.alwalysHoverable)) { + _$jscoverage['ui/stateful.js'][30]++; + this.addState("hover"); + _$jscoverage['ui/stateful.js'][31]++; + this.fireEvent("over"); + } +}), Stateful_onMouseLeave: (function (evt, el) { + _$jscoverage['ui/stateful.js'][35]++; + if (((! this.isDisabled()) || this.alwalysHoverable)) { + _$jscoverage['ui/stateful.js'][36]++; + this.removeState("hover"); + _$jscoverage['ui/stateful.js'][37]++; + this.removeState("active"); + _$jscoverage['ui/stateful.js'][38]++; + this.fireEvent("out"); + } +}), Stateful_onMouseOver: (function (evt, el) { + _$jscoverage['ui/stateful.js'][42]++; + var rel = evt.relatedTarget; + _$jscoverage['ui/stateful.js'][43]++; + if (((! uiUtils.contains(el, rel)) && (el !== rel))) { + _$jscoverage['ui/stateful.js'][44]++; + this.Stateful_onMouseEnter(evt, el); + } +}), Stateful_onMouseOut: (function (evt, el) { + _$jscoverage['ui/stateful.js'][48]++; + var rel = evt.relatedTarget; + _$jscoverage['ui/stateful.js'][49]++; + if (((! uiUtils.contains(el, rel)) && (el !== rel))) { + _$jscoverage['ui/stateful.js'][50]++; + this.Stateful_onMouseLeave(evt, el); + } +}), Stateful_onMouseDown: (function (evt, el) { + _$jscoverage['ui/stateful.js'][54]++; + if ((! this.isDisabled())) { + _$jscoverage['ui/stateful.js'][55]++; + this.addState("active"); + } +}), Stateful_onMouseUp: (function (evt, el) { + _$jscoverage['ui/stateful.js'][59]++; + if ((! this.isDisabled())) { + _$jscoverage['ui/stateful.js'][60]++; + this.removeState("active"); + } +}), Stateful_postRender: (function () { + _$jscoverage['ui/stateful.js'][64]++; + if ((this.disabled && (! this.hasState("disabled")))) { + _$jscoverage['ui/stateful.js'][65]++; + this.addState("disabled"); + } +}), hasState: (function (state) { + _$jscoverage['ui/stateful.js'][69]++; + return domUtils.hasClass(this.getStateDom(), ("edui-state-" + state)); +}), addState: (function (state) { + _$jscoverage['ui/stateful.js'][72]++; + if ((! this.hasState(state))) { + _$jscoverage['ui/stateful.js'][73]++; + this.getStateDom().className += (" edui-state-" + state); + } +}), removeState: (function (state) { + _$jscoverage['ui/stateful.js'][77]++; + if (this.hasState(state)) { + _$jscoverage['ui/stateful.js'][78]++; + domUtils.removeClasses(this.getStateDom(), [("edui-state-" + state)]); + } +}), getStateDom: (function () { + _$jscoverage['ui/stateful.js'][82]++; + return this.getDom("state"); +}), isChecked: (function () { + _$jscoverage['ui/stateful.js'][85]++; + return this.hasState("checked"); +}), setChecked: (function (checked) { + _$jscoverage['ui/stateful.js'][88]++; + if (((! this.isDisabled()) && checked)) { + _$jscoverage['ui/stateful.js'][89]++; + this.addState("checked"); + } + else { + _$jscoverage['ui/stateful.js'][91]++; + this.removeState("checked"); + } +}), isDisabled: (function () { + _$jscoverage['ui/stateful.js'][95]++; + return this.hasState("disabled"); +}), setDisabled: (function (disabled) { + _$jscoverage['ui/stateful.js'][98]++; + if (disabled) { + _$jscoverage['ui/stateful.js'][99]++; + this.removeState("hover"); + _$jscoverage['ui/stateful.js'][100]++; + this.removeState("checked"); + _$jscoverage['ui/stateful.js'][101]++; + this.removeState("active"); + _$jscoverage['ui/stateful.js'][102]++; + this.addState("disabled"); + } + else { + _$jscoverage['ui/stateful.js'][104]++; + this.removeState("disabled"); + } +})}; +})(); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/tablebutton.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/tablebutton.js new file mode 100644 index 000000000..1460e41de --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/tablebutton.js @@ -0,0 +1,85 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['ui/tablebutton.js']) { + _$jscoverage['ui/tablebutton.js'] = []; + _$jscoverage['ui/tablebutton.js'][6] = 0; + _$jscoverage['ui/tablebutton.js'][7] = 0; + _$jscoverage['ui/tablebutton.js'][12] = 0; + _$jscoverage['ui/tablebutton.js'][13] = 0; + _$jscoverage['ui/tablebutton.js'][15] = 0; + _$jscoverage['ui/tablebutton.js'][17] = 0; + _$jscoverage['ui/tablebutton.js'][18] = 0; + _$jscoverage['ui/tablebutton.js'][22] = 0; + _$jscoverage['ui/tablebutton.js'][27] = 0; + _$jscoverage['ui/tablebutton.js'][30] = 0; + _$jscoverage['ui/tablebutton.js'][31] = 0; + _$jscoverage['ui/tablebutton.js'][35] = 0; +} +_$jscoverage['ui/tablebutton.js'].source = ["///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);","","})();"]; +_$jscoverage['ui/tablebutton.js'][6]++; +(function () { + _$jscoverage['ui/tablebutton.js'][7]++; + 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) { + _$jscoverage['ui/tablebutton.js'][12]++; + this.initOptions(options); + _$jscoverage['ui/tablebutton.js'][13]++; + this.initTableButton(); +})); + _$jscoverage['ui/tablebutton.js'][15]++; + TableButton.prototype = {initTableButton: (function () { + _$jscoverage['ui/tablebutton.js'][17]++; + var me = this; + _$jscoverage['ui/tablebutton.js'][18]++; + this.popup = new Popup({content: new TablePicker({editor: me.editor, onpicktable: (function (t, numCols, numRows) { + _$jscoverage['ui/tablebutton.js'][22]++; + me._onPickTable(numCols, numRows); +})}), "editor": me.editor}); + _$jscoverage['ui/tablebutton.js'][27]++; + this.initSplitButton(); +}), _onPickTable: (function (numCols, numRows) { + _$jscoverage['ui/tablebutton.js'][30]++; + if ((this.fireEvent("picktable", numCols, numRows) !== false)) { + _$jscoverage['ui/tablebutton.js'][31]++; + this.popup.hide(); + } +})}; + _$jscoverage['ui/tablebutton.js'][35]++; + utils.inherits(TableButton, SplitButton); +})(); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/tablepicker.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/tablepicker.js new file mode 100644 index 000000000..255faa362 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/tablepicker.js @@ -0,0 +1,160 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['ui/tablepicker.js']) { + _$jscoverage['ui/tablepicker.js'] = []; + _$jscoverage['ui/tablepicker.js'][3] = 0; + _$jscoverage['ui/tablepicker.js'][4] = 0; + _$jscoverage['ui/tablepicker.js'][8] = 0; + _$jscoverage['ui/tablepicker.js'][9] = 0; + _$jscoverage['ui/tablepicker.js'][10] = 0; + _$jscoverage['ui/tablepicker.js'][12] = 0; + _$jscoverage['ui/tablepicker.js'][21] = 0; + _$jscoverage['ui/tablepicker.js'][24] = 0; + _$jscoverage['ui/tablepicker.js'][25] = 0; + _$jscoverage['ui/tablepicker.js'][43] = 0; + _$jscoverage['ui/tablepicker.js'][44] = 0; + _$jscoverage['ui/tablepicker.js'][47] = 0; + _$jscoverage['ui/tablepicker.js'][48] = 0; + _$jscoverage['ui/tablepicker.js'][49] = 0; + _$jscoverage['ui/tablepicker.js'][50] = 0; + _$jscoverage['ui/tablepicker.js'][51] = 0; + _$jscoverage['ui/tablepicker.js'][52] = 0; + _$jscoverage['ui/tablepicker.js'][53] = 0; + _$jscoverage['ui/tablepicker.js'][54] = 0; + _$jscoverage['ui/tablepicker.js'][57] = 0; + _$jscoverage['ui/tablepicker.js'][58] = 0; + _$jscoverage['ui/tablepicker.js'][59] = 0; + _$jscoverage['ui/tablepicker.js'][60] = 0; + _$jscoverage['ui/tablepicker.js'][64] = 0; + _$jscoverage['ui/tablepicker.js'][65] = 0; + _$jscoverage['ui/tablepicker.js'][66] = 0; + _$jscoverage['ui/tablepicker.js'][67] = 0; + _$jscoverage['ui/tablepicker.js'][71] = 0; + _$jscoverage['ui/tablepicker.js'][72] = 0; + _$jscoverage['ui/tablepicker.js'][73] = 0; + _$jscoverage['ui/tablepicker.js'][74] = 0; + _$jscoverage['ui/tablepicker.js'][75] = 0; + _$jscoverage['ui/tablepicker.js'][76] = 0; + _$jscoverage['ui/tablepicker.js'][79] = 0; + _$jscoverage['ui/tablepicker.js'][82] = 0; +} +_$jscoverage['ui/tablepicker.js'].source = ["///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 '<div id=\"##\" class=\"edui-tablepicker %%\">' +"," '<div class=\"edui-tablepicker-body\">' +"," '<div class=\"edui-infoarea\">' +"," '<span id=\"##_label\" class=\"edui-label\"></span>' +"," '</div>' +"," '<div class=\"edui-pickarea\"' +"," ' onmousemove=\"$$._onMouseMove(event, this);\"' +"," ' onmouseover=\"$$._onMouseOver(event, this);\"' +"," ' onmouseout=\"$$._onMouseOut(event, this);\"' +"," ' onclick=\"$$._onClick(event, this);\"' +"," '>' +"," '<div id=\"##_overlay\" class=\"edui-overlay\"></div>' +"," '</div>' +"," '</div>' +"," '</div>';"," },"," _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);","})();"]; +_$jscoverage['ui/tablepicker.js'][3]++; +(function () { + _$jscoverage['ui/tablepicker.js'][4]++; + var utils = baidu.editor.utils, uiUtils = baidu.editor.ui.uiUtils, UIBase = baidu.editor.ui.UIBase; + _$jscoverage['ui/tablepicker.js'][8]++; + var TablePicker = (baidu.editor.ui.TablePicker = (function (options) { + _$jscoverage['ui/tablepicker.js'][9]++; + this.initOptions(options); + _$jscoverage['ui/tablepicker.js'][10]++; + this.initTablePicker(); +})); + _$jscoverage['ui/tablepicker.js'][12]++; + TablePicker.prototype = {defaultNumRows: 10, defaultNumCols: 10, maxNumRows: 20, maxNumCols: 20, numRows: 10, numCols: 10, lengthOfCellSide: 22, initTablePicker: (function () { + _$jscoverage['ui/tablepicker.js'][21]++; + this.initUIBase(); +}), getHtmlTpl: (function () { + _$jscoverage['ui/tablepicker.js'][24]++; + var me = this; + _$jscoverage['ui/tablepicker.js'][25]++; + return "
    "; +}), _UIBase_render: UIBase.prototype.render, render: (function (holder) { + _$jscoverage['ui/tablepicker.js'][43]++; + this._UIBase_render(holder); + _$jscoverage['ui/tablepicker.js'][44]++; + this.getDom("label").innerHTML = ("0" + this.editor.getLang("t_row") + " x 0" + this.editor.getLang("t_col")); +}), _track: (function (numCols, numRows) { + _$jscoverage['ui/tablepicker.js'][47]++; + var style = this.getDom("overlay").style; + _$jscoverage['ui/tablepicker.js'][48]++; + var sideLen = this.lengthOfCellSide; + _$jscoverage['ui/tablepicker.js'][49]++; + style.width = ((numCols * sideLen) + "px"); + _$jscoverage['ui/tablepicker.js'][50]++; + style.height = ((numRows * sideLen) + "px"); + _$jscoverage['ui/tablepicker.js'][51]++; + var label = this.getDom("label"); + _$jscoverage['ui/tablepicker.js'][52]++; + label.innerHTML = (numCols + this.editor.getLang("t_col") + " x " + numRows + this.editor.getLang("t_row")); + _$jscoverage['ui/tablepicker.js'][53]++; + this.numCols = numCols; + _$jscoverage['ui/tablepicker.js'][54]++; + this.numRows = numRows; +}), _onMouseOver: (function (evt, el) { + _$jscoverage['ui/tablepicker.js'][57]++; + var rel = (evt.relatedTarget || evt.fromElement); + _$jscoverage['ui/tablepicker.js'][58]++; + if (((! uiUtils.contains(el, rel)) && (el !== rel))) { + _$jscoverage['ui/tablepicker.js'][59]++; + this.getDom("label").innerHTML = ("0" + this.editor.getLang("t_col") + " x 0" + this.editor.getLang("t_row")); + _$jscoverage['ui/tablepicker.js'][60]++; + this.getDom("overlay").style.visibility = ""; + } +}), _onMouseOut: (function (evt, el) { + _$jscoverage['ui/tablepicker.js'][64]++; + var rel = (evt.relatedTarget || evt.toElement); + _$jscoverage['ui/tablepicker.js'][65]++; + if (((! uiUtils.contains(el, rel)) && (el !== rel))) { + _$jscoverage['ui/tablepicker.js'][66]++; + this.getDom("label").innerHTML = ("0" + this.editor.getLang("t_col") + " x 0" + this.editor.getLang("t_row")); + _$jscoverage['ui/tablepicker.js'][67]++; + this.getDom("overlay").style.visibility = "hidden"; + } +}), _onMouseMove: (function (evt, el) { + _$jscoverage['ui/tablepicker.js'][71]++; + var style = this.getDom("overlay").style; + _$jscoverage['ui/tablepicker.js'][72]++; + var offset = uiUtils.getEventOffset(evt); + _$jscoverage['ui/tablepicker.js'][73]++; + var sideLen = this.lengthOfCellSide; + _$jscoverage['ui/tablepicker.js'][74]++; + var numCols = Math.ceil((offset.left / sideLen)); + _$jscoverage['ui/tablepicker.js'][75]++; + var numRows = Math.ceil((offset.top / sideLen)); + _$jscoverage['ui/tablepicker.js'][76]++; + this._track(numCols, numRows); +}), _onClick: (function () { + _$jscoverage['ui/tablepicker.js'][79]++; + this.fireEvent("picktable", this.numCols, this.numRows); +})}; + _$jscoverage['ui/tablepicker.js'][82]++; + utils.inherits(TablePicker, UIBase); +})(); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/toolbar.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/toolbar.js new file mode 100644 index 000000000..7ec17ec85 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/toolbar.js @@ -0,0 +1,106 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['ui/toolbar.js']) { + _$jscoverage['ui/toolbar.js'] = []; + _$jscoverage['ui/toolbar.js'][1] = 0; + _$jscoverage['ui/toolbar.js'][2] = 0; + _$jscoverage['ui/toolbar.js'][6] = 0; + _$jscoverage['ui/toolbar.js'][7] = 0; + _$jscoverage['ui/toolbar.js'][9] = 0; + _$jscoverage['ui/toolbar.js'][12] = 0; + _$jscoverage['ui/toolbar.js'][13] = 0; + _$jscoverage['ui/toolbar.js'][16] = 0; + _$jscoverage['ui/toolbar.js'][19] = 0; + _$jscoverage['ui/toolbar.js'][20] = 0; + _$jscoverage['ui/toolbar.js'][21] = 0; + _$jscoverage['ui/toolbar.js'][23] = 0; + _$jscoverage['ui/toolbar.js'][28] = 0; + _$jscoverage['ui/toolbar.js'][29] = 0; + _$jscoverage['ui/toolbar.js'][30] = 0; + _$jscoverage['ui/toolbar.js'][32] = 0; + _$jscoverage['ui/toolbar.js'][35] = 0; + _$jscoverage['ui/toolbar.js'][38] = 0; +} +_$jscoverage['ui/toolbar.js'].source = ["(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){"," this.items.push(item);"," },"," getHtmlTpl: function (){"," var buff = [];"," for (var i=0; i<this.items.length; i++) {"," buff[i] = this.items[i].renderHtml();"," }"," return '<div id=\"##\" class=\"edui-toolbar %%\" onselectstart=\"return false;\" onmousedown=\"return $$._onMouseDown(event, this);\">' +"," buff.join('') +"," '</div>'"," },"," postRender: function (){"," var box = this.getDom();"," for (var i=0; i<this.items.length; i++) {"," this.items[i].postRender();"," }"," uiUtils.makeUnselectable(box);"," },"," _onMouseDown: function (){"," return false;"," }"," };"," utils.inherits(Toolbar, UIBase);","","})();"]; +_$jscoverage['ui/toolbar.js'][1]++; +(function () { + _$jscoverage['ui/toolbar.js'][2]++; + var utils = baidu.editor.utils, uiUtils = baidu.editor.ui.uiUtils, UIBase = baidu.editor.ui.UIBase, Toolbar = (baidu.editor.ui.Toolbar = (function (options) { + _$jscoverage['ui/toolbar.js'][6]++; + this.initOptions(options); + _$jscoverage['ui/toolbar.js'][7]++; + this.initToolbar(); +})); + _$jscoverage['ui/toolbar.js'][9]++; + Toolbar.prototype = {items: null, initToolbar: (function () { + _$jscoverage['ui/toolbar.js'][12]++; + this.items = (this.items || []); + _$jscoverage['ui/toolbar.js'][13]++; + this.initUIBase(); +}), add: (function (item) { + _$jscoverage['ui/toolbar.js'][16]++; + this.items.push(item); +}), getHtmlTpl: (function () { + _$jscoverage['ui/toolbar.js'][19]++; + var buff = []; + _$jscoverage['ui/toolbar.js'][20]++; + for (var i = 0; (i < this.items.length); (i++)) { + _$jscoverage['ui/toolbar.js'][21]++; + buff[i] = this.items[i].renderHtml(); +} + _$jscoverage['ui/toolbar.js'][23]++; + return ("
    " + buff.join("") + "
    "); +}), postRender: (function () { + _$jscoverage['ui/toolbar.js'][28]++; + var box = this.getDom(); + _$jscoverage['ui/toolbar.js'][29]++; + for (var i = 0; (i < this.items.length); (i++)) { + _$jscoverage['ui/toolbar.js'][30]++; + this.items[i].postRender(); +} + _$jscoverage['ui/toolbar.js'][32]++; + uiUtils.makeUnselectable(box); +}), _onMouseDown: (function () { + _$jscoverage['ui/toolbar.js'][35]++; + return false; +})}; + _$jscoverage['ui/toolbar.js'][38]++; + utils.inherits(Toolbar, UIBase); +})(); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/ui.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/ui.js new file mode 100644 index 000000000..0f59b2cef --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/ui.js @@ -0,0 +1,52 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['ui/ui.js']) { + _$jscoverage['ui/ui.js'] = []; + _$jscoverage['ui/ui.js'][1] = 0; + _$jscoverage['ui/ui.js'][2] = 0; + _$jscoverage['ui/ui.js'][3] = 0; +} +_$jscoverage['ui/ui.js'].source = ["var baidu = baidu || {};","baidu.editor = baidu.editor || {};","baidu.editor.ui = {};"]; +_$jscoverage['ui/ui.js'][1]++; +var baidu = (baidu || {}); +_$jscoverage['ui/ui.js'][2]++; +baidu.editor = (baidu.editor || {}); +_$jscoverage['ui/ui.js'][3]++; +baidu.editor.ui = {}; diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/uibase.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/uibase.js new file mode 100644 index 000000000..cd2583fd7 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/uibase.js @@ -0,0 +1,190 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['ui/uibase.js']) { + _$jscoverage['ui/uibase.js'] = []; + _$jscoverage['ui/uibase.js'][1] = 0; + _$jscoverage['ui/uibase.js'][2] = 0; + _$jscoverage['ui/uibase.js'][8] = 0; + _$jscoverage['ui/uibase.js'][12] = 0; + _$jscoverage['ui/uibase.js'][13] = 0; + _$jscoverage['ui/uibase.js'][14] = 0; + _$jscoverage['ui/uibase.js'][16] = 0; + _$jscoverage['ui/uibase.js'][19] = 0; + _$jscoverage['ui/uibase.js'][22] = 0; + _$jscoverage['ui/uibase.js'][23] = 0; + _$jscoverage['ui/uibase.js'][26] = 0; + _$jscoverage['ui/uibase.js'][27] = 0; + _$jscoverage['ui/uibase.js'][28] = 0; + _$jscoverage['ui/uibase.js'][29] = 0; + _$jscoverage['ui/uibase.js'][30] = 0; + _$jscoverage['ui/uibase.js'][32] = 0; + _$jscoverage['ui/uibase.js'][33] = 0; + _$jscoverage['ui/uibase.js'][34] = 0; + _$jscoverage['ui/uibase.js'][35] = 0; + _$jscoverage['ui/uibase.js'][38] = 0; + _$jscoverage['ui/uibase.js'][39] = 0; + _$jscoverage['ui/uibase.js'][40] = 0; + _$jscoverage['ui/uibase.js'][41] = 0; + _$jscoverage['ui/uibase.js'][43] = 0; + _$jscoverage['ui/uibase.js'][44] = 0; + _$jscoverage['ui/uibase.js'][46] = 0; + _$jscoverage['ui/uibase.js'][47] = 0; + _$jscoverage['ui/uibase.js'][48] = 0; + _$jscoverage['ui/uibase.js'][50] = 0; + _$jscoverage['ui/uibase.js'][53] = 0; + _$jscoverage['ui/uibase.js'][54] = 0; + _$jscoverage['ui/uibase.js'][56] = 0; + _$jscoverage['ui/uibase.js'][60] = 0; + _$jscoverage['ui/uibase.js'][63] = 0; + _$jscoverage['ui/uibase.js'][66] = 0; + _$jscoverage['ui/uibase.js'][67] = 0; + _$jscoverage['ui/uibase.js'][74] = 0; + _$jscoverage['ui/uibase.js'][77] = 0; + _$jscoverage['ui/uibase.js'][78] = 0; + _$jscoverage['ui/uibase.js'][79] = 0; + _$jscoverage['ui/uibase.js'][82] = 0; +} +_$jscoverage['ui/uibase.js'].source = ["(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);","})();"]; +_$jscoverage['ui/uibase.js'][1]++; +(function () { + _$jscoverage['ui/uibase.js'][2]++; + var utils = baidu.editor.utils, uiUtils = baidu.editor.ui.uiUtils, EventBase = baidu.editor.EventBase, UIBase = (baidu.editor.ui.UIBase = (function () { +})); + _$jscoverage['ui/uibase.js'][8]++; + UIBase.prototype = {className: "", uiName: "", initOptions: (function (options) { + _$jscoverage['ui/uibase.js'][12]++; + var me = this; + _$jscoverage['ui/uibase.js'][13]++; + for (var k in options) { + _$jscoverage['ui/uibase.js'][14]++; + me[k] = options[k]; +} + _$jscoverage['ui/uibase.js'][16]++; + this.id = (this.id || ("edui" + uiUtils.uid())); +}), initUIBase: (function () { + _$jscoverage['ui/uibase.js'][19]++; + this._globalKey = utils.unhtml(uiUtils.setGlobal(this.id, this)); +}), render: (function (holder) { + _$jscoverage['ui/uibase.js'][22]++; + var html = this.renderHtml(); + _$jscoverage['ui/uibase.js'][23]++; + var el = uiUtils.createElementByHtml(html); + _$jscoverage['ui/uibase.js'][26]++; + var list = domUtils.getElementsByTagName(el, "*"); + _$jscoverage['ui/uibase.js'][27]++; + var theme = ("edui-" + (this.theme || this.editor.options.theme)); + _$jscoverage['ui/uibase.js'][28]++; + var layer = document.getElementById("edui_fixedlayer"); + _$jscoverage['ui/uibase.js'][29]++; + for (var i = 0, node; (node = list[(i++)]);) { + _$jscoverage['ui/uibase.js'][30]++; + domUtils.addClass(node, theme); +} + _$jscoverage['ui/uibase.js'][32]++; + domUtils.addClass(el, theme); + _$jscoverage['ui/uibase.js'][33]++; + if (layer) { + _$jscoverage['ui/uibase.js'][34]++; + layer.className = ""; + _$jscoverage['ui/uibase.js'][35]++; + domUtils.addClass(layer, theme); + } + _$jscoverage['ui/uibase.js'][38]++; + var seatEl = this.getDom(); + _$jscoverage['ui/uibase.js'][39]++; + if ((seatEl != null)) { + _$jscoverage['ui/uibase.js'][40]++; + seatEl.parentNode.replaceChild(el, seatEl); + _$jscoverage['ui/uibase.js'][41]++; + uiUtils.copyAttributes(el, seatEl); + } + else { + _$jscoverage['ui/uibase.js'][43]++; + if (((typeof holder) == "string")) { + _$jscoverage['ui/uibase.js'][44]++; + holder = document.getElementById(holder); + } + _$jscoverage['ui/uibase.js'][46]++; + holder = (holder || uiUtils.getFixedLayer()); + _$jscoverage['ui/uibase.js'][47]++; + domUtils.addClass(holder, theme); + _$jscoverage['ui/uibase.js'][48]++; + holder.appendChild(el); + } + _$jscoverage['ui/uibase.js'][50]++; + this.postRender(); +}), getDom: (function (name) { + _$jscoverage['ui/uibase.js'][53]++; + if ((! name)) { + _$jscoverage['ui/uibase.js'][54]++; + return document.getElementById(this.id); + } + else { + _$jscoverage['ui/uibase.js'][56]++; + return document.getElementById((this.id + "_" + name)); + } +}), postRender: (function () { + _$jscoverage['ui/uibase.js'][60]++; + this.fireEvent("postrender"); +}), getHtmlTpl: (function () { + _$jscoverage['ui/uibase.js'][63]++; + return ""; +}), formatHtml: (function (tpl) { + _$jscoverage['ui/uibase.js'][66]++; + var prefix = ("edui-" + this.uiName); + _$jscoverage['ui/uibase.js'][67]++; + return tpl.replace(/##/g, this.id).replace(/%%-/g, (this.uiName? (prefix + "-"): "")).replace(/%%/g, ((this.uiName? prefix: "") + " " + this.className)).replace(/\$\$/g, this._globalKey); +}), renderHtml: (function () { + _$jscoverage['ui/uibase.js'][74]++; + return this.formatHtml(this.getHtmlTpl()); +}), dispose: (function () { + _$jscoverage['ui/uibase.js'][77]++; + var box = this.getDom(); + _$jscoverage['ui/uibase.js'][78]++; + if (box) { + _$jscoverage['ui/uibase.js'][78]++; + baidu.editor.dom.domUtils.remove(box); + } + _$jscoverage['ui/uibase.js'][79]++; + uiUtils.unsetGlobal(this.id); +})}; + _$jscoverage['ui/uibase.js'][82]++; + utils.inherits(UIBase, EventBase); +})(); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/uiutils.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/uiutils.js new file mode 100644 index 000000000..bd974add5 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/coverage/ui/uiutils.js @@ -0,0 +1,567 @@ +/* automatically generated by JSCoverage - do not edit */ +try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } +} +catch (e) {} + +try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } +} +catch (e) {} +if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; +} +if (! _$jscoverage['ui/uiutils.js']) { + _$jscoverage['ui/uiutils.js'] = []; + _$jscoverage['ui/uiutils.js'][1] = 0; + _$jscoverage['ui/uiutils.js'][2] = 0; + _$jscoverage['ui/uiutils.js'][5] = 0; + _$jscoverage['ui/uiutils.js'][6] = 0; + _$jscoverage['ui/uiutils.js'][7] = 0; + _$jscoverage['ui/uiutils.js'][8] = 0; + _$jscoverage['ui/uiutils.js'][10] = 0; + _$jscoverage['ui/uiutils.js'][12] = 0; + _$jscoverage['ui/uiutils.js'][15] = 0; + _$jscoverage['ui/uiutils.js'][16] = 0; + _$jscoverage['ui/uiutils.js'][17] = 0; + _$jscoverage['ui/uiutils.js'][19] = 0; + _$jscoverage['ui/uiutils.js'][20] = 0; + _$jscoverage['ui/uiutils.js'][21] = 0; + _$jscoverage['ui/uiutils.js'][22] = 0; + _$jscoverage['ui/uiutils.js'][24] = 0; + _$jscoverage['ui/uiutils.js'][25] = 0; + _$jscoverage['ui/uiutils.js'][26] = 0; + _$jscoverage['ui/uiutils.js'][27] = 0; + _$jscoverage['ui/uiutils.js'][28] = 0; + _$jscoverage['ui/uiutils.js'][29] = 0; + _$jscoverage['ui/uiutils.js'][32] = 0; + _$jscoverage['ui/uiutils.js'][34] = 0; + _$jscoverage['ui/uiutils.js'][36] = 0; + _$jscoverage['ui/uiutils.js'][37] = 0; + _$jscoverage['ui/uiutils.js'][40] = 0; + _$jscoverage['ui/uiutils.js'][41] = 0; + _$jscoverage['ui/uiutils.js'][42] = 0; + _$jscoverage['ui/uiutils.js'][43] = 0; + _$jscoverage['ui/uiutils.js'][44] = 0; + _$jscoverage['ui/uiutils.js'][47] = 0; + _$jscoverage['ui/uiutils.js'][51] = 0; + _$jscoverage['ui/uiutils.js'][53] = 0; + _$jscoverage['ui/uiutils.js'][54] = 0; + _$jscoverage['ui/uiutils.js'][56] = 0; + _$jscoverage['ui/uiutils.js'][58] = 0; + _$jscoverage['ui/uiutils.js'][64] = 0; + _$jscoverage['ui/uiutils.js'][65] = 0; + _$jscoverage['ui/uiutils.js'][67] = 0; + _$jscoverage['ui/uiutils.js'][68] = 0; + _$jscoverage['ui/uiutils.js'][69] = 0; + _$jscoverage['ui/uiutils.js'][71] = 0; + _$jscoverage['ui/uiutils.js'][72] = 0; + _$jscoverage['ui/uiutils.js'][73] = 0; + _$jscoverage['ui/uiutils.js'][76] = 0; + _$jscoverage['ui/uiutils.js'][77] = 0; + _$jscoverage['ui/uiutils.js'][78] = 0; + _$jscoverage['ui/uiutils.js'][79] = 0; + _$jscoverage['ui/uiutils.js'][89] = 0; + _$jscoverage['ui/uiutils.js'][90] = 0; + _$jscoverage['ui/uiutils.js'][91] = 0; + _$jscoverage['ui/uiutils.js'][92] = 0; + _$jscoverage['ui/uiutils.js'][93] = 0; + _$jscoverage['ui/uiutils.js'][95] = 0; + _$jscoverage['ui/uiutils.js'][99] = 0; + _$jscoverage['ui/uiutils.js'][100] = 0; + _$jscoverage['ui/uiutils.js'][101] = 0; + _$jscoverage['ui/uiutils.js'][102] = 0; + _$jscoverage['ui/uiutils.js'][108] = 0; + _$jscoverage['ui/uiutils.js'][109] = 0; + _$jscoverage['ui/uiutils.js'][110] = 0; + _$jscoverage['ui/uiutils.js'][114] = 0; + _$jscoverage['ui/uiutils.js'][115] = 0; + _$jscoverage['ui/uiutils.js'][116] = 0; + _$jscoverage['ui/uiutils.js'][117] = 0; + _$jscoverage['ui/uiutils.js'][119] = 0; + _$jscoverage['ui/uiutils.js'][122] = 0; + _$jscoverage['ui/uiutils.js'][123] = 0; + _$jscoverage['ui/uiutils.js'][126] = 0; + _$jscoverage['ui/uiutils.js'][129] = 0; + _$jscoverage['ui/uiutils.js'][130] = 0; + _$jscoverage['ui/uiutils.js'][131] = 0; + _$jscoverage['ui/uiutils.js'][132] = 0; + _$jscoverage['ui/uiutils.js'][133] = 0; + _$jscoverage['ui/uiutils.js'][134] = 0; + _$jscoverage['ui/uiutils.js'][137] = 0; + _$jscoverage['ui/uiutils.js'][138] = 0; + _$jscoverage['ui/uiutils.js'][140] = 0; + _$jscoverage['ui/uiutils.js'][141] = 0; + _$jscoverage['ui/uiutils.js'][145] = 0; + _$jscoverage['ui/uiutils.js'][146] = 0; + _$jscoverage['ui/uiutils.js'][147] = 0; + _$jscoverage['ui/uiutils.js'][148] = 0; + _$jscoverage['ui/uiutils.js'][149] = 0; + _$jscoverage['ui/uiutils.js'][152] = 0; + _$jscoverage['ui/uiutils.js'][158] = 0; + _$jscoverage['ui/uiutils.js'][159] = 0; + _$jscoverage['ui/uiutils.js'][160] = 0; + _$jscoverage['ui/uiutils.js'][161] = 0; + _$jscoverage['ui/uiutils.js'][162] = 0; + _$jscoverage['ui/uiutils.js'][163] = 0; + _$jscoverage['ui/uiutils.js'][164] = 0; + _$jscoverage['ui/uiutils.js'][165] = 0; + _$jscoverage['ui/uiutils.js'][166] = 0; + _$jscoverage['ui/uiutils.js'][168] = 0; + _$jscoverage['ui/uiutils.js'][171] = 0; + _$jscoverage['ui/uiutils.js'][172] = 0; + _$jscoverage['ui/uiutils.js'][173] = 0; + _$jscoverage['ui/uiutils.js'][174] = 0; + _$jscoverage['ui/uiutils.js'][175] = 0; + _$jscoverage['ui/uiutils.js'][176] = 0; + _$jscoverage['ui/uiutils.js'][178] = 0; + _$jscoverage['ui/uiutils.js'][179] = 0; + _$jscoverage['ui/uiutils.js'][180] = 0; + _$jscoverage['ui/uiutils.js'][182] = 0; + _$jscoverage['ui/uiutils.js'][184] = 0; + _$jscoverage['ui/uiutils.js'][185] = 0; + _$jscoverage['ui/uiutils.js'][186] = 0; + _$jscoverage['ui/uiutils.js'][187] = 0; + _$jscoverage['ui/uiutils.js'][188] = 0; + _$jscoverage['ui/uiutils.js'][189] = 0; + _$jscoverage['ui/uiutils.js'][190] = 0; + _$jscoverage['ui/uiutils.js'][191] = 0; + _$jscoverage['ui/uiutils.js'][193] = 0; + _$jscoverage['ui/uiutils.js'][194] = 0; + _$jscoverage['ui/uiutils.js'][195] = 0; + _$jscoverage['ui/uiutils.js'][196] = 0; + _$jscoverage['ui/uiutils.js'][198] = 0; + _$jscoverage['ui/uiutils.js'][201] = 0; + _$jscoverage['ui/uiutils.js'][202] = 0; + _$jscoverage['ui/uiutils.js'][203] = 0; + _$jscoverage['ui/uiutils.js'][204] = 0; + _$jscoverage['ui/uiutils.js'][205] = 0; + _$jscoverage['ui/uiutils.js'][206] = 0; + _$jscoverage['ui/uiutils.js'][207] = 0; + _$jscoverage['ui/uiutils.js'][208] = 0; + _$jscoverage['ui/uiutils.js'][209] = 0; + _$jscoverage['ui/uiutils.js'][211] = 0; + _$jscoverage['ui/uiutils.js'][213] = 0; + _$jscoverage['ui/uiutils.js'][214] = 0; + _$jscoverage['ui/uiutils.js'][215] = 0; + _$jscoverage['ui/uiutils.js'][216] = 0; + _$jscoverage['ui/uiutils.js'][218] = 0; + _$jscoverage['ui/uiutils.js'][221] = 0; + _$jscoverage['ui/uiutils.js'][222] = 0; + _$jscoverage['ui/uiutils.js'][223] = 0; + _$jscoverage['ui/uiutils.js'][224] = 0; + _$jscoverage['ui/uiutils.js'][225] = 0; + _$jscoverage['ui/uiutils.js'][226] = 0; + _$jscoverage['ui/uiutils.js'][231] = 0; + _$jscoverage['ui/uiutils.js'][232] = 0; + _$jscoverage['ui/uiutils.js'][233] = 0; + _$jscoverage['ui/uiutils.js'][234] = 0; + _$jscoverage['ui/uiutils.js'][235] = 0; + _$jscoverage['ui/uiutils.js'][236] = 0; + _$jscoverage['ui/uiutils.js'][241] = 0; + _$jscoverage['ui/uiutils.js'][242] = 0; + _$jscoverage['ui/uiutils.js'][243] = 0; + _$jscoverage['ui/uiutils.js'][253] = 0; + _$jscoverage['ui/uiutils.js'][254] = 0; + _$jscoverage['ui/uiutils.js'][255] = 0; +} +_$jscoverage['ui/uiutils.js'].source = ["(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));"," }","})();"]; +_$jscoverage['ui/uiutils.js'][1]++; +(function () { + _$jscoverage['ui/uiutils.js'][2]++; + var browser = baidu.editor.browser, domUtils = baidu.editor.dom.domUtils; + _$jscoverage['ui/uiutils.js'][5]++; + var magic = "$EDITORUI"; + _$jscoverage['ui/uiutils.js'][6]++; + var root = (window[magic] = {}); + _$jscoverage['ui/uiutils.js'][7]++; + var uidMagic = ("ID" + magic); + _$jscoverage['ui/uiutils.js'][8]++; + var uidCount = 0; + _$jscoverage['ui/uiutils.js'][10]++; + var uiUtils = (baidu.editor.ui.uiUtils = {uid: (function (obj) { + _$jscoverage['ui/uiutils.js'][12]++; + return (obj? (obj[uidMagic] || (obj[uidMagic] = (++uidCount))): (++uidCount)); +}), hook: (function (fn, callback) { + _$jscoverage['ui/uiutils.js'][15]++; + var dg; + _$jscoverage['ui/uiutils.js'][16]++; + if ((fn && fn._callbacks)) { + _$jscoverage['ui/uiutils.js'][17]++; + dg = fn; + } + else { + _$jscoverage['ui/uiutils.js'][19]++; + dg = (function () { + _$jscoverage['ui/uiutils.js'][20]++; + var q; + _$jscoverage['ui/uiutils.js'][21]++; + if (fn) { + _$jscoverage['ui/uiutils.js'][22]++; + q = fn.apply(this, arguments); + } + _$jscoverage['ui/uiutils.js'][24]++; + var callbacks = dg._callbacks; + _$jscoverage['ui/uiutils.js'][25]++; + var k = callbacks.length; + _$jscoverage['ui/uiutils.js'][26]++; + while ((k--)) { + _$jscoverage['ui/uiutils.js'][27]++; + var r = callbacks[k].apply(this, arguments); + _$jscoverage['ui/uiutils.js'][28]++; + if ((q === undefined)) { + _$jscoverage['ui/uiutils.js'][29]++; + q = r; + } +} + _$jscoverage['ui/uiutils.js'][32]++; + return q; +}); + _$jscoverage['ui/uiutils.js'][34]++; + dg._callbacks = []; + } + _$jscoverage['ui/uiutils.js'][36]++; + dg._callbacks.push(callback); + _$jscoverage['ui/uiutils.js'][37]++; + return dg; +}), createElementByHtml: (function (html) { + _$jscoverage['ui/uiutils.js'][40]++; + var el = document.createElement("div"); + _$jscoverage['ui/uiutils.js'][41]++; + el.innerHTML = html; + _$jscoverage['ui/uiutils.js'][42]++; + el = el.firstChild; + _$jscoverage['ui/uiutils.js'][43]++; + el.parentNode.removeChild(el); + _$jscoverage['ui/uiutils.js'][44]++; + return el; +}), getViewportElement: (function () { + _$jscoverage['ui/uiutils.js'][47]++; + return ((browser.ie && browser.quirks)? document.body: document.documentElement); +}), getClientRect: (function (element) { + _$jscoverage['ui/uiutils.js'][51]++; + var bcr; + _$jscoverage['ui/uiutils.js'][53]++; + try { + _$jscoverage['ui/uiutils.js'][54]++; + bcr = element.getBoundingClientRect(); + } + catch (e) { + _$jscoverage['ui/uiutils.js'][56]++; + bcr = {left: 0, top: 0, height: 0, width: 0}; + } + _$jscoverage['ui/uiutils.js'][58]++; + 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))}; + _$jscoverage['ui/uiutils.js'][64]++; + var doc; + _$jscoverage['ui/uiutils.js'][65]++; + while ((((doc = element.ownerDocument) !== document) && (element = domUtils.getWindow(doc).frameElement))) { + _$jscoverage['ui/uiutils.js'][67]++; + bcr = element.getBoundingClientRect(); + _$jscoverage['ui/uiutils.js'][68]++; + rect.left += bcr.left; + _$jscoverage['ui/uiutils.js'][69]++; + rect.top += bcr.top; +} + _$jscoverage['ui/uiutils.js'][71]++; + rect.bottom = (rect.top + rect.height); + _$jscoverage['ui/uiutils.js'][72]++; + rect.right = (rect.left + rect.width); + _$jscoverage['ui/uiutils.js'][73]++; + return rect; +}), getViewportRect: (function () { + _$jscoverage['ui/uiutils.js'][76]++; + var viewportEl = uiUtils.getViewportElement(); + _$jscoverage['ui/uiutils.js'][77]++; + var width = ((window.innerWidth || viewportEl.clientWidth) | 0); + _$jscoverage['ui/uiutils.js'][78]++; + var height = ((window.innerHeight || viewportEl.clientHeight) | 0); + _$jscoverage['ui/uiutils.js'][79]++; + return ({left: 0, top: 0, height: height, width: width, bottom: height, right: width}); +}), setViewportOffset: (function (element, offset) { + _$jscoverage['ui/uiutils.js'][89]++; + var rect; + _$jscoverage['ui/uiutils.js'][90]++; + var fixedLayer = uiUtils.getFixedLayer(); + _$jscoverage['ui/uiutils.js'][91]++; + if ((element.parentNode === fixedLayer)) { + _$jscoverage['ui/uiutils.js'][92]++; + element.style.left = (offset.left + "px"); + _$jscoverage['ui/uiutils.js'][93]++; + element.style.top = (offset.top + "px"); + } + else { + _$jscoverage['ui/uiutils.js'][95]++; + domUtils.setViewportOffset(element, offset); + } +}), getEventOffset: (function (evt) { + _$jscoverage['ui/uiutils.js'][99]++; + var el = (evt.target || evt.srcElement); + _$jscoverage['ui/uiutils.js'][100]++; + var rect = uiUtils.getClientRect(el); + _$jscoverage['ui/uiutils.js'][101]++; + var offset = uiUtils.getViewportOffsetByEvent(evt); + _$jscoverage['ui/uiutils.js'][102]++; + return ({left: (offset.left - rect.left), top: (offset.top - rect.top)}); +}), getViewportOffsetByEvent: (function (evt) { + _$jscoverage['ui/uiutils.js'][108]++; + var el = (evt.target || evt.srcElement); + _$jscoverage['ui/uiutils.js'][109]++; + var frameEl = domUtils.getWindow(el).frameElement; + _$jscoverage['ui/uiutils.js'][110]++; + var offset = {left: evt.clientX, top: evt.clientY}; + _$jscoverage['ui/uiutils.js'][114]++; + if ((frameEl && (el.ownerDocument !== document))) { + _$jscoverage['ui/uiutils.js'][115]++; + var rect = uiUtils.getClientRect(frameEl); + _$jscoverage['ui/uiutils.js'][116]++; + offset.left += rect.left; + _$jscoverage['ui/uiutils.js'][117]++; + offset.top += rect.top; + } + _$jscoverage['ui/uiutils.js'][119]++; + return offset; +}), setGlobal: (function (id, obj) { + _$jscoverage['ui/uiutils.js'][122]++; + root[id] = obj; + _$jscoverage['ui/uiutils.js'][123]++; + return (magic + "[\"" + id + "\"]"); +}), unsetGlobal: (function (id) { + _$jscoverage['ui/uiutils.js'][126]++; + (delete root[id]); +}), copyAttributes: (function (tgt, src) { + _$jscoverage['ui/uiutils.js'][129]++; + var attributes = src.attributes; + _$jscoverage['ui/uiutils.js'][130]++; + var k = attributes.length; + _$jscoverage['ui/uiutils.js'][131]++; + while ((k--)) { + _$jscoverage['ui/uiutils.js'][132]++; + var attrNode = attributes[k]; + _$jscoverage['ui/uiutils.js'][133]++; + if (((attrNode.nodeName != "style") && (attrNode.nodeName != "class") && ((! browser.ie) || attrNode.specified))) { + _$jscoverage['ui/uiutils.js'][134]++; + tgt.setAttribute(attrNode.nodeName, attrNode.nodeValue); + } +} + _$jscoverage['ui/uiutils.js'][137]++; + if (src.className) { + _$jscoverage['ui/uiutils.js'][138]++; + domUtils.addClass(tgt, src.className); + } + _$jscoverage['ui/uiutils.js'][140]++; + if (src.style.cssText) { + _$jscoverage['ui/uiutils.js'][141]++; + tgt.style.cssText += (";" + src.style.cssText); + } +}), removeStyle: (function (el, styleName) { + _$jscoverage['ui/uiutils.js'][145]++; + if (el.style.removeProperty) { + _$jscoverage['ui/uiutils.js'][146]++; + el.style.removeProperty(styleName); + } + else { + _$jscoverage['ui/uiutils.js'][147]++; + if (el.style.removeAttribute) { + _$jscoverage['ui/uiutils.js'][148]++; + el.style.removeAttribute(styleName); + } + else { + _$jscoverage['ui/uiutils.js'][149]++; + throw ""; + } + } +}), contains: (function (elA, elB) { + _$jscoverage['ui/uiutils.js'][152]++; + return (elA && elB && ((elA === elB)? false: (elA.contains? elA.contains(elB): (elA.compareDocumentPosition(elB) & 16)))); +}), startDrag: (function (evt, callbacks, doc) { + _$jscoverage['ui/uiutils.js'][158]++; + var doc = (doc || document); + _$jscoverage['ui/uiutils.js'][159]++; + var startX = evt.clientX; + _$jscoverage['ui/uiutils.js'][160]++; + var startY = evt.clientY; + _$jscoverage['ui/uiutils.js'][161]++; + function handleMouseMove(evt) { + _$jscoverage['ui/uiutils.js'][162]++; + var x = (evt.clientX - startX); + _$jscoverage['ui/uiutils.js'][163]++; + var y = (evt.clientY - startY); + _$jscoverage['ui/uiutils.js'][164]++; + callbacks.ondragmove(x, y, evt); + _$jscoverage['ui/uiutils.js'][165]++; + if (evt.stopPropagation) { + _$jscoverage['ui/uiutils.js'][166]++; + evt.stopPropagation(); + } + else { + _$jscoverage['ui/uiutils.js'][168]++; + evt.cancelBubble = true; + } +} + _$jscoverage['ui/uiutils.js'][171]++; + if (doc.addEventListener) { + _$jscoverage['ui/uiutils.js'][172]++; + function handleMouseUp(evt) { + _$jscoverage['ui/uiutils.js'][173]++; + doc.removeEventListener("mousemove", handleMouseMove, true); + _$jscoverage['ui/uiutils.js'][174]++; + doc.removeEventListener("mouseup", handleMouseUp, true); + _$jscoverage['ui/uiutils.js'][175]++; + window.removeEventListener("mouseup", handleMouseUp, true); + _$jscoverage['ui/uiutils.js'][176]++; + callbacks.ondragstop(); +} + _$jscoverage['ui/uiutils.js'][178]++; + doc.addEventListener("mousemove", handleMouseMove, true); + _$jscoverage['ui/uiutils.js'][179]++; + doc.addEventListener("mouseup", handleMouseUp, true); + _$jscoverage['ui/uiutils.js'][180]++; + window.addEventListener("mouseup", handleMouseUp, true); + _$jscoverage['ui/uiutils.js'][182]++; + evt.preventDefault(); + } + else { + _$jscoverage['ui/uiutils.js'][184]++; + var elm = evt.srcElement; + _$jscoverage['ui/uiutils.js'][185]++; + elm.setCapture(); + _$jscoverage['ui/uiutils.js'][186]++; + function releaseCaptrue() { + _$jscoverage['ui/uiutils.js'][187]++; + elm.releaseCapture(); + _$jscoverage['ui/uiutils.js'][188]++; + elm.detachEvent("onmousemove", handleMouseMove); + _$jscoverage['ui/uiutils.js'][189]++; + elm.detachEvent("onmouseup", releaseCaptrue); + _$jscoverage['ui/uiutils.js'][190]++; + elm.detachEvent("onlosecaptrue", releaseCaptrue); + _$jscoverage['ui/uiutils.js'][191]++; + callbacks.ondragstop(); +} + _$jscoverage['ui/uiutils.js'][193]++; + elm.attachEvent("onmousemove", handleMouseMove); + _$jscoverage['ui/uiutils.js'][194]++; + elm.attachEvent("onmouseup", releaseCaptrue); + _$jscoverage['ui/uiutils.js'][195]++; + elm.attachEvent("onlosecaptrue", releaseCaptrue); + _$jscoverage['ui/uiutils.js'][196]++; + evt.returnValue = false; + } + _$jscoverage['ui/uiutils.js'][198]++; + callbacks.ondragstart(); +}), getFixedLayer: (function () { + _$jscoverage['ui/uiutils.js'][201]++; + var layer = document.getElementById("edui_fixedlayer"); + _$jscoverage['ui/uiutils.js'][202]++; + if ((layer == null)) { + _$jscoverage['ui/uiutils.js'][203]++; + layer = document.createElement("div"); + _$jscoverage['ui/uiutils.js'][204]++; + layer.id = "edui_fixedlayer"; + _$jscoverage['ui/uiutils.js'][205]++; + document.body.appendChild(layer); + _$jscoverage['ui/uiutils.js'][206]++; + if ((browser.ie && (browser.version <= 8))) { + _$jscoverage['ui/uiutils.js'][207]++; + layer.style.position = "absolute"; + _$jscoverage['ui/uiutils.js'][208]++; + bindFixedLayer(); + _$jscoverage['ui/uiutils.js'][209]++; + setTimeout(updateFixedOffset); + } + else { + _$jscoverage['ui/uiutils.js'][211]++; + layer.style.position = "fixed"; + } + _$jscoverage['ui/uiutils.js'][213]++; + layer.style.left = "0"; + _$jscoverage['ui/uiutils.js'][214]++; + layer.style.top = "0"; + _$jscoverage['ui/uiutils.js'][215]++; + layer.style.width = "0"; + _$jscoverage['ui/uiutils.js'][216]++; + layer.style.height = "0"; + } + _$jscoverage['ui/uiutils.js'][218]++; + return layer; +}), makeUnselectable: (function (element) { + _$jscoverage['ui/uiutils.js'][221]++; + if ((browser.opera || (browser.ie && (browser.version < 9)))) { + _$jscoverage['ui/uiutils.js'][222]++; + element.unselectable = "on"; + _$jscoverage['ui/uiutils.js'][223]++; + if (element.hasChildNodes()) { + _$jscoverage['ui/uiutils.js'][224]++; + for (var i = 0; (i < element.childNodes.length); (i++)) { + _$jscoverage['ui/uiutils.js'][225]++; + if ((element.childNodes[i].nodeType == 1)) { + _$jscoverage['ui/uiutils.js'][226]++; + uiUtils.makeUnselectable(element.childNodes[i]); + } +} + } + } + else { + _$jscoverage['ui/uiutils.js'][231]++; + if ((element.style.MozUserSelect !== undefined)) { + _$jscoverage['ui/uiutils.js'][232]++; + element.style.MozUserSelect = "none"; + } + else { + _$jscoverage['ui/uiutils.js'][233]++; + if ((element.style.WebkitUserSelect !== undefined)) { + _$jscoverage['ui/uiutils.js'][234]++; + element.style.WebkitUserSelect = "none"; + } + else { + _$jscoverage['ui/uiutils.js'][235]++; + if ((element.style.KhtmlUserSelect !== undefined)) { + _$jscoverage['ui/uiutils.js'][236]++; + element.style.KhtmlUserSelect = "none"; + } + } + } + } +})}); + _$jscoverage['ui/uiutils.js'][241]++; + function updateFixedOffset() { + _$jscoverage['ui/uiutils.js'][242]++; + var layer = document.getElementById("edui_fixedlayer"); + _$jscoverage['ui/uiutils.js'][243]++; + uiUtils.setViewportOffset(layer, {left: 0, top: 0}); +} + _$jscoverage['ui/uiutils.js'][253]++; + function bindFixedLayer(adjOffset) { + _$jscoverage['ui/uiutils.js'][254]++; + domUtils.on(window, "scroll", updateFixedOffset); + _$jscoverage['ui/uiutils.js'][255]++; + domUtils.on(window, "resize", baidu.editor.utils.defer(updateFixedOffset, 0, true)); +} +})(); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/editor_config.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/editor_config.js new file mode 100644 index 000000000..6d2b02936 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/editor_config.js @@ -0,0 +1,276 @@ +/** + * ueditor完整配置项 + * 可以在这里配置整个编辑器的特性 + */ +var UEDITOR_CONFIG2 = { + UEDITOR_HOME_URL: '../../../', //这里你可以配置成ueditor目录在您网站的绝对路径 + toolbars: [ + ['FullScreen','Source','|','Undo','Redo','|', + 'Bold','Italic','Underline','StrikeThrough','Superscript','Subscript','RemoveFormat','FormatMatch','|', + 'BlockQuote','|', + 'PastePlain','|', + 'ForeColor','BackColor','InsertOrderedList','InsertUnorderedList','|', + 'Paragraph','RowSpacing','FontFamily','FontSize','|', + 'DirectionalityLtr','DirectionalityRtl','|','','Indent','Outdent','|', + 'JustifyLeft','JustifyCenter','JustifyRight','JustifyJustify','|', + 'Link','Unlink','Anchor','Image','MultiMenu','Video','Map','GMap','Code', '|', + 'Horizontal','Date','Time','Spechars','|', + 'InsertTable','DeleteTable','InsertParagraphBeforeTable','InsertRow','DeleteRow','InsertCol','DeleteCol','MergeCells','MergeRight','MergeDown','SplittoCells','SplittoRows','SplittoCols','|', + 'SelectAll','ClearDoc','SearchReplace','Print','Preview','PageBreak','Help'] + ],autoFloatEnabled:false, + labelMap: { + 'anchor':'锚点', + 'undo': '撤销', + 'redo': '重做', + 'bold': '加粗', + 'indent':'首行缩进', + 'outdent':'取消缩进', + 'italic': '斜体', + 'underline': '下划线', + 'strikethrough': '删除线', + 'subscript': '下标', + 'superscript': '上标', + 'formatmatch': '格式刷', + 'source': '源代码', + 'blockquote': '引用', + 'pasteplain': '纯文本粘贴模式', + 'selectall': '全选', + 'print': '打印', + 'preview': '预览', + 'horizontal': '分隔线', + 'removeformat': '清除格式', + 'time': '时间', + 'date': '日期', + 'unlink': '取消链接', + 'insertrow': '前插入行', + 'insertcol': '前插入列', + 'mergeright': '右合并单元格', + 'mergedown': '下合并单元格', + 'deleterow': '删除行', + 'deletecol': '删除列', + 'splittorows': '拆分成行', + 'splittocols': '拆分成列', + 'splittocells': '完全拆分单元格', + 'mergecells': '合并多个单元格', + 'deletetable': '删除表格', +// 'tablesuper': '表格高级设置', + 'insertparagraphbeforetable': '表格前插行', + 'cleardoc': '清空文档', + 'fontfamily': '字体', + 'fontsize': '字号', + 'paragraph': '格式', + 'image': '图片', + 'inserttable': '表格', + 'link': '超链接', + 'emoticon': '表情', + 'spechars': '特殊字符', + 'searchreplace': '查询替换', + 'map': 'Baidu地图', + 'gmap': 'Google地图', + 'video': '视频', + 'help': '帮助', + 'justifyleft':'居左对齐', + 'justifyright':'居右对齐', + 'justifycenter':'居中对齐', + 'justifyjustify':'两端对齐', + 'forecolor' : '字体颜色', + 'backcolor' : '背景色', + 'insertorderedlist' : '有序列表', + 'insertunorderedlist' : '无序列表', + 'fullscreen' : '全屏', + 'directionalityltr' : '从左向右输入', + 'directionalityrtl' : '从右向左输入', + 'rowspacing' : '行间距', + 'code' : '插入代码', + 'pagebreak':'分页' + }, + iframeUrlMap: { + 'anchor': '~/dialogs/anchor/anchor.html', + 'image': '~/dialogs/image/image.html', + 'inserttable': '~/dialogs/table/table.html', + 'link': '~/dialogs/link/link.html', + 'emoticon': '~/dialogs/emoticon/emoticon.html', + 'spechars': '~/dialogs/spechars/spechars.html', + 'searchreplace': '~/dialogs/searchreplace/searchreplace.html', + 'map': '~/dialogs/map/map.html', + 'gmap': '~/dialogs/gmap/gmap.html', + 'video': '~/dialogs/video/video.html', + 'help': '~/dialogs/help/help.html', + 'code' : '~/dialogs/code/code.html', + 'multimenu': '~/dialogs/menu-emoticon/emoticon.html' + }, + listMap: { + 'fontfamily': ['宋体', '楷体', '隶书', '黑体','andale mono','arial','arial black','comic sans ms','impact','times new roman'], + 'fontsize': [10, 11, 12, 14, 16, 18, 20, 24, 36], + 'underline':['none','overline','line-through','underline'], + 'paragraph': ['p:Paragraph', 'h1:Heading 1', 'h2:Heading 2', 'h3:Heading 3', 'h4:Heading 4', 'h5:Heading 5', 'h6:Heading 6'], + 'rowspacing' : ['1.0:0','1.5:15','2.0:20','2.5:25','3.0:30'] + }, + fontMap: { + '宋体': ['宋体', 'SimSun'], + '楷体': ['楷体', '楷体_GB2312', 'SimKai'], + '黑体': ['黑体', 'SimHei'], + '隶书': ['隶书', 'SimLi'], + 'andale mono' : ['andale mono'], + 'arial' : ['arial','helvetica','sans-serif'], + 'arial black' : ['arial black','avant garde'], + 'comic sans ms' : ['comic sans ms'], + 'impact' : ['impact','chicago'], + 'times new roman' : ['times new roman'] + }, + contextMenu: [ + { + label : '删除', + cmdName : 'delete' + + }, + { + label : '全选', + cmdName : 'selectall' + + },{ + label : '清空文档', + cmdName : 'cleardoc', + exec : function(){ + if(confirm('确定清空文档吗?')){ + this.execCommand('cleardoc'); + } + } + },'-',{ + label : '取消链接', + cmdName : 'unlink' + },'-',{ + group : '段落格式', + icon : 'justifyjustify', + subMenu : [ + { + label: '居左对齐', + cmdName : 'justify', + value : 'left' + }, + { + label: '居右对齐', + cmdName : 'justify', + value : 'right' + },{ + label: '居中对齐', + cmdName : 'justify', + value : 'center' + },{ + label: '两端对齐', + cmdName : 'justify', + value : 'justify' + } + ] + },'-',{ + group : '表格', + icon : 'table', + subMenu : [ + { + label: '删除表格', + cmdName : 'deletetable' + }, + { + label: '表格前插行', + cmdName : 'insertparagraphbeforetable' + }, + '-', + { + label: '删除行', + cmdName : 'deleterow' + }, + { + label: '删除列', + cmdName : 'deletecol' + }, + '-', + { + label: '前插入行', + cmdName : 'insertrow' + }, + { + label: '前插入列', + cmdName : 'insertcol' + }, + '-', + { + label: '右合并单元格', + cmdName : 'mergeright' + }, + { + label: '下合并单元格', + cmdName : 'mergedown' + }, + '-', + { + label: '拆分成行', + cmdName : 'splittorows' + }, + { + label: '拆分成列', + cmdName : 'splittocols' + }, + { + label: '合并多个单元格', + cmdName : 'mergecells' + }, + { + label: '完全拆分单元格', + cmdName : 'splittocells' + } + ] + } + ], + theme:'default', + initialStyle: '', //编辑器内部样式 + initialContent: '欢迎光临编辑器', //初始化编辑器的内容 + autoClearinitialContent :true, //是否自动清除编辑器初始内容 + iframeCssUrl :'../../../themes/iframe.css', //要引入css的url + 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', //配置格式刷删除的属性 + enterTag : 'br', //编辑器回车标签。p或br + maxUndoCount : 20, //最多可以回退的次数 + maxInputCount : 20, //当输入的字符数超过该值时,保存一次现场 + selectedTdClass : 'selectTdClass', //设定选中td的样式名称 + pasteplain : 0, //是否纯文本粘贴。false为不使用纯文本粘贴,true为使用纯文本粘贴 + textarea : 'editorValue', //提交表单时,服务器端接收编辑器内容的名字 + focus : false, //初始化时,是否让编辑器获得焦点true或false + indentValue : '2em', //初始化时,首行缩进距离 + pageBreakTag : '_baidu_page_break_tag_', //分页符 + initialFrameHeight: 400, //最小高度 + autoHeightEnabled: true, //是否自动长高 + elementPathEnabled : false, //是否启用elementPath + serialize : function(){ //配置过滤标签 + function X( t, s, b ) { + var o = {}; + for(var i=0,ai;ai=arguments[i++];){ + for(var k in ai){ + o[k] = ai[k] + } + } + + return o; + } + var inline = {strong:1,em:1,b:1,i:1,u:1,span:1,a:1,img:1}; + var block = X(inline, {p:1,div:1,blockquote:1,$:{style:1,dir:1}}); + return { + blackList: {style:1,script:1,form:1,input:1,textarea:1,iframe:1,"#comment":1} +// , +// whiteList: { +// br: {$:{}}, +// span: X(inline, {$:{style:1,id:1}}), +// strong: inline, +// em:inline, +// b: inline, +// a: X(inline,{$:{href:1,'target':1,title:1}}), +// u: inline, +// div: block, +// p: block, +// ul: {li:1,$:{style:1}}, +// ol: {li:1,$:{style:1}}, +// li: block, +// img: {$:{style:1,width:1,height:1,src:1,alt:1,title:1}} +// } + }; + }() +}; \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/editor_config_src.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/editor_config_src.js new file mode 100644 index 000000000..855d259aa --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/editor_config_src.js @@ -0,0 +1,285 @@ +/** + * ueditor完整配置项 + * 可以在这里配置整个编辑器的特性 + */ +var UEDITOR_CONFIG = { + UEDITOR_HOME_URL: '../', //这里你可以配置成ueditor目录在您网站的绝对路径 + toolbars: [ + ['FullScreen','Source','|','Undo','Redo','|', + 'Bold','Italic','Underline','StrikeThrough','Superscript','Subscript','RemoveFormat','FormatMatch','|', + 'BlockQuote','|', + 'PastePlain','|', + 'ForeColor','BackColor','InsertOrderedList','InsertUnorderedList','|', + 'Paragraph','RowSpacing','FontFamily','FontSize','|', + 'DirectionalityLtr','DirectionalityRtl','|','','Indent','Outdent','|', + 'JustifyLeft','JustifyCenter','JustifyRight','JustifyJustify','|', + 'Link','Unlink','Anchor','Image','MultiMenu','Video','Map','GMap','Code', '|', + 'Horizontal','Date','Time','Spechars','|', + 'InsertTable','DeleteTable','InsertParagraphBeforeTable','InsertRow','DeleteRow','InsertCol','DeleteCol','MergeCells','MergeRight','MergeDown','SplittoCells','SplittoRows','SplittoCols','|', + 'SelectAll','ClearDoc','SearchReplace','Print','Preview','PageBreak','Help','AutoSave','InsertFrame'] + ], + labelMap: { + 'anchor':'锚点', + 'undo': '撤销', + 'redo': '重做', + 'bold': '加粗', + 'indent':'首行缩进', + 'outdent':'取消缩进', + 'italic': '斜体', + 'underline': '下划线', + 'strikethrough': '删除线', + 'subscript': '下标', + 'superscript': '上标', + 'formatmatch': '格式刷', + 'source': '源代码', + 'blockquote': '引用', + 'pasteplain': '纯文本粘贴模式', + 'selectall': '全选', + 'print': '打印', + 'preview': '预览', + 'horizontal': '分隔线', + 'removeformat': '清除格式', + 'time': '时间', + 'date': '日期', + 'unlink': '取消链接', + 'insertrow': '前插入行', + 'insertcol': '前插入列', + 'mergeright': '右合并单元格', + 'mergedown': '下合并单元格', + 'deleterow': '删除行', + 'deletecol': '删除列', + 'splittorows': '拆分成行', + 'splittocols': '拆分成列', + 'splittocells': '完全拆分单元格', + 'mergecells': '合并多个单元格', + 'deletetable': '删除表格', +// 'tablesuper': '表格高级设置', + 'insertparagraphbeforetable': '表格前插行', + 'cleardoc': '清空文档', + 'fontfamily': '字体', + 'fontsize': '字号', + 'paragraph': '格式', + 'image': '图片', + 'inserttable': '表格', + 'link': '超链接', + 'emoticon': '表情', + 'spechars': '特殊字符', + 'searchreplace': '查询替换', + 'map': 'Baidu地图', + 'gmap': 'Google地图', + 'video': '视频', + 'help': '帮助', + 'justifyleft':'居左对齐', + 'justifyright':'居右对齐', + 'justifycenter':'居中对齐', + 'justifyjustify':'两端对齐', + 'forecolor' : '字体颜色', + 'backcolor' : '背景色', + 'insertorderedlist' : '有序列表', + 'insertunorderedlist' : '无序列表', + 'fullscreen' : '全屏', + 'directionalityltr' : '从左向右输入', + 'directionalityrtl' : '从右向左输入', + 'rowspacing' : '行间距', + 'code' : '插入代码', + 'pagebreak':'分页', + 'insertframe':'插入Iframe' + }, + iframeUrlMap: { + 'anchor': '../../../dialogs/anchor/anchor.html', + 'image': '../../../dialogs/image/image.html', + 'inserttable': '../../../dialogs/table/table.html', + 'link': '../../../dialogs/link/link.html', + 'emoticon': '../../../dialogs/emoticon/emoticon.html', + 'spechars': '../../../dialogs/spechars/spechars.html', + 'searchreplace': '../../../dialogs/searchreplace/searchreplace.html', + 'map': '../../../dialogs/map/map.html', + 'gmap': '../../../dialogs/gmap/gmap.html', + 'video': '../../../dialogs/video/video.html', + 'help': '../../../dialogs/help/help.html', + 'code' : '../../../dialogs/code/code.html', + 'multimenu': '../../../dialogs/menu-emoticon/emoticon.html', + 'insertframe': '../../../dialogs/insertframe/insertframe.html' + }, + listMap: { + 'fontfamily': ['宋体', '楷体', '隶书', '黑体','andale mono','arial','arial black','comic sans ms','impact','times new roman'], + 'fontsize': [10, 11, 12, 14, 16, 18, 20, 24, 36], + 'underline':['none','overline','line-through','underline'], + 'paragraph': ['p:Paragraph', 'h1:Heading 1', 'h2:Heading 2', 'h3:Heading 3', 'h4:Heading 4', 'h5:Heading 5', 'h6:Heading 6'], + 'rowspacing' : ['1.0:0','1.5:15','2.0:20','2.5:25','3.0:30'] + }, + fontMap: { + '宋体': ['宋体', 'SimSun'], + '楷体': ['楷体', '楷体_GB2312', 'SimKai'], + '黑体': ['黑体', 'SimHei'], + '隶书': ['隶书', 'SimLi'], + 'andale mono' : ['andale mono'], + 'arial' : ['arial','helvetica','sans-serif'], + 'arial black' : ['arial black','avant garde'], + 'comic sans ms' : ['comic sans ms'], + 'impact' : ['impact','chicago'], + 'times new roman' : ['times new roman'] + }, + contextMenu: [ + { + label : '删除', + cmdName : 'delete' + + }, + { + label : '全选', + cmdName : 'selectall' + + },{ + label : '删除代码', + cmdName : 'highlightcode' + + },{ + label : '清空文档', + cmdName : 'cleardoc', + exec : function(){ + if(confirm('确定清空文档吗?')){ + this.execCommand('cleardoc'); + } + } + },'-',{ + label : '取消链接', + cmdName : 'unlink' + },'-',{ + group : '段落格式', + icon : 'justifyjustify', + subMenu : [ + { + label: '居左对齐', + cmdName : 'justify', + value : 'left' + }, + { + label: '居右对齐', + cmdName : 'justify', + value : 'right' + },{ + label: '居中对齐', + cmdName : 'justify', + value : 'center' + },{ + label: '两端对齐', + cmdName : 'justify', + value : 'justify' + } + ] + },'-',{ + group : '表格', + icon : 'table', + subMenu : [ + { + label: '删除表格', + cmdName : 'deletetable' + }, + { + label: '表格前插行', + cmdName : 'insertparagraphbeforetable' + }, + '-', + { + label: '删除行', + cmdName : 'deleterow' + }, + { + label: '删除列', + cmdName : 'deletecol' + }, + '-', + { + label: '前插入行', + cmdName : 'insertrow' + }, + { + label: '前插入列', + cmdName : 'insertcol' + }, + '-', + { + label: '右合并单元格', + cmdName : 'mergeright' + }, + { + label: '下合并单元格', + cmdName : 'mergedown' + }, + '-', + { + label: '拆分成行', + cmdName : 'splittorows' + }, + { + label: '拆分成列', + cmdName : 'splittocols' + }, + { + label: '合并多个单元格', + cmdName : 'mergecells' + }, + { + label: '完全拆分单元格', + cmdName : 'splittocells' + } + ] + } + ], + initialStyle: '', //编辑器内部样式 + initialContent: 'hello', //初始化编辑器的内容 + autoClearinitialContent :true, //是否自动清除编辑器初始内容 + iframeCssUrl :'../../../themes/iframe.css', //要引入css的url + 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', //配置格式刷删除的属性 + enterTag : 'p', //编辑器回车标签。p或br + maxUndoCount : 20, //最多可以回退的次数 + maxInputCount : 20, //当输入的字符数超过该值时,保存一次现场 + selectedTdClass : 'selectTdClass', //设定选中td的样式名称 + pasteplain : 0, //是否纯文本粘贴。false为不使用纯文本粘贴,true为使用纯文本粘贴 + textarea : 'editorValue', //提交表单时,服务器端接收编辑器内容的名字 + focus : false, //初始化时,是否让编辑器获得焦点true或false + indentValue : '2em', //初始化时,首行缩进距离 + pageBreakTag : '_baidu_page_break_tag_', //分页符 + autoSave:true, //是否开启自动保存 + autoSavePath:this.UEDITOR_HOME_URL+'auto-save.php', //自动保存的地址 + autoSaveFrequency:5, //自动保存频率 + minFrameHeight: 320, //最小高度 + autoHeightEnabled: true, //是否自动长高 + autoFloatEnabled: true, //是否保持toolbar的位置不动 + elementPathEnabled : true, //是否启用elementPath + serialize : function(){ //配置过滤标签 + function X( t, s, b ) { + var o = {}; + for(var i=0,ai;ai=arguments[i++];){ + for(var k in ai){ + o[k] = ai[k] + } + } + + return o; + } + var inline = {strong:1,em:1,b:1,i:1,u:1,span:1,a:1,img:1}; + var block = X(inline, {p:1,div:1,blockquote:1,$:{style:1,dir:1}}); + return { + blackList: {style:1,script:1,form:1,input:1,textarea:1,"#comment":1} +// , +// whiteList: { +// br: {$:{}}, +// span: X(inline, {$:{style:1,id:1}}), +// strong: inline, +// em:inline, +// b: inline, +// a: X(inline,{$:{href:1,'target':1,title:1}}), +// u: inline, +// div: block, +// p: block, +// ul: {li:1,$:{style:1}}, +// ol: {li:1,$:{style:1}}, +// li: block, +// img: {$:{style:1,width:1,height:1,src:1,alt:1,title:1}} +// } + }; + }() +}; \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/import.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/import.js new file mode 100644 index 000000000..84a404095 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/import.js @@ -0,0 +1,119 @@ + +///import editor; +///import core/browser; +///import core/utils; +///import core/EventBase; +///import core/dtd; +///import core/domUtils; +///import core/Range; +///import core/Selection; +///import core/Editor; +///import core/Editor.defaultoptions; +///import core/loadconfig; +///import core/ajax; +///import core/filterword; +///import core/node; +///import core/htmlparser; +///import core/filternode; +///import core/plugin; +///import core/keymap; +///import core/localstorage; +///import plugins/defaultfilter; +///import plugins/inserthtml; +///import plugins/autotypeset; +///import plugins/background; +///import plugins/image; +///import plugins/justify; +///import plugins/font; +///import plugins/link; +///import plugins/iframe; +///import plugins/scrawl; +///import plugins/removeformat; +///import plugins/blockquote; +///import plugins/convertcase; +///import plugins/indent; +///import plugins/preview; +///import plugins/selectall; +///import plugins/paragraph; +///import plugins/directionality; +///import plugins/horizontal; +///import plugins/time; +///import plugins/rowspacing; +///import plugins/lineheight; +///import plugins/insertcode; +///import plugins/cleardoc; +///import plugins/anchor; +///import plugins/wordcount; +///import plugins/pagebreak; +///import plugins/wordimage; +///import plugins/dragdrop; +///import plugins/undo; +///import plugins/copy; +///import plugins/paste; +///import plugins/puretxtpaste; +///import plugins/list; +///import plugins/source; +///import plugins/enterkey; +///import plugins/keystrokes; +///import plugins/fiximgclick; +///import plugins/autolink; +///import plugins/autoheight; +///import plugins/autofloat; +///import plugins/video; +///import plugins/table.core; +///import plugins/table.cmds; +///import plugins/table.action; +///import plugins/table.sort; +///import plugins/contextmenu; +///import plugins/shortcutmenu; +///import plugins/basestyle; +///import plugins/elementpath; +///import plugins/formatmatch; +///import plugins/searchreplace; +///import plugins/customstyle; +///import plugins/catchremoteimage; +///import plugins/snapscreen; +///import plugins/insertparagraph; +///import plugins/webapp; +///import plugins/template; +///import plugins/music; +///import plugins/autoupload; +///import plugins/autosave; +///import plugins/charts; +///import plugins/section; +///import plugins/serverparam; + + +///import ui/ui; +///import ui/uiutils; +///import ui/uibase; +///import ui/toolbar; +///import ui/editor; +///import ui/editorui; +///import ui/stateful; +///import ui/button; +///import ui/splitbutton; +///import ui/popup; +///import ui/colorpicker; +///import ui/colorbutton; +///import ui/cellalignpicker; +///import ui/pastepicker; +///import ui/menu; +///import ui/menubutton; +///import ui/multiMenu; +///import ui/combox; +///import ui/colorpicker; +///import ui/mask; +///import ui/dialog; +///import ui/separator; +///import ui/tablepicker; +///import ui/tablebutton; +///import ui/autotypesetpicker; +///import ui/autotypesetbutton; +///import ui/shortcutmenu; +///import ui/message; + +///import adapter/editor; +///import adapter/editorui; +///import adapter/message; +///import adapter/autosave; diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/index.php b/nezha-fronted/static/ueditor-1.4.3.3/_test/index.php new file mode 100644 index 000000000..8dc8f7d47 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/index.php @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/anchor.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/anchor.js new file mode 100644 index 000000000..87666d488 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/anchor.js @@ -0,0 +1,91 @@ +module( 'plugins.anchor' ); + +test( '插入锚点后切换源码', function() { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + stop(); + var br = baidu.editor.browser.ie ? ' ' : '
    '; //1.2版本,ie中‘’-〉' ' + setTimeout( function() { + editor.setContent( '

    ' + br + '

    ' ); + range.setStart( body.firstChild, 0 ).collapse( 1 ).select(); + editor.execCommand( 'anchor', 'hello' ); + ua.checkHTMLSameStyle( '' + br, editor.document, body.firstChild, '检查锚点html' ); //1.2版本后,在img前有的不可见字符没有删去,这里改成之比较img内的内容 + ok(body.getElementsByTagName('img')[0].attributes['anchorname'].nodeValue=="hello"&&body.getElementsByTagName('img')[0].attributes['class'].nodeValue=="anchorclass",'检查锚点'); + editor.execCommand( 'source' ); /*切到源码模式下会有一个超时*/ + setTimeout( function() { + var tas = editor.iframe.parentNode.getElementsByTagName( 'textarea' ); + if(ua.browser.webkit){ + ok( editor.iframe.nextSibling.textContent.indexOf( '

    ')||(tas[0].value=='

    '),'检查源码');*/ + editor.execCommand( 'source' ); + ua.checkHTMLSameStyle( '' + br, editor.document, body.firstChild, '检查锚点html' ); + setTimeout( function() { + start(); + }, 500 ); + }, 200); + }, 20 ); +} ); + +test( '在源码模式设置超链接的name属性,切换到编辑器模式检查超链接是否变为锚点', function() { + var editor = te.obj[0]; + var body = editor.body; + stop(); + setTimeout(function(){ + editor.setContent( '' ); + setTimeout( function() { + editor.execCommand( 'source' ); + setTimeout( function() { + var ta = editor.iframe.parentNode.getElementsByTagName( 'textarea' )[0]; + ta.value = '

    '; /*这种情况认为是锚点*/ + setTimeout( function() { + editor.execCommand( 'source' ); + ua.checkHTMLSameStyle( '', editor.document, body.firstChild, '检查锚点html' ); + start(); + }, 100 ); + }, 100 ); + }, 100 ); + },100); +} ); + +test( '在源码模式设置超链接没有name属性,切换到编辑器模式检查超链接不变为锚点', function() { + var editor = te.obj[0]; + editor.setContent( '' ); + var body = editor.body; + stop(); + setTimeout( function() { + editor.execCommand( 'source' ); + setTimeout( function() { + var ta = editor.iframe.parentNode.getElementsByTagName( 'textarea' )[0]; + ta.value = '

    你好

    '; + setTimeout( function() { + editor.execCommand( 'source' ); + ua.manualDeleteFillData(editor.body); +// equal( body.firstChild.firstChild.tagName.toLowerCase(), 'a', 'a标签不会转化' ); + equal( body.firstChild.lastChild.tagName.toLowerCase(), 'a', 'a标签不会转化' ); //兼容opera + start(); + }, 50 ); + }, 10 ); + }, 20 ); +} ); + +test( '已存在锚点', function() { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + var br = baidu.editor.browser.ie ? ' ' : '
    '; + editor.setContent( '

    ' ); + range.selectNode(body.firstChild).select(); + editor.execCommand( 'anchor', 'hello' ); + var name=body.firstChild.firstChild.getAttribute('anchorname'); + equal(name, 'hello', '更改name'); + editor.setContent( '

    ' ); + range.selectNode(body.firstChild).select(); + editor.execCommand( 'anchor'); + equal(ua.getChildHTML(editor.body),'

    ','去掉锚点'); +} ); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/auto.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/auto.js new file mode 100644 index 000000000..eeba5ac8c --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/auto.js @@ -0,0 +1,21 @@ +/** + * Created by JetBrains PhpStorm. + * User: lisisi01 + * Date: 12-11-8 + * Time: 下午3:37 + * To change this template use File | Settings | File Templates. + */ +module( 'plugins.autosubmit' ); + +//这个插件是针对非ie的,单测用例同样只针对非ie,仍需手动测试检验ie与非ie下效果是否一致 +test( '输入超链接后回车', function() { + var form = document.body.appendChild( document.createElement( 'form' ) ); + var editor = new baidu.editor.Editor({'initialContent':'

    欢迎使用ueditor

    ','autoFloatEnabled':false}); + editor.render(form); +// form.body.appendChild(editor); + editor.focus(); + var range = new baidu.editor.dom.Range( editor.document ); + range.setStart(editor.body.firstChild.firstChild,1).collapse(true).select(); + editor.execCommand('autosubmit'); + equal(editor.textarea.value,'

    欢迎使用ueditor

    ',''); +} ); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/autofloat.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/autofloat.js new file mode 100644 index 000000000..3cb4d89bb --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/autofloat.js @@ -0,0 +1,47 @@ +/** + * Created by JetBrains PhpStorm. + * User: dongyancen + * Date: 12-9-18 + * Time: 下午4:33 + * To change this template use File | Settings | File Templates. + */ +module( 'plugins.autofloat' ); +test( '检查toolbar是否浮动在页面顶端', function() { + te.dom[0].parentNode.removeChild(te.dom[0]); + var sc = document.createElement("script"); + sc.id="sc"; + sc.type = "text/plain"; + sc.style.height = "100px"; + document.body.appendChild(sc); + var me = UE.getEditor('sc',{'autoFloatEnabled':true,'topOffset':60,'autoHeightEnabled':true,'scaleEnabled':false}); + stop(); + me.ready(function(){ + setTimeout(function () { + me.setContent('














































    sdf

    '); + var screenX = window.screenX ? window.screenX : window.screenLeft;//不同浏览器兼容 + var screenY = window.screenY ? window.screenY : window.screenTop; + setTimeout(function () { + var range = new baidu.editor.dom.Range(me.document); + range.setStart(me.body.firstChild, 1).collapse(1).select(); + me.focus(); + setTimeout(function () { + window.scrollBy(screenX, screenY + $(document.body).height()); + setTimeout(function () { + var scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;//不同浏览器兼容 +//// //ie6下,工具栏浮动不到正确位置 + if (ua.browser.ie != 6&&!ua.browser.gecko) + equal(scrollTop, $(me.ui.getDom('toolbarbox')).offset().top - 60, '检查toolbar是否在页面顶端'); + window.scrollTo(screenX, screenY - $(document.body).height()); + setTimeout(function () { + equal(me.ui.getDom().childNodes[0].id, me.ui.getDom('toolbarbox').id, 'toolbar是第一个元素'); + document.getElementById('sc').parentNode.removeChild(document.getElementById('sc')); + start(); + }, 500); + }, 500); + }, 1000); + }, 200); + }, 800); + }); + +}); + diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/autoheight.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/autoheight.js new file mode 100644 index 000000000..11de0b8cc --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/autoheight.js @@ -0,0 +1,28 @@ +module('plugins.autoheight'); + +test('自动长高',function(){ + var sc = document.createElement("script"); + sc.id="sc"; + sc.type = "text/plain"; + document.body.appendChild(sc); + var editor = new UE.ui.Editor({'autoFloatEnabled':true,'topOffset':60,'autoHeightEnabled':true,'scaleEnabled':false}); + editor.render('sc'); + te.dom[0].parentNode.removeChild(te.dom[0]); + stop(); + setTimeout(function(){ + var height=editor.body.style.height; + editor.setContent('
    nmnmknmm,






















    '); + setTimeout(function(){ + ok(height!=editor.body.style.height,'自动长高'); + editor.disableAutoHeight(); + editor.body.style.height=height; + editor.setContent('
























    '); + stop(); + setTimeout(function(){ + ok(height==editor.body.style.height,'不长高'); + + start(); + },200); + },200); + },800); +}); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/autolink.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/autolink.js new file mode 100644 index 000000000..b13f5a735 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/autolink.js @@ -0,0 +1,364 @@ +module('plugins.autolink'); + + +//test('', function () { +// stop() +//}); +//自动添加的功能是针对非ie的,单测用例同样只针对非ie,仍需手动测试检验ie与非ie下效果是否一致 +test('输入超链接后回车', function () { + if (!ua.browser.ie) { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent('

    http://www.baidu.com

    '); + stop(); + setTimeout(function () { + range.setStart(body.firstChild.firstChild, body.firstChild.firstChild.length).collapse(1).select(); + setTimeout(function () { + ua.keydown(editor.body, {'keyCode': 13}); + ua.keyup(editor.body, {'keyCode': 13}); + var a = body.firstChild.getElementsByTagName('a')[0]; + if(a){ + equal(ua.getChildHTML(a), 'http://www.baidu.com', '检查a的内容'); + ok(a && $(a).attr('href').indexOf('http://www.baidu.com') != -1, '检查a的href'); + ok(a && $(a).attr('_src').indexOf('http://www.baidu.com') != -1, '检查a的_src'); + }else{ + var text = editor.getContent(); + equal(text, '

    http://www.baidu.com

    ', '检查p的内容'); + } + start(); + }, 20); + }, 20); + } +}); + +test('输入超链接后按空格', function () { + if (!ua.browser.ie) { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + setTimeout(function () { + editor.setContent('

    http://www.baidu.com

    '); + range.setStart(body.firstChild, 1).collapse(1).select(); + ua.keydown(editor.body, {'keyCode': 32}); + setTimeout(function () { + var a = body.firstChild.getElementsByTagName('a')[0]; + if(a){ + equal(ua.getChildHTML(a), 'http://www.baidu.com', '检查a的内容'); + ok(a && $(a).attr('href').indexOf('http://www.baidu.com') != -1, '检查a的href'); + ok(a && $(a).attr('_src').indexOf('http://www.baidu.com') != -1, '检查a的_src'); + }else{ + var text = editor.getContent(); + equal(text, '

    http://www.baidu.com

    ', '检查p的内容'); + } + start(); + }, 20); + }, 20); + stop(); + } +}); + +test('字符前面有内容', function () { + if (!ua.browser.ie) { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent('

    http://www.baidu.com

    '); + range.setStart(body.firstChild, 2).collapse(1).select(); + stop(); + setTimeout(function () { + ua.keydown(editor.body, {'keyCode': 32}); + setTimeout(function () { + var a = body.firstChild.getElementsByTagName('a')[0]; + if(a){ + ok(a && $(a).attr('href').indexOf('http://www.baidu.com') != -1, '检查a的href'); + var html = 'http://www.baidu.com'; + equal(ua.getChildHTML(a), 'http://www.baidu.com', '检查a的内容'); + }else{ + var x= body.firstChild.firstChild.nextSibling.innerHTML; + equal(x, 'http://www.baidu.com', '检查a的内容'); + } + start(); + }, 20); + }, 20); + } +}); + +test('在p后面回车', function () { + if (!UE.browser.ie) { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent('

    www.baidu.com

    '); + setTimeout(function () { + range.setStart(body.firstChild, 1).collapse(1).select(); + ua.keydown(editor.body, {'keyCode': 13}); + setTimeout(function () { + var a = body.firstChild.getElementsByTagName('a')[0]; + if(a){ + ok(a && $(a).attr('href').indexOf('http://www.baidu.com') != -1, '检查a的href'); + equal(ua.getChildHTML(a), 'www.baidu.com', '检查a的内容'); + }else{ + var p =body.firstChild.innerHTML; + equal(p,'www.baidu.com', '检查a的内容'); + } + start(); + }, 20); + }, 20); + stop(); + } +}); +///*trace 1709 在“你好http://www.baidu.com”后回车/空格,各浏览器表现不一致*/ +////这种情况,在ie中可以生成自动连接,非ie不可,现在以生成连接为期望结果 +test('trace 1709 在与其他文本相连的链接后空格', function () { + if (!UE.browser.ie) { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent('

    你好http://www.baidu.com

    '); + setTimeout(function () { + range.setStart(body.firstChild, 1).collapse(1).select(); + ua.keydown(editor.body, {'keyCode': 32}); + setTimeout(function () { + var a = body.firstChild.getElementsByTagName('a')[0]; + if(a){ + equal(ua.getChildHTML(a), 'http://www.baidu.com', '检查a的内容'); + ok(a && $(a).attr('href').indexOf('http://www.baidu.com') != -1, '检查a的href'); + }else{ + var p =body.firstChild.innerHTML; + equal(p,'你好http://www.baidu.com', '检查a的内容'); + } + start(); + }, 20); + }, 20); + stop(); + } +}); +////修改:对P中的文字内容,原:

    你好htp://ww.baidu.com

    +test('你好htp://ww.baidu.com 后面回车', function () { + if (!UE.browser.ie) { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent('

    你好http://www.baidu.com

    '); + setTimeout(function () { + range.setStart(body.firstChild, 1).collapse(1).select(); + ua.keydown(editor.body, {'keyCode': 32}); + setTimeout(function () { + equal(body.firstChild.firstChild.nodeValue, '你好', '你好http://www.baidu.com 转换成文字+超链接'); + var a = body.firstChild.getElementsByTagName('a')[0]; + if(a){ + equal(ua.getChildHTML(a), 'http://www.baidu.com', '检查a的内容'); + ok(a && $(a).attr('href').indexOf('http://www.baidu.com') != -1, '检查a的href'); + }else{ + var p =body.firstChild.innerHTML; + equal(p,'你好http://www.baidu.com', '检查a的内容'); + } + start(); + }, 20); + }, 20); + stop(); + } +}); +//

    欢迎使用ueditor!

    +test('trace 2121', function () { + if (!UE.browser.ie) { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent('

    欢迎使用ueditor!www.baidu.com

    '); + stop(); + setTimeout(function () { + range.setStart(body.firstChild.lastChild, body.firstChild.lastChild.length).collapse(1).select(); + setTimeout(function () { + ua.keydown(editor.body, {'keyCode': 13}); + var a = body.firstChild.getElementsByTagName('a')[0]; + if(a){ + equal(ua.getChildHTML(a), 'www.baidu.com', '检查a的内容'); + ok(a && $(a).attr('href').indexOf('http://www.baidu.com') != -1, '检查a的href'); + ok(a && $(a).attr('_src').indexOf('http://www.baidu.com') != -1, '检查a的_src'); + }else{ + var p = body.firstChild.innerHTML; + equal(p,'欢迎使用ueditor!www.baidu.com','内容未改变'); + } + start(); + }, 20); + }, 20); + } +}); +test('autofloat:false 禁用IE中的自动加超链接功能', function () { + if(ua.browser.ie==8)return; + //在IE中回车/空格自动加连接,这里模拟加连接以后,测试keyup时把添加的链接去掉 + if (ua.browser.ie>8) {//这个用例中,ie8不好模拟startContainer.nodeName = p,用下面的用例测是一样的 + var div = document.body.appendChild(document.createElement('div')); + div.id = 'ue'; + var editor = UE.getEditor('ue', {autolink: false}); + editor.ready(function () { + var range = new baidu.editor.dom.Range(editor.document); + var body = editor.body; + editor.body.innerHTML = '

    www.baidu.com

     

    '; + setTimeout(function () { + range.selectNode(body.lastChild.firstChild).select(); + setTimeout(function () { + ua.keyup(editor.body, {'keyCode': 13}); + setTimeout(function () { + equal(body.firstChild.getElementsByTagName('a').length, 0, 'a 标签被去掉了'); + equal(body.childNodes.length, 2, '结果正确'); + equal(body.firstChild.tagName.toLowerCase(), 'p', '结果正确'); + equal(body.firstChild.innerHTML, 'www.baidu.com', '结果正确'); + UE.delEditor('ue'); + te.dom.push(document.getElementById('ue')); + start(); + }, 60); + }, 20); + }, 20); + }); + stop(); + } +}); +test('autofloat:false 禁用IE中的自动加超链接功能--回车', function () { + if(ua.browser.ie==8)return; + //在IE中回车/空格自动加连接,这里模拟加连接以后,测试keyup时把添加的链接去掉 + if (ua.browser.ie) { + var div = document.body.appendChild(document.createElement('div')); + div.id = 'ue'; + var editor = UE.getEditor('ue', {autolink: false}); + editor.ready(function () { + var range = new baidu.editor.dom.Range(editor.document); + var body = editor.body; + editor.body.innerHTML = '

    www.baidu.com

    '; + setTimeout(function () { + range.selectNode(body.lastChild.firstChild).select(); + setTimeout(function () { + ua.keyup(editor.body, {'keyCode': 13}); + setTimeout(function () { + equal(body.firstChild.getElementsByTagName('a').length, 0, 'a 标签被去掉了'); + equal(body.childNodes.length, 2, '结果正确'); + equal(body.firstChild.tagName.toLowerCase(), 'p', '结果正确'); + equal(body.firstChild.innerHTML, 'www.baidu.com', '结果正确'); + UE.delEditor('ue'); + te.dom.push(document.getElementById('ue')); + start(); + }, 60); + }, 20); + }, 20); + }); + stop(); + } +}); + +test('autofloat:false 禁用IE中的自动加超链接功能--空格', function () { + if(ua.browser.ie==8)return; + //在IE中回车/空格自动加连接,这里模拟加连接以后,测试keyup时把添加的链接去掉 + if (ua.browser.ie) { + var div = document.body.appendChild(document.createElement('div')); + div.id = 'ue'; + var editor = UE.getEditor('ue', {autolink: false}); + editor.ready(function () { + var range = new baidu.editor.dom.Range(editor.document); + var body = editor.body; + var space = ua.browser.ie>8?' ':' '; + editor.body.innerHTML = '

    www.baidu.com'+space+'

    '; + setTimeout(function () { +// if(ua.browser.ie>8){ +// range.setStart(body.firstChild.childNodes[1], 1).collapse(true).select(); +// } +// else{ + range.selectNode(body.firstChild.childNodes[1]).select(); +// } + setTimeout(function () { + ua.keyup(editor.body, {'keyCode': 32}); + equal(body.firstChild.getElementsByTagName('a').length, 0, 'a 标签被去掉了'); + equal(body.childNodes.length, 1, '结果正确'); + equal(body.firstChild.tagName.toLowerCase(), 'p', '结果正确'); + equal(body.firstChild.innerHTML.toLowerCase(), 'www.baidu.com'+space+'', '结果正确'); + setTimeout(function () { + UE.delEditor('ue'); + te.dom.push(document.getElementById('ue')); + start(); + }, 100); + }, 20); + }, 20); + }); + stop(); + } +}); +//对于手动添加的,不会误删 +test('autofloat:false 禁用IE中的自动加超链接功能--对于手动添加的,不会误删', function () { + //在IE中回车/空格自动加连接,这里模拟加连接以后,测试keyup时把添加的链接去掉 + if (ua.browser.ie) { + var div = document.body.appendChild(document.createElement('div')); + div.id = 'ue'; + var editor = UE.getEditor('ue', {autolink: false}); + editor.ready(function () { + var range = new baidu.editor.dom.Range(editor.document); + var body = editor.body; + var space = ua.browser.ie>8?' ':' '; + editor.setContent('

    www.baidu.com'+space+'

    '); + setTimeout(function () { + if(ua.browser.ie>8){ + range.setStart(body.firstChild.childNodes[1], 1).collapse(true).select(); + } + else{ + range.selectNode(body.firstChild.childNodes[1]).select(); + } + setTimeout(function () { + ua.keyup(editor.body, {'keyCode': 32}); + var a = body.firstChild.getElementsByTagName('a'); + ok(a&&a.length==1, 'a 标签没去掉'); + ok(a[0] && $(a[0]).attr('href').indexOf('http://www.baidu.com') != -1, '检查a的href'); + setTimeout(function () { + editor.execCommand('cleardoc'); + editor.setContent('

    www.baidu.com

    '); + setTimeout(function () { + range.selectNode(body.lastChild.firstChild).select(); + setTimeout(function () { + ua.keyup(editor.body, {'keyCode': 13}); + setTimeout(function () { + a = body.firstChild.getElementsByTagName('a'); + ok(a&&a.length==1, 'a 标签没去掉'); + ok(a[0] && $(a[0]).attr('href').indexOf('http://www.baidu.com') != -1, '检查a的href'); + UE.delEditor('ue'); + te.dom.push(document.getElementById('ue')); + start(); + }, 500); + }, 20); + }, 20); + }, 20); + }, 20); + }, 20); + }); + stop(); + } +}); +//test( '粘贴进来的http文本后回车', function() { +// var editor = te.obj[0]; +// var range = te.obj[1]; +// var body = editor.body; +// setTimeout( function() { +// editor.setContent( '


    ' ); +// editor.focus(); +// range.setStart( body.firstChild, 0 ).collapse( 1 ).select(); +// te.setClipData( "http://www.google.com" ); +// setTimeout( function() { +// editor.focus(); +// setTimeout( function() { +// editor.focus(); +// te.presskey( "ctrl", "v" ); +// editor.focus(); +// setTimeout( function() { +// te.presskey( "enter", "" ); +// editor.focus(); +// setTimeout( function() { +// var a = body.firstChild.getElementsByTagName( 'a' )[0]; +// equal( ua.getChildHTML( a ), 'http://www.google.com', '检查a的内容' ); +// start(); +// }, 100 ); +// +// }, 100 ); +// }, 100 ); +// }, 100 ); +// } ); +// stop(); +//} ); +// diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/autosave.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/autosave.js new file mode 100644 index 000000000..79b478aa6 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/autosave.js @@ -0,0 +1,104 @@ +module('plugins.autosave'); + +test('自动保存', function () { + + expect(8); + + var container = te.obj[0].container, + editor = null, + count = 0; + + UE.delEditor(te.obj[0]); + container.parentNode.removeChild(container); + + container = document.createElement("div"); + container.id = "container"; + document.body.appendChild(container); + editor = UE.getEditor("container", { + initialContent: "", + //无限制 + saveInterval: 0 + }); + + + editor.addListener("beforeautosave", function (type, data) { + + data.content = data.content.toLowerCase(); + equal(true, true, "成功触发beforeautosave事件"); + equal(data.content === "

    http://www.baidu.com

    " || data.content === "

    disable

    ", true, "事件携带数据正确"); + }); + + editor.addListener("beforeautosave", function (type, data) { + + data.content = data.content.toLowerCase(); + if (data.content === "

    disable

    ") { + return false; + } + + count++; + + }); + + editor.addListener("afterautosave", function (type, data) { + + data.content = data.content.toLowerCase(); + equal(data.content, "

    http://www.baidu.com

    ", "成功触发afterautosave事件"); + + equal(editor.execCommand("getlocaldata") !== null, true, "getlocaldata命令正常"); + editor.execCommand("clearlocaldata"); + equal(editor.execCommand("getlocaldata") === "", true, "clearlocaldata命令正常"); + + }); + + stop(); + window.setTimeout(function () { + + editor.setContent('

    disable

    '); + + + window.setTimeout(function () { + + editor.setContent('

    http://www.baidu.com

    '); + + window.setTimeout(function () { + + equal(count, 1, "触发事件次数"); + + start(); + }, 500); + + UE.delEditor("container"); + container.parentNode.removeChild(container); + + }, 50); + + }, 500); + +}); +test('重建编辑器,加载草稿箱', function () { + UE.delEditor(te.obj[0]); + te.obj[0].container.parentNode.removeChild(te.obj[0].container); + var div = document.body.appendChild(document.createElement('div')); + div.id = 'ue'; + var editor = UE.getEditor('ue', {saveInterval: 0}); + setTimeout(function () { + var content = '

    内容

    '; + editor.setContent(content); + setTimeout(function () { + UE.delEditor('ue'); + document.getElementById('ue') && document.getElementById('ue').parentNode.removeChild(document.getElementById('ue')); + var div = document.body.appendChild(document.createElement('div')); + div.id = 'ue'; + var editor2 = UE.getEditor('ue'); + setTimeout(function () { + equal(editor2.queryCommandState('drafts'), 0, '草稿箱可用'); + editor2.execCommand('drafts'); + ua.checkSameHtml(editor2.body.innerHTML, content, '内容加载正确'); + UE.delEditor('ue'); + document.getElementById('ue') && document.getElementById('ue').parentNode.removeChild(document.getElementById('ue')); + start(); + }, 500); + }, 200); + }, 500); + stop(); +}); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/autotypeset.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/autotypeset.js new file mode 100644 index 000000000..4d55c5085 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/autotypeset.js @@ -0,0 +1,228 @@ +module('plugins.autotypeset'); + +test('全角半角转换',function(){ + window.localStorage.clear(); + var editor = te.obj[0]; + editor.setContent('

    Mayday123,.Mayday123,.

    '); + var text = editor.getContent(); + equal(text,'

    Mayday123,.Mayday123,.

    ','半角全角内容输入正确'); + editor.execCommand('autotypeset'); + var text2 = editor.body.firstChild.innerHTML; + equal(text2,'Mayday123,.Mayday123,.','半角全角内容输入正确2'); + editor.options.autotypeset.tobdc=true; + editor.execCommand('autotypeset'); + equal(editor.body.firstChild.innerHTML,'Mayday123,.Mayday123,.','内容转为全角:正确'); + editor.options.autotypeset.tobdc=false; + editor.setContent('

    Mayday123,.Mayday123,.

    '); + editor.options.autotypeset.bdc2sb=true; + editor.execCommand('autotypeset'); + equal(editor.body.firstChild.innerHTML,'Mayday123,.Mayday123,.','内容转为半角:正确'); + editor.options.autotypeset.bdc2sb=false; +}); +//todo +test('文本居中',function(){ + var editor = te.obj[0]; + editor.setContent('

    p文本

    '); + setTimeout(function(){ + editor.options.autotypeset.textAlign = 'center'; + editor.execCommand('autotypeset'); + equal($(editor.body.firstChild).css('text-align'),'center','文本居中'); + start(); + }, 100 ); + stop(); +}); + +test('trace:2183 h1标题居中',function(){ + var editor = te.obj[0]; + editor.setContent('

    h1标题

    '); + setTimeout(function(){ + editor.options.autotypeset.textAlign = 'center'; + editor.execCommand('autotypeset'); + equal($(editor.body.firstChild).css('text-align'),'center','h1标题居中'); + start(); + }, 50 ); + stop(); +}); + +test('合并空行',function(){ + var editor = te.obj[0]; + editor.setContent('

    欢迎使用



    ueditor!

    '); + setTimeout(function(){ + editor.options.autotypeset.mergeEmptyline = true; + delete editor.options.autotypeset.textAlign; + editor.execCommand('autotypeset'); + ua.manualDeleteFillData(editor.body); + var html =editor.body.innerHTML.toLowerCase().replace(/\r\n/ig,''); + equal(html,'

    欢迎使用


    ueditor!

    ','合并空行'); + start(); + }, 50 ); + stop(); +}); + +test('带有图片表情',function(){ + var editor = te.obj[0]; + editor.setContent('

    欢迎使用ueditor!

    '); + editor.execCommand('autotypeset'); + equal($(editor.body.lastChild).css('text-align'),'center','图片居中'); + editor.options.autotypeset.imageBlockLine = 'left'; + editor.execCommand('autotypeset'); + equal($(editor.body.lastChild).css('text-align'),'left','图片居左'); +}); + +test('删除空行',function(){ + var editor = te.obj[0]; + editor.setContent('

    欢迎使用



    ueditor!

    '); + setTimeout(function(){ + editor.options.autotypeset.mergeEmptyline = false;//removeEmptyline + editor.options.autotypeset.removeEmptyline = true; + delete editor.options.autotypeset.textAlign; + editor.execCommand('autotypeset'); + ua.manualDeleteFillData(editor.body); + equal(editor.body.innerHTML.toLowerCase().replace(/\r\n/ig,''),'

    欢迎使用

    ueditor!

    ','删除空行'); + start(); + }, 50 ); + stop(); +}); + +test('首行缩进',function(){ + var editor = te.obj[0]; + editor.setContent('

    欢迎使用ueditor!

    '); + setTimeout(function(){ + editor.options.autotypeset.indent = true; + editor.options.autotypeset.textAlign= "left"; + editor.execCommand('autotypeset'); + ua.manualDeleteFillData(editor.body); + var html = '

    欢迎使用ueditor!

    '; + ua.checkHTMLSameStyle(html ,editor.document,editor.body,'首行缩进'); + start(); + }, 50 ); + stop(); +}); + +/*trace 2650*/ +test( 'trace 3277:图像对齐', function () { + var editor = te.obj[0]; + editor.setContent( '

    ' ); + setTimeout(function(){ + editor.options.autotypeset.imageBlockLine = 'center'; + delete editor.options.autotypeset.textAlign;//imageBlockLine + var html= '

    '; + editor.execCommand('autotypeset'); + ua.checkHTMLSameStyle(html ,editor.document,editor.body,'图像对齐'); + start(); + }, 50 ); + stop(); +} ); + +//ie下 +test('trace 2651:字体样式',function(){ + var editor = te.obj[0]; + editor.setContent('

    欢迎使用ueditor!

    '); + setTimeout(function(){ + editor.options.autotypeset.clearFontSize = editor.options.autotypeset.clearFontFamily = true; + delete editor.options.autotypeset.textAlign; + editor.execCommand('autotypeset'); + equal(ua.getChildHTML(editor.body),'

    欢迎使用ueditor!

    ','恢复字体默认样式'); + start(); + }, 50 ); + stop(); +}); + +test('去掉class,去掉多余节点',function(){ + var editor = te.obj[0]; + editor.setContent('

    欢迎使用ueditor!

    '); + editor.options.autotypeset.removeClass = true; + delete editor.options.autotypeset.textAlign; + editor.execCommand('autotypeset'); + equal(ua.getChildHTML(editor.body),'

    欢迎使用ueditor!

    ','去掉class'); +}); + +test('粘贴过滤',function(){ + var div = document.body.appendChild(document.createElement('div')); + var editor = te.obj[0]; + editor.setContent(''); + editor.options.autotypeset.pasteFilter = true; + editor.options.autotypeset.removeEmptyline = true; + delete editor.options.autotypeset.textAlign; + editor.execCommand('autotypeset'); + var html ={html:'hello1'}; + editor.fireEvent('beforepaste',html); + editor.execCommand( 'insertHtml',html.html,true); + editor.fireEvent("afterpaste"); + var txt='

    hello1'; + ua.checkHTMLSameStyle(txt, editor.document, editor.body, '文字左对齐,表情居中'); + + editor.setContent(''); + editor.options.autotypeset.imageBlockLine = 'none'; + editor.options.autotypeset.textAlign = 'center'; + editor.options.autotypeset.removeEmptyline = true; + editor.options.autotypeset.pasteFilter = true; + editor.execCommand('autotypeset'); + html ={html:'

    hello1

    hello2

    '}; + editor.fireEvent('beforepaste',html); + editor.execCommand( 'insertHtml',html.html,true); + editor.fireEvent("afterpaste"); + txt='

    hello1hello2

    '; + ua.checkHTMLSameStyle(txt, editor.document, editor.body, '文字居中,表情居左'); +}); + +test('trace:4018,4012',function(){ + var div = document.body.appendChild(document.createElement('div')); + div.id = 'ue2'; + var editor2 = UE.getEditor('ue2'); + editor2.ready(function(){ + editor2.setContent('Mayday123,.Mayday123,.'); + var c = $('#edui18_state div'); + ua.click(c[4]); + ua.click($("input")[19]); + var d = $(".edui-autotypesetpicker-body tr"); + var e = d[7].getElementsByTagName('input'); + ua.click(e[0]); + var button = $(".edui-autotypesetpicker-body button"); + ua.click(button[0]); + if(ua.browser.ie&&ua.browser.ie==8){ + equal(editor2.getContent(),"

    Mayday123,.Mayday123,.

    ","未执行半角转全角"); + }else{ + equal(editor2.getContent(),'

    Mayday123,.Mayday123,.

    ',"未执行半角转全角"); + } + setTimeout(function () { + UE.delEditor('ue2'); + window.localStorage.clear(); + start(); + }, 100); + }); + stop(); +}); + +test('trace:3991',function(){ + var editor3 = te.obj[0]; + setTimeout(function(){ + editor3.setContent(''); + editor3.execCommand('inserttable', {numCols: 3, numRows: 3}); + var text =editor3.body.getElementsByTagName('td')[0]; + var range = new baidu.editor.dom.Range(editor3.document); + range.setStart(text,0).collapse(1).select(); + editor3.execCommand("inserttitlecol"); + equal(editor3.queryCommandState("inserttitlecol"),-1,'标题列不能向右合并'); + var f = $("#edui538_state")[0]; + start(); + }, 100); + stop(); +}); + +test('trace:3967',function(){ + var editor = te.obj[0]; + editor.setContent('123
    '); + editor.execCommand('insertorderedlist','decimal'); + editor.execCommand('source'); + setTimeout(function(){ + editor.execCommand('source'); + setTimeout(function(){ + editor.execCommand('source'); + var x = editor.getContent(); + ok(x.indexOf('br')== x.lastIndexOf('br'),'只有一个
    '); + start(); + },50) + },50) + stop(); +}); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/autoupload.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/autoupload.js new file mode 100644 index 000000000..fa824cda6 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/autoupload.js @@ -0,0 +1,16 @@ +/** + * Created by JetBrains PhpStorm. + * User: Jinqn + * Date: 13-10-29 + * Time: 下午5:14 + * To change this template use File | Settings | File Templates. + */ +module('plugins.autoupload'); + +test('拖放图片上传',function(){ + equal('',''); +}); + +test('粘贴QQ截图',function(){ + equal('',''); +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/background.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/background.js new file mode 100644 index 000000000..cf490e688 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/background.js @@ -0,0 +1,53 @@ +module( 'plugins.background' ); + + +test( 'getAllHtml能取到背景', function() { + var sc = document.createElement("script"); + var editor = te.obj[2]; + sc.id="sc"; + sc.type = "text/plain"; + document.body.appendChild(sc); + editor.render('sc'); + editor.ready(function(){ + equal( editor.queryCommandState( 'background' ), 0, 'check background state' ); + this.body.style.backgroundColor = "#d7e3bc"; +// this.body.style.backgroundImage = '/ueditor/php/upload//8721363160868.gif'; + setTimeout(function(){ + var headHtml = []; + editor.fireEvent('getAllHtml',headHtml); + equal(ua.formatColor(editor.body.style.backgroundColor),'#d7e3bc','检查body背景色'); + +// equal(editor.body.style.backgroundImage,'','检查body背景图片'); + document.getElementById('sc').parentNode.removeChild(document.getElementById('sc')); + start(); + },50); + }); + stop(); +} ); +test( ' trace 3744 setContent 背景色', function() { + var editor = te.obj[0]; + editor.setContent('



    '); + stop(); + setTimeout(function(){ + equal(ua.formatColor($(editor.body).css('background-color')),'#8064a2','setContent 背景色'); + start(); + },50); +}); +test( ' trace 3751 3748 设置 背景色', function() { + var editor = te.obj[0]; + var backgroundStyle = {'background-repeat': "no-repeat", 'background-position': "center center", 'background-color': "#4F81BD"}; + editor.setContent('


    '); + editor.execCommand('background',backgroundStyle); + stop(); + setTimeout(function(){ + equal(editor.queryCommandValue('background')['background-repeat'],'no-repeat'); + equal(ua.formatColor(editor.queryCommandValue('background')['background-color'].toLowerCase()),'#4f81bd'); + ok(/center/.test(editor.queryCommandValue('background')['background-position'])); + editor.execCommand('source'); + setTimeout(function(){ + ua.checkSameHtml(editor.body.lastChild.outerHTML,'


    ','source查看 背景色'); +// equal(editor.body.lastChild.outerHTML,'


    ','source查看 背景色'); + start(); + },50); + },50); +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/basestyle.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/basestyle.js new file mode 100644 index 000000000..0008d7e2d --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/basestyle.js @@ -0,0 +1,315 @@ +module("plugins.basestyle"); + +test('sub--table', function () { + var editor = te.obj[0]; + setTimeout(function () { + editor.setContent('
    hello1hello2
    hello3hello4
    '); + setTimeout(function () { + var range = te.obj[1]; + var body = editor.document.body; + //1.2的版本中,table标签套了div标签,原来的var tbody = body.firstChild.firstChild;改为如下 + var tbody = editor.document.getElementsByTagName('table')[0].firstChild; + range.selectNode(body.firstChild).select(); + var tds = body.firstChild.getElementsByTagName('td'); + var td; +// for ( var index = 0; td = tds[index++]; ) { +// editor.currentSelectedArr.push( td ); +// } + editor.execCommand('subscript'); + setTimeout(function () { + equal(ua.getChildHTML(tbody.firstChild.firstChild), 'hello1', '检查第1个单元格中文本是否是下标'); + equal(ua.getChildHTML(tbody.firstChild.firstChild.nextSibling), 'hello2', '检查第2个单元格中文本是否是下标'); + equal(ua.getChildHTML(tbody.lastChild.firstChild), 'hello3', '检查第3个单元格中文本是否是下标'); + equal(ua.getChildHTML(tbody.lastChild.firstChild.nextSibling), 'hello4', '检查第4个单元格中文本是否是下标'); + equal(editor.queryCommandState('superscript'), 0, 'check sup state'); + equal(editor.queryCommandState('subscript'), 1, 'check sub state'); + + editor.execCommand('subscript'); + /**trace 943,为表格去上下标**/ + equal(tbody.firstChild.firstChild.innerHTML, 'hello1', '检查第1个单元格中文本是否不是下标'); + equal(tbody.firstChild.firstChild.nextSibling.innerHTML, 'hello2', '检查第2个单元格中文本是否不是下标'); + equal(tbody.lastChild.firstChild.innerHTML, 'hello3', '检查第3个单元格中文本是否不是下标'); + equal(tbody.lastChild.firstChild.nextSibling.innerHTML, 'hello4', '检查第4个单元格中文本是否你是下标'); + equal(editor.queryCommandState('superscript'), 0, 'check sup state'); + equal(editor.queryCommandState('subscript'), 0, 'check sub state'); + + editor.execCommand('superscript'); + /*上下标互斥*/ + equal(ua.getChildHTML(tbody.firstChild.firstChild), 'hello1', '检查第1个单元格中文本是否是上标'); + equal(ua.getChildHTML(tbody.firstChild.firstChild.nextSibling), 'hello2', '检查第2个单元格中文本是否是上标'); + equal(ua.getChildHTML(tbody.lastChild.firstChild), 'hello3', '检查第3个单元格中文本是否是上标'); + equal(ua.getChildHTML(tbody.lastChild.firstChild.nextSibling), 'hello4', '检查第4个单元格中文本是否是上标'); + equal(editor.queryCommandState('superscript'), 1, 'check sup state'); + equal(editor.queryCommandState('subscript'), 0, 'check sub state'); + start(); + }, 50); + }, 50); + }, 50); + stop(); +}); + +//如果没有setTimeout在FF(3.6和9都是)中range会出错,其他浏览器没问题 +test('闭合插入上下标', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    你好

    '); + var body = editor.body; + stop(); + setTimeout(function () { + range.setStart(body.firstChild.firstChild, 1).collapse(1).select(true); + editor.execCommand('superscript'); + equal(ua.getChildHTML(body.firstChild), '你好', '查看执行上标后的结果'); + range = editor.selection.getRange(); + range.insertNode(editor.document.createTextNode('hello')); + equal(ua.getChildHTML(body.firstChild), '你hello好', '上标标签中插入文本'); + start(); + }, 100) +}); + +test('不闭合插入上下标', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('hello1hello2baidu_linkhello3'); + var body = editor.document.body; + stop(); + setTimeout(function () { + range.setStart(body.firstChild.firstChild, 0).setEnd(body.firstChild.lastChild, 3).select(); + editor.execCommand('superscript'); + ua.manualDeleteFillData(body); + ua.checkSameHtml(editor.getContent(), '

    hello1hello2baidu_linkhello3

    ', '普通文本添加上标'); + start(); + }, 100); +}); + +/*trace 870*/ +//无法模拟光标自动移到的场景,因此模拟输入文本通过插入文本节点实现的方法,在插入文本后光标仍然在原来的位置 +// 我们不确定光标实际在哪 +test('trace 870:加粗文本前面去加粗', function () { + var editor = te.obj[0]; + var body = editor.body; + var range = te.obj[1]; + editor.setContent('


    '); + range.setStart(body.firstChild, 0).collapse(true).select(); + editor.execCommand('bold'); + range = editor.selection.getRange(); + range.insertNode(editor.document.createTextNode('hello')); + equal(editor.queryCommandState('bold'), 1, '加粗'); + editor.execCommand('bold'); + range = editor.selection.getRange(); + equal(editor.queryCommandState('bold'), 0, '不加粗'); + range.insertNode(editor.document.createTextNode('hello2')); + /*插入一个文本节点*/ + ua.manualDeleteFillData(editor.body); + /*ie下插入节点后会自动移动光标到节点后面,而其他浏览器不会*/ + if (ua.browser.chrome || ua.browser.safari || (ua.browser.ie && ua.browser.ie > 8 && ua.browser.ie<11))// ie9,10改range + equal(editor.getContent(), '

    hello2hello

    '); + else + equal(editor.getContent(), '

    hellohello2

    '); +}); + +/*trace 1043*/ +test('bold-在已加粗文本中间去除加粗', function () { + var editor = te.obj[0]; + var body = editor.body; + var range = te.obj[1]; + editor.setContent('hellossss'); + range.setStart(body.firstChild.firstChild, 0).collapse(true).select(); + editor.execCommand('bold'); + range = editor.selection.getRange(); + equal(editor.queryCommandState('bold'), 0, " 被去掉"); + range.insertNode(range.document.createTextNode('aa')); + /*在当前的range选区插入文本节点*/ + ua.manualDeleteFillData(editor.body); + equal(ua.getChildHTML(body.firstChild), "aahellossss", "新文本节点没有加粗"); +}); + +/*trace 958*/ +test('bold-在已加粗文本中间去除加粗', function () { + var editor = te.obj[0]; + var body = editor.body; + var range = te.obj[1]; + editor.setContent(''); + editor.execCommand('bold'); + ok(ua.getChildHTML(body), "", "editor不focus时点加粗,不会多一个空行"); +}); + +/*trace 958*/ +test('bold-加粗状态反射', function () { + var editor = te.obj[0]; + var body = editor.body; + var range = te.obj[1]; + editor.setContent('

    this is a dog

    '); + stop(); + setTimeout(function () { + range.selectNode(body.firstChild).select(); + editor.execCommand('bold'); + range.setStart(body.firstChild.firstChild.firstChild, 2).collapse(true).select(); + equal(editor.queryCommandState('bold'), 1, '闭合选择,加粗高亮'); + ua.manualDeleteFillData(editor.body); + range.setStart(body.firstChild.firstChild.firstChild, 0).setEnd(body.firstChild.firstChild.lastChild, 4).select(); + equal(editor.queryCommandState('bold'), 1, '不闭合选择,加粗高亮'); + start(); + }, 100) +}); + +/*trace 580*/ +test('bold-连续加粗2次', function () { + var editor = te.obj[0]; + var body = editor.body; + var range = te.obj[1]; + editor.setContent('

    this is a dog

    '); + var text = body.firstChild.firstChild; + range.setStart(text, 0).setEnd(text, 3).select(); + editor.execCommand('bold'); + /*第一次加粗*/ + equal(editor.queryCommandState('bold'), 1, '加粗按钮高亮'); + text = body.firstChild.lastChild; + range.setStart(text, 1).setEnd(text, 3).select(); + /*不闭合选区文本*/ + equal(editor.queryCommandState('bold'), 0, '不闭合选择,加粗不高亮'); + ua.manualDeleteFillData(editor.body); + editor.execCommand('bold'); + /*第二次加粗*/ + equal(editor.queryCommandState('bold'), 1, '加粗高亮'); +}); + +/*trace 1983*/ +test('bold-2个单词,中间有空格第一个单词加粗,第二个单词加粗再去加粗', function () { + var editor = te.obj[0]; + var body = editor.body; + var range = te.obj[1]; + body.innerHTML = '

    hello world

    '; //用setContent复现不了这个问题 + var text = body.firstChild.firstChild; + range.setStart(text, 0).setEnd(text, 5).select(); + editor.execCommand('bold'); + text = body.firstChild.lastChild; + range.setStart(text, 1).setEnd(text, 6).select(); + editor.execCommand('bold'); + editor.execCommand('bold'); + ok(body.firstChild.childNodes.length == 3 && body.firstChild.childNodes[1].length == 1, '空格保留'); +}); + +test('测试 userAction.manualdeleteFilldata', function () { + var editor = te.obj[0]; + var body = editor.body; + var range = te.obj[1]; + editor.setContent('

    '); + var fillData = editor.document.createTextNode(domUtils.fillChar); // 在ie 6,7下,使用appendChild时,需要body先加载,必须将上句document前加editor,否则出错 + body.appendChild(fillData); + var space = ua.browser.ie ? ' ' : '
    ';//getContent()结果:‘
    ’,innerHTML结果:
    + notEqual(body.innerHTML.toLowerCase(), '

    ' + space + '

    ', '清除不可见字符前不相等'); + ua.manualDeleteFillData(body); + equal(body.innerHTML.toLowerCase(), '

    ' + space + '

    ', '清除不可见字符后相等'); +}); + +test('trace 1884:单击B再单击I ', function () { + var editor = te.obj[0]; + var body = editor.body; + var range = te.obj[1]; + editor.setContent(''); + range.setStart(body.firstChild, 0).collapse(1).select(); + editor.execCommand('bold'); + equal(editor.queryCommandState('bold'), 1, 'b高亮'); + editor.execCommand('italic'); + equal(editor.queryCommandState('italic'), 1, 'b高亮'); +}); + +test('单击B再在其他地方单击I,空的strong标签被删除 ', function () { + var editor = te.obj[0]; + var body = editor.body; + var range = te.obj[1]; + editor.setContent('

    hello

    '); + range.setStart(body.firstChild, 0).collapse(1).select(); + editor.execCommand('bold'); + equal(editor.queryCommandState('bold'), 1, 'b高亮'); + range.setStart(body.firstChild, 1).collapse(1).select(); + editor.execCommand('italic'); + equal(editor.queryCommandState('italic'), 1, 'b高亮'); + ua.manualDeleteFillData(body); + if (!ua.browser.ie) { //ie下有问题不能修,屏蔽ie + equal(body.innerHTML.toLowerCase(), '

    hello

    ', '空strong标签被删除') + } +}); + +test('ctrl+i', function () { + var editor = te.obj[0]; + var body = editor.body; + var range = te.obj[1]; + editor.setContent('

    没有加粗的文本

    '); + range.selectNode(body.firstChild).select(); + var p = body.firstChild; + setTimeout(function () { + ua.keydown(editor.body, {'keyCode': 73, 'ctrlKey': true}); + editor.focus(); + setTimeout(function () { + equal(ua.getChildHTML(p), '没有加粗的文本'); + start(); + }, 150); + }, 100); + stop(); +}); + +test('ctrl+u', function () { + var editor = te.obj[0]; + var body = editor.body; + var range = te.obj[1]; + editor.setContent('

    没有加粗的文本

    '); + setTimeout(function () { + range.selectNode(body.firstChild).select(); + setTimeout(function () { + var html = '没有加粗的文本'; + ua.checkHTMLSameStyle(html, editor.document, body.firstChild, '文本被添加了下划线'); + equal(editor.body.firstChild.firstChild.style.textDecoration, 'underline'); + start(); + }, 150); + ua.keydown(editor.body, {'keyCode': 85, 'ctrlKey': true}); + }, 150); + stop(); +}); + +test('ctrl+b', function () { + var editor = te.obj[0]; + var body = editor.body; + var range = te.obj[1]; + + editor.setContent('

    没有加粗的文本

    '); + range.selectNode(body.firstChild).select(); + setTimeout(function () { + ua.keydown(editor.body, {'keyCode': 66, 'ctrlKey': true}); + setTimeout(function () { + equal(ua.getChildHTML(body.firstChild), '没有加粗的文本'); + start(); + }, 150); + }, 150); + stop(); +}); + +/*trace 3240*/ +test('表格中文本加粗', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable'); + ua.manualDeleteFillData(editor.body); + setTimeout(function () { + var tds = editor.body.getElementsByTagName('td'); + tds[0].innerHTML = 'asd'; + tds[10].innerHTML = 'asd'; + var trs = editor.body.firstChild.getElementsByTagName('tr'); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[0].cells[0], trs[2].cells[0]); + ut.setSelected(cellsRange); + range.setStart(trs[0].cells[0], 0).collapse(true).select(); + + editor.execCommand('bold'); + ua.manualDeleteFillData(editor.body); + equal(editor.queryCommandState('bold'), 1, 'b高亮'); + equal(trs[0].cells[0].firstChild.tagName.toLowerCase(), 'strong', '[0][0]单元格中文本标签'); + if (!ua.browser.ie) + equal(trs[1].cells[0].firstChild.tagName.toLowerCase(), 'br', '[1][0]单元格中文本标签'); + equal(trs[2].cells[0].firstChild.tagName.toLowerCase(), 'strong', '[2][0]单元格中文本标签'); + start(); + }, 50); + stop(); +}); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/blockquote.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/blockquote.js new file mode 100644 index 000000000..4f203349d --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/blockquote.js @@ -0,0 +1,165 @@ +module( "plugins.blockquote" ); + +/*trace 967*/ +//这个用例暂不测ie,因为ie中输入回车无效 +//test( '切换到源码模式再切换回来点引用', function () { +// if(!ua.browser.ie){ +// var editor = te.obj[0]; +// var body = editor.body; +// editor.setContent( 'hello' ); +// editor.execCommand( 'source' ); +// var tas = editor.iframe.parentNode.getElementsByTagName( 'textarea' ); +// tas[tas.length - 1].value = ''; +// stop(); +// setTimeout( function () { //source.js中有延时操作 +// editor.execCommand( 'source' ); +// editor.execCommand( 'blockquote' ); +// setTimeout( function () { //模拟回车,在引用后回车两段都是引用 +// //firefox竟然要多触发一次。。什么乱七八糟的bug啊 +// //if ( ua.getBrowser() == "firefox" ) +// //te.presskey( "enter", "" ); +// editor.focus(); +// te.presskey( "enter", "" ); +// setTimeout( function () { +// editor.focus(); +// setTimeout( function () { +// var bq = body.firstChild; +// equal( body.childNodes.length, 1, 'body有1个孩子' ); +// equal( bq.childNodes.length, 2, 'blockquote有2个孩子' ); +// ok( bq.childNodes[0]&&bq.childNodes[0].tagName.toLowerCase()=='p', '第一个孩子是p' ); +// ok( bq.childNodes[1]&&bq.childNodes[1].tagName.toLowerCase()=='p', '第二个孩子是p' ); +// start(); +// }, 50 ); +// }, 30 ); +// }, 60 ); +// }, 50 ); +// } +// else +// ok(ua.browser.ie,'这个用例暂不测,因为ie中输入回车无效'); +//} ); + +test( '在表格中添加和去除引用', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( 'hello
    hello
    ' ); + var body = editor.body; + var tds = body.lastChild.getElementsByTagName( 'td' ); + range.setStart( tds[0].firstChild, 2 ).collapse( true ).select(); /*闭合选取*/ + editor.execCommand( 'blockquote' ); + equal( body.lastChild.tagName.toLowerCase(), 'blockquote', '引用加到表格外面去了' ); + equal( tds[0].firstChild.nodeType, 3, 'td里仍然是文本' ); + equal( tds[0].firstChild.data, 'he', 'td里仍然是文本he' ); + range.setStart( tds[0].firstChild, 2 ).collapse( true ).select(); + editor.execCommand( 'blockquote' ); /*再执行一次引用,会去掉引用*/ + ok( body.lastChild.tagName.toLowerCase() != 'blockquote', '引用去掉了' ); //1.2版本table外加了div + stop(); + setTimeout(function(){ + tds = body.lastChild.getElementsByTagName( 'td' ); + range.selectNode( tds[0] ).select(); /*不闭合选中表格,添加引用*/ + editor.execCommand( 'blockquote' ); + equal( body.lastChild.tagName.toLowerCase(), 'blockquote', '非闭合方式选中添加引用' ); + start(); + },50); +} ); + +test( '在列表中添加引用', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( 'hello
    1. hello1

    2. hello2

    ' ); + var body = editor.body; + var lis = body.lastChild.getElementsByTagName( 'li' ); + range.setStart( lis[0].firstChild, 1 ).collapse( 1 ).select(); /*闭合选取*/ + editor.execCommand( 'blockquote' ); + equal( body.lastChild.tagName.toLowerCase(), 'blockquote', '引用加到列表外面去了' ); + equal( lis[0].firstChild.nodeType, 1, '列表里套着p' ); + equal( lis[0].firstChild.firstChild.data, 'hello1', '列表里仍然是文本hello1' ); +} ); + +/*trace 1183*/ +test( 'trace1183:选中列表中添加引用,再去掉引用', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '

    hello1

    hello2

    ' ); + var body = editor.body; + range.setStart( body, 0 ).setEnd( body, 2 ).select(); + editor.execCommand( 'insertorderedlist' ); /*添加列表*/ + ua.manualDeleteFillData( editor.body ); + var ol = body.getElementsByTagName( 'ol' )[0]; + var html = ua.getChildHTML( ol ); + + editor.execCommand( 'blockquote' ); + editor.execCommand( 'blockquote' ); + ua.manualDeleteFillData( editor.body ); + equal( ua.getChildHTML( body.getElementsByTagName( 'ol' )[0] ), html, '引用前后列表没有发生变化' ); + equal( body.getElementsByTagName( 'ol' ).length, 1, '只有一个有序列表' ); +} ); + +test( 'trace 3298:对段落添加引用和去除引用', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '

    hello1

    hello2 world

    ' ); + var body = editor.body; + range.setStart( body.firstChild, 0 ).setEnd( body.lastChild, 1 ).select(); /*不闭合添加引用*/ + editor.execCommand( 'blockquote' ); + equal( ua.getChildHTML( body ), '

    hello1

    hello2  world

    ', '不闭合添加引用' ); + equal( editor.queryCommandState( 'blockquote' ), 1, '引用高亮' ); + + range.setStart( body.firstChild.lastChild, 0 ).collapse( true ).select(); /*闭合去除引用*/ + editor.execCommand( 'blockquote' ); + equal( ua.getChildHTML( body ), '

    hello1

    hello2  world

    ', '闭合去除引用' ); + equal( editor.queryCommandState( 'blockquote' ), 0, '引用不高亮' ); + + range.setStart( body.firstChild, 0 ).setEnd( body.lastChild, 1 ).select(); /*非闭合去除引用*/ + editor.execCommand( 'blockquote' ); + equal( ua.getChildHTML( body ), '

    hello1

    hello2  world

    ' ); + equal( editor.queryCommandState( 'blockquote' ), 0, '非闭合去除引用后,引用不高亮' ); + + range.setStart( body.lastChild, 0 ).collapse( true ).select(); /*闭合添加引用*/ + editor.execCommand( 'blockquote' ); + equal( ua.getChildHTML( body ), '

    hello1

    hello2  world

    ', '闭合添加引用 ' ); +} ); + +/*trace 3285*/ +test( 'trace 3285:startContainer为body添加引用', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( 'hello
    1. hello1
    2. hello2
    ' ); + var body = editor.body; + range.setStart( body, 0 ).setEnd( body, 2 ).select(); /*不闭合选取*/ + editor.execCommand( 'blockquote' ); +// var padding = ua.browser.ie&&ua.browser.ie<9?' style=\" list-paddingleft-2\"':(ua.browser.webkit?' class=\" list-paddingleft-2\"':' style=\" list-paddingleft-2\"'); + var padding = ' class=\" list-paddingleft-2\"'; + equal( ua.getChildHTML( body ), '

    hello

  • hello1

  • hello2

  • ', '选中body加引用' ); + equal( editor.queryCommandState( 'blockquote' ), 1, '引用高亮' ); + editor.undoManger.undo(); + range.setStart( body, 1 ).collapse( true ).select(); /*闭合选取*/ + equal( editor.queryCommandState( 'blockquote' ), 0, '引用不高亮' ); +} ); + +//ie 不通过 +test('aa标签',function(){ + var editor = te.obj[0]; + var range = te.obj[1]; + if(!ua.browser.ie){ + editor.setContent('hello'); + range.setStart(editor.body.firstChild.firstChild,0).collapse(1).select(); + editor.execCommand('blockquote'); + equal(ua.getChildHTML(editor.body),'
    hello
    ','aa标签'); + editor.setContent('hellohello2'); + range.setStart(editor.body.lastChild.firstChild,0).setEnd(editor.body.lastChild.firstChild,3).select(); + editor.execCommand('blockquote'); + equal(ua.getChildHTML(editor.body),'

    hello

    hello2
    ',''); + } +}); + +/*trace 3284*/ +test('trace 3284:列表内引用',function(){ + var editor = te.obj[0]; + var range = te.obj[1]; +// var padding = ua.browser.ie&&ua.browser.ie<9?' style=\"padding-left: 30px\"':(ua.browser.webkit?' style=\"padding-left: 30px;\"':' style=\"padding-left: 30px;\"'); + var padding = ' class=\" list-paddingleft-2\"'; + editor.setContent('
    1. hello1

    2. hello2

    '); + range.setStart(editor.body.firstChild.firstChild.firstChild.firstChild,0).setEnd(editor.body.firstChild.lastChild.firstChild.firstChild,6).select(); + editor.execCommand('blockquote'); + equal(ua.getChildHTML(editor.body ),'
  • hello1

  • hello2

  • ','引用删除'); +}); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/catchremoteimage.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/catchremoteimage.js new file mode 100644 index 000000000..24942b4a6 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/catchremoteimage.js @@ -0,0 +1,45 @@ +module( 'plugins.catchremoteimage' ); + +test( '成功远程图片抓取', function () { + UEDITOR_CONFIG.UEDITOR_HOME_URL = '../../../'; + for (var config in window.UEDITOR_CONFIG) { + if (typeof(window.UEDITOR_CONFIG[config]) == 'string'){ + window.UEDITOR_CONFIG[config] = window.UEDITOR_CONFIG[config].replace('_test/tools/br/', ''); + } + } + var editor = new UE.Editor({'autoFloatEnabled':false}); + stop(); + setTimeout(function(){ + var div = document.body.appendChild( document.createElement( 'div' ) ); + editor.render( div ); + + editor.ready(function(){ + var body = editor.body; + editor.setContent( '

    ' ); + editor.fireEvent( "catchRemoteImage" ); + var count = 0; + var handler = setInterval( function () { + count++; + var imgs = body.getElementsByTagName( 'img' ); + var src = imgs [1].getAttribute( 'src' ); + if ( /upload/.test( src ) ) { + clearInterval( handler ); + ok( /upload/.test( imgs[0].getAttribute( 'src' ) ), '图片已经被转存到本地' ); +// equal( imgs[0].getAttribute( 'src' ), imgs[0].getAttribute( '_src' ), '查看_src' ); +// equal( imgs[1].getAttribute( 'src' ), imgs[1].getAttribute( '_src' ), '查看_src' ); + equal( imgs.length, 2, '2个图片' ); + start(); + } else if ( count > 100 ) { + clearInterval( handler ); + ok( false, '超时,文件获取失败' ); + start(); + } + }, 100 ); + te.dom.push( div ); + },50); + },100); +} ); + +//test( '失败远程图片抓取', function () { +////超时太长了,而且就是一个alert,alert出来还会影响后面跑用例,先占个坑 +//} ); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/charts.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/charts.js new file mode 100644 index 000000000..2413fdff9 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/charts.js @@ -0,0 +1,105 @@ +module( 'plugins.charts' ); + +test( '图表命令检测', function() { + expect(3); + + var container = te.obj[0].container, + editor = null, + count = 0; + + UE.delEditor( te.obj[0] ); + container.parentNode.removeChild( container ); + + container = document.createElement( "div" ); + container.id = "container"; + document.body.appendChild( container ); + editor = UE.getEditor( "container", { + initialContent: '' + + '
    ' + + '


    ' + + '

    ' + } ); + + + stop(); + + editor.ready( function () { + + var firstTd = editor.body.getElementsByTagName("td")[0]; + var range = new baidu.editor.dom.Range(editor.document); + + range.selectNode( firstTd).collapse(true).select(); + + equal( editor.queryCommandState( 'charts' ), -1, '数据验证失败, 状态为禁用' ); + + + + //设置数据格式合法的表格 + editor.setContent('

    abcdef
    1999123456
    '); + + firstTd = editor.body.getElementsByTagName("td")[0]; + + range.setStart( firstTd,0).collapse(true).select(); + + equal( editor.queryCommandState( 'charts' ) != -1, true, '数据合法, 状态可用' ); + + editor.execCommand( 'charts', { + title: '测试标题', + subTitle: '标题2', + xTitle: 'X轴标题', + yTitle: 'Y轴标题', + suffix: '后缀', + tip: '提示', + dataFormat: '1', + chartType: 1 + } ); + + var tableNode = editor.body.getElementsByTagName("table")[0]; + + equal( tableNode.getAttribute("data-chart") !== null, true, '插入图表命令执行成功' ); + + setTimeout(function(){ + UE.delEditor("container"); + document.getElementById("container")&&te.dom.push( document.getElementById("container")); + start(); + },300); + + } ); + +} ); +test( '图表命令检测', function() { +// expect(5); + + UE.delEditor( te.obj[0] ); + var div = document.createElement( "div" ); + div.id = "container"; + document.body.appendChild( div ); + var editor = UE.getEditor( "container", { + initialContent: '
    ' + + '

    ' + } ); + stop(); + editor.ready( function () { + var range = editor.selection.getRange(); + range.selectNode( editor.body.getElementsByTagName("td")[0]).collapse(true).select(); + equal( editor.queryCommandState( 'charts' ), -1, '列数不够, 状态为禁用' ); + //
    12
    22
    + editor.setContent('
    e
    12
    22
    '); + range.selectNode( editor.body.getElementsByTagName("td")[0]).collapse(true).select(); + equal( editor.queryCommandState( 'charts' ), -1, '第一行不都是th, 状态为禁用' ); + editor.setContent('
    e
    12
    22
    '); + range.selectNode( editor.body.getElementsByTagName("td")[0]).collapse(true).select(); + equal( editor.queryCommandState( 'charts' ), -1, '第一列不是th, 状态为禁用' ); + editor.setContent('
    552
    2
    24
    '); + range.selectNode( editor.body.getElementsByTagName("td")[0]).collapse(true).select(); + equal( editor.queryCommandState( 'charts' ), -1, '每行单元格数不匹配, 状态为禁用' ); + editor.setContent('
    1ee
    22
    '); + range.selectNode( editor.body.getElementsByTagName("td")[0]).collapse(true).select(); + equal( editor.queryCommandState( 'charts' ), -1, '内容不是数字, 状态为禁用' ); + setTimeout(function(){ + UE.delEditor("container"); + document.getElementById("container")&&te.dom.push( document.getElementById("container")); + start(); + },300); + } ); +} ); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/cleardoc.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/cleardoc.js new file mode 100644 index 000000000..53de1efb8 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/cleardoc.js @@ -0,0 +1,125 @@ +/** + * Created by JetBrains PhpStorm. + * User: shenlixia01 + * Date: 11-8-15 + * Time: 下午3:47 + * To change this template use File | Settings | File Templates. + */ +module( 'plugins.cleardoc' ); + +test( '取得焦点后清空后查看range', function () { + var editor = te.obj[0]; + editor.setContent( '

    hello1

    hello2
    ' ); + editor.focus(); + var body = editor.body; + editor.execCommand( 'cleardoc' ); + ua.manualDeleteFillData( editor.body ); + if ( UE.browser.ie ) { + equal( ua.getChildHTML( body ), '

    ' ); //目前ie清空文档后不放空格占位符 + } + else { + equal( ua.getChildHTML( body ), '


    ', '清空文档' ); + } +} ); + +test( '编辑器没有焦点,清空', function () { + var editor = te.obj[0]; + editor.setContent( '

    hello1

    hello2
    ' ); + var body = editor.body; + editor.execCommand( 'cleardoc' ); + ua.manualDeleteFillData( editor.body ); + if ( UE.browser.ie ) { + equal( ua.getChildHTML( body ), '

    ' ); + } + else { + equal( ua.getChildHTML( body ), '


    ', '清空文档' ); + } +} ); + +test( 'enterTag为br', function () { + var editor = te.obj[0]; + editor.options.enterTag='br'; + editor.setContent( '
    hello
    ' ); + var body = editor.body; + editor.execCommand( 'cleardoc' ); + ua.manualDeleteFillData( editor.body ); + if (UE.browser.ie) { + equal(ua.getChildHTML(body), '
    ', '清空文档'); + } + else { + equal(ua.getChildHTML(body), '
    ', '清空文档'); + } +} ); + +/*trace1061*/ +test( '删除时不会删除block元素', function() { + if(ua.browser.opera) return 0; + var editor = te.obj[0]; + editor.setContent( '

    hello

    ' ); + setTimeout(function() { + var range = te.obj[1]; + range.selectNode( editor.body.firstChild ).select(); + editor.execCommand( 'cleardoc' ); + equal( editor.body.lastChild.tagName.toLowerCase(), 'p', 'h1替换为p' ); + ua.manualDeleteFillData(editor.body); + if ( !baidu.editor.browser.ie ) + equal( editor.body.lastChild.innerHTML, '
    ', '内容被删除了' ); + else + equal( editor.body.lastChild.innerHTML, '', '内容被删除了' ); +// if(!ua.browser.opera){ +// range = editor.selection.getRange(); +// equal( range.startContainer.tagName.toLowerCase(), 'p', '光标位置' ); +// } + start(); + },50); + stop(); +} ); + +test('选中文本,清空',function(){ + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    hello

    hello1

    ') + range.selectNode(editor.body.firstChild).select(); + editor.execCommand('cleardoc'); + var br = ua.browser.ie?'':'
    '; + equal(ua.getChildHTML(editor.body),'

    '+br+'

    ',''); +}); + +/*trace 1104*/ +test( '全选后删除', function() { + var editor = te.obj[0]; + if ( baidu.editor.browser.ie ) + editor.setContent( '

    dsafds 

     

     

     

     

     

     

    ' ); + else + editor.setContent( '




    d






    ' ); + setTimeout(function() { + editor.focus(); + editor.execCommand( 'selectall' ); + editor.execCommand( 'cleardoc' ); + ua.manualDeleteFillData(editor.body); + equal( editor.body.childNodes.length, 1, '删除后只剩一个bolock元素' ); + equal( editor.body.firstChild.tagName.toLowerCase(), 'p', '删除后只剩一个p' ); + if ( !UE.browser.ie ) + equal( editor.body.lastChild.innerHTML, '
    ', '内容被删除了' ); + else + equal( editor.body.lastChild.innerHTML, '', '内容被删除了' ); + start(); + },50); + stop(); +} ); + +test( '删除所有列表', function() { + var editor = te.obj[0]; + editor.setContent('
    1. hello1
    2. 你好
    '); + setTimeout(function() { + var body = editor.body; + editor.focus(); + editor.execCommand( 'selectall' ); + editor.execCommand( 'cleardoc' ); + equal( body.childNodes.length, 1, '删除后只剩一个ol元素' ); + var br = UE.browser.ie?"":"
    "; + equal( ua.getChildHTML(body), '

    '+br+'

    ', '删除后只剩一个p' ); + start(); + },50); + stop(); +} ); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/contextmenu.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/contextmenu.js new file mode 100644 index 000000000..4ecf7d3f6 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/contextmenu.js @@ -0,0 +1,311 @@ +///** +// * Created by JetBrains PhpStorm. +// * User: dongyancen +// * Date: 12-9-19 +// * Time: 下午4:19 +// * To change this template use File | Settings | File Templates. +// */ +module('plugins.contextmenu'); + +//test('stop', function () {stop();}); +test('基本右键菜单', function () { + var editor = te.obj[0]; + stop(); + + ua.contextmenu(editor.body); + var lang = editor.getLang("contextMenu"); + equal(document.getElementsByClassName("edui-menu-body").length, 3, '默认3个menu,一个主的,一个段落格式,一个表格'); + var menuBody = document.getElementsByClassName("edui-menu-body")[0]; + equal(menuBody.parentNode.parentNode.parentNode.style.display, '', '第一个menu显示'); + equal(menuBody.childNodes.length, 11, '第一个menu8个items3个分隔线'); +// var space = browser.webkit||ua.browser.ie==9?"\n":''; + var innerText = lang['selectall'] + lang.cleardoc + lang.paragraph + lang.table + lang.insertparagraphbefore + lang.insertparagraphafter + lang['copy'] + lang['paste']; + if (browser.gecko) { + equal(menuBody.textContent, innerText, '检查menu显示的字符'); + } + else { + equal(menuBody.innerText.replace(/[\r\n\t\u200b\ufeff]/g, ''), innerText, '检查menu显示的字符'); + } + ok(menuBody.childNodes[0].className.indexOf("edui-for-selectall") > -1, '检查menu样式'); + var menuparagraphBody = document.getElementsByClassName("edui-menu-body")[1]; + equal(menuparagraphBody.parentNode.parentNode.parentNode.style.display, 'none', '第二个menu隐藏'); + var menutableBody = document.getElementsByClassName("edui-menu-body")[2]; + if (ua.browser.ie) { + ua.mouseenter(menuBody.childNodes[3]); + } else { + ua.mouseover(menuBody.childNodes[3]); + } + setTimeout(function () { + lang = editor.getLang("contextMenu"); + equal(menuparagraphBody.parentNode.parentNode.parentNode.style.display, 'none', '显示submenu,检查submenu的display值:""'); + equal(menuparagraphBody.childNodes.length, 4, '检查submenu的menuitems数量'); + equal(menutableBody.parentNode.parentNode.parentNode.style.display, 'none', '显示table submenu,检查submenu的display值:""'); + /*trace 3038*/ + if (ua.browser.ie && ua.browser.ie < 9) { + equal(menutableBody.childNodes.length, 2, 'ie有一条分隔线'); + } else { + equal(menutableBody.childNodes.length, 1, '只有插入表格选项'); + } + innerText = lang["justifyleft" ] + lang["justifyright" ] + lang["justifycenter" ] + lang[ "justifyjustify" ]; + if (browser.gecko) { + equal(menuparagraphBody.textContent, innerText, '检查menu显示的字符'); + equal(menutableBody.textContent, lang["inserttable" ], '检查table menu显示的字符'); + } + else { + equal(menuparagraphBody.innerText.replace(/[\r\n\t\u200b\ufeff]/g, ''), innerText, '检查menu显示的字符'); + equal(menutableBody.innerText.replace(/[\r\n\t\u200b\ufeff]/g, ''), lang["inserttable" ], '检查table menu显示的字符'); + } + ua.click(menuparagraphBody.childNodes[1]); + setTimeout(function () { + equal(editor.body.firstChild.style.textAlign, 'right', '文本右对齐'); + document.getElementById('edui_fixedlayer').parentNode.removeChild(document.getElementById('edui_fixedlayer')); + te.dom.push(editor.container); + start(); + }, 500); + }, 200); +}); + +test('表格右键菜单', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + stop(); + var lang = editor.getLang("contextMenu"); + editor.setContent('



    '); + setTimeout(function () { + range.setStart(editor.body.firstChild.firstChild.firstChild.firstChild.firstChild, 0).collapse(true).select(); + ua.contextmenu(editor.body.firstChild.firstChild.firstChild); +// 点开右键菜单 + equal(document.getElementsByClassName("edui-menu-body").length, 5, '获得edui-menu-body名称的class个数5'); + var menuBody = document.getElementsByClassName("edui-menu-body")[0]; + equal(menuBody.childNodes.length, 13, '第一个menu11个items2个分隔线'); + var innerText = lang.selectall + lang.cleardoc + lang.table + lang.tablesort + lang.borderbk+ lang.aligntd + lang.aligntable + lang.insertparagraphbefore + lang.insertparagraphafter + lang['copy'] + lang['paste']; + if (browser.gecko) { + equal(menuBody.textContent, innerText, '检查menu显示的字符'); + } + else { + equal(menuBody.innerText.replace(/[\r\n\t\u200b\ufeff]/g, ''), innerText, '检查menu显示的字符'); + } + + var menutableBody = document.getElementsByClassName("edui-menu-body")[1]; + var forTable = document.getElementsByClassName('edui-for-table'); +//点开'表格'子菜单 + if (ua.browser.ie) { + ua.mouseenter(forTable[forTable.length - 1]); + } else { + ua.mouseover(forTable[forTable.length - 1]); + } + setTimeout(function () { + lang = editor.getLang("contextMenu"); + equal(menutableBody.parentNode.parentNode.parentNode.style.display, 'none', '显示submenu,检查submenu的display值:""'); + equal(menutableBody.childNodes.length, 19, '14个items5个分隔线'); + var innerText = lang.deletetable + lang.deleterow + lang.deletecol+ lang.insertcol + lang.insertcolnext + lang.insertrow + lang.insertrownext + lang.insertcaption + lang.inserttitle + lang.inserttitlecol + lang.mergeright + lang.mergedown + lang.edittd + lang.edittable+lang.setbordervisible; + if (browser.gecko) { + equal(menutableBody.textContent, innerText, '检查menu显示的字符'); + } + else { + equal(menutableBody.innerText.replace(/[\r\n\t\u200b\ufeff]/g, ''), innerText, '检查menu显示的字符'); + } + ua.click(menutableBody.childNodes[0]); + equal(editor.body.getElementsByTagName('table').length, 0, '删除表格'); + setTimeout(function () { + document.getElementById('edui_fixedlayer').parentNode.removeChild(document.getElementById('edui_fixedlayer')); + te.dom.push(editor.container); + start(); + }, 200); + }, 200); + }, 100); +}); + +/*trace 3044*/ +test('trace 3044:表格名称中右键', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + stop(); + var lang = editor.getLang("contextMenu"); + editor.execCommand('cleardoc'); + editor.execCommand('inserttable'); + range.setStart(editor.body.getElementsByTagName('td')[0], 0).collapse(true).select(); + ua.contextmenu(editor.body.firstChild); + var menutableBody = document.getElementsByClassName("edui-menu-body")[1]; + var forTable = document.getElementsByClassName('edui-for-table'); + if (ua.browser.ie) { + ua.mouseenter(forTable[forTable.length - 1]); + } else { + ua.mouseover(forTable[forTable.length - 1]); + } + setTimeout(function () { + lang = editor.getLang("contextMenu"); + ua.click(menutableBody.childNodes[9]); + var caption = editor.body.getElementsByTagName('caption'); + equal(caption.length, 1, '插入表格名称'); + range.setStart(caption[0], 0).collapse(true).select(); + ua.contextmenu(editor.body.firstChild.firstChild); + forTable = document.getElementsByClassName('edui-for-table'); + if (ua.browser.ie) { + ua.mouseenter(forTable[forTable.length - 1]); + } else { + ua.mouseover(forTable[forTable.length - 1]); + } + setTimeout(function () { + lang = editor.getLang("contextMenu"); + menutableBody = document.getElementsByClassName("edui-menu-body")[1]; + if (ua.browser.ie == 8) { + equal(menutableBody.childNodes.length, 9, '9个子项目,其中有2条分隔线'); + } else { + equal(menutableBody.childNodes.length, 7, '7个子项目'); + } + var innerText = lang.deletetable + lang.deletecaption + lang.inserttitle+lang.inserttitlecol + lang.edittd + lang.edittable+lang.setbordervisible; + if (browser.gecko) { + equal(menutableBody.textContent, innerText, '检查menu显示的字符'); + } else { + equal(menutableBody.innerText.replace(/[\r\n\t\u200b\ufeff]/g, ''), innerText, '检查menu显示的字符'); + } + setTimeout(function () { + document.getElementById('edui_fixedlayer').parentNode.removeChild(document.getElementById('edui_fixedlayer')); + te.dom.push(editor.container); + start(); + }, 200); + }, 200); + }, 200); +}); + + + + +/*trace 3088*/ +test('trace 3088:检查表格属性', function () { +// if (ua.browser.ie >8)return; + var div = document.body.appendChild(document.createElement('div')); + div.id = 'ue'; + var editor = UE.getEditor('ue'); + + stop(); + editor.ready(function () { + var range = new baidu.editor.dom.Range(editor.document); + var lang = editor.getLang("contextMenu"); + editor.execCommand('cleardoc'); + editor.execCommand('inserttable'); + range.setStart(editor.body.getElementsByTagName('td')[0], 0).collapse(true).select(); + editor.execCommand('inserttitle'); + range.setStart(editor.body.getElementsByTagName('td')[0], 0).collapse(true).select(); + editor.execCommand('insertcaption'); + range.setStart(editor.body.getElementsByTagName('caption')[0], 0).collapse(true).select(); + editor.execCommand('deletetitle'); + setTimeout(function () { + range.setStart(editor.body.getElementsByTagName('caption')[0], 0).collapse(true).select(); + ua.contextmenu(editor.body.firstChild.firstChild); + setTimeout(function () { + var menutable = document.getElementsByClassName("edui-menu-body")[1]; + var forTable = document.getElementsByClassName('edui-for-table'); + //点开'表格属性'(表格子菜单的倒数第二项) + if (ua.browser.ie&&ua.browser.ie<9) { + ua.mouseenter(forTable[forTable.length - 1]); + ua.click(menutable.childNodes[menutable.childNodes.length-2]); + } else { + ua.mouseover(forTable[forTable.length - 1]); + ua.click(menutable.childNodes[menutable.childNodes.length-2]); + } + lang = editor.getLang("contextMenu"); + setTimeout(function () { + var iframe = document.getElementsByTagName('iframe'); + var iframe1 ; + for (var i = 0; i hello

    '); + setTimeout(function () { + range.setStart(body.firstChild, 1).collapse(true).select(); + editor.execCommand("touppercase"); + equal(editor.getContent(), "

    hello

    ", "闭合选择--up"); + start(); + }, 50); + }, 100); +}); +test('非闭合选择----字符串全选', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent('

    hello1

    hello2

    '); + setTimeout(function () { + range.setStart(body.firstChild, 0).setEnd(body.lastChild, 1).select(); + editor.execCommand("touppercase"); + equal(editor.getContent(), "

    HELLO1

    HELLO2

    ", "非闭合--字符串全选--up"); + editor.execCommand("touppercase"); + equal(editor.getContent(), "

    HELLO1

    HELLO2

    ", "非闭合--两次up"); + editor.execCommand("tolowercase"); + equal(editor.getContent(), "

    hello1

    hello2

    ", "非闭合--字符串全选--low"); + editor.execCommand("tolowercase"); + equal(editor.getContent(), "

    hello1

    hello2

    ", "非闭合---两次low"); + start(); + }, 50); + stop(); +}); +test('非闭合选择----子字符串', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent('

    hello1

    hello2

    '); + setTimeout(function () { + range.setStart(body.firstChild.firstChild, 2).setEnd(body.lastChild.firstChild, 2).select(); + editor.execCommand("touppercase"); + equal(editor.getContent(), "

    heLLO1

    HEllo2

    ", "非闭合--子字符串--up"); + editor.execCommand("tolowercase"); + equal(editor.getContent(), "

    hello1

    hello2

    ", "非闭合--子字符串--low"); + start(); + }, 50); + stop(); +}); +test('非闭合选择----字符串包括大写跟小写', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + var text = "

    HEllo1

    heLLo2

    "; + editor.setContent(text); + setTimeout(function () { + range.setStart(body.firstChild.firstChild, 0).setEnd(body.lastChild.firstChild, 6).select(); + editor.execCommand("touppercase"); + equal(editor.getContent(), "

    HELLO1

    HELLO2

    ", "非闭合--包含大小写--up"); + editor.setContent(text); + setTimeout(function () { + range.setStart(body.firstChild.firstChild, 0).setEnd(body.lastChild.firstChild, 6).select(); + editor.execCommand("tolowercase"); + equal(editor.getContent(), "

    hello1

    hello2

    ", "非闭合--包含大小写--low"); + start(); + }, 50); + }, 50); + stop(); +}); +test('非闭合选择----字符串包括换行跟空格', function () { + if (ua.browser.ie == 9)return;//TODO 1.2.6 + if (ua.browser.ie == 8)return;//TODO 1.2.6 PUBLICGE-3402 + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent('

    HEllo1
    heLLO2

    '); + setTimeout(function () { + range.setStart(body.firstChild.firstChild, 0).setEnd(body.firstChild.lastChild, 6).select(); + editor.execCommand("touppercase"); + equal(editor.getContent(), "

    HELLO1
    HELLO2

    ", "非闭合--包含大小写--up"); + editor.execCommand("tolowercase"); + equal(editor.getContent(), "

    hello1
    hello2

    ", "非闭合--包含大小写--low"); + start(); + }, 50); + stop(); +}); +test('标签table', function () { + //单个单元格,多个单元格,两个表格 + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + var text = "
    hello1hello2
    hello3hello4
    "; + editor.setContent(text); + stop(); + setTimeout(function () { + var tds = body.firstChild.getElementsByTagName('td'); + range.selectNode(tds[1]).select(); + editor.execCommand("touppercase"); + equal(tds[1].innerHTML, "HELLO2", "table--up"); + editor.execCommand("tolowercase"); + equal(tds[1].innerHTML, "hello2", "table--low"); + + range.setStart(tds[1], 0).setEnd(tds[2], 1).select(); + editor.execCommand("touppercase"); + equal(tds[1].innerHTML, "HELLO2", "table--单元格2--up"); + equal(tds[2].innerHTML, "HELLO3", "table--单元格3--up"); + editor.execCommand("tolowercase"); + equal(tds[1].innerHTML, "hello2", "table--单元格2--low"); + equal(tds[2].innerHTML, "hello3", "table--单元格3--low"); + + range.setStart(tds[0], 0).setEnd(tds[3], 1).select(); + editor.execCommand("touppercase"); + equal(tds[0].innerHTML, "HELLO1", "table--单元格1--up"); + equal(tds[1].innerHTML, "HELLO2", "table--单元格2--up"); + equal(tds[2].innerHTML, "HELLO3", "table--单元格3--up"); + equal(tds[3].innerHTML, "HELLO4", "table--单元格4--up"); + editor.execCommand("tolowercase"); + equal(tds[0].innerHTML, "hello1", "table--单元格1--low"); + equal(tds[1].innerHTML, "hello2", "table--单元格2--low"); + equal(tds[2].innerHTML, "hello3", "table--单元格3--low"); + equal(tds[3].innerHTML, "hello4", "table--单元格4--low"); + start(); + }, 50); +}); + +test('标签h1', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent('

    hello1

    hello2

    '); + range.setStart(body.firstChild.firstChild, 2).setEnd(body.lastChild.firstChild, 2).select(); + editor.execCommand("touppercase"); + equal(editor.getContent(), "

    heLLO1

    HEllo2

    ", "h1--up"); + editor.execCommand("tolowercase"); + equal(editor.getContent(), "

    hello1

    hello2

    ", "h1--low"); +}); + +test('h1&table', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + var text = "

    hello

    hello1hello2
    hello3hello4
    "; + editor.setContent(text); + stop(); + setTimeout(function () { + range.setStart(body.firstChild.firstChild, 0).setEnd(body.lastChild.firstChild.lastChild.lastChild.firstChild, 6).select(); + var tds = body.lastChild.getElementsByTagName('td'); + editor.execCommand("touppercase"); + ok(body.firstChild.tagName == "h1" || body.firstChild.tagName == "H1", "h1标签"); + equal(body.firstChild.innerHTML, "HELLO", "h1--up"); + equal(tds[0].innerHTML, "HELLO1", "table--单元格1--up"); + equal(tds[1].innerHTML, "HELLO2", "table--单元格2--up"); + equal(tds[2].innerHTML, "HELLO3", "table--单元格3--up"); + equal(tds[3].innerHTML, "HELLO4", "table--单元格4--up"); + editor.execCommand("tolowercase"); + ok(body.firstChild.tagName == "h1" || body.firstChild.tagName == "H1", "h1标签"); + equal(body.firstChild.innerHTML, "hello", "h1--low"); + equal(tds[0].innerHTML, "hello1", "table--单元格1--low"); + equal(tds[1].innerHTML, "hello2", "table--单元格2--low"); + equal(tds[2].innerHTML, "hello3", "table--单元格3--low"); + equal(tds[3].innerHTML, "hello4", "table--单元格4--low"); + start(); + }, 50); +}); + +test('三个组合', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + var text = "

    hello

    hello1hello2
    hello3hello4

    hello

    "; + editor.setContent(text); + var tds = body.firstChild.nextSibling.getElementsByTagName('td'); + range.setStart(body.firstChild.firstChild, 2).setEnd(body.lastChild.firstChild, 2).select(); + editor.execCommand("touppercase"); + ok(body.firstChild.tagName == "p" || body.firstChild.tagName == "P", "p标签"); + equal(body.firstChild.innerHTML, "heLLO", "p--up"); + equal(tds[0].innerHTML, "HELLO1", "table--单元格1--up"); + equal(tds[1].innerHTML, "HELLO2", "table--单元格2--up"); + equal(tds[2].innerHTML, "HELLO3", "table--单元格3--up"); + equal(tds[3].innerHTML, "HELLO4", "table--单元格4--up"); + ok(body.lastChild.tagName == "h1" || body.lastChild.tagName == "H1", "h1标签"); + equal(body.lastChild.innerHTML, "HEllo", "h1--up"); + editor.execCommand("tolowercase"); + ok(body.firstChild.tagName == "p" || body.firstChild.tagName == "P", "p标签"); + equal(body.firstChild.innerHTML, "hello", "p--low"); + equal(tds[0].innerHTML, "hello1", "table--单元格1--low"); + equal(tds[1].innerHTML, "hello2", "table--单元格2--low"); + equal(tds[2].innerHTML, "hello3", "table--单元格3--low"); + equal(tds[3].innerHTML, "hello4", "table--单元格4--low"); + ok(body.lastChild.tagName == "h1" || body.lastChild.tagName == "H1", "h1标签"); + equal(body.lastChild.innerHTML, "hello", "h1--low"); +}); + + diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/copy.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/copy.js new file mode 100644 index 000000000..eded27dc8 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/copy.js @@ -0,0 +1,50 @@ +module('plugins.copy'); + +//需要点击授权弹出框,暂时去除 +//test('检查IE下复制命令是否执行正常', function () { +// +// if (browser.ie) { +// var editor = te.obj[0]; +// editor.setContent('

    hello

    '); +// editor.focus(); +// +// editor.execCommand('selectall'); +// editor.execCommand('copy'); +// editor.body.innerHTML = ''; +// editor.execCommand('selectall'); +// editor.body.document.execCommand('paste'); +// +// equal(utils.trim(window.clipboardData.getData('text')), 'hello', '检查粘贴板内容,IE下成功复制内容'); +// setTimeout(function(){ +// equal(editor.getContent(), '

    hello

    ', '检查原生粘贴命令,IE下成功复制内容'); +// start(); +// },100); +// +// stop(); +// } +// +//}); + +test('检查非IE下是否正常加载zeroclipboard粘贴板插件', function () { + te.dom[0].parentNode.removeChild(te.dom[0]); + var sc = document.createElement("script"); + sc.id="sc"; + sc.type = "text/plain"; + sc.style.height = "100px"; + document.body.appendChild(sc); + var me = UE.getEditor('sc',{'autoFloatEnabled':true,'topOffset':60,'autoHeightEnabled':true,'scaleEnabled':false}); + me.ready(function(){ + setTimeout(function(){ + if (!browser.ie) { + ok(window.ZeroClipboard, '是否正常加载zeroclipboard粘贴板插件'); + } + setTimeout(function () { + UE.delEditor('sc'); + document.getElementById('sc')&&document.getElementById('sc').parentNode.removeChild(document.getElementById('sc')); + start(); + }, 500); + }, 300); + }); + stop(); + +}); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/customstyle.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/customstyle.js new file mode 100644 index 000000000..c8bc6852c --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/customstyle.js @@ -0,0 +1,451 @@ +/** + * + */ +module( 'plugins.customstyle' ); + +test( 'block的元素(p)', function () { + var editor = te.obj[0]; + editor.setContent('

    hello

    '); + setTimeout(function () { + var range = editor.selection.getRange(); + range.selectNode(editor.body.firstChild).select();//非闭合选区 + + editor.execCommand('customstyle', { + style:'border:1px solid #ccc', + label:'aaa', + tag:'h3' + }); + ua.manualDeleteFillData(editor.body); + equal(editor.body.firstChild.getAttribute('label'), 'aaa', '检查标签'); + range.selectNode(editor.body.firstChild).select(); + equal(editor.queryCommandValue('customstyle'), 'aaa', 'queryCommandValue'); + equal(editor.queryCommandState('customstyle'), '0', 'queryCommandState'); + var hStyle = $(editor.body.firstChild); + ok(editor.body.firstChild.style.borderWidth == '1px', '检查边框宽'); + ok(hStyle.css('border-top-style') == 'solid' && hStyle.css('border-bottom-style') == 'solid' && hStyle.css('border-left-style') == 'solid' && hStyle.css('border-right-style') == 'solid', '检查边框风格'); + if (ua.browser.ie && ua.browser.ie < 9) + ok(hStyle.css('border-top-color') == '#ccc' && hStyle.css('border-bottom-color') == '#ccc' && hStyle.css('border-left-color') == '#ccc' && hStyle.css('border-right-color') == '#ccc', '检查边框颜色'); + else + ok(hStyle.css('border-top-color') == 'rgb(204, 204, 204)' && hStyle.css('border-bottom-color') == 'rgb(204, 204, 204)' && hStyle.css('border-left-color') == 'rgb(204, 204, 204)' && hStyle.css('border-right-color') == 'rgb(204, 204, 204)', '检查边框颜色'); + range.setStart(editor.body.firstChild, 0).collapse(true).select();//闭合选区 + editor.execCommand('customstyle', { + style:'border:1px solid #ccc', + label:'aaa', + tag:'h3' + }); + ua.manualDeleteFillData(editor.body); + range.selectNode(editor.body.firstChild).select(); + equal(editor.queryCommandValue('customstyle'), ''); + equal(editor.queryCommandState('customstyle'), '0', 'queryCommandState'); + /*trace 1732*/ + var p = editor.body.firstChild; + equal(p.tagName.toLowerCase(), 'p', '闭合去掉h3标签'); + equal(p.innerHTML, 'hello', '检查innerHTML'); + + editor.setContent('

    hello


    '); + range.selectNode(editor.body.firstChild).select(); + editor.execCommand('customstyle', { + style:'border:1px solid #ccc', + label:'aaa', + tag:'h3' + }); + var p = editor.body.firstChild; + equal(p.tagName.toLowerCase(), 'p', '非闭合去掉h3标签'); + start(); + }, 50); + stop(); +} ); +test( 'block的元素(div)', function () { + var editor = te.obj[0]; + editor.setContent( '
    hello
    ' ); + setTimeout(function(){ + var range = editor.selection.getRange(); + range.selectNode( editor.body.firstChild ).select();//非闭合选区 + editor.execCommand( 'customstyle', { + style:'border:1px solid #ccc', + label:'aaa', + tag:'h3' + } ); + ua.manualDeleteFillData( editor.body ); + equal( editor.body.firstChild.getAttribute( 'label' ), 'aaa', '检查标签' ); + var hStyle = $( editor.body.firstChild ); + ok( editor.body.firstChild.style.borderWidth=='1px', '检查边框宽' ); + ok( hStyle.css( 'border-top-style' ) == 'solid' && hStyle.css( 'border-bottom-style' ) == 'solid' && hStyle.css( 'border-left-style' ) == 'solid' && hStyle.css( 'border-right-style' ) == 'solid', '检查边框风格' ); + if ( ua.browser.ie&&ua.browser.ie<9 ) + ok( hStyle.css( 'border-top-color' ) == '#ccc' && hStyle.css( 'border-bottom-color' ) == '#ccc' && hStyle.css( 'border-left-color' ) == '#ccc' && hStyle.css( 'border-right-color' ) == '#ccc', '检查边框颜色' ); + else + ok( hStyle.css( 'border-top-color' ) == 'rgb(204, 204, 204)' && hStyle.css( 'border-bottom-color' ) == 'rgb(204, 204, 204)' && hStyle.css( 'border-left-color' ) == 'rgb(204, 204, 204)' && hStyle.css( 'border-right-color' ) == 'rgb(204, 204, 204)', '检查边框颜色' ); + range.setStart(editor.body.firstChild,0).collapse(true).select();//闭合选区 + editor.execCommand( 'customstyle', { + style:'border:1px solid #ccc', + label:'aaa', + tag:'h3' + } ); + ua.manualDeleteFillData( editor.body ); + /*trace 1732*/ + var p = editor.body.firstChild; + equal( p.tagName.toLowerCase(), 'p', 'h3被去掉了' ); + equal( p.innerHTML, 'hello', '检查innerHTML' ); + start(); +},50); +stop(); +} ); + +test( 'inline的元素(a)', function () { + var editor = te.obj[0]; + editor.setContent( 'hello' ); + var range = editor.selection.getRange(); + range.selectNode( editor.body.firstChild ).select();//非闭合选区 + + editor.execCommand( 'customstyle', { + style:'border:1px solid #ccc', + label:'aaa', + tag:'h3' + } ); + range.selectNode( editor.body.firstChild ).select(); + equal(editor.queryCommandValue('customstyle'),'aaa','queryCommandValue'); + equal(editor.queryCommandState('customstyle'),'0','queryCommandState'); + ua.manualDeleteFillData( editor.body ); + equal( editor.body.firstChild.getAttribute( 'label' ), 'aaa', '检查标签' ); + var hStyle = $( editor.body.firstChild ); + ok( editor.body.firstChild.style.borderWidth=='1px', '检查边框宽' ); + ok( hStyle.css( 'border-top-style' ) == 'solid' && hStyle.css( 'border-bottom-style' ) == 'solid' && hStyle.css( 'border-left-style' ) == 'solid' && hStyle.css( 'border-right-style' ) == 'solid', '检查边框风格' ); + if (ua.browser.ie&&ua.browser.ie<9 ) + ok( hStyle.css( 'border-top-color' ) == '#ccc' && hStyle.css( 'border-bottom-color' ) == '#ccc' && hStyle.css( 'border-left-color' ) == '#ccc' && hStyle.css( 'border-right-color' ) == '#ccc', '检查边框颜色' ); + else + ok( hStyle.css( 'border-top-color' ) == 'rgb(204, 204, 204)' && hStyle.css( 'border-bottom-color' ) == 'rgb(204, 204, 204)' && hStyle.css( 'border-left-color' ) == 'rgb(204, 204, 204)' && hStyle.css( 'border-right-color' ) == 'rgb(204, 204, 204)', '检查边框颜色' ); + range.setStart(editor.body.firstChild,0).collapse(true).select();//闭合选区 + editor.execCommand( 'customstyle', { + style:'border:1px solid #ccc', + label:'aaa', + tag:'h3' + } ); + ua.manualDeleteFillData( editor.body ); + /*trace 1732*/ + var a = editor.body.getElementsByTagName('a')[0]; + equal( a.tagName.toLowerCase(), 'a', 'h3被去掉了' ); + equal( a.innerHTML, 'hello', '检查innerHTML' ); + range.selectNode( editor.body.firstChild ).select(); + equal(editor.queryCommandValue('customstyle'),'','queryCommandValue'); + equal(editor.queryCommandState('customstyle'),'0','queryCommandState'); +} ); +//h 与span标签作为选区的情况,在下的用例中自然使用到 +test( 'block的元素-样式的反复转换:块-块;包含的选取方式:整段、部分、多段', function () { + var editor = te.obj[0]; + editor.setContent( '

    hello

    world

    ' ); + var range = editor.selection.getRange(); + range.setStart(editor.body.firstChild.firstChild,0).setEnd(editor.body.firstChild.firstChild,2).select();//非闭合选区,部分 + editor.execCommand( 'customstyle', { + style:'border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:center;margin:0 0 20px 0;', + label:'居中标题', + tag:'h1' + } ); + ua.manualDeleteFillData( editor.body ); + equal( editor.body.getElementsByTagName('h1')[0].getAttribute( 'label' ), '居中标题', '非闭合选区,部分选择,设置块元素的样式:居中标题' ); + var hStyle = $( editor.body.getElementsByTagName('h1')[0]); + ok( editor.body.getElementsByTagName('h1')[0].style.borderBottomWidth == '2px' , '检查边框宽' ); + ok( hStyle.css( 'border-bottom-style' ) == 'solid' , '检查边框风格' ); + ok( hStyle.css( 'padding-bottom' ) == '0px'&&hStyle.css( 'padding-top' ) == '0px'&&hStyle.css( 'padding-left' ) == '0px'&&hStyle.css( 'padding-right' ) == '4px' , '检查padding' ); + ok( hStyle.css( 'margin-bottom' ) == '20px'&&hStyle.css( 'margin-top' ) == '0px'&&hStyle.css( 'margin-left' ) == '0px'&&hStyle.css( 'margin-right' ) == '0px' , '检查margin' ); + ok( hStyle.css( 'text-align' ) == 'center' , '检查对齐方式' ); + if ( ua.browser.ie&&ua.browser.ie<9 ) + ok( hStyle.css( 'border-bottom-color' ) == '#ccc' , '检查边框颜色' ); + else + ok( hStyle.css( 'border-bottom-color' ) == 'rgb(204, 204, 204)' , '检查边框颜色' ); + range.setStart(editor.body.getElementsByTagName('h1')[0],0).collapse(true).select();//闭合选区 + editor.execCommand( 'customstyle', { + tag:'h1', + label:'居左标题', + style:'border-bottom:#ccc 2px solid;padding:0 4px 0 0;margin:0 0 10px 0;' + } ); + ua.manualDeleteFillData( editor.body ); + equal( editor.body.getElementsByTagName('h1')[0].getAttribute( 'label' ), '居左标题', '闭合选区设置块元素的样式:居左标题' ); + var hStyle = $(editor.body.getElementsByTagName('h1')[0]); + ok( editor.body.getElementsByTagName('h1')[0].style.borderBottomWidth == '2px' , '检查边框宽' ); + ok( hStyle.css( 'border-bottom-style' ) == 'solid' , '检查边框风格' ); + ok( hStyle.css( 'padding-bottom' ) == '0px'&&hStyle.css( 'padding-top' ) == '0px'&&hStyle.css( 'padding-left' ) == '0px'&&hStyle.css( 'padding-right' ) == '4px' , '检查padding' ); + ok( hStyle.css( 'margin-bottom' ) == '10px'&&hStyle.css( 'margin-top' ) == '0px'&&hStyle.css( 'margin-left' ) == '0px'&&hStyle.css( 'margin-right' ) == '0px' , '检查margin' ); + ok( hStyle.css( 'text-align' ) != 'center' , '检查对齐方式' ); + if (ua.browser.ie&&ua.browser.ie<9 ) + ok( hStyle.css( 'border-bottom-color' ) == '#ccc' , '检查边框颜色' ); + else + ok( hStyle.css( 'border-bottom-color' ) == 'rgb(204, 204, 204)' , '检查边框颜色' ); + range.setStart(editor.body.firstChild,0).setEnd(editor.body.lastChild,1).select();//非闭合选区,多段 + editor.execCommand( 'customstyle', { + tag:'h3', + label:'标题3', + style:'border-bottom:#ccc 1px solid;padding:0 1px 0 0;margin:0 0 10px 0;' + } ); + ua.manualDeleteFillData( editor.body ); + ok(editor.body.getElementsByTagName('h1').length==0&&editor.body.getElementsByTagName('h3').length==2,'选中两行(中间夹一行空行),设置成标题3'); + equal( editor.body.getElementsByTagName('h3')[0].getAttribute( 'label' ), '标题3', '标题3' ); + var hStyle = $( editor.body.getElementsByTagName('h3')[0]); + ok( editor.body.getElementsByTagName('h3')[0].style.borderBottomWidth == '1px' , '检查边框宽' ); + ok( hStyle.css( 'border-bottom-style' ) == 'solid' , '检查边框风格' ); + ok( hStyle.css( 'padding-bottom' ) == '0px'&&hStyle.css( 'padding-top' ) == '0px'&&hStyle.css( 'padding-left' ) == '0px'&&hStyle.css( 'padding-right' ) == '1px' , '检查padding' ); + ok( hStyle.css( 'margin-bottom' ) == '10px'&&hStyle.css( 'margin-top' ) == '0px'&&hStyle.css( 'margin-left' ) == '0px'&&hStyle.css( 'margin-right' ) == '0px' , '检查margin' ); + if ( ua.browser.ie&&ua.browser.ie<9 ) + ok( hStyle.css( 'border-bottom-color' ) == '#ccc' , '检查边框颜色' ); + else + ok( hStyle.css( 'border-bottom-color' ) == 'rgb(204, 204, 204)' , '检查边框颜色' ); + equal( editor.body.getElementsByTagName('h3')[1].getAttribute( 'label' ), '标题3', '标题3' ); + var hStyle = $( editor.body.getElementsByTagName('h3')[1] ); + ok( editor.body.getElementsByTagName('h3')[1].style.borderBottomWidth == '1px' , '检查边框宽' ); + ok( hStyle.css( 'border-bottom-style' ) == 'solid' , '检查边框风格' ); + ok( hStyle.css( 'padding-bottom' ) == '0px'&&hStyle.css( 'padding-top' ) == '0px'&&hStyle.css( 'padding-left' ) == '0px'&&hStyle.css( 'padding-right' ) == '1px' , '检查padding' ); + ok( hStyle.css( 'margin-bottom' ) == '10px'&&hStyle.css( 'margin-top' ) == '0px'&&hStyle.css( 'margin-left' ) == '0px'&&hStyle.css( 'margin-right' ) == '0px' , '检查margin' ); + if ( ua.browser.ie&&ua.browser.ie<9 ) + ok( hStyle.css( 'border-bottom-color' ) == '#ccc' , '检查边框颜色' ); + else + ok( hStyle.css( 'border-bottom-color' ) == 'rgb(204, 204, 204)' , '检查边框颜色' ); +}); +test( 'block的元素-样式的反复转换:块-块;包含的选取方式: 多段部分', function () { + var editor = te.obj[0]; + var range = editor.selection.getRange(); + editor.setContent( '

    hello

    world

    !!!

    ' ); + range.setStart(editor.body.firstChild.firstChild,2).setEnd(editor.body.lastChild.firstChild,1).select();//非闭合选区,多段部分 + editor.execCommand( 'customstyle', { + tag:'h1', + label:'标题1', + style:'border-bottom:#ccc 1px solid;padding:0 3px 0 0;margin:10px 0 10px 0;' + } ); + ua.manualDeleteFillData( editor.body ); + ok(editor.body.getElementsByTagName('h1').length==3,'选中多行的部分,设置成标题1'); + equal( editor.body.getElementsByTagName('h1')[0].getAttribute( 'label' ), '标题1', '标题1' ); + var hStyle = $( editor.body.getElementsByTagName('h1')[0] ); + ok( editor.body.getElementsByTagName('h1')[0].style.borderBottomWidth == '1px' , '检查边框宽' ); + ok( hStyle.css( 'border-bottom-style' ) == 'solid' , '检查边框风格' ); + ok( hStyle.css( 'padding-bottom' ) == '0px'&&hStyle.css( 'padding-top' ) == '0px'&&hStyle.css( 'padding-left' ) == '0px'&&hStyle.css( 'padding-right' ) == '3px' , '检查padding' ); + ok( hStyle.css( 'margin-bottom' ) == '10px'&&hStyle.css( 'margin-top' ) == '10px'&&hStyle.css( 'margin-left' ) == '0px'&&hStyle.css( 'margin-right' ) == '0px' , '检查margin' ); + if ( ua.browser.ie&&ua.browser.ie<9 ) + ok( hStyle.css( 'border-bottom-color' ) == '#ccc' , '检查边框颜色' ); + else + ok( hStyle.css( 'border-bottom-color' ) == 'rgb(204, 204, 204)' , '检查边框颜色' ); + equal( editor.body.getElementsByTagName('h1')[1].getAttribute( 'label' ), '标题1', '标题1' ); + var hStyle = $( editor.body.getElementsByTagName('h1')[1] ); + ok( editor.body.getElementsByTagName('h1')[1].style.borderBottomWidth == '1px' , '检查边框宽' ); + ok( hStyle.css( 'border-bottom-style' ) == 'solid' , '检查边框风格' ); + ok( hStyle.css( 'padding-bottom' ) == '0px'&&hStyle.css( 'padding-top' ) == '0px'&&hStyle.css( 'padding-left' ) == '0px'&&hStyle.css( 'padding-right' ) == '3px' , '检查padding' ); + ok( hStyle.css( 'margin-bottom' ) == '10px'&&hStyle.css( 'margin-top' ) == '10px'&&hStyle.css( 'margin-left' ) == '0px'&&hStyle.css( 'margin-right' ) == '0px' , '检查margin' ); + if ( ua.browser.ie&&ua.browser.ie<9 ) + ok( hStyle.css( 'border-bottom-color' ) == '#ccc' , '检查边框颜色' ); + else + ok( hStyle.css( 'border-bottom-color' ) == 'rgb(204, 204, 204)' , '检查边框颜色' ); + equal( editor.body.getElementsByTagName('h1')[2].getAttribute( 'label' ), '标题1', '标题1' ); + var hStyle = $( editor.body.getElementsByTagName('h1')[2] ); + ok( editor.body.getElementsByTagName('h1')[2].style.borderBottomWidth == '1px' , '检查边框宽' ); + ok( hStyle.css( 'border-bottom-style' ) == 'solid' , '检查边框风格' ); + ok( hStyle.css( 'padding-bottom' ) == '0px'&&hStyle.css( 'padding-top' ) == '0px'&&hStyle.css( 'padding-left' ) == '0px'&&hStyle.css( 'padding-right' ) == '3px' , '检查padding' ); + ok( hStyle.css( 'margin-bottom' ) == '10px'&&hStyle.css( 'margin-top' ) == '10px'&&hStyle.css( 'margin-left' ) == '0px'&&hStyle.css( 'margin-right' ) == '0px' , '检查margin' ); + if ( ua.browser.ie&&ua.browser.ie<9 ) + ok( hStyle.css( 'border-bottom-color' ) == '#ccc' , '检查边框颜色' ); + else + ok( hStyle.css( 'border-bottom-color' ) == 'rgb(204, 204, 204)' , '检查边框颜色' ); + +} ); +test( 'block的元素-样式的反复转换:块-内联;包含的选取方式:闭合、多段部分', function () { + var editor = te.obj[0]; + editor.setContent( '

    hello

    world

    ' ); + var range = editor.selection.getRange(); + range.setStart(editor.body.firstChild,0).setEnd(editor.body.lastChild,1).select();//现设块样式 + editor.execCommand( 'customstyle', { + style:'border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:center;margin:0 0 20px 0;', + label:'居中标题', + tag:'h1' + } ); + range.setStart(editor.body.getElementsByTagName('h1')[0],0).collapse(true).select();//闭合选区 + editor.execCommand( 'customstyle', { + tag:'span', + label:'强调', + style:'font-style:italic;font-weight:bold;color:#000' + } ); + ua.manualDeleteFillData( editor.body ); + equal( editor.body.getElementsByTagName('span')[0].getAttribute( 'label' ), '强调', '闭合选区设置样式:强调' ); + var hStyle = $( editor.body.getElementsByTagName('span')[0] ); + if ( ua.browser.webkit ) + ok( hStyle.css( 'font-style' ) == 'italic'&&hStyle.css( 'font-weight' ) == 'bold' , '检查字体' ); + else + ok( hStyle.css( 'font-style' ) == 'italic'&&hStyle.css( 'font-weight' ) == '700' , '检查字体' ); + if(ua.browser.ie&&ua.browser.ie<9) + equal( hStyle.css( 'color' ) , '#000' , '检查颜色' ); + else + equal( hStyle.css( 'color' ) ,'rgb(0, 0, 0)' , '检查颜色' ); + range.setStart(editor.body.getElementsByTagName('h1')[0].lastChild,0).setEnd(editor.body.getElementsByTagName('h1')[1].firstChild,2).select();//多段部分 + editor.execCommand( 'customstyle', { + tag:'span', + label:'明显强调', + style:'font-style:italic;font-weight:bold;color:rgb(51, 153, 204)' + } ); + ua.manualDeleteFillData( editor.body ); + equal( editor.body.getElementsByTagName('h1')[1].firstChild.getAttribute( 'label' ), '明显强调', '闭合选区设置样式:明显强调' ); + var hStyle = $( editor.body.getElementsByTagName('h1')[1].firstChild ); + if ( ua.browser.webkit ) + ok( hStyle.css( 'font-style' ) == 'italic'&&hStyle.css( 'font-weight' ) == 'bold' , '检查字体' ); + else + ok( hStyle.css( 'font-style' ) == 'italic'&&hStyle.css( 'font-weight' ) == '700' , '检查字体' ); + if(ua.browser.ie&&ua.browser.ie<9) + equal( hStyle.css( 'color' ) , 'rgb(51,153,204)', '检查颜色' ); + else + equal( hStyle.css( 'color' ) ,'rgb(51, 153, 204)' , '检查颜色' ); +} ); +test( 'block的元素-样式的反复转换:内联-块;包含的选取方式:闭合', function () { //从内联-块的转换意义不大,其实还是针对块的转换,就不做多种方式选取了 + var editor = te.obj[0]; + editor.setContent( '

    hello

    ' ); + var range = editor.selection.getRange(); + range.setStart(editor.body.firstChild,0).setEnd(editor.body.firstChild,1).select(); + editor.execCommand( 'customstyle', { + tag:'span', + label:'强调', + style:'font-style:italic;font-weight:bold;color:#000' + } ); + range.setStart(editor.body.firstChild,0).collapse(true).select(); + editor.execCommand( 'customstyle', { + style:'border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:center;margin:0 0 20px 0;', + label:'居中标题', + tag:'h1' + } ); + ua.manualDeleteFillData( editor.body ); + equal( editor.body.getElementsByTagName('h1')[0].getAttribute( 'label' ), '居中标题', '居中标题' ); + var hStyle = $( editor.body.getElementsByTagName('h1')[0] ); + ok( editor.body.getElementsByTagName('h1')[0].style.borderBottomWidth == '2px' , '检查边框宽' ); + ok( hStyle.css( 'border-bottom-style' ) == 'solid' , '检查边框风格' ); + ok( hStyle.css( 'padding-bottom' ) == '0px'&&hStyle.css( 'padding-top' ) == '0px'&&hStyle.css( 'padding-left' ) == '0px'&&hStyle.css( 'padding-right' ) == '4px' , '检查padding' ); + ok( hStyle.css( 'margin-bottom' ) == '20px'&&hStyle.css( 'margin-top' ) == '0px'&&hStyle.css( 'margin-left' ) == '0px'&&hStyle.css( 'margin-right' ) == '0px' , '检查margin' ); + if ( ua.browser.ie&&ua.browser.ie<9 ) + ok( hStyle.css( 'border-bottom-color' ) == '#ccc' , '检查边框颜色' ); + else + ok( hStyle.css( 'border-bottom-color' ) == 'rgb(204, 204, 204)' , '检查边框颜色' ); + if(!editor.body.getElementsByTagName('h1')[0].firstChild.data ){return;} + equal( editor.body.getElementsByTagName('h1')[0].firstChild.tagName.toLowerCase(),'span','h1内包含样式:强调'); + equal( editor.body.getElementsByTagName('h1')[0].firstChild.getAttribute( 'label' ), '强调', '闭合选区设置样式:强调' ); + var hStyle = $( editor.body.getElementsByTagName('span')[0] ); + if ( ua.browser.webkit ) + ok( hStyle.css( 'font-style' ) == 'italic'&&hStyle.css( 'font-weight' ) == 'bold' , '检查字体' ); + else + ok( hStyle.css( 'font-style' ) == 'italic'&&hStyle.css( 'font-weight' ) == '700' , '检查字体' ); + if(ua.browser.ie&&ua.browser.ie<9) + equal( hStyle.css( 'color' ) , '#000' , '检查颜色' ); + else + equal( hStyle.css( 'color' ) ,'rgb(0, 0, 0)' , '检查颜色' ); +} ); +test( 'block的元素-样式的反复转换:内联-内联;包含的选取方式:闭合,非闭合,多段', function () { + var div = document.body.appendChild( document.createElement( 'div' ) ); + var editor = new baidu.editor.Editor({'initialContent':'

    欢迎使用ueditor

    ','elementPathEnabled' : true,'autoFloatEnabled':false}); + + stop(); + setTimeout(function(){ + editor.render( div ); + setTimeout(function(){ + editor.setContent( '

    hello

    world

    ' ); + var range = editor.selection.getRange(); + range.setStart(editor.body.firstChild,0).setEnd(editor.body.firstChild,1).select(); + editor.execCommand( 'customstyle', { + tag:'span', + label:'强调', + style:'font-style:italic;font-weight:bold;color:#000' + } ); + equal( editor.body.getElementsByTagName('p')[0].firstChild.tagName.toLowerCase(), 'span', '闭合选区设置样式:强调' ); + equal( editor.body.getElementsByTagName('p')[0].firstChild.getAttribute( 'label' ), '强调', '闭合选区设置样式:强调' ); + var hStyle = $( editor.body.getElementsByTagName('span')[0] ); + if ( ua.browser.webkit ) + ok( hStyle.css( 'font-style' ) == 'italic'&&hStyle.css( 'font-weight' ) == 'bold' , '检查字体' ); + else + ok( hStyle.css( 'font-style' ) == 'italic'&&hStyle.css( 'font-weight' ) == '700' , '检查字体' ); + if(ua.browser.ie&&ua.browser.ie<9) + equal( hStyle.css( 'color' ) , '#000' , '检查颜色' ); + else + equal( hStyle.css( 'color' ) ,'rgb(0, 0, 0)' , '检查颜色' ); + range.setStart(editor.body.firstChild.firstChild.firstChild,0).setEnd(editor.body.lastChild.firstChild,3).select(); + editor.execCommand( 'customstyle', { + tag:'span', + label:'明显强调', + style:'font-style:italic;font-weight:bold;color:rgb(51, 153, 204)' + } ); + range.selectNode(editor.body.firstChild).select(); + var eles = editor.queryCommandValue( 'elementpath' ); + ua.checkElementPath( eles, ['body', 'p', 'span', 'span'], '选中第一行' ); + var span2 = editor.body.getElementsByTagName('p')[0].firstChild.firstChild; + var hStyle = $( span2 ); + equal( span2.tagName.toLowerCase(), 'span', '非闭合选区设置样式:明显强调' ); + equal(span2.getAttribute( 'label' ), '明显强调', '非闭合选区设置样式:明显强调' ); + if ( ua.browser.webkit ) + ok( hStyle.css( 'font-style' ) == 'italic'&&hStyle.css( 'font-weight' ) == 'bold' , '检查字体' ); + else + ok( hStyle.css( 'font-style' ) == 'italic'&&hStyle.css( 'font-weight' ) == '700' , '检查字体' ); + if(ua.browser.ie&&ua.browser.ie<9) + equal( hStyle.css( 'color' ) , 'rgb(51,153,204)' , '检查颜色' ); + else + equal( hStyle.css( 'color' ) ,'rgb(51, 153, 204)', '检查颜色' ); + var span3 = editor.body.getElementsByTagName('p')[1].firstChild; + var hStyle = $( span3 ); + equal( span3.tagName.toLowerCase(), 'span', '非闭合选区设置样式:明显强调' ); + equal(span3.getAttribute( 'label' ), '明显强调', '非闭合选区设置样式:明显强调' ); + if ( ua.browser.webkit ) + ok( hStyle.css( 'font-style' ) == 'italic'&&hStyle.css( 'font-weight' ) == 'bold' , '检查字体' ); + else + ok( hStyle.css( 'font-style' ) == 'italic'&&hStyle.css( 'font-weight' ) == '700' , '检查字体' ); + if(ua.browser.ie&&ua.browser.ie<9) + equal( hStyle.css( 'color' ) ,'rgb(51,153,204)', '检查颜色' ); + else + equal( hStyle.css( 'color' ) ,'rgb(51, 153, 204)', '检查颜色' ); + range.setStart(span2.firstChild,0).collapse(true).select(); + editor.execCommand( 'customstyle', { + tag:'span', + label:'强调', + style:'font-style:italic;font-weight:bold;color:#000' + } ); + equal( span2.firstChild.tagName.toLowerCase(), 'span', '非闭合选区设置样式:强调' ); + equal( span2.firstChild.getAttribute( 'label' ), '强调', '闭合选区设置样式:强调' ); + var hStyle = $( span2.firstChild ); + if ( ua.browser.webkit ) + ok( hStyle.css( 'font-style' ) == 'italic'&&hStyle.css( 'font-weight' ) == 'bold' , '检查字体' ); + else + ok( hStyle.css( 'font-style' ) == 'italic'&&hStyle.css( 'font-weight' ) == '700' , '检查字体' ); + if(ua.browser.ie&&ua.browser.ie<9) + equal( hStyle.css( 'color' ) ,'#000', '检查颜色' ); + else + equal( hStyle.css( 'color' ) ,'rgb(0, 0, 0)', '检查颜色' ); + start(); + },50); +},50); + +} ); + +test('h1空节点',function(){ + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild,0).collapse(1).select(); + editor.execCommand('customstyle',{tag:'h1', label:'居中标题', style:'border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:center;margin:0 0 20px 0;'}); + ua.manualDeleteFillData(editor.body); + equal(editor.body.firstChild.tagName,'H1','h1标签'); + equal($(editor.body.firstChild).css('textAlign'),'center','居中'); + range.setStart(editor.body.firstChild.firstChild,0).collapse(1).select(); + ua.keyup(editor.body,{keyCode:32}); + var br = ua.browser.ie?' ':'
    '; +// 无法模拟空格 +// equal(ua.getChildHTML(editor.body),'

    '+br+'

    ','h1空节点点击空格键'); + + editor.execCommand('customstyle',{tag:'h1', label:'居中标题', style:'border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:center;margin:0 0 20px 0;'}); + range.setStart(editor.body.firstChild,0).collapse(1).select(); + ua.keyup(editor.body,{keyCode:13}); + ua.manualDeleteFillData(editor.body); + equal(ua.getChildHTML(editor.body),'

    '+br+'

    ','h1空节点点击回车键'); +}); + +test('trace 1840:单击后插入“居中标题”',function(){ + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent( '

    ' ); + range.setStart(body.firstChild,0).select(); + editor.execCommand('customstyle',{tag:'h1', label:'居中标题', style:'border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:center;margin:0 0 20px 0;'}); + equal(body.firstChild.tagName.toLowerCase(),'h1','检查tagname'); + var childs = body.firstChild.childNodes; + var count = 0; + for(var index=0;index
    1
    2
    '); +// var br = ua.browser.ie?'':'
    '; + var html = '
    1
    2
    '; + ua.checkSameHtml(editor.body.innerHTML,html,'table补全,对代码的行号不处理') +} ); +test( '空td,th,caption', function () { + var editor = te.obj[0]; + editor.setContent( '
    ' ); + var br = ua.browser.ie&&ua.browser.ie<11?'':'
    '; + var html = '
    '+br+'
    '+br+''+br+'
    '+br+''+br+'
    '+br+''+br+'
    '; + ua.checkSameHtml(editor.body.innerHTML,html,'空td,th,caption,添加text') +} ); +test( '转换a标签', function () { + var editor = te.obj[0]; + editor.setContent( '' ); + var br = ua.browser.ie?' ':'
    '; + var html = '

    '; + ua.checkSameHtml(html,editor.body.innerHTML,'转换a标签'); +} ); +test( '转换img标签', function () { + var editor = te.obj[0]; + editor.setContent( '' ); +// var html = '

    '; + equal(editor.body.getElementsByTagName('img')[0].getAttribute('_src'),"http://www.baidu.com/img/shouye_b5486898c692066bd2cbaeda86d74448.gif"); +} ); +test( '删span中的white-space标签', function () { + if(ua.browser.webkit){ + var editor = te.obj[0]; + editor.setContent( 'sadfsadf' ); + var html = '

    sadfsadf

    '; + ua.checkSameHtml(html,editor.body.innerHTML,'删span中的white-space标签'); + } +} ); +//TODO 1.2.6 +//test( '删p中的margin|padding标签', function () { +// var editor = te.obj[0]; +// editor.setContent( '

    hello

    ' ); +// var html = '

    hello

    '; +// ua.checkSameHtml(html,editor.body.innerHTML,'删p中的margin|padding标签'); +//} ); +test( '给空p加br&&转对齐样式', function () { + var editor = te.obj[0]; + editor.setContent( '

    ' ); + var br = ua.browser.ie?' ':'
    '; +// "


    " + var html = '

    '+br+'

    '; + ua.checkSameHtml(editor.body.innerHTML,html, '给空p加br&&转对齐样式'); +} ); +test( '删div', function () { + var editor = te.obj[0]; + editor.setContent( '

    视频

    ' ); + var html = '

    视频

    '; + ua.checkSameHtml(html,editor.body.innerHTML,'删div'); +} ); +test( 'allowDivTransToP--false 不转div', function () { + var div = document.body.appendChild(document.createElement('div')); + div.id ='ue'; + var editor = UE.getEditor('ue',{allowDivTransToP:false}); + stop(); + editor.ready(function(){ + var html = '
    视频
    '; + editor.setContent( html ); + var padding = (ua.browser.ie&&ua.browser.ie<9)?'PADDING-BOTTOM: 1px; PADDING-LEFT: 1px; PADDING-RIGHT: 1px; PADDING-TOP: 1px':'padding: 1px;'; + var html_a = '
    视频
    '; + ua.checkSameHtml(html_a,editor.body.innerHTML,'不转div'); + UE.delEditor('ue'); + start(); + }); +} ); +test( 'li', function () { + var editor = te.obj[0]; + editor.setContent( '
  • ' ); + var html = ''; + ua.checkSameHtml(html,editor.body.innerHTML,'li'); +} ); +//
  • pistachio天
  • +//TODO 现在在过滤机制里面去除无用的标签 +test( "getContent--去除无用的空标签:autoClearEmptyNode==true", function() { + var div = document.body.appendChild(document.createElement('div')); + div.id = 'ue'; + var editor = UE.getEditor('ue',{autoClearEmptyNode:true,'autoFloatEnabled':false}); + // + stop(); + editor.ready(function () { + te.dom.push(div); + editor.focus(); + var innerHTML = 'xxem
    xxxx
    '; + editor.setContent(innerHTML); + editor.execCommand('source'); + setTimeout(function () { + editor.execCommand('source'); + setTimeout(function () { + equal(editor.getContent(), '

    xxem

    xxxx

    ', "span style空,套空的em和不空的em"); + //style="color:#c4bd97;" + innerHTML = 'xxem'; + editor.setContent(innerHTML); + if (ua.browser.ie>8) { + ua.checkSameHtml(editor.getContent().toLowerCase(), '

    xxem

    ', "span style不空,套空的em和不空的em"); + } + else { + ua.checkSameHtml(editor.getContent().toLowerCase(),'

    xxem

    ', "span style不空,套空的em和不空的em"); + } + innerHTML = 'xxem'; + editor.setContent(innerHTML); + /*inline标签上只要有属性就不清理*/ + if (ua.browser.ie >8) { + ua.checkSameHtml(editor.getContent().toLowerCase(), '

    xxem

    ', "span 有style但内容为空"); + } + else { + ua.checkSameHtml(editor.getContent().toLowerCase(), '

    xxem

    ', "span 有style但内容为空"); + } + innerHTML = 'asdfxxem'; + editor.setContent(innerHTML); + if (ua.browser.ie >8) { + ua.checkSameHtml(editor.getContent().toLowerCase(), '

    asdfxxem

    ', "span 有style内容不空"); + } + else { + ua.checkSameHtml(editor.getContent().toLowerCase(), '

    asdfxxem

    ', "span 有style内容不空"); + } + innerHTML = 'axxem'; + editor.setContent(innerHTML); + ua.checkSameHtml(editor.getContent(), '

    axxem

    ', "a 有href但内容为空,不过滤a标签"); + setTimeout(function () { + UE.delEditor('ue'); + start() + },300); + }, 50); + }, 50); + }); +}); + +//editor.options.autoClearEmptyNode +test("getContent--不去除无用的空标签:autoClearEmptyNode==false", function() { + var div = document.body.appendChild(document.createElement('div')); + div.id = 'ue'; + var editor = UE.getEditor('ue',{autoClearEmptyNode:false,'autoFloatEnabled':false}); + stop(); + editor.ready(function () { + te.dom.push(div); + editor.focus(); + var innerHTML = 'xxem'; + editor.setContent(innerHTML); + equal(editor.getContent().toLowerCase(), '

    xxem

    ', "span style空,套空的em和不空的em"); + innerHTML = 'xxem'; + editor.setContent(innerHTML); + ua.manualDeleteFillData(editor.body); + if (ua.browser.ie >8) { + ua.checkSameHtml(editor.getContent().toLowerCase(), '

    xxem

    ', "span 有style但内容为空"); + } + else { + ua.checkSameHtml(editor.getContent().toLowerCase(), '

    xxem

    ', "span 有style但内容为空"); + } + setTimeout(function () { + UE.delEditor('ue'); + start() + }, 500); + }); +}); + +test("getContent--转换空格,nbsp与空格相间显示", function() { + var editor = te.obj[0]; + editor.focus(); + //策略改变,原nbsp不做处理,类似:'

    d

    '中的空格会被过滤 + var innerHTML = '
    x x x  x    
    '; + editor.setContent(innerHTML); + equal(editor.getContent(), '

    x  x   x  x     

    ', "转换空格,nbsp与空格相间显示"); +}); +test( '转换script标签', function () { + var editor = te.obj[0]; + var br = ua.browser.ie?'

     

    ':('


    '); + editor.setContent( '' ); + var html = br+'
    '; + ua.checkSameHtml(editor.body.innerHTML,html,'转换script标签'); +} ); +test( 'trace 3698 1.3.0 版本修复: script(style)标签里面的内容不转码', function () { + var editor = te.obj[0]; + editor.setContent(''); + equal(editor.document.getElementById('myEditor').innerHTML,'','内容不保留');//1.3.6 针对ie下标签不能隐藏问题的修复 + // todo 1.3.0 trace 3698 + editor.setContent(''); + var br = ua.browser.ie?'

     

    ':('


    '); + ua.checkSameHtml(editor.getContent(),br+'','内容不转码'); +} ); +test( '转换style标签:style data不为空', function () { + var editor = te.obj[0]; + editor.setContent( '' ); + var br = ua.browser.ie?'

     

    ':('


    '); + var html = br+'
    '; + ua.checkSameHtml(editor.body.innerHTML,html,'转换script标签'); +} ); +test( '转换style标签:style data不空', function () { + var editor = te.obj[0]; + editor.setContent( '' ); + var br = ua.browser.ie?'

     

    ':('


    '); + + var html = br+'
    '; + ua.checkSameHtml(editor.body.innerHTML,html,'转换script标签'); +} ); +test( 'div出编辑器转换', function () { + var editor = te.obj[0]; + var str = '' ; + var html = '
    ueditor
    '; + editor.body.innerHTML = html; + editor.execCommand( 'source' ); + stop(); + setTimeout(function(){ + equal(editor.getContent(),str,'div出编辑器转换'); + start(); + },20); +} ); +test( 'img出编辑器转换', function () { + var editor = te.obj[0]; + var str = ua.browser.ie? '

    ':'

    ' ; + if(ua.browser.ie==8) + str ='

    '; + if(ua.browser.ie==11) + str = '

    '; + var html = '

    '; + editor.body.innerHTML = html; + editor.execCommand( 'source' ); + stop(); + setTimeout(function(){ + ua.checkSameHtml(editor.getContent(),str,'img出编辑器转换'); + start(); + },20); +} ); +//ue.setContent(''); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/directionality.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/directionality.js new file mode 100644 index 000000000..39c912972 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/directionality.js @@ -0,0 +1,149 @@ +module( "plugins.directionality" ); + +//1 notblockelement&&collapsed=false +test( '非块元素,不闭合', function() { + var editor = te.obj[0], d = editor.document, range = te.obj[1], db = editor.body; + editor.setContent('xxxxgggsiekes'); + setTimeout(function () { + range.selectNode(d.getElementsByTagName("strong")[0]).collapse(true).select(); + + equal(editor.queryCommandValue('directionality'), "ltr", "ltr queryCommandValue"); + editor.execCommand('directionality', "rtl"); + equal(ua.getChildHTML(db), "

    xxxxgggsiekes

    ", "directionrtl"); + equal(editor.queryCommandValue('directionality'), "rtl", "directionrtl queryCommandValue"); + + editor.execCommand('directionality', "ltr"); + equal(ua.getChildHTML(db), "

    xxxxgggsiekes

    ", "directionltr"); + equal(editor.queryCommandValue('directionality'), "ltr", "directionltr queryCommandValue"); + start(); + }, 20); + stop(); +} ); +//2 blockelement&&collapsed=false +test( '块元素,不闭合', function() { + var editor = te.obj[0],d = editor.document,range = te.obj[1],db = editor.body; + editor.setContent('

    gggsiekes

    '); + setTimeout(function () { + range.selectNode(d.getElementsByTagName("h1")[0]).select(); + + editor.execCommand('directionality', "ltr"); + equal(ua.getChildHTML(db), "

    gggsiekes

    ", "directionltr"); + equal(editor.queryCommandValue('directionality'), "ltr", "directionltr queryCommandValue"); + + editor.execCommand('directionality', "rtl"); + equal(ua.getChildHTML(db), "

    gggsiekes

    ", "directionrtl"); + equal(editor.queryCommandValue('directionality'), "rtl", "directionrtl queryCommandValue"); + start(); + }, 20); + stop(); +} ); + +test( '非块元素,闭合', function() { + var editor = te.obj[0], d = editor.document, range = te.obj[1], db = editor.body; + editor.setContent('gggsiekes'); + setTimeout(function () { + range.selectNode(d.getElementsByTagName("strong")[0].firstChild).collapse(true).select(); + editor.execCommand('directionality', "rtl"); + equal(ua.getChildHTML(db), "

    gggsiekes

    ", "directionrtl"); + equal(editor.queryCommandValue('directionality'), "rtl", "directionrtl queryCommandValue"); + + editor.execCommand('directionality', "ltr"); + equal(ua.getChildHTML(db), "

    gggsiekes

    ", "directionltr"); + equal(editor.queryCommandValue('directionality'), "ltr", "directionltr queryCommandValue"); + + editor.setContent('gggsiekes'); + range.selectNode(d.getElementsByTagName("strong")[0]).collapse(true).select(); + editor.execCommand('directionality', "rtl"); + equal(ua.getChildHTML(db), "

    gggsiekes

    ", "directionrtl"); + equal(editor.queryCommandValue('directionality'), "rtl", "查询文字输入方向为从右向左"); + + editor.execCommand('directionality', "ltr"); + equal(ua.getChildHTML(db), "

    gggsiekes

    ", "从左向右"); + equal(editor.queryCommandValue('directionality'), "ltr", "查询文字输入方向为从左向右"); + start(); + }, 20); + stop(); +} ); +//4 range between blockelement and notblockelement +test( '选区包含块和非块元素', function() { + var editor = te.obj[0],d = editor.document,range = te.obj[1],db = editor.body; + editor.setContent('gggsiekes

    xx

    '); + setTimeout(function () { + range.setStart(d.getElementsByTagName("strong")[0].firstChild, 0).setEnd(d.getElementsByTagName("p")[1].firstChild, 2).select(); + editor.execCommand('directionality', "rtl"); + equal(ua.getChildHTML(db), "

    gggsiekes

    xx

    ", "directionrtl"); + equal(editor.queryCommandValue('directionality'), "rtl", "directionrtl queryCommandValue"); + + editor.execCommand('directionality', "ltr"); + equal(ua.getChildHTML(db), "

    gggsiekes

    xx

    ", "directionltr"); + equal(editor.queryCommandValue('directionality'), "ltr", "directionltr queryCommandValue"); + start(); + }, 20); + stop(); +} ); +//5 betweenblockelement +test( '选区在两个块元素之间', function() { + var editor = te.obj[0], d = editor.document, range = te.obj[1], db = editor.body; + editor.setContent('

    sss

    xx

    '); + setTimeout(function () { + range.setStart(d.getElementsByTagName("p")[0].firstChild, 0).setEnd(d.getElementsByTagName("p")[1].firstChild, 2).select(); + editor.execCommand('directionality', "rtl"); + equal(ua.getChildHTML(db), "

    sss

    xx

    ", "directionrtl"); + equal(editor.queryCommandValue('directionality'), "rtl", "directionrtl queryCommandValue"); + + editor.execCommand('directionality', "ltr"); + equal(ua.getChildHTML(db), "

    sss

    xx

    ", "directionltr"); + equal(editor.queryCommandValue('directionality'), "ltr", "directionltr queryCommandValue"); + start(); + }, 20); + stop(); +} ); +//6 br +test( 'betweenblockelement', function() { + var editor = te.obj[0],d = editor.document,range = te.obj[1],db = editor.body; + editor.setContent( '

    xx

    br' ); + setTimeout(function () { + range.setStart(d.getElementsByTagName("p")[0].firstChild, 0).setEnd(db.lastChild, 1).select(); + editor.execCommand('directionality', "rtl"); + equal(ua.getChildHTML(db), "

    xx

    br

    ", "directionrtl"); + equal(editor.queryCommandValue('directionality'), "rtl", "directionrtl queryCommandValue"); + + editor.execCommand('directionality', "ltr"); + equal(ua.getChildHTML(db), "

    xx

    br

    ", "directionltr"); + equal(editor.queryCommandValue('directionality'), "ltr", "directionltr queryCommandValue"); + start(); + }, 20); + stop(); +} ); +//7   +test( '空格 ', function() { + var editor = te.obj[0], d = editor.document, range = te.obj[1], db = editor.body; + editor.setContent('

    xx

     '); + setTimeout(function () { + range.setStart(d.getElementsByTagName("p")[0].firstChild, 0).setEnd(db.lastChild, 1).select(); + editor.execCommand('directionality', "rtl"); + equal(ua.getChildHTML(db), "

    xx

     

    ", "directionrtl"); + equal(editor.queryCommandValue('directionality'), "rtl", "directionrtl queryCommandValue"); + + editor.execCommand('directionality', "ltr"); + equal(ua.getChildHTML(db), "

    xx

     

    ", "directionltr"); + equal(editor.queryCommandValue('directionality'), "ltr", "directionltr queryCommandValue"); + start(); + }, 20); + stop(); +} ); + +test('body',function(){ + var editor=te.obj[0]; + var range=te.obj[1]; + editor.setContent('

    xx

    '); + range.setStart(editor.body,0).collapse(1).select(); + editor.execCommand('directionality', 'rtl'); + if(ua.browser.ie){ + equal( ua.getChildHTML( editor.body ), "

    xx

    ", "directionrtl" ); + } + else{ + equal( ua.getChildHTML( editor.body ), "

    xx

    ", "directionrtl" ); + } + +}) diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/dragdrop.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/dragdrop.js new file mode 100644 index 000000000..90847bfab --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/dragdrop.js @@ -0,0 +1,37 @@ +/** + * Created with JetBrains PhpStorm. + * User: Administrator + * Date: 13-4-29 + * Time: 上午11:40 + * To change this template use File | Settings | File Templates. + */ +module( 'plugins.dragdrop' ); +test( 'trace 3385:拖拽图像不会把p切开', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + stop(); + + body.innerHTML = '

    hel

    lo

    '; + range.selectNode(body.childNodes[1]).select(); + equal(body.childNodes.length,3,'img在两个p之间'); + equal(body.firstChild.tagName.toLowerCase(),"p",'img在两个p之间'); + equal(body.childNodes[1].tagName.toLowerCase(),"img",'img在两个p之间'); + equal(body.childNodes[2].tagName.toLowerCase(),"p",'img在两个p之间'); + + ua.dragend(body); + setTimeout(function(){ + equal(body.childNodes.length,1,'img在p里面'); + equal(body.firstChild.tagName.toLowerCase(),'p','img在p里面'); + equal(body.firstChild.childNodes[1].tagName.toLowerCase(),'img','img在p里面'); + body.innerHTML = '

    asds

    ad

    '; + range.selectNode(body.childNodes[1]).select(); + ua.dragend(body); + setTimeout(function(){ + equal(body.childNodes.length,1,'拖拽图像不会把p切开,删除空span:img在p里面') + equal(body.firstChild.tagName.toLowerCase(),'p','img在p里面'); + equal(body.firstChild.childNodes[1].tagName.toLowerCase(),'img','img在p里面'); + start(); + },300); + },100); +} ); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/elementpath.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/elementpath.js new file mode 100644 index 000000000..efde71c12 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/elementpath.js @@ -0,0 +1,263 @@ +module('plugins.elementpath'); +/* +
  • 表格 +
  • 列表 +
  • 文本 +
  • 图片 +
  • 超链接 +
  • 加粗加斜 +
  • 下划线,删除线 + * */ + +//1.2的版本中,表格的外面会自动套一个带格式的div +test('表格', function () { + var div = document.body.appendChild(document.createElement('div')); + div.id = 'ue'; + var editor = UE.getEditor('ue', {'initialContent': '

    欢迎使用ueditor

    ', 'elementPathEnabled': true, 'autoFloatEnabled': false}); + editor.ready(function () { + var range = new baidu.editor.dom.Range(editor.document); + editor.setContent('
    hello1strongTexthello2spanText
    '); + var body = editor.body; + /*选中整个表格*/ + range.selectNode(body.firstChild).select(); + var eles = editor.queryCommandValue('elementpath'); + ua.checkElementPath(eles, ['body', 'table', 'tbody', 'tr', 'td'], '选中整个表格'); + /*在单元格中单击*/ + var tds = body.getElementsByTagName('td'); + range.setStart(tds[0].firstChild, 0).collapse(true).select(); + ua.checkElementPath(eles, ['body', 'table', 'tbody', 'tr', 'td'], '在单元格中单击'); + /*在单元格中的加粗文本中单击*/ + ua.manualDeleteFillData(editor.body); + range.setStart(tds[1].firstChild.firstChild, 1).collapse(true).select(); + eles = editor.queryCommandValue('elementpath'); + ua.checkElementPath(eles, ['body', 'table', 'tbody', 'tr', 'td', 'strong'], '在单元格中的加粗文本中单击'); + /*在单元格中的下划线文本中单击*/ + ua.manualDeleteFillData(editor.body); + range.setStart(tds[1].lastChild.firstChild, 1).collapse(true).select(); + eles = editor.queryCommandValue('elementpath'); + ua.checkElementPath(eles, ['body', 'table', 'tbody', 'tr', 'td', 'span'], '在单元格中的下划线文本中单击'); + /*选中有下划线的文本*/ + ua.manualDeleteFillData(editor.body); + range.setStart(tds[1].lastChild.lastChild, 1).setEnd(tds[1].lastChild.lastChild, 4).select(); + eles = editor.queryCommandValue('elementpath'); + ua.checkElementPath(eles, ['body', 'table', 'tbody', 'tr', 'td', 'span'], '选中有下划线的文本'); + setTimeout(function(){ + UE.delEditor('ue'); + te.dom.push(document.getElementById('ue')); + start(); + },200); + }); + stop(); +}); +test(' 通过选区路径取range', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.options.elementPathEnabled = true; + editor.setContent('
    12
    345
    '); + stop(); + setTimeout(function () { + var tds = editor.body.getElementsByTagName('td'); + var trs = editor.body.getElementsByTagName('tr'); + var tbodys = editor.body.getElementsByTagName('tbody'); + var table = editor.body.getElementsByTagName('table'); + range.setStart(tds[3].firstChild, 0).collapse(true).select(); + editor.queryCommandValue('elementpath'); + editor.execCommand('elementpath', '4'); + setTimeout(function () { + range = editor.selection.getRange(); + if (ua.browser.gecko||ua.browser.webkit) { + ua.checkResult(range, trs[1], trs[1], 1, 2, false, '取range--td'); + } else { + if (ua.browser.ie) + ua.checkResult(range, tds[3].firstChild, tds[3].lastChild, 0, 2, false, '取range--td'); + else + ua.checkResult(range, tds[3].firstChild, editor.body, 0, 1, false, '取range--td'); + } + range.setStart(tds[3].firstChild, 1).collapse(1).select(); + editor.execCommand('elementpath', '3'); + setTimeout(function () { + range = editor.selection.getRange(); + if (ua.browser.gecko||ua.browser.webkit) { + ua.checkResult(range, tbodys[0], tbodys[0], 1, 2, false, '取range--tr'); + } else { + if (ua.browser.ie) + ua.checkResult(range, tds[2].firstChild, tds[3].lastChild, 0, 2, false, '取range--tr'); + else + ua.checkResult(range, tds[2].firstChild, editor.body, 0, 1, false, '取range--tr'); + } + range.setStart(tds[3].firstChild, 0).collapse(1).select(); + editor.execCommand('elementpath', '2'); + setTimeout(function () { + range = editor.selection.getRange(); + if (ua.browser.gecko||ua.browser.webkit) { + ua.checkResult(range, table[0], table[0], 0, 1, false, '取range--tbody'); + } else { + if (ua.browser.ie) + ua.checkResult(range, tds[0].firstChild, tds[3].lastChild, 0, 2, false, '取range--tbody'); + else + ua.checkResult(range, editor.body, editor.body, 0, 1, false, '取range--tbody'); + } + editor.setContent('

    45645

    '); + range.selectNode(editor.body.firstChild).select(); + editor.queryCommandValue('elementpath'); + editor.execCommand('elementpath', 1); + setTimeout(function () { + range = editor.selection.getRange(); + var p = editor.body.firstChild; + if (ua.browser.gecko||ua.browser.webkit) { + ua.checkResult(range, editor.body, editor.body, 0, 1, false, '取range--p'); + } else { + ua.checkResult(range, p.firstChild, p.firstChild, 0, 5, false, '取range--p'); + } + start(); + }, 20); + }, 20); + }, 100); + }, 20); + }, 50); +}); + +test('trace 1539:列表', function () { + var div = document.body.appendChild(document.createElement('div')); + var editor = new baidu.editor.Editor({'initialContent': '

    欢迎使用ueditor

    ', 'elementPathEnabled': true, 'autoFloatEnabled': false}); + stop(); + setTimeout(function () { + editor.render(div); + editor.ready(function () { + var range = new baidu.editor.dom.Range(editor.document); + editor.setContent('
    1. hello1
    2. hello2
      hello3
    '); + var body = editor.body; + /*选中所有列表*/ + range.selectNode(body.firstChild).select(); + var eles = editor.queryCommandValue('elementpath'); + ua.checkElementPath(eles, ['body', 'ol', 'li', 'p'], '选中整个列表'); + /*选中列表中的表格*/ + range.selectNode(body.firstChild.getElementsByTagName('table')[0]).select(); + eles = editor.queryCommandValue('elementpath'); + ua.checkElementPath(eles, ['body', 'ol', 'li', 'table', 'tbody', 'tr', 'td'], '选中列表中的表格'); + /*选中列表中的br*/ + range.setStart(body.firstChild.firstChild.nextSibling.firstChild.firstChild, 6).collapse(true).select(); + eles = editor.queryCommandValue('elementpath'); + ua.checkElementPath(eles, ['body', 'ol', 'li', 'p'], '选中列表中的br'); + div.parentNode.removeChild(div); + start(); + }); + }, 20); +}); +test('文本和超链接', function () { + var div = document.body.appendChild(document.createElement('div')); + var editor = new baidu.editor.Editor({'initialContent': '

    欢迎使用ueditor

    ', 'elementPathEnabled': true, 'autoFloatEnabled': false}); + editor.render(div); + stop(); + editor.ready(function () { + var range = new baidu.editor.dom.Range(editor.document); + editor.setContent('
    '); + var body = editor.body; + /*选中文本hello*/ + range.selectNode(body.firstChild.firstChild).select(); + var eles = editor.queryCommandValue('elementpath'); + ua.checkElementPath(eles, ['body', 'p'], '选中文本'); + /*选中超链接*/ + range.selectNode(body.firstChild.lastChild.firstChild).select(); + eles = editor.queryCommandValue('elementpath'); + ua.checkElementPath(eles, ['body', 'p', 'a'], '选中文本'); + div.parentNode.removeChild(div); + start(); + }); +}); + +//在版本1.2中,如果没有setTimeout在FF(3.6和9都是)中range会出错,其他浏览器没问题 +test('图片', function () { + if(ua.browser.ie>8)return;//todo 1.3.6 #3847 + var div = document.body.appendChild(document.createElement('div')); + div.id = "ue"; + var editor = UE.getEditor("ue",{'initialContent': '

    欢迎使用ueditor

    ', 'elementPathEnabled': true, 'autoFloatEnabled': false}); + stop(); + editor.ready(function () { + var range = new baidu.editor.dom.Range(editor.document); + editor.setContent('

    hello

    '); + var body = editor.body; + /*选中图片*/ + setTimeout(function () { + range.selectNode(body.firstChild.lastChild).select(); + var eles = editor.queryCommandValue('elementpath'); + ua.checkElementPath(eles, ['body', 'p', 'img'], '选中图片'); + setTimeout(function () { + UE.delEditor('ue'); + te.dom.push(document.getElementById('ue')); + start(); + }, 200); + + }, 20) + }); +}); + +test('锚点', function () { + if(ua.browser.ie>8)return;//todo 1.3.6 #3847 + var div = document.body.appendChild(document.createElement('div')); + var editor = new baidu.editor.Editor({'initialContent': '

    欢迎使用ueditor

    ', 'elementPathEnabled': true, 'autoFloatEnabled': false}); + editor.render(div); + stop(); + editor.ready(function () { + var range = new baidu.editor.dom.Range(editor.document); + editor.setContent('

    hello

    '); + var body = editor.body; + /*选中图片*/ + setTimeout(function () { + range.selectNode(body.firstChild.lastChild).select(); + var eles = editor.queryCommandValue('elementpath'); + ua.checkElementPath(eles, ['body', 'p', 'anchor'], '选中锚点'); + div.parentNode.removeChild(div); + start(); + }, 20) + }); +}); +test('文本', function () { + var div = document.body.appendChild(document.createElement('div')); + var editor = new baidu.editor.Editor({'initialContent': '

    欢迎使用ueditor

    ', 'elementPathEnabled': true, 'autoFloatEnabled': false}); + editor.render(div); + stop(); + editor.ready(function () { + var range = new baidu.editor.dom.Range(editor.document); + editor.setContent('hello'); + var body = editor.body; + /*选中图片*/ + setTimeout(function () { + range.setStart(body.firstChild.firstChild, 1).setEnd(body.firstChild.firstChild, 3).select(); + var eles = editor.queryCommandValue('elementpath'); + ua.checkElementPath(eles, ['body', 'p'], '选中文本'); + div.parentNode.removeChild(div); + start(); + }, 20) + }); +}); + +test('trace 3995表格和文本', function () { + if(ua.browser.ie==11)return;//todo dev1.4.0 + + var div = document.body.appendChild(document.createElement('div')); + var editor = new baidu.editor.Editor({'initialContent': '

    欢迎使用ueditor

    ', 'elementPathEnabled': true, 'autoFloatEnabled': false}); + editor.render(div); + stop(); + editor.ready(function () { + var range = new baidu.editor.dom.Range(editor.document); + var body = editor.body; + range.setStart(body.firstChild.firstChild, 2).collapse(true).select(); + editor.execCommand('inserttable'); + /*选中图片*/ + setTimeout(function () { + range.selectNode(body).select(); + var eles = editor.queryCommandValue('elementpath'); + editor.execCommand('elementpath', 1); + ua.checkElementPath(eles, ['body', 'p'], '选中文本和表格'); + range.selectNode(body.firstChild.nextSibling).select(); + eles = editor.queryCommandValue('elementpath'); + ua.checkElementPath(eles, ['body', 'table'], '选中表格'); + editor.execCommand('elementpath', 4); + eles = editor.queryCommandValue('elementpath'); + ua.checkElementPath(eles, ['body', 'table', 'tbody', 'tr', 'td'], '选中表格'); + div.parentNode.removeChild(div); + start(); + }, 20); + }); +}); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/enterkey.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/enterkey.js new file mode 100644 index 000000000..83eee009c --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/enterkey.js @@ -0,0 +1,634 @@ +module( 'plugins.enterkey' ); +///* +// 闭合选区 +// 1.p末尾或中间回车 +// 2.列表中回车(关于列表的回车必须加上li这个插件) +// 2.1 列表标号后面有文本 +// 2.2列表标号后没有文本 +// 3.h1后回车 +// 4.带有BIU样式的文本后面回车 +// +// 不闭合选区 +// 1.选中部分表格后回车 +// 2.选中文本后回车 +// + +// 复合操作 +// 1.回车后撤销 +// */ +//fixed in future +/*trace 3174*/ +//test( 'trace 2864:table中回车,br做回车', function () { +// te.dom[0].parentNode.removeChild(te.dom[0]); +// var div2 = document.body.appendChild( document.createElement( 'div' ) ); +// $( div2 ).css( 'width', '500px' ).css( 'height', '500px' ).css( 'border', '1px solid #ccc' ); +// te.dom.push(div2); +// baidu.editor.plugins.table = function(){}; +// var editor = new baidu.editor.Editor({'initialContent':'

    欢迎使用ueditor

    ','autoFloatEnabled':false,'enterTag':'br'}); +// te.obj.push(editor); +// editor.render(div2); +// var range = new baidu.editor.dom.Range( editor.document ); +// te.obj.push(range); +// editor.setContent('
    aa
    ' ); +// stop(); +// setTimeout(function(){ +// te.obj[4].selectNode(editor.body.firstChild.firstChild.firstChild.firstChild).select(); +// ua.keydown(editor.body,{'keyCode':13}); +// setTimeout(function(){ +// equal(ua.getChildHTML(te.obj[3].body.firstChild),'
    ','
    做回车'); +// te.dom[1].parentNode.removeChild(te.dom[1]); +// start(); +// },50); +// },50); +//} ); +//test( 'br做回车,选区非闭合', function () { +// te.dom[0].parentNode.removeChild(te.dom[0]); +// var div2 = document.body.appendChild( document.createElement( 'div' ) ); +// $( div2 ).css( 'width', '500px' ).css( 'height', '500px' ).css( 'border', '1px solid #ccc' ); +// te.dom.push(div2); +// baidu.editor.plugins.table = function(){}; +// var editor = new baidu.editor.Editor({'initialContent':'

    欢迎使用ueditor

    ','autoFloatEnabled':false,'enterTag':'br'}); +// te.obj.push(editor); +// editor.render(div2); +// stop(); +// editor.ready(function(){ +// var range = new baidu.editor.dom.Range( editor.document ); +// te.obj.push(range); +// editor.setContent('

    hello1

    hello2

    ' ); +// +// setTimeout(function(){ +// te.obj[4].setStart(editor.body.firstChild,0).setEnd(editor.body.lastChild,1).select(); +// ua.keydown(editor.body,{'keyCode':13}); +// setTimeout(function(){ +// ua.manualDeleteFillData(te.obj[3].body); +// var html = 'h
    lo'; +// equal(ua.getChildHTML(te.obj[3].body.firstChild),html,'
    做回车'); +// te.dom[1].parentNode.removeChild(te.dom[1]); +// start(); +// },50); +// },50); +// }); +//} ); + +test( 'br做回车,选区非闭合', function () { + te.dom[0].parentNode.removeChild(te.dom[0]); + var div2 = document.body.appendChild( document.createElement( 'div' ) ); + $( div2 ).css( 'width', '500px' ).css( 'height', '500px' ).css( 'border', '1px solid #ccc' ); + te.dom.push(div2); + baidu.editor.plugins.table = function(){}; + var editor = new baidu.editor.Editor({'initialContent':'

    欢迎使用ueditor

    ','autoFloatEnabled':false,'enterTag':'br'}); + te.obj.push(editor); + editor.render(div2); + stop(); + editor.ready(function(){ + var range = new baidu.editor.dom.Range( editor.document ); + te.obj.push(range); + editor.setContent('

    hello

    ' ); + te.obj[4].setStart(editor.body.firstChild.firstChild,1).setEnd(editor.body.firstChild.firstChild,3).select(); + ua.keydown(editor.body,{'keyCode':13}); + setTimeout(function(){ + ua.manualDeleteFillData(te.obj[3].body); + var html = 'h
    lo'; + equal(ua.getChildHTML(te.obj[3].body.firstChild),html,'
    做回车'); + editor.setContent('

    hello

    ' ); + te.obj[4].setStart( editor.body.lastChild,0 ).setEnd(editor.body.lastChild,1).select(); + ua.keydown(editor.body,{'keyCode':13}); + setTimeout(function(){ + ua.manualDeleteFillData(te.obj[3].body); + var html = 'hello
    '; + equal(ua.getChildHTML(te.obj[3].body.firstChild),html,'
    做回车'); + editor.setContent('

    hello

    heoll

    ' ); + te.obj[4].setStart( editor.body.lastChild,1 ).setEnd(editor.body.lastChild,2).select(); + ua.keydown(editor.body,{'keyCode':13}); + setTimeout(function(){ + ua.manualDeleteFillData(te.obj[3].body); + var html = 'hello
    '; + equal(ua.getChildHTML(te.obj[3].body.firstChild),html,'
    做回车'); + editor.setContent('

    hello


    ' ); + te.obj[4].setStart( editor.body.lastChild,0 ).setEnd(editor.body.lastChild,1).select(); + ua.keydown(editor.body,{'keyCode':13}); + setTimeout(function(){ + ua.manualDeleteFillData(te.obj[3].body); + var html = 'hello
    '; + equal(ua.getChildHTML(te.obj[3].body.firstChild),html,'
    做回车'); + editor.setContent('

    hello

    www.baidu.com

    ' ); + te.obj[4].setStart( editor.body.lastChild,0 ).setEnd(editor.body.lastChild,1).select(); + ua.keydown(editor.body,{'keyCode':13}); + setTimeout(function(){ + ua.manualDeleteFillData(te.obj[3].body); + var html = 'hello
    '; + equal(ua.getChildHTML(te.obj[3].body.firstChild),html,'
    做回车'); + te.dom[1].parentNode.removeChild(te.dom[1]); + start(); + },20); + },20); + },20); + },20); + },20); + }); +} ); + +test( 'br做回车,选区闭合', function () { + te.dom[0].parentNode.removeChild(te.dom[0]); + var div2 = document.body.appendChild( document.createElement( 'div' ) ); + $( div2 ).css( 'width', '500px' ).css( 'height', '500px' ).css( 'border', '1px solid #ccc' ); + te.dom.push(div2); + baidu.editor.plugins.table = function(){}; + var editor = new baidu.editor.Editor({'initialContent':'

    欢迎使用ueditor

    ','autoFloatEnabled':false,'enterTag':'br'}); + te.obj.push(editor); + editor.render(div2); + stop(); + editor.ready(function () { + var range = new baidu.editor.dom.Range(editor.document); + te.obj.push(range); + editor.setContent('

    hello

    '); + + setTimeout(function () { + te.obj[4].setStart(editor.body.firstChild.firstChild, 1).collapse(true).select(); + ua.keydown(editor.body, {'keyCode':13}); + setTimeout(function () { + ua.manualDeleteFillData(te.obj[3].body); + var html = 'h
    ello'; + equal(ua.getChildHTML(te.obj[3].body.firstChild), html, '
    做回车,选区闭合'); + te.dom[1].parentNode.removeChild(te.dom[1]); + start(); + }, 50); + }, 50); + }); +} ); + +test( 'br做回车,选区闭合,在节点尾部输入回车,要插入2个br', function () { + te.dom[0].parentNode.removeChild(te.dom[0]); + var div2 = document.body.appendChild( document.createElement( 'div' ) ); + $(div2).css('width', '500px').css('height', '500px').css('border', '1px solid #ccc'); + te.dom.push(div2); + baidu.editor.plugins.table = function () { + }; + var editor = new baidu.editor.Editor({'initialContent':'

    欢迎使用ueditor

    ', 'autoFloatEnabled':false, 'enterTag':'br'}); + te.obj.push(editor); + editor.render(div2); + stop(); + editor.ready(function () { + var range = new baidu.editor.dom.Range(editor.document); + te.obj.push(range); + editor.setContent('

    hello

    '); + setTimeout(function () { + te.obj[4].setStart(editor.body.firstChild.firstChild, 5).collapse(true).select(); + ua.keydown(editor.body, {'keyCode':13}); + setTimeout(function () { + ua.manualDeleteFillData(te.obj[3].body); + var html = 'hello

    '; + equal(ua.getChildHTML(te.obj[3].body.firstChild), html, '
    做回车,选区闭合,在节点尾部输入回车'); + te.dom[1].parentNode.removeChild(te.dom[1]); + start(); + }, 50); + }, 50); + }); +}); + +test( 'table首行中回车', function () { + var editor = te.obj[0]; + if(!ua.browser.ie){ + var range = new baidu.editor.dom.Range( editor.document ); + editor.setContent('

    ' ); + range.selectNode(editor.body.firstChild.firstChild.firstChild.firstChild).select(); + ua.keydown(editor.body,{'keyCode':13}); + stop(); + setTimeout(function(){ + equal(ua.getChildHTML(te.obj[0].body.firstChild),'
    ','加入p');//opera中,由原生方法实现p标签 + start(); + },20); + } +} ); + +test( '去除_moz_dirty', function () { + if(browser.gecko){ + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '迎使用uedit' ); + range.selectNode(editor.body.firstChild.lastChild.firstChild).select(); + ua.keydown(editor.body,{'keyCode':13}); + setTimeout( function () { + equal(ua.getChildHTML(editor.body),'

    迎使用uedit

    ',''); + start(); + }, 20 ); + stop(); + } +} ); + +///*不作处理chrome会产生div*/ +test( 'chrome删除div', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + if(ua.browser.webkit){ + editor.body.innerHTML = '

    一级标题


    '; + range.setStart( body.firstChild.firstChild, 4 ).collapse( 1 ).select(); + ua.keydown(editor.body,{'keyCode':13}); + range.selectNode(body.lastChild.firstChild).select(); + var index = editor.undoManger.index; + var br = ua.browser.ie ? '' : '
    '; + ua.keyup(editor.body,{'keyCode':13}); + equal(editor.undoManger.list.length,2,'保存现场'); + setTimeout( function () { + equal( body.childNodes.length, 2, '2个子节点' ); + equal(body.lastChild.tagName.toLowerCase(),'p','div转成p'); + equal(ua.getChildHTML(body),'

    一级标题


    ','检查内容'); + start(); + }, 60 ); + stop(); + }else{ + } +} ); +test( 'formatBlock', function () { + if(ua.browser.ie)return; //这个处理不针对ie + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '
    hello1
    hello2
    ' ); + setTimeout( function () { + var tds = editor.body.getElementsByTagName('td'); + range.setStart(tds[0],1).collapse(true).select(); + ua.keydown(editor.body,{'keyCode':13}); + setTimeout( function () { + ua.keyup(editor.body,{'keyCode':13}); + setTimeout( function () { + var td = editor.body.getElementsByTagName('td')[0]; + equal(td.firstChild&&td.firstChild.tagName.toLowerCase(),'p','加上p'); + equal(td.firstChild.innerHTML,'hello1','hello1'); + start(); + }, 60 ); + }, 60 ); + }, 60 ); + stop(); +} ); +test( '跨td不删', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '
    hello1
    hello2
    ' ); + editor.addListener("keydown", function (type, evt) { + setTimeout( function () { + ok(evt.defaultPrevented||!evt.returnValue, "keydown"); + start(); + }, 60 ); + }); + setTimeout(function () { + var tds = editor.body.getElementsByTagName('td'); + range.setStart(tds[0], 0).setEnd(tds[2], 1).select(); + ua.keydown(editor.body, {'keyCode': 13}); + }, 60); + stop(); +} ); +////presskey相关,先不测 +//test( '普通文本中间回车', function () { +// var editor = te.obj[0]; +// var range = te.obj[1]; +// var body = editor.body; +// editor.setContent( '

    你好编辑器

    ' ); +// range.setStart( body.firstChild.firstChild, 2 ).collapse( 1 ).select(); +// editor.focus(); +// setTimeout( function () { +// te.presskey( "enter", "" ); +// editor.focus(); +// setTimeout( function () { +// var ps = body.childNodes; +// equal( ps.length, 2, '2个p' ); +// equal( ps[0].tagName.toLowerCase(), 'p', 'tag名为p' ); +// equal( ps[1].tagName.toLowerCase(), 'p', 'tag名为p' ); +// equal( ua.getChildHTML( ps[0] ), '你好', '第一个p里是你好' ); +// equal( ua.getChildHTML( ps[1] ), '编辑器', '第一个p里是编辑器' ); +// start(); +// }, 30 ); +// }, 100 ); +// stop(); +//} ); +// +//test( '普通文本末尾回车', function () { +// var editor = te.obj[0]; +// var range = te.obj[1]; +// var body = editor.body; +// editor.setContent( '

    你好编辑器

    ' ); +// range.setStart( body.firstChild, 1 ).collapse( 1 ).select(); +// editor.focus(); +// var br = (ua.browser.ie) ? '' : '
    '; +// setTimeout( function () { +// te.presskey( "enter", "" ); +// ua.keydown( body ); +// editor.focus(); +// setTimeout( function () { +// var ps = body.childNodes; +// equal( ps.length, 2, '2个p' ); +// equal( ps[0].tagName.toLowerCase(), 'p', 'tag名为p' ); +// equal( ps[1].tagName.toLowerCase(), 'p', 'tag名为p' ); +// equal( ua.getChildHTML( ps[0] ), '你好编辑器', '第一个p里是你好编辑器' ); +// equal( ua.getChildHTML( ps[1] ), br, '第一个p里是br' ); +// start(); +// }, 60 ); +// }, 100 ); +// stop(); +//} ); +// +// //不好检查 +//test( 'table中回车', function () { +// var div2 = document.body.appendChild( document.createElement( 'div' ) ); +// $( div2 ).css( 'width', '500px' ).css( 'height', '500px' ).css( 'border', '1px solid #ccc' ); +// baidu.editor.plugins.table = function(){}; +// var editor = new baidu.editor.Editor({'initialContent':'

    欢迎使用ueditor

    ','autoFloatEnabled':false}); +// editor.render(div2); +// stop(); +// setTimeout(function(){ +// var range = new baidu.editor.dom.Range( editor.document ); +// var body = editor.body; +// editor.setContent('




    ' ); +// var tds = editor.body.getElementsByTagName( 'td' ); +// tds[0].innerHTML = 'hello'; +// tds[1].innerHTML = 'hello'; +// tds[2].innerHTML = 'hello'; +// range.setStart( tds[0].firstChild, 0 ).setEnd(tds[2].lastChild,1).select(); +// var re = ua.keydown(editor.body,{'keyCode':13}); +// setTimeout(function(){ +// start(); +// },20); +// },20); +//} ); +///*不作处理chrome会产生div*/ +//test( 'trace766 :H1回车', function () { +// var editor = te.obj[0]; +// var range = te.obj[1]; +// var body = editor.body; +// editor.setContent( '

    一级标题

    ' ); +// +// range.setStart( body.firstChild, 1 ).collapse( 1 ).select(); +// editor.focus(); +// var br = ua.browser.ie ? '' : '
    '; +// setTimeout( function () { +// te.presskey( "enter", "" ); +// editor.focus(); +// setTimeout( function () { +// +// var tagName = body.lastChild.tagName.toLowerCase(); +// ok( tagName == 'p' || tagName == 'h1', '回车后不会产生div' ); +// equal( body.childNodes.length, 2, '2个子节点' ); +// start(); +// }, 60 ); +// }, 100 ); +// stop(); +//} ); +// +// +//test( 'trace 1382:空列表标号后回车', function () { +// var editor = te.obj[0]; +// var range = te.obj[1]; +// var body = editor.body; +// editor.setContent( '
    ' ); +// var li = body.getElementsByTagName( 'li' )[0]; +// range.setStart( li, 0 ).collapse( 1 ).select(); +// editor.focus(); +// var br = ua.browser.ie ? '' : '
    '; +// setTimeout( function () { +// te.presskey( "enter", "" ); +// editor.focus(); +// setTimeout( function () { +// var ol = body.getElementsByTagName( 'ol' ); +// equal( ol.length, 0, '列表被删除了' ); +// start(); +// }, 100 ); +// }, 100 ); +// stop(); +//} ); +// +//test( '列表有内容处回车', function () { +// var editor = te.obj[0]; +// var range = te.obj[1]; +// var body = editor.body; +// editor.setContent( '
    1. 列表1
    2. 列表2
    ' ); +// var lis = body.getElementsByTagName( 'li' ); +// range.setStart( lis[1].firstChild, 1 ).collapse( 1 ).select(); +// editor.focus(); +// var br = ua.browser.ie ? '' : '
    '; +// setTimeout( function () { +// te.presskey( "enter", "" ); +// editor.focus(); +// setTimeout( function () { +// var ol = body.getElementsByTagName( 'ol' )[0]; +// lis = ol.childNodes; +// equal( lis.length, 3, '3个li' ); +// for ( var index = 0; index < lis.length; index++ ) +// equal( lis[index].tagName.toLowerCase(), 'li', 'tag名为li' ); +// equal( ua.getChildHTML( lis[1] ), '

    列表2

    ', '第二个列表自动加了p' ); +// equal( ua.getChildHTML( lis[2] ), '

    ' + br + '

    ', '新增了一个列表项' ); +// start(); +// }, 70 ); +// }, 100 ); +// stop(); +//} ); +// +// +//test( 'trace766 :BIU文本中间回车', function () { +// var editor = te.obj[0]; +// var range = te.obj[1]; +// var body = editor.body; +// editor.setContent( '

    有样式的文本

    ' ); +// +// var str = body.getElementsByTagName( 'strong' )[0]; +// range.setStart( str.firstChild, 2 ).collapse( 1 ).select(); +// editor.focus(); +// var br = ua.browser.ie ? '' : '
    '; +// setTimeout( function () { +// te.presskey( "enter", "" ); +// editor.focus(); +// setTimeout( function () { +//// ua.checkHTMLSameStyle( '有样​', editor.document, body.firstChild, '查看第1个p的内容' ); +// //1.2版本中,回车/空格只后有不可见的字符,ua.checkHTMLSameStyle检查的话,的内容不好检查,即会多出一个子节点,改成如下: +// baidu.editor.dom.domUtils.removeDirtyAttr( body.lastChild ); +// if ( ua.browser.chrome ) { +// equal( body.firstChild.innerHTML.toLowerCase(), '有样​', '查看第1个p的内容' ); +// ua.checkHTMLSameStyle( '式的文本', editor.document, body.lastChild, '查看第2个p的内容' ); +// } +// else if ( ua.browser.gecko ) { +// equal( body.firstChild.innerHTML.toLowerCase(), '有样', '查看第1个p的内容' ); +// equal( body.lastChild.innerHTML, '​式的文本', '查看第2个p的内容' ); +// } +// else { +// equal( body.firstChild.innerHTML.toLowerCase(), '有样​', '查看第1个p的内容' ); +// ua.checkHTMLSameStyle( '式的文本', editor.document, body.lastChild, '查看第2个p的内容' ); +// } +// start(); +// }, 70 ); +// }, 100 ); +// stop(); +//} ); +// +//test( 'trace841 :BIU文本后面回车', function () { +// var editor = te.obj[0]; +// var range = te.obj[1]; +// var body = editor.body; +// editor.setContent( '

    有样式的文本

    ' ); +// var strong = body.getElementsByTagName( 'strong' )[0]; +//// range.setStart( strong.firstChild, 6 ).collapse( 1 ).select(); +// range.setStart( strong, 1 ).collapse( 1 ).select(); +// editor.focus(); +// setTimeout( function () { +// te.presskey( "enter", "" ); +// editor.focus(); +// setTimeout( function () { +// ua.keydown( body, {keyCode:13} ); +// baidu.editor.dom.domUtils.removeDirtyAttr( body.lastChild ); +//// ua.checkHTMLSameStyle( '有样​', editor.document, body.firstChild, '查看第1个p的内容' ); +// //1.2版本中,回车/空格只后有不可见的字符,ua.checkHTMLSameStyle检查的话,的内容不好检查,即会多出一个子节点,而且每种浏览器的具体结果不同,改成如下: +// if ( ua.browser.chrome ) +// equal( body.firstChild.innerHTML.toLowerCase(), '有样式的文本​', '查看第1个p的内容' ); +// else if ( ua.browser.gecko ) +// equal( body.firstChild.innerHTML.toLowerCase(), '有样式的文本', '查看第1个p的内容' ); +// else +// equal( body.firstChild.innerHTML.toLowerCase(), '有样式的文本​', '查看第1个p的内容' ); +// /*ie中有一个已知bug,trace841,暂时不修的*/ +// var br = ua.browser.gecko ? '' : '
    '; +// if ( !ua.browser.ie ) { +// /*firefox不知道为什么用程序的方式回车始终不会产生br,可能太快了,浏览器没来得及处理*/ +// if ( ua.browser.gecko ) +// equal( body.lastChild.innerHTML, '', '查看第2个p的内容' ); +// else +// ua.checkHTMLSameStyle( '' + br + '', editor.document, body.lastChild, '查看第2个p的内容' ); +// } +// start(); +// }, 500 ); +// }, 100 ); +// stop(); +//} ); +// +// +//test( '不闭合选择普通文本回车', function () { +// var editor = te.obj[0]; +// var range = te.obj[1]; +// var body = editor.body; +// editor.setContent( '

    普通文本回车

    ' ); +// range.setStart( body.firstChild.firstChild, 2 ).setEnd( body.firstChild.firstChild, 4 ).select(); +// editor.focus(); +// setTimeout( function () { +// te.presskey( "enter", "" ); +// editor.focus(); +// setTimeout( function () { +// var ps = body.childNodes; +// equal( ps.length, 2, '2个p' ); +// equal( ps[0].tagName.toLowerCase(), 'p', 'tag名为p' ); +// equal( ps[1].tagName.toLowerCase(), 'p', 'tag名为p' ); +// equal( ua.getChildHTML( ps[0] ), '普通', '第一个p里是你好编辑器' ); +// equal( ua.getChildHTML( ps[1] ), '回车', '第2个p里是br' ); +// start(); +// }, 60 ); +// }, 100 ); +// stop(); +//} ); +// +//test( '不闭合选择段落回车', function () { +// var editor = te.obj[0]; +// var range = te.obj[1]; +// var body = editor.body; +// editor.setContent( '

    不闭合选择两个段落1

    不闭合选择两个段落2

    ' ); +// range.setStart( body.firstChild.firstChild, 3 ).setEnd( body.lastChild.firstChild, 5 ).select(); +// editor.focus(); +// var br = ua.browser.ie ? '' : '
    '; +// setTimeout( function () { +// te.presskey( "enter", "" ); +// editor.focus(); +// setTimeout( function () { +// var ps = body.childNodes; +// equal( ps.length, 2, '2个p' ); +// equal( ps[0].tagName.toLowerCase(), 'p', 'tag名为p' ); +// equal( ps[1].tagName.toLowerCase(), 'p', 'tag名为p' ); +// equal( ua.getChildHTML( ps[0] ), '不闭合', '第一个p里是你好编辑器' ); +// equal( ua.getChildHTML( ps[1] ), '两个段落2', '第一个p里是br' ); +// start(); +// }, 60 ); +// }, 100 ); +// stop(); +//} ); +// +// +//test( '撤销回车不闭合删除段落', function () { +// var editor = te.obj[0]; +// var range = te.obj[1]; +// var body = editor.body; +// editor.setContent( '

    不闭合选择两个段落1

    不闭合选择两个段落2

    ' ); +// range.setStart( body.firstChild.firstChild, 3 ).setEnd( body.lastChild.firstChild, 5 ).select(); +// editor.focus(); +// var br = ua.browser.ie ? '' : '
    '; +// setTimeout( function () { +// te.presskey( "enter", "" ); +// editor.focus(); +// setTimeout( function () { +// var ps = body.childNodes; +// equal( ps.length, 2, '2个p' ); +// equal( ps[0].tagName.toLowerCase(), 'p', 'tag名为p' ); +// equal( ps[1].tagName.toLowerCase(), 'p', 'tag名为p' ); +// equal( ua.getChildHTML( ps[0] ), '不闭合', '第一个p里是你好编辑器' ); +// equal( ua.getChildHTML( ps[1] ), '两个段落2', '第一个p里是br' ); +// editor.undoManger.undo(); +// equal( ps.length, 2, '2个p' ); +// equal( ps[0].tagName.toLowerCase(), 'p', 'tag名为p' ); +// equal( ps[1].tagName.toLowerCase(), 'p', 'tag名为p' ); +// equal( ua.getChildHTML( ps[0] ), '不闭合选择两个段落1', '第一个p里是你好编辑器' ); +// equal( ua.getChildHTML( ps[1] ), '不闭合选择两个段落2', '第一个p里是br' ); +// start(); +// }, 60 ); +// }, 100 ); +// stop(); +//} ); +// +///*1723 ie 在源码中写
    ,自动变成

    ,在ie中
    会导致undo操作多记了一步*/ +//test( '撤销回车删除空列表', function () { +// var editor = te.obj[0]; +// var range = te.obj[1]; +// var body = editor.body; +// editor.setContent( '
    ' ); +// var li = body.getElementsByTagName( 'li' )[0]; +// range.setStart( li.firstChild, 0 ).collapse( 1 ).select(); +// editor.focus(); +// +// setTimeout( function () { +// te.presskey( "enter", "" ); +// /*好像用程序控制按回车的速度会比程序捕获的速度快, +// 所以程序还没反应过来时keydown已经触发完了, +// 而keydown中用于进行场景保存的,这样就会导致undo操作失效*/ +// ua.keydown( body ); +// editor.focus(); +// setTimeout( function () { +// var ol = body.getElementsByTagName( 'ol' ); +// equal( ol.length, 0, '列表被删除了' ); +// setTimeout( function () { +// editor.undoManger.undo(); +// equal( ua.getChildHTML( body ), '

    ', '撤销删除列表' ); +// start(); +// }, 50 ); +// +// }, 150 ); +// }, 100 ); +// stop(); +//} ); +// +//test( '撤销列表中的回车', function () { +// var editor = te.obj[0]; +// var range = te.obj[1]; +// var body = editor.body; +// editor.setContent( '
    1. 列表
    ' ); +// var li = body.getElementsByTagName( 'li' )[0]; +// range.setStart( li.firstChild, 1 ).collapse( 1 ).select(); +// editor.focus(); +// var br = ua.browser.ie ? '' : '
    '; +// +// setTimeout( function () { +// te.presskey( "enter", "" ); +// ua.keydown( body ); +// editor.focus(); +// setTimeout( function () { +// var li = body.getElementsByTagName( 'li' ); +// equal( li.length, 2, '2个列表子项' ); +// equal( ua.getChildHTML( li[0] ), '

    列表

    ' ); +// equal( ua.getChildHTML( li[1] ), '

    ' + br + '

    ' ); +// editor.undoManger.undo(); +// equal( ua.getChildHTML( body ), '
    1. 列表

    ', '撤销后列表恢复原状' ); +// start(); +// }, 250 ); +// }, 100 ); +// stop(); +//} ); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/fiximgclick.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/fiximgclick.js new file mode 100644 index 000000000..fe13f3ab9 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/fiximgclick.js @@ -0,0 +1,117 @@ +module( 'plugins.fiximgclick' ); + +test( 'webkit下图片可以被选中并出现八个角', function() { + if ( ua.browser.webkit ) { + var sc = document.createElement("script"); + sc.id="sc"; + sc.type = "text/plain"; + document.body.appendChild(sc); + var editor = new UE.ui.Editor({'autoFloatEnabled':true,'topOffset':60,'autoHeightEnabled':true,'scaleEnabled':false}); + editor.render(sc.id); + editor.ready(function () { + editor.setContent( '

    修正webkit下图片选择的问题修正webkit下图片选择的问题

    ' ); + var img = editor.body.getElementsByTagName( 'img' )[0]; + var p = editor.body.firstChild; + ua.click( img ); + var range = editor.selection.getRange(); + ua.checkResult( range, p, p, 1, 2, false, '检查当前的range是否为img' ); + var scale = document.getElementById(editor.ui.id + '_scale'); + ok(scale && scale.style.display!='none', "检查八个角是否已出现"); + ok(img.style.width == scale.style.width && img.style.height == scale.style.height, "检查八个角和图片宽高度是否相等"); + UE.delEditor(sc.id); + domUtils.remove(sc); + start(); + }); + stop(); + } +} ); + +test( '鼠标在八个角上拖拽改变图片大小', function() { + if ( ua.browser.webkit ) { + var sc = document.createElement("script"); + sc.id="sc"; + sc.type = "text/plain"; + document.body.appendChild(sc); + var editor = new UE.ui.Editor({'autoFloatEnabled':true,'topOffset':60,'autoHeightEnabled':true,'scaleEnabled':false}); + editor.render(sc.id); + editor.ready(function () { + editor.setContent( '

    修正webkit下图片选择的问题修正webkit下图片选择的问题

    ' ); + var img = editor.body.getElementsByTagName( 'img' )[0]; + var p = editor.body.firstChild; + ua.click( img ); + var scale = document.getElementById(editor.ui.id + '_imagescale'); + var hand0 = scale.children[0], width, height; + width = parseInt(scale.style.width); + height = parseInt(scale.style.height); + ua.mousedown( hand0, {clientX: 322, clientY: 281} ); + ua.mousemove( document, {clientX: 352, clientY: 301} ); + equal(width-parseInt(scale.style.width), 30, "检查鼠标拖拽中图片宽度是否正确 --"); + equal(height-parseInt(scale.style.height), 20, "检查鼠标拖拽中图片高度是否正确 --"); + ua.mousemove( document, {clientX: 382, clientY: 321} ); + ua.mouseup( document, {clientX: 382, clientY: 321} ); + equal(width-parseInt(scale.style.width), 60, "检查鼠标拖拽完毕图片高度是否正确 --"); + equal(height-parseInt(scale.style.height), 40, "检查鼠标拖拽完毕图片高度是否正确 --"); + ok(img.style.width == scale.style.width && img.style.height == scale.style.height, "检查八个角和图片宽高度是否相等"); + UE.delEditor(sc.id); + domUtils.remove(sc); + start(); + }); + stop(); + } +} ); + +test( '鼠标点击图片外的其他区域时,八个角消失', function() { + if ( ua.browser.webkit ) { + var sc = document.createElement("script"); + sc.id="sc"; + sc.type = "text/plain"; + document.body.appendChild(sc); + var editor = new UE.ui.Editor({'autoFloatEnabled':true,'topOffset':60,'autoHeightEnabled':true,'scaleEnabled':false}); + editor.render(sc.id); + editor.ready(function () { + editor.setContent( '

    修正webkit下图片选择的问题修正webkit下图片选择的问题

    ' ); + var img = editor.body.getElementsByTagName( 'img' )[0]; + var p = editor.body.firstChild; + ua.click( img ); + var scale = document.getElementById(editor.ui.id + '_imagescale'), + cover = document.getElementById(editor.ui.id + '_imagescale_cover'); + ok(scale && scale.style.display!='none', "检查八个角是否已出现"); + ok(cover && cover.style.display!='none', "检查遮罩层是否已出现"); + ua.mousedown( editor.ui.getDom(), {clientX: 100, clientY: 100} ); + ok(cover && cover.style.display=='none', "检查遮罩层是否已消失"); + ok(scale && scale.style.display=='none', "检查八个角是否已消失"); + UE.delEditor(sc.id); + domUtils.remove(sc); + start(); + }); + stop(); + } +} ); + +test( '键盘有操作时,八个角消失', function() { + if ( ua.browser.webkit ) { + var sc = document.createElement("script"); + sc.id="sc"; + sc.type = "text/plain"; + document.body.appendChild(sc); + var editor = new UE.ui.Editor({'autoFloatEnabled':true,'topOffset':60,'autoHeightEnabled':true,'scaleEnabled':false}); + editor.render(sc.id); + editor.ready(function () { + editor.setContent( '

    修正webkit下图片选择的问题修正webkit下图片选择的问题

    ' ); + var img = editor.body.getElementsByTagName( 'img' )[0]; + var p = editor.body.firstChild; + ua.click( img ); + var scale = document.getElementById(editor.ui.id + '_imagescale'), + cover = document.getElementById(editor.ui.id + '_imagescale_cover'); + ok(scale && scale.style.display!='none', "检查八个角是否已出现"); + ok(cover && cover.style.display!='none', "检查遮罩层是否已出现"); + ua.keydown( editor.ui.getDom()); + ok(cover && cover.style.display=='none', "检查遮罩层是否已消失"); + ok(scale && scale.style.display=='none', "检查八个角是否已消失"); + UE.delEditor(sc.id); + domUtils.remove(sc); + start(); + }); + stop(); + } +} ); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/font.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/font.js new file mode 100644 index 000000000..fbe94bc09 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/font.js @@ -0,0 +1,506 @@ +module("plugins.font"); + +//test('stop',function(){stop();}); +test('trace1583:applyInlineStyle--MergeToParent', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + stop(); + setTimeout(function () { + editor.setContent('

    12345678910

    '); + range.setStart(editor.body.firstChild, 0).setEnd(editor.body.firstChild, 4).select(); + editor.execCommand('fontsize', '24px'); + var html = '12345678910'; + ua.checkSameHtml(editor.body.firstChild.innerHTML.toLowerCase(), html, ''); + start(); + }, 50); + +}); +test('trace 3337:字符边框', function () { + + if (ua.browser.opera)return; + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('fontborder'); + range = editor.selection.getRange(); + range.insertNode(editor.document.createTextNode('hello')); + ua.manualDeleteFillData(editor.body); + var br = baidu.editor.browser.ie ? ' ' : '
    '; + if (ua.browser.ie && ua.browser.ie < 9) { + equal(editor.queryCommandValue('fontborder'), '#000 1px solid', '检查反射值'); + equal(ua.getChildHTML(editor.body.firstChild), "hello ", '查看添加了字符边框后的样式'); + } + else { + equal(editor.queryCommandValue('fontborder'), '1px solid rgb(0, 0, 0)', '检查反射值'); + ua.checkHTMLSameStyle('hello' + br, editor.document, editor.body.firstChild, '查看添加了字符边框后的样式'); + } + range.setStart(editor.body.firstChild.firstChild.firstChild, 5).collapse(true).select(); + editor.execCommand('fontborder'); + equal(editor.queryCommandState('fontborder'), '0'); + equal(editor.queryCommandValue('fontborder'), '', '无反射值'); + editor.setContent('

    迎光临

    '); + range.setStart(editor.body.firstChild.firstChild, 0).setEnd(editor.body.firstChild.lastChild, 3).select(); + editor.execCommand('fontborder'); + var p1 = '迎光临'; + var p2 = '迎光临'; + if (ua.browser.ie && ua.browser.ie < 9) + ua.checkSameHtml(editor.body.firstChild.innerHTML, p2, '查看添加了字符边框后的样式'); + else + ua.checkHTMLSameStyle(p1, editor.document, editor.body.firstChild, '查看添加了字符边框后的样式'); +}); +test('设置超链接前景色再清除颜色', function () { + if (ua.browser.ie < 9)return;//TODO 1.2.6 + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    hellobaidu

    '); + range.selectNode(editor.body.firstChild).select(); + editor.execCommand('forecolor', 'rgb(255,0,0)'); + editor.execCommand('backcolor', 'rgb(0,255,0)'); + editor.execCommand('forecolor', 'default'); + // var html = 'hellobaidu';todo 1.2.6.1 样式复制了一次 + var html = 'hellobaidu'; + ua.checkHTMLSameStyle(html, editor.document, editor.body.firstChild, '清除前景色'); +}); + + +test('font转span', function () { + var editor = te.obj[0]; + editor.setContent('hellohello'); + var html = 'hellohello'; + ua.checkHTMLSameStyle(html, editor.document, editor.body.firstChild, '转换font标签'); + /*size的值在sizeMap中有对应的值*/ + editor.setContent('hello'); + html = 'hello'; + ua.checkHTMLSameStyle(html, editor.document, editor.body.firstChild, '转换font标签'); +}); +test('beforegetContent', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.body.innerHTML = '

    hello

    '; + range.selectNode(editor.body.firstChild).select(); + editor.execCommand('forecolor', 'rgb(255,0,0)'); + var div = document.createElement('div'); + var div1 = document.createElement('div'); + stop(); + setTimeout(function () { + /*getContent会触发beforegetcontent事件*/ + div1.innerHTML = editor.getContent(); + div.innerHTML = '

    hello

    '; +// ok( ua.haveSameAllChildAttribs( div, div1 ), '查看空span是否被删除' ); + equal(ua.getChildHTML(div), ua.getChildHTML(div1)); + start(); + }, 50); +}); + +/*为超链接添加删除线,超链接仍然有删除线,trace946*/ +test('underline and linethrough', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + stop(); + editor.setContent('hellobaidutest'); + setTimeout(function () { + if (!ua.browser.opera) { + editor.focus(); + } + var body = editor.body; + ua.manualDeleteFillData(editor.body); + range.selectNode(body.firstChild.firstChild.nextSibling).select(); + ok(/underline/.test(editor.queryCommandValue('underline')), 'query command value is underline'); + ok(/underline/.test(editor.queryCommandValue('strikethrough')), 'query command value is underline'); + ok(editor.queryCommandState('underline'), 'query underline state'); + editor.execCommand('strikethrough'); + var html = 'hellobaidutest'; + ua.checkHTMLSameStyle(html, editor.document, body.firstChild, 'check results'); + start(); + }, 50); +}); + +/*为不同字号的文本加背景色,trace981*/ +test('background--不同字号', function () { + if (!ua.browser.opera) { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('你好'); + editor.focus(); + var body = editor.document.body; + ua.manualDeleteFillData(editor.body); + range.selectNode(body.firstChild.firstChild).select(); + editor.execCommand('backcolor', 'rgb(255,0,0)'); + range.setStart(body.firstChild.firstChild, 1).collapse(1).select(); + editor.execCommand('fontsize', '30px'); + range = editor.selection.getRange(); + range.insertNode(editor.document.createTextNode('hello')); + stop(); + setTimeout(function () { + ua.manualDeleteFillData(editor.body); + /*去掉空白字符*/ + var color = ua.browser.ie && ua.browser.ie < 9 ? '' : ';background-color: rgb(255, 0, 0); '; + var html = '你好hello'; + ua.checkHTMLSameStyle(html, editor.document, editor.body.firstChild, '检查不同字号的文本背景色是否一致'); + start(); + }, 50); + } +}); + +/*trace 937,chrome,safari,maxthon有问题*/ +test('trace 937:为第一个有样式的字加删除线', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    迎光临

    '); + range.selectNode(editor.body.firstChild).select(); + editor.execCommand('strikethrough'); + var p1 = editor.document.createElement('p'); + p1.innerHTML = '迎光临'; + ok(ua.haveSameAllChildAttribs(editor.body.firstChild, p1), '查看添加了下划线后的样式'); +}); + +/*trace 918*/ +test('trace 918:字体的状态反射', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    欢迎你回来

    '); + var p = editor.body.firstChild; + range.selectNode(p).select(); + editor.execCommand('underline'); + var p1 = document.createElement('p'); + p1.innerHTML = '欢迎你回来'; + if (!ua.browser.opera) { + ok(ua.haveSameAllChildAttribs(p, p1), '检查是否添加了下划线'); + } + range.setStart(p.firstChild.firstChild, 3).setEnd(p.firstChild.firstChild, 4).select(); + editor.execCommand('fontfamily', '楷体'); + var txt = '楷体'; + if (ua.browser.opera) + txt = '\"楷体\"'; + equal(editor.queryCommandValue('fontfamily'), txt, '检查字体的状态反射'); + +}); + +test(' 选中文本设置前景色为默认', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + + editor.setContent('hello'); + range.selectNode(editor.body.firstChild).select(); + editor.execCommand('forecolor', 'rgb(255,0,0)'); + ua.checkHTMLSameStyle('hello', editor.document, editor.body.firstChild, '文本的前景色设为红色'); + editor.execCommand('forecolor', 'default'); + equal(ua.getChildHTML(editor.body), '

    hello

    ', '设置字体颜色为默认颜色'); + +}); + +/*trace 869*/ +//插件相关!!!!!!!!!! +//test( 'trace 869:设置前景色后清除前景色,再输入文本', function() { +// var editor = te.obj[0]; +// var range = te.obj[1]; +// editor.setContent( '' ); +// stop() +//// alert(navigator.userAgent) +// setTimeout( function() { +// range.setStart( editor.body.firstChild, 0 ).select(); +// editor.execCommand( 'forecolor', 'red' ); +// editor.execCommand( 'forecolor', 'default' ); +// range = editor.selection.getRange(); +// editor.focus(); +// setTimeout( function() { +// //TODO maxthon有2种模式,句柄分为IE的和maxthon两种,需要根据userAgent区别对待,但是貌似还是有问题的 +// te.presskey( '', 'e' ); +// editor.focus(); +// setTimeout( function() { +// var br = baidu.editor.browser.ie ? '' : '
    '; +// ua.manualDeleteFillData( editor.body ); +// equal( editor.getContent(), '

    e' + br + '

    ' ); +// start(); +// }, 250 ); +// }, 100 ); +//// range.insertNode( document.createTextNode( 'hello' ) ); +// }, 150 ); +//} ); + +/*trace 823*/ +//TODO 涉及文本输入和光标位置移动的结合 +// 不好测,采取workaround,不用输入的方式 +test('trace 823:设置前景色后设置删除线', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + + editor.setContent('

    你好​hello

    '); + range.selectNode(editor.body.firstChild.firstChild, 0).select(); + editor.execCommand('strikethrough'); + var p1 = editor.document.createElement('p'); + p1.innerHTML = '你好hello'; + ok(ua.haveSameAllChildAttribs(editor.body.firstChild, p1), '检查加入删除线后的样式'); + +}); + +/*trace 819, 765*/ +test('trace 819, 765:删除线和下划线互斥', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + + var p1 = editor.document.createElement('p'); + editor.setContent('

    你好

    '); + range.selectNode(editor.body.firstChild).select(); + editor.execCommand('underline'); + p1.innerHTML = '你好'; + ok(ua.haveSameAllChildAttribs(editor.body.firstChild, p1), '下划线'); + range.selectNode(editor.body.firstChild).select(); + + editor.execCommand('strikethrough'); + p1.innerHTML = '你好'; + ok(ua.haveSameAllChildAttribs(editor.body.firstChild, p1), '删除线,和下划线互斥'); + range.selectNode(editor.body.firstChild).select(); + editor.execCommand('underline'); + p1.innerHTML = '你好'; + ok(ua.haveSameAllChildAttribs(editor.body.firstChild, p1), '下划线,和删除线互斥'); + +}); + +///*trace 810*/ +//TODO 1.2.6 +//test( 'trace 810:闭合时设置删除线会改变文本前景色', function() { +// if(!ua.browser.opera){ +// var editor = te.obj[2]; +// var div = document.body.appendChild( document.createElement( 'div' ) ); +// $( div ).css( 'width', '500px' ).css( 'height', '500px' ).css( 'border', '1px solid #ccc' ); +// editor.render(div); +// var range = new baidu.editor.dom.Range( editor.document ); +// stop(); +// setTimeout(function(){ +// editor.setContent( '

    你好​hello

    ' ); +// range.setStart( editor.body.firstChild.firstChild.lastChild, 1 ).collapse( true ).select(); +// editor.execCommand( 'strikethrough' ); +// range = editor.selection.getRange(); +// range.insertNode( editor.document.createTextNode( 'hey' ) ); +// /*ff下会自动加一个空的设置了style的span,比较时不作考虑*/ +// if ( baidu.editor.dom.domUtils.isEmptyNode( editor.body.firstChild.lastChild ) && baidu.editor.browser.gecko ) +// editor.body.firstChild.removeChild( editor.body.firstChild.lastChild ); +// var html = '你好hellohey'; +// ua.checkHTMLSameStyle( html, editor.document, editor.body.firstChild, '检查插入的删除线前景色是否正确' ); +// equal(editor.body.firstChild.innerHTML,html); +// div.parentNode.removeChild(div); +// start(); +// },50); +// } +//} ); + +/*trace 809*/ +test('trace 809:闭合时改变前景色和删除线,再输入文本', function () { + if (!ua.browser.opera) { + var editor = te.obj[0]; + var range = te.obj[1]; + + editor.setContent('

    你好

    '); + var p = editor.body.firstChild; + range.setStart(p.firstChild, 1).collapse(true).select(); + editor.execCommand('forecolor', 'rgb(0,255,0)'); + range = editor.selection.getRange(); + editor.execCommand('underline'); + range = editor.selection.getRange(); + range.insertNode(editor.document.createTextNode('hey')); + var p1 = editor.document.createElement('p'); + p1.innerHTML = '你好​hey'; + ua.manualDeleteFillData(editor.body); + /*ff下会自动加一个空的设置了style的span,比较时不作考虑*/ + if (baidu.editor.dom.domUtils.isEmptyNode(editor.body.firstChild.lastChild) && baidu.editor.browser.gecko) + editor.body.firstChild.removeChild(editor.body.firstChild.lastChild); + ok(ua.haveSameAllChildAttribs(editor.body.firstChild, p1), '检查新输入的文本下划线和颜色是否正确'); + + } +}); + +/*trace 805*/ +test('trace 805:切换删除线和下划线,前景色没了', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    你好早安

    '); + var text = editor.body.firstChild.firstChild.firstChild; + range.selectNode(text).select(); + editor.execCommand('forecolor', 'rgb(255,0,0)'); + range.setStart(text, 0).setEnd(text, 2).select(); + editor.execCommand('underline'); + range.setStart(text, 0).setEnd(text, 2).select(); + editor.execCommand('strikethrough'); + var p1 = editor.document.createElement('p'); + p1.innerHTML = '你好早安'; + ok(ua.haveSameAllChildAttribs(editor.body.firstChild, p1), '查看前景色是不是还在'); + +}); + +/*trace 802*/ +test('trace 802:为设置了字体的文本添加删除线', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + + editor.setContent('

    你好早安

    '); + var text = editor.body.firstChild.firstChild.firstChild; + range.setStart(text, 0).setEnd(text, 2).select(); + editor.execCommand('strikethrough'); + var p1 = editor.document.createElement('p'); + p1.innerHTML = '你好早安'; + ok(ua.haveSameAllChildAttribs(editor.body.firstChild, p1), '检查删除线是否正确'); + editor.execCommand('fontfamily', '隶书'); + editor.execCommand('source'); + var txt = '隶书'; + if (ua.browser.opera) + txt = '\"隶书\"'; + if(!ua.browser.gecko)//todo 1.4.0 + equal(editor.queryCommandValue('fontfamily'), txt); + +}); + +/*trace 744*/ +test('trace 744:设置超链接背景色后切换到源码再切回来', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + stop(); + editor.setContent('

    hellobaidu

    '); + range.selectNode(editor.body.firstChild).select(); + editor.execCommand('backcolor', 'rgb(255,0,0)'); + var html = editor.body.firstChild.innerHTML; + editor.execCommand('source'); + setTimeout(function () { + editor.execCommand('source'); + setTimeout(function () { + ua.checkHTMLSameStyle(html, editor.document, editor.body.firstChild, '切换后html代码不变'); + /*切换源码前后代码应当相同*/ + start(); + }, 50); + }, 50); +}); + + +test('对表格中的文本添加颜色和下划线', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + + stop(); + editor.setContent('
    hello1hello2
    hello3
    '); + setTimeout(function () { + var trs = editor.body.firstChild.getElementsByTagName('tr'); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[0].cells[0], trs[1].cells[0]); + ut.setSelected(cellsRange); + if (ua.browser.ie && ua.browser.ie < 9) { + range.setStart(editor.body.firstChild.firstChild.firstChild.firstChild, 0).setEnd(editor.body.firstChild.firstChild.lastChild.firstChild, 6).select(); + } + else { + range.setStart(trs[0].cells[0].firstChild, 0).setEnd(trs[1].cells[0].firstChild, 6).select(); + } + + editor.execCommand('forecolor', 'rgb(255,100,100)'); + setTimeout(function () { + ut.clearSelected(); + trs = editor.body.firstChild.getElementsByTagName('tr'); + ut = editor.getUETable(editor.body.firstChild); + range.selectNode(trs[0].firstChild).select(); + ut.setSelected(range); + setTimeout(function () { + editor.execCommand('underline'); + setTimeout(function () { + var tds = editor.body.firstChild.getElementsByTagName('td'); + trs = editor.body.firstChild.getElementsByTagName('tr'); + ua.checkSameHtml('hello1', tds[0].innerHTML, '第一个单元格有下划线和前景色'); +// equal('hello1', tds[0].innerHTML, '第一个单元格有下划线和前景色'); + ua.checkSameHtml('hello2', tds[1].innerHTML, '第2个单元格有前景色'); + ua.checkSameHtml('hello3', tds[2].innerHTML, '第3个单元格有前景色'); + equal(trs[1].firstChild.getAttribute('colspan'), 2, 'colspan为2'); + equal(editor.queryCommandState('underline'), true, '状态是underline'); + equal(editor.queryCommandState('forecolor'), 0, '非underline和line-through返回0'); + setTimeout(function () { + start(); + }, 100); + }, 100); + }, 100); + }, 100); + }, 50); +}); + +/*trace 740*/ +test('trace 740:设置左右字为红色,修改部分字颜色为蓝色,再修改所有字体', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + + stop(); + editor.setContent('

    你好早安

    '); + range.selectNode(editor.body.firstChild).select(); + editor.execCommand('forecolor', 'rgb(255,0,0)'); + var text = editor.body.firstChild.firstChild.firstChild; + range.setStart(text, 2).setEnd(text, 4).select(); + editor.execCommand('forecolor', 'rgb(0,255,0)'); + range.setStart(editor.body.firstChild, 0).setEnd(editor.body.firstChild, 1).select(); + editor.execCommand('fontfamily', ' 楷体, 楷体_GB2312, SimKai; '); + setTimeout(function () { + var html = '你好早安'; + ua.checkSameHtml(html, editor.body.firstChild.innerHTML, '查看字体和颜色是否正确'); + start(); + }, 50); +}); + +/*trace 721*/ +test('trace 721:预先设置下划线和字体颜色,再输入文本,查看下划线颜色', function () { + if (!ua.browser.opera) { + var editor = te.obj[0]; + var range = te.obj[1]; + + editor.setContent('


    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('underline'); + editor.execCommand('forecolor', 'rgb(255,0,0)'); + range = editor.selection.getRange(); + range.insertNode(editor.document.createTextNode('hello')); + ua.manualDeleteFillData(editor.body); + var html = 'hello
    '; + ua.checkHTMLSameStyle(html, editor.document, editor.body.firstChild, '查看下划线颜色是否与字体颜色一致'); + + } +}); + + +test('trace 3342:字符ab, 给a 加边框再给b加边框,边框效果错误', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    hello

    '); + range.setStart(editor.body.firstChild.firstChild, 0).setEnd(editor.body.firstChild.firstChild, 2).select(); + editor.execCommand('fontborder'); + range.setStart(editor.body.firstChild.lastChild, 0).setEnd(editor.body.firstChild.lastChild, 2).select(); + editor.execCommand('fontborder'); +// var br = baidu.editor.browser.ie ? ' ' : '
    '; + if (ua.browser.ie && ua.browser.ie < 9) { + equal(ua.getChildHTML(editor.body.firstChild), "hello", '查看添加了字符边框后的样式'); + }else if(ua.browser.ie && ua.browser.ie == 11){ + equal(ua.getChildHTML(editor.body.firstChild), 'hello', '查看添加了字符边框后的样式'); + } + else { + equal(ua.getChildHTML(editor.body.firstChild), 'hello', '查看添加了字符边框后的样式'); + } +}); + +test('trace 3096:单元格中改变字号', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable', {numCols: 3, numRows: 3}); + var trs = editor.body.firstChild.getElementsByTagName('tr'); + trs[0].cells[0].innerHTML = 'asd'; + setTimeout(function () { + range.setStart(editor.body.firstChild.firstChild.firstChild.firstChild.firstChild, 0).setEnd(editor.body.firstChild.firstChild.firstChild.firstChild.firstChild, 3).select(); + editor.execCommand('fontsize', '32px'); + equal(editor.body.firstChild.getElementsByTagName('td')[0].style.height, '', '不固定高度'); + start(); + }, 50); + stop(); +}); + +test('转换font标签', function () { + var editor = te.obj[0]; + editor.setContent('x'); + var html = '

    x

    '; + ua.checkHTMLSameStyle(html, editor.document, editor.body, '转换font标签'); + editor.setContent('x'); + html = 'x'; + ua.checkHTMLSameStyle(html, editor.document, editor.body.firstChild, '转换font标签'); +}); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/formatmatch.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/formatmatch.js new file mode 100644 index 000000000..423acfb32 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/formatmatch.js @@ -0,0 +1,373 @@ +module('plugins.formatmatch'); + +/*trace 973*/ +test('为一行无格式的文字刷2种不同的格式', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    first

    second

    third

    '); + setTimeout(function () { + var body = editor.body; + range.setStart(body.firstChild.firstChild.firstChild, 2).collapse(true).select(); + editor.execCommand('formatmatch'); + range.selectNode(body.lastChild.firstChild).select(); + ua.mouseup(body); + editor.addListener('mouseup', function () { + equal(editor.queryCommandState('formatmatch'), 0, '刷后状态为0'); + equal(body.lastChild.innerHTML.toLowerCase(), 'third'); + start(); + }); + range.setStart(body.lastChild.previousSibling.firstChild.firstChild, 2).collapse(true).select(); + editor.execCommand('formatmatch'); + range.selectNode(body.lastChild.firstChild).select(); + ua.mouseup(body); + /*editor自身还挂了一个mouseup侦听器,必须在用例执行前调用,否则_selectionChange方法调用无法取到window,会报错*/ + + }, 50); + stop(); +}); + +/*trace 971*/ +test('trace 971:有格式文字刷自己', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + + editor.setContent('

    欢迎光临

    '); + setTimeout(function () { + var body = editor.body; + var text = body.firstChild.firstChild.firstChild; + range.setStart(text, 2).collapse(true).select(); + editor.addListener('mouseup', function () { + equal(editor.getContent(), '

    迎光临

    '); + start(); + }); + editor.execCommand('formatmatch'); + range.setStart(text, 0).setEnd(text, 1).select(); + ua.mouseup(editor.body); + + }, 50); + stop(); +}); +//TODO 1.2.6 +//test( 'trace 1553:居中的标题自己刷自己', function () { +// var editor = te.obj[0]; +// var range = te.obj[1]; +// editor.setContent( '

    欢迎使用UEditor编辑器

    ' ); +// setTimeout( function () { +// var body = editor.body; +// var text = body.firstChild.firstChild; +// range.setStart( text, 2 ).setEnd( text, 4 ).select(); +// editor.addListener( 'mouseup', function () { +// if ( (ua.browser.gecko && ua.browser.gecko < 2)||ua.browser.ie ==9) +// equal( editor.getContent(), '

    欢迎使用UEditor编辑器

    ' ); +// else +// equal( editor.getContent(), '

    欢迎使用UEditor编辑器

    ' ); +// } ); +// editor.execCommand( 'formatmatch' ); +// range.setStart( text, 5 ).setEnd( text, 6 ).select(); +// ua.mouseup( editor.body ); +// setTimeout( function () { +// start(); +// }, 500 ); +// }, 50 ); +// stop(); +//} ); + +/*trace:969*/ +test('格式刷的状态反射:非闭合区间', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('hello'); + setTimeout(function () { + var body = editor.body; + range.setStart(body.firstChild.firstChild, 2).collapse().select(); + editor.addListener('mouseup', function () { + equal(editor.queryCommandState('formatmatch'), 0, '刷后状态为0'); + start(); + }); + editor.execCommand('formatmatch'); + equal(editor.queryCommandState('formatmatch'), 1, '刷前状态为1'); + range.setStart(body.firstChild.firstChild, 0).setEnd(body.firstChild.firstChild, 2).select(); + /*格式刷侦听mouseup事件,select方法不能触发mouseup,因此必须手动触发*/ + ua.mouseup(editor.body); + + }, 50); + stop(); +}); + +/*trace 964*/ +test('默认格式图片刷有格式的图片', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('hello'); + setTimeout(function () { + var img = editor.body.firstChild.lastChild; + var img_new = img.previousSibling; + range.selectNode(img).select(); + editor.addListener('mouseup', function () { + equal(editor.queryCommandState('formatmatch'), 0, '刷后状态为0'); + if (!ua.browser.opera) { + equal(img_new.style.cssFloat || img_new.style.styleFloat, 'none', 'check style float', 'float'); + } + equal(img_new.style.backgroundColor, 'red', 'check background color'); + start(); + }); + editor.execCommand('formatmatch'); + range.selectNode(img_new).select(); + ua.mouseup(editor.body); + + }, 50); + stop(); +}); + +/*trace 965*/ +test('有浮动方式图片刷默认的图片', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('hello'); + setTimeout(function () { + var img = editor.body.firstChild.lastChild.previousSibling; + var img_new = img.nextSibling; + range.selectNode(img).select(); + editor.addListener('mouseup', function () { + equal(editor.queryCommandState('formatmatch'), 0, '刷后状态为0'); + if (!ua.browser.opera) { + equal(img_new.style.cssFloat || img_new.style.styleFloat, "left", 'check style float'); + } + /*只有浮动方式会刷,其他都不刷*/ + equal(img_new.style.backgroundColor, '', 'check background color'); + equal(img_new.style.width, '', 'check style width'); + equal($(img_new).attr('width'), 100, 'check width'); + start(); + }); + editor.execCommand('formatmatch'); + range.selectNode(img_new).select(); + ua.mouseup(editor.body); + + }, 50); + stop(); +}); + +/*trace 1068*/ +test('独占一行图片刷默认的图片', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('hello'); + setTimeout(function () { + var img = editor.body.firstChild.lastChild.previousSibling; + var img_new = img.nextSibling; + range.selectNode(img).select(); + editor.addListener('mouseup', function () { + equal(editor.queryCommandState('formatmatch'), 0, '刷后状态为0'); + if (!ua.browser.opera) { + equal(img_new.style.display, "block", 'check display block'); + } + start(); + }); + editor.execCommand('formatmatch'); + range.selectNode(img_new).select(); + ua.mouseup(editor.body); + + }, 50); + stop(); +}); + +/*trace 1068*/ +test('默认的图片图片刷独占一行图片', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('hello'); + setTimeout(function () { + var img = editor.body.firstChild.lastChild; + var img_new = img.previousSibling; + range.selectNode(img).select(); + editor.addListener('mouseup', function () { + equal(editor.queryCommandState('formatmatch'), 0, '刷后状态为0'); + if (!ua.browser.opera) { + equal(img_new.style.display, "inline", 'check display block'); + } + start(); + }); + editor.execCommand('formatmatch'); + range.selectNode(img_new).select(); + ua.mouseup(editor.body); + + }, 50); + stop(); +}); + +/*trace 939*/ +test('trace 939:字母列表刷表格内的字母列表', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('
    1. first
    2. second
    1. third
    2. fourth
    '); + setTimeout(function () { + range.selectNode(editor.body.firstChild).select(); + editor.execCommand('formatmatch'); + editor.addListener('mouseup', function () { + setTimeout(function () { + equal(editor.body.lastChild.getElementsByTagName('ol')[0].style.listStyleType, 'lower-alpha', '查看列表是否仍然是字母的'); + start(); + }, 250); + }); + range.selectNode(editor.body.lastChild).select(); + ua.mouseup(editor.body); + + }, 50); + stop(); +}); + +/*trace 938*/ +test('用格式刷刷整个表格', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    hello

    '); + setTimeout(function () { + range.selectNode(editor.body.firstChild).select(); + editor.addListener('mouseup', function () { + /*整个校验方法不好,没有解决根源的问题, + 校验的目的应当是不会多出不应当出现的内容,除了match还可能会有其他多出来的内容 + 但是style之类的东西比较难校验*/ + equal(editor.body.innerHTML.indexOf('match'), -1, '没有插入match占位符'); + start(); + }); + editor.execCommand('formatmatch'); + range.selectNode(editor.body.lastChild).select(); + editor.currentSelectedArr = [editor.body.lastChild.getElementsByTagName('td')[0]]; + ua.mouseup(editor.body); + + }, 50); + stop(); +}); + +test('表格刷文本', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    hello

    hello2
    '); + setTimeout(function () { + range.selectNode(editor.body.lastChild).select(); +// editor.currentSelectedArr = [editor.body.lastChild.getElementsByTagName('td')[0]]; + editor.addListener('mouseup', function () { + equal(editor.body.firstChild.innerHTML, 'hello', ' 去掉hello的格式'); + start(); + }); + editor.execCommand('formatmatch'); + setTimeout(function () { + range.selectNode(editor.body.firstChild).select(); + ua.mouseup(editor.body); + + }, 50); + }, 50); + stop(); +}); + +/*trace 1096*/ +test('trace 1096,1761:表格刷表格', function () { + + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    hello

    hello2
    hello3
    '); + setTimeout(function () { + var trs = editor.body.lastChild.getElementsByTagName('tr'); + var ut = editor.getUETable(editor.body.lastChild); + var cellsRange = ut.getCellsRange(trs[0].cells[0], trs[1].cells[0]); + ut.setSelected(cellsRange); + range.setStart(trs[0].cells[0], 0).collapse(true).select(); + var tds = editor.body.lastChild.getElementsByTagName('td'); + editor.addListener('mouseup', function () { + ok(ua.isEqualArray(ut.selectedTds, [trs[0].cells[0], trs[1].cells[0]]), '比较选择的区域'); +// equal( editor.body.getElementsByTagName('table')[0].getAttribute( 'border' ), '1', '表格边框宽度相同' ); /*如果没有指定border,那么不主动设置border*/ +// equal( tds[index].style['borderWidth'], '1px', '表格边框宽度相同' ); +// equal( tds[index].style['borderStyle'], 'solid', '表格边框样式相同' ); + for (var index = 0; index < tds.length; index++) { + equal(tds[index].style['borderColor'], tds[0].style['borderColor'], '表格边框颜色相同'); + } + + start(); + }); + editor.execCommand('formatmatch'); +// editor.currentSelectedArr = [tds[1], tds[3]]; + range.setStart(tds[1], 0).setEnd(tds[3], 1).select(); + ua.mouseup(editor.body); +// }, 50); + }, 50); + stop(); +}); + +/*trace 1092, 991*/ +test('文本刷a标签(闭合)', function () { + + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('hellobaidu'); + setTimeout(function () { + + var p = editor.body.firstChild; + var a = p.lastChild; + range.selectNode(p.firstChild).select(); + /*给文本刷上前景色*/ + editor.execCommand('forecolor', 'rgb(255,0,0)'); + editor.addListener('mouseup', function () { + var a = p.lastChild; + ua.clearWhiteNode(a); + equal(a.childNodes.length, 3, '3子节点'); + //1.2版本中空的span里有删不掉的不可见字符,已经从浏览器复制过来了 + ua.checkHTMLSameStyle('baidu', editor.document, a, 'check style'); + start(); + }); + range.selectNode(p.firstChild).select(); + editor.execCommand('formatmatch'); + range.setStart(p.lastChild.firstChild, 2).collapse(true).select(); + ua.mouseup(editor.body); + + }, 50); + stop(); +}); + + + +test('点了格式刷后不刷文本再点一次格式刷', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    first

    second

    third

    '); + setTimeout(function () { + var body = editor.body; + range.setStart(body.firstChild.firstChild.firstChild, 2).collapse(true).select(); + editor.addListener('mouseup', function () { + equal(editor.__allListeners['mouseup'].length, num - 1, 'mouseup的侦听器被删除'); + equal(editor.queryCommandState('formatmatch'), 0, '刷后状态为0'); + equal(body.lastChild.innerHTML.toLowerCase(), 'third'); + + start(); + }); + editor.execCommand('formatmatch'); + var num = editor.__allListeners['mouseup'].length; + /*删除mouseup侦听器后直接返回*/ + editor.execCommand('formatmatch'); + equal(editor.__allListeners['mouseup'].length, num - 1, '如果第一次格式刷没执行,下一次格式刷会先去掉上一个mouseup的侦听器然后直接退出'); + ua.mouseup(body); + + }, 50); + stop(); +}); +test('a标签刷文本', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + setTimeout(function () { + editor.setContent('hellobaidu'); + setTimeout(function () { + var p = editor.body.firstChild; + var a = p.lastChild; + range.setStart(a.firstChild.firstChild, 1).collapse(true).select(); + editor.addListener('mouseup', function () { + /*firefox不支持outerHTML*/ + equal(p.firstChild.innerHTML, 'hello', 'span包含文本'); + ok(p.firstChild.style['color'], 'red', '查看文本是否添加了样式'); + start(); + }); + editor.execCommand('formatmatch'); + range.selectNode(p.firstChild).select(); + ua.mouseup(editor.body); + }, 50); + },50); + stop(); +}); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/horizontal.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/horizontal.js new file mode 100644 index 000000000..032fa0121 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/horizontal.js @@ -0,0 +1,142 @@ +module( "plugins.horizontal" ); +//normal +test( 'horizontal', function() { + var editor = te.obj[0]; + var d = editor.document; + var range = te.obj[1]; + var db = editor.body; + + editor.setContent( 'top

    bottom

    ' ); + setTimeout(function(){ + range.setStart( d.getElementsByTagName( 'em' )[0].firstChild, 0 ).setEnd( db.lastChild.firstChild, 5 ).select(); + equal( editor.queryCommandState( "horizontal" ), 0, "边界不在table里" ); + editor.execCommand( 'horizontal' ); + var spase = ua.browser.ie?'':'
    '; + equal( ua.getChildHTML( db ), "


    m"+spase+"

    ", "边界不在table里" ); + start(); + },50); + stop(); +} ); +test( 'horizontal_br', function() {//trace 3854 + var div = document.body.appendChild(document.createElement('div')); + $(div).css('width', '500px').css('height', '500px').css('border', '1px solid #ccc'); + var editor = new baidu.editor.Editor({'initialContent':'

    欢迎使用ueditor

    ', 'autoFloatEnabled':false,enterTag:'br'}); + + editor.render(div); + editor.ready(function () { + var range = new baidu.editor.dom.Range(editor.document); + editor.setContent( '
    1. top

    ' ); + range.setStart( editor.body.firstChild.firstChild, 1 ).collapse( true ).select(); + editor.execCommand( 'horizontal' ); + range = editor.selection.getRange(); + var containger = (ua.browser.ie&&ua.browser.ie<9)?editor.body.getElementsByTagName('li')[0]:editor.body.getElementsByTagName('hr')[0].nextSibling; + var offset = (ua.browser.webkit||ua.browser.ie==11)?1:((ua.browser.ie&&ua.browser.ie<9)?3:0); + if(!ua.browser.opera){ + ua.checkResult( range,containger,containger, offset, offset, true, 'check range' ); + } + ua.manualDeleteFillData(editor.body); + equal( ua.getChildHTML( editor.body.firstChild ), "
  • top



  • ", "在列表中插入分隔线,在分隔线后面添加p用于定位" ); + setTimeout(function(){ + te.dom.push(div); + start(); + },50); + }); + stop(); +} ); +test( 'horizontal-delkeydown', function() { + var editor = te.obj[0]; + var d = editor.document; + var range = te.obj[1]; + var db = editor.body; + editor.setContent( 'top

    bottom

    ' ); + setTimeout(function(){ + range.setStart( d.getElementsByTagName( 'em' )[0].firstChild, 0 ).setEnd( db.lastChild.firstChild, 5 ).select(); + editor.execCommand( 'horizontal' ); + setTimeout(function(){ + range.setStart( editor.body.lastChild, 0 ).collapse(true).select(); + editor.fireEvent('delkeydown',{}); + var spase = ua.browser.ie?'':'
    '; + equal( ua.getChildHTML( db ), "

    m"+spase+"

    ", "删除分隔符" ); + start(); + },50); + },50); + stop(); +} ); + +test( '在列表中插入分隔线,回车符为p', function() { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent( '
    1. top

    ' ); + range.setStart( body.firstChild.firstChild, 1 ).collapse( true ).select(); + editor.execCommand( 'horizontal' ); + range = editor.selection.getRange(); + var p = body.firstChild.firstChild.lastChild; + + var offset = ((ua.browser.ie&&ua.browser.ie>8&&ua.browser.ie<11)||ua.browser.gecko)?0:1; + if(!ua.browser.opera){ + ua.checkResult( range, p.firstChild, p.firstChild, offset, offset, true, 'check range' ); + } + ua.manualDeleteFillData(editor.body); + equal( ua.getChildHTML( body.firstChild ), "
  • top


  • ", "在列表中插入分隔线,在分隔线后面添加p用于定位" ); + +} ); + +//test( '在列表中插入分隔线,回车符为br', function() { +// +// var editor = new baidu.editor.Editor({'enterTag':'br'}); +// var div = document.body.appendChild(document.createElement('div')); +// editor.render(div); +// var range = new baidu.editor.dom.Range(editor.document); +// var body = editor.body; +// editor.setContent( '
    1. top
    ' ); +// range.setStart( body.firstChild.firstChild, 1 ).collapse( true ).select(); +// +// editor.execCommand( 'horizontal' ); +// +// var li = body.firstChild.firstChild; +// if ( !baidu.editor.browser.gecko ) { +// equal( ua.getChildHTML( body ), "
    1. top



    ", "在列表中插入分隔线,在分隔线后面添加p用于定位" ); +// } else { +// equal( ua.getChildHTML( body ), "
    1. top


    ", "ff在列表中插入分隔线" ); +// } +// te.dom.push(div); +//} ); + +//table +test( 'horizontal in table', function() { + var editor = te.obj[0]; + var d = editor.document; + var range = te.obj[1]; + editor.setContent( '
    1
    2
    ' ); + stop(); + setTimeout(function () { + range.setStart(d.getElementsByTagName('tr')[0].firstChild, 0).setEnd(d.getElementsByTagName('tr')[1].firstChild, 0).select(); + equal(editor.queryCommandState("horizontal"), -1, "边界在table里"); + start(); + }, 50); +} ); +//collapsed=true +test( 'horizontal&&collapsed', function() { + var editor = te.obj[0]; + var range = te.obj[1]; + var db = editor.body; + editor.setContent( 'top

    bottom

    ' ); + range.setStart( db.lastChild.firstChild, 0 ).collapse( true ).select(); + equal( editor.queryCommandState( "horizontal" ), 0, "边界不在table里" ); + editor.execCommand( 'horizontal' ); + var spase = ua.browser.ie?'':'
    '; + equal( ua.getChildHTML( db ), "

    top


    bottom"+spase+"

    ", "边界不在table里" ); +} ); +//TODO 1.2.6 +//test( 'trace 3338:horizontal&&enterTag', function() { +// var editor = te.obj[0]; +// var range = te.obj[1]; +// editor.options.enterTag ='br'; +// editor.setContent( '
    1. top
    ' ); +// range.setStartAfter(editor.body.firstChild.firstChild.firstChild).collapse( true ).select(); +// editor.execCommand('horizontal'); +// ua.manualDeleteFillData(editor.body); +// var br = (ua.browser.ie && ua.browser.ie<9) || ua.browser.webkit?"
    ":""; +// equal(ua.getChildHTML(editor.body), '
    1. top


      '+br+'
    ', 'enterTag=br'); +//} ); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/iframe.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/iframe.js new file mode 100644 index 000000000..e8b60e98a --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/iframe.js @@ -0,0 +1,30 @@ +/** + * Created by JetBrains PhpStorm. + * User: dongyancen + * Date: 12-9-17 + * Time: 下午2:55 + * To change this template use File | Settings | File Templates. + */ +module( 'plugins.iframe' ); +test( '检查高亮和清除_iframe', function() { + var sc = document.createElement("script"); + sc.id="sc"; + sc.type = "text/plain"; + document.body.appendChild(sc); + te.obj[2].render('sc'); + + te.obj[2].ready(function(){ + equal( te.obj[2].queryCommandState( 'insertframe' ), 0, 'check insertframe state' ); + var iframe = document.createElement('iframe'); + $(iframe).attr('src','www.baidu.com'); + this._iframe = iframe; + this.setContent('

    欢迎使用ueditor!

    '); + ok(te.obj[2]._iframe,'加入_iframe'); + setTimeout(function(){ + ok(!te.obj[2]._iframe,'检查selectionchanged会触发去掉_iframe'); + document.getElementById('sc').parentNode.removeChild(document.getElementById('sc')); + start(); + },50); + }); + stop(); +} ); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/image.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/image.js new file mode 100644 index 000000000..9bb61ae28 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/image.js @@ -0,0 +1,204 @@ +module( 'plugins.image' ); +/** + * 插入视频 + * 插入图像 + * 选区闭合和不闭合 + * 表格中插入图像 + */ +/*trace1491 修改动图的宽高*/ +test( 'trace1491 修改动图的宽高', function () { + setTimeout(function () { + expect(3); + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent('


    '); + setTimeout(function () { + range.setStart(body.firstChild, 0).collapse(1).select(); + editor.execCommand('insertimage', {src: '../data/test.JPG'}); + setTimeout(function () { + ua.manualDeleteFillData(editor.body); + range.selectNode(body.firstChild.firstChild).select(); + var img = body.getElementsByTagName('img')[0]; + editor.execCommand('insertimage', {src: '../data/test.JPG', width: 50, height: 80}); + setTimeout(function () { + equal($(img).attr('width'), '50', '比较width'); + equal($(img).attr('height'), '80', '比较width'); + ok(/data\/test\.JPG/.test(img.getAttribute('src')), '比较src'); + start(); + }, 500); + }, 100); + }, 100); + }, 100); + stop(); +} ); +test( '插入新图像', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent( '


    ' ); + range.setStart( body.firstChild, 0 ).collapse( 1 ).select(); + editor.execCommand( 'insertimage', {src:'http://img.baidu.com/hi/jx2/j_0001.gif', width:50, height:51} ); + ua.manualDeleteFillData( editor.body ); + var img = body.getElementsByTagName( 'img' )[0]; + equal( img.getAttribute( 'src' ), 'http://img.baidu.com/hi/jx2/j_0001.gif', '比较src' ); + equal( img.getAttribute( 'width' ), '50', '比较width' ); + equal( img.getAttribute( 'height' ), '51', '比较height' ); +} ); + +/*trace 1490 不设宽高,插入图片*/ +test( 'trace 1490 不设宽高,插入图片', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent( '


    ' ); + range.setStart( body.firstChild, 0 ).collapse( 1 ).select(); + editor.execCommand( 'insertimage', {src:'http://img.baidu.com/hi/jx2/j_0001.gif'} ); + ua.manualDeleteFillData( editor.body ); + var img = body.getElementsByTagName( 'img' )[0]; + equal( img.getAttribute( 'src' ), 'http://img.baidu.com/hi/jx2/j_0001.gif', '比较src' ); +} ); + +test( '插入对齐方式为居中对齐的图像,新建一个p,在p上设置居中对齐', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent( '

    hello

    ' ); + range.setStart( body.firstChild, 0 ).collapse( 1 ).select(); + editor.execCommand( 'insertimage', {src:'http://img.baidu.com/hi/jx2/j_0001.gif', width:50, height:51, floatStyle:'center'} ); + ua.manualDeleteFillData( editor.body ); + + var img = body.getElementsByTagName( 'img' )[0]; + equal( body.childNodes.length, 2, '2个p' ); + var p = body.firstChild; + equal( p.style['textAlign'], 'center', '居中对齐' ); + ok( p.nextSibling.innerHTML.indexOf( 'hello' ) > -1, '第二个p里面是hello' ); //1.2版本在FF中,hello前有不可见字符 + if ( baidu.editor.browser.ie ) + equal( img.style['styleFloat'], '', 'float为空' ); + else + equal( img.style['cssFloat'], '', 'float为空' ); + equal( img.getAttribute( 'src' ), 'http://img.baidu.com/hi/jx2/j_0001.gif', '比较src' ); + equal( img.getAttribute( 'width' ), '50', '比较width' ); + equal( img.getAttribute( 'height' ), '51', '比较height' ); +} ); + +test( '修改已有图片的属性', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent( '

    hello

    ' ); + range.selectNode( body.firstChild.firstChild ).select(); + editor.execCommand( 'insertimage', {src:'http://img.baidu.com/hi/jx2/j_0018.gif'} ); + equal( ua.getChildHTML( body.firstChild ), 'hello', '检查插入的图像地址' ); + equal( body.firstChild.childNodes.length, 3, '2个img孩子' ); +} ); + + +test( '选区不闭合插入图像', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent( '

    hello1

    hello2

    ' ); + setTimeout(function(){ + range.setStart( body.firstChild.firstChild, 2 ).setEnd( body.lastChild, 2 ).select(); + editor.execCommand( 'insertimage', {src:'http://img.baidu.com/hi/jx2/j_0016.gif', width:'100', height:'100'} ); + ua.manualDeleteFillData( editor.body ); + equal( body.childNodes.length, 1, '只有一个p' ); + ua.clearWhiteNode(body.firstChild); + var img = body.firstChild.lastChild; + equal( img.getAttribute( 'src' ), 'http://img.baidu.com/hi/jx2/j_0016.gif', '比较src' ); + equal( img.getAttribute( 'width' ), '100', '比较width' ); + equal( img.getAttribute( 'height' ), '100', '比较height' ); + start(); + },50); + stop(); +} ); + +test( '图像设置左右浮动', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent( '

    hello1

    hello2

    ' ); + range.selectNode( body.lastChild.lastChild ).select(); + editor.execCommand( 'imagefloat', 'left' ); + equal( body.getElementsByTagName( 'img' )[0].style['cssFloat'] || body.getElementsByTagName( 'img' )[0].style['styleFloat'], 'left', '左浮动' ); +// equal( body.getElementsByTagName( 'img' )[0].style['float'], 'left', '左浮动' ); + equal( editor.queryCommandValue( 'imagefloat' ), 'left' ); + + editor.execCommand( 'imagefloat', 'right' ); + equal( body.getElementsByTagName( 'img' )[0].style['cssFloat'] || body.getElementsByTagName( 'img' )[0].style['styleFloat'], 'right', '右浮动' ); + equal( editor.queryCommandValue( 'imagefloat' ), 'right' ); + equal( editor.queryCommandState( 'imagefloat' ), 0, '图片被选中,因此图片菜单高亮' ); + range.setStart( body.firstChild, 0 ).collapse( 1 ).select(); + equal( editor.queryCommandState( 'imagefloat' ), -1, '光标闭合,因此图片菜单高不高亮' ); + equal( editor.queryCommandValue( 'justify' ), 'left', '段落的对齐方式为左对齐' ); + equal( editor.queryCommandValue( 'imagefloat' ), 'none', '图片对齐方式在闭合情况获取为空' ) + range.selectNode( body.firstChild.firstChild ).select(); + equal( editor.queryCommandValue( 'imagefloat' ), 'none', '选中文本,因此图片菜单高不高亮' ); +} ); + +test( '左浮动变为默认的样式和居中', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent( '

    hello1

    hello2

    ' ); + range.selectNode( body.lastChild.lastChild ).select(); + editor.execCommand( 'imagefloat', 'none' ); + equal( ua.getFloatStyle( body.getElementsByTagName( 'img' )[0] ), '', '没有浮动方式' ); + equal( editor.queryCommandValue( 'imagefloat' ), 'none' ); + $( body.getElementsByTagName( 'img' )[0] ).css( 'float' ); + range.selectNode( body.getElementsByTagName( 'img' )[0] ).select(); + editor.execCommand( 'imagefloat', 'center' ); + equal( editor.queryCommandValue( 'imagefloat' ), 'center' ); + equal( body.childNodes.length, 3, '3个p,image被切出一个p出来了' ); + var p = body.childNodes[2]; + equal( p.tagName.toLowerCase(), 'p', '第2个是p' ); + equal( p.firstChild.tagName.toLowerCase(), 'img', 'p的孩子为image' ); + equal( ua.getFloatStyle( p.firstChild ), '', 'image对齐方式float为空' ); + equal( editor.queryCommandValue( 'justify' ), 'center', '段落的对齐方式为居中' ); +} ); + +test( ' 带有超链接的图片', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent( '

    hello1

    hello2

    ' ); + range.selectNode( body.lastChild.lastChild ).select(); + editor.execCommand( 'imagefloat', 'center' ); + var p = body.childNodes[2]; + equal( p.firstChild.tagName.toLowerCase(), 'a', 'p的孩子为a' ); + equal( ua.getFloatStyle( p.firstChild ), '', 'image对齐方式float为空' ); + equal( editor.queryCommandValue( 'justify' ), 'center', '段落的对齐方式为居中' ); + + editor.execCommand( 'imagefloat', 'left' ); + equal( p.firstChild.tagName.toLowerCase(), 'a', 'p的孩子为a' ); + equal( ua.getFloatStyle( p.firstChild.firstChild ), 'left', 'image对齐方式float为left' ); + + editor.execCommand( 'imagefloat', 'none' ); + equal( p.firstChild.tagName.toLowerCase(), 'a', 'p的孩子为a' ); + equal( ua.getFloatStyle( p.firstChild.firstChild ), '', 'image对齐方式float为空' ); +} ); + +test( ' 默认样式切换到居中再切换回默认,会把居中导致的3个p合并', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent( '

    hello2hello3

    ' ); + setTimeout( function () { + range.selectNode( body.getElementsByTagName( 'a' )[0] ).select(); + editor.execCommand( 'imagefloat', 'center' ); + var p = body.childNodes[1]; + equal( p.firstChild.tagName.toLowerCase(), 'a', 'p的孩子为a' ); + equal( ua.getFloatStyle( p.firstChild ), '', 'image对齐方式float为空' ); + equal( editor.queryCommandValue( 'justify' ), 'center', '段落的对齐方式为居中' ); + editor.execCommand( 'imagefloat', 'none' ); + equal( body.childNodes.length, 1, '3个p合并为1个' ); + + var a = body.firstChild.firstChild.nextSibling; + equal( a.tagName.toLowerCase(), 'a', 'p的孩子为a' ); + equal( a.firstChild.tagName.toLowerCase(), 'img', 'a的孩子是img' ); + equal( ua.getFloatStyle( a.firstChild ), '', 'image对齐方式float为空' ); + start(); + }, 50 ); + stop(); +} ); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/indent.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/indent.js new file mode 100644 index 000000000..daa2acaa5 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/indent.js @@ -0,0 +1,233 @@ +module( 'plugins.indent' ); + +/*trace 1030*/ +test( '同时加缩进和段前距', function() { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    hello1

    hello2

    '); + /*selectNode不能直接选body,否则在ff下回冒到外面去了,一直回冒到外面的html上去了*/ +// range.selectNode( editor.body ).select(); + setTimeout(function () { + range.setStart(editor.body.firstChild, 0).setEnd(editor.body.lastChild, 1).select(); + editor.execCommand('rowspacing', 15, 'top'); + editor.execCommand('indent'); +// stop() + + equal(editor.body.firstChild.style['textIndent'], '2em', '查看缩进量'); + equal(editor.queryCommandValue('rowspacing', 'top'), 15, '查询段前距'); + start(); + }, 50); + stop(); +} ); + +test( 'trace1241--首行缩进的状态反射', function() { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '

    hello1

    ' ); + setTimeout(function(){ + range.setStart( editor.body.firstChild, 1 ).collapse( 1 ).select(); + equal( editor.queryCommandState( 'indent' ), 0, '开始没有缩进' ); + editor.execCommand( 'indent' ); + equal( editor.queryCommandState( 'indent' ), 1, '有缩进' ); + editor.execCommand( 'indent' ); + equal( editor.queryCommandState( 'indent' ), 0, '没有缩进' ); + start(); + },50); + stop(); +} ); + +/*trace 1031*/ +test( '缩进后再h1', function() { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '

    hello1

    hello2

    ' ); + setTimeout(function () { + range.setStart(editor.body.firstChild, 0).setEnd(editor.body.lastChild, 1).select(); + editor.execCommand('indent'); + editor.execCommand('paragraph', 'h1'); + equal(editor.queryCommandValue('paragraph'), 'h1', '段落格式为h1'); + equal(editor.body.firstChild.style['textIndent'], '2em', '查看缩进量'); + start(); + }, 50); + stop(); +} ); + + +test( '先设h1再缩进', function() { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '

    hello1

    hello2

    ' ); + setTimeout(function () { + range.setStart(editor.body.firstChild, 0).setEnd(editor.body.lastChild, 1).select(); + editor.execCommand('paragraph', 'h1'); + editor.execCommand('indent'); + equal(editor.queryCommandValue('paragraph'), 'h1', '段落格式为h1'); + equal(editor.body.firstChild.style['textIndent'], '2em', '查看缩进量'); + start(); + }, 50); + stop(); +} ); +/*trace 1479 首行缩进按钮功能有效*/ +test('trace 1479 首行缩进按钮功能有效',function(){ + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    hello

    '); + setTimeout(function () { + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('indent'); + equal(editor.body.firstChild.style['textIndent'], '2em', '选择文字,首行缩进');//text-indent:2em + equal(editor.queryCommandState('indent'), 1, '缩进按钮高亮'); + start(); + }, 50); + stop(); +}); +/*trace 1516 选Heading格式的文字首行缩进按钮高亮*/ +test('trace 1516 选Heading格式的文字首行缩进按钮高亮',function(){ + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '

    hello

    ' ); + setTimeout(function(){ + range.setStart(editor.body.firstChild,0).collapse(true).select(); + editor.execCommand( 'indent' ); + equal(editor.body.firstChild.style['textIndent'], '2em', '选Heading格式的文字首行缩进');//text-indent:2em + equal(editor.queryCommandState('indent'), 1, '缩进按钮高亮'); + start(); + },50); + stop(); +}); +test( '先对齐方式再缩进', function() { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '

    hello1

    hello2

    ' ); + setTimeout(function () { + range.setStart(editor.body.firstChild, 0).setEnd(editor.body.lastChild, 1).select(); + editor.execCommand('justify', 'right'); + editor.execCommand('indent'); + equal(editor.queryCommandValue('justify'), 'right', '段落格式为h1'); + equal(editor.body.firstChild.style['textIndent'], '2em', '查看缩进量'); + start(); + }, 50); + stop(); +} ); + +test( '先缩进再对齐方式', function() { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '

    hello1

    hello2

    ' ); + setTimeout(function () { + range.setStart(editor.body.firstChild, 0).setEnd(editor.body.lastChild, 1).select(); + editor.execCommand('indent'); + editor.execCommand('justify', 'right'); + equal(editor.queryCommandValue('justify'), 'right', '段落格式为h1'); + equal(editor.body.firstChild.style['textIndent'], '2em', '查看缩进量'); + start(); + }, 50); + stop(); +} ); + +/*trace 1033*/ +test( '非闭合取消缩进', function() { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    hello1

    hello2

    '); + setTimeout(function () { + range.setStart(editor.body.firstChild, 0).setEnd(editor.body.lastChild, 1).select(); + editor.execCommand('indent'); + equal(editor.body.firstChild.style['textIndent'], '2em', '查看缩进量'); + editor.execCommand('indent'); + equal(editor.body.firstChild.style['textIndent'], '0em', '查看缩进量'); + start(); + }, 50); + stop(); +} ); + +test( '闭合取消缩进', function() { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '

    hello1

    hello2

    ' ); + setTimeout(function () { + range.setStart(editor.body.firstChild, 0).setEnd(editor.body.lastChild, 1).select(); + editor.execCommand('indent'); + equal(editor.body.firstChild.style['textIndent'], '2em', '查看缩进量'); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + ua.manualDeleteFillData(editor.body); + editor.execCommand('indent'); + equal(editor.body.firstChild.style['textIndent'], '0em', '查看缩进量'); + start(); + }, 50); + stop(); +} ); + +//test( '表格内闭合缩进和取消缩进', function() { +// var editor = te.obj[0]; +// var range = te.obj[1]; +// editor.setContent( '

    hello

    ' ); +// var tds = editor.body.firstChild.getElementsByTagName( 'td' ); +// range.setStart( tds[0], 0 ).collapse( true ).select(); +// editor.execCommand( 'indent' ); +// ua.manualDeleteFillData( editor.body ); +// equal( tds[0].firstChild.tagName.toLowerCase(), 'p', '插入一个p标签' ); +// equal( tds[0].firstChild.style['textIndent'], '2em', '查看缩进量' ); +// range.setStart( tds[0].firstChild, 0 ).collapse( true ).select(); +// te.presskey( '', 'h' ); +// setTimeout( function() { +// equal( tds[0].firstChild.style['textIndent'], '2em', '插入文本节点后查看缩进量' ); +// range.setStart( tds[0].firstChild, 0 ).collapse( true ).select(); +// editor.execCommand( 'indent' ); +// ua.manualDeleteFillData( editor.body ); +// equal( tds[0].firstChild.style['textIndent'], '0em', '取消缩进' ); +// /*选中一个单元格设置缩进*/ +// range.selectNode( tds[2] ).select(); +// editor.execCommand( 'indent' ); +// ua.manualDeleteFillData( editor.body ); +// equal( tds[2].firstChild.style['textIndent'], '2em', '查看缩进量' ); +// start(); +// }, 30 ); +// stop(); +//} ); + +test( '多个单元格缩进和取消缩进', function() { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '
    hello1hello2
    hello3

    hello4

    ' ); + setTimeout(function () { + var tds = editor.body.firstChild.getElementsByTagName('td'); + range.selectNode(editor.body.firstChild).select(); + editor.execCommand('indent'); + ua.manualDeleteFillData(editor.body); + /*会自动在非block元素外面套p*/ + equal(tds[0].firstChild.tagName.toLowerCase(), 'p', '插入一个p标签'); + for (var index = 0; index < tds.length; index++) { + equal(tds[index].firstChild.style['textIndent'], '2em', '查看第' + (index + 1) + '个单元格的缩进量'); + } + range.selectNode(editor.body.firstChild).select(); + editor.execCommand('indent'); + for (index = 0; index < tds.length; index++) { + equal(tds[index].firstChild.style['textIndent'], '0em', '查看第' + (index + 1) + '个单元格的缩进是否被取消'); + } + start(); + }, 50); + stop(); +} ); + +/*trace 1097*/ +test( '列表中缩进', function() { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '
    • nihao
    • hello
    ' ); + setTimeout(function () { + range.setStart(editor.body.firstChild.firstChild, 0).collapse(true).select(); + editor.execCommand('indent'); + var p = editor.body.firstChild.firstChild.firstChild; + equal(p.tagName.toLowerCase(), 'p', '自动创建一个p'); + equal(p.style['textIndent'], '2em', '设置缩进为2em'); + /*在有文本的列表中缩进*/ + range.setStart(editor.body.firstChild.lastChild.firstChild, 1).collapse(true).select(); + editor.execCommand('indent'); + p = editor.body.firstChild.lastChild.firstChild; + equal(p.tagName.toLowerCase(), 'p', '自动创建一个p'); + equal(p.style['textIndent'], '2em', '设置缩进为2em'); + start(); + }, 50); + stop(); +} ) \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/insertcode.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/insertcode.js new file mode 100644 index 000000000..4098c526e --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/insertcode.js @@ -0,0 +1,283 @@ +module('plugins.insertcode'); +//test('',function(){stop();}) +test('trace 3343:插入代码中有空行', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('hello'); + ua.keydown(editor.body, {'keyCode':65, 'ctrlKey':true}); + editor.execCommand('insertcode', 'Java'); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + ua.keydown(editor.body, {'keyCode':13}); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + ua.keydown(editor.body, {'keyCode':13}); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + range.insertNode(editor.document.createTextNode('hello')); + var br = ua.browser.ie ? '' : '
    '; + if (ua.browser.ie) + ua.checkSameHtml(editor.body.innerHTML, '

    hello​​
    ​​hello

    ', '插入代码'); + else if (ua.browser.gecko||ua.browser.webkit) + ua.checkSameHtml(editor.body.innerHTML, '
    hello

    hello
    ', '插入代码'); + else + ua.checkSameHtml(editor.body.innerHTML, '
    hello

    hello

    ' + br + '

    ', '插入代码'); + setTimeout(function () { + editor.execCommand('source'); + setTimeout(function () { + editor.execCommand('source'); + var br = ua.browser.ie ? '' : '
    '; + if (ua.browser.ie&&ua.browser.ie<9) + ua.checkSameHtml(editor.body.innerHTML, "
    hello
    hello

     

    ", '样式不变'); + + else if (ua.browser.gecko||ua.browser.webkit) + ua.checkSameHtml(editor.body.innerHTML, '
    hello

    hello
    ', '样式不变'); + start(); + }, 20); + }, 20); + stop(); +}); + +test('trace 3355:不闭合选区插入代码', function () { + var editor = te.obj[0]; + var code = '<div id="upload" style="display: none" ><img id="uploadBtn"></div>'; + editor.setContent(code); + setTimeout(function () { + ua.keydown(editor.body, {'keyCode': 65, 'ctrlKey': true}); + editor.execCommand('insertcode', 'html'); + var br = ua.browser.ie ? '' : '
    '; + if (ua.browser.gecko || ua.browser.opera ||ua.browser.webkit) + ua.checkSameHtml(editor.body.innerHTML, '
    <div id=\"upload\" style=\"display: none\" ><img id=\"uploadBtn\"></div>
    ', '检查插入了html'); + else + ua.checkSameHtml(editor.body.innerHTML, '
    <div id=\"upload\" style=\"display: none\" ><img id=\"uploadBtn\"></div>

    ' + br + '

    ', '检查插入了html'); + start(); + }, 50); + stop(); +}); + +test('trace 3395:插入代码为空时,清空编辑器', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent(''); + editor.execCommand('insertcode', 'html'); + var br = ua.browser.ie ? ' ' : '
    '; + if (ua.browser.gecko||ua.browser.ie > 10) + ua.checkSameHtml(editor.body.firstChild.outerHTML, '

    ', '检查插入了html'); + else if (ua.browser.ie > 8) + ua.checkSameHtml(editor.body.firstChild.outerHTML, '
    ', '检查插入了html');
    +        else
    +            ua.checkSameHtml(editor.body.firstChild.outerHTML, '
    ' + br + '
    ', '检查插入了html'); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + range.insertNode(editor.document.createTextNode('hello'));//TODO bug修复把此行删除 + ua.keydown(editor.body, {'keyCode':65, 'ctrlKey':true}); + ua.keydown(editor.body, {'keyCode':8}); + br = ua.browser.ie ? '' : '
    '; + ua.checkSameHtml(editor.body.innerHTML, '

    ' + br + '

    ', '检查编辑器清空'); +}); + +test('trace 3396:多次切换源码,不会产生空行', function () { + var editor = te.obj[0]; + + editor.setContent('

    <body>

    </body>

    '); + ua.keydown(editor.body, {'keyCode':65, 'ctrlKey':true}); + editor.execCommand('insertcode', 'html'); + var br = (ua.browser.ie==9||ua.browser.ie==10) ? '\n' : '
    '; + var p = editor.body.firstChild.outerHTML.toLowerCase(); + var x ='\"'; + if(ua.browser.ie<9&&ua.browser.ie)x=''; + equal(p, '
    <body>'+br+'</body>
    ', '检查插入了html') + ua.checkSameHtml(editor.body.firstChild.outerHTML, '
    <body>'+br+'</body>
    ', '检查插入了html'); + + //todo 1.3.6 3853 + + setTimeout(function () { + editor.execCommand('source'); + setTimeout(function () { + editor.execCommand('source'); + var end = (ua.browser.ie==9||ua.browser.ie==10) ?'':'
    '; + br =(ua.browser.ie==9||ua.browser.ie==10) ?'\n':'
    '; + var Bbr =( ua.browser.ie&&ua.browser.ie<9)?'\n':''; + ua.checkSameHtml(editor.body.firstChild.innerHTML, '<body>'+Bbr+br+'</body>'+end, '切回源码无影响'); +// setTimeout(function() {//TODO bug修复后去掉注释 +// editor.execCommand('source'); +// setTimeout(function() { +// editor.execCommand('source'); +// ua.checkSameHtml(editor.body.firstChild.innerHTML,'<body>
    </body>
    ','切回源码无影响'); +// setTimeout(function () { +// UE.delEditor('ue'); +// document.getElementById('ue')&&te.dom.push(document.getElementById('ue')); + start(); + }, 20); + }, 20); + + stop(); +}); + +test('trace 3407:表格中插入代码', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent(''); + editor.execCommand('inserttable'); + stop(); + setTimeout(function () { + var tds = editor.body.getElementsByTagName('td'); + tds[1].innerHTML = 'asd'; + range.setStart(tds[1], 0).setEnd(tds[1], 1).select(); + editor.execCommand('insertcode', 'Javascript'); + var br = ua.browser.ie ? ' ' : '
    '; + ua.checkSameHtml(tds[1].innerHTML, '
    asd
    ', '检查插入了html'); +// stop(); +// setTimeout(function() {//TODO bug +// editor.execCommand('source'); +// setTimeout(function() { +// editor.execCommand('source'); +// ua.checkSameHtml(tds[1].innerHTML,'
    asd

    ','切回源码无影响'); +// start(); +// },20); +// },20); + start(); + }, 50); +}); + + +test('test-beforeInsertHTML', function(){ + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + //闭合 + range.setStart(editor.body.firstChild,0).collapse(true).select(); + var insert = 'text'; + editor.execCommand('inserthtml', insert); + if(ua.browser.ie==9||ua.browser.ie==10) + ua.checkSameHtml(editor.body.innerHTML, '
    '+insert+'
    ', '插入IE'); + else + ua.checkSameHtml(editor.body.innerHTML, '
    '+insert+'
    ', '插入chrome/ff/ie11+'); + ua.manualDeleteFillData(editor.body); + + //插入非br element + range.setStart(editor.body.firstChild.firstChild,0).collapse(true).select(); + insert='

    I

    '; + editor.execCommand('inserthtml', insert); + if(ua.browser.ie==9||ua.browser.ie==10) + ua.checkSameHtml(editor.body.innerHTML, '
    Itext
    ', '插入IE'); + else + ua.checkSameHtml(editor.body.innerHTML, '
    Itext
    ', '插入chrome/ff/ie11+'); + ua.manualDeleteFillData(editor.body); + + //插入br element + range.setStart(editor.body.firstChild.firstChild,1).collapse(true).select(); + insert='
    br'; + editor.execCommand('inserthtml', insert); + if(ua.browser.ie==9||ua.browser.ie==10){ + ua.checkSameHtml(editor.body.innerHTML, '
    \nbrItext
    ', '插入IE'); + + } + else if(ua.browser.ie>10){ + ua.checkSameHtml(editor.body.innerHTML, '
    I\nbrtext
    ', '插入IE11+'); + } + else{ + ua.checkSameHtml(editor.body.innerHTML, '
    I​
    brtext
    ', '插入chrome/ff');} + ua.manualDeleteFillData(editor.body); + + //混合标签 + range.setStart(editor.body.firstChild,0).collapse(true).select(); + insert='

    PPP

    222

    SSS
    BBB

    '; + editor.execCommand('inserthtml', insert); + if(ua.browser.ie==9||ua.browser.ie==10){ +// if(ua.browser.ie<11){ + ua.checkSameHtml(editor.body.innerHTML, '
    PPP222SSS\nBBB\nbrItext
    ', '插入IE'); +// }else{ +// ua.checkSameHtml(editor.body.innerHTML, '
    PPP222SSS\nBBBI\nbrtext
    ', '插入IE'); +// } + } + else if(ua.browser.ie>10){ + ua.checkSameHtml(editor.body.innerHTML, '
    PPP222SSS\nBBBI\nbrtext
    ', '插入IE11+'); + } + else{ + ua.checkSameHtml(editor.body.innerHTML, '
    PPP222SSS
    BBBI
    brtext
    ', '插入chrome/ff/ie11+'); + } + ua.manualDeleteFillData(editor.body); + + //非闭合 + //插入非element + range.setStart(editor.body.firstChild, 0).setEnd(editor.body.firstChild, 4).select(); + insert = 'replace'; + editor.execCommand('inserthtml', insert); + if(ua.browser.ie==9||ua.browser.ie==10) + ua.checkSameHtml(editor.body.innerHTML, '
    replace
    ', '插入IE'); + else if(ua.browser.ie>10){ + ua.checkSameHtml(editor.body.innerHTML, '
    replace
    ', '插入IE11+'); + + } + else + ua.checkSameHtml(editor.body.innerHTML, '
    replaceBBBI
    brtext
    ', '插入chrome/ff/ie11+'); + ua.manualDeleteFillData(editor.body); + //插入element + range.setStart(editor.body.firstChild, 0).setEnd(editor.body.firstChild, 0).select(); + insert = '

    PPP

    '; + editor.execCommand('inserthtml', insert); + if(ua.browser.ie==9||ua.browser.ie==10) + ua.checkSameHtml(editor.body.innerHTML, '
    PPPreplace
    ', '插入IE'); + else if(ua.browser.ie>10){ + ua.checkSameHtml(editor.body.innerHTML, '
    PPPreplace
    ', '插入IE11+'); + + } + else + ua.checkSameHtml(editor.body.innerHTML, '
    PPPreplaceBBBI
    brtext
    ', '插入chrome/ff/ie11+'); + ua.manualDeleteFillData(editor.body); + +}); + +test('关于pre中的tabKey',function(){ + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('
    function a(){var a = true;}
    '); + var text = editor.body.firstChild.firstChild; + range.setStart(text,13).setEnd(text,16).select(); + ua.keydown(editor.body,{'shiftKey':false,'keyCode':9}); + ua.keyup(editor.body,{'shiftKey':false,'keyCode':9}); + if(ua.browser.ie==8||ua.browser.ie==9){ + equal(editor.getContent(),'
        function a(){var a = true;}
    '); + }else if(ua.browser.ie>9){ + equal(editor.getContent(),'
        function a(){var a = true;}
    ','验证pre下tabKey1'); + }else{ + equal(editor.getContent(),'
        function a(){var a = true;}
    ','验证pre下tabKey1'); + } + editor.setContent('

    function a(){var a = true;}
    '); + var text = editor.body.firstChild.firstChild; + range.setStart(text,13).setEnd(text,16).select(); + ua.keydown(editor.body,{'shiftKey':false,'keyCode':9}); + ua.keyup(editor.body,{'shiftKey':false,'keyCode':9}); + if(ua.browser.ie==8||ua.browser.ie==9){ + var x = '\n'; + if(ua.browser.ie==9){ + x = ''; + } + equal(editor.getContent(),'
        '+x+'function a(){var a = true;}
    ','验证pre下tabKey2'); + }else if(ua.browser.ie>9){ + var x2 = ''; + var x3 = '    '; + if(ua.browser.ie==11){ + x2 = '    '; + x3='\n'; + } + equal(editor.getContent(),'
    '+x3+'function a(){var a = true;}
    '+x2,'验证pre下tabKey2'); + }else{ + equal(editor.getContent(),'
    \n        function a(){var a = true;}
    ','验证pre下tabKey2'); + } + editor.setContent('
    function a(){
    var a = true;}
    '); + var text = editor.body.firstChild.firstChild; + range.setStart(text,13).setEnd(text,16).select(); + ua.keydown(editor.body,{'shiftKey':false,'keyCode':9}); + ua.keyup(editor.body,{'shiftKey':false,'keyCode':9}); + if(ua.browser.ie==8){ + equal(editor.getContent(),'
    function a(){    \nvar a = true;}
    ','验证pre下tabKey3'); + }else if(ua.browser.ie>8){ + var xx = '    '; + var xx2 = ''; + if(ua.browser.ie==11){ + xx = ''; + xx2 = '    '; + } + equal(editor.getContent(),'
    '+xx+'function a(){'+xx2+'\nvar a = true;}
    ','验证pre下tabKey3'); + }else{ + equal(editor.getContent(),'
    function a(){    \nvar a = true;}
    ','验证pre下tabKey3'); + } +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/inserthtml.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/inserthtml.js new file mode 100644 index 000000000..f0001799f --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/inserthtml.js @@ -0,0 +1,179 @@ +module( "plugins.inserthtml" ); +test( '向span里面插入p', function() { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('
    hello1
    '); + range.setStart(editor.body.firstChild.firstChild, 0 ).collapse(true).select(); + editor.execCommand( 'inserthtml','

    hello3

    ' ); + stop(); + setTimeout(function(){ +// equal(editor.body.innerHTML.toLowerCase(),'

    hello3

    hello1
    ','向span里面插入p'); + ua.checkSameHtml(editor.body.getElementsByTagName('address')[0].innerHTML.toLowerCase(),'

    hello3

    hello1','向span里面插入p'); + start(); + },50); +}); +//列表中插入列表 TODO 1.2.6 trace 3413 +//test( '列表中插入列表 trace 3413', function() { +// var editor = te.obj[0]; +// var range = te.obj[1]; +// editor.setContent('
    1. hello1

    2. hello2

    '); +// var lis = editor.body.getElementsByTagName('li'); +// range.setStart( lis[1], 0 ).collapse(true).select(); +// editor.execCommand( 'inserthtml','
    • hello3

    ' ); +// stop(); +// setTimeout(function(){ +// lis = editor.body.getElementsByTagName('li'); +// equal(lis.length,3,'列表长度'); +// equal(lis[1].innerHTML.toLowerCase(),'

    hello3

    ','列表中插入列表'); +// start(); +// },50); +// +//}); + +test( 'trace 3301:闭合方式插入文本', function() { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent( '


    ' ); + range.setStart( body.firstChild, 0 ).collapse( 1 ).select(); + editor.execCommand( 'inserthtml', 'hello2' ); + equal( ua.getChildHTML( body ), '

    hello2

    ', '插入文本节点' ); +} ); + +test( '选中多个单元格插入列表', function() { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent( '
    ' ); + setTimeout(function(){ + + var trs = editor.body.firstChild.getElementsByTagName( 'tr' ); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[0].cells[0],trs[0].cells[1]); + ut.setSelected(cellsRange); + if(ua.browser.ie) + range.setStart( trs[0].cells[0], 0 ).collapse( true ).select(); + var tds = body.firstChild.getElementsByTagName( 'td' ); + editor.execCommand( 'inserthtml', '
    1. hello
    ' ); + equal( tds[0].firstChild.tagName.toLowerCase(), 'ol', '插入列表' ); + equal( ua.getChildHTML( tds[0].firstChild ), '
  • hello

  • ', '查询列表内容' ); + //空的td有br + var br = ua.browser.ie?'':'
    '; + ua.manualDeleteFillData(tds[1]); + equal( tds[1].innerHTML, br, '第二个单元格没有插入任何东西' ); + start(); + },50); + stop(); +} ); + +test( '表格中插入图片', function() { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent( '
    ' ); + setTimeout(function(){ + var trs = editor.body.firstChild.getElementsByTagName( 'tr' ); + + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[0].cells[0], trs[0].cells[1]); + ut.setSelected(cellsRange); + if (ua.browser.ie) + range.setStart( trs[0].cells[0], 0 ).collapse( true ).select(); + var tds = body.firstChild.getElementsByTagName( 'td' ); + editor.execCommand( 'inserthtml', '' ); + equal( tds[0].firstChild.tagName.toLowerCase(), 'img', '插入图片' ); + equal( tds[0].firstChild.style['styleFloat']||tds[0].firstChild.style['cssFloat'], 'left', '查询图片浮动方式' ); + var br = ua.browser.ie?'':'
    '; + ua.manualDeleteFillData(tds[1]); + equal( tds[1].innerHTML, br, '第二个单元格没有插入任何东西' ); + start(); + },50); + stop(); +} ); +//test('',function(){stop()}); +test( '选中多个单元格插入超链接', function() { + if(ua.browser.ie>8)return ;//TODO 1.2.6 + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent( '
    ' ); + setTimeout(function(){ + var trs = editor.body.firstChild.getElementsByTagName( 'tr' ); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[0].cells[0],trs[0].cells[1]); + ut.setSelected(cellsRange); + if(ua.browser.ie&&ua.browser.ie<9) + range.setStart( trs[0].cells[0], 0 ).collapse( true ).select(); + editor.execCommand( 'link', {href:'http://www.baidu.com/'} ); + var tds = body.firstChild.getElementsByTagName( 'td' ); + equal( tds[0].firstChild.tagName.toLowerCase(), 'a', '插入超链接' ); + var br = ua.browser.ie?'':'
    '; + equal( ua.getChildHTML(tds[0]), 'http://www.baidu.com/'+(ua.browser.ie>8?' ':br), '查询第一个表格插入的超链接' ); + + equal( ua.getChildHTML(tds[1]), br, '第二个单元格也插入超链接' ); + start(); + },50); + stop(); +} ); + +test( 'trace 3297:notSerialize', function() { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent( '


    ' ); + setTimeout(function(){ + range.setStart( body.firstChild, 0 ).collapse( 1 ).select(); + editor.execCommand( 'inserthtml', '

    b

    _ueditor_page_break_tag_' ,false); + equal( editor.body.childNodes.length, 3, 'notSerialize=false 插入分页符' ); + equal( editor.body.childNodes[1].tagName.toLowerCase(), 'hr', '插入分页符 hr class=\"pagebreak\" ' ); + equal( editor.body.childNodes[1].className.toLowerCase(), "pagebreak", '插入分页符 hr class=\"pagebreak\" ' ); + editor.setContent( '


    ' ); + setTimeout(function(){ + range.setStart( body.firstChild, 0 ).collapse( 1 ).select(); + editor.execCommand( 'inserthtml', '

    b

    _ueditor_page_break_tag_' ,true); + equal( editor.body.childNodes.length, 3, 'notSerialize=true 插入分页符' ); + equal( editor.body.childNodes[1].innerHTML , '_ueditor_page_break_tag_', '插入分页符'); + start(); + },50); + },50); + stop(); +} ); + +//列表中插入表格 +test( '列表中插入表格', function() { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('
    '); + var lis = editor.body.getElementsByTagName('li'); + range.setStart( lis[0], 0 ).collapse(true).select(); + editor.execCommand( 'inserttable', {numCols:2, numRows:2}); + stop(); + setTimeout(function(){ + equal(lis.length,1,'列表长度没有变化'); + equal(lis[0].firstChild.tagName.toLowerCase(),'table','列表中插入表格'); + start(); + },50); +}); +//刘表中插入img +test( '列表中插入img', function() { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('
    '); + var lis = editor.body.getElementsByTagName('li'); + range.setStart( lis[0], 0 ).collapse(true).select(); + editor.execCommand( 'insertimage', {src:'http://img.baidu.com/hi/jx2/j_0001.gif', width:50, height:51} ); + stop(); + setTimeout(function(){ + equal(lis.length,1,'列表长度没有变化'); + ua.manualDeleteFillData(lis[0]); + if(ua.browser.ie){ + equal(lis[0].firstChild.firstChild.tagName.toLowerCase(),'img','列表中插入img'); + equal(lis[0].firstChild.firstChild.attributes['src'].nodeValue,'http://img.baidu.com/hi/jx2/j_0001.gif','列表中插入img'); + } + else{ + equal(lis[0].firstChild.tagName.toLowerCase(),'img','列表中插入img'); + equal(lis[0].firstChild.attributes['src'].nodeValue,'http://img.baidu.com/hi/jx2/j_0001.gif','列表中插入img'); + } + start(); + },50); +}); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/insertparagraph.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/insertparagraph.js new file mode 100644 index 000000000..815c357e8 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/insertparagraph.js @@ -0,0 +1,15 @@ +module( 'plugins.insertparagraph' ); + +test( '插入空行', function() { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent( 'hello' ); + range.setStart( body.firstChild, 0 ).collapse( 1 ).select(); + editor.execCommand( 'insertparagraph', true ); + var br = ua.browser.ie?'':'
    ' + equal( ua.getChildHTML( body ), '

    '+br+'

    hello

    ', '插入空行' ); + range.setStart( body.firstChild.nextSibling, 0 ).collapse( 1 ).select(); + editor.execCommand( 'insertparagraph', false ); + equal( ua.getChildHTML( body ), '

    '+br+'

    hello

    '+br+'

    ', '' ); +} ); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/justify.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/justify.js new file mode 100644 index 000000000..235a54167 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/justify.js @@ -0,0 +1,88 @@ +module( "plugins.justify" ); + +test( '闭合在段落中设置对齐方式', function() { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent( '

    hello1

    ' ); + setTimeout(function(){ + range.setStart( body.firstChild.firstChild.firstChild, 3 ).collapse( true ).select(); + editor.execCommand( 'justify', 'center' ); + equal( body.firstChild.style['textAlign'], 'center', 'p对齐方式为居中对齐' ); + start(); + },50); + stop(); +} ); + +test( '不闭合在段落中设置对齐方式', function() { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent( '

    hello1

    hello2hello3

    ' ); + setTimeout(function(){ + range.selectNode( body.firstChild.firstChild.firstChild ).select(); + editor.execCommand( 'justify', 'center' ); + equal( body.firstChild.style['textAlign'], 'center', 'p对齐方式为居中对齐' ); + + range.setStart( body.firstChild, 0 ).setEnd( body.lastChild, 1 ).select(); + editor.execCommand( 'justify', 'right' ); + equal( body.firstChild.style['textAlign'], 'right', 'p对齐方式为居中对齐' ); + equal( body.lastChild.style['textAlign'], 'right', 'p对齐方式为居中对齐' ); + + range.setStart( body.firstChild.firstChild.firstChild, 3 ).collapse( true ).select(); + editor.execCommand( 'justify', 'center' ); + equal( body.firstChild.style['textAlign'], 'center', 'p对齐方式为居中对齐' ); + start(); + },50); + stop(); +} ); + +//test( '对齐方式-参数为json', function() { +// var editor = te.obj[0]; +// var range = te.obj[1]; +// editor.setContent( '

    hello

    ' ); +// setTimeout(function(){ +// var tds = editor.body.getElementsByTagName( 'td' ); +// range.setStart( tds[1].firstChild, 0 ).collapse( true ).select(); +// editor.execCommand( 'justify', 'right' ); +// equal( tds[1].firstChild.style['textAlign'], 'right', 'p对齐方式为右对齐' ); +// equal( editor.queryCommandValue( 'justify' ), 'right', 'querycommand value' ); +// start(); +// },50); +// stop(); +//} ); + +test( 'startContainer是body', function() { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '

    tell

    ' ); + setTimeout(function(){ + range.setStart( editor.body, 0 ).collapse( true ).select(); + editor.execCommand( 'justify', 'right' ); + + equal( editor.queryCommandValue( 'justify' ), 'right', 'startContainer 是body' ); + equal( editor.queryCommandValue( 'justify' ), 'right', 'querycommand value' ); + /*json格式的参数*/ + range.setStart( editor.body, 0 ).collapse( true ).select(); + editor.execCommand( 'justify', {'text-align':'left'} ); + equal( editor.queryCommandValue( 'justify' ), 'left', 'startContainer 是body--json格式的参数' ); + start(); + },50); + stop(); +} ); + +test( '连续2次设置对齐方式', function() { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '

    tell

    ' ); + setTimeout(function(){ + range.setStart( editor.body.firstChild.firstChild, 0 ).collapse( 1 ).select(); + editor.execCommand( 'justify', 'right' ); + equal( editor.queryCommandValue( 'justify' ), 'right', 'querycommand value' ); + range.setStart( editor.body.firstChild.firstChild, 0 ).collapse( 1 ).select(); + editor.execCommand( 'justify', 'center' ); + equal( editor.queryCommandValue( 'justify' ), 'center', 'querycommand value' ); + start(); + },50); + stop(); +} ); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/keystrokes.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/keystrokes.js new file mode 100644 index 000000000..fbd747902 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/keystrokes.js @@ -0,0 +1,277 @@ +/** + * Created by JetBrains PhpStorm. + * User: dongyancen + * Date: 12-10-9 + * Time: 下午6:52 + * To change this template use File | Settings | File Templates. + */ +module( "plugins.keystrokes" ); + +test('trace 3714跨节点输入tab键',function(){ + var editor = te.obj[0]; + editor.setContent( '

    hello

    heoll

    ' ); + var range = te.obj[1]; + setTimeout(function(){ + range.setStart( editor.body.lastChild.firstChild,0 ).setEnd(editor.body.lastChild.firstChild.nextSibling,1).select(); + ua.keydown(editor.body,{'keyCode':9}); + ua.keyup(editor.body,{'keyCode':9}); + setTimeout(function(){ + equal(te.obj[0].undoManger.list.length,1,''); + var html = '

    hello

        oll

    '; + equal(ua.getChildHTML(te.obj[0].body),html,'跨节点输入tab键'); + start(); + },20); + },20); + stop(); +}); + +test('删除块元素,块元素在后',function(){ + var editor = te.obj[0]; + editor.setContent( '

    hello

    ' ); + var range = te.obj[1]; + setTimeout(function(){ + range.setStart( editor.body.lastChild.lastChild,0 ).setEnd(editor.body.lastChild.lastChild,1).select(); + ua.keydown(editor.body,{'keyCode':8}); + ua.keyup(editor.body,{'keyCode':8}); + setTimeout(function(){ + equal(te.obj[0].undoManger.index,1,''); + var html = '

    hello

    '; + if(!ua.browser.opera) + equal(ua.getChildHTML(te.obj[0].body),html,'删除块元素'); + start(); + },20); + },20); + stop(); +}); + +test('删除块元素,块元素在前',function(){ + var editor = te.obj[0]; + editor.setContent( '

    hello

    ' ); + var range = te.obj[1]; + setTimeout(function(){ + range.setStart( editor.body.firstChild,0 ).setEnd(editor.body.firstChild,1).select(); + ua.keydown(editor.body,{'keyCode':8}); + ua.keyup(editor.body,{'keyCode':8}); + setTimeout(function(){ + equal(te.obj[0].undoManger.index,1,''); + var html = '

    hello

    '; + equal(ua.getChildHTML(te.obj[0].body),html,'删除块元素'); + start(); + },20); + },20); + stop(); +}); + +test('trace 2747 普通情况,选中一个节点,输入tab键',function(){ + var editor = te.obj[0]; + editor.setContent( '

    hello

    heoll

    ' ); + var range = te.obj[1]; + setTimeout(function(){ + range.setStart( editor.body.lastChild,1 ).setEnd(editor.body.lastChild,2).select(); + ua.keydown(editor.body,{'keyCode':9}); + ua.keyup(editor.body,{'keyCode':9}); + setTimeout(function(){ + equal(te.obj[0].undoManger.list.length,1,''); + var html = '

    hello

    he    oll

    '; + equal(ua.getChildHTML(te.obj[0].body),html,'普通情况,选中一个节点,输入tab键'); + start(); + },20); + },20); + stop(); +}); + +test('trace 2746 删除自闭合标签',function(){ + var editor = te.obj[0]; + editor.setContent( '

    hello

    heoll

    ' ); + var range = te.obj[1]; + setTimeout(function(){ + range.setStart( editor.body.lastChild,1 ).setEnd(editor.body.lastChild,2).select(); + ua.keydown(editor.body,{'keyCode':8}); + ua.keyup(editor.body,{'keyCode':8}); + setTimeout(function(){ + equal(te.obj[0].undoManger.index,1,''); + var html = '

    hello

    heoll

    '; + equal(ua.getChildHTML(te.obj[0].body),html,'删除自闭合标签'); + start(); + },20); + },20); + stop(); +}); + +test('全选后,退格,剩下空p',function(){ + var editor = te.obj[0]; + editor.setContent( 'hello' ); + var range = te.obj[1]; + range.selectNode( editor.body.firstChild ).select(); + editor.execCommand( 'bold' ); + editor.execCommand('selectall'); + ua.keydown(editor.body,{'keyCode':8}); + ua.keyup(editor.body,{'keyCode':8}); + stop(); + setTimeout(function(){ + var br = ua.browser.ie?'':'
    '; + equal(ua.getChildHTML(te.obj[0].body),'

    '+br+'

    ','全选后,退格,剩下空p'); + start(); + },20); +}); +//TODO 1.2.6 +//test('针对ff下在列表首行退格,不能删除空格行的问题 ',function(){ +// if(ua.browser.gecko){ +// var editor = te.obj[0]; +// editor.body.innerHTML = '

    欢迎使用ueditor!


    '; +// var range = te.obj[1]; +// setTimeout(function(){ +// range.setStartAtFirst(editor.body.firstChild).collapse(true); +// ua.keyup(te.obj[0].body,{'keyCode':8}); +// setTimeout(function(){ +// equal(ua.getChildHTML(editor.body),'

    欢迎使用ueditor!

    ','删除空行 '); +// start(); +// },20); +// },20); +// stop(); +// } +//}); + +test('在列表中,跨行选中第2,3行,输入tab键',function(){ + var editor = te.obj[0]; + editor.setContent( '
    1. 欢迎使用

    2. ueditor

    3. ueditor

    ' ); + var range = te.obj[1]; + setTimeout(function(){ + range.setStart( editor.body.childNodes[0].childNodes[1].firstChild.firstChild,1 ).setEnd(editor.body.childNodes[0].childNodes[2].firstChild.firstChild,1 ).select(); + ua.keydown(editor.body,{'keyCode':9}); + ua.keyup(editor.body,{'keyCode':9}); + setTimeout(function(){ + ua.manualDeleteFillData(te.obj[0].body); + equal(te.obj[0].body.firstChild.tagName.toLowerCase(),'ol','原列表'); + equal($(te.obj[0].body.firstChild).css('list-style-type'),'decimal','原列表类型'); + equal(ua.getChildHTML(te.obj[0].body.firstChild.firstChild),'

    欢迎使用

    ','第一行保持原来的列表样式'); + equal(te.obj[0].body.firstChild.lastChild.tagName.toLowerCase(),'ol','后两行变成第二层列表'); + equal($(te.obj[0].body.firstChild.lastChild).css('list-style-type'),'lower-alpha','第二层列表类型'); + equal(ua.getChildHTML(te.obj[0].body.firstChild.lastChild),'
  • ueditor

  • ueditor

  • ','检查内容'); + start(); + },20); + },50); + stop(); +}); + +//todo 这个检查存在问题,如何检查 evt.preventDefault();? +test('在h1内输入del',function(){ + var editor = te.obj[0]; + editor.setContent( '


    hello

    ' ); + var range = te.obj[1]; + setTimeout(function(){ + range.setStart(editor.body.childNodes[0],0).collapse(true).select(true); + ua.keydown(te.obj[0].body,{'keyCode':46}); + ua.keyup(te.obj[0].body,{'keyCode':46}); + setTimeout(function(){ + equal(ua.getChildHTML(te.obj[0].body),'


    hello

    ','在h1内输入del'); + start(); + },20); + },20); + stop(); +}); + +test('在列表中,跨行选中,输入tab键',function(){ + var editor = te.obj[0]; + editor.setContent( '
    1. 欢迎使用

    2. ueditor

    3. ueditor

    ' ); + var range = te.obj[1]; + setTimeout(function(){ + range.setStart( editor.body.firstChild.firstChild.firstChild.firstChild,1 ).setEnd(editor.body.firstChild.childNodes[1].firstChild.firstChild,1 ).select(); + ua.keydown(editor.body,{'keyCode':9}); + ua.keyup(editor.body,{'keyCode':9}); + setTimeout(function(){ + equal(te.obj[0].undoManger.index,1,'undoManger.index'); + ua.manualDeleteFillData(te.obj[0].body); + equal(te.obj[0].body.firstChild.tagName.toLowerCase(),'ol','外面套了一层ol'); + equal(te.obj[0].body.firstChild.childNodes.length,2,''); + equal(te.obj[0].body.firstChild.firstChild.tagName.toLowerCase(),'ol','原列表'); + equal($(te.obj[0].body.firstChild).css('list-style-type'),'decimal','原列表类型'); + equal(ua.getChildHTML(te.obj[0].body.firstChild.firstChild),'
  • 欢迎使用

  • ueditor

  • ','检查内容'); + start(); + },20); + },50); + stop(); +}); + +test(' 光标定位到列表前,输入tab键',function(){ + var editor = te.obj[0]; + editor.setContent( '
    1. 欢迎使用

    2. ueditor

    ' ); + var range = te.obj[1]; + setTimeout(function(){ + range.setStart( editor.body.firstChild.firstChild.firstChild,0 ).collapse(true).select(); + ua.keydown(editor.body,{'keyCode':9}); + ua.keyup(editor.body,{'keyCode':9}); + setTimeout(function(){ + equal(te.obj[0].undoManger.list.length,1,'undoManger.index'); + ua.manualDeleteFillData(te.obj[0].body); + equal($(te.obj[0].body.firstChild).css('list-style-type'),'decimal','原列表类型'); + equal(te.obj[0].body.firstChild.childNodes.length,2,'列表有两个子节点'); + equal($(te.obj[0].body.firstChild.firstChild).css('list-style-type'),'lower-alpha','第一个节点是另一类型的列表'); + equal(ua.getChildHTML(te.obj[0].body.firstChild.firstChild),'
  • 欢迎使用

  • ','检查内容'); + equal(te.obj[0].body.firstChild.lastChild.tagName.toLowerCase(),'li','第一个节点是原列表的li'); + equal(ua.getChildHTML(te.obj[0].body.firstChild.lastChild),'

    ueditor

    ','检查内容'); + start(); + },20); + },50); + stop(); +}); + +test( '删除inline的标签', function() { + var editor = te.obj[0]; + editor.setContent( '

    hello worldwasai

    ' ); + var range = te.obj[1]; + setTimeout(function(){ + var strong = editor.body.firstChild.firstChild; + range.selectNode( strong ).select(); + ua.keydown(editor.body,{'keyCode':8}); + ua.keyup(editor.body,{'keyCode':8}); + setTimeout(function(){ + ua.manualDeleteFillData( editor.body ); + equal( editor.body.firstChild.tagName.toLowerCase(), 'p', 'strong 以及子inline节点都被删除' ); + if ( !baidu.editor.browser.ie ) + equal( editor.body.lastChild.innerHTML, '
    ', '内容被删除了' ); + else + equal( editor.body.lastChild.innerHTML, '', '内容被删除了' ); + start(); + },20); + },20); + stop(); +} ); + +/*trace 1089*/ +test( '跨行选择2个块元素', function() { + var editor = te.obj[0]; + editor.setContent( '

    hello worldwasai

    hello 2
    ' ); + var range = te.obj[1]; + setTimeout(function(){ + var body = editor.body; + range.setStart( body.firstChild, 0 ).setEnd( body.lastChild,1 ).select(); + ua.keydown(editor.body,{'keyCode':8}); + ua.keyup(editor.body,{'keyCode':8}); + setTimeout(function(){ + ua.manualDeleteFillData( editor.body ); + range = editor.selection.getRange(); + equal( body.childNodes.length, 1, 'div被删除,保留p' ); + var br = baidu.editor.browser.ie?"":"
    "; + equal( ua.getChildHTML( body ), '

    '+br+'

    ' ); + start(); + },20); + },20); + stop(); +} ); + +//test('删除空节点 ',function(){ +// var editor = te.obj[0]; +// editor.setContent('


    ') ; +// var range = te.obj[1]; +// setTimeout(function(){ +// range.setStartAtFirst(editor.body.getElementsByTagName('span')[0]).collapse(true).select(true); +// ua.keyup(te.obj[0].body,{'keyCode':8}); +// setTimeout(function(){ +// var br = ua.browser.ie?'':'
    '; +// equal(ua.getChildHTML(editor.body),'

    '+br+'

    ','删除空节点'); +// start(); +// },20); +// },20); +// stop(); +//}); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/lineheight.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/lineheight.js new file mode 100644 index 000000000..520dcb71b --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/lineheight.js @@ -0,0 +1,164 @@ +module( 'plugins.lineheight' ); +//test( '', function() { +// equal('','',''); +//} ); +/* + * + *利用pict工具生成的用例设计结果,有微调。3to1表示先设置行距为3再设置为1,选区“singlePara”表示选中一个段落, + * “multiPara”表示选中多个段落,“字号统一”表示所有的字号都是一样大,“16to36To16”表示先设置大小为16px,再设置为36,再设置为16 + 设置行距顺序 选区 选区内字号顺序 +
  • 3to1 collapse 字号统一
  • +
  • 1 multiPara 36To16To36
  • +
  • 1to3to1 singlePara 字号统一
  • +
  • 1 collapse 16to36To16
  • +
  • 1to3to1 multiPara 16to36To16
  • +
  • 3to1 singlePara 36To16To16
  • +
  • 3 multiPara 字号统一
  • +
  • 1to3to1 collapse 36To16To16
  • +
  • 3to1 multiPara 16to36To16
  • +
  • 3 singlePara 16to36To16
  • + * */ +// +//var compareLineHeight = function ( node, value,fontSize, descript ) { +// var currLineHeight = $(node).css('lineHeight').replace(/px/,''); +// var spans = node.getElementsByTagName('') +// value = value.replace( /px/, '' ); +// var baseLineHeight = (ua.browser.ie ? domUtils.getComputedStyle( node, 'font-size' ).replace( /px/, '' ) : node.offsetHeight); +// var fontSize = $( node ).css( 'font-size' ).replace( /px/, '' ); +// if ( value >= fontSize && value >= baseLineHeight ) { +// ok( true, descript ); +// } else { +// ok( false, descript + '--- "lineHeight应取fontSize和baseLineHeight*倍数的最大值":lineHeight=' + value + ' ;font-sze=' + fontSize + ';baseLineHeight=' + baseLineHeight ); +// } +// +//} +// +///*
  • 3to1 collapse 字号统一
  • */ +test( '闭合情况,字号统一', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent( '

    hello

    ' ); + range.setStart(body.firstChild, 1).collapse(1).select(); + editor.execCommand('lineheight', 3); + setTimeout( function () { + var p = body.firstChild; + equal( editor.queryCommandValue('lineheight'), "3", '行间距为3'); + editor.execCommand('lineheight', 1); + p = body.firstChild; + equal( editor.queryCommandValue('lineheight'), "1", '行间距为1'); + equal( p.style['lineHeight'], 'normal', '检查行高' ); + equal( $( p ).css('font-size'), '36px', '检查字体'); + start(); + }, 20 ); + stop(); +} ); + +/*
  • 1 multiPara 36To16To36
  • */ +//test( '多个段落设置多倍行距,段落中字体大小各不相同', function () { +// var editor = te.obj[0]; +// var range = te.obj[1]; +// var body = editor.body; +// editor.setContent( '

    hello

    hello

    hello

    ' ); +// range.setStart( body.firstChild, 0 ).setEnd( body.lastChild, 1 ).select(); +// editor.execCommand( 'lineheight', 1 ); +// setTimeout( function () { +// var ps = body.childNodes; +// equal( $( ps[0] ).css( 'line-height' ), '36px', '第1个p行高为36px' ); +// equal( $( ps[1] ).css( 'line-height' ), '16px', '第2个p行高为36px' ); +// equal( $( ps[2] ).css( 'line-height' ), '36px', '第3个p行高为36px' ); +// range.selectNode( ps[0] ).select(); +// equal( editor.queryCommandValue( 'lineheight' ), "1", '第1个p行间距为1' ); +// range.selectNode( ps[0] ).select(); +// equal( editor.queryCommandValue( 'lineheight' ), "1", '第2个p行间距为1' ); +// range.selectNode( ps[0] ).select(); +// equal( editor.queryCommandValue( 'lineheight' ), "1", '第3个p行间距为1' ); +// start(); +// }, 20 ); +// stop(); +//} ); +// +///*
  • 1 collapse 16to36To16
  • */ +//test( '多个段落设置多倍行距,段落中字体大小各不相同', function () { +// var editor = te.obj[0]; +// var range = te.obj[1]; +// var body = editor.body; +// editor.setContent( '

    hello

    hello

    hello

    ' ); +// range.setStart( body.firstChild, 0 ).setEnd( body.lastChild, 1 ).select(); +// editor.execCommand( 'lineheight', 1 ); +// setTimeout( function () { +// var ps = body.childNodes; +// compareLineHeight( ps[0], $( ps[0] ).css( 'line-height' ), '行距为1,第1个p行高' ); +// compareLineHeight( ps[1], $( ps[1] ).css( 'line-height' ), '行距为1,第2个p行高' ); +// compareLineHeight( ps[2], $( ps[2] ).css( 'line-height' ), '行距为1,第3个p行高' ); +// range.selectNode( ps[0] ).select(); +// equal( editor.queryCommandValue( 'lineheight' ), "1", '第1个p行间距为1' ); +// range.selectNode( ps[0] ).select(); +// equal( editor.queryCommandValue( 'lineheight' ), "1", '第2个p行间距为1' ); +// range.selectNode( ps[0] ).select(); +// equal( editor.queryCommandValue( 'lineheight' ), "1", '第3个p行间距为1' ); +// start(); +// }, 20 ); +// stop(); +//} ); +// +///*
  • 1to3to1 singlePara 字号统一
  • */ +//test( '1个段落设置多倍行距,字号相同', function () { +// var editor = te.obj[0]; +// var range = te.obj[1]; +// var body = editor.body; +// editor.setContent( '

    hello

    ' ); +// range.selectNode( body.firstChild ).select(); +// editor.execCommand( 'lineheight', 1 ); +// setTimeout( function () { +// var p = body.firstChild; +// equal( $( p ).css( 'line-height' ), '36px', '第1个p行高为36px' ); +// editor.execCommand( 'lineheight', 3 ); +// p = body.firstChild; +// compareLineHeight( p, $( p ).css( 'line-height' ), '行距为1,第1个p行高' ); +// editor.execCommand( 'lineheight', 1 ); +// var p = body.firstChild; +// equal( $( p ).css( 'line-height' ), '36px', '第1个p行高为36px' ); +// start(); +// }, 20 ); +// stop(); +//} ); +// +///*
  • 1to3to1 multiPara 16to36To16
  • */ +//test( '多个段落设置多倍行距,字号不同', function () { +// var editor = te.obj[0]; +// var range = te.obj[1]; +// var body = editor.body; +// editor.setContent( '

    hello

    hello

    hello

    ' ); +// range.setStart( body.firstChild.firstChild, 1 ).setEnd( body.lastChild.firstChild, 2 ).select(); +// editor.execCommand( 'lineheight', 1 ); +// setTimeout( function () { +// var ps = body.childNodes; +// compareLineHeight( ps[0], $( ps[0] ).css( 'line-height' ), '行距为1,第1个p行高' ); +// compareLineHeight( ps[1], $( ps[1] ).css( 'line-height' ), '行距为1,第2个p行高' ); +// compareLineHeight( ps[2], $( ps[2] ).css( 'line-height' ), '行距为1,第3个p行高' ); +// range.selectNode( ps[0] ).select(); +// equal( editor.queryCommandValue( 'lineheight' ), "1", '第3个p行间距为1' ); +// +// range.setStart( body.firstChild.firstChild, 1 ).setEnd( body.lastChild.firstChild, 2 ).select(); +// editor.execCommand( 'lineheight', 3 ); +// ps = body.childNodes; +// compareLineHeight( ps[0], $( ps[0] ).css( 'line-height' ), '行距为3,第1个p行高' ); +// compareLineHeight( ps[1], $( ps[1] ).css( 'line-height' ), '行距为3,第2个p行高' ); +// compareLineHeight( ps[2], $( ps[2] ).css( 'line-height' ), '行距为3,第3个p行高' ); +// range.selectNode( ps[0] ).select(); +// equal( editor.queryCommandValue( 'lineheight' ), "3", '第1个p行间距为1' ); +// +// range.setStart( body.firstChild.firstChild, 1 ).setEnd( body.lastChild.firstChild, 2 ).select(); +// editor.execCommand( 'lineheight', 1 ); +// ps = body.childNodes; +// compareLineHeight( ps[0], $( ps[0] ).css( 'line-height' ), '行距为1,第1个p行高' ); +// compareLineHeight( ps[1], $( ps[1] ).css( 'line-height' ), '行距为1,第2个p行高' ); +// compareLineHeight( ps[2], $( ps[2] ).css( 'line-height' ), '行距为1,第3个p行高' ); +// range.selectNode( ps[0] ).select(); +// equal( editor.queryCommandValue( 'lineheight' ), "1", '第1个p行间距为1' ); +// start(); +// }, 20 ); +// stop(); +// +//} ); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/link.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/link.js new file mode 100644 index 000000000..de40a881e --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/link.js @@ -0,0 +1,216 @@ +module( "plugins.link" ); + +/*trace 879*/ +test( '同时去多个超链接', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '

    hellofirstsecond

    thirdsina

    baidu
    ' ); + stop(); + setTimeout(function () { + range.selectNode( editor.body ).select(); + editor.execCommand( 'unlink' ); + equal( editor.body.firstChild.innerHTML, 'hellofirstsecond', '第一段去掉超链接' ); + equal( editor.body.firstChild.nextSibling.innerHTML, 'thirdsina', '第二段去掉超链接' ); + equal( editor.body.lastChild.getElementsByTagName( 'td' )[0].innerHTML, 'baidu', '表格内的超链接被去掉' ); + start(); + }, 100); +} ); + +test( '光标闭合且没有超链接', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '

    hello

    ' ); + range.setStart( editor.body.firstChild, 0 ).collapse( 1 ).select(); + editor.execCommand( 'unlink' ); + equal( ua.getChildHTML( editor.body ), '

    hello

    ', '没有超链接什么都不做' ); +} ); + +/*trace 833*/ +test( '在超链接前加一个超链接', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '

    hellobaidu

    ' ); + range.selectNode( editor.body.firstChild.firstChild ).select(); + editor.execCommand( 'link', {href:'http://www.google.com/'} ); + ua.manualDeleteFillData( editor.body ); + ua.checkSameHtml( editor.getContent(), '

    hellobaidu

    '); +} ); + +/*trace 798*/ +test( '给图片添加超链接', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '

    hello

    ' ); + range.selectNode( editor.body.firstChild.firstChild ).select(); + editor.execCommand( 'link', {href:'http://www.baidu.com/'} ); + var html = 'hello'; + ua.checkHTMLSameStyle( html, editor.document, editor.body.firstChild, '给图片添加超链接' ); +// equal(html,editor.body.firstChild.innerHTML); +} ); + +/*trace 758 + *并不是真的选中所有单元格,是假选 + * 先设置startContainer和endContainer为第一个单元格中的文本或占位符 + * 再在editor的currentSelectedArr设置当前选中的内容,使得看上去是选中了所有的td*/ +test( '选中多个单元格插入超链接', function () { + if(ua.browser.ie>8)return ;//TODO 1.2.6 + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '
    hello
    ' ); + setTimeout(function(){ + var trs = editor.body.firstChild.getElementsByTagName( 'tr' ); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[0].cells[0],trs[1].cells[1]); + ut.setSelected(cellsRange); + range.setStart( trs[0].cells[0], 0 ).collapse( true ).select(); + + editor.execCommand( 'link', {href:'http://www.baidu.com/'} ); + var br = ua.browser.ie ? '' : '
    '; + equal( ua.getChildHTML( trs[0].cells[0] ), 'http://www.baidu.com/'+(ua.browser.ie>8?' ':br), '第一个单元格中插入超链接' );//原来空单元格的br不去掉 + equal( ua.getChildHTML( trs[0].cells[1] ), br, '第二个单元格中未插入超链接' ); + equal( ua.getChildHTML( trs[1].cells[0] ), 'hello', '第三个单元格中插入超链接' ); + start(); + },50); + stop(); +} ); + +test( '去除表格中的链接', function () { + if(ua.browser.ie>8)return ;//TODO 1.2.6 + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '
    hello
    ' ); + setTimeout(function(){ + var trs = editor.body.firstChild.getElementsByTagName( 'tr' ); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[0].cells[0],trs[1].cells[0]); + ut.setSelected(cellsRange); + range.setStart( trs[0].cells[0], 0 ).collapse( true ).select(); + + editor.execCommand( 'link', {href:'http://www.baidu.com/'} ); + var br = ua.browser.ie ? '' : '
    '; + equal( editor.queryCommandValue( 'link' ), trs[0].cells[0].firstChild, '查询多个单元格的command value为a' ); + editor.execCommand( 'unlink' ); + equal( ua.getChildHTML( trs[0].cells[0] ), 'http://www.baidu.com/'+(ua.browser.ie>8?' ':br), '第一个单元格中插入超链接' ); + equal( ua.getChildHTML( trs[0].cells[1] ), br, '第二个单元格中未插入超链接' ); + equal( ua.getChildHTML( trs[1].cells[0] ), 'hello', '第三个单元格中插入超链接' ); + equal( editor.queryCommandValue( 'link' ), null, '查询多个单元格的command value为null' ); + start(); + },50); + stop(); +} ); + +/*1.2.5+不支持此功能*/ +//test( 'trace 1728 去除链接--表格第一个单元格没有超链接', function () { +// var editor = te.obj[0]; +// var range = te.obj[1]; +// editor.setContent( '
    google
    ' ); +// var body = editor.body; +// var tds = body.firstChild.getElementsByTagName( 'td' ); +// range.selectNode( body.firstChild ).select(); +// editor.currentSelectedArr = [tds[0], tds[1]]; +// editor.execCommand( 'unlink' ); +// if ( UE.browser.ie ) +// equal( tds[0].childNodes.length, 1, '第一个表格中有一个占位文本节点' ); +// range = editor.selection.getRange(); +// tds = body.firstChild.getElementsByTagName( 'td' ); +// equal( ua.getChildHTML( tds[1] ), 'google', 'a标签被删除' ); +// if ( UE.browser.gecko ) +// ua.checkResult( range, tds[0], tds[0], 0, 0, true, 'check unlink result' ); +// else if(UE.browser.opera) +// ua.checkResult( range, tds[0].firstChild, tds[0].firstChild, 0, 0, true, 'check unlink result' ); +// else{ +// ua.checkResult( range, tds[0].firstChild, tds[0].firstChild, 1, 1, true, 'check unlink result' ); +// } +// var br = ua.browser.ie ? '' : "
    "; +// ua.manualDeleteFillData( tds[0] ); +// equal( ua.getChildHTML( tds[0] ), br, 'td 1 is empty' ); +//} ); + +test( '添加链接--表格第一个单元格没有超链接', function () { + if(!ua.browser.ie){//TODO 1.2.6 + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '
    google
    ' ); + setTimeout(function(){ + var trs = editor.body.firstChild.getElementsByTagName( 'tr' ); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[0].cells[0],trs[0].cells[1]); + ut.setSelected(cellsRange); +// range.setStart( trs[0].cells[0], 0 ).collapse( true ).select(); +// range.selectNode( body.firstChild ).select(); +// var tds = body.firstChild.getElementsByTagName( 'td' ); +// editor.currentSelectedArr = [tds[0], tds[1]]; + editor.execCommand( 'link', {href:'www.baidu.com'} ); + range = editor.selection.getRange(); + equal( ua.getChildHTML( trs[0].cells[1] ), 'google', 'a标签的地址被修改了' ); + var br = ua.browser.ie ? '' : '
    '; + equal( ua.getChildHTML( trs[0].cells[0] ), 'www.baidu.com'+br, 'td 1 被添加了超链接' ); + if ( (!baidu.editor.browser.gecko)&&(!baidu.editor.browser.webkit)) + ua.checkResult( range, trs[0].cells[0].firstChild.firstChild, trs[0].cells[0].firstChild.firstChild, 0, 0, true, 'check link result' ); + else + ua.checkResult( range, trs[0].cells[0].firstChild, trs[0].cells[0].firstChild, 0, 0, true, 'check link result' ); + start(); + },50); + stop(); + } +} ); + +test( '光标在超链接中间去除超链接', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '

    hello

    ' ); + var a_text = editor.body.getElementsByTagName( 'a' )[0].firstChild; + range.setStart( a_text, 2 ).collapse( 1 ).select(); + same( editor.queryCommandValue( 'link' ), editor.body.firstChild.firstChild, 'command value is a' ); + editor.execCommand( 'unlink' ); + equal( ua.getChildHTML( editor.body ), '

    hello

    ', '去除超链接后' ); + equal( editor.queryCommandState( 'unlink' ), -1, 'link state is -1' ); +} ); + +test( '去除链接--选中区域包含超链接和非超链接', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '

    hello

    hello2famfouhello3

    ' ); + var body = editor.body; + range.setStart( body.firstChild, 0 ).setEnd( body.lastChild, 3 ).select(); + equal( editor.queryCommandValue( 'link' ), body.lastChild.firstChild.nextSibling, 'queryCommandvalue' ); +} ); + +/*trace 1111*/ +test( '插入超链接', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '

    hello

    ' ); + range.setStart( editor.body.firstChild, 1 ).collapse( 1 ).select(); + editor.execCommand( 'link', {href:'www.baidu.com'} ); + var a = editor.body.getElementsByTagName( 'a' )[0]; + range.selectNode( a ).select(); + range = editor.selection.getRange(); + same( editor.queryCommandValue( 'link' ), a, 'link value is a' ); + equal( ua.getChildHTML( editor.body ), '

    hellowww.baidu.com

    ' ); + equal( editor.queryCommandState( 'unlink' ), 0, 'link state is 0' ); +} ); + +test( '对现有的超链接修改超链接地址', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent( '

    http://www.baidu.comhellogoogle

    ' ); + var a1 = body.firstChild.firstChild; + range.selectNode( a1 ).select(); + + editor.execCommand( 'link', {href:'ueditor.baidu.com'} ); + a1 = body.firstChild.firstChild; + equal( a1.getAttribute( 'href' ), 'ueditor.baidu.com', 'check href' ); + equal( a1.innerHTML, 'ueditor.baidu.com', 'innerHTML也相应变化' ); + + var a2 = body.firstChild.getElementsByTagName( 'a' )[1]; + range.selectNode( a2 ).select(); + editor.execCommand( 'link', {href:'mp3.baidu.com'} ); + a2 = body.firstChild.getElementsByTagName( 'a' )[1]; + + equal( a2.getAttribute( 'href' ), 'mp3.baidu.com', 'check href for second a link' ); + equal( a2.innerHTML, 'google', 'innerHTML不变' ); +} ); + + diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/list.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/list.js new file mode 100644 index 000000000..1f3fb8785 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/list.js @@ -0,0 +1,961 @@ +module("plugins.list"); +/* + *
  • 有序列表切换到无序 + *
  • 无序列表切换到有序 + *
  • 有序之间相互切换 + *
  • 无序之间相互切换 + *
  • 先引用后列表 + *
  • 表格中插入列表 + *
  • h1套列表 + *
  • 去除链接 + * + * */ + +//test('',function(){stop();}) +test('trace 3859 回车将p转成列表', function () { + if(ua.browser.ie==9||ua.browser.ie==10)return; + var editor = te.obj[0]; + var range = te.obj[1]; + var br = ua.browser.ie ? '' : '
    '; + editor.setContent('

    1. 2

    '); + stop(); + setTimeout(function () { + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + ua.keydown(editor.body, {keyCode:13}); + setTimeout(function () { + ua.checkSameHtml(ua.getChildHTML(editor.body), '
    1. 2

    2. ' + br + '

    ', '回车将p转成列表'); + start() + }, 50); + }, 100); +}); + +//todo bug3418 +test('ol标签嵌套', function () { + var editor = te.obj[0]; + editor.setContent('
    1. a

      1. b

    '); + ua.checkSameHtml(editor.body.innerHTML, '
    1. a

      1. b

    '); +}); + +test('li内添加p标签', function () { + var editor = te.obj[0]; + editor.setContent('
    1. asd

      asd

    '); + ua.manualDeleteFillData(editor.body); + ua.checkSameHtml(editor.body.innerHTML, '
    1. asd

      asd

    ', '添加p标签'); +}); +//todo 1.2.6.1 +test('p转成列表', function () { + var div = document.body.appendChild(document.createElement('div')); + div.id = 'ue'; + var editor = UE.getEditor('ue',{autoTransWordToList:true}); +// var br = ua.browser.ie ? ' ' : ''; + var br = ''; + editor.ready(function () { + setTimeout(function(){ + editor.setContent('

    1.a

    1. b
    '); + ua.manualDeleteFillData(editor.body); + //todo 1.2.6.1 +// ua.checkSameHtml(editor.body.innerHTML,'
    1. a

    2. b

    ','p转成有序列表'); + editor.setContent('

    abc

    '); + ua.manualDeleteFillData(editor.body); + ua.checkSameHtml(editor.body.innerHTML, '
    • ' + br + '

    ', 'p转成无序列表'); +//todo bug3417 +// editor.setContent('

    n

    '); +// ua.manualDeleteFillData(editor.body); +// ua.checkSameHtml(editor.body.innerHTML,'

    ','p转成无序列表'); + UE.delEditor('ue'); + te.dom.push(document.getElementById('ue')); + start(); + },200); + }); + stop(); + +}); + +test('列表复制粘贴', function () { + var editor = te.obj[0]; + + editor.setContent('
    1. a
    2. b
    • a
    • b
    '); + ua.keydown(editor.body, {'keyCode':65, 'ctrlKey':true}); + ua.keydown(editor.body, {'keyCode':67, 'ctrlKey':true}); + /*ctrl+c*/ + + setTimeout(function () { + var html = {html:editor.body.innerHTML}; + editor.fireEvent('beforepaste', html); + /*粘贴*/ +// range.setStart(editor.body,1).collapse(true).select(); +// editor.fireEvent("paste"); +// ua.manualDeleteFillData(editor.body); +// equal(editor.body.innerHTML,'


    ','编辑器清空'); + editor.setContent('
    1. a
    2. b
    • a
    • b
    '); + ua.keydown(editor.body, {'keyCode':65, 'ctrlKey':true}); + ua.keydown(editor.body, {'keyCode':67, 'ctrlKey':true}); + /*ctrl+c*/ + html = {html:editor.body.innerHTML}; + editor.fireEvent('beforepaste', html); + /*粘贴*/ + editor.setContent('
      1. a
      2. b
      • a
      • b
    '); + ua.keydown(editor.body, {'keyCode':65, 'ctrlKey':true}); + ua.keydown(editor.body, {'keyCode':67, 'ctrlKey':true}); + /*ctrl+c*/ + html = {html:editor.body.innerHTML}; + editor.fireEvent('beforepaste', html); + /*粘贴*/ + editor.setContent('
      1. a
      2. b
      • a
      • b
    '); + ua.keydown(editor.body, {'keyCode':65, 'ctrlKey':true}); + ua.keydown(editor.body, {'keyCode':67, 'ctrlKey':true}); + /*ctrl+c*/ + html = {html:editor.body.innerHTML}; + setTimeout(function () { + editor.fireEvent('beforepaste', html); + /*粘贴*/ + start() + }, 50); + }, 50); + stop(); +}); + +//TODO trace-3416 此处只为提高覆盖率 +//test('剪切列表',function(){ +// var editor = te.obj[0]; +// var range = te.obj[1]; +// editor.setContent('

    '); +// range.setStart(editor.body.firstChild.lastChild,0).collapse(true).select(); +// ua.cut(editor.body); +// stop(); +// setTimeout(function(){ +// ua.manualDeleteFillData(editor.body); +// var br = ua.browser.ie?'':'
    '; +// equal(editor.body.innerHTML,'

    '+br+'

    ','编辑器清空'); +// editor.setContent('

    asdf

    '); +// range.setStart(editor.body.firstChild.lastChild,0).collapse(true).select(); +// ua.cut(editor.body); +// setTimeout(function(){ +// ua.manualDeleteFillData(editor.body); +// equal(editor.body.innerHTML,'

    asdf

    ','列表删除'); +// editor.setContent('www.baidu.com

    '); +// range.setStart(editor.body.firstChild.nextSibling.lastChild,0).collapse(true).select(); +// ua.cut(editor.body); +// setTimeout(function(){ +// ua.manualDeleteFillData(editor.body); +// ua.checkSameHtml(editor.body.innerHTML,'

    www.baidu.com

    ','列表删除'); +// start(); +// },20); +// },20); +// },20); +//}); + +test('修改列表再删除列表', function () { + if ((ua.browser.safari && !ua.browser.chrome))return 0; + var editor = te.obj[0]; + var range = te.obj[1]; + var br = baidu.editor.browser.ie ? "" : "
    "; + editor.setContent('
      hello1
    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('insertorderedlist', 'cn2'); + ua.manualDeleteFillData(editor.body); + equal(editor.body.firstChild.tagName.toLowerCase(), 'ol', '查询列表的类型'); + equal(ua.getChildHTML(editor.body.firstChild), '
  • hello1

  • '); + range.setStart(editor.body.lastChild, 0).setEnd(editor.body.lastChild, 1).select(); + editor.execCommand('insertorderedlist', 'cn2'); + ua.manualDeleteFillData(editor.body); + ua.checkSameHtml(editor.body.innerHTML, '

    hello1

    '); +}); + +test('列表内没有列表标号的项后退', function () { + if ((ua.browser.safari && !ua.browser.chrome))return 0; + var editor = te.obj[0]; + var range = te.obj[1]; + + var lis; + var br = ua.browser.ie ? '
    ' : '
    '; + editor.setContent('
    1. hello

      www.baidu.com

    '); + range.setStart(editor.body.firstChild.firstChild.lastChild.lastChild, 0).collapse(true).select(); + ua.manualDeleteFillData(editor.body); + ua.keydown(editor.body, {keyCode:8}); + + setTimeout(function () { + lis = editor.body.getElementsByTagName('li'); + equal(lis.length, '1', '列表长度不变'); + ua.checkSameHtml(ua.getChildHTML(editor.body), '
    1. hello

    www.baidu.com

    ', 'p在列表外'); + start() + }, 50); + stop(); +}); + +test('多个p,选中其中几个变为列表', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent('

    hello1

    hello2

    hello3

    hello4

    '); + setTimeout(function () { + range.setStart(body.firstChild, 0).setEnd(body.firstChild.nextSibling, 1).select(); + editor.execCommand('insertorderedlist'); + equal(ua.getChildHTML(body.firstChild), '
  • hello1

  • hello2

  • ', '检查列表的内容'); + equal(body.firstChild.tagName.toLowerCase(), 'ol', '检查列表的类型'); + equal(body.childNodes.length, 3, '3个孩子'); + equal(body.lastChild.tagName.toLowerCase(), 'p', '后面的p没有变为列表'); + equal(body.lastChild.innerHTML.toLowerCase(), 'hello4', 'p里的文本'); + start(); + }, 50); + stop(); +}); + +//trace 988,有序123切到abc再切到123 +test('有序列表的切换', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent('

    你好

    是的

    '); + setTimeout(function () { + range.setStart(body, 0).setEnd(body, 2).select(); + editor.execCommand('insertorderedlist', 'decimal'); + equal(editor.queryCommandValue('insertorderedlist'), 'decimal', '查询插入数字列表的结果1'); + editor.execCommand('insertorderedlist', 'lower-alpha'); + equal(editor.queryCommandValue('insertorderedlist'), 'lower-alpha', '查询插入字母列表的结果'); + editor.execCommand('insertorderedlist', 'decimal'); + equal(editor.queryCommandValue('insertorderedlist'), 'decimal', '查询插入数字列表的结果2'); + start(); + }, 50); + stop(); +}); + +//trace 988,无序圆圈切到方块再切到圆圈 +test('无序列表之间的切换', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent('

    你好

    是的

    '); + range.setStart(body, 0).setEnd(body, 2).select(); + editor.execCommand('insertunorderedlist', 'circle'); + equal(editor.queryCommandValue('insertunorderedlist'), 'circle', '查询插入圆圈列表的结果1'); + editor.execCommand('insertunorderedlist', 'square'); + equal(editor.queryCommandValue('insertunorderedlist'), 'square', '查询插入正方形列表的结果'); + editor.execCommand('insertunorderedlist', 'circle'); + equal(editor.queryCommandValue('insertunorderedlist'), 'circle', '查询插入圆圈列表的结果1'); +}); + +test('引用中插入列表', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent('

    '); + range.setStart(body.firstChild, 0).collapse(1).select(); + editor.execCommand('blockquote'); + editor.execCommand('insertorderedlist'); + equal(body.firstChild.tagName.toLowerCase(), 'blockquote', 'firstChild of body is blockquote'); + equal(body.childNodes.length, 1, '只有一个孩子'); + equal(body.firstChild.firstChild.tagName.toLowerCase(), 'ol', 'insert an ordered list'); + equal(body.firstChild.childNodes.length, 1, 'blockquote只有一个孩子'); + equal($(body.firstChild.firstChild).css('list-style-type'), 'decimal', '数字列表'); + equal(editor.queryCommandValue('insertorderedlist'), 'decimal', 'queryCommand value is decimal'); +}); + +/*trace 1118*/ +test('去除无序列表', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent('

    '); + range.setStart(body.firstChild, 0).collapse(1).select(); + editor.execCommand('insertunorderedlist'); + equal(body.firstChild.tagName.toLowerCase(), 'ul', 'insert an unordered list'); + equal(body.childNodes.length, 1, 'body只有一个孩子'); + equal(editor.queryCommandValue('insertunorderedlist'), 'disc', 'queryCommand value is disc'); + ok(editor.queryCommandState('insertunorderedlist'), 'state是1'); + /*去除列表*/ + editor.execCommand('insertunorderedlist'); + ua.manualDeleteFillData(editor.body); + equal(body.firstChild.tagName.toLowerCase(), 'p', '去除列表'); + equal(body.childNodes.length, 1, 'body只有一个孩子'); + ok(!editor.queryCommandState('insertunorderedlist'), 'state是0'); +}); + +test('闭合方式有序和无序列表之间的切换', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent('

    '); + range.setStart(body.firstChild, 0).collapse(1).select(); + editor.execCommand('insertunorderedlist'); + equal(body.firstChild.tagName.toLowerCase(), 'ul', 'insert an unordered list'); + equal(body.childNodes.length, 1, 'body只有一个孩子'); + equal(editor.queryCommandValue('insertunorderedlist'), 'disc', 'queryCommand value is disc'); + equal(editor.queryCommandValue('insertorderedlist'), null, '有序列表查询结果为null'); + /*切换为有序列表*/ + editor.execCommand('insertorderedlist'); + ua.manualDeleteFillData(editor.body); + equal(body.firstChild.tagName.toLowerCase(), 'ol', '变为有序列表'); + equal(body.childNodes.length, 1, 'body只有一个孩子'); + equal(editor.queryCommandValue('insertorderedlist'), 'decimal', 'queryCommand value is decimal'); + equal(editor.queryCommandValue('insertunorderedlist'), null, '无序列表查询结果为null'); + /*切换为圆圈无序列表*/ + editor.execCommand('insertunorderedlist', 'circle'); + ua.manualDeleteFillData(editor.body); + equal(body.firstChild.tagName.toLowerCase(), 'ul', '变为无序列表'); + equal(body.childNodes.length, 1, 'body只有一个孩子'); + equal(editor.queryCommandValue('insertunorderedlist'), 'circle', '无序列表是圆圈'); + equal(editor.queryCommandValue('insertorderedlist'), null, '有序列表查询结果为null'); +}); + +test('非闭合方式切换有序和无序列表', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + /*如果只选中hello然后切换有序无序的话,不同浏览器下表现不一样*/ + editor.setContent('
    1. hello
    2. hello3

    hello2

    '); + range.selectNode(body.firstChild).select(); + editor.execCommand('insertunorderedlist', 'square'); + equal(body.firstChild.tagName.toLowerCase(), 'ul', '有序列表变为无序列表'); + equal(editor.queryCommandValue('insertunorderedlist'), 'square', '无序列表是方块'); + equal(ua.getChildHTML(body.firstChild), '
  • hello

  • hello3

  • ', 'innerHTML 不变'); + /*切换为有序列表*/ + editor.execCommand('insertorderedlist', 'upper-alpha'); + equal(body.firstChild.tagName.toLowerCase(), 'ol', '无序列表变为有序列表'); + equal(editor.queryCommandValue('insertorderedlist'), 'upper-alpha', '有序列表是A'); + equal(ua.getChildHTML(body.firstChild), '
  • hello

  • hello3

  • ', '变为有序列表后innerHTML 不变'); +}); + +test('将列表下的文本合并到列表中', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent('
    • hello1

    是的

    '); + setTimeout(function () { + range.setStart(body.firstChild, 0).setEnd(body.lastChild, 1).select(); + /*将无序的变为有序,文本也相应变成无序列表的一部分*/ + editor.execCommand('insertorderedlist'); + ua.manualDeleteFillData(editor.body); + equal(body.firstChild.tagName.toLowerCase(), 'ol', 'ul变为了ol'); + equal(ua.getChildHTML(body.firstChild), '
  • hello1

  • 是的

  • '); + equal(body.childNodes.length, 1, '只有一个孩子是ol'); + start(); + }, 50); + stop(); +}); + +test('多个列表', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent('
    1. hello1
    • hello2
    '); + range.selectNode(body.lastChild).select(); + /*将无序的变为有序*/ + editor.execCommand('insertorderedlist'); + equal(body.firstChild.tagName.toLowerCase(), 'ol', '仍然是ol'); + equal(body.childNodes.length, 1, 'body只有1个孩子ol'); + equal(body.firstChild.childNodes.length, 2, '下面的列表合并到上面'); + equal(ua.getChildHTML(body.lastChild), '
  • hello1

  • hello2

  • ', '2个li子节点'); +}); + +test('修改列表中间某一段列表为另一种列表', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent('
    1. hello
    2. hello2
    3. hello3
    4. hello4
    '); + var lis = body.firstChild.getElementsByTagName('li'); + range.setStart(lis[1], 0).setEnd(lis[2], 1).select(); + editor.execCommand('insertunorderedlist'); + equal(body.childNodes.length, 3, '3个列表'); + equal(ua.getChildHTML(body.firstChild), '
  • hello

  • ', '第一个列表只有一个li'); + equal(ua.getChildHTML(body.lastChild), '
  • hello4

  • ', '最后一个列表只有一个li'); + equal(body.childNodes[1].tagName.toLowerCase(), 'ul', '第二个孩子是无序列表'); + equal(ua.getChildHTML(body.childNodes[1]), '
  • hello2

  • hello3

  • ', '检查第二个列表的内容'); +}); + +test('两个列表,将下面的合并上去', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent('
    1. hello3
    1. hello1
    • hello2
    '); + range.selectNode(body.lastChild).select(); + /*将无序的变为有序,有序上面的有序不会合并在一起了*/ + editor.execCommand('insertorderedlist'); + equal(body.firstChild.tagName.toLowerCase(), 'ol', '仍然是ol'); + equal(body.childNodes.length, 2, 'body有两个孩子ol'); + equal(body.lastChild.childNodes.length, 2, '下面和上面的列表合并到上面去了'); +//TODO 1.2.6不严重bug注释 空style未删除 +// equal( ua.getChildHTML( editor.body ), '
    1. hello3

    1. hello1

    2. hello2

    ', '3个li子节点' ); +}); + +test('trace 3293:列表下的文本合并到列表中', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent('
    1. hello3
    2. hello1

    文本1

    文本2

    '); + range.setStart(body, 1).setEnd(body, 3).select(); + /*选中文本变为有序列表,和上面的列表合并了*/ + editor.execCommand('insertorderedlist'); + var ol = body.firstChild; + equal(body.childNodes.length, 1, '所有合并为一个列表'); + equal(ol.tagName.toLowerCase(), 'ol', '仍然是ol'); + equal(ol.childNodes.length, 4, '下面和上面的列表合并到上面去了'); + equal(ua.getChildHTML(body.firstChild), '
  • hello3

  • hello1

  • 文本1

  • 文本2

  • ', '4个li子节点'); +}); + +test('2个相同类型的列表合并', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent('
    1. hello3
    2. hello1
    1. 文本1

    2. 文本2

    '); + range.selectNode(body.lastChild).select(); + editor.execCommand('insertorderedlist'); + var ol = body.firstChild; + equal(body.childNodes.length, 1, '所有合并为一个列表'); + equal(ol.tagName.toLowerCase(), 'ol', '仍然是ol'); + equal(ol.childNodes.length, 4, '下面和上面的列表合并到上面去了'); + equal(ua.getChildHTML(body.firstChild), '
  • hello3

  • hello1

  • 文本1

  • 文本2

  • ', '4个li子节点'); +}); + +test('不闭合情况h1套列表', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent('

    hello1

    hello2

    '); + range.setStart(body.firstChild, 0).setEnd(body.lastChild, 1).select(); + /*对h1添加列表*/ + editor.execCommand('insertorderedlist'); + equal(body.firstChild.tagName.toLowerCase(), 'ol', '仍然是ol'); + equal(ua.getChildHTML(body.firstChild), '
  • hello1

  • hello2

  • ', '查看插入列表后的结果'); + equal(body.childNodes.length, 1, 'body只有一个孩子ol'); + equal(body.firstChild.childNodes.length, 2, '2个li'); +}); + +test('闭合情况h1套列表', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent('

    hello1

    '); + range.setStart(body.firstChild, 0).collapse(1).select(); + /*对h1添加列表*/ + editor.execCommand('insertorderedlist'); + equal(body.firstChild.tagName.toLowerCase(), 'ol', '仍然是ol'); + equal(ua.getChildHTML(body.firstChild), '
  • hello1

  • ', '查看插入列表后的结果'); + equal(body.childNodes.length, 1, 'body只有一个孩子ol'); + equal(body.firstChild.childNodes.length, 1, '1个li'); +}); + +test('列表内后退', function () { + /*实际操作没问题,取range时会在将文本节点分为两个节点,后退操作无法实现*/ + if ((ua.browser.safari && !ua.browser.chrome)) + return 0; + var editor = te.obj[0]; + var range = te.obj[1]; + + var lis; + var br = ua.browser.ie ? '
    ' : '
    '; +//////标签空格的处理 + editor.setContent('

    1. hello2


    2. hello3
    3. hello4

    4. hello5

    '); +// editor.setContent('

    1. hello2

    2. hello3
    3. hello4

    4. hello5

    '); + range.setStart(editor.body.firstChild.lastChild.firstChild.firstChild, 0).collapse(1).select(); + ua.manualDeleteFillData(editor.body); + ua.keydown(editor.body, {keyCode:8}); + + var ol = editor.body.getElementsByTagName('ol'); + lis = editor.body.getElementsByTagName('li'); + equal(lis.length, '5', '变成5个列表项'); + equal(ua.getChildHTML(editor.body.firstChild), '
  • ' + br + '

  • hello2

  • ' + br + '

  • hello3
  • hello4

    hello5

  • ', '最后一个列表项'); + range.setStart(lis[0].firstChild, 0).collapse(1).select(); + ua.keydown(editor.body, {keyCode:8}); + + lis = editor.body.getElementsByTagName('li'); + equal(lis.length, '4', '变成4个列表项'); + equal(ua.getChildHTML(editor.body.lastChild), '
  • hello2

  • ' + br + '

  • hello3
  • hello4

    hello5

  • ', '第一个列表项且为空行'); + range.setStart(lis[1].firstChild, 0).collapse(1).select(); + ua.keydown(editor.body, {keyCode:8}); + + lis = editor.body.getElementsByTagName('li'); + equal(lis.length, '3', '变成3个列表项'); + equal(ua.getChildHTML(editor.body.lastChild), '
  • hello2

    ' + br + '

  • hello3
  • hello4

    hello5

  • ', '中间列表项且为空行'); + if (!ua.browser.ie) { + range.setStart(lis[1].firstChild.firstChild, 0).collapse(1).select(); + ua.manualDeleteFillData(editor.body); + ua.keydown(editor.body, {keyCode:8}); +//TODO 1.2.6不严重bug注释 空style未删除 +// equal(ua.getChildHTML(editor.body),'


    1. hello2


      hello3
    2. hello4

      hello5

    ','自定义标签后退'); + } + +}); + +test('列表内回车', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + + var lis; + var br = ua.browser.ie ? '' : '
    '; + editor.setContent('
    '); + lis = editor.body.getElementsByTagName('li'); + range.setStart(lis[0], 0).collapse(1).select(); + ua.keydown(editor.body, {keyCode:13}); + var spa = ua.browser.opera ? '
    ' : ''; + equal(ua.getChildHTML(editor.body), spa + '

    ', '空列表项回车--无列表'); + + editor.setContent('
    1. hello1

      hello2

    '); + lis = editor.body.getElementsByTagName('li'); + range.setStart(lis[0].lastChild, 0).collapse(1).select(); + ua.keydown(editor.body, {keyCode:13}); + equal(ua.getChildHTML(editor.body.firstChild), '
  • hello1

  • hello2

  • ', '单个列表项内回车'); +//////标签空格的处理 +// editor.setContent('

    1. hello5



    '); + editor.setContent('

    1. hello5



    '); + lis = editor.body.getElementsByTagName('li'); + range.setStart(lis[2].firstChild.firstChild, 0).setEnd(lis[2].lastChild.firstChild, 0).select(); + ua.keydown(editor.body, {keyCode:13}); +//TODO 1.2.6不严重bug注释 空style未删除 +// equal(ua.getChildHTML(editor.body),'
    1. '+br+'

    2. hello5

    '+br+'

    ','最后一个列表项为空行回车'); + + /*trace 2652*/ + range.setStart(editor.body.firstChild.firstChild.firstChild, 0).collapse(1).select(); + ua.keydown(editor.body, {keyCode:13}); +//TODO 1.2.6不严重bug注释 空style未删除 +// equal(ua.getChildHTML(editor.body),'

    '+br+'

    1. hello5

    '+br+'

    ','第一个列表项为空行下回车'); + + /*trace 2653*/ + editor.setContent('
    1. hello2

    2. hello3


    3. hello5

    '); + lis = editor.body.getElementsByTagName('li'); + range.setStart(lis[0].firstChild.firstChild, 2).setEnd(lis[1].firstChild.firstChild, 4).select(); + ua.keydown(editor.body, {keyCode:13}); + equal(ua.getChildHTML(editor.body.firstChild), '
  • he

  • o3


  • hello5

  • ', '非闭合回车'); + + editor.setContent('
    1. hello

      hello4

    2. hello5

    '); + lis = editor.body.getElementsByTagName('li'); + range.setStart(lis[0].lastChild.firstChild, 1).setEnd(lis[0].lastChild.firstChild, 2).select(); + ua.keydown(editor.body, {keyCode:13}); + equal(ua.getChildHTML(editor.body.firstChild), '
  • hello

    h

  • llo4

  • hello5

  • ', '一个列表项内两行'); + +}); + +test('tab键', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + + var lis; + editor.setContent('
    1. hello1

    2. hello2

    '); + lis = editor.body.getElementsByTagName('li'); + range.setStart(lis[1], 0).collapse(1).select(); + ua.keydown(editor.body, {keyCode:9}); + ua.keydown(editor.body, {keyCode:9}); + var str = '
  • hello1

      1. hello2

    '; + ua.checkSameHtml(str, editor.body.firstChild.innerHTML.toLowerCase(), '有序列表---tab键'); + +}); + +test('回车后产生新的li-选区闭合', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent('

    hello1

    hello2

    '); + setTimeout(function () { + range.setStart(body.firstChild, 0).setEnd(body.firstChild.nextSibling, 1).select(); + editor.execCommand('insertorderedlist'); + var lastLi = body.firstChild.lastChild.firstChild.firstChild; + range.setStart(lastLi, lastLi.length).collapse(1).select(); + setTimeout(function () { + ua.keydown(editor.body, {'keyCode':13}); + equal(body.firstChild.childNodes.length, 3, '回车后产生新的li'); + equal(body.firstChild.lastChild.tagName.toLowerCase(), 'li', '回车后产生新的li'); + var br = ua.browser.ie ? '' : '
    '; + equal(ua.getChildHTML(body.firstChild), '
  • hello1

  • hello2

  • ' + br + '

  • ', '检查内容'); + var lastLi = body.firstChild.lastChild.firstChild.firstChild; + range.setStart(lastLi, lastLi.length).collapse(1).select(); + setTimeout(function () { + ua.keydown(editor.body, {'keyCode':13}); + equal(body.firstChild.childNodes.length, 2, '空li后回车,删除此行li'); + equal(body.lastChild.tagName.toLowerCase(), 'p', '产生p'); + br = ua.browser.ie ? '' : '
    '; + ua.manualDeleteFillData(body.lastChild); + equal(body.lastChild.innerHTML.toLowerCase().replace(/\r\n/ig, ''), br, '检查内容'); + start() + }, 20); + }, 20); + }, 50); + stop(); +}); + +/*trace 3074*/ +test('trace 1622:表格中插入列表', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent('

    你好
    hello2你好2
    '); + /*必须加br,否则没办法占位*/ + stop() + setTimeout(function () { + var tds = body.getElementsByTagName('td'); + range.setStart(tds[0], 0).collapse(1).select(); + /*选中一个单元格*/ + editor.execCommand('insertorderedlist'); + /*插入有序列表*/ + equal(tds[0].firstChild.tagName.toLowerCase(), 'ol', '查询列表的类型'); + equal(tds[0].firstChild.style['listStyleType'], 'decimal', '查询有序列表的类型'); + var br = baidu.editor.browser.ie ? "
    " : "
    "; + equal(ua.getChildHTML(tds[0].firstChild), '
  • ' + '

    ' + br + '

    ' + '
  • '); + setTimeout(function () { + var trs = editor.body.firstChild.getElementsByTagName('tr'); + /*选中多个单元格*/ + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[0].cells[0], trs[1].cells[1]); + ut.setSelected(cellsRange); + range.setStart(trs[0].cells[0], 0).collapse(true).select(); + tds = body.getElementsByTagName('td'); + editor.execCommand('insertunorderedlist', 'circle'); + /*插入无序列表*/ + equal(tds[1].firstChild.tagName.toLowerCase(), 'ul', '查询无序列表'); + equal(tds[1].firstChild.style['listStyleType'], 'circle', '查询无序列表的类型'); + equal(ua.getChildHTML(tds[1].firstChild), '
  • 你好
  • '); + equal(ua.getChildHTML(tds[3].firstChild), '
  • 你好2
  • '); + start(); + }, 50); + }, 50); +}); + +///*presskey*/ +//test( ' trace 1536:删除部分列表', function () { +// var editor = te.obj[0]; +// editor.setContent( '
    1. hello1
    2. 你好
    3. hello3
    ' ); +// var body = editor.body; +// var range = te.obj[1]; +// stop(); +// expect( 2 ); +// range.setStart( body.firstChild, 1 ).setEnd( body.firstChild, 2 ).select(); +// editor.focus(); +// te.presskey( 'del', '' ); +// editor.focus(); +// setTimeout( function () { +// equal( body.childNodes.length, 1, '删除后只剩一个ol元素' ); +// var br = (baidu.editor.browser.ie || baidu.editor.browser.gecko) ? "" : "
    "; +// //todo 不同浏览器原生选区的差别导致 +//// equal( ua.getChildHTML( body ), '
    1. hello1

    2. hello3' + br + '

    ', '第二个li被删除' ); +// start(); +// }, 30 ); +//} ); +///*presskey*/ +//test( ' trace 1544,1624 :列表中回车后再回退,会产生一个空行', function () { +// var editor = te.obj[0]; +// editor.setContent( '
    1. hello1

    2. 你好

    ' ); +// var body = editor.body; +// var ol = body.firstChild; +// var range = te.obj[1]; +// +// range.setStart( ol.firstChild.firstChild, 1 ).collapse( 1 ).select(); +// editor.focus(); +// te.presskey( 'enter', '' ); +// equal(editor.selection.getRange().startContainer.parentNode.innerHTML,''); +// +// setTimeout( function () { +// range.setStart( ol.childNodes[1], 0 ).collapse( 1 ).select(); +// equal(editor.selection.getRange().startContainer.parentNode.innerHTML,''); +// editor.focus(); +// te.presskey( 'back', '' ); +// setTimeout( function () { +// editor.focus(); +// var br = ua.browser.ie ? "" : "
    "; +// equal( ua.getChildHTML( body ), '
    1. hello1

      ' + br + '

    2. 你好

    ', '第二个li被删除' ); +// range.setStart( body, 0 ).setEnd( body, 1 ).select(); +// editor.execCommand( 'insertorderedlist' ); +// equal( ua.getChildHTML( body ), '

    hello1

    ' + br + '

    你好

    ', '应当变为纯文本' ); +// start(); +// }, 70 ); +// }, 50 ); +// stop(); +//} ); + +test('trace1620:修改上面的列表与下面的列表一致', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    你好

    1. 数字列表1

    2. 数字列表2

    1. 字母列表2

    2. 字母列表2

    '); + range.selectNode(editor.body.firstChild.nextSibling).select(); + editor.execCommand('insertorderedlist', 'lower-alpha'); + var html = '

    你好

    1. 数字列表1

    2. 数字列表2

    3. 字母列表2

    4. 字母列表2

    ' + ua.checkSameHtml(html, editor.body.innerHTML.toLowerCase(), '检查列表结果'); +}); + +test('trace 1621:选中多重列表,设置为相同类型的列表', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent('
    1. 数字列表1

    2. 数字列表2

    1. 字母列表1

    2. 字母列表2

    1. ​大写字母1

    2. 大写字母2

    3. 大写字母3

    '); + range.setStart(body, 1).setEnd(body.lastChild.firstChild.nextSibling, 1).select(); + var html = '
    1. 数字列表1

    2. 数字列表2

    1. 字母列表1

    2. 字母列表2

    3. 大写字母1

    4. 大写字母2

    5. 大写字母3

    '; + editor.execCommand('insertorderedlist', 'upper-alpha'); + ua.checkSameHtml(html, editor.body.innerHTML.toLowerCase(), 'trace 1621'); +}); +//TODO 1.2.6不严重bug注释 空style未删除 +//test( 'trace 3049:列表内有引用', function () { +// var editor = te.obj[0]; +// editor.setContent( '
    1. a

    2. b

    ' ); +// editor.execCommand( 'selectall'); +// editor.execCommand( 'blockquote' ); +// var html = '
    1. a

    2. b

    '; +// equal(ua.getChildHTML(editor.body),html,'检查列表结果'); +//}); + +/*trace 3056:模拟不完全,还需手动测试*/ +test('trace 3056:列表内表格后回车', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + + var body = editor.body; + editor.setContent('
    1. a


    2. c

    '); + var lis = editor.body.getElementsByTagName('li'); + range.setStart(lis[1].firstChild, 0).collapse(true).select(); + + setTimeout(function () { + editor.execCommand('inserttable'); + var tds = body.getElementsByTagName('td'); + tds[0].innerHTML = 'asd
    '; + range.setStart(tds[0].firstChild, 3).collapse(true).select(); + setTimeout(function () { + ua.keydown(body, {'keyCode':13}); + equal(body.childNodes.length, 1, 'body只有一个孩子'); + equal(editor.body.getElementsByTagName('li').length, 3, 'ol有3个孩子'); + equal(editor.body.getElementsByTagName('table').length, 1, '只有1个table'); + start() + }, 20); + }, 50); + stop(); +}); + +/*trace 3075:fix in future*/ +//test( 'trace 3075:表格标题行中插入有序列表', function () { +// var editor = te.obj[0]; +// var range = te.obj[1]; +// var body = editor.body; +// editor.setContent( '









    ' ); /*必须加br,否则没办法占位*/ +// var ths = body.getElementsByTagName( 'th' ); +// range.setStart( ths[1], 0 ).collapse( 1 ).select(); /*选中一个单元格*/ +// editor.execCommand( 'insertorderedlist' ); /*插入有序列表*/ +// equal( ths[1].firstChild.tagName.toLowerCase(), 'ol', '查询列表的类型' ); +// equal( ths[1].firstChild.style['listStyleType'], 'decimal', '查询有序列表的类型' ); +// var br = baidu.editor.browser.ie ? "" : "
    "; +// equal( ua.getChildHTML( ths[0].firstChild ), '
  • ' + '

    ' + br + '

    ' + '
  • ' ); +// stop(); +// setTimeout(function() { +// editor.execCommand('source'); +// setTimeout(function() { +// editor.execCommand('source'); +// equal( body.getElementsByTagName('table').length, 1, '只有1个table' ); +// start(); +// },20); +// },20); +//} ); +//test( 'trace 3075:表格标题行中插入无序列表', function () { +// var editor = te.obj[0]; +// var range = te.obj[1]; +// var body = editor.body; +// editor.setContent( '









    ' ); /*必须加br,否则没办法占位*/ +// var trs = editor.body.firstChild.getElementsByTagName( 'tr' ); /*选中多个单元格*/ +// var ut = editor.getUETable(editor.body.firstChild); +// var cellsRange = ut.getCellsRange(trs[0].cells[1],trs[0].cells[2]); +// ut.setSelected(cellsRange); +// range.setStart( trs[0].cells[1], 0 ).collapse( true ).select(); +// var ths = body.getElementsByTagName( 'th' ); +// editor.execCommand( 'insertunorderedlist', 'circle' ); /*插入无序列表*/ +// equal( ths[1].firstChild.tagName.toLowerCase(), 'ul', '查询无序列表' ); +// equal( ths[1].firstChild.style['listStyleType'], 'circle', '查询无序列表的类型' ); +// stop(); +// setTimeout(function() { +// editor.execCommand('source'); +// setTimeout(function() { +// editor.execCommand('source'); +// equal( body.getElementsByTagName('table').length, 1, '只有1个table' ); +// start(); +// },20); +// },20); +//} ); + +test('trace 3117:列表内后退两次', function () { + /*实际操作没问题,取range时会在将文本节点分为两个节点,后退操作无法实现*/ + if ((ua.browser.safari && !ua.browser.chrome))return 0; + var editor = te.obj[0]; + var range = te.obj[1]; + + var br = ua.browser.ie ? '
    ' : '
    '; + editor.setContent('
    1. hello

    '); + + range.setStart(editor.body.firstChild.lastChild.firstChild, 0).collapse(1).select(); + ua.manualDeleteFillData(editor.body); + ua.keydown(editor.body, {keyCode:8}); + var ol = editor.body.getElementsByTagName('ol'); + var lis = editor.body.getElementsByTagName('li'); + equal(lis.length, '1', '变成1个列表项'); + equal(ua.getChildHTML(editor.body.firstChild), '
  • hello

    ' + br + '

  • ', '检查列表内容'); +//TODO 1.2.6不严重bug注释 空style未删除 +// range.setStart(lis[0].lastChild,0).collapse(1).select(); +// ua.keydown(editor.body,{keyCode:8}); +// equal(ua.getChildHTML(editor.body),'
    1. hello

    '+br+'

    ','检查body内容'); + /*模拟不到光标跳到上一行?*/ +// range.setStart(editor.body.lastChild,0).collapse(1).select(); +// ua.keydown(editor.body,{keyCode:8}); +// equal(ua.getChildHTML(editor.body),'
    1. hello

    ','检查body内容'); + +}); + +/*trace 3136*/ +test('trace 3118:全选后backspace', function () { + /*实际操作没问题,取range时会在将文本节点分为两个节点,后退操作无法实现*/ + if ((ua.browser.safari && !ua.browser.chrome))return 0; + var editor = te.obj[0]; + var range = te.obj[1]; + + var br = ua.browser.ie ? '' : '
    '; + editor.setContent('
    1. hello

    '); + ua.keydown(editor.body, {'keyCode':65, 'ctrlKey':true}); + ua.keydown(editor.body, {keyCode:8}); + equal(ua.getChildHTML(editor.body), '

    ' + br + '

    ', ''); + ok(!editor.queryCommandState('insertorderedlist'), 'state是0'); + +}); + +test('trace 3126:1.2.5+列表重构新增标签,tab键', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + + var body = editor.body; + editor.setContent('

    hello1

    hello2

    hello3

    hello4

    '); + editor.execCommand('selectAll'); + editor.execCommand('insertorderedlist', 'cn2'); + var lis = body.getElementsByTagName('li'); + range.setStart(lis[1].firstChild, 0).setEnd(lis[2].firstChild, 1).select(); + ua.keydown(editor.body, {keyCode:9}); + var str = '
  • hello1

    1. hello2

    2. hello3

  • hello4

  • '; + ua.checkSameHtml(str, editor.body.firstChild.innerHTML.toLowerCase(), '有序列表---tab键'); + +}); + +test('trace 3132:单行列表backspace', function () { + /*实际操作没问题,取range时会在将文本节点分为两个节点,后退操作无法实现*/ + if ((ua.browser.safari && !ua.browser.chrome))return 0; + var editor = te.obj[0]; + var range = te.obj[1]; + + editor.setContent('

    '); + range.selectNode(editor.body.firstChild.firstChild.firstChild.firstChild).select(); + ua.keydown(editor.body, {keyCode:8}); + var space ='
    '; + equal(ua.getChildHTML(editor.body), '

    '+space+'

    ', ''); + +}); + +test('trace 3133:表格中插入列表再取消列表', function () { + /*实际操作没问题,取range时会在将文本节点分为两个节点,后退操作无法实现*/ + if ((ua.browser.safari && !ua.browser.chrome))return 0; + var editor = te.obj[0]; + var range = te.obj[1]; + + var body = editor.body; + var br = baidu.editor.browser.ie ? "" : "
    "; + editor.setContent('

    '); + /*插入一行一列的表格*/ + var tds = body.getElementsByTagName('td'); + range.setStart(tds[0], 0).collapse(1).select(); + editor.execCommand('insertorderedlist', 'num2'); + /*插入列表*/ + equal(tds[0].firstChild.tagName.toLowerCase(), 'ol', '查询列表的类型'); + equal(ua.getChildHTML(tds[0].firstChild), '

  • '); + editor.execCommand('insertorderedlist', 'num2'); + /*取消列表*/ + equal(ua.getChildHTML(tds[0]), '


    '); + ua.keydown(editor.body, {'keyCode':65, 'ctrlKey':true}); + /*ctrl+a*/ + ua.keydown(editor.body, {keyCode:8}); + /*backspace*/ + equal(ua.getChildHTML(editor.body), '

    ' + br + '

    ', ''); + +}); + +test('trace 3164:添加列表,取消列表', function () { + var editor = te.obj[0]; + var body = editor.body; + editor.setContent('

    hello1

    hello2

    hello3

    hello4

    '); + editor.execCommand('selectAll'); + editor.execCommand('insertunorderedlist', 'dash'); + equal(body.firstChild.tagName.toLowerCase(), 'ul', '检查无序列表'); + equal(body.firstChild.className, 'custom_dash list-paddingleft-1', '查询有序列表的类型'); + equal(editor.queryCommandValue('insertunorderedlist'), 'dash', '查询插入无序列表的结果'); + ok(editor.queryCommandState('insertunorderedlist'), 'state是1'); + editor.execCommand('selectAll'); + editor.execCommand('insertunorderedlist', 'dash'); + ua.checkHTMLSameStyle('

    hello1

    hello2

    hello3

    hello4

    ', editor.document, editor.body, '取消列表'); + equal(editor.queryCommandValue('insertunorderedlist'), null, '查询取消无序列表的结果'); + ok(!editor.queryCommandState('insertunorderedlist'), 'state是0'); +}); + +test('trace 3165:检查表格中列表tab键', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + setTimeout(function () { + editor.execCommand('inserttable'); + var tds = body.getElementsByTagName('td'); + range.setStart(tds[6], 0).collapse(1).select(); + editor.execCommand('insertorderedlist'); + equal(tds[6].firstChild.style['listStyleType'], 'decimal', '查询有序列表的类型'); + tds = body.getElementsByTagName('td'); + range.setStart(tds[5], 0).collapse(1).select(); + range = editor.selection.getRange(); + if(ua.browser.ie==9||ua.browser.ie==10) + equal(range.startContainer.tagName.toLowerCase(), 'td', 'tab键前光标位于td中'); + + else + equal(range.startContainer.parentNode.tagName.toLowerCase(), 'td', 'tab键前光标位于td中'); + ua.keydown(editor.body, {keyCode:9}); + setTimeout(function () { + range = editor.selection.getRange(); + if (!ua.browser.gecko && !ua.browser.ie && !ua.browser.webkit)//TODO 1.2.6 + equal(range.startContainer.parentNode.tagName.toLowerCase(), 'li', 'tab键后光标跳到有列表的单元格中'); + equal(tds[6].firstChild.style['listStyleType'], 'decimal', '检查有序列表的类型不应该被改变'); + start(); + }, 100); + }, 100); + stop(); +}); + +test('trace 3168:表格中列表更改样式', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.execCommand('inserttable'); + var tds = body.getElementsByTagName('td'); + tds[0].innerHTML = 'asdf'; + tds[1].innerHTML = '
    1. asd

    '; + setTimeout(function () { + var trs = editor.body.firstChild.getElementsByTagName('tr'); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[0].cells[0], trs[0].cells[1]); + ut.setSelected(cellsRange); + range.setStart(trs[0].cells[0], 0).collapse(true).select(); + + editor.execCommand('insertorderedlist', 'cn1'); + equal(tds[0].firstChild.className, 'custom_cn1 list-paddingleft-1', '查询有序列表的类型'); + equal(tds[1].firstChild.className, 'custom_cn1 list-paddingleft-1', '查询有序列表的类型'); + equal(editor.queryCommandValue('insertorderedlist'), 'cn1', '查询插入有序列表的结果'); + + editor.execCommand('insertunorderedlist', 'dot'); + equal(tds[0].firstChild.className, 'custom_dot list-paddingleft-1', '查询无序列表的类型'); + equal(tds[1].firstChild.className, 'custom_dot list-paddingleft-1', '查询无序列表的类型'); + equal(editor.queryCommandValue('insertunorderedlist'), 'dot', '查询插入无序列表的结果'); + start(); + }, 50); + stop(); +}); +//todo 1.2.6.1 +//test('trace 3213 3499:tab键后更改列表样式', function () { +// var div = document.body.appendChild(document.createElement('div')); +// div.id = 'ue'; +// var editor = UE.getEditor('ue'); +// editor.ready(function () { +// var range = new baidu.editor.dom.Range(editor.document); +// editor.setContent('
    1. hello1

    2. hello2

    3. hello1

    4. hello1

    '); +// var lis = editor.body.getElementsByTagName('li'); +// range.setStart(lis[2], 0).setEnd(lis[3], 1).select(); +// ua.keydown(editor.body, {keyCode:9}); +// ua.keydown(editor.body, {'keyCode':65, 'ctrlKey':true}); +// editor.execCommand('insertorderedlist', 'lower-alpha'); +// var str = '
    1. hello1

    2. hello2

    3. hello1

    4. hello1

    '; +// ua.checkSameHtml(str, editor.body.innerHTML.toLowerCase(), ''); +// UE.delEditor('ue'); +// start(); +// }); +// stop(); +//}); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/music.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/music.js new file mode 100644 index 000000000..c155a2d14 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/music.js @@ -0,0 +1,17 @@ +module( 'plugins.music' ); + +test( ' trace 3745 3780 音乐', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '

    hello

    ' ); + range.setStart(editor.body.firstChild,0).collapse(true).select(); + editor.execCommand( 'music',{url:"http://box.baidu.com/widget/flash/bdspacesong.swf?from=tiebasongwidget&url=…artist=%E5%BC%A0%E6%B6%A6%E8%B4%9E&extra=Vol.%202&autoPlay=false&loop=true"}); + stop(); + setTimeout(function(){ + ua.manualDeleteFillData(editor.body); + ua.checkSameHtml(editor.getContent(),'

    hello

    ',''); + equal(editor.body.firstChild.firstChild.tagName.toLowerCase(),'img'); + equal(editor.body.firstChild.firstChild.className,'edui-faked-music'); + start(); + },50); +} ); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/pagebreak.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/pagebreak.js new file mode 100644 index 000000000..151884868 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/pagebreak.js @@ -0,0 +1,148 @@ +module( 'plugins.pagebreak' ); + +/*trace 1179*/ +//TODO bug没有修复,暂时注释 +test( '对合并过单元格的表格分页', function () { + stop(); + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '

    ' ); + range.setStart( editor.body.firstChild, 0 ).collapse( true ).select(); + editor.execCommand( 'inserttable', {numCols:5, numRows:5} ); + var trs = editor.body.getElementsByTagName( 'tr' ); + range.setStart( trs[0].firstChild, 0 ).collapse( 1 ).select(); + + editor.currentSelectedArr = [trs[0].firstChild, trs[1].firstChild, trs[2].firstChild, trs[3].firstChild]; + editor.execCommand( 'mergecells' ); + editor.currentSelectedArr = [trs[1].childNodes[2], trs[1].childNodes[3], trs[2].childNodes[2], trs[2].childNodes[3]]; + editor.execCommand( 'mergecells' ); + range.setStart( trs[1].childNodes[1], 0 ).collapse( 1 ).select(); + + editor.execCommand( 'pagebreak' ); + var tables = editor.body.getElementsByTagName( 'table' ); + var tr1 = tables[0].getElementsByTagName( 'tr' ); + equal( tables.length, 2, '应当拆为2个table' ); + equal( tr1.length, 1, '第一个table只有一行' ); +// equal( $( tr1 ).attr( 'rowspan' ), 1, 'rowspan为1' ); +// +// tr1 = tables[1].getElementsByTagName( 'tr' ); +// equal( tr1.length, 3, '第2个table有3行' ); +// equal( $( tr1[0] ).attr( 'rowspan' ), 2, 'rowspan为2' ); + setTimeout( function () { + /*src中有延时操作*/ + start(); + }, 200 ); +} ); + +test( '对第一行的单元格进行分页', function () { + stop(); + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '

    ' ); + range.setStart( editor.body.firstChild, 0 ).collapse( true ).select(); + editor.execCommand( 'inserttable', {numCols:5, numRows:5} ); + var tds = editor.body.getElementsByTagName( 'td' ); + range.setStart( tds[1], 0 ).collapse( 1 ).select(); + var table = editor.body.getElementsByTagName( 'table' )[0]; + var tablehtml = ua.getChildHTML( table ); + + editor.execCommand( 'pagebreak' ); + var hr = editor.body.firstChild; + equal( ua.getChildHTML( editor.body.getElementsByTagName( 'table' )[0] ), tablehtml, '表格没发生变化' ); + equal( $( hr ).attr( 'class' ), 'pagebreak', '插入一个分页符' ); + equal( hr.tagName.toLowerCase(), 'hr', 'hr' ); + setTimeout( function () { +/*trace 2383*/ +// range.setStart( tds[1], 0 ).collapse( 1 ).select(); +// editor.execCommand( 'pagebreak' ); +// range.setStart( tds[1], 0 ).collapse( 1 ).select(); +// editor.execCommand( 'pagebreak' ); +// editor.execCommand('source'); +// editor.execCommand('source'); +// var hr = editor.body.getElementsByTagName( 'hr' ); +// equal( ua.getChildHTML( editor.body.getElementsByTagName( 'table' )[0] ), tablehtml, '表格没发生变化' ); +// equal( $( hr[0] ).attr( 'class' ), 'pagebreak', '插入一个分页符' ); +// equal( hr.length, 3, 'hr' ); + start(); + }, 200 ); +} ); + +test( '对最后一行的单元格进行分页', function () { + stop(); + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '

    ' ); + range.setStart( editor.body.firstChild, 0 ).collapse( true ).select(); + editor.execCommand( 'inserttable', {numCols:5, numRows:5} ); + var tds = editor.body.getElementsByTagName( 'td' ); + /*最后一行的单元格*/ + range.setStart( tds[24], 0 ).collapse( 1 ).select(); + editor.execCommand( 'pagebreak' ); + var ts = editor.body.getElementsByTagName( 'table' ); + var hr = editor.body.childNodes[1]; + equal( ts[0].getElementsByTagName( 'tr' ).length, 4, '第一个table 4行' ); + equal( ts[1].getElementsByTagName( 'tr' ).length, 1, '第2个table 1行' ); + equal( $( hr ).attr( 'class' ), 'pagebreak', '插入一个分页符' ); + equal( hr.tagName.toLowerCase(), 'hr', '插入的分页符是hr' ); + setTimeout( function () { + start(); + }, 200 ); +} ); + +test( '在段落中间闭合插入分页符', function () { + stop(); + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent( '

    你好Ueditor

    ' ); + range.setStart( editor.body.firstChild.firstChild, 2 ).collapse( true ).select(); + editor.execCommand( 'pagebreak' ); + ua.manualDeleteFillData( editor.body ); + equal( body.childNodes.length, 3, '3个孩子' ); + equal( ua.getChildHTML( body.firstChild ), '你好' ); + equal( body.firstChild.tagName.toLowerCase(), 'p', '第一个孩子是p' ); + equal( $( body.firstChild.nextSibling ).attr( 'class' ), 'pagebreak' ); + equal( ua.getChildHTML( body.lastChild ), 'ueditor' ); + equal( body.lastChild.tagName.toLowerCase(), 'p', '第二个孩子是p' ); + setTimeout( function () { + start(); + }, 100 ); +} ); + +test( '选中部分段落再插入分页符', function () { + stop(); + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent( '

    你好Ueditor

    hello编辑器

    ' ); + range.setStart( body.firstChild.firstChild, 2 ).setEnd( body.lastChild.firstChild, 5 ).select(); + editor.execCommand( 'pagebreak' ); + ua.manualDeleteFillData( editor.body ); + equal( body.childNodes.length, 3, '3个孩子' ); + equal( ua.getChildHTML( body.firstChild ), '你好' ); + equal( $( body.firstChild.nextSibling ).attr( 'class' ), 'pagebreak' ); + equal( ua.getChildHTML( body.lastChild ), '编辑器' ); + equal( body.firstChild.tagName.toLowerCase(), 'p', '第一个孩子是p' ); + equal( body.lastChild.tagName.toLowerCase(), 'p', '第二个孩子是p' ); + setTimeout( function () { + start(); + }, 200 ); +} ); + +test( 'trace 1887:连续插入2次分页符,每次插入都在文本后面', function () { + stop(); + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent( '

    你好

    ' ); + range.setStart( body.firstChild, 1 ).collapse( 1 ).select(); + editor.execCommand('pagebreak'); + range.setStart( body.firstChild, 1 ).collapse( 1 ).select(); + editor.execCommand('pagebreak'); + equal(body.childNodes.length,3,'3个孩子'); + //trace 1187,chrome和firefox下都会有br,目前的做法是第二次插入就把前一个删除 + equal(body.childNodes[1].childNodes.length,0,'hr没有孩子节点'); + setTimeout( function () { + start(); + }, 200 ); +} ); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/paragraph.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/paragraph.js new file mode 100644 index 000000000..30388c9e4 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/paragraph.js @@ -0,0 +1,107 @@ +module( "plugins.paragraph" ); +/** + * h1和p之间的转换 + * 表格中添加p和h1 + * 列表里加h1 + * 传入2个参数,style和attrs + */ + +test( '不闭合h1和p之间的转换', function() { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent( '

    hello

    ' ); + setTimeout(function(){ + range.selectNode( body.firstChild.firstChild ).select(); + /*p===>h1*/ + editor.execCommand( 'paragraph', 'h1' ); + equal( ua.getChildHTML( body ), '

    hello

    ' ); + equal( editor.queryCommandValue( 'paragraph' ), 'h1', '当前的blcok元素为h1' ); + /*h1===>p*/ + range.selectNode( body.firstChild.firstChild ).select(); + editor.execCommand( 'paragraph', 'p' ); + equal( ua.getChildHTML( body ), '

    hello

    ' ); + /*多个段落的部分文本*/ + editor.setContent( '

    hello

    hello2

    ' ); + setTimeout(function(){ + range.setStart( body.firstChild.firstChild, 2 ).setEnd( body.lastChild.firstChild, 1 ).select(); + editor.execCommand( 'paragraph', 'h3' ); + equal( ua.getChildHTML( body ), '

    hello

    hello2

    ' ); + equal( editor.queryCommandValue( 'paragraph' ), 'h3', '当前的blcok元素为h3' ); + start(); + },50); + },50); + stop(); +} ); + +test( '闭合h1和p之间的转换', function() { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent( '

    hello

    hello2

    ' ); + setTimeout(function(){ + range.setStart( body.firstChild.firstChild, 1 ).collapse( 1 ).select(); + /*p===>h1*/ + editor.execCommand( 'paragraph', 'h1' ); + equal( ua.getChildHTML( body ), '

    hello

    hello2

    ' ); + /*h1===>p*/ + range.setStart( body.firstChild.firstChild, 1 ).collapse( 1 ).select(); + editor.execCommand( 'paragraph', 'p' ); + equal( ua.getChildHTML( body ), '

    hello

    hello2

    ' ); + equal( editor.queryCommandValue( 'paragraph' ), 'p', '当前的blcok元素为p' ); + start(); + },50); + +stop(); +} ); + + +/*如果是h1===>p并且传参的话,h1不会变化。因为这段代码的操作是为了indent和justify做的,传入参数p只是为了好处理,所以不支持h1变为p*/ +test( '传入段落的样式', function() { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent( '

    hello

    hello2

    ' ); + setTimeout(function(){ + range.setStart( body.firstChild.firstChild, 1 ).collapse( 1 ).select(); + /*p===>p,但是变化了样式*/ + editor.execCommand( 'paragraph', 'p', {style:'text-indent:2em'} ); + equal( body.firstChild.style.textIndent, '2em', '改变了第一个孩子的缩进量' ); + equal( body.firstChild.tagName.toLowerCase(), 'p', 'tagName仍然是p' ); + + /*p===>h4,但是变化了样式*/ + editor.execCommand( 'paragraph', 'h4', {style:'text-indent:3em'} ); + equal( body.firstChild.style['textIndent'], '3em', '改变了第一个孩子的缩进量' ); + equal( body.firstChild.tagName.toLowerCase(), 'h4', 'tagName是h4' ); + start(); +},50); + +stop(); +} ); + + +test( '对表格设置样式', function() { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent( '

    hello1

    ' ); + setTimeout(function(){ + var tds = body.getElementsByTagName( 'td' ); + range.setStart( tds[0].firstChild, 0 ).collapse( 1 ).select(); + editor.currentSelectedArr = [tds[0]]; + /*h4===>p,但是变化了样式*/ + editor.execCommand( 'paragraph', 'p', {style:'text-indent:3em'} ); + equal( tds[0].firstChild.style['textIndent'], '3em', '改变了第一个孩子的缩进量' ); + equal( tds[0].firstChild.tagName.toLowerCase(), 'h1', 'tagName仍然是h1' ); + range.setStart( tds[1], 0 ).collapse( 1 ).select(); + editor.currentSelectedArr = [tds[1]]; + editor.execCommand( 'paragraph', 'p', {style:'text-indent:3em'} ); +// ua.manualDeleteFillData( editor.body ); + ua.clearWhiteNode(tds[1]); + equal( tds[1].firstChild.style['textIndent'], '3em', '改变了第一个孩子的缩进量' ); + equal( tds[1].firstChild.tagName.toLowerCase(), 'p', 'tagName是p' ); + start(); + },50); + + stop(); +} ); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/paste.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/paste.js new file mode 100644 index 000000000..3dddcaa1d --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/paste.js @@ -0,0 +1,78 @@ +module( 'plugins.paste' ); + +//不能模拟出真实的粘贴效果,此用例用于检查中间值 +test( '粘贴', function() { + if(ua.browser.ie || ua.browser.opera)return; + var div = document.body.appendChild( document.createElement( 'div' ) ); + $( div ).css( 'width', '500px' ).css( 'height', '500px' ).css( 'border', '1px solid #ccc' ); + var me = te.obj[2]; + me.render(div); + stop(); + me.ready(function(){ + var range = new baidu.editor.dom.Range( te.obj[2].document ); + me.focus(); + me.setContent('

    hello

    '); + range.setStart(me.body.firstChild,0).collapse(true).select(); + ua.keydown(me.body,{'keyCode':65,'ctrlKey':true}); + ua.keydown(me.body,{'keyCode':67,'ctrlKey':true}); + setTimeout(function(){ + me.focus(); + range.setStart(me.body.firstChild,0).collapse(true).select(); + ua.paste(me.body,{'keyCode':86,'ctrlKey':true}); + equal(me.body.lastChild.id,'baidu_pastebin','检查id'); + equal(me.body.lastChild.style.position,'absolute','检查style'); + div.parentNode.removeChild(div); + start(); + },50); + stop(); + }); +} ); +//me.fireEvent('pasteTransfer','paste');//todo +test( 'getClipboardData--ctrl+v', function() { +// var editor = new baidu.editor.Editor( {'plugins':['paste']} ) +// var div = te.dom[0]; +// editor.render( div ); +// editor.focus(); +// editor.setContent( '

    你好

    ' ) +// var doc = editor.document; +// var r = new baidu.editor.dom.Range( doc ); +// /*从word中粘贴的未经过滤的列表*/ +// var html = '

    l  列表1

    l  列表2

    '; +// te.setClipData( html ); +// r.setStart( editor.body.firstChild, 1 ).collapse( 1 ).select(); +// editor.focus(); +// te.presskey( 'ctrl', 'v' ); +// editor.focus(); +// setTimeout( function() { +// equal( editor.body.firstChild.innerHTML, html ); +// start(); +// } ); +// stop(); + equal('','',''); +} ); + +//需要点击授权弹出框,暂时去除 +//test('检查IE下粘贴命令是否执行正常', function () { +// +// if (browser.ie) { +// var editor = te.obj[0]; +// editor.setContent('

    hello

    '); +// editor.focus(); +// +// editor.execCommand('selectall'); +// editor.body.document.execCommand('copy'); +// editor.setContent('

    test

    '); +// editor.execCommand('selectall'); +// editor.execCommand('paste'); +// +// setTimeout(function(){ +// equal(utils.trim(editor.getContent().replace('

    ', '').replace('

     

    ', '')), '

    hello

    ', '检查html内容,IE下成功粘贴内容'); +// equal(utils.trim(editor.getContentTxt()), 'hello', '检查text内容,IE下成功粘贴内容'); +// start(); +// },100); +// +// stop(); +// } +// +//}); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/preview.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/preview.js new file mode 100644 index 000000000..2f50056a6 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/preview.js @@ -0,0 +1,22 @@ +module('plugins.preview'); + +test('插入代码后预览',function(){ +// var editor = te.obj[0]; +// var body = editor.body; +// var html = '
    1.  function addSpace(linenum){
    2.          if(linenum<10){
    3.              return "&nbsp;&nbsp;";
    4.          }else if(linenum>=10 && linenum<100){
    5.              return "&nbsp;";
    6.          }else if(linenum>=100 && linenum<1000){
    7.              return "";
    8.          }
    9.      }
    '; +// editor.setContent(html); +// editor.execCommand('preview'); +// ua.checkSameHtml(body.innerHTML,html,'预览不会对页面代码产生影响'); + equal('',''); +}); +//test('设置内容后后预览',function(){ +// if(ua.browser.gecko)return;//ff总不停打开窗口,实际操作没问题 +// var editor = te.obj[0]; +// var body = editor.body; +// var html = '

    你好,我亲爱的朋

    '; +// var html_ie10 ="

    你好,我亲爱的朋

    "; +// editor.setContent(html); +// editor.focus(); +// editor.execCommand('preview'); +// ua.checkSameHtml(body.innerHTML,(ua.browser.ie>8)?html_ie10:html,'预览不会对页面代码产生影响'); +//}); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/print.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/print.js new file mode 100644 index 000000000..f5c47b0c8 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/print.js @@ -0,0 +1,17 @@ +/** + * Created by JetBrains PhpStorm. + * User: dongyancen + * Date: 12-9-28 + * Time: 下午1:34 + * To change this template use File | Settings | File Templates. + */ +module('plugins.print'); + +test('print',function(){ +// var editor = te.obj[0]; +// var html = '

    for print

    '; +// editor.setContent(html); +// editor.execCommand('print'); +// equal(editor.body.innerHTML,html,'打印不会对页面代码产生影响'); + equal('',''); +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/removeformat.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/removeformat.js new file mode 100644 index 000000000..b785e49bc --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/removeformat.js @@ -0,0 +1,97 @@ +module( "plugins.removeformat" ); + +/*trace 860*/ +test( 'trace 860:对包含超链接的段落清除样式', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '

    hellobaidu

    ' ); + range.setStart( editor.body.firstChild.firstChild.nextSibling.firstChild, 2 ).collapse( true ).select(); + editor.execCommand( 'removeformat' ); + equal( editor.getContent(), '

    hellobaidu

    ', '对包含超链接的段落去除样式' ); +} ); + +/*trace 800*/ +test( 'trace 800:清除超链接的颜色', function () { + var editor = te.obj[0]; + var range = te.obj[1]; +// var editor = te.obj[2]; +// var div = document.body.appendChild( document.createElement( 'div' ) ); +// $( div ).css( 'width', '500px' ).css( 'height', '500px' ).css( 'border', '1px solid #ccc' ); +// editor.render(div); +// stop(); +// setTimeout(function(){ +// var range = new baidu.editor.dom.Range( te.obj[2].document ); + editor.setContent('baidu'); + range.selectNode(editor.body.firstChild).select(); + editor.execCommand( 'forecolor', 'rgb(255,0,0)' ); + var html = 'baidu'; + ua.checkHTMLSameStyle( html, editor.document, editor.body.firstChild, '查看加了颜色后超链接的样式' ); + editor.execCommand( 'removeformat' ); + var cl = ua.browser.ie && ua.browser.ie == 8 ? 'class=\"\"' : ""; + html = 'baidu'; + if(!ua.browser.ie)//TODO 1.2.6 + ua.checkHTMLSameStyle( html, editor.document, editor.body.firstChild, '查看清除样式后超链接的样式' ); +// div.parentNode.removeChild(div); +// start(); +// },500); +} ); + +test( '清除颜色的区域有多个inline元素嵌套', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent( '

    hello1

    hello2

    ' ); + var strs = body.getElementsByTagName( 'strong' ); + range.setStart( strs[0].firstChild, 2 ).setEnd( strs[1].firstChild.firstChild, 3 ).select(); + editor.execCommand( 'removeformat' ); + equal( ua.getChildHTML( body ), '

    hello1

    hello2

    ' ); +} ); + +test( '指定删除某一个style', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent( '

    hello1

    hello2

    ' ); + var strs = body.getElementsByTagName( 'strong' ); + range.setStart( strs[0].firstChild, 2 ).setEnd( strs[1].firstChild.firstChild, 3 ).select(); + /*只删除span的color style*/ + editor.execCommand( 'removeformat', 'span', 'color' ); + var html = '

    hello1

    hello2

    '; + ua.checkHTMLSameStyle( html, editor.document, body, '检查去除特定标签的样式的结果' ); +} ); + +test( '指定删除的元素删除属性后是空元素', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent( '

    hello2

    ' ); + range.setStart( body.firstChild, 0 ).collapse( 1 ).select(); + editor.execCommand( 'removeformat', 'span', 'color' ); + ua.checkHTMLSameStyle('hello2',editor.document,body.firstChild,'清除span corlor'); +} ); + +test( '闭合方式清除样式', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent( '

    hello1

    hello2

    ' ); + range.setStart( body.firstChild.firstChild, 0 ).collapse( 1 ).select(); + editor.execCommand( 'removeformat' ); + equal( ua.getChildHTML( body ), '

    hello1

    hello2

    ' ); +} ); + +//TODO 1.2.6 fixed in future +//test( 'trace 3294:移除表格中的样式', function () { +// var editor = te.obj[0]; +// var range = te.obj[1]; +// editor.setContent( '
    表格文本1表格文本2
    ' ); +// var trs = editor.body.firstChild.getElementsByTagName( 'tr' ); +// var ut = editor.getUETable(editor.body.firstChild); +// var cellsRange = ut.getCellsRange(trs[0].cells[0],trs[0].cells[1]); +// ut.setSelected(cellsRange); +// range.setStart( trs[0].cells[0], 0 ).collapse( true ).select(); +// editor.execCommand( 'removeformat' ); +// equal( ua.getChildHTML( trs[0].cells[0] ), '表格文本1', '第一个表格的span被清除了' ); +// equal( ua.getChildHTML( trs[0].cells[1] ), '表格文本2', '第二个表格的span被清除了' ); +//} ); + diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/rowspacing.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/rowspacing.js new file mode 100644 index 000000000..060295251 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/rowspacing.js @@ -0,0 +1,312 @@ +module( 'plugins.rowspacing' ); + +/*trace 1029*/ +test( '设置段前距查看状态反射', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '

    hello1

    hello2

    ' ); + stop(); + setTimeout(function () { + range.setStart( editor.body.firstChild, 0 ).setEnd( editor.body.lastChild, 1 ).select(); + editor.execCommand( 'rowspacing', 15 ,'top'); + equal( editor.queryCommandValue( 'rowspacing' ,'top'), 15, '查看段前距' ); + /*光标闭合时查看状态反射*/ + range.setStart( editor.body.firstChild.firstChild, 1 ).collapse( true ).select(); + equal( editor.queryCommandValue( 'rowspacing','top' ), 15, '查看段前距' ); + start(); + }, 50); +} ); + +/*trace 1035*/ +test( '非闭合清除段前距等样式,查看状态反射', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '

    hello1

    hello2

    ' ); + + range.setStart(editor.body.firstChild, 0).setEnd(editor.body.lastChild, 1).select(); + editor.execCommand('rowspacing', 20, 'top'); + equal(editor.queryCommandValue('rowspacing', 'top'), 20, '段前距为2.0'); + +} ); + +test( '闭合清除段前距等样式,查看状态反射', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '

    hello1

    hello2

    ' ); + range.setStart( editor.body.firstChild, 0 ).collapse( true ).select(); + editor.execCommand( 'rowspacing', 20 ,'top'); + equal( editor.queryCommandValue( 'rowspacing','top' ), 20, '段前距为2.0' ); + range.setStart( editor.body.firstChild, 0 ).collapse( true ).select(); + editor.execCommand( 'removeformat' ); + equal( editor.queryCommandValue( 'rowspacing' ,'top'), 5, '闭合清除格式后,段前距为5' ); +} ); + +/*trace 1026*/ +test( '设置段后距后设置字体颜色', function () { + var editor = te.obj[0]; + var range = te.obj[1]; +// var editor = te.obj[2]; +// var div = document.body.appendChild( document.createElement( 'div' ) ); +// $( div ).css( 'width', '500px' ).css( 'height', '500px' ).css( 'border', '1px solid #ccc' ); +// editor.render(div); + stop(); +// setTimeout(function(){ +// var range = new baidu.editor.dom.Range( editor.document ); + editor.setContent( '

    hello1hello

    hello2

    ' ); + range.setStart( editor.body.firstChild, 0 ).setEnd( editor.body.lastChild, 1 ).select(); + editor.execCommand( 'rowspacing', 15 ,'bottom'); + setTimeout(function(){ + editor.execCommand( 'forecolor', 'rgb(255,0,0)' ); + equal( editor.queryCommandValue( 'rowspacing' ,'bottom'), 15, '查看段后距' ); + /*闭合的方式去查看行距的状态反射*/ + range.setStart( editor.body.firstChild.firstChild, 1 ).collapse( true ).select(); + equal( editor.queryCommandValue( 'rowspacing' ,'bottom'), 15, '查看段后距' ); +// div.parentNode.removeChild(div); + start(); + },50); +// },50); +} ); + +test( '设置段后距后设置加粗等多种样式', function () { + var editor = te.obj[0]; + var range = te.obj[1]; +// var editor = te.obj[2]; +// var div = document.body.appendChild( document.createElement( 'div' ) ); +// $( div ).css( 'width', '500px' ).css( 'height', '500px' ).css( 'border', '1px solid #ccc' ); +// editor.render(div); + stop(); +// editor.ready(function(){ + setTimeout(function(){ +// var range = new baidu.editor.dom.Range( editor.document ); + editor.setContent( '

    hello1

    hello2

    ' ); + setTimeout(function(){ + range.setStart( editor.body.firstChild, 0 ).setEnd( editor.body.lastChild, 1 ).select(); + editor.execCommand( 'rowspacing', 15 ,'bottom'); + setTimeout(function(){ + editor.execCommand( 'bold' ); + editor.execCommand( 'underline' ); + equal( editor.queryCommandValue( 'rowspacing' ,'bottom'), 15, '查看段后距' ); +// div.parentNode.removeChild(div); + start(); + },50); + },50); + },100); +// }); +} ); + +test( '非闭合去除加粗等样式', function () { + var editor = te.obj[0]; + var range = te.obj[1]; +// var editor = te.obj[2]; +// var div = document.body.appendChild( document.createElement( 'div' ) ); +// $( div ).css( 'width', '500px' ).css( 'height', '500px' ).css( 'border', '1px solid #ccc' ); +// editor.render(div); + stop(); +// editor.ready(function(){ +// setTimeout(function(){ +// var range = new baidu.editor.dom.Range( editor.document ); + editor.setContent( '

    hello1

    hello2

    ' ); + setTimeout(function(){ + range.setStart( editor.body.firstChild, 0 ).setEnd( editor.body.lastChild, 1 ).select(); + editor.execCommand( 'rowspacing', 15 ,'bottom'); + setTimeout(function(){ + editor.execCommand( 'bold' ); + editor.execCommand( 'underline' ); + equal( editor.queryCommandValue( 'rowspacing' ,'bottom'), 15, '查看段后距' ); + editor.execCommand( 'removeformat' ); + equal( editor.queryCommandValue( 'rowspacing' ,'bottom'), 5, '去除样式后查看段后距' ); +// div.parentNode.removeChild(div); + start(); + },50); + },50); +// },100); +// }); +} ); + +test( '闭合去除样式', function () { + var editor = te.obj[0]; + var range = te.obj[1]; +// var editor = te.obj[2]; +// var div = document.body.appendChild( document.createElement( 'div' ) ); +// $( div ).css( 'width', '500px' ).css( 'height', '500px' ).css( 'border', '1px solid #ccc' ); +// editor.render(div); + stop(); +// editor.ready(function(){ +// +// var range = new baidu.editor.dom.Range( editor.document ); + editor.setContent( '

    hello1

    hello2

    ' ); + setTimeout(function(){ + range.setStart( editor.body.firstChild, 0 ).setEnd( editor.body.lastChild, 1 ).select(); + editor.execCommand( 'rowspacing', 15 ,'bottom'); + setTimeout(function(){ + editor.execCommand( 'bold' ); + editor.execCommand( 'underline' ); + /*采用闭合的方式查询段后距, + 介个好像用手选不太能选的出来,总是会选到里面去*/ + range.setStart( editor.body.firstChild, 0 ).collapse( true ).select(); + equal( editor.queryCommandValue( 'rowspacing','bottom' ), 15, '查看段后距' ); + /*闭合方式鼠标放在第二个p中*/ + range.setStart( editor.body.lastChild, 0 ).collapse( true ).select(); + equal( editor.queryCommandValue( 'rowspacing' ,'bottom'), 15, '查看段后距' ); + editor.execCommand( 'removeformat' ); + //1.2后改 + equal( editor.queryCommandValue( 'rowspacing' ,'bottom'), 5, '去除样式后查看段后距' ); + /*第一行的样式应当仍然在*/ + range.setStart( editor.body.firstChild, 0 ).collapse( true ).select(); + equal( editor.queryCommandValue( 'rowspacing' ,'bottom'), 15, '查看段后距' ); +// div.parentNode.removeChild(div); + start(); + },50); + },50); +// }); +} ); + +test( '表格中设置段距', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '
    hello1hello2
    ' ); + stop(); + setTimeout(function () { + var tds = editor.body.firstChild.getElementsByTagName('td'); + /*选中表格中的文本设置段前距*/ + range.selectNode(tds[0].firstChild).select(); + editor.execCommand('rowspacing', 20, 'top'); + equal(editor.queryCommandValue('rowspacing', 'top'), 20, '设置表格中文本段前距为2'); + /*采用闭合的方式查询段前距*/ + setTimeout(function () { + range.setStart(tds[0].firstChild.firstChild, 1).collapse(true).select(); + equal(editor.queryCommandValue('rowspacing', 'top'), 20, '设置表格中文本段前距为2'); + + /*闭合在表格中的文本设置段后距*/ + range.setStart(tds[1].firstChild, 1).collapse(true).select(); + editor.execCommand('rowspacing', 15, 'bottom'); + /*选中整个单元格查询段后距*/ + range.selectNode(tds[1]).select(); + equal(editor.queryCommandValue('rowspacing', 'bottom'), 15, '设置表格中文本段后距为1.5'); + /*闭合在空白单元格中设置段后距*/ + range.setStart(tds[2], 0).collapse(true).select(); + editor.execCommand('rowspacing', 25, 'bottom'); + equal(editor.queryCommandValue('rowspacing', 'bottom'), 25, '设置表格中文本段后距为2.5'); + start(); + }, 50); + }, 50); +}); + +test('跨多个单元格设置段前距', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('
    hello1hello2
    hello3

    hello4

    '); + stop(); + setTimeout(function () { + var tds = editor.body.firstChild.getElementsByTagName('td'); + var p = editor.body.getElementsByTagName('p'); + range.selectNode(editor.body.firstChild).select(); + editor.execCommand('rowspacing', 15, 'top'); + for (var index = 0; index < tds.length; index++) { + range.selectNode(tds[index]).select(); + equal(editor.queryCommandValue('rowspacing', 'top'), 15, '设置表格中文本段前距为1.5'); + /*会自动在非block元素外面套p*/ + //1.2版本,加在p上 + equal(p[index].style['marginTop'], '15px', '段前距属性都是加在第一个孩子节点上'); + } + start(); + }, 50); +} ); + +/*trace 1052*/ +test( '对插入的代码设置多倍段前距', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '

    ' ); + stop(); + setTimeout(function () { + range.setStart( editor.body.firstChild, 0 ).collapse( true ).select(); + var stylecode = "var tds = editor.body.firstChild.getElementsByTagName( 'td' );\n range.selectNode( editor.body.firstChild ).select();"; + editor.execCommand( 'inserthtml', "
    " + stylecode + "
    " ); + equal( editor.body.firstChild.tagName.toLowerCase(), 'pre', '第一个孩子节点为pre' ); + range.selectNode( editor.body.firstChild ).select(); + editor.execCommand( 'rowspacing', 20,'top' ); + var pre = editor.body.firstChild; + equal( pre.tagName.toLowerCase(), 'pre', '不允许将p换成pre' ); + equal( pre.style['borderWidth'], '1px', '宽度' ); + ok( pre.style['borderColor'].toUpperCase() == '#CCCCCC' || pre.style['borderColor'] == 'rgb(204, 204, 204)', '颜色' ); + start(); + }, 50); +} ); + +test( '在合并单元格中设置多倍段前距', function () { + var editor = new baidu.editor.Editor({'autoFloatEnabled':false}); + stop(); + setTimeout( function () { + var div = document.body.appendChild( document.createElement( 'div' ) ); + te.dom.push( div ); + editor.render( div ); + + setTimeout(function () { + editor.setContent('

    '); + var range = new baidu.editor.dom.Range(editor.document); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable', {numCols:3, numRows:3}); + stop(); + /*insertHTML有一个200ms的超时函数*/ + setTimeout(function () { + ua.manualDeleteFillData(editor.body); + var trs = editor.body.getElementsByTagName('tr'); + range.setStart(trs[0].firstChild, 0).setEnd(trs[1].firstChild, 0).select(); + editor.currentSelectedArr = [trs[0].firstChild, trs[1].firstChild]; + editor.execCommand('mergecells'); + /*合并单元格后设置这个单元格多倍段前距*/ + ua.manualDeleteFillData(editor.body); + range.setStart(trs[0].firstChild, 0).collapse(true).select(); + editor.execCommand('rowspacing', 20, 'top'); + ua.manualDeleteFillData(editor.body); + equal(trs[0].firstChild.firstChild.tagName.toLowerCase(), 'p', 'td下面创建了一个p'); + equal(trs[0].firstChild.firstChild.style['marginTop'], '20px', 'p设置了2倍行距'); + trs = editor.body.firstChild.getElementsByTagName('tr'); + equal(trs.length, 3, '3行'); + var tbodyChild = editor.body.getElementsByTagName('tbody')[0].childNodes; + for (var index = 0; index < tbodyChild.length; index++) { + equal(tbodyChild[index].tagName.toLowerCase(), 'tr', 'tbody下面都是tr'); + } + start(); + }, 30); + }, 300); + },50); +} ); + +/*trace 1079*/ +test( '合并单元格后设置多个单元格多倍段前距', function () { + var editor = new baidu.editor.Editor( {'plugins':['table'],'autoFloatEnabled':false} ); + stop(); + setTimeout(function () { + var div = document.body.appendChild(document.createElement('div')); + te.dom.push(div); + editor.render(div); + setTimeout(function () { + editor.setContent('

    '); + var range = new baidu.editor.dom.Range(editor.document); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable', {numCols:3, numRows:3}); + + setTimeout(function () { + ua.manualDeleteFillData(editor.body); + var trs = editor.body.firstChild.getElementsByTagName('tr'); + /*合并第一列前2个单元格*/ + range.setStart(trs[0].firstChild, 0).setEnd(trs[1].firstChild, 0).select(); + editor.currentSelectedArr = [trs[0].firstChild, trs[1].firstChild]; + editor.execCommand('mergecells'); + /*设置多倍段前距*/ + range.setStart(trs[0].firstChild, 0).setEnd(trs[2].firstChild, 0).select(); + editor.currentSelectedArr = [trs[0].firstChild, trs[1].firstChild, trs[2].firstChild]; + editor.execCommand('rowspacing', 20, 'top'); + trs = editor.body.firstChild.getElementsByTagName('tr'); + equal(trs.length, 3, '3行'); + var tbodyChild = editor.body.getElementsByTagName('tbody')[0].childNodes; + for (var index = 0; index < tbodyChild.length; index++) { + equal(tbodyChild[index].tagName.toLowerCase(), 'tr', 'tbody下面都是tr'); + } + start(); + }, 50); + }, 300); + },50); +} ); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/scrawl.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/scrawl.js new file mode 100644 index 000000000..e5afbce85 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/scrawl.js @@ -0,0 +1,18 @@ +/** + * Created with JetBrains PhpStorm. + * User: luqiong + * Date: 12-11-13 + * Time: 下午2:13 + * To change this template use File | Settings | File Templates. + */ + +module( 'plugins.scrawl' ); +test( '检查高亮', function() { + var editor = te.obj[0]; + editor.focus(); + equal( editor.queryCommandState( 'scrawl' ), ( browser.ie && browser.version <= 8 ) ? -1:0, 'check scrawl state' ); +} ); + + + + diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/searchreplace.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/searchreplace.js new file mode 100644 index 000000000..871cdc836 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/searchreplace.js @@ -0,0 +1,122 @@ +module('plugins.searchreplace'); + +test('trace 3381:查找',function(){ + if(ua.browser.opera) + return; + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    hello啊

    '); + stop(); + setTimeout(function(){ + range.setStart(editor.body.firstChild,0).collapse(true).select(); + var num = editor.execCommand('searchreplace',{searchStr:'啊'}); + + ua.manualDeleteFillData(editor.body); + equal(editor.body.firstChild.innerHTML,'hello啊'); + + equal(editor.selection.getRange().collapsed,false,'检查选区:不闭合为找到'); + start(); + },20); +}); +// +///*trace 974,先替换再撤销再全部替换,则不会替换 +//* ie下会出现的bug*/ +test(' trace 3697全部替换',function(){ + //todo trace 3697 + if(ua.browser.opera) + return; + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    欢迎回来

    '); + range.setStart(editor.body.firstChild,0).collapse(true).select(); + editor.execCommand('searchreplace',{searchStr:'欢迎',replaceStr:'你好'}); + editor.undoManger.undo(); + editor.execCommand('searchreplace',{searchStr:'欢迎',replaceStr:'你好',all:true}); + ua.manualDeleteFillData(editor.body); + equal(editor.body.firstChild.innerHTML,'你好回来'); +}); + +///*trace 917*/ +///*trace 3288*/todo +//test('替换内容包含查找内容,全部替换',function(){ +// if(ua.browser.opera) +// return; +// var editor = te.obj[0]; +// var range = te.obj[1]; +// editor.setContent('

    hello回来

    '); +// range.setStart(editor.body.firstChild,0).collapse(true).select(); +// /*searchreplace文件里是一个闭包,闭包中有一个全局变量currentRange,在上一次用例执行结束后仍然会保存这个值,导致下一次用例受影响*/ +// editor.execCommand('searchreplace',{searchStr:'hello',replaceStr:'hello啊',all:true}); +// ua.manualDeleteFillData(editor.body); +// equal(editor.body.firstChild.innerHTML,'hello啊回来'); +//}); + +/*trace 973*/ +test(' trace 3697替换内容包含查找内容',function(){ + if(ua.browser.opera) + return; + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    欢迎回来

    '); + range.setStart(editor.body.firstChild,0).collapse(1).select(); + editor.execCommand('searchreplace',{searchStr:'欢迎',replaceStr:'欢迎啊'}); + ua.manualDeleteFillData(editor.body); + equal(editor.body.firstChild.innerHTML,'欢迎啊回来'); + editor.undoManger.undo(); + ua.manualDeleteFillData(editor.body); + equal(editor.body.firstChild.innerHTML,'欢迎回来'); +}); +// +///*trace 1286*/todo +//test('连续2次全部替换',function(){ +// if(ua.browser.opera) +// return; +// var editor = te.obj[0]; +// editor.setContent('

    欢迎回来

    '); +// editor.execCommand('searchreplace',{searchStr:'欢迎',replaceStr:'欢迎啊',all:true}); +// ua.manualDeleteFillData(editor.body); +// equal(editor.body.firstChild.innerHTML,'欢迎啊回来'); +// editor.execCommand('searchreplace',{searchStr:'欢迎',replaceStr:'欢迎啊',all:true}); +// ua.manualDeleteFillData(editor.body); +// equal(editor.body.firstChild.innerHTML,'欢迎啊啊回来'); +//}); +// +test('替换内容为空',function(){ + if(ua.browser.opera) + return; + var editor = te.obj[0]; + editor.setContent('

    欢迎回来

    '); + stop(); + setTimeout(function(){ + editor.focus(); + editor.execCommand('searchreplace',{searchStr:'欢迎',replaceStr:''}); + ua.manualDeleteFillData(editor.body); + equal(editor.body.firstChild.innerHTML,'回来'); + start(); + },50); +}); +// +test('全部替换内容为空',function(){ + if(ua.browser.opera) + return; + var editor = te.obj[0]; + editor.setContent('

    欢迎回来 欢迎啊

    '); + editor.execCommand('searchreplace',{searchStr:'欢迎',replaceStr:'',all:true}); + ua.manualDeleteFillData(editor.body); + equal(editor.body.firstChild.innerHTML,'回来 啊'); +}); + +//test('查找替换支持正则',function(){ +// if(ua.browser.opera) +// return; +// var editor = te.obj[0]; +// editor.setContent('

    sd2323fasdfasd3434f

    '); +// //因为是字符表示的正则要做转换 +// editor.execCommand('searchreplace',{searchStr:'/\\d+/',replaceStr:'',all:true}); +// ua.manualDeleteFillData(editor.body); +// equal(editor.body.firstChild.innerHTML,'sdfasdfasdf'); +// editor.setContent('

    sd2323fasdfasd3434f

    首都发生地2323方

    '); +// editor.execCommand('searchreplace',{searchStr:'/\\d+/',replaceStr:'',all:true}); +// ua.manualDeleteFillData(editor.body); +// equal(editor.body.innerHTML.toLowerCase().replace(/>\s+<'),'

    sdfasdfasdf

    首都发生地方

    '); +//}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/section.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/section.js new file mode 100644 index 000000000..d444f7dcb --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/section.js @@ -0,0 +1,65 @@ +/** + * Created by JetBrains PhpStorm. + * User: dongyancen + * Date: 12-9-28 + * Time: 下午1:34 + * To change this template use File | Settings | File Templates. + */ +module('plugins.section'); + +test('getsections命令',function(){ + var editor = te.obj[0]; + var html = '

    一级标题1

    段落a

    二级标题2

    段落

    二级标题3

    段落

    三级标题4

    段落

    一级标题5

    段落

    '; + editor.setContent(html); + var sectionTree = editor.execCommand('getsections'); + + equal(sectionTree.children.length, 2, '内容里有两个一级标题'); + equal(sectionTree.children[1].title, '一级标题5', '验证章节内容'); + same(sectionTree.children[1].startAddress, [8], '验证章节开始位置'); + same(sectionTree.children[1].endAddress, [9], '验证章节结束位置'); +}); + +test('deletesection命令',function(){ + var editor = te.obj[0]; + var html = '

    一级标题1

    段落a

    二级标题2

    段落

    二级标题3

    段落

    三级标题4

    段落

    一级标题5

    段落b

    '; + + editor.setContent(html); + var sectionTree = editor.execCommand('getsections'); + editor.execCommand('deleteSection', sectionTree.children[1]); + equal(sectionTree.children[1].parentNode, null, '验证章节标题是否已删除'); + notEqual(editor.body.children[0].innerHTML, '段落a', '不传入keepChild参数时,验证章节内容是否已删除'); + + editor.setContent(html); + sectionTree = editor.execCommand('getsections'); + editor.execCommand('deleteSection', sectionTree.children[0], true); + equal(editor.body.children[0].innerHTML, '段落a', '传入keepChild参数为true时,验证章节内容是否已保留'); +}); + +test('movesection命令',function(){ + var editor = te.obj[0]; + var html = '

    一级标题1

    段落a

    二级标题2

    段落

    二级标题3

    段落

    三级标题4

    段落

    一级标题5

    段落b

    '; + + editor.setContent(html); + var sectionTree = editor.execCommand('getsections'); + editor.execCommand('movesection', sectionTree.children[1], sectionTree.children[0]); + equal(editor.body.children[0].innerHTML, '一级标题5', ' 移动章节移动到目标章节之前,验证章节是否移动正确'); + equal(editor.body.children[1].innerHTML, '段落b', ' 验证移动章节移动到目标章节之前,验证章节内容是否移动正确'); + + editor.setContent(html); + sectionTree = editor.execCommand('getsections'); + editor.execCommand('movesection', sectionTree.children[0], sectionTree.children[1], true); + var len = editor.body.children.length; + equal(editor.body.children[len-2].innerHTML, '一级标题1', ' 移动章节移动到目标章节之前,验证章节是否移动正确'); + equal(editor.body.children[len-1].innerHTML, '段落a', ' 验证移动章节移动到目标章节之前,验证章节内容是否移动正确'); +}); + +test('selectsection命令',function(){ + var editor = te.obj[0]; + var html = '

    一级标题1

    段落a

    二级标题2

    段落

    二级标题3

    段落

    三级标题4

    段落

    一级标题5

    段落b

    '; + + editor.setContent(html); + var sectionTree = editor.execCommand('getsections'); + editor.execCommand('selectsection', sectionTree.children[1]); + var range = editor.selection.getRange(); + ua.checkSameHtml($('
    ').append(range.cloneContents()).html(), '

    一级标题5

    段落b

    ', '判断选区内容是否正确'); +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/selectall.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/selectall.js new file mode 100644 index 000000000..406544356 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/selectall.js @@ -0,0 +1,76 @@ +module( "plugins.selectall" ); +test( 'normal', function () { + var editor = te.obj[0], db = editor.body; + editor.setContent( '

    xxxx

    ssss' ); + editor.focus(); + editor.execCommand( 'selectAll' ); + //equal( UE.plugins['selectall'].notNeedUndo, 1, "notNeedUndo==1" ); + editor.execCommand( "bold" ); + equal( ua.getChildHTML( db ), "

    xxxx

    ssss

    ", "after calling selectAll command" ); +} ); + +test( 'a part of the content is selected', function () { + var editor = te.obj[0], d = editor.document, range = te.obj[1], db = editor.body; + editor.setContent( '

    xxxx

    ssss' ); + range.selectNode( db.lastChild.firstChild ).select(); + editor.execCommand( "bold" ); + equal( ua.getChildHTML( db ), "

    xxxx

    ssss

    ", "before calling selectAll command" ); + editor.execCommand( 'selectAll' ); + //equal( UE.plugins['selectall'].notNeedUndo, 1, "notNeedUndo==1" ); + editor.execCommand( "bold" ); + equal( ua.getChildHTML( db ), "

    xxxx

    ssss

    ", "after calling selectAll command" ); +} ); + +test( 'trace1743 :content is null', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '


    ' ); + //TODO 现在必须先focus再selectall,trace1743 + editor.execCommand( 'selectAll' ); + equal( ua.getChildHTML( editor.body ), "


    ", "content is null" ); + //equal(UE.plugins['selectall'].notNeedUndo, 1, "notNeedUndo==1" ); + range.setStart( editor.body.firstChild, 0 ).collapse( 1 ).select(); + editor.execCommand( "bold" ); + ua.manualDeleteFillData( editor.body ); + equal( ua.getChildHTML( editor.body ), "


    ", "after calling command bold" ); +} ); + +test( 'ctrl+a', function() { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent( '

    全选的文本1

    全选的文本2

    ' ); + range.selectNode( body.firstChild ).select(); + var p = body.firstChild; + ua.keydown(editor.body,{'keyCode':65,'ctrlKey':true}); + setTimeout( function() { + var range = editor.selection.getRange(); +// if ( ua.browser.gecko||ua.browser.ie>8 ) +// ua.checkResult( range, body, body, 0, 2, false, '查看全选后的range' ); +// else + if(ua.browser.gecko||ua.browser.webkit){ + ua.checkResult( range, body, body, 0, 2, false, '查看全选后的range' ); + }else{ + ua.checkResult( range, body.firstChild.firstChild, body.lastChild.firstChild, 0, 6, false, '查看全选后的range' ); + } + start(); + }, 150 ); + stop(); +} ); +test('contextmenu 右键全选', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + stop(); + editor.setContent('asdfg'); + ua.contextmenu(editor.body); + var lang = editor.getLang("contextMenu"); + var menuBody = document.getElementsByClassName("edui-menu-body")[0]; + equal(editor.selection.getRange().collapsed, true, '检查选区--闭合'); + ua.click(menuBody.childNodes[0]); + setTimeout(function () { + equal(editor.selection.getRange().collapsed, false, '检查选区--非闭合'); + document.getElementById('edui_fixedlayer').parentNode.removeChild(document.getElementById('edui_fixedlayer')); + te.dom.push(editor.container); + start(); + }, 50); +}); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/serverparam.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/serverparam.js new file mode 100644 index 000000000..845e0ae76 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/serverparam.js @@ -0,0 +1,17 @@ +module( 'plugins.serverparam' ); + +test( '检查是否能正常设置参数', function () { + var editor = te.obj[0]; + + editor.execCommand('serverparam', {"a": 1, "b": 2}); + same( editor.queryCommandValue('serverparam'), {"a": 1, "b": 2}, '传入对象设置参数'); + + editor.execCommand('serverparam', "c", 3); + same( editor.queryCommandValue('serverparam'), {"a": 1, "b": 2, "c": 3}, '传入键和值设置参数'); + + editor.execCommand('serverparam', "c"); + same( editor.queryCommandValue('serverparam'), {"a": 1, "b": 2}, '传入键删除参数'); + + editor.execCommand('serverparam'); + same( editor.queryCommandValue('serverparam'), {}, '不传参数,清空参数表'); +} ); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/shortcutkeys.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/shortcutkeys.js new file mode 100644 index 000000000..298605d52 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/shortcutkeys.js @@ -0,0 +1,139 @@ +module( 'plugins.shortcutkeys' ); +//键盘操作取不到range,定不到位,尤其ie里ctrl+b把收藏夹打开了。。。 + +test( 'ctrl+i', function() { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; +// setTimeout( function() { + editor.setContent( '

    没有加粗的文本

    ' ); + range.selectNode( body.firstChild ).select(); + var p = body.firstChild; + editor.focus(); + setTimeout( function() { +// te.presskey( 'ctrl', 'i' ); + ua.keydown(editor.body,{'keyCode':73,'ctrlKey':true}); + editor.focus(); + setTimeout( function() { + equal( ua.getChildHTML( p ), '没有加粗的文本' ); + start(); + }, 150 ); + }, 100 ); + +// }, 100 ); + stop(); +} ); +// +test( 'ctrl+u', function() { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + stop(); + + editor.setContent( '

    没有加粗的文本

    ' ); + setTimeout( function() { + range.selectNode( body.firstChild ).select(); + var p = body.firstChild; + + editor.focus(); +// setTimeout( function() { +// editor.focus(); + setTimeout( function() { + var html = '没有加粗的文本'; + ua.checkHTMLSameStyle( html, editor.document, body.firstChild, '文本被添加了下划线' ); + start(); + }, 150 ); +// }, 100 ); +// te.presskey( 'ctrl', 'u' ); + ua.keydown(editor.body,{'keyCode':85,'ctrlKey':true}); + }, 150 ); +} ); +// +test( 'ctrl+z/y', function() { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; +// setTimeout( function() { + editor.setContent( '

    没有加粗的文本

    ' ); + range.selectNode( body.firstChild ).select(); + var p = body.firstChild; + + editor.focus(); + setTimeout( function() { +// te.presskey( 'ctrl', 'b' ); +// editor.focus(); + ua.keydown(editor.body,{'keyCode':66,'ctrlKey':true}); + setTimeout( function() { + equal( ua.getChildHTML( p ), '没有加粗的文本' ); +// editor.focus(); +// te.presskey( 'ctrl', 'z' ); + ua.keydown(editor.body,{'keyCode':90,'ctrlKey':true}); +// editor.focus(); + setTimeout( function() { + editor.focus(); + equal( ua.getChildHTML( body.firstChild ), '没有加粗的文本' ); +// setTimeout( function() { +// te.presskey( 'ctrl', 'y' ); + ua.keydown(editor.body,{'keyCode':89,'ctrlKey':true}); + editor.focus(); + setTimeout( function() { +// editor.focus(); + equal( ua.getChildHTML( body.firstChild ), '没有加粗的文本' ); + start(); + }, 100 ); +// }, 100 ); + }, 100 ); + }, 150 ); + }, 100 ); + +// }, 150 ); + stop(); +} ); +// +test( 'ctrl+a', function() { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; +// setTimeout( function() { + editor.setContent( '

    全选的文本1

    全选的文本2

    ' ); + range.selectNode( body.firstChild ).select(); + var p = body.firstChild; + ua.keydown(editor.body,{'keyCode':65,'ctrlKey':true}); +// setTimeout( function() { +// editor.focus(); +// te.presskey( 'ctrl', 'a' ); +// editor.focus(); + setTimeout( function() { + var range = editor.selection.getRange(); + if ( ua.browser.gecko ) + ua.checkResult( range, body, body, 0, 2, false, '查看全选后的range' ); + else + ua.checkResult( range, body.firstChild.firstChild, body.lastChild.firstChild, 0, 6, false, '查看全选后的range' ); + start(); + }, 150 ); +// }, 100 ); +// }, 100 ); + + stop(); +} ); +// +test( 'ctrl+b', function() { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; +// setTimeout( function() { + editor.setContent( '

    没有加粗的文本

    ' ); + range.selectNode( body.firstChild ).select(); + editor.focus(); + setTimeout( function() { + ua.keydown(editor.body,{'keyCode':66,'ctrlKey':true}); +// te.presskey( 'ctrl', 'b' ); +// editor.focus(); + setTimeout( function() { + equal( ua.getChildHTML( body.firstChild ), '没有加粗的文本' ); + start(); + }, 150 ); + }, 150 ); +// } ,50); + stop(); +} ); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/shortcutmenu.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/shortcutmenu.js new file mode 100644 index 000000000..eeedfad2e --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/shortcutmenu.js @@ -0,0 +1,86 @@ +/** + * Created with JetBrains PhpStorm. + * User: xuheng + * Date: 13-6-13 + * Time: 下午12:38 + * To change this template use File | Settings | File Templates. + */ +module( 'plugins.contextmenu' ); + +test( '基本的shortcutmenu', function() { +//设置菜单内容\ + var div = document.body.appendChild(document.createElement('div')); + div.id = 'ue'; + var editor = UE.getEditor("ue", { shortcutMenu: ["fontfamily", "fontsize", "bold", "italic", "underline", "forecolor", "backcolor", "insertorderedlist", "insertunorderedlist"]}); + stop(); + editor.ready(function () { + ua.contextmenu(editor.body); + setTimeout(function () { + var menu = document.getElementsByClassName("edui-shortcutmenu")[0]; + equal(!!menu, true, '右键检查菜单是否存在'); + + ok(menu.style.display == "" || menu.style.display == "block", '右键检查菜单是否显示'); + + ua.mousedown(editor.body.firstChild); + + equal(menu.style.display, "none", '鼠标按下检查菜单是否隐藏'); + + UE.delEditor('ue'); + + te.dom.push(document.getElementById('ue')); + te.dom.push(document.getElementById('edui_fixedlayer')); + start() + + }, 100); + }); +}); +test( '键盘操作,隐藏shortcutmenu', function() { +//设置菜单内容\ + var div = document.body.appendChild(document.createElement('div')); + div.id = 'ue'; + var editor = UE.getEditor("ue" ,{ shortcutMenu: ["fontfamily", "fontsize", "bold", "italic", "underline", "forecolor", "backcolor", "insertorderedlist", "insertunorderedlist"]}); + stop(); + editor.ready(function () { + ua.contextmenu(editor.body); + setTimeout(function(){ + var menu=document.getElementsByClassName("edui-shortcutmenu")[0]; + equal(!!menu,true,'右键检查菜单是否存在'); + ok(menu.style.display==""||menu.style.display=="block",'右键检查菜单是否显示'); + ua.keydown(editor.body.firstChild); + equal(menu.style.display,"none",'键盘按下检查菜单是否隐藏'); + UE.delEditor('ue'); + te.dom.push(document.getElementById('ue')); + te.dom.push(document.getElementById('edui_fixedlayer')); + start() + },100); + }); +} ); +test( '框选内容', function() { +//设置菜单内容\ + var div = document.body.appendChild(document.createElement('div')); + div.id = 'ue'; + var editor = UE.getEditor("ue" ,{ shortcutMenu: ["fontfamily", "fontsize", "bold", "italic", "underline", "forecolor", "backcolor", "insertorderedlist", "insertunorderedlist"]}); + stop(); + editor.ready(function () { + editor.setContent('

    hello

    '); + var range = new baidu.editor.dom.Range(editor.document); + range.setStart(editor.body.firstChild.firstChild,0).setEnd(editor.body.firstChild.firstChild,2).select(); + var sc =editor.selection.getRange().startContainer; + var ec =editor.selection.getRange().endContainer; + var so =editor.selection.getRange().startOffset; + var eo =editor.selection.getRange().endOffset; + var collapsed =editor.selection.getRange().collapsed; + ua.contextmenu(editor.body); + setTimeout(function(){ + var menu=document.getElementsByClassName("edui-shortcutmenu")[0]; + equal(!!menu,true,'右键检查菜单是否存在'); + ok(menu.style.display==""||menu.style.display=="block",'右键检查菜单是否显示'); + ua.checkResult(editor.selection.getRange(), sc, ec, so, eo, collapsed,'检查range不变'); + ua.keydown(editor.body.firstChild); + UE.delEditor('ue'); + te.dom.push(document.getElementById('ue')); + te.dom.push(document.getElementById('edui_fixedlayer')); + start() + },100); + }); +} ); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/snapscreen.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/snapscreen.js new file mode 100644 index 000000000..d8e934691 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/snapscreen.js @@ -0,0 +1,41 @@ +/** + * Created by JetBrains PhpStorm. + * User: dongyancen + * Date: 12-9-17 + * Time: 下午2:38 + * To change this template use File | Settings | File Templates. + */ +module('plugins.snapscreen'); +test('检查高亮', function () { + var editor = te.obj[0]; + editor.focus(); + equal(editor.queryCommandState('snapscreen'), 0, 'check snapscreen state'); +}); +test('snapscreen', function () { + var div = document.body.appendChild(document.createElement('script')); + div.id = 'ue'; + var editor = UE.getEditor('ue'); + stop(); + editor.ready(function () { + setTimeout(function () { + editor.execCommand('snapscreen'); + editor.container.removeChild(editor.container.lastChild); + setTimeout(function () { + ok($('.edui-dialog .edui-for-snapscreen')[0] != null, ''); + $EDITORUI[$('.edui-dialog .edui-for-snapscreen')[0].parentNode.id].close(); + setTimeout(function () { + + UE.delEditor('ue'); + te.dom.push(document.getElementById('ue')); + start(); + }, 1000); + }, 300); + + + }, 100); + + + } + + ); +}); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/source.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/source.js new file mode 100644 index 000000000..27df7a804 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/source.js @@ -0,0 +1,381 @@ +module('plugins.source'); +//test('初始化进入源码模式',function(){ +// if(ua.browser.ie>0 && ua.browser.ie<8) +// return 0; +// var div = document.createElement('div'); +// document.body.appendChild(div); +// div.id = 'e'; +// var editor = UE.getEditor('e');//,{sourceEditorFirst:true} +// stop(); +//// editor.ready(function(){ +//// setTimeout(function(){ +////// equal(editor.queryCommandState('source'),1,'源码高亮'); +//// equal(editor.queryCommandState('bold'),-1,'加粗灰色'); +//////// start(); +//// },100); +//// }); +//}); +test('chrome删除后切换源码再切换回来,光标没了', function () { + //opera 取不到range值 + if (ua.browser.opera) return 0; + var editor = te.obj[0]; + var div = te.dom[0]; + editor.render(div); + editor.setContent('hello'); + var range = editor.selection.getRange(); + range.selectNode(editor.body.firstChild).select(); + editor.execCommand('cleardoc'); + stop(); + expect(2); + //source 包含超时操作,ie下必须有同步操作,否则会报错 + setTimeout(function () { + editor.execCommand('source'); + setTimeout(function () { + editor.execCommand('source'); + start(); + }, 20); + }, 20); + range = editor.selection.getRange(); + equal(range.startContainer.nodeType, 1, '光标定位在p里'); + equal(range.startContainer.tagName.toLowerCase(), 'p', 'startContainer为p'); + te.dom.push(div); +}); +//TODO 1.2.6 +/*trace 986*/ +//test( '切换源码,视频地址被添加了网站前缀', function () { +// if ( !ua.browser.ie ) { +// var editor = te.obj[0]; +// var range = te.obj[1]; +// editor.setContent( '


    ' ); +// setTimeout(function(){ +// range.setStart( editor.body.firstChild, 0 ).collapse( 1 ).select(); +// /*涉及到video的一些特殊处理,因此直接设置编辑器的html不是很可行,所以这里用了video这个插件*/ +// editor.execCommand( 'insertvideo', {url:'www.baidu.com'} ); +// setTimeout( function () { +// editor.execCommand( 'source' ); +// range.setStart( editor.body.firstChild, 0 ).collapse( 1 ).select(); +// setTimeout( function () { +// editor.execCommand( 'source' ); +// start(); +// }, 50 ); +// }, 50 ); +// +// var img = editor.document.getElementsByTagName( 'img' )[0]; +// equal( $( img ).attr( '_url' ), 'www.baidu.com', '检查超链接前是否添加了网站的路径' ); +// },50); +// stop(); +// } +// else +// ok( true, 'ie里加了视频节点embed,在节点embed后加bookmark会出错' ); +//} ); + +//trace 852 +test('切换源码,源码中多处空行', function () { + var editor = te.obj[0]; + editor.setContent('

    hellobaidu

    '); + stop(); + setTimeout(function () { + editor.execCommand('source'); + setTimeout(function () { + editor.execCommand('source'); + setTimeout(function () { + var html = editor.getContent(); + equal(html, '

    hellobaidu

    '); + start(); + }, 100); + }, 100); + }, 100); + + // var html = '

    \nhello\n\tbaidu\n\n

    '; + //无奈的验证,有不可见字符 + //多余不可见字符的的bug已经修改了,现在用例字符串长度:53 + + // ok(html.length>=58&&html.length<=60,'切换源码不会多空行'); +}); + +/*trace 710*/ +test('设置源码内容没有p标签,切换源码后会自动添加', function () { + var editor = te.obj[0]; + editor.setContent('helloworld你好啊大家好,你在干嘛呢。谢谢,不用谢~~%199

    hello

    '); + setTimeout(function () { + editor.execCommand('source'); + setTimeout(function () { + editor.execCommand('source'); + setTimeout(function () { + editor.execCommand('source'); + setTimeout(function () { + var childs = editor.body.childNodes; + ok(childs.length, 3, '3个p'); + for (var index = 0; index < 3; index++) { + equal(childs[0].tagName.toLowerCase(), 'p', '第' + index + '个孩子为p'); + } + start(); + }, 100); + }, 100); + }, 100); + }, 100); + stop(); +}); + +test('切换源码去掉空的span', function () { + var editor = te.obj[0]; + editor.setContent('

    切换源码去掉空的span

    '); + setTimeout(function () { + editor.execCommand('source'); + setTimeout(function () { + editor.execCommand('source'); + start(); + }, 100); + }, 100); + stop(); + equal(editor.getContent(), '

    切换源码去掉空的span

    '); +}); + +test('b,i标签,切换源码后自动转换成strong和em', function () { + var editor = te.obj[0]; + editor.setContent('

    加粗的内容斜体的内容加粗且斜体

    '); + setTimeout(function () { + editor.execCommand('source'); + setTimeout(function () { + editor.execCommand('source'); + start(); + }, 100); + }, 100); + stop(); + equal(editor.getContent(), '

    加粗的内容斜体的内容加粗且斜体

    '); +}); + +test(' trace 3739 trace 1734 range的更新/特殊符号的转换', function () { + var editor = te.obj[0]; + editor.setContent('

    "<>

    '); + setTimeout(function () { + editor.execCommand('source'); + setTimeout(function () { + editor.execCommand('source'); + equal(editor.getContent(), '

    "<>

    '); + editor.setContent("

    '

    "); +// var range = te.obj[1]; +// range.setStart(editor.body.firstChild,0).collapse(1).select(); + setTimeout(function () { +// var label = ua.browser.gecko ? 'html' : 'body'; +// var label = 'html'; + ua.manualDeleteFillData(editor.body); + var sc = (ua.browser.ie==11)?editor.selection.getRange().startContainer.parentNode.tagName.toLowerCase():editor.selection.getRange().startContainer.parentNode.parentNode.tagName.toLowerCase(); + equal(sc, 'html', 'range的更新'); + editor.execCommand('source'); + setTimeout(function () { + editor.execCommand('source'); + equal(editor.getContent(), "

    '

    "); + start(); + }, 100); + }, 100); + }, 100); + }, 100); + stop(); +}); + +/*trace 1234 */ +test('默认插入的占位符', function () { + var editor = te.obj[0]; + editor.setContent(''); + equal(editor.getContent(), ''); +}); + +test('插入分页符,源码中显示:_baidu_page_break_tag_', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('


    '); + setTimeout(function () { + range.setStart(editor.body.firstChild, 0).collapse(1).select(); + editor.execCommand('pagebreak'); + ua.manualDeleteFillData(editor.body); + var pagebreak = editor.body.getElementsByTagName('hr')[0]; + + if (typeof pagebreak.attributes['class'] == "undefined") { + equal(pagebreak.getAttribute('class'), 'pagebreak', 'pagebreak'); + } + else {//适用于ie6,7 + equal(pagebreak.attributes['class'].nodeValue, 'pagebreak', 'pagebreak'); + } + ua.manualDeleteFillData(editor.body); +// var br = baidu.editor.browser.ie ? ' ' : '
    '; + ok(editor.getContent().indexOf('_ueditor_page_break_tag_') >= 0, 'pagebreak被解析'); +// equal( editor.getContent(), '

    ' + br + '

    _baidu_page_break_tag_

    ' + br + '

    ' ); + start(); + }, 200); + stop(); +}); +//TODO 1.2.6 +//test( 'trace 1977 1949 插入代码,源码中对应的标签是pre', function () { +// var div = document.body.appendChild( document.createElement( 'div' ) ); +// $( div ).css( 'width', '500px' ).css( 'height', '500px' ).css( 'border', '1px solid #ccc' ); +// var editor = te.obj[2]; +// editor.render(div); +// var range = new baidu.editor.dom.Range( editor.document ); +// var body = editor.body; +// stop(); +// setTimeout(function(){ +// editor.setContent( '


    ' ); +// range.setStart( body.firstChild, 0 ).collapse( 1 ).select(); +// editor.execCommand( 'highlightcode', '', 'html' ); +// ua.manualDeleteFillData( editor.body ); +// +// var td_gutter = body.getElementsByTagName( 'td' )[0]; +// var td_code = body.getElementsByTagName( 'td' )[1]; +// equal( body.getElementsByTagName( 'td' ).length, 2, '显示代码的table分两列' ); +// if(td_gutter!=''){ +// if ( typeof td_gutter.attributes['class'] == "undefined" ) { +// equal( td_gutter.getAttribute( 'class' ), 'gutter', '第一列class=gutter' ); +// equal( td_code.getAttribute( 'class' ), 'code', '第一列class=code' ); +// } +// else {//适用于ie6,7 +// equal( td_gutter.attributes['class'].nodeValue, 'gutter', '第一列class=gutter' ); +// equal( td_code.attributes['class'].nodeValue, 'code', '第一列class=code' ); +// } +// equal( editor.getContent().substring( 0, 119 ), '
    <a href=\"http://net.tutsplus.com\" class=\"logo\">Nettuts+</a> 
    ' ); +// //highlightcode空格问题 +//// equal( editor.getContent().substring( 0, 116 ), '
    <a href=\"http://net.tutsplus.com\" class=\"logo\">Nettuts+</a>
    ' ); +// te.dom.push( div ); +// } +// start(); +// },50); +//} ); + +test('不以http://开头的超链接绝对路径网址', function () { + if (ua.browser.ie == 9)return 0;//TODO 1.2.6 + var editor = te.obj[0]; + editor.setContent('

    绝对路径网址

    '); + setTimeout(function () { + editor.execCommand('source'); + setTimeout(function () { + editor.execCommand('source'); + equal(editor.getContent(), '

    绝对路径网址

    '); + start(); + }, 100); + }, 100); + stop(); +}); + +test('trace 1727:插入超链接后再插入空格,空格不能被删除', function () { + var editor = te.obj[0]; + editor.setContent('

    绝对路径网址 ddd

    '); + setTimeout(function () { + editor.execCommand('source'); + setTimeout(function () { + editor.execCommand('source'); + equal(editor.body.innerHTML.toLowerCase(), '

    绝对路径网址  ddd

    ', '查看空格是否被删除'); + start(); + }, 100); + }, 100); + stop(); +}); +//TODO 1.2.6 空style未删除 +//test( '关于空格的问题', function () { +// var editor = te.obj[0]; +// var html = '
    1. dd jj
    2. ll kdkd baidu
    '; +// editor.setContent( html ); +// setTimeout(function(){ +// editor.execCommand( 'source' ); +// setTimeout( function () { +// editor.execCommand( 'source' ); +// setTimeout( function () { +// ua.manualDeleteFillData( editor.body ); +// equal( editor.body.innerHTML.toLowerCase().replace(/[\r\n\t]/g,''), '
    1. dd jj

    2. ll kdkd baidu 

    ' ); +// start(); +// }, 150 ); +// }, 100 ); +// },20); +// stop(); +//} ); +//TODO 1.2.6 +//test('初始化进入源码模式',function(){ +// if(ua.browser.ie>0 && ua.browser.ie<8) +// return 0; +// var div = document.createElement('div'); +// document.body.appendChild(div); +// var editor = UE.getEditor(div);//,{sourceEditorFirst:true} +// stop(); +// editor.ready(function(){ +// setTimeout(function(){ +//// equal(editor.queryCommandState('source'),1,'源码高亮'); +// equal(editor.queryCommandState('bold'),-1,'加粗灰色'); +////// start(); +// },100); +// }); +//}); + +test('在font,b,i标签中输入,会自动转换标签 ', function () { +// if(!ua.browser.gecko){ + var editor = te.obj[0]; + editor.body.innerHTML = '

    x

    '; + setTimeout(function () { + editor.execCommand('source'); + setTimeout(function () { + editor.execCommand('source'); + equal(editor.body.firstChild.firstChild.tagName.toLowerCase(), 'span', 'font转换成span'); + if (ua.browser.gecko || ua.browser.ie) + equal($(editor.body.firstChild.firstChild).css('font-size'), '16px', '检查style'); + else + equal($(editor.body.firstChild.firstChild).css('font-size'), '16px', '检查style'); + var EMstyle = $(editor.body.firstChild.firstChild).css('color'); + ok(EMstyle == 'rgb(255, 0, 0)' || EMstyle == 'red' || EMstyle == '#ff0000', '检查style'); + equal(ua.getChildHTML(editor.body.firstChild.firstChild), 'x', 'b转成strong,i转成em '); + start(); + }, 20); + }, 20); + stop(); +// } +}); + +test('trace 3334:img和a之间不会产生多余空格', function () { + var editor = te.obj[0]; + editor.setContent('

    http://www.baidu.com

    '); + setTimeout(function () { + editor.execCommand('source'); + setTimeout(function () { + editor.execCommand('source'); + setTimeout(function () { + editor.execCommand('source'); + ua.manualDeleteFillData(editor.body); + var html = '

    http://www.baidu.com

    '; + ua.checkSameHtml(editor.body.innerHTML.toLowerCase(), html, '查看img和a之间是否会产生多余空格'); + start(); + }, 20); + }, 20); + }, 20); + stop(); +}); + +test('trace 3334:table中td不会产生多余空格', function () { + if(ua.browser.ie)return ;//todo 1.3.0 + var editor = te.obj[0]; + editor.execCommand('inserttable'); + var br = ua.browser.ie ? '' : '
    '; + setTimeout(function () { + editor.execCommand('source'); + setTimeout(function () { + editor.execCommand('source'); + ua.manualDeleteFillData(editor.body); + equal(editor.body.getElementsByTagName('table').length, 1, '有1个table'); + equal(editor.body.getElementsByTagName('tr').length, 5, '有5个tr'); + equal(editor.body.getElementsByTagName('td').length, 25, '有25个td'); + equal(editor.body.getElementsByTagName('td')[12].innerHTML, br, '不会产生多余空格'); + start(); + }, 20); + }, 20); + stop(); +}); + +test('trace 3349:带颜色的span切到源码再切回,不会丢失span', function () { + var editor = te.obj[0]; + editor.setContent('


    '); + setTimeout(function () { + editor.execCommand('source'); + setTimeout(function () { + editor.execCommand('source'); + ua.checkSameHtml(editor.body.innerHTML, '


    '); + start(); + }, 20); + }, 20); + stop(); +}); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/table.action.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/table.action.js new file mode 100644 index 000000000..55ad46fde --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/table.action.js @@ -0,0 +1,1007 @@ +/** + * Created with JetBrains PhpStorm. + * User: taoqili + * Date: 13-2-25 + * Time: 下午4:40 + * To change this template use File | Settings | File Templates. + */ + +//test('', function () { +// stop() +//}); +test('框选', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + + editor.setContent('

    '); + setTimeout(function () { + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable', {numCols: 3, numRows: 3}); + var tds = editor.body.getElementsByTagName('td'); + ua.mousedown(tds[0]); + ua.mouseover(tds[4]); + ua.mouseup(tds[4]); + setTimeout(function () { + var selectedTds = editor.getUETable(editor.body.firstChild).selectedTds; + var tds = editor.body.getElementsByTagName('td'); + equal(selectedTds.length, 4, '框选'); + if ( ua.browser.ie >8 && ua.browser.ie<11) + ua.checkResult(editor.selection.getRange(), tds[0].firstChild, tds[0].firstChild, 1, 1, true, '检查选中的range') + else + ua.checkResult(editor.selection.getRange(), tds[0], tds[0], 0, 0, true, '检查选中的range'); + range.setStart(tds[4], 0).collapse(true).select(); + ua.mousedown(tds[4], {button: 2}); + setTimeout(function () { + var selectedTds = editor.getUETable(editor.body.firstChild).selectedTds; + var tds = editor.body.getElementsByTagName('td'); + equal(selectedTds.length, 4, '右键框选不变'); + if ( ua.browser.ie >8 && ua.browser.ie<11) + ua.checkResult(editor.selection.getRange(), tds[0].firstChild, tds[0].firstChild, 1, 1, true, '检查选中的range') + else + ua.checkResult(editor.selection.getRange(), tds[0], tds[0], 0, 0, true, '检查选中的range'); + start(); + }, 50); + }, 50); + }, 80); + stop(); +}); + +test('tableDragable-显示和消失', function () { + if (browser.ie && browser.version < 8) return; + var div = document.body.appendChild(document.createElement('div')); + div.id = 'ue'; + var editor = UE.getEditor('ue', {tableDragable: true}); + editor.ready(function () { + var range = new baidu.editor.dom.Range(editor.document); + editor.setContent('

    '); + setTimeout(function () { + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable', {numCols: 3, numRows: 3}); + var tds = editor.body.getElementsByTagName('td'); + ua.mousemove(editor.body.firstChild); + var pos = domUtils.getXY(editor.body.firstChild); + var select = ua.browser.webkit ? '-webkit-user-select: none;' : ua.browser.gecko ? '-moz-user-select: none;' : ua.browser.ie >8?'-ms-user-select: none':'';//-ms-user-select: none + var html = '
    '; + setTimeout(function () { + var button = editor.body.lastChild; + ua.checkSameHtml(button.outerHTML.replace('"', ''), html, 'DragButton显示'); + ua.mouseout(button); + ua.mousemove(editor.body); + setTimeout(function () { + equal(editor.body.getElementsByTagName('div').length, 0, '按钮没有了'); + UE.delEditor('ue'); + te.dom.push(document.getElementById('ue')); + te.dom.push(document.getElementById('edui_fixedlayer')); + start(); + }, 2100); + }, 20); + }, 50); + }); + stop(); +}); +test('tableDragable-单击', function () {//tableClicked + if (browser.ie && browser.version < 8) return; + var div = document.body.appendChild(document.createElement('div')); + div.id = 'ue'; + var editor = UE.getEditor('ue', {tableDragable: true}); + expect(1); + editor.ready(function () { + var range = new baidu.editor.dom.Range(editor.document); + editor.setContent('

    '); + setTimeout(function () { + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable', {numCols: 3, numRows: 3}); + var tds = editor.body.getElementsByTagName('td'); + ua.mousemove(editor.body.firstChild); + setTimeout(function () { + var button = editor.body.lastChild; + editor.addListener("tableClicked", function (type, table, buttonOn) { + same(table, editor.body.getElementsByTagName('table')[0], 'tableClicked事件,传入的参数正确'); + setTimeout(function () { + UE.delEditor('ue'); + te.dom.push(document.getElementById('ue')); + te.dom.push(document.getElementById('edui_fixedlayer')); + start(); + }, 500); + }); + ua.click(button); + }, 20); + }, 50); + }); + stop(); +}); +test('tableDragable-双击', function () {//tableClicked + if (browser.ie && browser.version < 8) return; + var div = document.body.appendChild(document.createElement('div')); + div.id = 'ue'; + var editor = UE.getEditor('ue', {tableDragable: true}); + editor.ready(function () { + var range = new baidu.editor.dom.Range(editor.document); + editor.setContent('

    '); + setTimeout(function () { + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable', {numCols: 3, numRows: 3}); + var tds = editor.body.getElementsByTagName('td'); + ua.mousemove(editor.body.firstChild); + setTimeout(function () { + var button = editor.body.lastChild; + ua.dblclick(button); + setTimeout(function () { + var selectedTds = editor.getUETable(editor.body.firstChild).selectedTds; + var tds = editor.body.getElementsByTagName('td'); + equal(selectedTds.length, 9, '全选'); + if (ua.browser.ie > 8 && ua.browser.ie<11) + ua.checkResult(editor.selection.getRange(), tds[0].firstChild, tds[0].firstChild, 1, 1, true, '检查选中的range'); + else + ua.checkResult(editor.selection.getRange(), tds[0], tds[0], 0, 0, true, '检查选中的range'); + setTimeout(function () { + UE.delEditor('ue'); + te.dom.push(document.getElementById('ue')); + te.dom.push(document.getElementById('edui_fixedlayer')); + start(); + }, 500); + }, 100); + }, 100); + }, 100); + }); + stop(); +}); +test('从外面粘贴表格', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + var html = {html: '
    hello1
    hello2

    hello2

    '}; + editor.fireEvent('beforepaste', html); + //**//*粘贴*//**//* + stop(); + setTimeout(function () { + var space = ua.browser.ie ? '' : '
    '; + var border = (ua.browser.ie && ua.browser.ie < 9) ? 'border-bottom-color: rgb(247,150,70); border-top-color: rgb(247,150,70); border-right-color: rgb(247,150,70); border-left-color: rgb(247,150,70)' : 'border-color: rgb(247, 150, 70)'; + var resultHtml = '
    hello1' + space + '
    hello2' + space + '

    hello2

    '; + ua.checkSameHtml(html.html.toLowerCase(), resultHtml.toLowerCase(), '粘贴的表格规范格式'); + start(); + }, 50); +}); +test('从外面粘贴表格到表格-表格中不能粘完整的表格', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent(''); + editor.execCommand('inserttable', {numCols: 3, numRows: 3}); + //**//*插入表格*//**//* + var tds = editor.body.getElementsByTagName('td'); + range.setStart(tds[0], 0).collapse(true).select(); + var html = {html: '
    hello1
    hello2

    hello2

    '}; + editor.fireEvent('beforepaste', html); + //**//*粘贴*//**//* + stop(); + setTimeout(function () { + equal(html.html, '

    hello2

    ', '表格中不能粘完整的表格'); + start(); + }, 50); +}); +test(' trace 3729 从外面粘贴表格到表格-在caption中粘贴,只粘贴文本内容', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent(''); + editor.execCommand('inserttable', {numCols: 3, numRows: 3}); + //**//*插入表格*//**//* + var tds = editor.body.getElementsByTagName('td'); + range.setStart(tds[0], 0).collapse(true).select(); + editor.execCommand('insertcaption'); + range.setStart(editor.body.getElementsByTagName('caption')[0], 0).collapse(true).select(); + var html = {html: '
    hello1
    '}; + editor.fireEvent('beforepaste', html); + //**//*粘贴*//**//* + stop(); + setTimeout(function () { + //todo ie9 使用 div[browser.ie ? 'innerText' : 'textContent'] 会多一个换行,用textContent没有 trace 3729 + equal(html.html, 'hello1', '在caption中粘贴,只粘贴文本内容'); + start(); + }, 50); +}); +test('getText,取表格内的文本', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('
    hello1
    hello2
    '); + stop(); + setTimeout(function () { + var trs = editor.body.firstChild.getElementsByTagName('tr'); + range.setStart(trs[0].cells[0],0).collapse(true).select(); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[0].cells[0], trs[1].cells[0]); + ut.setSelected(cellsRange); + setTimeout(function () { + ua.manualDeleteFillData(editor.body); + equal(editor.selection.getText(), 'hello1hello2'); + start(); + }, 50); + }, 50); +}); +test('在第一个单元格里最前面回车,且表格前面没有内容', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable', {numCols: 3, numRows: 3}); + + var trs = editor.body.firstChild.getElementsByTagName('tr'); + + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[0].cells[0], trs[1].cells[0]); + ut.setSelected(cellsRange); + range.setStart(trs[0].cells[0], 0).collapse(true).select(); + ua.keydown(editor.body, {'keyCode': 13}); + stop(); + setTimeout(function () { + ua.manualDeleteFillData(editor.body); + equal(editor.body.firstChild.innerHTML, ua.browser.ie ? ' ' : '
    ', '表格前插入空行'); + equal(editor.body.firstChild.tagName.toLowerCase(), 'p', '表格前插入空行'); + equal(editor.body.childNodes[1].tagName.toLowerCase(), 'table', '表格在空行后面'); + start(); + }, 50); +}); +test('delete 事件', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable', {numCols: 3, numRows: 3}); + expect(4); + editor.addListener('saveScene', function () { + ok(true); + }); + var trs = editor.body.firstChild.getElementsByTagName('tr'); + trs[0].cells[0].innerHTML = 'hello'; + trs[1].cells[0].innerHTML = 'hello'; + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[0].cells[0], trs[1].cells[0]); + ut.setSelected(cellsRange); + range.setStart(trs[0].cells[0], 0).collapse(true).select(); + ua.keydown(editor.body, {'keyCode': 46}); + stop(); + setTimeout(function () { + ua.manualDeleteFillData(editor.body); + trs = editor.body.firstChild.getElementsByTagName('tr'); + equal(trs[0].cells[0].innerHTML, ua.browser.ie ? '' : '
    ', '内容'); + equal(trs[1].cells[0].innerHTML, ua.browser.ie ? '' : '
    ', '内容'); + start(); + }, 20); +}); +//**//*trace 3047,3545*//**//* +test('trace 3047 ,3545 全屏插入表格', function () { + if (ua.browser.gecko)return;//TODO 1.2.6 + if (ua.browser.ie && ua.browser.ie < 9)return;//TODO 1.2.6 + var div = document.body.appendChild(document.createElement('div')); + $(div).css('width', '500px').css('height', '500px').css('border', '1px solid #ccc'); + var editor = te.obj[2]; + editor.render(div); + stop(); + editor.ready(function () { + editor.setContent('

    '); + editor.ui.setFullScreen(!editor.ui.isFullScreen()); + editor.execCommand('inserttable'); + var width1 = editor.body.getElementsByTagName('td')[0].width; + setTimeout(function () { + editor.ui.setFullScreen(!editor.ui.isFullScreen()); + setTimeout(function () { + var width2 = editor.body.getElementsByTagName('td')[0].width; + ok((width1 - width2) > 10, '页面宽度自适应'); + div.parentNode.removeChild(div); + start(); + }, 500); + }, 500); + }); +}); + +test('backspace事件:删除caption', function () { + if(ua.browser.ie&&ua.browser.ie>8)return ;//todo 1.3.0 + + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable', {numCols: 3, numRows: 3}); + stop(); + setTimeout(function () { + var trs = editor.body.firstChild.getElementsByTagName('tr'); + range.setStart(trs[0].cells[0], 0).collapse(true).select(); + editor.execCommand('insertcaption'); + ua.keydown(editor.body, {'keyCode': 8}); + setTimeout(function () { + equal(editor.body.getElementsByTagName('caption').length, 0, '删除caption'); + equal(editor.selection.getRange().collapsed, true, '检查光标'); + equal(editor.selection.getRange().startContainer, editor.body.getElementsByTagName('td')[0], '检查光标'); + start(); + }, 500); + }, 50); +}); + +test('backspace事件:deleterow', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable', {numCols: 3, numRows: 3}); + stop(); + setTimeout(function () { + var trs = editor.body.firstChild.getElementsByTagName('tr'); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[0].cells[0], trs[0].cells[2]); + ut.setSelected(cellsRange); + range.setStart(trs[0].cells[0], 0).collapse(true).select(); + ua.keydown(editor.body, {'keyCode': 8}); + setTimeout(function () { + equal(editor.body.getElementsByTagName('tr').length, 2, '删除整行'); + if(!ua.browser.ie||ua.browser.ie<9){//todo + equal(editor.selection.getRange().collapsed, true, '检查光标'); + equal(editor.selection.getRange().startContainer, editor.body.getElementsByTagName('td')[0], '检查光标'); + } + start(); + }, 100); + }, 50); +}); + +test('backspace事件:deletecol', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable', {numCols: 3, numRows: 3}); + stop(); + setTimeout(function () { + var trs = editor.body.firstChild.getElementsByTagName('tr'); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[0].cells[0], trs[2].cells[0]); + ut.setSelected(cellsRange); + range.setStart(trs[0].cells[0], 0).collapse(true).select(); + setTimeout(function () { + ua.keydown(trs[0].cells[0], {'keyCode': 8}); + setTimeout(function () { + equal(editor.body.getElementsByTagName('tr')[0].getElementsByTagName('td').length, 2, '删除整列'); + if(!ua.browser.ie||ua.browser.ie<9){//todo + equal(editor.selection.getRange().collapsed, true, '检查光标'); + equal(editor.selection.getRange().startContainer, editor.body.getElementsByTagName('td')[0], '检查光标'); + } + start(); + }, 100); + }, 50); + }, 100); +}); + +//test('backspace事件:delcells', function () { +// //TODO +//}); +test('表格名称中backspace键', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable', {numCols: 3, numRows: 3}); + stop(); + setTimeout(function () { + var trs = editor.body.firstChild.getElementsByTagName('tr'); + range.setStart(trs[0].cells[0], 0).collapse(true).select(); + editor.execCommand('insertcaption'); + range.setStart(editor.body.getElementsByTagName('caption')[0], 0).collapse(true).select(); + ua.keydown(editor.body, {'keyCode': 8}); + setTimeout(function () { + equal(editor.body.getElementsByTagName('caption').length, 0, '删除caption'); + equal(editor.body.getElementsByTagName('table').length, 1, '不会增加表格数量'); + equal(editor.body.getElementsByTagName('tr').length, 3, '不会增加表格行数量'); + equal(editor.body.getElementsByTagName('tr')[0].cells.length, 3, '不会增加表格列数量'); + if(!ua.browser.ie||ua.browser.ie<9){//todo + equal(editor.selection.getRange().collapsed, true, '检查光标'); + equal(editor.selection.getRange().startContainer, editor.body.getElementsByTagName('td')[0], '检查光标'); + } + start(); + }, 100); + }, 200); +}); +test('trace 3097 标题行中backspace键', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable', {numCols: 3, numRows: 3}); + var trs = editor.body.firstChild.getElementsByTagName('tr'); + range.setStart(trs[0].cells[0], 0).collapse(true).select(); + editor.execCommand('insertcaption'); + range.setStart(editor.body.getElementsByTagName('caption')[0], 0).collapse(true).select(); + var x = range.cloneRange(); + editor.execCommand('inserttitle'); + range.setStart(editor.body.getElementsByTagName('th')[0], 0).collapse(true).select(); + ua.keydown(editor.body, {'keyCode': 8}); + stop(); + setTimeout(function () { + editor = te.obj[0]; + equal(editor.body.getElementsByTagName('caption').length, 1, '不会删除caption'); + equal(editor.body.getElementsByTagName('th').length, 3, '不会误删除标题行'); + equal(editor.body.getElementsByTagName('table').length, 1, '不会增加表格数量'); + equal(editor.body.getElementsByTagName('tr').length, 4, '不会增加表格行数量'); + equal(editor.body.getElementsByTagName('tr')[0].cells.length, 3, '不会增加表格列数量'); + equal(editor.selection.getRange().collapsed, true, '检查光标'); + trs[0].cells[0].innerHTML = 'hello'; +// equal(editor.selection.getRange().startContainer, te.obj[0].body.getElementsByTagName('th')[0], '检查光标'); + equal(trs[0].cells[0].innerHTML,'hello', '检查光标'); + start(); + }, 50); +}); + +test('拖拽', function () { + if (ua.browser.ie && ua.browser.ie < 8) return; + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable'); + ua.manualDeleteFillData(editor.body); + var tds = te.obj[0].body.getElementsByTagName('td'); + var width1 = tds[1].width; + ua.mousemove(tds[1], {clientX: 199, clientY: 100}); + equal(editor.body.style.cursor, 'col-resize', '检查鼠标显示'); + ua.mousedown(tds[1], {clientX: 199, clientY: 100}); + setTimeout(function () { + ua.mousemove(tds[1], {clientX: 299, clientY: 100}); + ua.mouseup(tds[1], {clientX: 299, clientY: 100}); + var p = ua.getMousePosition; + setTimeout(function () { + var width2 = tds[1].width; + ok(width2 - width1 > 50, '拖拽后单元格宽度改变'); + start(); + }, 50); + }, 400); + stop(); +}); +test('拖拽_row-resize鼠标显示', function () { + if (ua.browser.ie && ua.browser.ie < 8) return; + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable'); + ua.manualDeleteFillData(editor.body); + var tds = te.obj[0].body.getElementsByTagName('td'); + var width1 = tds[1].width; + ua.mousemove(tds[4], {clientX: 450, clientY: 39}); + equal(editor.body.style.cursor, 'row-resize', 'row-resize鼠标显示'); + + expect(3); + setTimeout(function () { + editor.addListener("tablemouseout", function (type, table, buttonOn) { + same(table, editor.body.getElementsByTagName('table')[0], 'tablemouseout事件,传入的参数正确'); + }); + ua.mouseout(tds[1], {clientX: 299, clientY: 35}); + setTimeout(function () { + equal(editor.body.style.cursor, 'text', '焦点转移,row-resize不显示'); + start(); + }, 50); + }, 20); + stop(); +}); +test('拖拽-最右边的单元格', function () { + if (ua.browser.ie && ua.browser.ie < 8) return; + + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable'); + ua.manualDeleteFillData(editor.body); + var tds = te.obj[0].body.getElementsByTagName('td'); + var width1 = tds[4].width; + ua.mousemove(tds[4], {clientX: 492, clientY: 21}); + equal(editor.body.style.cursor, 'col-resize', '检查鼠标显示'); + + ua.mousedown(tds[4], {clientX: 492, clientY: 21}); + setTimeout(function () { + ua.mousemove(tds[4], {clientX: 481, clientY: 21}); + ua.mouseup(tds[4], {clientX: 481, clientY: 21}); + setTimeout(function () { + var width2 = te.obj[0].body.getElementsByTagName('td')[4].width; + ok(width1 != width2 , '拖拽后单元格宽度改变'); + start(); + }, 50); + }, 400); + stop(); +}); +test('拖拽-最下边的单元格', function () { +// if (ua.browser.ie ) return;//todo 1.3.0 + + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable'); + var tds = te.obj[0].body.getElementsByTagName('td'); + var height1 = tds[20].height; + ua.mousemove(tds[24], {clientX: 439, clientY: 512}); + ua.mousedown(tds[24], {clientX: 439, clientY: 512}); + equal(editor.body.style.cursor, 'row-resize', '检查鼠标显示'); + + setTimeout(function () { + ua.mousemove(tds[24], {clientX: 439, clientY: 562}); + ua.mouseup(tds[24], {clientX: 439, clientY: 562}); + setTimeout(function () { + var height2 = te.obj[0].body.getElementsByTagName('td')[20].height; + ok(height2 - height1 > 10, '拖拽后单元格宽度改变'); + start(); + }, 50); + }, 400); + stop(); +}); +test('trace 3022 表格名称中backspace、ctrl+z、enter', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable', {numCols: 3, numRows: 3}); +// expect(9); + editor.addListener('saveScene', function () { + ok(true); + }); + stop(); + setTimeout(function () { + var trs = editor.body.firstChild.getElementsByTagName('tr'); + range.setStart(trs[0].cells[0], 0).collapse(true).select(); + editor.execCommand('insertcaption'); + ua.keydown(editor.body, {'keyCode': 8}); + setTimeout(function () { + + range.setStart(trs[0].cells[0], 0).collapse(true).select(); + ua.keydown(editor.body, {'keyCode': 90, 'ctrlKey': true}); + setTimeout(function () { + ua.keydown(editor.body, {'keyCode': 13}); + equal(te.obj[0].body.getElementsByTagName('caption').length, 1, '撤销删除caption'); + equal(te.obj[0].body.getElementsByTagName('th').length, 0, '不会误插入标题行'); + equal(te.obj[0].body.getElementsByTagName('table').length, 1, '不会增加表格数量'); + equal(te.obj[0].body.getElementsByTagName('tr').length, 3, '不会增加表格行数量'); + equal(te.obj[0].body.getElementsByTagName('tr')[0].cells.length, 3, '不会增加表格列数量'); + equal(te.obj[0].selection.getRange().collapsed, true, '检查光标'); + + if(!ua.browser.gecko && !ua.browser.webkit)//todo 1.3.6 ff 回退后光标找不好 + equal(te.obj[0].selection.getRange().startContainer.parentNode, te.obj[0].body.getElementsByTagName('td')[0], '检查光标'); + start(); + }, 20); + }, 20); + }, 50); +}); + + + +/*trace 3067*/ +test('trace 3067 向右合并--tab键', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable', {numCols: 2, numRows: 2}); + ua.manualDeleteFillData(editor.body); + + var tds = editor.body.getElementsByTagName('td'); + range.setStart(tds[0], 0).collapse(true).select(); + editor.execCommand('mergeright'); + range.setStart(tds[0], 0).collapse(true).select(); + range = editor.selection.getRange(); + var common = range.getCommonAncestor(true, true); + equal(common.colSpan, 2, 'tab键前光标位于合并后的单元格中'); + ua.keydown(editor.body, {'keyCode': 9}); + setTimeout(function () { + range = editor.selection.getRange(); + common = range.getCommonAncestor(true, true); + equal(common.colSpan, 1, 'tab键前光标跳到合并后单元格的下一个单元格中'); + start(); + }, 20); + stop(); +}); + +/*trace 3100*/ +test('trace 3100 表格名称中tab键', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable', {numCols: 3, numRows: 3}); + var trs = editor.body.firstChild.getElementsByTagName('tr'); + range.setStart(trs[0].cells[0], 0).collapse(true).select(); + editor.execCommand('insertcaption'); + range.setStart(editor.body.getElementsByTagName('caption')[0], 0).collapse(true).select(); + ua.keydown(editor.body, {'keyCode': 9}); + stop(); + setTimeout(function () { + editor = te.obj[0]; + equal(editor.body.getElementsByTagName('caption').length, 1, '不会删除caption'); + equal(editor.body.getElementsByTagName('th').length, 0, '不会误插入标题行'); + equal(editor.body.getElementsByTagName('table').length, 1, '不会增加表格数量'); + equal(editor.body.getElementsByTagName('tr').length, 3, '不会增加表格行数量'); + equal(editor.body.getElementsByTagName('tr')[0].cells.length, 3, '不会增加表格列数量'); + equal(editor.selection.getRange().collapsed, true, '检查光标'); + if (!ua.browser.ie) //ie8下会导致堆栈溢出,奇葩的bug,以后不溢出再检查ie8 + equal(editor.selection.getRange().startContainer, te.obj[0].body.getElementsByTagName('td')[0], '检查光标'); + start(); + }, 50); +}); + +/*trace 3059*/ +test('trace 3059 表格右浮动', function () { + if (ua.browser.ie)return;//TODO 1.2.6 + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable'); + ua.manualDeleteFillData(editor.body); + var tds = te.obj[0].body.getElementsByTagName('td'); + var oldWidth = tds[0].offsetWidth; + ua.mousemove(tds[0], {clientX: 105, clientY: 20}); + ua.mousedown(tds[0], {clientX: 105, clientY: 20}); + ua.mouseup(tds[0], {clientX: 105, clientY: 20}); + setTimeout(function () { + + ua.mousedown(tds[0], {clientX: 105, clientY: 20}); + ua.mouseup(tds[0], {clientX: 105, clientY: 20}); + + setTimeout(function () { + tds = editor.body.firstChild.getElementsByTagName('td'); + ok(tds[0].offsetWidth < oldWidth, '第一列宽度变小'); + range.setStart(tds[0], 0).collapse(true).select(); + editor.execCommand('tablealignment', 'right'); + var table = te.obj[0].body.getElementsByTagName('table')[0]; + equal(table.align, 'right', '表格右浮动'); + + start(); + + }, 500); + + }, 50); + + stop(); + +}); + +test('trace 3378:拖拽后tab,不影响表格样式', function () { + if (ua.browser.ie && ua.browser.ie < 8) return; + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable'); + ua.manualDeleteFillData(editor.body); + var tds = te.obj[0].body.getElementsByTagName('td'); + var width1 = tds[1].width; + ua.mousemove(tds[1], {clientX: 199, clientY: 100}); + ua.mousedown(tds[1], {clientX: 199, clientY: 100}); + setTimeout(function () { + ua.mousemove(tds[1], {clientX: 299, clientY: 100}); + ua.mouseup(tds[1], {clientX: 299, clientY: 100}); + var width2 = tds[1].width; + ok(width2 - width1 > 50, '拖拽后单元格宽度改变'); + range.setStart(tds[24], 0).collapse(true).select(); + ua.keydown(editor.body, {'keyCode': 9}); + setTimeout(function () { + equal(tds[1].width, width2, 'tab键不影响单元格宽度'); + start(); + }, 20); + }, 400); + stop(); +}); + +//超时,暂时注掉 +test('表格粘贴', function () { + var div = document.body.appendChild(document.createElement('div')); + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent(''); + editor.execCommand('inserttable'); + /*插入表格*/ + var tds = editor.body.getElementsByTagName('td'); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(tds[0], tds[24]); + ut.setSelected(cellsRange); + /*确定选区*/ + range.setStart(tds[0], 0).collapse(true).select(); + /*定光标*/ + ua.keydown(editor.body, {'keyCode': 67, 'ctrlKey': true}); + /*ctrl+c*/ + var html = {html: editor.body.innerHTML}; + range.setStart(editor.body.lastChild, 0).collapse(true).select(); + equal(editor.body.getElementsByTagName('table').length, '1', '触发粘贴事件前有1个table'); + editor.fireEvent('beforepaste', html); + /*粘贴*/ + editor.fireEvent("afterpaste"); + equal(editor.body.getElementsByTagName('table').length, '2', '触发粘贴事件后有2个table'); +}); +// +//test('trace 3104 粘贴后合并单元格',function(){ +// var div = document.body.appendChild(document.createElement('div')); +// var editor = te.obj[0]; +// var range = te.obj[1]; +// editor.setContent(''); +// editor.execCommand('inserttable'); +// var trs = editor.body.getElementsByTagName('tr'); +// var ut = editor.getUETable(editor.body.firstChild); +// var cellsRange = ut.getCellsRange(trs[0].cells[0],trs[4].cells[0]); +// ut.setSelected(cellsRange); +// range.setStart( trs[0].cells[0], 0 ).collapse( true ).select(); +// ua.keydown(editor.body,{'keyCode':67,'ctrlKey':true}); +// ut.clearSelected(); +// var html ={html:editor.body.innerHTML}; +// range.setStart(editor.body.lastChild,0).collapse(true).select(); +// editor.fireEvent('beforepaste',html); +// editor.fireEvent("afterpaste"); +// var table = editor.body.getElementsByTagName('table'); +// equal(table.length,'2','触发粘贴事件后有2个table'); +// equal(table[1].firstChild.childNodes.length,'5','5行'); +// equal(table[1].firstChild.firstChild.childNodes.length,'1','1列'); +// +// var tds = editor.body.getElementsByTagName('td'); +// ut = editor.getUETable(editor.body.firstChild.nextSibling); +// cellsRange = ut.getCellsRange(tds[25],tds[29]); +// ut.setSelected(cellsRange); +// range.setStart(tds[25], 0 ).collapse( true ).select(); +// editor.execCommand('mergecells'); +// table = editor.body.getElementsByTagName('table'); +// equal(table[1].firstChild.childNodes.length,'1','1行'); +// equal(table[1].firstChild.firstChild.childNodes.length,'1','1列'); +//}); +// +test('trace 3105 在表格名称中粘贴', function () { + var div = document.body.appendChild(document.createElement('div')); + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent(''); + editor.execCommand('inserttable', {numCols: 2, numRows: 2}); + range.setStart(editor.body.getElementsByTagName('td')[0], 0).collapse(true).select(); + editor.execCommand('insertcaption'); + var str = ua.getChildHTML(editor.body); + var ut = editor.getUETable(editor.body.firstChild); + var tds = editor.body.getElementsByTagName('td'); + var cellsRange = ut.getCellsRange(tds[0], tds[1]); + ut.setSelected(cellsRange); + range.setStart(tds[0], 0).collapse(true).select(); + + ua.keydown(editor.body, {'keyCode': 67, 'ctrlKey': true}); + var html = {html: editor.body.innerHTML}; + range.setStart(editor.body.getElementsByTagName('caption')[0], 0).collapse(true).select(); + editor.fireEvent('beforepaste', html); + editor.fireEvent("afterpaste"); + ut.clearSelected(); + equal(editor.body.getElementsByTagName('table').length, '1', '触发粘贴事件后有1个table'); + equal(ua.getChildHTML(editor.body), str, '粘贴无效'); +}); + +test('trace 3106 粘贴标题行', function () { + var div = document.body.appendChild(document.createElement('div')); + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent(''); + editor.execCommand('inserttable'); + var tds = editor.body.getElementsByTagName('td'); + range.setStart(tds[0], 0).collapse(true).select(); + editor.execCommand('inserttitle'); + var ut = editor.getUETable(editor.body.firstChild); + var ths = editor.body.getElementsByTagName('th'); + var cellsRange = ut.getCellsRange(ths[0], ths[4]); + ut.setSelected(cellsRange); + range.setStart(ths[0], 0).collapse(true).select(); + + ua.keydown(editor.body, {'keyCode': 67, 'ctrlKey': true}); + var html = {html: editor.body.innerHTML}; + range.setStart(editor.body.lastChild, 0).collapse(true).select(); + editor.fireEvent('beforepaste', html); + editor.fireEvent("afterpaste"); + equal(editor.body.getElementsByTagName('table').length, '2', '触发粘贴事件后有2个table'); + if (ua.browser.gecko) { + //这个比较没意义 +// equal(editor.body.firstChild.firstChild.firstChild.firstChild.tagName.toLowerCase(),'td','不是th,是td'); + range.setStart(editor.body.firstChild.firstChild.firstChild.firstChild, 0).collapse(true).select(); + equal(editor.queryCommandState('inserttable'), -1, '应当不可以插入表格'); + equal(editor.queryCommandState('mergeright'), 0, '应当可以右合并单元格'); + } + else { +// equal(editor.body.firstChild.nextSibling.firstChild.firstChild.firstChild.tagName.toLowerCase(),'td','不是th,是td'); + range.setStart(editor.body.firstChild.nextSibling.firstChild.firstChild.firstChild, 0).collapse(true).select(); + equal(editor.queryCommandState('inserttable'), -1, '应当不可以插入表格'); + equal(editor.queryCommandState('mergeright'), 0, '应当可以右合并单元格'); + } +}); + +test('trace 3114 在单元格内粘贴行', function () { + var div = document.body.appendChild(document.createElement('div')); + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent(''); + editor.execCommand('inserttable'); + var tds = editor.body.getElementsByTagName('td'); + + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(tds[0], tds[9]); + ut.setSelected(cellsRange); + range.setStart(tds[0], 0).collapse(true).select(); + ua.keydown(editor.body, {'keyCode': 67, 'ctrlKey': true}); + var html = {html: editor.body.innerHTML}; + range.setStart(tds[0], 0).collapse(true).select(); + editor.fireEvent('beforepaste', html); + editor.fireEvent("afterpaste"); + equal(editor.body.getElementsByTagName('table').length, '1', '触发粘贴事件后有1个table'); + stop(); + setTimeout(function () { + editor.execCommand('source'); + setTimeout(function () { + editor.execCommand('source'); + equal(editor.body.getElementsByTagName('tr').length, '7', '触发粘贴事件后有7个tr'); + start(); + }, 50); + }, 50); +}); +test('在单元格中粘贴_粘到最后', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent(''); + editor.execCommand('inserttable', {numCols: 3, numRows: 3}); + /*插入表格*/ + var tds = editor.body.getElementsByTagName('td'); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(tds[0], tds[4]); + ut.setSelected(cellsRange); + /*确定选区*/ + range.setStart(tds[0], 0).collapse(true).select(); + /*定光标*/ + ua.keydown(editor.body, {'keyCode': 67, 'ctrlKey': true}); + /*ctrl+c*/ + var html = {html: editor.body.innerHTML}; + range.setStart(tds[8], 0).collapse(true).select(); + equal(editor.body.getElementsByTagName('tr').length, 3, '触发粘贴事件前有3个tr'); + equal(editor.body.getElementsByTagName('td').length, 9, '触发粘贴事件前有9个td'); + editor.fireEvent('beforepaste', html); + /*粘贴*/ + editor.fireEvent("afterpaste"); + equal(editor.body.getElementsByTagName('tr').length, 4, '触发粘贴事件后有4个tr'); + equal(editor.body.getElementsByTagName('td').length, 16, '触发粘贴事件后有12个td'); +}); +test('在单元格中粘贴_整列', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent(''); + editor.execCommand('inserttable', {numCols: 3, numRows: 3}); + /*插入表格*/ + var tds = editor.body.getElementsByTagName('td'); + range.setStart(tds[0], 0).collapse(true).select(); + editor.execCommand('inserttitle'); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(tds[0], tds[6]); + ut.setSelected(cellsRange); + /*确定选区*/ + range.setStart(tds[0], 0).collapse(true).select(); + /*定光标*/ + ua.keydown(editor.body, {'keyCode': 67, 'ctrlKey': true}); + /*ctrl+c*/ + var html = {html: editor.body.innerHTML}; + range.setStart(tds[6], 0).collapse(true).select(); + equal(editor.body.getElementsByTagName('tr').length, 4, '触发粘贴事件前有4个tr'); + equal(editor.body.getElementsByTagName('th').length, 3, '触发粘贴事件前有3个th'); + equal(editor.body.getElementsByTagName('td').length, 9, '触发粘贴事件前有9个td'); + editor.fireEvent('beforepaste', html); + /*粘贴*/ + editor.fireEvent("afterpaste"); + equal(editor.body.getElementsByTagName('tr').length, 4, '触发粘贴事件后有4个tr'); + equal(editor.body.getElementsByTagName('th').length, 4, '触发粘贴事件前有4个th'); + equal(editor.body.getElementsByTagName('td').length, 12, '触发粘贴事件后有12个td'); +}); +test('点击一行的最左边,选中一行', function () { + if (ua.browser.ie && ua.browser.ie < 9)return;//todo click事件模拟有问题 + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent(''); + editor.execCommand('inserttable', {numCols: 2, numRows: 3}); + /*插入表格*/ + setTimeout(function () { + var tds = editor.body.getElementsByTagName('td'); + tds[0].innerHTML = 'hello1'; + tds[1].innerHTML = 'hello2'; + ua.mousemove(tds[0], {clientX: 8, clientY: 24}); + ua.click(tds[0], {clientX: 8, clientY: 24}); + setTimeout(function () { + var space = ua.browser.ie ? '' : ' '; + var quot = ua.browser.gecko ? '\"' : ''; + equal(editor.body.style.cursor, 'url(' + quot + editor.options.cursorpath + 'v.png' + quot + '),' + space + 'pointer'); +// //me.body.style.cursor + var selectedTds = editor.getUETable(editor.body.firstChild).selectedTds; + equal(selectedTds.length, 2, '选中一行'); + equal(selectedTds[0].className, 'selectTdClass', '检查样式'); + equal(selectedTds[1].className, 'selectTdClass', '检查样式'); + equal(selectedTds[0].innerHTML, 'hello1', '检查内容'); + equal(selectedTds[1].innerHTML, 'hello2', '检查内容'); + //todo trace 3571 +// ua.click(tds[2],{clientX:12,clientY:24,shiftKey:true}); +// equal(editor.getUETable(editor.body.firstChild).selectedTds.length,6,''); + start(); + }, 50); + }, 50); + stop(); +}); + +test('点击一行的最左边,但是每行只有一列,这时选中单元格中的内容', function () { + if (ua.browser.ie && ua.browser.ie < 9)return;//todo click事件模拟有问题 + var editor = te.obj[0]; + editor.setContent(''); + editor.execCommand('inserttable', {numCols: 1, numRows: 1}); + /*插入表格*/ + var tds = editor.body.getElementsByTagName('td'); + tds[0].innerHTML = 'hello'; + setTimeout(function () { + window.scrollTo(0,0);//保证位置准确 + + ua.click(tds[0], {clientX: 10, clientY: 23}); + setTimeout(function () { + var selectedTds = editor.getUETable(editor.body.firstChild).selectedTds; + equal(selectedTds.length, 0, '不选中行'); + if (ua.browser.ie>8) { + ua.checkResult(editor.selection.getRange(), tds[0].firstChild, tds[0].firstChild, 0, 5, false, '检查选中的range'); + } else { + ua.checkResult(editor.selection.getRange(), tds[0], tds[0], 0, 1, false, '检查选中的range'); + } + start(); + }, 500); + }, 500); + stop(); +}); +test('点击一列的最上边,但是每列只有一行,这时选中单元格中的内容', function () { + if (ua.browser.ie && ua.browser.ie < 9)return;//todo click事件模拟有问题 + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent(''); + editor.execCommand('inserttable', {numCols: 1, numRows: 1}); + /*插入表格*/ + stop(); + setTimeout(function () { + var tds = editor.body.getElementsByTagName('td'); + tds[0].innerHTML = 'hello'; + window.scrollTo(0,0);//保证位置准确 + ua.click(tds[0], {clientX: 81, clientY: 9,pageX: 81, pageY: 9}); + setTimeout(function () { + var selectedTds = editor.getUETable(editor.body.firstChild).selectedTds; + equal(selectedTds.length, 0, '不选中列'); + if (ua.browser.ie>8) { + ua.checkResult(editor.selection.getRange(), tds[0].firstChild, tds[0].firstChild, 0, 5, false, '检查选中的range'); + } else { + ua.checkResult(editor.selection.getRange(), tds[0], tds[0], 0, 1, false, '检查选中的range'); + } + start(); + },10); + }, 50); +}); +test('点击一列的最上边,选中一列', function () { + if (ua.browser.ie && ua.browser.ie < 9)return;//todo click事件模拟有问题 + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent(''); + editor.execCommand('inserttable', {numCols: 3, numRows: 3}); + + /*插入表格*/ + stop(); + setTimeout(function () { + var tds = editor.body.getElementsByTagName('td'); + tds[0].innerHTML = 'hello'; + window.scrollTo(0,0); + ua.mousemove(tds[0], {clientX: 81, clientY: 9}); + var space = ua.browser.ie ? '' : ' '; + var quot = ua.browser.gecko ? '\"' : ''; + equal(editor.body.style.cursor, 'url(' + quot + editor.options.cursorpath + 'h.png' + quot + '),' + space + 'pointer'); + ua.click(tds[0], {clientX: 81, clientY: 9}); + setTimeout(function () { + var selectedTds = editor.getUETable(editor.body.firstChild).selectedTds; + equal(selectedTds.length, 3, '选中一列'); + equal(selectedTds[0].innerHTML, 'hello', '检查内容'); + equal(selectedTds[0].className, 'selectTdClass', '检查样式'); + equal(selectedTds[1].className, 'selectTdClass', '检查样式'); + equal(selectedTds[2].className, 'selectTdClass', '检查样式'); + + //todo trace 3571 +// ua.click(tds[2],{clientX:370,clientY:9,shiftKey:true}); +// equal(editor.getUETable(editor.body.firstChild).selectedTds.length,9,''); + start(); + }, 500); + }, 50); +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/table.cmds.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/table.cmds.js new file mode 100644 index 000000000..aca0c18e0 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/table.cmds.js @@ -0,0 +1,1519 @@ +module('plugins.table'); +//test('',function(){stop()}) +/*trace992,合并单元格后多了一个td*/ +test('向右合并--拆分成列', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable', {numCols:2, numRows:2}); + ua.manualDeleteFillData(editor.body); + + var tds = editor.body.getElementsByTagName('td'); + range.setStart(tds[0], 0).collapse(true).select(); + editor.execCommand('mergeright'); + range.setStart(tds[1], 0).collapse(true).select(); + editor.execCommand('mergeright'); + tds = editor.body.getElementsByTagName('td'); + equal(tds.length, 2, '2个单元格'); + equal(tds[0].getAttribute('colspan'), 2, '第一行的单元格colspan为2'); + equal(tds[1].getAttribute('colspan'), 2, '第二行的单元格colspan为2'); + ua.manualDeleteFillData(editor.body); + setTimeout(function () { + editor.execCommand('source'); + start(); + }); + stop(); + tds = editor.body.getElementsByTagName('td'); + equal(tds.length, 2, '2个单元格'); + equal(tds[0].getAttribute('colspan'), 2, '切换到源码后第一个的单元格colspan'); + equal(tds[1].getAttribute('colspan'), 2, '切换到源码后第二行第一个的单元格colspan'); + + range.setStart(tds[0], 0).collapse(true).select(); + editor.execCommand('splittocols'); + equal(tds[0].getAttribute('colspan'), 1, '拆分--[0][0]单元格colspan'); + equal(tds[0].rowSpan, 1, '拆分--[0][0]单元格rowspan'); +}); +test('trace 3985 向右合并--拆分成列:th', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable', {numCols:2, numRows:2}); + var tds = editor.body.getElementsByTagName('td'); + range.setStart(tds[0],0).collapse(true).select(); + editor.execCommand('inserttitle'); + var ths = editor.body.getElementsByTagName('th'); + range.setStart(ths[0], 0).collapse(true).select(); + editor.execCommand('mergeright'); + ths = editor.body.getElementsByTagName('th'); + equal(ths.length, 1, '1个th'); + range.setStart(ths[0], 0).collapse(true).select(); + editor.execCommand('splittocols'); + equal(editor.body.getElementsByTagName('th').length, 2, '拆分单元格th'); +}); +test('trace 3985 向下合并-拆分成行', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable', {numCols:2, numRows:2}); + ua.manualDeleteFillData(editor.body); + var tds = editor.body.getElementsByTagName('td'); + + range.setStart(tds[0], 0).collapse(true).select(); + editor.execCommand('mergedown'); + range.setStart(tds[1], 0).collapse(true).select(); + editor.execCommand('mergedown'); + tds = editor.body.getElementsByTagName('td'); + equal(tds.length, 2, '2个单元格'); + equal(tds[0].getAttribute('rowspan'), 2, '合并--[0][0]单元格rowspan'); + equal(tds[1].getAttribute('rowspan'), 2, '合并--[0][1]单元格rowspan'); + + range.setStart(tds[0], 0).collapse(true).select(); + editor.execCommand('splittorows'); + range.setStart(tds[1], 0).collapse(true).select(); + editor.execCommand('splittorows'); + equal(tds[0].colSpan, 1, '拆分--[0][0]单元格colspan'); + equal(tds[0].getAttribute('rowspan'), 1, '拆分--[0][0]单元格rowspan'); +}); + +test('完全拆分单元格', function () { + if (ua.browser.ie&&ua.browser.ie >8)return;//todo ie9,10改range bug trace 单元格不能框选 + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable', {numCols:3, numRows:3}); + ua.manualDeleteFillData(editor.body); + + setTimeout(function () { + var trs = editor.body.firstChild.getElementsByTagName('tr'); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[0].cells[0], trs[1].cells[1]); + ut.setSelected(cellsRange); + range.setStart(trs[0].cells[0], 0).collapse(true).select(); + + editor.execCommand('mergecells'); + ut.clearSelected(); + var tds = editor.body.getElementsByTagName('td'); + equal(tds.length, 6, '单元格数'); + equal(tds[0].getAttribute('colspan'), 2, '合并--[0][0]单元格colspan'); + equal(tds[0].getAttribute('rowspan'), 2, '合并--[0][0]单元格rowspan'); + + editor.execCommand('splittoCells'); + equal(tds.length, 9, '单元格数'); + equal(tds[0].getAttribute('colspan'), 1, '拆分--[0][0]单元格colspan'); + equal(tds[0].getAttribute('rowspan'), 1, '拆分--[0][0]单元格rowspan'); + equal(tds[1].colSpan, 1, '拆分--[0][1]单元格colspan'); + equal(tds[1].getAttribute('rowspan'), 1, '拆分--[0][1]单元格rowspan'); + + editor.undoManger.undo(); + equal(tds[0].getAttribute('colspan'), 2, '撤销--[0][0]单元格colspan'); + equal(tds[0].getAttribute('rowspan'), 2, '撤销--[0][0]单元格rowspan'); + start(); + }, 50); + stop(); +}); + +test('删除table', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable'); + ua.manualDeleteFillData(editor.body); + equal(editor.queryCommandState('deletetable'), -1, '删除按钮灰色'); + + var tds = editor.body.getElementsByTagName('td'); + range.setStart(tds[0], 0).collapse(true).select(); + editor.execCommand('deletetable'); + ua.manualDeleteFillData(editor.body); + var table = editor.body.getElementsByTagName('table')[0]; + equal(table, undefined, '删除成功'); +}); + +test('平均分配行列', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + var html = '









    '; + editor.setContent(html); + var trs = editor.body.firstChild.getElementsByTagName('tr'); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[1].cells[0], trs[1].cells[2]); + ut.setSelected(cellsRange); + range.setStart(trs[1].cells[0], 0).collapse(true).select(); + editor.execCommand('averagedistributecol'); + ut.clearSelected(); + equal(editor.body.firstChild.getElementsByTagName('td')[1].width, editor.body.firstChild.getElementsByTagName('td')[2].width, '平均分配各列'); + cellsRange = ut.getCellsRange(trs[1].cells[0], trs[3].cells[0]); + ut.setSelected(cellsRange); + range.setStart(trs[1].cells[0], 0).collapse(true).select(); + editor.execCommand('averagedistributerow'); + ut.clearSelected(); + trs = editor.body.firstChild.getElementsByTagName('tr'); + equal(trs[2].cells[0].height, trs[3].cells[0].height, '平均分配各行'); +}); +test('选部分行时,平均分布行/选部分列时,平均分布列', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + var html = '









    '; + editor.setContent(html); + var trs = editor.body.firstChild.getElementsByTagName('tr'); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[0].cells[0], trs[1].cells[2]); + ut.setSelected(cellsRange); + range.setStart(trs[0].cells[0], 0).collapse(true).select(); + editor.execCommand('averagedistributerow'); + ut.clearSelected(); + trs = editor.body.firstChild.getElementsByTagName('tr'); + equal(trs[1].cells[0].height, trs[0].cells[0].height, '平均分配各行'); + cellsRange = ut.getCellsRange(trs[0].cells[0], trs[2].cells[1]); + ut.setSelected(cellsRange); + range.setStart(trs[0].cells[0], 0).collapse(true).select(); + editor.execCommand('averagedistributecol'); + ut.clearSelected(); + equal(editor.body.firstChild.getElementsByTagName('td')[0].width, editor.body.firstChild.getElementsByTagName('td')[1].width, '平均分配各列'); +}); + +test('表格中设置对齐方式', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    hello

    '); + stop(); + setTimeout(function(){ + var caption = editor.body.getElementsByTagName('caption'); + range.setStart(caption[0], 0).collapse(true).select(); + editor.execCommand('cellalignment', {align:'right', vAlign:'top'}); + equal(caption[0].style.textAlign, 'right', 'caption对齐方式为右上对齐'); + equal(caption[0].style.verticalAlign, 'top', 'caption对齐方式为右上对齐'); + var tds = editor.body.getElementsByTagName('td'); + range.setStart(tds[0], 0).collapse(true).select(); + editor.execCommand('cellalignment', {align:'right', vAlign:'top'}); + equal(tds[0].align, 'right', 'td对齐方式为右上对齐'); + equal(tds[0].vAlign, 'top', 'td对齐方式为右上对齐'); + //*不闭合设置对齐方式*//* + range.selectNode(tds[1].firstChild, 0).select(); + editor.execCommand('cellalignment', {align:'center', vAlign:'middle'}); + equal(tds[1].align, 'center', 'p对齐方式为居中对齐'); + start(); + },50); + +}); + +test('修改table屬性', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable', {numCols:2, numRows:3}); + range.setStart(editor.body.getElementsByTagName('td')[0], 0).collapse(true).select(); + editor.execCommand('tablealignment', 'center'); + var table = editor.body.getElementsByTagName('table')[0]; + equal(table.align, 'center', '对齐方式居中'); + range.setStart(editor.body.getElementsByTagName('td')[0], 0).collapse(true).select(); + editor.execCommand('edittable', '#ff0000'); + ua.manualDeleteFillData(editor.body); + var tds = editor.body.getElementsByTagName('td'); + if (ua.browser.ie && ua.browser.ie < 9) { + equal(tds[0].style.borderColor, '#ff0000', '边框颜色:红色'); + } else { + equal(tds[0].style.borderColor, 'rgb(255, 0, 0)', '边框颜色:红色'); + } + equal(editor.queryCommandState('edittable'), 0, 'state'); +}); + +test('修改单元格', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable'); + var tds = editor.body.getElementsByTagName('td'); + range.setStart(tds[2], 0).collapse(true).select(); + editor.execCommand('edittd', '#9bbb59'); + if (ua.browser.ie && ua.browser.ie < 9) { + equal(tds[2].style.backgroundColor, '#9bbb59', '背景颜色'); + } else { + equal(tds[2].style.backgroundColor, 'rgb(155, 187, 89)', '背景颜色'); + } + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(tds[0], tds[6]); + ut.setSelected(cellsRange); + range.setStart(tds[0], 0).collapse(true).select(); + + editor.execCommand('edittd', '#9bbb59'); + editor.execCommand('cellalignment', {align:'center', vAlign:'bottom'}); + ut.clearSelected(); + tds = editor.body.firstChild.getElementsByTagName('td'); + if (ua.browser.ie && ua.browser.ie < 9) { + equal(tds[5].style.backgroundColor, '#9bbb59', '背景颜色'); + } else { + equal(tds[5].style.backgroundColor, 'rgb(155, 187, 89)', '背景颜色'); + } + equal(tds[5].align, 'center', '水平居中'); + equal(tds[5].vAlign, 'bottom', '下方'); + equal(editor.queryCommandState('edittd'), 0, 'state'); + equal(editor.queryCommandState('cellalignment'), 0, 'state'); +}); + +test('表格前插行', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable'); + var tds = editor.body.firstChild.getElementsByTagName('td'); + range.setStart(tds[1], 0).collapse(true).select(); + editor.execCommand('insertparagraphbeforetable'); + ua.manualDeleteFillData(editor.body); + var br = ua.browser.ie ? ' ' : '
    '; + equal(editor.body.firstChild.innerHTML, br, '表格前插行'); +}); + +test('插入行', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable', {numCols:3, numRows:3}); + ua.manualDeleteFillData(editor.body); + var tds = editor.body.getElementsByTagName('td'); + range.setStart(tds[0], 0).collapse(true).select(); + editor.execCommand('mergedown'); + range.setStart(tds[4], 0).collapse(true).select(); + editor.execCommand('insertrow'); + tds = editor.body.getElementsByTagName('td'); + equal(tds[0].getAttribute('rowspan'), 3, '[0][0]单元格rowspan'); + editor.undoManger.undo(); + equal(tds[0].getAttribute('rowspan'), 2, '[0][0]单元格rowspan'); +}); +test('选中两行,插入行', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('
    hello
    '); + var trs = editor.body.firstChild.getElementsByTagName('tr'); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[0].cells[0], trs[1].cells[0]); + ut.setSelected(cellsRange); + range.setStart(trs[0].cells[0], 0).collapse(true).select(); + editor.execCommand('insertrow'); + ut.clearSelected(); + equal(editor.body.getElementsByTagName('tr').length, 5, '选中两行,前插行,3行变5行'); + trs = editor.body.firstChild.getElementsByTagName('tr'); + ua.manualDeleteFillData(trs[2]); + equal(trs[2].cells[0].innerHTML,'hello','原来的第1行变成第3行'); + ut = editor.getUETable(editor.body.firstChild); + cellsRange = ut.getCellsRange(trs[2].cells[0], trs[3].cells[0]); + ut.setSelected(cellsRange); + range.setStart(trs[2].cells[0], 0).collapse(true).select(); + editor.execCommand('insertrownext'); + ut.clearSelected(); + equal(editor.body.getElementsByTagName('tr').length, 7,'选中两行,前插行,5行变7行'); + trs = editor.body.firstChild.getElementsByTagName('tr'); + ua.manualDeleteFillData(trs[2]); + equal(trs[2].cells[0].innerHTML,'hello',''); +}); +test('选中两列,插入列', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('
    hello
    '); + var trs = editor.body.firstChild.getElementsByTagName('tr'); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[0].cells[0], trs[0].cells[1]); + ut.setSelected(cellsRange); + range.setStart(trs[0].cells[0], 0).collapse(true).select(); + editor.execCommand('insertcol'); + ut.clearSelected(); + equal(editor.body.getElementsByTagName('tr')[0].childNodes.length, 5, '选中两列,前插列,3行变5列'); + trs = editor.body.firstChild.getElementsByTagName('tr'); + ua.manualDeleteFillData(trs[0]); + equal(trs[0].cells[2].innerHTML,'hello','原来的第1列变成第3列'); + ut = editor.getUETable(editor.body.firstChild); + cellsRange = ut.getCellsRange(trs[0].cells[2], trs[0].cells[3]); + ut.setSelected(cellsRange); + range.setStart(trs[0].cells[2], 0).collapse(true).select(); + editor.execCommand('insertcolnext'); + ut.clearSelected(); + equal(editor.body.getElementsByTagName('tr')[0].childNodes.length, 7,'选中两列,前插列,5列变7列'); + trs = editor.body.firstChild.getElementsByTagName('tr'); + ua.manualDeleteFillData(trs[0]); + equal(trs[0].cells[2].innerHTML,'hello',''); +}); +test('trace 3986 插入列', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable', {numCols:3, numRows:3}); + ua.manualDeleteFillData(editor.body); + var tds = editor.body.getElementsByTagName('td'); + range.setStart(tds[0], 0).collapse(true).select(); + editor.execCommand('mergeright'); + range.setStart(tds[3], 0).collapse(true).select(); + editor.execCommand('insertcol'); + tds = editor.body.getElementsByTagName('td'); + equal(tds[0].getAttribute('colspan'), 3, '[0][0]单元格colspan'); + editor.undoManger.undo(); + equal(tds[0].getAttribute('colspan'), 2, '[0][0]单元格colspan'); + range.setStart(tds[1], 0).setCursor(); + editor.execCommand("insertcol"); + equal(tds[0].parentNode.cells.length, 3, "插入了一列") +}); +test('带th的表格,插入列', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable', {numCols:2, numRows:3}); + var tds = editor.body.getElementsByTagName('td'); + range.setStart(tds[0],0).collapse(true).select(); + editor.execCommand('inserttitle'); + stop(); + setTimeout(function(){ + var tds = editor.body.getElementsByTagName('td'); + range.setStart(tds[0], 0).collapse(true).select(); + editor.execCommand('insertcol'); + var ths = editor.body.getElementsByTagName('tr')[0].childNodes; + equal(ths.length,3,'第一行有3个单元'); + for(var i=0;i'); + stop(); + setTimeout(function(){ + var trs = editor.body.getElementsByTagName('tr'); + range.setStart(trs[1].cells[0], 0).collapse(true).select(); + editor.execCommand('insertcolnext'); + trs = editor.body.getElementsByTagName('tr'); + equal(trs[1].childNodes.length, 3, '插入一列'); + equal(trs[1].cells[1].tagName.toLowerCase(), 'td', '除第一行以外,插入的不能是th'); + start(); + }, 20); +}); + +test('删除行', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('
    12
    34
    56
    '); + // + + stop(); + setTimeout(function () { + var tds = editor.body.getElementsByTagName('td'); + range.setStart(tds[0], 0).collapse(1).select(); + editor.execCommand('deleterow'); + equal(editor.body.getElementsByTagName('tr').length, 2, '删除行'); + editor.undoManger.undo(); + setTimeout(function () { + equal(editor.body.getElementsByTagName('tr').length, 3, '撤销后的行数'); + tds = editor.body.getElementsByTagName('td'); + range.setStart(tds[5], 0).collapse(1).select(); + editor.execCommand('deleterow'); + setTimeout(function () { + equal(editor.body.getElementsByTagName('tr').length, 2, '删除行'); + var table = editor.document.getElementsByTagName("table")[0]; + var cell = table.rows[0].cells[0]; + setTimeout(function () { + range.setStart(cell, 0).setCursor(); + editor.execCommand("mergeDown"); + equal(cell.rowSpan, 2, "合并了一行"); + editor.execCommand("deleterow"); + equal(table.rows.length, 1, "在合并的单元格中删除行后,表格变成了一行"); + start(); + }, 50); + }, 50); + }, 50); + }, 50); +}); +test('选中部分单元格,删除行列', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable', {numCols: 3, numRows: 3}); + setTimeout(function () { + var trs = editor.body.firstChild.getElementsByTagName('tr'); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[0].cells[0], trs[0].cells[1]); + ut.setSelected(cellsRange); + range.setStart(trs[0].cells[0], 0).collapse(true).select(); + editor.execCommand('deleterow'); + ut.clearSelected(); + equal(editor.body.getElementsByTagName('tr').length, 2, '选中部分单元格,删除行'); + trs = editor.body.firstChild.getElementsByTagName('tr'); + ut = editor.getUETable(editor.body.firstChild); + cellsRange = ut.getCellsRange(trs[0].cells[0], trs[0].cells[1]); + ut.setSelected(cellsRange); + range.setStart(trs[0].cells[0], 0).setEnd(trs[0].cells[1], 1).select(); + editor.execCommand('deletecol'); + ut.clearSelected(); + equal(trs[0].childNodes.length, 1, '选中部分单元格,删除列'); + trs = editor.body.firstChild.getElementsByTagName('tr'); + ut = editor.getUETable(editor.body.firstChild); + cellsRange = ut.getCellsRange(trs[0].cells[0], trs[1].cells[0]); + ut.setSelected(cellsRange); + range.setStart(trs[0].cells[0], 0).collapse(true).select(); + ut.clearSelected(); + editor.execCommand('deletecol'); + equal(editor.body.getElementsByTagName('table').length, 0, '删除列至表格删空'); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable', {numCols: 3, numRows: 3}); + trs = editor.body.firstChild.getElementsByTagName('tr'); + ut = editor.getUETable(editor.body.firstChild); + cellsRange = ut.getCellsRange(trs[0].cells[0], trs[2].cells[0]); + ut.setSelected(cellsRange); + range.setStart(trs[0].cells[0], 0).collapse(true).select(); + editor.execCommand('deleterow'); + ut.clearSelected(); + equal(editor.body.getElementsByTagName('table').length, 0, '删除列至表格删空'); + start(); + }, 50); + stop(); +}); +test('settablebackground', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '

    ' ); + range.setStart( editor.body.firstChild, 0 ).collapse( true ).select(); + editor.execCommand( 'inserttable', {numCols:2,numRows:2} ); + var tds = editor.body.firstChild.getElementsByTagName('td'); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(tds[0], tds[2]); + ut.setSelected(cellsRange); + range.setStart(tds[0], 0).collapse(true).select(); + editor.execCommand("settablebackground",{repeat:true,colorList:["#bbb","#ccc"]}); + setTimeout(function(){ + var br = ua.browser.ie?'':'
    '; + var tds = editor.body.firstChild.getElementsByTagName('td'); + if(ua.browser.ie&&ua.browser.ie<9){ + ok( tds[0].style.backgroundColor === '#bbb', '选区隔行变色, 第一列第一行颜色匹配' ); + ok( tds[2].style.backgroundColor === '#ccc', '选区隔行变色, 第一列第二行颜色匹配' ); + } + else{ + ok( tds[0].style.backgroundColor === 'rgb(187, 187, 187)', '选区隔行变色, 第一列第一行颜色匹配' ); + ok( tds[2].style.backgroundColor === 'rgb(204, 204, 204)', '选区隔行变色, 第一列第二行颜色匹配' ); + } + range.setStart(tds[0], 0).collapse(true).select(); + editor.execCommand('cleartablebackground'); + setTimeout(function(){ + ok( tds[0].style.backgroundColor === '', '取消选区隔行变色, 第一列第一行颜色匹配' ); + ok( tds[2].style.backgroundColor === '', '取消选区隔行变色, 第一列第二行颜色匹配' ); + start(); + },20); + },20); + stop(); +}); +test('interlacetable', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable', {numCols:2, numRows:2}); + var tds = editor.body.getElementsByTagName('td'); + range.setStart(tds[0], 0).collapse(1).select(); + editor.execCommand('interlacetable'); + stop(); + setTimeout(function () { + equal(editor.body.firstChild.attributes['interlaced'].nodeValue, 'enabled', ''); + equal(editor.body.getElementsByTagName('tr')[0].className, 'ue-table-interlace-color-single firstRow', ''); + equal(editor.body.getElementsByTagName('tr')[1].className, 'ue-table-interlace-color-double', ''); + tds = editor.body.getElementsByTagName('td'); + range.setStart(tds[0], 0).collapse(1).select(); + editor.execCommand('uninterlacetable'); + setTimeout(function () { + equal(editor.body.firstChild.attributes['interlaced'].nodeValue, 'disabled', ''); + equal(editor.body.getElementsByTagName('tr')[0].className, 'firstRow', ''); + start(); + }, 20); + }, 20); +}); +// +//*trace 750,1308*//* +//test( 'trace1308:前插入行的样式和原先不同', function() { +// var editor = te.obj[0]; +// var range = te.obj[1]; +// editor.setContent( '

    ' ); +// range.setStart( editor.body.firstChild, 0 ).collapse( true ).select(); +// editor.execCommand( 'inserttable', {numCols:2,numRows:2} ); +// ua.manualDeleteFillData( editor.body ); +// range.setStartAfter( editor.body.firstChild ).collapse( true ).select(); +// //cellborder:2,不支持了 +// editor.execCommand( 'inserttable', {border:2,numCols:2,numRows:2} ); +// var table2 = editor.body.getElementsByTagName( 'table' )[1]; +// range.setStart( table2.getElementsByTagName( 'td' )[0], 0 ).collapse( true ).select(); +// editor.execCommand( 'insertrow' ); +// var tds = table2.getElementsByTagName( 'td' ); +//*//*firefox下用jquery的方式去不到border-width*//* +// for(var index = 0;index

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable', {numCols:2, numRows:2}); + ua.manualDeleteFillData(editor.body); + var tds = editor.body.getElementsByTagName('td'); + tds[1].innerHTML = 'hello'; + range.setStart(tds[0], 0).collapse(true).select(); + editor.execCommand('mergeright'); + var tr = editor.body.getElementsByTagName('tr')[0]; + equal($(tr.firstChild).attr('colspan'), '2', '跨度2列'); + editor.execCommand('splittocols'); + ua.manualDeleteFillData(editor.body); + tds = editor.body.getElementsByTagName('td'); + //1.2版本,合并拆分之后hello前多了空的占位符 + ok(tds[0].innerHTML, '第一个单元格中有内容'); + ok(tds[1].innerHTML == '' || tds[1].innerHTML == '
    ', '第二个单元格中有内容'); +}); + +//*trace 743*//* +test('trace 743:合并单元格后删除列再撤销', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable', {numCols:4, numRows:4}); + ua.manualDeleteFillData(editor.body); + setTimeout(function () { + var trs = editor.body.firstChild.getElementsByTagName('tr'); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[0].cells[0], trs[0].cells[3]); + ut.setSelected(cellsRange); + range.setStart(trs[0].cells[0], 0).collapse(true).select(); + + editor.execCommand('mergecells'); + range.setStart(trs[0].cells[0], 0).collapse(true).select(); + editor.execCommand('deleterow'); + trs = editor.body.getElementsByTagName('tr'); + equal(trs.length, 3, '删除后只剩3个tr'); + editor.undoManger.undo(); + trs = editor.body.getElementsByTagName('tr'); + equal(trs.length, 4, '撤销后有4个tr'); + equal($(trs[0].cells[0]).attr('colspan'), 4, '第一行的第一个单元格colspan为4'); + start(); + }, 50); + stop(); +}); + +//*trace 726*//* +test('trace 726:选中合并过的单元格和普通单元格,查看完全拆分单元格菜单是否高亮', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable', {numCols:4, numRows:4}); + ua.manualDeleteFillData(editor.body); + setTimeout(function () { + var trs = editor.body.firstChild.getElementsByTagName('tr'); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[0].cells[0], trs[1].cells[1]); + ut.setSelected(cellsRange); + range.setStart(trs[0].cells[0], 0).collapse(true).select(); + + editor.execCommand('mergecells'); + equal(editor.queryCommandState('splittocells'), 0, '应当可以拆分单元格'); + setTimeout(function () { + var trs = editor.body.firstChild.getElementsByTagName('tr'); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[0].cells[0], trs[3].cells[3]); + ut.setSelected(cellsRange); + range.setStart(trs[0].cells[0], 0).collapse(true).select(); + editor.queryCommandState('splittocells'); + equal(editor.queryCommandState('splittocells'), -1, '应当不可以拆分单元格'); + start(); + }, 50); + }, 50); + stop(); +}); + +//*trace 718*//* +test('trace 718:2次撤销删除列', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable', {numCols:4, numRows:4}); + ua.manualDeleteFillData(editor.body); + setTimeout(function () { + var trs = editor.body.firstChild.getElementsByTagName('tr'); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[1].cells[1], trs[2].cells[2]); + ut.setSelected(cellsRange); + range.setStart(trs[1].cells[1], 0).collapse(true).select(); + + editor.execCommand('mergecells'); + equal(trs[1].cells[1].rowSpan, 2, 'rowspan 为2'); + equal(trs[1].cells[1].colSpan, 2, 'colspan 为2'); + editor.execCommand('deletecol'); + equal(trs[1].cells.length, 3, '3个td'); + editor.undoManger.undo(); + + trs = editor.body.firstChild.getElementsByTagName('tr'); + equal(trs[1].cells.length, 3, '3个td'); + equal(trs[1].cells[1].rowSpan, 2, 'rowspan 为2'); + equal(trs[1].cells[1].colSpan, 2, 'colspan 为2'); + + range.setStart(trs[1].cells[1], 0).collapse(1).select(); + editor.execCommand('deletecol'); + equal(trs[1].cells.length, 3, '3个td'); + equal(trs[1].cells[1].rowSpan, 2, 'rowspan 为2'); + ok(trs[1].cells[1].colSpan == undefined || trs[1].cells[1].colSpan == 1, 'colspan为1或者undefined'); + start(); + }, 50); + stop(); +}); + +//*trace 1098 *//* +test('trace 1098:多次合并单元格偶切换到源码再切回来', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable', {numCols:3, numRows:3}); + setTimeout(function () { + var trs = editor.body.firstChild.getElementsByTagName('tr'); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[0].cells[0], trs[2].cells[0]); + ut.setSelected(cellsRange); + range.setStart(trs[0].cells[0], 0).collapse(true).select(); + editor.execCommand('mergecells'); + + setTimeout(function () { + trs = editor.body.firstChild.getElementsByTagName('tr'); + ut = editor.getUETable(editor.body.firstChild); + cellsRange = ut.getCellsRange(trs[0].cells[1], trs[2].cells[0]); + ut.setSelected(cellsRange); + range.setStart(trs[0].cells[1], 0).collapse(true).select(); + editor.execCommand('mergecells'); +// + setTimeout(function () { + trs = editor.body.firstChild.getElementsByTagName('tr'); + ut = editor.getUETable(editor.body.firstChild); + cellsRange = ut.getCellsRange(trs[0].cells[2], trs[1].cells[0]); + ut.setSelected(cellsRange); + range.setStart(trs[0].cells[2], 0).collapse(true).select(); + editor.execCommand('mergecells'); + editor.execCommand('source'); + setTimeout(function () { + editor.execCommand('source'); + setTimeout(function () { + trs = editor.body.firstChild.getElementsByTagName('tr'); + equal(trs.length, 3, '3个tr'); + equal(trs[0].cells[0].rowSpan, 3, '第一个单元格rowspan 3'); + equal(trs[0].cells[1].rowSpan, 3, '第二个单元格rowspan 3'); + equal(trs[0].cells.length, 3, '3个td'); + equal(trs[1].cells.length, 0, '0个td'); + equal(trs[2].cells.length, 1, '1个td'); + start(); + }, 50); + }, 50); + }, 50); + }, 50); + }, 50); + stop(); +}); + +//*trace 1307*//* +test('trace 1307:adjustTable--多次合并单元格切换到源码再切回来--选中单元格浏览器会假死', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable', {numCols:4, numRows:4}); + setTimeout(function () { + var trs = editor.body.firstChild.getElementsByTagName('tr'); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[1].cells[0], trs[3].cells[1]); + ut.setSelected(cellsRange); + range.setStart(trs[1].cells[0], 0).collapse(true).select(); + + editor.execCommand('mergecells'); + setTimeout(function () { + var trs = editor.body.firstChild.getElementsByTagName('tr'); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[0].cells[2], trs[2].cells[0]); + ut.setSelected(cellsRange); + range.setStart(trs[0].cells[2], 0).collapse(true).select(); + editor.execCommand('mergecells'); + editor.execCommand('source'); + setTimeout(function () { + editor.execCommand('source'); + setTimeout(function () { + trs = editor.body.getElementsByTagName('tr'); + equal(trs[1].rowIndex, 1, '(1,1)行索引'); + equal(trs[1].cells[0].cellIndex, 0, '(1,0)列索引'); + equal(trs[1].cells[1].cellIndex, 1, '(1,1)列索引'); + equal(trs[2].rowIndex, 2, '(2,2)行索引'); + equal(trs[2].cells[0].cellIndex, 0, '(2,0)列索引'); + + equal(trs[1].cells[0].rowSpan, 3, '第二行第一个单元格rowspan 3'); + equal(trs[1].cells[0].colSpan, 2, '第二行第一个单元格colspan 2'); + equal(trs[0].cells[2].rowSpan, 3, '第一行第三个单元格rowspan 3'); + equal(trs.length, 4, '4个tr'); + equal(trs[0].cells.length, 4, '4个td'); + equal(trs[1].cells.length, 2, '2个td'); + equal(trs[2].cells.length, 1, '1个td'); + equal(trs[3].cells.length, 2, '2个td'); + start(); + }, 50); + }, 50); + }, 50); + }, 50); + stop(); +}); +//*//*trace 2378*//* +//test('不覆盖原来的class',function(){ +// var editor = te.obj[0]; +// editor.setContent('
    '); +// editor.execCommand('source'); +// editor.execCommand('source'); +// var table = editor.body.getElementsByTagName('table'); +// equal($(table).attr('class'),'asdf noBorderTable','table的class'); +//}); + +//*trace 3121*//* +//*trace 3195*//* +test('单元格对齐方式-align', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable', {numCols:3, numRows:3}); + ua.manualDeleteFillData(editor.body); + var trs = editor.body.firstChild.getElementsByTagName('tr'); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[0].cells[0], trs[0].cells[2]); + ut.setSelected(cellsRange); + range.setStart(trs[0].cells[0], 0).collapse(true).select(); + + editor.execCommand('mergecells'); + ut.clearSelected(); + range.setStart(editor.body.getElementsByTagName('td')[0], 0).collapse(true).select(); + editor.execCommand('cellalign', 'center'); + ua.manualDeleteFillData(editor.body); + var tds = editor.body.getElementsByTagName('td'); + equal(tds[0].align, 'center', '第一个单元格居中对齐'); + range.setStart(tds[0], 0).collapse(true).select(); + editor.execCommand('splittocols'); + tds = editor.body.getElementsByTagName('td'); + equal(tds[0].align, 'center', '第一个单元格居中对齐'); + equal(tds[1].align, 'center', '第二个单元格居中对齐'); + equal(tds[2].align, 'center', '第二个单元格居中对齐'); +}); + +test('单元格对齐方式-vAlign', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable', {numCols:2, numRows:2}); + ua.manualDeleteFillData(editor.body); + + range.setStart(editor.body.getElementsByTagName('td')[0], 0).collapse(true).select(); + editor.execCommand('mergedown'); + range.setStart(editor.body.getElementsByTagName('td')[0], 0).collapse(true).select(); + editor.execCommand('cellvalign', 'middle'); + ua.manualDeleteFillData(editor.body); + var tds = editor.body.getElementsByTagName('td'); + equal(tds[0].vAlign, 'middle', '第一个单元格居中对齐'); + range.setStart(tds[0], 0).collapse(true).select(); + editor.execCommand('splittorows'); + tds = editor.body.getElementsByTagName('td'); + equal(tds[0].vAlign, 'middle', '第一个单元格居中对齐'); + equal(tds[2].vAlign, 'middle', '第二个单元格居中对齐'); +}); + +test('adaptbytext,adaptbywindow', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable', {numCols:2, numRows:2}); + range.setStart(editor.body.getElementsByTagName('td')[0], 0).collapse(true).select(); + if(ua.browser.ie!=8) + ok( editor.body.offsetWidth === editor.body.getElementsByTagName('table')[0].offsetWidth ,'默认按窗口计算宽度');//数值不具体计算了 + editor.execCommand('adaptbytext');//parseInt + stop(); + setTimeout(function(){ + equal(editor.body.firstChild.width,'','按内容自适应') + editor.execCommand('adaptbywindow'); + setTimeout(function(){ + ok((parseInt(editor.body.firstChild.width)-editor.body.offsetWidth/2)>0,'默认按窗口计算宽度'); + start(); + },20); + },20); +}); + +test('deletetitle', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '

    ' ); + range.setStart( editor.body.firstChild, 0 ).collapse( true ).select(); + editor.execCommand( 'inserttable', {numCols:2, numRows:2}); + var tds = editor.body.getElementsByTagName('td'); + range.setStart(tds[0],0).collapse(true).select(); + editor.execCommand('inserttitle'); + stop(); + setTimeout(function(){ + var trs = editor.body.firstChild.getElementsByTagName('tr'); + equal(trs.length,3,'表格增加一行'); + for(var i = 0; i< trs[0].childNodes.length;i++){ + equal(trs[0].childNodes[i].tagName.toLowerCase(),'th','增加的th'); + } + range.setStart(tds[0],0).collapse(true).select(); + editor.execCommand('deletetitle'); + setTimeout(function(){ + equal(editor.body.firstChild.getElementsByTagName('tr').length,2,'表格减少一行'); + equal(editor.body.firstChild.getElementsByTagName('tr')[0].firstChild.tagName.toLowerCase(),'td','第一行不是标题'); + start(); + },20); + },20); +}); + +/*trace 3222*/ +test('trace 3222:在合并后的单元格中按tab键', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable'); + ua.manualDeleteFillData(editor.body); + setTimeout(function () { + var trs = editor.body.firstChild.getElementsByTagName('tr'); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[1].cells[1], trs[2].cells[1]); + ut.setSelected(cellsRange); + range.setStart(trs[1].cells[1], 0).collapse(true).select(); + + editor.execCommand('mergecells'); + trs[1].cells[2].innerHTML = 'asd'; + range.setStart(trs[1].cells[1], 0).collapse(true).select(); + ua.keydown(editor.body, {'keyCode':9}); + if (ua.browser.gecko||ua.browser.webkit) + equal(editor.selection.getRange().startContainer.innerHTML, 'asd', '第一次tab键'); + else + equal(editor.selection.getRange().startContainer.data, 'asd', '第一次tab键'); + range.setStart(trs[1].cells[1], 0).collapse(true).select(); + ua.keydown(editor.body, {'keyCode':9}); + if (ua.browser.gecko||ua.browser.webkit) + equal(editor.selection.getRange().startContainer.innerHTML, 'asd', '第二次tab键'); + else + equal(editor.selection.getRange().startContainer.data, 'asd', '第二次tab键'); + start(); + }, 50); + stop(); +}); + +/*trace 3191*/ +test('trace 3191:删除表格名称', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable'); + setTimeout(function () { + var tds = editor.body.getElementsByTagName('td'); + range.setStart(tds[0], 0).collapse(true).select(); + editor.execCommand('insertcaption'); + range.setStart(editor.body.getElementsByTagName('caption')[0], 0).collapse(true).select(); + editor.execCommand('deletecaption'); + equal(editor.body.getElementsByTagName('caption').length, '0', '表格名称被删除'); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + ua.keydown(editor.body, {keyCode: 90, ctrlKey: true}); + equal(editor.body.getElementsByTagName('caption').length, '1', '表格名称被还原'); + start(); + }, 50); + stop(); +}); + +/*trace 3195*/ +test('trace 3195:合并单元格后删除列再撤销', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable', {numCols:4, numRows:4}); + ua.manualDeleteFillData(editor.body); + setTimeout(function () { + var trs = editor.body.firstChild.getElementsByTagName('tr'); + var ut = editor.getUETable(editor.body.firstChild); + trs[0].cells[1].innerHTML = 'asd'; + var cellsRange = ut.getCellsRange(trs[0].cells[0], trs[2].cells[2]); + ut.setSelected(cellsRange); + range.setStart(trs[0].cells[0], 0).collapse(true).select(); + + editor.execCommand('mergecells'); + range.setStart(trs[0].cells[0], 0).collapse(true).select(); + editor.execCommand('splittocols'); + trs = editor.body.getElementsByTagName('tr'); + equal(trs.length, 4, '4个tr'); + equal(trs[0].cells.length, 4, '4个td'); + equal(trs[1].cells.length, 1, '1个td'); + equal(trs[2].cells.length, 1, '1个td'); + equal(trs[3].cells.length, 4, '4个td'); + equal(trs[0].cells[0].vAlign, 'top', '单元格[0][0]的vAlign'); + equal(trs[0].cells[0].align, '', '单元格[0][0]的align'); + equal(trs[0].cells[1].vAlign, 'top', '单元格[0][1]的vAlign'); + equal(trs[0].cells[2].vAlign, 'top', '单元格[0][2]的vAlign'); + if (ua.browser.ie) { + equal(trs[0].cells[1].align, '', '单元格[0][1]的align'); + equal(trs[0].cells[2].align, '', '单元格[0][2]的align'); + } else { + equal(trs[0].cells[1].align, 'null', '单元格[0][1]的align'); + equal(trs[0].cells[2].align, 'null', '单元格[0][2]的align'); + } + start(); + }, 50); + stop(); +}); + +/*trace 3231*/ +test(' trace 3779 trace 3231:向右合并--拆分成列', function () { + if(ua.browser.ie&& ua.browser.ie>8)return;//todo + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable', {numCols:2, numRows:2}); + setTimeout(function () { + ua.manualDeleteFillData(editor.body); + var tds = editor.body.getElementsByTagName('td'); + tds[1].innerHTML = 'asd'; + range.setStart(tds[1], 0).collapse(true).select(); + editor.execCommand('insertcolnext'); + ua.manualDeleteFillData(editor.body); + equal(editor.body.getElementsByTagName('tr')[0].cells.length, '3', '3列'); + equal(editor.body.getElementsByTagName('td')[1].innerHTML, 'asd', '后插入行'); + var br = ua.browser.ie ? '' : '
    '; + equal(editor.body.getElementsByTagName('td')[2].innerHTML, br, '后插入行'); + range.setStart(editor.body.getElementsByTagName('td')[2], 0).collapse(true).select(); + editor.execCommand('insertrownext'); + equal(editor.body.getElementsByTagName('tr').length, 3, '3行'); + editor.execCommand('deletecol'); + equal(editor.body.getElementsByTagName('td')[1].innerHTML, 'asd', ''); + equal(editor.body.getElementsByTagName('td').length, '6', ''); + start(); + }, 50); + stop(); +}); +//test('标题行中底纹',function(){ +// var editor = te.obj[0]; +// var range = te.obj[1]; +// editor.setContent( '

    ' ); +// range.setStart( editor.body.firstChild, 0 ).collapse( true ).select(); +// editor.execCommand( 'inserttable'); +// var tds = editor.body.getElementsByTagName('td'); +// range.setStart(tds[0],0).collapse(true).select(); +// editor.execCommand('inserttitle'); +// +// var ut = editor.getUETable(editor.body.firstChild); +// var ths = editor.body.getElementsByTagName('th'); +// var cellsRange = ut.getCellsRange(ths[0],ths[4]); +// ut.setSelected(cellsRange); +// range.setStart( ths[0], 0 ).collapse( true ).select(); +// editor.execCommand('interlacetable'); +// ut.clearSelected(); +// equal(ths[0].style.backgroundColor,'red','红色'); +//// equal(editor.queryCommandState('settablebackground'),-1,'命令不可用'); +//}); + +/*trace 713*/ +test('trace 713:合并最后一列单元格后再前插入列', function () { + if(ua.browser.ie)//TODO 1.2.6 + return; + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable', {numCols:3, numRows:3}); + setTimeout(function () { + var trs = editor.body.firstChild.getElementsByTagName('tr'); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[0].cells[2], trs[2].cells[2]); + /*合并最后一列的单元格*/ + ut.setSelected(cellsRange); + range.setStart(trs[0].cells[2], 0).collapse(true).select(); + + editor.execCommand('mergecells'); + setTimeout(function () { + equal($(trs[0].cells[2]).attr('rowspan'), 3, '跨3行'); + editor.execCommand('insertcol'); + setTimeout(function () { + /*前插入列*/ + trs = editor.body.getElementsByTagName('tr'); + equal(trs[0].cells.length, 4, '4列'); + equal($(trs[0].cells[3]).attr('rowspan'), 3, '跨3行'); + start(); + }, 50); + }, 50); + }, 50); + stop(); +}); + + +test('inserttitlecol, deletetitlecol', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '

    ' ); + range.setStart( editor.body.firstChild, 0 ).collapse( true ).select(); + editor.execCommand( 'inserttable', {numCols:2, numRows:2}); + var tds = editor.body.getElementsByTagName('td'); + range.setStart(tds[0],0).collapse(true).select(); + editor.execCommand('inserttitlecol'); + stop(); + setTimeout(function(){ + var trs = editor.body.firstChild.getElementsByTagName('tr'); + equal(trs[0].children.length,3,'表格增加一列'); + for(var i = 0; i< trs.length;i++){ + equal(trs[i].childNodes[0].tagName.toLowerCase(),'th','增加的th'); + } + range.setStart(tds[0],0).collapse(true).select(); + editor.execCommand('deletetitlecol'); + setTimeout(function(){ + equal(trs[0].children.length,2,'表格减少一列'); + equal(editor.body.firstChild.getElementsByTagName('tr')[0].firstChild.tagName.toLowerCase(),'td','第一列不是标题'); + start(); + },20); + },20); +}); +/*trace 3216*/ +test('contextMenu trace 3216:前插入行', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + + stop(); + var lang = editor.getLang("contextMenu"); + editor.execCommand('cleardoc'); + editor.execCommand('inserttable'); + var tds = editor.body.getElementsByTagName('td'); + tds[0].innerHTML = 'asd'; + range.setStart(tds[0], 0).collapse(true).select(); + ua.contextmenu(editor.body.firstChild); + var menutable = document.getElementsByClassName("edui-menu-body")[1]; + var forTable = document.getElementsByClassName('edui-for-table'); + if (ua.browser.ie) { + ua.mouseenter(forTable[forTable.length - 1]); + } else { + ua.mouseover(forTable[forTable.length - 1]); + } + setTimeout(function () { + lang = editor.getLang("contextMenu"); + ua.click(menutable.childNodes[6]); + equal(editor.body.getElementsByTagName('tr').length, 6, '前插入行后有6行'); + equal(ua.getChildHTML(editor.body.getElementsByTagName('td')[5]), 'asd', '原单元格中文本未改变'); + setTimeout(function () { + document.getElementById('edui_fixedlayer').parentNode.removeChild(document.getElementById('edui_fixedlayer')); + te.dom.push(editor.container); + start(); + }, 200); + }, 200); +}); +test('contextMenu 选区背景隔行', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + stop(); + var lang = editor.getLang("contextMenu"); + editor.execCommand('cleardoc'); + editor.execCommand('inserttable'); + var trs = editor.body.firstChild.getElementsByTagName('tr'); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[0].cells[0], trs[1].cells[1]); + ut.setSelected(cellsRange); + range.setStart(trs[0].cells[0], 0).collapse(true).select(); + ua.contextmenu(editor.body.firstChild); + var menutableBody = document.getElementsByClassName("edui-menu-body")[3]; + var forTable = document.getElementsByClassName('edui-for-table'); + if (ua.browser.ie) { + ua.mouseenter(forTable[forTable.length - 1]); + } else { + ua.mouseover(forTable[forTable.length - 1]); + } + setTimeout(function () { + lang = editor.getLang("contextMenu"); + equal(menutableBody.childNodes.length, 4, '4个子项目'); + if (browser.gecko) { + equal(menutableBody.textContent, '表格隔行变色选区背景隔行红蓝相间三色渐变', '检查menu显示的字符'); + } + else { + equal(menutableBody.innerText.replace(/[\r\n\t\u200b\ufeff]/g, ''), '表格隔行变色选区背景隔行红蓝相间三色渐变', '检查menu显示的字符'); + } + ua.click(menutableBody.childNodes[1]); + ut.clearSelected(); + trs = editor.body.getElementsByTagName('tr'); + if (ua.browser.ie == 8) { + equal(trs[0].cells[0].style.backgroundColor, '#bbb', '第一行'); + equal(trs[1].cells[1].style.backgroundColor, '#ccc', '第二行'); + } else { + equal(trs[0].cells[0].style.backgroundColor, 'rgb(187, 187, 187)', '第一行'); + equal(trs[1].cells[1].style.backgroundColor, 'rgb(204, 204, 204)', '第二行'); + } + cellsRange = ut.getCellsRange(trs[0].cells[2], trs[1].cells[3]); + ut.setSelected(cellsRange); + range.setStart(trs[0].cells[2], 0).collapse(true).select(); + ua.contextmenu(editor.body.firstChild); + menutableBody = document.getElementsByClassName("edui-menu-body")[3]; + forTable = document.getElementsByClassName('edui-for-table'); + if (ua.browser.ie) { + ua.mouseenter(forTable[forTable.length - 1]); + } else { + ua.mouseover(forTable[forTable.length - 1]); + } + setTimeout(function () { + lang = editor.getLang("contextMenu"); + equal(menutableBody.childNodes.length, 4, '4个子项目'); + ua.click(menutableBody.childNodes[2]); + ut.clearSelected(); + trs = editor.body.getElementsByTagName('tr'); + equal(trs[0].cells[2].style.backgroundColor, 'red', '第一行'); + equal(trs[1].cells[3].style.backgroundColor, 'blue', '第二行'); + ut = editor.getUETable(editor.body.firstChild); + cellsRange = ut.getCellsRange(trs[0].cells[0], trs[1].cells[3]); + ut.setSelected(cellsRange); + range.setStart(trs[0].cells[0], 0).collapse(true).select(); + ua.contextmenu(editor.body.firstChild); + menutableBody = document.getElementsByClassName("edui-menu-body")[3]; + forTable = document.getElementsByClassName('edui-for-table'); + if (ua.browser.ie) { + ua.mouseenter(forTable[forTable.length - 1]); + } else { + ua.mouseover(forTable[forTable.length - 1]); + } + setTimeout(function () { + lang = editor.getLang("contextMenu"); + ua.click(menutableBody.childNodes[2]); + trs = editor.body.getElementsByTagName('tr'); + equal(trs[1].cells[2].style.backgroundColor, '', '取消背景隔行'); + setTimeout(function () { + document.getElementById('edui_fixedlayer').parentNode.removeChild(document.getElementById('edui_fixedlayer')); + te.dom.push(editor.container); + start(); + }, 200); + }, 200); + }, 200); + }, 200); +}); + +test('contextMenu 三色渐变', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + + stop(); + + editor.execCommand('cleardoc'); + editor.execCommand('inserttable'); + var tds = editor.body.getElementsByTagName('td'); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(tds[0], tds[16]); + ut.setSelected(cellsRange); + range.setStart(tds[0], 0).collapse(true).select(); + ua.contextmenu(editor.body.firstChild); + var menutable = document.getElementsByClassName("edui-menu-body")[3]; + var forTable = document.getElementsByClassName('edui-for-table'); + if (ua.browser.ie) { + ua.mouseenter(forTable[forTable.length - 1]); + } else { + ua.mouseover(forTable[forTable.length - 1]); + } + ua.click(menutable.childNodes[3]); + ut.clearSelected(); + tds = editor.body.getElementsByTagName('td'); + if (ua.browser.ie == 8) { + equal(tds[0].style.backgroundColor, '#aaa', '第一行'); + equal(tds[6].style.backgroundColor, '#bbb', '第二行'); + equal(tds[11].style.backgroundColor, '#ccc', '第二行'); + } else { + equal(tds[0].style.backgroundColor, 'rgb(170, 170, 170)', '第一行'); + equal(tds[6].style.backgroundColor, 'rgb(187, 187, 187)', '第二行'); + equal(tds[11].style.backgroundColor, 'rgb(204, 204, 204)', '第二行'); + } + setTimeout(function () { + document.getElementById('edui_fixedlayer').parentNode.removeChild(document.getElementById('edui_fixedlayer')); + te.dom.push(editor.container); + start(); + }, 20); +}); + +/*trace 3210*/ +test('contextMenu trace 3210:添加单元格背景色', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable', {numCols: 3, numRows: 3}); + var trs = editor.body.firstChild.getElementsByTagName('tr'); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[0].cells[0], trs[1].cells[1]); + ut.setSelected(cellsRange); + range.setStart(trs[0].cells[0], 0).collapse(true).select(); + editor.execCommand('edittd','#ff0000'); + stop(); + setTimeout(function () { + var tds = editor.body.firstChild.getElementsByTagName('td'); + equal(tds[2].style.backgroundColor, '', '背景色不变'); + equal(ua.formatColor(tds[0].style.backgroundColor), '#ff0000', '添加单元格背景色'); + equal(ua.formatColor(tds[4].style.backgroundColor), '#ff0000', '添加单元格背景色'); + start(); + }, 50); + +}); +/*trace 3099*/ +test('contextMenu trace 3099: 清除边框颜色', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable', {numCols: 3, numRows: 3}); + var trs = editor.body.firstChild.getElementsByTagName('tr'); + + range.setStart(trs[0].cells[0], 0).collapse(true).select(); + editor.execCommand('edittable','#ff0000'); + stop(); + setTimeout(function () { + var tds = editor.body.firstChild.getElementsByTagName('td'); + equal(ua.formatColor(tds[0].style.borderColor), '#ff0000', '添加边框颜色'); + equal(ua.formatColor(tds[2].style.borderColor), '#ff0000', '添加边框颜色'); + editor.execCommand('edittable',''); + setTimeout(function () { + equal(tds[0].style.borderColor, '', '边框颜色被清除'); + start(); + }, 50); + }, 50); +// var div = document.body.appendChild(document.createElement('div')); +// div.id = 'ue'; +// var editor = UE.getEditor('ue'); +// stop(); +// editor.ready(function () { +// var range = new baidu.editor.dom.Range(editor.document); +// var lang = editor.getLang("contextMenu"); +// editor.execCommand('cleardoc'); +// editor.execCommand('inserttable'); +// setTimeout(function () { +// range.setStart(editor.body.getElementsByTagName('td')[0], 0).collapse(true).select(); +// ua.contextmenu(editor.body.firstChild); +// var menutable = document.getElementsByClassName("edui-menu-body")[1]; +// var forTable = document.getElementsByClassName('edui-for-table'); +// if (ua.browser.ie&&ua.browser.ie<9) { +// ua.mouseenter(forTable[forTable.length - 1]); +// } else { +// ua.mouseover(forTable[forTable.length - 1]); +// } +// lang = editor.getLang("contextMenu"); +// ua.click(menutable.childNodes[menutable.childNodes.length-1]);//点开表格属性 +// setTimeout(function () { +// var iframe = document.getElementsByTagName('iframe'); +// var iframe1 ; +// for (var i = iframe.length-1; i >-1; i--) { +// if (iframe[i].id && iframe[i].id.indexOf('edui') != -1) { +// iframe1 = iframe[i]; +// break; +// } +// } +// +// iframe1.contentDocument.getElementById('J_tone').value = '#ff0000'; +// var buttonBody = document.getElementsByClassName('edui-dialog edui-for-edittable edui-default edui-state-centered')[0].firstChild.firstChild.lastChild.firstChild.firstChild.firstChild.firstChild.firstChild; +// ua.click(buttonBody); +// setTimeout(function () { +// var tds = editor.body.getElementsByTagName('td'); +// if (ua.browser.ie == 8) +// equal(tds[0].style.borderColor, '#ff0000', '边框颜色设置为红色'); +// else { +// equal(tds[0].style.borderColor, 'rgb(255, 0, 0)', '边框颜色设置为红色'); +// } +// range.setStart(editor.body.getElementsByTagName('td')[0], 0).collapse(true).select(); +// ua.contextmenu(editor.body.firstChild); +// menutable = document.getElementsByClassName("edui-menu-body")[1]; +// forTable = document.getElementsByClassName('edui-for-table'); +// if (ua.browser.ie&&ua.browser.ie<9) { +// ua.mouseenter(forTable[forTable.length - 1]); +// } else { +// ua.mouseover(forTable[forTable.length - 1]); +// } +// lang = editor.getLang("contextMenu"); +// ua.click(menutable.childNodes[menutable.childNodes.length-1]); +// setTimeout(function () { +// iframe = document.getElementsByTagName('iframe'); +// iframe1 = null; +// for (var i = iframe.length-1; i >-1; i--) { +// if (iframe[i].id.indexOf('edui') != -1) { +// iframe1 = iframe[i]; +// break; +// } +// } +// ua.click(iframe1.contentDocument.getElementById('J_tone')); +// setTimeout(function () { +// var div_nocolor = document.getElementsByClassName('edui-colorpicker-nocolor'); +// ua.click(div_nocolor[0]); +// var buttonBody = document.getElementsByClassName('edui-dialog edui-for-edittable edui-default edui-state-centered')[1].firstChild.firstChild.lastChild.firstChild.firstChild.firstChild.firstChild.firstChild; +// ua.click(buttonBody); +// tds = editor.body.getElementsByTagName('td'); +// equal(tds[0].style.borderColor, '', '边框颜色被清除'); +// setTimeout(function () { +// UE.delEditor('ue'); +// document.getElementById('edui_fixedlayer').parentNode.removeChild(document.getElementById('edui_fixedlayer')); +// te.dom.push(document.getElementById('ue')); +// start(); +// }, 200); +// }, 200); +// }, 200); +// }, 200); +// }, 1000); +// }, 200); +// }); +}); +test('trace 3986 contextMenu 标题行中右插入列', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + stop(); + var lang = editor.getLang("contextMenu"); + editor.execCommand('cleardoc'); + editor.execCommand('inserttable'); + range.setStart(editor.body.getElementsByTagName('td')[0], 0).collapse(true).select(); + editor.execCommand('inserttitle'); + range.setStart(editor.body.getElementsByTagName('th')[0], 0).collapse(true).select(); + ua.contextmenu(editor.body.firstChild); + var menutable = document.getElementsByClassName("edui-menu-body")[1]; + var forTable = document.getElementsByClassName('edui-for-table'); + if (ua.browser.ie) { + ua.mouseenter(forTable[forTable.length - 1]); + } else { + ua.mouseover(forTable[forTable.length - 1]); + } + setTimeout(function () { + lang = editor.getLang("contextMenu"); + equal(menutable.childNodes.length, 15, '15个子项目');//当光标在th[0]时,有15个项目 + /*trace 3197:没有后插行选项*/ + var innerText = lang.deletetable + lang.deleterow+ lang.deletecol + lang.insertcolnext + lang.insertcaption + lang.deletetitle +lang.inserttitlecol+ lang.mergeright + lang.edittd + lang.edittable+lang.setbordervisible; + if (browser.gecko) { + equal(menutable.textContent, innerText, '检查menu显示的字符'); + } else { + equal(menutable.innerText.replace(/[\r\n\t\u200b\ufeff]/g, ''), innerText, '检查menu显示的字符'); + } + ua.click(menutable.childNodes[4]); + equal(editor.body.getElementsByTagName('tr')[0].cells.length, 6, '左插入列后有6列'); + setTimeout(function () { + document.getElementById('edui_fixedlayer').parentNode.removeChild(document.getElementById('edui_fixedlayer')); + te.dom.push(editor.container); + start(); + }, 200); + }); +}); +/*trace 3060*/ +test('contextMenu trace 3060:单元格对齐方式', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + stop(); + + var lang = editor.getLang("contextMenu"); + editor.execCommand('cleardoc'); + editor.execCommand('inserttable'); + editor.body.getElementsByTagName('td')[0].innerHTML = 'asd'; + range.setStart(editor.body.firstChild.firstChild.firstChild.firstChild, 0).collapse(true).select(); + ua.contextmenu(editor.body.firstChild); + var menutableBody = document.getElementsByClassName("edui-for-aligntd")[0]; + setTimeout(function () { + lang = editor.getLang("contextMenu"); + ua.click(menutableBody.childNodes[0]); + var div = document.getElementsByClassName('edui-cellalignpicker-body')[0]; + equal(div.childNodes[0].getElementsByTagName('td').length, 9, '9种单元格对齐方式'); + ua.click(div.childNodes[0].childNodes[0].childNodes[1].childNodes[2].firstChild); + setTimeout(function () { + var tds = editor.body.getElementsByTagName('td'); + equal(tds[0].align, 'right', '水平居右'); + equal(tds[0].vAlign, 'middle', '垂直居中'); + + if(ua.browser.ie>8){ + equal(editor.selection.getRange().startContainer.tagName.toLowerCase(), 'td', '光标位于单元格中'); + + }else{ + equal(editor.selection.getRange().startContainer.parentNode.tagName.toLowerCase(), 'td', '光标位于单元格中'); + } + setTimeout(function () { +// te.dom.push(editor.container); +// document.getElementById('edui_fixedlayer').parentNode.removeChild(document.getElementById('edui_fixedlayer')); + start(); + }, 20); + }, 200); + }, 200); +// }); +}); +/*trace 3315*/ +/*trace 3411*/ +test('contextMenu trace 3315:表格隔行变色', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + var lang = editor.getLang("contextMenu"); + editor.execCommand('cleardoc'); + editor.execCommand('inserttable'); + range.setStart(editor.body.getElementsByTagName('td')[0], 0).collapse(true).select(); + ua.contextmenu(editor.body.firstChild); + var menutableBody = document.getElementsByClassName("edui-menu-body")[8]; + var forTable = document.getElementsByClassName('edui-for-table'); + if (ua.browser.ie) { + ua.mouseenter(forTable[forTable.length - 1]); + } else { + ua.mouseover(forTable[forTable.length - 1]); + } + setTimeout(function () { + lang = editor.getLang("contextMenu"); + equal(menutableBody.childNodes.length, 1, '1个子项目'); + if (browser.gecko) { + equal(menutableBody.textContent, '表格隔行变色', '检查menu显示的字符'); + } + else { + equal(menutableBody.innerText.replace(/[\r\n\t\u200b\ufeff]/g, ''), '表格隔行变色', '检查menu显示的字符'); + } + ua.click(menutableBody.childNodes[0]); + var trs = editor.body.getElementsByTagName('tr'); + for (var i = 0; i < trs.length; i++) { + if (i % 2 == 0) { + ok(trs[i].className.indexOf('ue-table-interlace-color-single')>-1,'第' + i + '行:浅色行'); + } else { + ok(trs[i].className.indexOf('ue-table-interlace-color-double')>-1,'第' + i + '行:深色行'); + } + } + range.setStart(editor.body.getElementsByTagName('td')[0], 0).collapse(true).select(); + ua.contextmenu(editor.body.firstChild); + menutableBody = document.getElementsByClassName("edui-menu-body")[8]; + forTable = document.getElementsByClassName('edui-for-table'); + if (ua.browser.ie) { + ua.mouseenter(forTable[forTable.length - 1]); + } else { + ua.mouseover(forTable[forTable.length - 1]); + } + setTimeout(function () { + lang = editor.getLang("contextMenu"); + equal(menutableBody.childNodes.length, 1, '2个子项目'); + if (browser.gecko) { + equal(menutableBody.textContent, '取消表格隔行变色', '检查menu显示的字符'); + } + else { + equal(menutableBody.innerText.replace(/[\r\n\t\u200b\ufeff]/g, ''), '取消表格隔行变色', '检查menu显示的字符'); + } + ua.click(menutableBody.childNodes[0]); + // equal(editor.body.getElementsByTagName('table')[0].interlaced,'disabled','取消表格隔行变色'); + ok(editor.body.getElementsByTagName('tr')[0].className.indexOf('ue-table-interlace-color')<0, '取消表格隔行变色'); + setTimeout(function () { + document.getElementById('edui_fixedlayer').parentNode.removeChild(document.getElementById('edui_fixedlayer')); + te.dom.push(editor.container); + start(); + }, 200); + }, 200); + }, 200); + stop(); +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/table.core.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/table.core.js new file mode 100644 index 000000000..9fd021aef --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/table.core.js @@ -0,0 +1,345 @@ +/** + * Created with JetBrains PhpStorm. + * User: taoqili + * Date: 13-2-21 + * Time: 下午1:31 + * To change this template use File | Settings | File Templates. + */ +function getTable(str) { + var div = document.getElementById("testTable"); + if (!div) { + div = document.createElement("div"); + div.id = "testTable"; + document.body.appendChild(div); + } + div.innerHTML = "" + str + "
    "; + return div.firstChild; +} +UT = UE.UETable; +test("create UETable", function () { + var table = getTable("ddd"), + ut = new UT(table); + ok(ut.table === table, "UT对象创建成功"); + ok(ut.colsNum == 1 && ut.rowsNum == 1, "单元格行、列数为1"); +}); + +test("getMaxRows", function () { + var table = getTable("123" + + "123"), + ut = new UT(table); + var maxRows = ut.getMaxRows(); + equal(maxRows, 2, "最大行数为2"); + table = getTable("123" + + "2"); + ut = new UT(table); + maxRows = ut.getMaxRows(); + equal(maxRows, 3, "最大行数为3"); +}); +test("getMaxCols", function () { + var table = getTable("123" + + "123"), + ut = new UT(table); + var maxCols = ut.getMaxCols(); + equal(maxCols, 3, "最大列数为3"); + + table = getTable("123" + + "2"); + ut = new UT(table); + maxCols = ut.getMaxCols(); + equal(maxCols, 6, "最大列数为6"); +}); + +test("ie9 active trace 3728 getSameEndPosCells", function () { + if(ua.browser.ie>9)return; + var table = getTable("12323"), + ut = new UT(table); + var cell = table.rows[0].cells[0], + cells1 = ut.getSameEndPosCells(cell, "x"), + cells2 = ut.getSameEndPosCells(cell, "y"); + ok(cells1.length == 1, "获取到同样X轴结尾位置的cell1个"); + ok(cells2.length == 2, "获取到同样Y轴结尾位置的cell2个"); +}); + +test("getHSideCell", function () { + var table = getTable("123" + + "23"), + ut = new UT(table); + var rows = table.rows, + cell = rows[1].cells[1], + cell1 = ut.getHSideCell(cell), + cell2 = ut.getHSideCell(cell, true); + equal(cell1, rows[1].cells[0], "左边单元格"); + equal(cell2, null, "位于右边缘的单元格无右邻居单元格"); + equal(ut.getHSideCell(rows[0][0]), null, "位于左边缘的单元格无左邻居单元格"); +}); + +test("getVSideCell", function () { + var table = getTable("123" + + "23"), + ut = new UT(table); + var rows = table.rows, + cell = rows[1].cells[1], + cell1 = ut.getVSideCell(cell), + cell2 = ut.getVSideCell(cell, true), + cell3 = ut.getVSideCell(cell, true, true); + equal(cell1, rows[0].cells[2], "上边单元格"); + equal(cell2, null, "位于下边缘的单元格无下邻居单元格"); + equal(cell3, null, "位于左边缘的单元格无左邻居单元格"); +}); +test("setCellContent", function () { + var table = getTable("123" + + "23"), + ut = new UT(table); + var cell = table.rows[0].cells[0]; + ut.setCellContent(cell, "这是测试内容"); + equal(cell.innerHTML, "这是测试内容", "设置了正确的内容"); + ut.setCellContent(cell); + equal(cell.innerHTML, browser.ie ? domUtils.fillChar : "
    "); +}); + +test("cloneCell", function () { + var table = getTable("123" + + "23"), + ut = new UT(table); + + var cell = ut.cloneCell(table.rows[0].cells[0]); + equal(cell.rowSpan, 2, "clone了一个2行一列的单元格"); + equal(cell.style.borderTopColor, "green", "上边框的颜色将会被下边框取代"); + cell = ut.cloneCell(table.rows[0].cells[0], true); + ok(cell.rowSpan, 1, "忽略被合并单元格时将会充值单元格的rowspan和colspan为1") +}); + + +test("getCellsRange、getCells", function () { + var table = getTable("123" + + "23"), + ut = new UT(table); + var range = ut.getCellsRange(table.rows[0].cells[1], table.rows[1].cells[0]); + ok(range.beginRowIndex === 0 && range.beginColIndex === 1 && range.endRowIndex === 1 && range.endColIndex === 1, "获取到range") + + var cells = ut.getCells(range); + ok(cells.length == 2, "获取到2个单元格"); + ok(cells[0] == table.rows[0].cells[1], "第一个单元格存在"); +}); + +test("insertRow、deleterRow", function () { + var table = getTable("123" + + "23"), + ut = new UT(table); + + var cellPrototype = document.createElement("td"); + cellPrototype.innerHTML = "aa"; + cellPrototype.setAttribute("vAlign", "top"); + ut.insertRow(2, cellPrototype); + ok(table.rows.length === 3, "行数变成3行"); + ok(table.rows[2].cells[0].getAttribute("vAlign") == "top", "新插入的单元格中包含原型单元格中的属性"); + +}); + +test("mergeRight,mergeDown", function () { + var table = getTable("123456" + + "2356" + + "23456"), + ut = new UT(table); + var cell = table.rows[0].cells[1]; + ut.mergeDown(cell); + ok(cell.rowSpan === 2, "向下合并成功"); + + ut.mergeDown(cell); + ok(cell.rowSpan === 3, "向下合并成功"); + + cell = cell.previousSibling; + ut.mergeRight(cell); + ok(cell.rowSpan === 3 && cell.colSpan === 2, "向右合并成功"); + + equal(cell.parentNode.rowIndex, 0, "合并到了正确的位置") +}); +test("mergeRange",function(){ + var table = getTable("123456" + + "2356" + + "23456"), + ut = new UT(table); + var range = ut.getCellsRange(table.rows[0].cells[1],table.rows[2].cells[3]); + ut.setSelected(range); + ut.mergeRange(); + ok(table.rows[0].cells[1].rowSpan===3,"合并选区") + +}); + +test("split", function () { + var table = getTable("123467" + + "2367" + + "234567"), + ut = new UT(table); + var cell = table.rows[0].cells[0], + num = table.getElementsByTagName("td").length; + ut.splitToCells(cell); + ok(cell.rowSpan == 1 && cell.colSpan == 1, "单元格被成功拆分"); + + var newNum = table.getElementsByTagName("td").length; + ok(num + 2 == newNum, "单元格数量增加了2个"); + + cell = table.rows[0].cells[3]; + ut.splitToCols(cell); + ok(cell.colSpan === 1 && cell.rowSpan == 2, "被拆分成了2列"); + + +}); + +test("selectRow", function () { + var table = getTable("123467" + + "2367" + + "234567"), + ut = new UT(table); + ut.selectRow(1); + equal(ut.selectedTds.length, table.getElementsByTagName("td").length, "选中了所有单元格") + var cells = table.rows[1].cells, + flag = false; + utils.each(cells, function (cell) { + if (cell.className == "") { + flag = true; + } + }); + ok(!flag, "所有单元格都被选中"); + ok(ut.cellsRange.beginRowIndex === 0, "cellsRange正确"); + +}); +test("selectTable", function () { + var table = getTable("123467" + + "2367" + + "234567"), + ut = new UT(table); + ut.selectTable(); + ok(ut.selectedTds.length === table.getElementsByTagName("td").length, "选中了整个表格") + +}); + +test("setBackground", function () { + var table = getTable("0123467" + + "1123467" + + "2123467"), + ut = new UT(table); + ut.setBackground(table.getElementsByTagName("td"), "green"); + var cell = table.rows[1].cells[1]; + ok(cell.style.backgroundColor == "green", "单种背景颜色设置成功"); + + ut.removeBackground(table.getElementsByTagName("td")); + ok(cell.style.backgroundColor == "", "背景颜色被清除"); + + ut.setBackground(table.getElementsByTagName("td"), { + repeat:true, + colorList:["green", "red"] + }); + ok(table.rows[0].cells[0].style.backgroundColor == "green", "第一行的单元格为绿色"); + ok(table.rows[1].cells[0].style.backgroundColor == "red", "第二行的单元格为红色"); + ok(table.rows[2].cells[0].style.backgroundColor == "green", "第三行的单元格为绿色"); + + ut.removeBackground(table.getElementsByTagName("td")); + ut.setBackground(table.getElementsByTagName("td"), { + repeat:false, + colorList:["green", "red"] + }); + ok(table.rows[0].cells[0].style.backgroundColor == "green", "第一行的单元格为绿色"); + ok(table.rows[1].cells[0].style.backgroundColor == "red", "第二行的单元格为红色"); + ok(table.rows[2].cells[0].style.backgroundColor == "", "第三行的单元格没有颜色"); + +}); + +test("isFullRow isFullCol", function () { + var table = getTable("0123467" + + "1123467" + + "2123467"), + ut = new UT(table); + var range = ut.getCellsRange(table.rows[0].cells[0], table.rows[1].cells[1]); + ut.setSelected(range); + ok(!ut.isFullRow(), "不是整行"); + range = ut.getCellsRange(table.rows[0].cells[0], table.rows[0].cells[5]); + ut.setSelected(range); + ok(ut.isFullRow(), "是整行"); + + range = ut.getCellsRange(table.rows[0].cells[0], table.rows[2].cells[0]); + ut.setSelected(range); + ok(ut.isFullCol(), "是整列"); + range = ut.getCellsRange(table.rows[0].cells[0], table.rows[1].cells[0]); + ut.setSelected(range); + ok(!ut.isFullCol(), "不是整列"); +}); + +test("last", function () { + var table = getTable("0123467" + + "1123467" + + "2123467"), + ut = new UT(table); + var cell = table.rows[2].cells[5]; + ok(ut.isLastCell(cell), "是最后一个单元格"); + ok(!ut.isLastCell(table.rows[1].cells[0]), "不是最后一个单元格"); +}); +test("getNextCell", function () { + var table = getTable("0123467" + + "1123467" + + "2123467"), + ut = new UT(table); + var cell = table.rows[2].cells[5]; + var newCell = ut.getNextCell(cell); + ok(newCell === table.rows[1].cells[5], "找到正确单元格"); + cell = table.rows[0].cells[4]; + newCell = ut.getNextCell(cell); + ok(!newCell, "顶行不存在nextCell"); + newCell = ut.getNextCell(cell, true); + ok(newCell === table.rows[1].cells[4], "获取到下一行的单元格"); + +}); + +test("getPreviewCell",function(){ + var table = getTable("0123467" + + "1123467" + + "2123467"), + ut = new UT(table); + var cell = table.rows[2].cells[5]; + var newCell = ut.getPreviewCell(cell); + ok(newCell===cell.previousSibling,"找到前置单元格"); +}); + +test("getLastCell", function () { + var table = getTable("0123467" + + "1123467" + + "2123467"), + ut = new UT(table); + var cell = ut.getLastCell(); + ok(cell === table.rows[2].cells[5], "找到最后一个单元格"); +}); + +test("getTabNextCell", function () { + var table = getTable("0123467" + + "1123467" + + "2123467"), + ut = new UT(table); + var rows = table.rows, + cell = rows[0].cells[0]; + var newCell = ut.getTabNextCell(cell); + ok(newCell === table.rows[0].cells[1], "找到最后一个单元格"); + newCell = ut.getTabNextCell(rows[0].cells[5]); + ok(newCell === table.rows[1].cells[0], "找到下一行的第一个单元格"); +}); + +//test("getSameStartPosXCells", function () { +// var table = getTable("0123467" + +// "1123467" + +// "2123467"), +// ut = new UT(table); +// var cell = table.rows[0].cells[1]; +// var cells = ut.getSameStartPosXCells(cell); +// equal(cells.length, 3, "获取到三个单元格") +// +// table = getTable("0123467" + +// "1123467" + +// "212467"); +// ut = new UT(table); +// cells = ut.getSameStartPosXCells(cell); +// ok(cells.length === 2, "获取到2个单元格"); +// +// cells = ut.getSameStartPosXCells(table.rows[0].cells[0]); +// ok(cells.length===3,"获取到三个单元格"); +// +//}); + diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/table.sort.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/table.sort.js new file mode 100644 index 000000000..5d86b8740 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/table.sort.js @@ -0,0 +1,258 @@ +module('plugins.table'); + +function getTable(str) { + var div = document.getElementById("testTable"); + if (!div) { + div = document.createElement("div"); + div.id = "testTable"; + document.body.appendChild(div); + } + div.innerHTML = "" + str + "
    "; + return div.firstChild; +} +UT = UE.UETable; +test(" trace 3715 sortTable", function () { + var table = getTable("0123467" + + "1123467" + + "2123467"), + ut = new UT(table); + ut.sortTable(1, function (a, b) { + return 1;//逆序 + }); + var value = table.rows[0].cells[0].innerHTML; + equal(value, "21", "单元格被逆序"); + + ut.sortTable(0, function (td1, td2) { + var value1 = parseInt(td1.innerHTML, 10), + value2 = parseInt(td2.innerHTML, 10); + return value2 - value1; + }) + value = table.rows[0].cells[0].innerHTML; + equal(value, "21", "按数值从大到小排列"); + + ut.sortTable(0, 'reversebynum'); + equal(table.getAttribute('data-sort-type'), "reversebynum", "data-sort-type属性是否设置成功"); +}); +test('active trace 3779 sorttable', function () { + if(ua.browser.ie&&ua.browser.ie>8)return;//todo + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('
    1
    2
    '); + setTimeout(function () { + var tds = editor.body.getElementsByTagName('td'); + range.setStart(tds[0], 0).collapse(1).select(); + editor.execCommand('sorttable', 1); + ua.manualDeleteFillData(editor.body); + tds = editor.body.getElementsByTagName('td'); + equal(tds[0].innerHTML, 2, ''); + equal(tds[2].innerHTML, 1, ''); + start(); + }, 50); + stop(); +}); +test('sorttable,框选', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('
    1
    2
    3
    '); + setTimeout(function () { + var trs = editor.body.firstChild.getElementsByTagName('tr'); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[0].cells[0], trs[1].cells[0]); + ut.setSelected(cellsRange); + range.setStart(trs[0].cells[0], 0).collapse(true).select(); + editor.execCommand('sorttable', 1); + ua.manualDeleteFillData(editor.body); + var tds = editor.body.getElementsByTagName('td'); + equal(tds[0].innerHTML, 2, ''); + equal(tds[2].innerHTML, 1, ''); + equal(tds[4].innerHTML, 3, ''); + start(); + }, 50); + stop(); +}); +test('enablesort,disablesort', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('
    1
    2
    '); + setTimeout(function () { + var tds = editor.body.getElementsByTagName('td'); + range.setStart(tds[0], 0).collapse(1).select(); + editor.execCommand('enablesort'); + + setTimeout(function () { + equal(editor.body.firstChild.attributes['data-sort'].nodeValue, 'sortEnabled', 'sortEnabled'); + equal(domUtils.hasClass(editor.body.firstChild, 'sortEnabled'), true, 'sortEnabled'); + editor.execCommand('disablesort'); + setTimeout(function () { + equal(editor.body.firstChild.attributes['data-sort'].nodeValue, 'sortDisabled', 'sortDisabled'); + equal(domUtils.hasClass(editor.body.firstChild, 'sortEnabled'), false, 'sortDisabled'); + equal(domUtils.hasClass(editor.body.firstChild.rows[0], 'firstRow'), true, '给第一行添加firstRow的类'); + start(); + }, 20); + }, 20); + }, 50); + stop(); +}); +test('contextMenu 表格逆序当前', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + stop(); + var lang = editor.getLang("contextMenu"); + editor.execCommand('cleardoc'); + var html = '
    Michael1康熙
    ackson4承祜
    {}2胤礼
    &*3襄嫔
    '; + editor.setContent(html); + range.setStart(editor.body.getElementsByTagName('td')[0], 0).collapse(true).select(); + ua.contextmenu(editor.body.firstChild); + var menutable = document.getElementsByClassName("edui-menu-body")[2]; + setTimeout(function () { + lang = editor.getLang("contextMenu"); + equal(menutable.childNodes.length, 7, '7个子项目'); + if (browser.gecko) { + equal(menutable.textContent, lang.enablesort+lang.reversecurrent+lang.orderbyasc+lang.reversebyasc+lang.orderbynum+lang.reversebynum, '检查menu显示的字符'); + } + else { + equal(menutable.innerText.replace(/[\r\n\t\u200b\ufeff]/g, ''), lang.enablesort+lang.reversecurrent+lang.orderbyasc+lang.reversebyasc+lang.orderbynum+lang.reversebynum, '检查menu显示的字符'); + } + var reverseIndex = ua.getContextmenuIndexByName(menutable.childNodes,lang.reversecurrent); + ua.click(menutable.childNodes[reverseIndex]);//逆序 + ua.manualDeleteFillData(editor.body); + ua.checkSameHtml(editor.body.firstChild.firstChild.innerHTML,'&*3襄嫔{}2胤礼ackson4承祜Michael1康熙', '表格内容逆序-选区闭合'); + var tds = editor.body.getElementsByTagName('td'); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(tds[0], tds[6]); + ut.setSelected(cellsRange); + range.setStart(tds[0], 0).collapse(true).select(); + ua.contextmenu(editor.body.firstChild); + menutable = document.getElementsByClassName("edui-menu-body")[2]; + setTimeout(function () { + lang = editor.getLang("contextMenu"); + ua.click(menutable.childNodes[reverseIndex]); + ua.manualDeleteFillData(editor.body); + ua.checkSameHtml(editor.body.innerHTML,'
    ackson4承祜
    {}2胤礼
    &*3襄嫔
    Michael1康熙
    ', '表格内容逆序-选区不闭合'); + + setTimeout(function () { + document.getElementById('edui_fixedlayer').parentNode.removeChild(document.getElementById('edui_fixedlayer')); + te.dom.push(editor.container); + start(); + }, 20); + },20); + },20); +}); + +test('contextMenu 按ASCII字符排序', function () { + if(ua.browser.ie||ua.browser.gecko)return;////todo 1.2.6.1 #3316 + var editor = te.obj[0]; + var range = te.obj[1]; + stop(); + var lang = editor.getLang("contextMenu"); + editor.execCommand('cleardoc'); + var html = '
    Michael1康熙
    ackson4承祜
    {}2胤礼
    &*3襄嫔
    '; + editor.setContent(html); + range.setStart(editor.body.getElementsByTagName('td')[0], 0).collapse(true).select(); + ua.contextmenu(editor.body.firstChild); + var menutable = document.getElementsByClassName("edui-menu-body")[2];//表格排序 + setTimeout(function () { + lang = editor.getLang("contextMenu"); + var AsciiIndex = ua.getContextmenuIndexByName(menutable.childNodes,lang.orderbyasc); + ua.click(menutable.childNodes[AsciiIndex]);//ASCII升 + ua.checkSameHtml(editor.body.innerHTML,'
    {}2胤礼
    &*3襄嫔
    ackson4承祜
    Michael1康熙
    ', '选区闭合'); + var tds = editor.body.getElementsByTagName('td'); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(tds[0], tds[6]); + ut.setSelected(cellsRange); + range.setStart(tds[0], 0).collapse(true).select(); + ua.contextmenu(editor.body.firstChild); + menutable = document.getElementsByClassName("edui-menu-body")[2]; + forTable = document.getElementsByClassName('edui-for-table'); + if (ua.browser.ie) { + ua.mouseenter(forTable[forTable.length - 1]); + } else { + ua.mouseover(forTable[forTable.length - 1]); + } + setTimeout(function () { + lang = editor.getLang("contextMenu"); + ua.click(menutable.childNodes[AsciiIndex+1]);//ASCII降 + ua.manualDeleteFillData(editor.body); + ua.checkSameHtml(editor.body.innerHTML,'
    ackson4承祜
    &*3襄嫔
    {}2胤礼
    Michael1康熙
    ', '表格内容逆序-选区不闭合'); + setTimeout(function () { + document.getElementById('edui_fixedlayer').parentNode.removeChild(document.getElementById('edui_fixedlayer')); + te.dom.push(editor.container); +// + start(); + }, 200); + }, 200); + }, 200); +}); + +test('contextMenu 按数值大小排序', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + stop(); + var lang = editor.getLang("contextMenu"); + editor.execCommand('cleardoc'); + var html = '
    Michael1康熙
    ackson4承祜
    {}2胤礼
    &*3襄嫔
    '; + editor.setContent(html); + range.setStart(editor.body.getElementsByTagName('td')[1], 0).collapse(true).select(); + ua.contextmenu(editor.body.firstChild); + var menutable = document.getElementsByClassName("edui-menu-body")[2]; + setTimeout(function () { + lang = editor.getLang("contextMenu"); + var numIndex = ua.getContextmenuIndexByName(menutable.childNodes,lang.orderbynum); + ua.click(menutable.childNodes[numIndex]);//num升 + ua.manualDeleteFillData(editor.body); + ua.checkSameHtml(editor.body.innerHTML, '
    Michael1康熙
    {}2胤礼
    &*3襄嫔
    ackson4承祜
    ', '选区闭合'); + setTimeout(function () { + document.getElementById('edui_fixedlayer').parentNode.removeChild(document.getElementById('edui_fixedlayer')); + te.dom.push(editor.container); + start(); + }, 200); + }, 200); +}); +test('contextMenu trace 3384: 按数值大小排序', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + stop(); + var lang = editor.getLang("contextMenu"); + editor.execCommand('cleardoc'); + var html = '
    Michael1康熙
    ackson4承祜
    {}2胤礼
    &*3襄嫔
    '; + editor.setContent(html); + range.setStart(editor.body.getElementsByTagName('td')[1], 0).collapse(true).select(); + ua.contextmenu(editor.body.firstChild); + var menutable = document.getElementsByClassName("edui-menu-body")[2]; + setTimeout(function () { + lang = editor.getLang("contextMenu"); + var numIndex = ua.getContextmenuIndexByName(menutable.childNodes,lang.orderbynum); + ua.click(menutable.childNodes[numIndex]);//num升 + ua.checkSameHtml(editor.body.innerHTML,'
    Michael1康熙
    {}2胤礼
    &*3襄嫔
    ackson4承祜
    ', '选区不闭合'); + + var tds = editor.body.getElementsByTagName('td'); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(tds[1], tds[7]); + ut.setSelected(cellsRange); + range.setStart(tds[1], 0).collapse(true).select(); + ua.contextmenu(editor.body.firstChild); + menutable = document.getElementsByClassName("edui-menu-body")[2]; + forTable = document.getElementsByClassName('edui-for-table'); + + if (ua.browser.ie) { + ua.mouseenter(forTable[forTable.length - 1]); + } else { + ua.mouseover(forTable[forTable.length - 1]); + } + setTimeout(function () { + + lang = editor.getLang("contextMenu"); + ua.click(menutable.childNodes[numIndex+1]);//num降 + // todo 1.2.6.1 trace 3510 + if(!ua.browser.gecko){ + ua.checkSameHtml(editor.body.innerHTML,'
    &*3襄嫔
    {}2胤礼
    Michael1康熙
    ackson4承祜
    ', '选区不闭合'); + } + setTimeout(function () { + document.getElementById('edui_fixedlayer').parentNode.removeChild(document.getElementById('edui_fixedlayer')); + te.dom.push(editor.container); + + start(); + }, 200); + }, 200); + }, 200); +}); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/template.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/template.js new file mode 100644 index 000000000..9c722d041 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/template.js @@ -0,0 +1,24 @@ +module( 'plugins.template' ); + +test( '模板', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '

    hello

    ' ); + range.setStart(editor.body.firstChild,0).collapse(true).select(); + editor.execCommand('template',{html:'

    欢迎使用UEditor!

    '}); + ua.manualDeleteFillData(editor.body); + equal(ua.getHTML(editor.body.firstChild),'

    欢迎使用ueditor!

    '); + if(!(ua.browser.gecko||ua.browser.ie>8)){ + if(ua.browser.webkit){ + ua.click(editor.body.firstChild); + equal(editor.selection.getRange().startContainer.firstChild.length,'12','检查选区'); + ua.keydown(editor.body.firstChild); + equal(editor.selection.getRange().startContainer.firstChild.length,'12','检查选区'); + }else{ + ua.click(editor.body.firstChild); + equal(editor.selection.getRange().startContainer.length,'12','检查选区'); + ua.keydown(editor.body.firstChild); + equal(editor.selection.getRange().startContainer.length,'12','检查选区'); + } + } +} ); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/time.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/time.js new file mode 100644 index 000000000..81b6225ee --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/time.js @@ -0,0 +1,76 @@ +module( 'plugins.time' ); + +test( '插入时间和日期', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + editor.setContent( '


    ' ); + range.setStart( body.firstChild, 0 ).collapse( 1 ).select(); + var date = new Date(); + var h = date.getHours(); + h = (h < 10) ? ('0' + h) : h; + var min = date.getMinutes(); + min = (min < 10) ? ('0' + min) : min; + var sec = date.getSeconds(); + sec = (sec < 10) ? ('0' + sec) : sec; + editor.execCommand( 'time' ); + ua.manualDeleteFillData( editor.body ); + equal( ua.getChildHTML( body.firstChild ), h + ':' + min + ':' + sec); + range.selectNode( body.firstChild.firstChild ).select(); + editor.execCommand( 'time','hh.ii.ss' ); + ua.manualDeleteFillData( editor.body ); + equal( ua.getChildHTML( body.firstChild ), h + '.' + min + '.' + sec); + + range.selectNode( body.firstChild.firstChild ).select(); + var year = date.getFullYear(); + var month = date.getMonth() + 1; + month = (month < 10) ? ('0' + month) : month; + var date = date.getDate(); + date = (date < 10) ? ('0' + date) : date; + editor.execCommand( 'date' ); + ua.manualDeleteFillData( editor.body ); + equal( ua.getChildHTML( body.firstChild ), year + '-' + month + '-' + date); + range.selectNode( body.firstChild.firstChild ).select(); + editor.execCommand( 'date','yyyy/mm/dd' ); + ua.manualDeleteFillData( editor.body ); + equal( ua.getChildHTML( body.firstChild ), year + '/' + month + '/' + date); +} ); + +test( '表格插入时间和日期', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + var body = editor.body; + var br = UE.browser.ie ? "" : "
    "; + editor.setContent( '
    ' ); + var td = body.firstChild.getElementsByTagName( 'td' ); + range.setStart( td[0], 0 ).collapse( 1 ).select(); + var date = new Date(); + var h = date.getHours(); + h = (h < 10) ? ('0' + h) : h; + var min = date.getMinutes(); + min = (min < 10) ? ('0' + min) : min; + var sec = date.getSeconds(); + sec = (sec < 10) ? ('0' + sec) : sec; + editor.execCommand( 'time' ); + ua.manualDeleteFillData(td[0]); + debugger + equal( td[0].innerHTML, h + ':' + min + ':' + sec+(ua.browser.ie==9||ua.browser.ie==10?' ':'')); + range.setStart( td[1], 0 ).collapse( 1 ).select(); + editor.execCommand( 'time','hh.ii.ss' ); + ua.manualDeleteFillData(td[1]); + equal( td[1].innerHTML, h + '.' + min + '.' + sec+(ua.browser.ie==9||ua.browser.ie==10?' ':'')); + /*选中一段内容插入日期*/ + range.setStart( td[2], 0 ).collapse( 1 ).select(); + var year = date.getFullYear(); + var month = date.getMonth() + 1; + month = (month < 10) ? ('0' + month) : month; + date = date.getDate(); + date = (date < 10) ? ('0' + date) : date; + editor.execCommand( 'date' ); + ua.manualDeleteFillData(td[2]); + equal( td[2].innerHTML, year + '-' + month + '-' + date+(ua.browser.ie==9||ua.browser.ie==10?' ':'')); + range.setStart( td[3], 0 ).collapse( 1 ).select(); + editor.execCommand( 'date','yyyy/mm/dd' ); + ua.manualDeleteFillData(td[3]); + equal( td[3].innerHTML, year + '/' + month + '/' + date+(ua.browser.ie==9||ua.browser.ie==10?' ':'')); +} ); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/tools.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/tools.js new file mode 100644 index 000000000..1d06be935 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/tools.js @@ -0,0 +1,59 @@ +/** + + */ +(function () { + function mySetup() { + for (var config in window.UEDITOR_CONFIG) { + if (typeof(window.UEDITOR_CONFIG[config]) == 'string') + window.UEDITOR_CONFIG[config] = window.UEDITOR_CONFIG[config].replace('_test/tools/br/', ''); + } + var div = document.body.appendChild(document.createElement('div')); + $(div).css('width', '500px').css('height', '500px').css('border', '1px solid #ccc'); + var editor = new baidu.editor.Editor({'initialContent':'

    欢迎使用ueditor

    ', 'autoFloatEnabled':false,webAppKey:'Qr0M9yTEoLIiUSXXQTtq7yFt'}); + var ue = new UE.ui.Editor({'UEDITOR_HOME_URL':'../../../', 'autoFloatEnabled':true,webAppKey:'Qr0M9yTEoLIiUSXXQTtq7yFt'}); + editor.render(div); + editor.ready(function () { + var range = new baidu.editor.dom.Range(editor.document); + te.dom.push(div); + te.obj.push(editor); + te.obj.push(range); + te.obj.push(ue); + QUnit.readyFlag =1; + }); + stop(); + QUnit.readyFlag =0; + document.getElementsByClassName = function (eleClassName) { + var getEleClass = [];//定义一个数组 + var myclass = new RegExp("\\b" + eleClassName + "\\b");//创建一个正则表达式对像 + var elem = this.getElementsByTagName("*");//获取文档里所有的元素 + for (var h = 0; h < elem.length; h++) { + var classes = elem[h].className;//获取class对像 + if (myclass.test(classes)) getEleClass.push(elem[h]);//正则比较,取到想要的CLASS对像 + } + return getEleClass;//返回数组 + } + } + + var _d = function () { + if (te) { + if (te.dom && te.dom.length) { + for (var i = 0; i < te.dom.length; i++) { + if (te.dom[i] && te.dom[i].parentNode) + te.dom[i].parentNode.removeChild(te.dom[i]); + } + + } + } + te.dom = []; + te.obj = []; + } + var s = QUnit.testStart, d = QUnit.testDone; + QUnit.testStart = function () { + s.apply(this, arguments); + mySetup(); + }; + QUnit.testDone = function () { + _d(); + d.apply(this, arguments); + } +})(); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/ueditor.config.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/ueditor.config.js new file mode 100644 index 000000000..1568c9b97 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/ueditor.config.js @@ -0,0 +1,20 @@ +module( ".path" ); + +/*trace 3683*/ +test( '路径查找测试', function () { + equal( UE.getUEBasePath( 'http://www.baidu.com/', './ueditor.config.js' ), 'http://www.baidu.com/', 'WEB路径-当前目录下' ); + equal( UE.getUEBasePath( 'http://www.baidu.com/abc/def/', '../ueditor.config.js' ), 'http://www.baidu.com/abc/', 'WEB路径-父目录1' ); + equal( UE.getUEBasePath( 'http://www.baidu.com/abc/def', '../ueditor.config.js' ), 'http://www.baidu.com/', 'WEB路径-父目录2' ); + + equal( UE.getUEBasePath( 'file:///home/hn/a/ueditor/_examples/completeDemo.html', './ueditor.config.js' ), 'file:///home/hn/a/ueditor/_examples/', '本地路径-linux-当前目录1' ); + equal( UE.getUEBasePath( 'file:///home/hn/a/ueditor/_examples/completeDemo.html', 'ueditor.config.js' ), 'file:///home/hn/a/ueditor/_examples/', '本地路径-linux-当前目录2' ); + equal( UE.getUEBasePath( 'file:///home/hn/a/ueditor/_examples/completeDemo.html', '../ueditor.config.js' ), 'file:///home/hn/a/ueditor/', '本地路径-linux-父目录1' ); + equal( UE.getUEBasePath( 'file:///home/hn/a/ueditor/_examples/completeDemo.html', './../ueditor.config.js' ), 'file:///home/hn/a/ueditor/', '本地路径-linux-父目录2' ); + + equal( UE.getUEBasePath( 'file://C:\\webroot\\ueditor\\_examples\\completeDemo.html', './ueditor.config.js' ), 'file://C:/webroot/ueditor/_examples/', '本地路径-windows-当前目录1' ); + equal( UE.getUEBasePath( 'file://C:\\webroot\\ueditor\\_examples\\completeDemo.html', 'ueditor.config.js' ), 'file://C:/webroot/ueditor/_examples/', '本地路径-windows-当前目录2' ); + equal( UE.getUEBasePath( 'file://C:\\webroot\\ueditor\\_examples\\completeDemo.html', '../ueditor.config.js' ), 'file://C:/webroot/ueditor/', '本地路径-windows-父目录1' ); + equal( UE.getUEBasePath( 'file://C:\\webroot\\ueditor\\_examples\\completeDemo.html', './../ueditor.config.js' ), 'file://C:/webroot/ueditor/', '本地路径-windows-父目录2' ); + + equal( UE.getUEBasePath( 'http://www.baidu.com/ueditor/completedemo.html', '/ueditorphp/ueditor.config.js' ), 'http://www.baidu.com/ueditorphp/', 'WEB路径-当前目录下' ); +} ); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/undo.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/undo.js new file mode 100644 index 000000000..d83292298 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/undo.js @@ -0,0 +1,496 @@ +module("plugins.undo"); + +//test('', function () { +// stop() +//}); +/*trace 856*/ +test('trace 856 输入文本后撤销按钮不亮', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + ua.keydown(editor.body); + range.insertNode(editor.document.createTextNode('hello')); + ua.keydown(editor.body); + setTimeout(function () { + equal(editor.queryCommandState('undo'), 0, '模拟输入文本后撤销按钮应当高亮'); + start(); + }, 500); + stop(); +}); + +/*trace 583,1726*/ +test('trace 583,1726 插入表格、表情,撤销', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable', {numCols: 2, numRows: 2}); + editor.execCommand('insertimage', {src: 'http://img.baidu.com/hi/jx2/j_0001.gif', width: 50, height: 50}); + editor.execCommand('undo'); + editor.execCommand('undo'); + editor.execCommand('undo');//需要3次undo,已经和RD确认过,暂时不改 + ua.manualDeleteFillData(editor.body); + equal(editor.getContent().toLowerCase(), '', '插入表格、表情,撤销'); +}); + +/*trace 595*/ +test('trace 595 撤销合并单元格后再合并单元格', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable', {numCols: 3, numRows: 3}); + var tds = editor.body.firstChild.getElementsByTagName('td'); + for (var i = 0; i < 5; i++) { + tds[i].innerHTML = 'hello'; + } + //合并单元格 + setTimeout(function () { + var trs = editor.body.firstChild.getElementsByTagName('tr'); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[0].cells[0], trs[1].cells[1]); + ut.setSelected(cellsRange); + range.setStart(trs[0].cells[0], 0).collapse(true).select(); + + editor.execCommand('mergecells'); + ua.manualDeleteFillData(editor.body); + var tds = editor.body.getElementsByTagName('td'); + equal(tds.length, 6, '单元格数'); + equal(trs[0].cells[0].colSpan, 2, '合并--[0][0]单元格colspan'); + equal(trs[0].cells[0].rowSpan, 2, '合并--[0][0]单元格rowspan'); + equal(trs[0].cells[0].innerHTML.toLowerCase(), 'hello
    hello
    hello
    hello', '内容复制正确'); + + //撤销合并单元格的操作 + editor.execCommand('undo'); + ua.manualDeleteFillData(editor.body); + ok(tds[0].colSpan == 1 && tds[0].rowSpan == 1 && tds.length == 9, '撤销后,单元格回复成多个'); + ok(tds[0].innerHTML.toLowerCase() == 'hello' && tds[1].innerHTML.toLowerCase() == 'hello' && tds[3].innerHTML.toLowerCase() == 'hello' && tds[4].innerHTML.toLowerCase() == 'hello', '内容复制正确'); + + //再次合并单元格 + setTimeout(function () { + var trs = editor.body.firstChild.getElementsByTagName('tr'); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[0].cells[0], trs[1].cells[1]); + ut.setSelected(cellsRange); + range.setStart(trs[0].cells[0], 0).collapse(true).select(); + editor.execCommand('mergecells'); + ua.manualDeleteFillData(editor.body); + tds = editor.body.firstChild.getElementsByTagName('td'); + ok(tds[0].colSpan == 2 && tds[0].rowSpan == 2 && tds.length == 6, '再次合并,多个单元格合并成一个'); + equal(tds[0].innerHTML.toLowerCase(), 'hello
    hello
    hello
    hello', '内容复制正确'); + start(); + }, 50); + }, 50); + stop(); +}); + +/*trace 599*/ +test('trace 599 插入表格、表情、超链接、表情,撤销2次', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body, 0).collapse(true).select(); + editor.execCommand('inserttable', {numCols: 2, numRows: 2}); //插入表格 + range.setStart(editor.body.lastChild, 0).collapse(true).select(); + editor.execCommand('insertimage', {src: 'http://img.baidu.com/hi/jx2/j_0001.gif', width: 50, height: 50}); //插入表情 + range.setStartAfter(editor.body.lastChild).collapse(true).select(); + editor.execCommand('link', {href: 'http://www.baidu.com/'}); //插入超链接 + range.setStartAfter(editor.body.lastChild).collapse(true).select(); + editor.execCommand('insertimage', {src: 'http://img.baidu.com/hi/jx2/j_0001.gif', width: 50, height: 50}); //插入表情 + + editor.execCommand('Undo'); + editor.execCommand('Undo'); + ua.manualDeleteFillData(editor.body); + equal(editor.body.childNodes.length, 2, '撤销2次后只剩表格、表情'); + var tag = editor.body.childNodes[0].firstChild.tagName.toLowerCase(); + ok(tag == 'table' || tag == 'tbody', '表格'); + equal(editor.body.childNodes[1].firstChild.tagName.toLowerCase(), 'img', '表情'); +}); + +/*trace 617*/ +test('trace 617 插入文本、分割线、文本,撤销2次,撤销掉分割线', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + + editor.setContent('

    '); + + //输入文本 + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + ua.keydown(editor.body); + range.insertNode(editor.document.createTextNode('hello')); + if (!ua.browser.ie) + ua.compositionstart(editor.body); + ua.keyup(editor.body); + //输入分割符 + range.setStartAfter(editor.body.lastChild).collapse(true).select(); + editor.execCommand('Horizontal'); + //输入文本 + range.setStartAfter(editor.body.lastChild).collapse(true).select(); + ua.keydown(editor.body); + range.insertNode(editor.document.createTextNode('hello')); + if (!ua.browser.ie) + ua.compositionend(editor.body); + ua.keyup(editor.body); + + editor.execCommand('Undo'); + editor.execCommand('Undo'); + equal(editor.body.getElementsByTagName('hr').length, 0, '分割线已删除'); + +}); + +/*trace 632*/ +test('trace 632 合并单元格后撤销再合并单元格不会丢字', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable', {numCols: 4, numRows: 4}); + var tds = editor.body.firstChild.getElementsByTagName('td'); + for (var i = 0; i < 6; i++) { + tds[i].innerHTML = 'hello'; + } + //合并单元格 + setTimeout(function () { + var trs = editor.body.firstChild.getElementsByTagName('tr'); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[0].cells[0], trs[1].cells[1]); + ut.setSelected(cellsRange); + range.setStart(trs[0].cells[0], 0).collapse(true).select(); + editor.execCommand('mergecells'); + ua.manualDeleteFillData(editor.body); + tds = editor.body.firstChild.getElementsByTagName('td'); + equal(tds[0].innerHTML.toLowerCase(), 'hello
    hello
    hello
    hello', '合并单元格,内容复制正确'); + + //撤销合并单元格的操作,再次合并单元格 + editor.execCommand('Undo'); + setTimeout(function () { + var trs = editor.body.firstChild.getElementsByTagName('tr'); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[0].cells[0], trs[1].cells[1]); + ut.setSelected(cellsRange); + range.setStart(trs[0].cells[0], 0).collapse(true).select(); + editor.execCommand('mergecells'); + ua.manualDeleteFillData(editor.body); + tds = editor.body.firstChild.getElementsByTagName('td'); + equal(tds[0].innerHTML.toLowerCase(), 'hello
    hello
    hello
    hello', '撤销后再次合并单元格,内容复制正确'); + start(); + }, 50); + }, 50); + stop(); +}); + +/*trace 675 这个trace用例中的操作已经设为非法*/ +/*trace 685*/ +test('trace 685 合并单元格后,删除行,再撤销,再删除行', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable', {numCols: 4, numRows: 4}); + + //选择第一行的4格单元格,合并 + setTimeout(function () { + var trs = editor.body.firstChild.getElementsByTagName('tr'); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[0].cells[0], trs[0].cells[3]); + ut.setSelected(cellsRange); + range.setStart(trs[0].cells[0], 0).collapse(true).select(); + var tds = editor.body.getElementsByTagName('td'); + editor.execCommand('mergecells'); + ok(tds[0].colSpan == 4 && tds[0].rowSpan == 1, '第一行的4个单元格合并成一个'); + + //选择第2,3,4行的第1个单元格,合并 + setTimeout(function () { + var trs = editor.body.firstChild.getElementsByTagName('tr'); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[1].cells[0], trs[3].cells[0]); + ut.setSelected(cellsRange); + range.setStart(trs[0].cells[0], 0).collapse(true).select(); + var tds = editor.body.getElementsByTagName('td'); + editor.execCommand('mergecells'); + ok(tds[1].colSpan == 1 && tds[1].rowSpan == 3, '第2,3,4行的第一个单元格合并成一个'); + + //单击第二步合并的单元格,点击删除行 + range.setStart(tds[4], 0).collapse(true).select(); + editor.execCommand('deleterow'); + equal(editor.body.firstChild.getElementsByTagName('tr').length, 3, '点击删除行,表格剩三行'); + //撤销 + editor.execCommand('undo'); + equal(editor.body.firstChild.getElementsByTagName('tr').length, 4, '撤销后,表格恢复成4行'); + //再次点击删除行 + range.setStart(tds[4], 0).collapse(true).select(); + editor.execCommand('deleterow'); + equal(editor.body.firstChild.getElementsByTagName('tr').length, 3, '撤销后,再点击删除行,表格剩三行'); + start(); + }, 50); + }, 50); + stop(); +}); + +/*trace 711 这个要中文输入法再模拟键盘输入,貌似不能写???*/ +/*trace 718*/ +test('trace 718 合并单元格后,删除列,再撤销,再删除列', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable', {numCols: 4, numRows: 4}); + + //选择中间的4格单元格,合并 + setTimeout(function () { + var trs = editor.body.firstChild.getElementsByTagName('tr'); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[1].cells[1], trs[2].cells[2]); + ut.setSelected(cellsRange); + range.setStart(trs[1].cells[1], 0).collapse(true).select(); + var tds = editor.body.firstChild.getElementsByTagName('td'); + editor.execCommand('mergecells'); + ok(tds[5].colSpan == 2 && tds[5].rowSpan == 2, '对一个4*4的表格,选择中间的4格单元格,合并成一个'); + //光标定位在合并后的大单元格中,点击删除列按钮 + range.setStart(tds[5], 0).collapse(true).select(); + editor.execCommand('deletecol'); + equal(editor.body.firstChild.getElementsByTagName('tr')[0].childNodes.length, 3, '点击删除列,表格剩三列'); + //撤销 + editor.execCommand('undo'); + equal(editor.body.firstChild.getElementsByTagName('tr')[0].childNodes.length, 4, '撤销后,表格剩四列'); + //再次点击删除列按钮 + //TODO 1.2.6 + if (!ua.browser.gecko && !ua.browser.ie) { + range.setStart(tds[5], 0).collapse(true).select(); + editor.execCommand('deletecol'); + equal(editor.body.firstChild.getElementsByTagName('tr')[0].childNodes.length, 3, '再次点击删除列,表格剩三列'); + } + equal(editor.body.firstChild.getElementsByTagName('tr').length, 4, '表格依然有4行'); + start(); + }, 50); + stop(); +}); + +/*trace 722 需要中文输入法*/ +/*trace 743*/ +test('trace 743 合并单元格后,删除列,再撤销', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable', {numCols: 4, numRows: 4}); + + //第一行的4格单元格,合并 + setTimeout(function () { + var trs = editor.body.firstChild.getElementsByTagName('tr'); + var ut = editor.getUETable(editor.body.firstChild); + var cellsRange = ut.getCellsRange(trs[0].cells[0], trs[0].cells[3]); + ut.setSelected(cellsRange); + range.setStart(trs[0].cells[0], 0).collapse(true).select(); + editor.execCommand('mergecells'); + var tds = editor.body.firstChild.getElementsByTagName('td'); + ok(tds[0].colSpan == 4 && tds[0].rowSpan == 1 && tds.length == 13, '对一个4*4的表格,选择第一行的4格单元格,合并成一个'); + //点击删除列按钮 + editor.execCommand('deletecol'); + equal(editor.body.firstChild.getElementsByTagName('tr')[1].childNodes.length, 3, '点击删除列,表格剩3列'); + //撤销 + editor.execCommand('undo'); + equal(editor.body.firstChild.getElementsByTagName('tr')[1].childNodes.length, 4, '撤销后,表格恢复成4列'); + equal(editor.body.firstChild.getElementsByTagName('tr').length, 4, '表格依然有4行'); + start(); + }, 50); + stop(); +}); + +/*trace 808 需要观察光标延迟,这个问题已经被标为不修*/ +/*trace 855 这个用例描述有问题,而且可以跟trace 584合成一个*/ +/*trace 873*/ +//test( 'trace 873 光标不在编辑器中时替换一个文本后按撤销', function () { +// if(ua.browser.opera) +// return; +// var editor = te.obj[0]; +// editor.setContent('欢迎使用ueditor'); +// editor.execCommand( 'searchreplace', {searchStr:'欢迎', replaceStr:'welcom'} ); +// ua.manualDeleteFillData(editor.body); +// equal( editor.body.firstChild.innerHTML, 'welcom使用ueditor', '查找替换' ); +// editor.execCommand( 'Undo' ); +// ua.manualDeleteFillData( editor.body ); +// equal( editor.body.firstChild.innerHTML, '欢迎使用ueditor', '撤销' ); +//} ); + +/*trace 942*/ +test('trace 942 用格式刷后撤销', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + var flag = true; + stop(); + expect(1); + editor.setContent('

    hello

    hello

    '); + + range.setStart(editor.body.firstChild.firstChild.firstChild, 2).setEnd(editor.body.firstChild.firstChild.firstChild, 4).select(); + editor.addListener('mouseup', function () { + ua.manualDeleteFillData(editor.body); + //从浏览器复制了不可见的空文本 + equal(editor.body.lastChild.firstChild.innerHTML.toLowerCase(), 'hello'); + + }); + editor.execCommand('formatmatch'); + range.setStart(editor.body.lastChild.firstChild.firstChild, 1).collapse(true).select(); + ua.mouseup(editor.body); + setTimeout(function () { + start(); + }, 100); +}); + +test('undo--redo', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + editor.focus(); + editor.execCommand('anchor', 'hello'); + editor.undoManger.undo(); + var spase = ua.browser.ie ? ' ' : '
    '; + equal(ua.getChildHTML(editor.body), '

    ' + spase + '

    ', ''); + editor.undoManger.redo(); + ua.manualDeleteFillData(editor.body); +// var cs=editor.body.firstChild.firstChild.getAttribute('class'); +// var an=editor.body.firstChild.firstChild.getAttribute('anchorname'); +// equal(cs,'anchorclass','锚点class'); +// equal(an,'hello','锚点name'); +// var br = (ua.browser.ie) ? '' : '
    '; + if (ua.browser.ie) + equal(ua.getChildHTML(editor.body), '

    ' + spase + '

    ', ''); + else + equal(ua.getChildHTML(editor.body), '

    ' + spase + '

    ', ''); +}); +test('reset,index', function () { + var editor = te.obj[0]; + editor.setContent('

    '); + editor.focus(); + editor.execCommand('anchor', 'hello'); + var listLength = editor.undoManger.list.length; + ok(listLength > 0, '检查undoManger.list'); + equal(editor.undoManger.index, 1, '检查undoManger.index'); + editor.undoManger.undo(); + equal(editor.undoManger.list.length, listLength, 'undo操作,undoManger.list不变'); + equal(editor.undoManger.index, 0, 'undo操作,undoManger.index-1'); + var spase = ua.browser.ie ? ' ' : '
    '; + equal(ua.getChildHTML(editor.body), '

    ' + spase + '

    ', '检查内容'); + editor.reset(); + equal(editor.undoManger.list.length, 0, 'reset,undoManger.list清空'); + equal(editor.undoManger.index, 0, 'reset,undoManger.index清空'); + editor.undoManger.redo(); + ua.manualDeleteFillData(editor.body); + var spase = ua.browser.ie ? ' ' : '
    '; + equal(ua.getChildHTML(editor.body), '

    ' + spase + '

    ', '检查内容'); + +}); +/*trace 1068 格式刷图片*/ +test('trace 1068 默认样式的图片刷左浮动图片,撤销,左浮动图片刷默认样式的图片', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + + var num = 0; + + var body = editor.body; + editor.setContent('


    '); + range.setStart(body.firstChild, 0).collapse(1).select(); + editor.execCommand('insertimage', {src: 'http://img.baidu.com/hi/jx2/j_0001.gif', width: 50, height: 51}); + range.selectNode(editor.body.getElementsByTagName('img')[0]).select(); + editor.execCommand('imagefloat', 'none'); + range.setStart(body.firstChild, 0).collapse(1).select(); + editor.execCommand('insertimage', {src: 'http://img.baidu.com/hi/jx2/j_0002.gif', width: 50, height: 51}); + range.selectNode(editor.body.getElementsByTagName('img')[0]).select(); + editor.execCommand('imagefloat', 'left'); + // equal(ua.getFloatStyle(body.getElementsByTagName( 'img' )[0]), "left", '左浮动' ); + // equal(ua.getFloatStyle(body.getElementsByTagName( 'img' )[1]), "none", '默认' ); + range.selectNode(body.getElementsByTagName('img')[1]).select(); + editor.addListener('mouseup', function () { + equal(editor.queryCommandState('formatmatch'), 0, '刷后状态为0'); + if (num == 1) { + equal(ua.getFloatStyle(body.getElementsByTagName('img')[0]), "none", '默认刷左浮动'); + editor.execCommand('Undo'); + equal(ua.getFloatStyle(body.getElementsByTagName('img')[0]), "left", '撤销后,左浮动还原'); + range.selectNode(body.getElementsByTagName('img')[0]).select(); + editor.execCommand('formatmatch'); + range.selectNode(body.getElementsByTagName('img')[1]).select(); + num = 2; + ua.mouseup(editor.body); + } + else if (num == 2) { + if (!ua.browser.opera) { + equal(ua.getFloatStyle(body.getElementsByTagName('img')[1]), 'left', '左浮动刷默认'); + } + setTimeout(function () { + start(); + }, 100); + } + }); + editor.execCommand('formatmatch'); + range.selectNode(body.getElementsByTagName('img')[0]).select(); + num = 1; + ua.mouseup(body.getElementsByTagName('img')[0]); + stop(); +}); + +//test( +// 'undo', +// function() { +// var editor = new baidu.editor.Editor({ +// enterkey : 'br', +// initialContent : 'test' +// }); +// editor.render(te.dom[0]); +// var domUtils = baidu.editor.dom.domUtils, dtd = baidu.editor.dom.dtd, range = new baidu.editor.dom.Range( +// editor.document); +// editor.setContent('xxxx

    xxxx

    '); +// range.selectNodeContents(editor.document.body).select(); +// editor.execCommand('bold'); +// editor.execCommand('Undo'); +// equals(getHTML(editor.document.body), 'xxxx

    xxxx

    '); +// editor.execCommand('redo'); +// equals(getHTML(editor.document.body), 'xxxx

    xxxx

    '); +// ok(!editor.hasRedo); +// +// editor.execCommand('Undo'); +// editor.execCommand('Undo'); +// equals(getHTML(editor.document.body), 'test'); +// }); + +test('ctrl+z/y', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + + var body = editor.body; + editor.setContent('

    没有加粗的文本

    '); + range.selectNode(body.firstChild).select(); + var p = body.firstChild; + setTimeout(function () { + ua.keydown(editor.body, {'keyCode': 66, 'ctrlKey': true}); + setTimeout(function () { + equal(ua.getChildHTML(p), '没有加粗的文本'); + ua.keydown(editor.body, {'keyCode': 90, 'ctrlKey': true}); + setTimeout(function () { + editor.focus(); + equal(ua.getChildHTML(body.firstChild), '没有加粗的文本'); + ua.keydown(editor.body, {'keyCode': 89, 'ctrlKey': true}); + editor.focus(); + setTimeout(function () { + equal(ua.getChildHTML(body.firstChild), '没有加粗的文本'); + start(); + }, 100); + }, 100); + }, 150); + }, 100); + stop(); +}); + +/*trace 3209 格式刷图片*/ +test('trace 3209 插入表格,undo redo', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent('

    '); + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('inserttable'); + editor.execCommand('undo'); + equal(editor.getContent().toLowerCase(), '', '插入表格,撤销'); + editor.execCommand('redo'); + ua.manualDeleteFillData(editor.body); + equal(editor.body.firstChild.tagName.toLowerCase(), 'table', '插入表格,撤销重做'); +}); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/video.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/video.js new file mode 100644 index 000000000..d4ae6cd11 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/video.js @@ -0,0 +1,64 @@ +/** + * Created with JetBrains PhpStorm. + * User: Administrator + * Date: 13-5-15 + * Time: 下午7:15 + * To change this template use File | Settings | File Templates. + */ +module( 'plugins.video' ); + +test( '插入优酷视频', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent( '

    hello

    ' ); + range.setStart(editor.body.firstChild,0).collapse(true).select(); + var videoObject ={url: "http://player.youku.com/player.php/Type/Folder/Fid/19275705/Ob/1/sid/XNTU3Mjk4NzQ4/v.swf", width: "500", height: "400", align: "center"} + editor.execCommand( 'insertvideo',videoObject); + stop(); + setTimeout(function(){ + var img = editor.body.getElementsByTagName('img'); + equal(img.length,1,'插入img'); + equal(img[0].width,"500"); + equal(img[0].height,"400"); + equal(img[0].src,editor.options.UEDITOR_HOME_URL+'themes/default/images/spacer.gif'); + if(ua.browser.gecko||ua.browser.ie>8){ + ok(img[0].style.background.indexOf('url(\"'+editor.options.UEDITOR_HOME_URL+'themes/default/images/videologo.gif\")') > -1, '占位符背景图是否正常'); + } + else + { + ok(img[0].style.background.indexOf("url("+editor.options.UEDITOR_HOME_URL+"themes/default/images/videologo.gif)") > -1, '占位符背景图是否正常'); + } + var html = editor.getContent(); + ok(html.toLowerCase().indexOf('hello

    ' ); + range.setStart(editor.body.firstChild,0).collapse(true).select(); + var videoObject ={url: "http://video-js.zencoder.com/oceans-clip.mp4", width: "500", height: "400", align: "center"} + editor.execCommand( 'insertvideo',videoObject,'upload'); + stop(); + setTimeout(function(){ + var img = editor.body.getElementsByTagName('img'); + equal(img.length,1,'插入img'); + equal(img[0].width,"500"); + equal(img[0].height,"400"); + ok(img[0].className && img[0].className.indexOf('edui-upload-video') != -1, 'okey:有edui-upload-video的class标记'); + equal(img[0].src,editor.options.UEDITOR_HOME_URL+'themes/default/images/spacer.gif'); + if(ua.browser.gecko||ua.browser.ie>8){ + ok(img[0].style.background.indexOf('url(\"'+editor.options.UEDITOR_HOME_URL+'themes/default/images/videologo.gif\")') > -1, '占位符背景图是否正常'); + } + else + { + ok(img[0].style.background.indexOf("url("+editor.options.UEDITOR_HOME_URL+"themes/default/images/videologo.gif)") > -1, '占位符背景图是否正常'); + } + + var html = editor.getContent(); + ok(html.toLowerCase().indexOf('hello

    '); + setTimeout(function () { + range.setStart(editor.body.firstChild, 0).collapse(true).select(); + editor.execCommand('selectall'); + editor.execCommand('cleardoc'); + equal(editor.getContentLength(true), 0, '插入成功'); + + start(); + }, 50); + stop(); +}); + +test('空格', function () { + var editor = te.obj[0]; + var range = te.obj[1]; + editor.setContent(' \ufeff\u200B\t\t \n\n\t\n\b\t\n\b\u200B\t\t\n\n '); + if (ua.browser.ie) + equal(editor.getContentLength(true), 23, '清空后编辑器中23个空格'); + else + equal(editor.getContentLength(true), 22, '清空后编辑器中22个空格'); +}); + +test(' trace 3744 超出最大', function () { + + var div = document.body.appendChild(document.createElement('div')); + div.id = 'ue'; + var editor = UE.getEditor('ue', {'UEDITOR_HOME_URL': '../../../', 'wordCount': true, 'maximumWords': 10,'initialContent':'','autoFloatEnabled': false}); + editor.ready(function () { + + expect(2); + editor.addListener("wordcountoverflow", function () { + ok(true, "超出最大"); + setTimeout(function () { + UE.delEditor('ue'); + start(); + }, 500); + }); + setTimeout(function () { + editor.setContent('hello hello hello'); + equal(editor.getContentLength(true), 17, '仅统计字数') + + }, 50); + }); + stop(); +}); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/wordimage.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/wordimage.js new file mode 100644 index 000000000..8cf48511a --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/plugins/wordimage.js @@ -0,0 +1,57 @@ +/** + * Created by JetBrains PhpStorm. + * User: dongyancen + * Date: 12-3-26 + * Time: 下午3:05 + * To change this template use File | Settings | File Templates. + */ +module('plugins.wordimage'); + +test('检查取得word_img的url地址', function () { + var editor = te.obj[0]; + editor.setContent('



    '); + stop(); + setTimeout(function () { + + editor.execCommand('wordimage', 'word_img'); + equal(editor.body.getElementsByTagName('img')[0].getAttribute('word_img'), "file:///C:DOCUME~1DONGYA~1LOCALS~1Tempmsohtmlclip1clip_image001.gif", '检查url地址'); + editor.setContent('


    '); + setTimeout(function () { + editor.execCommand('wordimage', 'word_img'); +// equal(editor.word_img.length, '2', '有2个wordimg'); + equal(editor.body.getElementsByTagName('img')[0].getAttribute('word_img'), "file:///C:\DOCUME~1\DONGYA~1\LOCALS~1\Temp\msohtmlclip1\01\clip_image001.jpg", '检查 第一个url地址'); + equal(editor.body.getElementsByTagName('img')[1].getAttribute('word_img'), "file:///C:\DOCUME~1\DONGYA~1\LOCALS~1\Temp\msohtmlclip1\01\clip_image001.gif", '检查 第二个url地址'); + equal(editor.queryCommandState('wordimage'), '1', 'queryCommandState'); + start(); + }, 50); + }, 50); +}); + +test('多实例编辑器检查取得word_img的url地址', function () { + var div1 = document.createElement('div'); + var div2 = document.createElement('div'); + document.body.appendChild(div1); + document.body.appendChild(div2); + var editor1 = new UE.Editor({'initialContent':'



    ','autoFloatEnabled':false}); + var editor2 = new UE.Editor({'initialContent':'


    ', 'autoFloatEnabled':false}); + stop(); + setTimeout(function () { + editor1.render(div1); + editor1.ready(function () { + editor2.render(div2); + editor2.ready(function () { + editor1.focus(); + editor1.execCommand('wordimage', 'word_img'); +// equal(editor1.word_img.length, '1', 'editor1有一个wordimg'); + equal(editor1.body.getElementsByTagName('img')[0].getAttribute('word_img'), "file:///C:DOCUME~1DONGYA~1LOCALS~1Tempmsohtmlclip1clip_image001.gif", '检查url地址'); + editor2.execCommand('wordimage', 'word_img'); +// equal(editor2.word_img.length, '2', 'editor2有2个wordimg'); + equal(editor2.body.getElementsByTagName('img')[0].getAttribute('word_img'), "file:///C:\DOCUME~1\DONGYA~1\LOCALS~1\Temp\msohtmlclip1\01\clip_image001.jpg", '检查 第一个url地址'); + equal(editor2.body.getElementsByTagName('img')[1].getAttribute('word_img'), "file:///C:\DOCUME~1\DONGYA~1\LOCALS~1\Temp\msohtmlclip1\01\clip_image001.gif", '检查 第二个url地址'); + equal(editor1.queryCommandState('wordimage'), '1', 'queryCommandState'); + equal(editor2.queryCommandState('wordimage'), '1', 'queryCommandState'); + start(); + }); + }); + }); +}); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/qunit/jquery-1.5.1.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/qunit/jquery-1.5.1.js new file mode 100644 index 000000000..fa52d75b8 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/qunit/jquery-1.5.1.js @@ -0,0 +1,8316 @@ +/*! + * jQuery JavaScript Library v1.5.1 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Wed Feb 23 13:55:29 2011 -0500 + */ +(function( window, undefined ) { + +// Use the correct document accordingly with window argument (sandbox) +var document = window.document; +var jQuery = (function() { + +// Define a local copy of jQuery +var jQuery = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + return new jQuery.fn.init( selector, context, rootjQuery ); + }, + + // Map over jQuery in case of overwrite + _jQuery = window.jQuery, + + // Map over the $ in case of overwrite + _$ = window.$, + + // A central reference to the root jQuery(document) + rootjQuery, + + // A simple way to check for HTML strings or ID strings + // (both of which we optimize for) + quickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/, + + // Check if a string has a non-whitespace character in it + rnotwhite = /\S/, + + // Used for trimming whitespace + trimLeft = /^\s+/, + trimRight = /\s+$/, + + // Check for digits + rdigit = /\d/, + + // Match a standalone tag + rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, + + // JSON RegExp + rvalidchars = /^[\],:{}\s]*$/, + rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, + rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, + rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, + + // Useragent RegExp + rwebkit = /(webkit)[ \/]([\w.]+)/, + ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, + rmsie = /(msie) ([\w.]+)/, + rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, + + // Keep a UserAgent string for use with jQuery.browser + userAgent = navigator.userAgent, + + // For matching the engine and version of the browser + browserMatch, + + // Has the ready events already been bound? + readyBound = false, + + // The deferred used on DOM ready + readyList, + + // Promise methods + promiseMethods = "then done fail isResolved isRejected promise".split( " " ), + + // The ready event handler + DOMContentLoaded, + + // Save a reference to some core methods + toString = Object.prototype.toString, + hasOwn = Object.prototype.hasOwnProperty, + push = Array.prototype.push, + slice = Array.prototype.slice, + trim = String.prototype.trim, + indexOf = Array.prototype.indexOf, + + // [[Class]] -> type pairs + class2type = {}; + +jQuery.fn = jQuery.prototype = { + constructor: jQuery, + init: function( selector, context, rootjQuery ) { + var match, elem, ret, doc; + + // Handle $(""), $(null), or $(undefined) + if ( !selector ) { + return this; + } + + // Handle $(DOMElement) + if ( selector.nodeType ) { + this.context = this[0] = selector; + this.length = 1; + return this; + } + + // The body element only exists once, optimize finding it + if ( selector === "body" && !context && document.body ) { + this.context = document; + this[0] = document.body; + this.selector = "body"; + this.length = 1; + return this; + } + + // Handle HTML strings + if ( typeof selector === "string" ) { + // Are we dealing with HTML string or an ID? + match = quickExpr.exec( selector ); + + // Verify a match, and that no context was specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) { + context = context instanceof jQuery ? context[0] : context; + doc = (context ? context.ownerDocument || context : document); + + // If a single string is passed in and it's a single tag + // just do a createElement and skip the rest + ret = rsingleTag.exec( selector ); + + if ( ret ) { + if ( jQuery.isPlainObject( context ) ) { + selector = [ document.createElement( ret[1] ) ]; + jQuery.fn.attr.call( selector, context, true ); + + } else { + selector = [ doc.createElement( ret[1] ) ]; + } + + } else { + ret = jQuery.buildFragment( [ match[1] ], [ doc ] ); + selector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes; + } + + return jQuery.merge( this, selector ); + + // HANDLE: $("#id") + } else { + elem = document.getElementById( match[2] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[2] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[0] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return (context || rootjQuery).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return rootjQuery.ready( selector ); + } + + if (selector.selector !== undefined) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }, + + // Start with an empty selector + selector: "", + + // The current version of jQuery being used + jquery: "1.5.1", + + // The default length of a jQuery object is 0 + length: 0, + + // The number of elements contained in the matched element set + size: function() { + return this.length; + }, + + toArray: function() { + return slice.call( this, 0 ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num == null ? + + // Return a 'clean' array + this.toArray() : + + // Return just the object + ( num < 0 ? this[ this.length + num ] : this[ num ] ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems, name, selector ) { + // Build a new jQuery matched element set + var ret = this.constructor(); + + if ( jQuery.isArray( elems ) ) { + push.apply( ret, elems ); + + } else { + jQuery.merge( ret, elems ); + } + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + ret.context = this.context; + + if ( name === "find" ) { + ret.selector = this.selector + (this.selector ? " " : "") + selector; + } else if ( name ) { + ret.selector = this.selector + "." + name + "(" + selector + ")"; + } + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + ready: function( fn ) { + // Attach the listeners + jQuery.bindReady(); + + // Add the callback + readyList.done( fn ); + + return this; + }, + + eq: function( i ) { + return i === -1 ? + this.slice( i ) : + this.slice( i, +i + 1 ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ), + "slice", slice.call(arguments).join(",") ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function( elem, i ) { + return callback.call( elem, i, elem ); + })); + }, + + end: function() { + return this.prevObject || this.constructor(null); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: [].sort, + splice: [].splice +}; + +// Give the init function the jQuery prototype for later instantiation +jQuery.fn.init.prototype = jQuery.fn; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( length === i ) { + target = this; + --i; + } + + for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) { + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray(src) ? src : []; + + } else { + clone = src && jQuery.isPlainObject(src) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend({ + noConflict: function( deep ) { + window.$ = _$; + + if ( deep ) { + window.jQuery = _jQuery; + } + + return jQuery; + }, + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Handle when the DOM is ready + ready: function( wait ) { + // A third-party is pushing the ready event forwards + if ( wait === true ) { + jQuery.readyWait--; + } + + // Make sure that the DOM is not already loaded + if ( !jQuery.readyWait || (wait !== true && !jQuery.isReady) ) { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( !document.body ) { + return setTimeout( jQuery.ready, 1 ); + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.trigger ) { + jQuery( document ).trigger( "ready" ).unbind( "ready" ); + } + } + }, + + bindReady: function() { + if ( readyBound ) { + return; + } + + readyBound = true; + + // Catch cases where $(document).ready() is called after the + // browser event has already occurred. + if ( document.readyState === "complete" ) { + // Handle it asynchronously to allow scripts the opportunity to delay ready + return setTimeout( jQuery.ready, 1 ); + } + + // Mozilla, Opera and webkit nightlies currently support this event + if ( document.addEventListener ) { + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", jQuery.ready, false ); + + // If IE event model is used + } else if ( document.attachEvent ) { + // ensure firing before onload, + // maybe late but safe also for iframes + document.attachEvent("onreadystatechange", DOMContentLoaded); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", jQuery.ready ); + + // If IE and not a frame + // continually check to see if the document is ready + var toplevel = false; + + try { + toplevel = window.frameElement == null; + } catch(e) {} + + if ( document.documentElement.doScroll && toplevel ) { + doScrollCheck(); + } + } + }, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return jQuery.type(obj) === "function"; + }, + + isArray: Array.isArray || function( obj ) { + return jQuery.type(obj) === "array"; + }, + + // A crude way of determining if an object is a window + isWindow: function( obj ) { + return obj && typeof obj === "object" && "setInterval" in obj; + }, + + isNaN: function( obj ) { + return obj == null || !rdigit.test( obj ) || isNaN( obj ); + }, + + type: function( obj ) { + return obj == null ? + String( obj ) : + class2type[ toString.call(obj) ] || "object"; + }, + + isPlainObject: function( obj ) { + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + // Not own constructor property must be Object + if ( obj.constructor && + !hasOwn.call(obj, "constructor") && + !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { + return false; + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + + var key; + for ( key in obj ) {} + + return key === undefined || hasOwn.call( obj, key ); + }, + + isEmptyObject: function( obj ) { + for ( var name in obj ) { + return false; + } + return true; + }, + + error: function( msg ) { + throw msg; + }, + + parseJSON: function( data ) { + if ( typeof data !== "string" || !data ) { + return null; + } + + // Make sure leading/trailing whitespace is removed (IE can't handle it) + data = jQuery.trim( data ); + + // Make sure the incoming data is actual JSON + // Logic borrowed from http://json.org/json2.js + if ( rvalidchars.test(data.replace(rvalidescape, "@") + .replace(rvalidtokens, "]") + .replace(rvalidbraces, "")) ) { + + // Try to use the native JSON parser first + return window.JSON && window.JSON.parse ? + window.JSON.parse( data ) : + (new Function("return " + data))(); + + } else { + jQuery.error( "Invalid JSON: " + data ); + } + }, + + // Cross-browser xml parsing + // (xml & tmp used internally) + parseXML: function( data , xml , tmp ) { + + if ( window.DOMParser ) { // Standard + tmp = new DOMParser(); + xml = tmp.parseFromString( data , "text/xml" ); + } else { // IE + xml = new ActiveXObject( "Microsoft.XMLDOM" ); + xml.async = "false"; + xml.loadXML( data ); + } + + tmp = xml.documentElement; + + if ( ! tmp || ! tmp.nodeName || tmp.nodeName === "parsererror" ) { + jQuery.error( "Invalid XML: " + data ); + } + + return xml; + }, + + noop: function() {}, + + // Evalulates a script in a global context + globalEval: function( data ) { + if ( data && rnotwhite.test(data) ) { + // Inspired by code by Andrea Giammarchi + // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html + var head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement, + script = document.createElement( "script" ); + + if ( jQuery.support.scriptEval() ) { + script.appendChild( document.createTextNode( data ) ); + } else { + script.text = data; + } + + // Use insertBefore instead of appendChild to circumvent an IE6 bug. + // This arises when a base node is used (#2709). + head.insertBefore( script, head.firstChild ); + head.removeChild( script ); + } + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); + }, + + // args is for internal usage only + each: function( object, callback, args ) { + var name, i = 0, + length = object.length, + isObj = length === undefined || jQuery.isFunction(object); + + if ( args ) { + if ( isObj ) { + for ( name in object ) { + if ( callback.apply( object[ name ], args ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.apply( object[ i++ ], args ) === false ) { + break; + } + } + } + + // A special, fast, case for the most common use of each + } else { + if ( isObj ) { + for ( name in object ) { + if ( callback.call( object[ name ], name, object[ name ] ) === false ) { + break; + } + } + } else { + for ( var value = object[0]; + i < length && callback.call( value, i, value ) !== false; value = object[++i] ) {} + } + } + + return object; + }, + + // Use native String.trim function wherever possible + trim: trim ? + function( text ) { + return text == null ? + "" : + trim.call( text ); + } : + + // Otherwise use our own trimming functionality + function( text ) { + return text == null ? + "" : + text.toString().replace( trimLeft, "" ).replace( trimRight, "" ); + }, + + // results is for internal usage only + makeArray: function( array, results ) { + var ret = results || []; + + if ( array != null ) { + // The window, strings (and functions) also have 'length' + // The extra typeof function check is to prevent crashes + // in Safari 2 (See: #3039) + // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 + var type = jQuery.type(array); + + if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) { + push.call( ret, array ); + } else { + jQuery.merge( ret, array ); + } + } + + return ret; + }, + + inArray: function( elem, array ) { + if ( array.indexOf ) { + return array.indexOf( elem ); + } + + for ( var i = 0, length = array.length; i < length; i++ ) { + if ( array[ i ] === elem ) { + return i; + } + } + + return -1; + }, + + merge: function( first, second ) { + var i = first.length, + j = 0; + + if ( typeof second.length === "number" ) { + for ( var l = second.length; j < l; j++ ) { + first[ i++ ] = second[ j ]; + } + + } else { + while ( second[j] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, inv ) { + var ret = [], retVal; + inv = !!inv; + + // Go through the array, only saving the items + // that pass the validator function + for ( var i = 0, length = elems.length; i < length; i++ ) { + retVal = !!callback( elems[ i ], i ); + if ( inv !== retVal ) { + ret.push( elems[ i ] ); + } + } + + return ret; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var ret = [], value; + + // Go through the array, translating each of the items to their + // new value (or values). + for ( var i = 0, length = elems.length; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + + // Flatten any nested arrays + return ret.concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + proxy: function( fn, proxy, thisObject ) { + if ( arguments.length === 2 ) { + if ( typeof proxy === "string" ) { + thisObject = fn; + fn = thisObject[ proxy ]; + proxy = undefined; + + } else if ( proxy && !jQuery.isFunction( proxy ) ) { + thisObject = proxy; + proxy = undefined; + } + } + + if ( !proxy && fn ) { + proxy = function() { + return fn.apply( thisObject || this, arguments ); + }; + } + + // Set the guid of unique handler to the same of original handler, so it can be removed + if ( fn ) { + proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; + } + + // So proxy can be declared as an argument + return proxy; + }, + + // Mutifunctional method to get and set values to a collection + // The value/s can be optionally by executed if its a function + access: function( elems, key, value, exec, fn, pass ) { + var length = elems.length; + + // Setting many attributes + if ( typeof key === "object" ) { + for ( var k in key ) { + jQuery.access( elems, k, key[k], exec, fn, value ); + } + return elems; + } + + // Setting one attribute + if ( value !== undefined ) { + // Optionally, function values get executed if exec is true + exec = !pass && exec && jQuery.isFunction(value); + + for ( var i = 0; i < length; i++ ) { + fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); + } + + return elems; + } + + // Getting an attribute + return length ? fn( elems[0], key ) : undefined; + }, + + now: function() { + return (new Date()).getTime(); + }, + + // Create a simple deferred (one callbacks list) + _Deferred: function() { + var // callbacks list + callbacks = [], + // stored [ context , args ] + fired, + // to avoid firing when already doing so + firing, + // flag to know if the deferred has been cancelled + cancelled, + // the deferred itself + deferred = { + + // done( f1, f2, ...) + done: function() { + if ( !cancelled ) { + var args = arguments, + i, + length, + elem, + type, + _fired; + if ( fired ) { + _fired = fired; + fired = 0; + } + for ( i = 0, length = args.length; i < length; i++ ) { + elem = args[ i ]; + type = jQuery.type( elem ); + if ( type === "array" ) { + deferred.done.apply( deferred, elem ); + } else if ( type === "function" ) { + callbacks.push( elem ); + } + } + if ( _fired ) { + deferred.resolveWith( _fired[ 0 ], _fired[ 1 ] ); + } + } + return this; + }, + + // resolve with given context and args + resolveWith: function( context, args ) { + if ( !cancelled && !fired && !firing ) { + firing = 1; + try { + while( callbacks[ 0 ] ) { + callbacks.shift().apply( context, args ); + } + } + // We have to add a catch block for + // IE prior to 8 or else the finally + // block will never get executed + catch (e) { + throw e; + } + finally { + fired = [ context, args ]; + firing = 0; + } + } + return this; + }, + + // resolve with this as context and given arguments + resolve: function() { + deferred.resolveWith( jQuery.isFunction( this.promise ) ? this.promise() : this, arguments ); + return this; + }, + + // Has this deferred been resolved? + isResolved: function() { + return !!( firing || fired ); + }, + + // Cancel + cancel: function() { + cancelled = 1; + callbacks = []; + return this; + } + }; + + return deferred; + }, + + // Full fledged deferred (two callbacks list) + Deferred: function( func ) { + var deferred = jQuery._Deferred(), + failDeferred = jQuery._Deferred(), + promise; + // Add errorDeferred methods, then and promise + jQuery.extend( deferred, { + then: function( doneCallbacks, failCallbacks ) { + deferred.done( doneCallbacks ).fail( failCallbacks ); + return this; + }, + fail: failDeferred.done, + rejectWith: failDeferred.resolveWith, + reject: failDeferred.resolve, + isRejected: failDeferred.isResolved, + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + if ( obj == null ) { + if ( promise ) { + return promise; + } + promise = obj = {}; + } + var i = promiseMethods.length; + while( i-- ) { + obj[ promiseMethods[i] ] = deferred[ promiseMethods[i] ]; + } + return obj; + } + } ); + // Make sure only one callback list will be used + deferred.done( failDeferred.cancel ).fail( deferred.cancel ); + // Unexpose cancel + delete deferred.cancel; + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + return deferred; + }, + + // Deferred helper + when: function( object ) { + var lastIndex = arguments.length, + deferred = lastIndex <= 1 && object && jQuery.isFunction( object.promise ) ? + object : + jQuery.Deferred(), + promise = deferred.promise(); + + if ( lastIndex > 1 ) { + var array = slice.call( arguments, 0 ), + count = lastIndex, + iCallback = function( index ) { + return function( value ) { + array[ index ] = arguments.length > 1 ? slice.call( arguments, 0 ) : value; + if ( !( --count ) ) { + deferred.resolveWith( promise, array ); + } + }; + }; + while( ( lastIndex-- ) ) { + object = array[ lastIndex ]; + if ( object && jQuery.isFunction( object.promise ) ) { + object.promise().then( iCallback(lastIndex), deferred.reject ); + } else { + --count; + } + } + if ( !count ) { + deferred.resolveWith( promise, array ); + } + } else if ( deferred !== object ) { + deferred.resolve( object ); + } + return promise; + }, + + // Use of jQuery.browser is frowned upon. + // More details: http://docs.jquery.com/Utilities/jQuery.browser + uaMatch: function( ua ) { + ua = ua.toLowerCase(); + + var match = rwebkit.exec( ua ) || + ropera.exec( ua ) || + rmsie.exec( ua ) || + ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || + []; + + return { browser: match[1] || "", version: match[2] || "0" }; + }, + + sub: function() { + function jQuerySubclass( selector, context ) { + return new jQuerySubclass.fn.init( selector, context ); + } + jQuery.extend( true, jQuerySubclass, this ); + jQuerySubclass.superclass = this; + jQuerySubclass.fn = jQuerySubclass.prototype = this(); + jQuerySubclass.fn.constructor = jQuerySubclass; + jQuerySubclass.subclass = this.subclass; + jQuerySubclass.fn.init = function init( selector, context ) { + if ( context && context instanceof jQuery && !(context instanceof jQuerySubclass) ) { + context = jQuerySubclass(context); + } + + return jQuery.fn.init.call( this, selector, context, rootjQuerySubclass ); + }; + jQuerySubclass.fn.init.prototype = jQuerySubclass.fn; + var rootjQuerySubclass = jQuerySubclass(document); + return jQuerySubclass; + }, + + browser: {} +}); + +// Create readyList deferred +readyList = jQuery._Deferred(); + +// Populate the class2type map +jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +}); + +browserMatch = jQuery.uaMatch( userAgent ); +if ( browserMatch.browser ) { + jQuery.browser[ browserMatch.browser ] = true; + jQuery.browser.version = browserMatch.version; +} + +// Deprecated, use jQuery.browser.webkit instead +if ( jQuery.browser.webkit ) { + jQuery.browser.safari = true; +} + +if ( indexOf ) { + jQuery.inArray = function( elem, array ) { + return indexOf.call( array, elem ); + }; +} + +// IE doesn't match non-breaking spaces with \s +if ( rnotwhite.test( "\xA0" ) ) { + trimLeft = /^[\s\xA0]+/; + trimRight = /[\s\xA0]+$/; +} + +// All jQuery objects should point back to these +rootjQuery = jQuery(document); + +// Cleanup functions for the document ready method +if ( document.addEventListener ) { + DOMContentLoaded = function() { + document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + jQuery.ready(); + }; + +} else if ( document.attachEvent ) { + DOMContentLoaded = function() { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( document.readyState === "complete" ) { + document.detachEvent( "onreadystatechange", DOMContentLoaded ); + jQuery.ready(); + } + }; +} + +// The DOM ready check for Internet Explorer +function doScrollCheck() { + if ( jQuery.isReady ) { + return; + } + + try { + // If IE is used, use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + document.documentElement.doScroll("left"); + } catch(e) { + setTimeout( doScrollCheck, 1 ); + return; + } + + // and execute any waiting functions + jQuery.ready(); +} + +// Expose jQuery to the global object +return jQuery; + +})(); + + +(function() { + + jQuery.support = {}; + + var div = document.createElement("div"); + + div.style.display = "none"; + div.innerHTML = "
    a"; + + var all = div.getElementsByTagName("*"), + a = div.getElementsByTagName("a")[0], + select = document.createElement("select"), + opt = select.appendChild( document.createElement("option") ), + input = div.getElementsByTagName("input")[0]; + + // Can't get basic test support + if ( !all || !all.length || !a ) { + return; + } + + jQuery.support = { + // IE strips leading whitespace when .innerHTML is used + leadingWhitespace: div.firstChild.nodeType === 3, + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + tbody: !div.getElementsByTagName("tbody").length, + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + htmlSerialize: !!div.getElementsByTagName("link").length, + + // Get the style information from getAttribute + // (IE uses .cssText insted) + style: /red/.test( a.getAttribute("style") ), + + // Make sure that URLs aren't manipulated + // (IE normalizes it by default) + hrefNormalized: a.getAttribute("href") === "/a", + + // Make sure that element opacity exists + // (IE uses filter instead) + // Use a regex to work around a WebKit issue. See #5145 + opacity: /^0.55$/.test( a.style.opacity ), + + // Verify style float existence + // (IE uses styleFloat instead of cssFloat) + cssFloat: !!a.style.cssFloat, + + // Make sure that if no value is specified for a checkbox + // that it defaults to "on". + // (WebKit defaults to "" instead) + checkOn: input.value === "on", + + // Make sure that a selected-by-default option has a working selected property. + // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) + optSelected: opt.selected, + + // Will be defined later + deleteExpando: true, + optDisabled: false, + checkClone: false, + noCloneEvent: true, + noCloneChecked: true, + boxModel: null, + inlineBlockNeedsLayout: false, + shrinkWrapBlocks: false, + reliableHiddenOffsets: true + }; + + input.checked = true; + jQuery.support.noCloneChecked = input.cloneNode( true ).checked; + + // Make sure that the options inside disabled selects aren't marked as disabled + // (WebKit marks them as diabled) + select.disabled = true; + jQuery.support.optDisabled = !opt.disabled; + + var _scriptEval = null; + jQuery.support.scriptEval = function() { + if ( _scriptEval === null ) { + var root = document.documentElement, + script = document.createElement("script"), + id = "script" + jQuery.now(); + + try { + script.appendChild( document.createTextNode( "window." + id + "=1;" ) ); + } catch(e) {} + + root.insertBefore( script, root.firstChild ); + + // Make sure that the execution of code works by injecting a script + // tag with appendChild/createTextNode + // (IE doesn't support this, fails, and uses .text instead) + if ( window[ id ] ) { + _scriptEval = true; + delete window[ id ]; + } else { + _scriptEval = false; + } + + root.removeChild( script ); + // release memory in IE + root = script = id = null; + } + + return _scriptEval; + }; + + // Test to see if it's possible to delete an expando from an element + // Fails in Internet Explorer + try { + delete div.test; + + } catch(e) { + jQuery.support.deleteExpando = false; + } + + if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { + div.attachEvent("onclick", function click() { + // Cloning a node shouldn't copy over any + // bound event handlers (IE does this) + jQuery.support.noCloneEvent = false; + div.detachEvent("onclick", click); + }); + div.cloneNode(true).fireEvent("onclick"); + } + + div = document.createElement("div"); + div.innerHTML = ""; + + var fragment = document.createDocumentFragment(); + fragment.appendChild( div.firstChild ); + + // WebKit doesn't clone checked state correctly in fragments + jQuery.support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked; + + // Figure out if the W3C box model works as expected + // document.body must exist before we can do this + jQuery(function() { + var div = document.createElement("div"), + body = document.getElementsByTagName("body")[0]; + + // Frameset documents with no body should not run this code + if ( !body ) { + return; + } + + div.style.width = div.style.paddingLeft = "1px"; + body.appendChild( div ); + jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2; + + if ( "zoom" in div.style ) { + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + // (IE < 8 does this) + div.style.display = "inline"; + div.style.zoom = 1; + jQuery.support.inlineBlockNeedsLayout = div.offsetWidth === 2; + + // Check if elements with layout shrink-wrap their children + // (IE 6 does this) + div.style.display = ""; + div.innerHTML = "
    "; + jQuery.support.shrinkWrapBlocks = div.offsetWidth !== 2; + } + + div.innerHTML = "
    t
    "; + var tds = div.getElementsByTagName("td"); + + // Check if table cells still have offsetWidth/Height when they are set + // to display:none and there are still other visible table cells in a + // table row; if so, offsetWidth/Height are not reliable for use when + // determining if an element has been hidden directly using + // display:none (it is still safe to use offsets if a parent element is + // hidden; don safety goggles and see bug #4512 for more information). + // (only IE 8 fails this test) + jQuery.support.reliableHiddenOffsets = tds[0].offsetHeight === 0; + + tds[0].style.display = ""; + tds[1].style.display = "none"; + + // Check if empty table cells still have offsetWidth/Height + // (IE < 8 fail this test) + jQuery.support.reliableHiddenOffsets = jQuery.support.reliableHiddenOffsets && tds[0].offsetHeight === 0; + div.innerHTML = ""; + + body.removeChild( div ).style.display = "none"; + div = tds = null; + }); + + // Technique from Juriy Zaytsev + // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/ + var eventSupported = function( eventName ) { + var el = document.createElement("div"); + eventName = "on" + eventName; + + // We only care about the case where non-standard event systems + // are used, namely in IE. Short-circuiting here helps us to + // avoid an eval call (in setAttribute) which can cause CSP + // to go haywire. See: https://developer.mozilla.org/en/Security/CSP + if ( !el.attachEvent ) { + return true; + } + + var isSupported = (eventName in el); + if ( !isSupported ) { + el.setAttribute(eventName, "return;"); + isSupported = typeof el[eventName] === "function"; + } + el = null; + + return isSupported; + }; + + jQuery.support.submitBubbles = eventSupported("submit"); + jQuery.support.changeBubbles = eventSupported("change"); + + // release memory in IE + div = all = a = null; +})(); + + + +var rbrace = /^(?:\{.*\}|\[.*\])$/; + +jQuery.extend({ + cache: {}, + + // Please use with caution + uuid: 0, + + // Unique for each copy of jQuery on the pagebreak + // Non-digits removed to match rinlinejQuery + expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), + + // The following elements throw uncatchable exceptions if you + // attempt to add expando properties to them. + noData: { + "embed": true, + // Ban all objects except for Flash (which handle expandos) + "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", + "applet": true + }, + + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; + + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var internalKey = jQuery.expando, getByName = typeof name === "string", thisCache, + + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, + + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, + + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando; + + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ( (!id || (pvt && id && !cache[ id ][ internalKey ])) && getByName && data === undefined ) { + return; + } + + if ( !id ) { + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if ( isNode ) { + elem[ jQuery.expando ] = id = ++jQuery.uuid; + } else { + id = jQuery.expando; + } + } + + if ( !cache[ id ] ) { + cache[ id ] = {}; + + // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery + // metadata on plain JS objects when the object is serialized using + // JSON.stringify + if ( !isNode ) { + cache[ id ].toJSON = jQuery.noop; + } + } + + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if ( typeof name === "object" || typeof name === "function" ) { + if ( pvt ) { + cache[ id ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name); + } else { + cache[ id ] = jQuery.extend(cache[ id ], name); + } + } + + thisCache = cache[ id ]; + + // Internal jQuery data is stored in a separate object inside the object's data + // cache in order to avoid key collisions between internal data and user-defined + // data + if ( pvt ) { + if ( !thisCache[ internalKey ] ) { + thisCache[ internalKey ] = {}; + } + + thisCache = thisCache[ internalKey ]; + } + + if ( data !== undefined ) { + thisCache[ name ] = data; + } + + // TODO: This is a hack for 1.5 ONLY. It will be removed in 1.6. Users should + // not attempt to inspect the internal events object using jQuery.data, as this + // internal data object is undocumented and subject to change. + if ( name === "events" && !thisCache[name] ) { + return thisCache[ internalKey ] && thisCache[ internalKey ].events; + } + + return getByName ? thisCache[ name ] : thisCache; + }, + + removeData: function( elem, name, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var internalKey = jQuery.expando, isNode = elem.nodeType, + + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + + // See jQuery.data for more information + id = isNode ? elem[ jQuery.expando ] : jQuery.expando; + + // If there is already no cache entry for this object, there is no + // purpose in continuing + if ( !cache[ id ] ) { + return; + } + + if ( name ) { + var thisCache = pvt ? cache[ id ][ internalKey ] : cache[ id ]; + + if ( thisCache ) { + delete thisCache[ name ]; + + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( !isEmptyDataObject(thisCache) ) { + return; + } + } + } + + // See jQuery.data for more information + if ( pvt ) { + delete cache[ id ][ internalKey ]; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject(cache[ id ]) ) { + return; + } + } + + var internalCache = cache[ id ][ internalKey ]; + + // Browsers that fail expando deletion also refuse to delete expandos on + // the window, but it will allow it on all other JS objects; other browsers + // don't care + if ( jQuery.support.deleteExpando || cache != window ) { + delete cache[ id ]; + } else { + cache[ id ] = null; + } + + // We destroyed the entire user cache at once because it's faster than + // iterating through each key, but we need to continue to persist internal + // data if it existed + if ( internalCache ) { + cache[ id ] = {}; + // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery + // metadata on plain JS objects when the object is serialized using + // JSON.stringify + if ( !isNode ) { + cache[ id ].toJSON = jQuery.noop; + } + + cache[ id ][ internalKey ] = internalCache; + + // Otherwise, we need to eliminate the expando on the node to avoid + // false lookups in the cache for entries that no longer exist + } else if ( isNode ) { + // IE does not allow us to delete expando properties from nodes, + // nor does it have a removeAttribute function on Document nodes; + // we must handle all of these cases + if ( jQuery.support.deleteExpando ) { + delete elem[ jQuery.expando ]; + } else if ( elem.removeAttribute ) { + elem.removeAttribute( jQuery.expando ); + } else { + elem[ jQuery.expando ] = null; + } + } + }, + + // For internal use only. + _data: function( elem, name, data ) { + return jQuery.data( elem, name, data, true ); + }, + + // A method for determining if a DOM node can handle the data expando + acceptData: function( elem ) { + if ( elem.nodeName ) { + var match = jQuery.noData[ elem.nodeName.toLowerCase() ]; + + if ( match ) { + return !(match === true || elem.getAttribute("classid") !== match); + } + } + + return true; + } +}); + +jQuery.fn.extend({ + data: function( key, value ) { + var data = null; + + if ( typeof key === "undefined" ) { + if ( this.length ) { + data = jQuery.data( this[0] ); + + if ( this[0].nodeType === 1 ) { + var attr = this[0].attributes, name; + for ( var i = 0, l = attr.length; i < l; i++ ) { + name = attr[i].name; + + if ( name.indexOf( "data-" ) === 0 ) { + name = name.substr( 5 ); + dataAttr( this[0], name, data[ name ] ); + } + } + } + } + + return data; + + } else if ( typeof key === "object" ) { + return this.each(function() { + jQuery.data( this, key ); + }); + } + + var parts = key.split("."); + parts[1] = parts[1] ? "." + parts[1] : ""; + + if ( value === undefined ) { + data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); + + // Try to fetch any internally stored data first + if ( data === undefined && this.length ) { + data = jQuery.data( this[0], key ); + data = dataAttr( this[0], key, data ); + } + + return data === undefined && parts[1] ? + this.data( parts[0] ) : + data; + + } else { + return this.each(function() { + var $this = jQuery( this ), + args = [ parts[0], value ]; + + $this.triggerHandler( "setData" + parts[1] + "!", args ); + jQuery.data( this, key, value ); + $this.triggerHandler( "changeData" + parts[1] + "!", args ); + }); + } + }, + + removeData: function( key ) { + return this.each(function() { + jQuery.removeData( this, key ); + }); + } +}); + +function dataAttr( elem, key, data ) { + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + data = elem.getAttribute( "data-" + key ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + !jQuery.isNaN( data ) ? parseFloat( data ) : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch( e ) {} + + // Make sure we set the data so it isn't changed later + jQuery.data( elem, key, data ); + + } else { + data = undefined; + } + } + + return data; +} + +// TODO: This is a hack for 1.5 ONLY to allow objects with a single toJSON +// property to be considered empty objects; this property always exists in +// order to make sure JSON.stringify does not expose internal metadata +function isEmptyDataObject( obj ) { + for ( var name in obj ) { + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} + + + + +jQuery.extend({ + queue: function( elem, type, data ) { + if ( !elem ) { + return; + } + + type = (type || "fx") + "queue"; + var q = jQuery._data( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( !data ) { + return q || []; + } + + if ( !q || jQuery.isArray(data) ) { + q = jQuery._data( elem, type, jQuery.makeArray(data) ); + + } else { + q.push( data ); + } + + return q; + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + fn = queue.shift(); + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + } + + if ( fn ) { + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift("inprogress"); + } + + fn.call(elem, function() { + jQuery.dequeue(elem, type); + }); + } + + if ( !queue.length ) { + jQuery.removeData( elem, type + "queue", true ); + } + } +}); + +jQuery.fn.extend({ + queue: function( type, data ) { + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + } + + if ( data === undefined ) { + return jQuery.queue( this[0], type ); + } + return this.each(function( i ) { + var queue = jQuery.queue( this, type, data ); + + if ( type === "fx" && queue[0] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + }); + }, + dequeue: function( type ) { + return this.each(function() { + jQuery.dequeue( this, type ); + }); + }, + + // Based off of the plugin by Clint Helfers, with permission. + // http://blindsignals.com/index.php/2009/07/jquery-delay/ + delay: function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[time] || time : time; + type = type || "fx"; + + return this.queue( type, function() { + var elem = this; + setTimeout(function() { + jQuery.dequeue( elem, type ); + }, time ); + }); + }, + + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + } +}); + + + + +var rclass = /[\n\t\r]/g, + rspaces = /\s+/, + rreturn = /\r/g, + rspecialurl = /^(?:href|src|style)$/, + rtype = /^(?:button|input)$/i, + rfocusable = /^(?:button|input|object|select|textarea)$/i, + rclickable = /^a(?:rea)?$/i, + rradiocheck = /^(?:radio|checkbox)$/i; + +jQuery.props = { + "for": "htmlFor", + "class": "className", + readonly: "readOnly", + maxlength: "maxLength", + cellspacing: "cellSpacing", + rowspan: "rowSpan", + colspan: "colSpan", + tabindex: "tabIndex", + usemap: "useMap", + frameborder: "frameBorder" +}; + +jQuery.fn.extend({ + attr: function( name, value ) { + return jQuery.access( this, name, value, true, jQuery.attr ); + }, + + removeAttr: function( name, fn ) { + return this.each(function(){ + jQuery.attr( this, name, "" ); + if ( this.nodeType === 1 ) { + this.removeAttribute( name ); + } + }); + }, + + addClass: function( value ) { + if ( jQuery.isFunction(value) ) { + return this.each(function(i) { + var self = jQuery(this); + self.addClass( value.call(this, i, self.attr("class")) ); + }); + } + + if ( value && typeof value === "string" ) { + var classNames = (value || "").split( rspaces ); + + for ( var i = 0, l = this.length; i < l; i++ ) { + var elem = this[i]; + + if ( elem.nodeType === 1 ) { + if ( !elem.className ) { + elem.className = value; + + } else { + var className = " " + elem.className + " ", + setClass = elem.className; + + for ( var c = 0, cl = classNames.length; c < cl; c++ ) { + if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) { + setClass += " " + classNames[c]; + } + } + elem.className = jQuery.trim( setClass ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + if ( jQuery.isFunction(value) ) { + return this.each(function(i) { + var self = jQuery(this); + self.removeClass( value.call(this, i, self.attr("class")) ); + }); + } + + if ( (value && typeof value === "string") || value === undefined ) { + var classNames = (value || "").split( rspaces ); + + for ( var i = 0, l = this.length; i < l; i++ ) { + var elem = this[i]; + + if ( elem.nodeType === 1 && elem.className ) { + if ( value ) { + var className = (" " + elem.className + " ").replace(rclass, " "); + for ( var c = 0, cl = classNames.length; c < cl; c++ ) { + className = className.replace(" " + classNames[c] + " ", " "); + } + elem.className = jQuery.trim( className ); + + } else { + elem.className = ""; + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isBool = typeof stateVal === "boolean"; + + if ( jQuery.isFunction( value ) ) { + return this.each(function(i) { + var self = jQuery(this); + self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal ); + }); + } + + return this.each(function() { + if ( type === "string" ) { + // toggle individual class names + var className, + i = 0, + self = jQuery( this ), + state = stateVal, + classNames = value.split( rspaces ); + + while ( (className = classNames[ i++ ]) ) { + // check each className given, space seperated list + state = isBool ? state : !self.hasClass( className ); + self[ state ? "addClass" : "removeClass" ]( className ); + } + + } else if ( type === "undefined" || type === "boolean" ) { + if ( this.className ) { + // store className if set + jQuery._data( this, "__className__", this.className ); + } + + // toggle whole className + this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; + } + }); + }, + + hasClass: function( selector ) { + var className = " " + selector + " "; + for ( var i = 0, l = this.length; i < l; i++ ) { + if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { + return true; + } + } + + return false; + }, + + val: function( value ) { + if ( !arguments.length ) { + var elem = this[0]; + + if ( elem ) { + if ( jQuery.nodeName( elem, "option" ) ) { + // attributes.value is undefined in Blackberry 4.7 but + // uses .value. See #6932 + var val = elem.attributes.value; + return !val || val.specified ? elem.value : elem.text; + } + + // We need to handle select boxes special + if ( jQuery.nodeName( elem, "select" ) ) { + var index = elem.selectedIndex, + values = [], + options = elem.options, + one = elem.type === "select-one"; + + // Nothing was selected + if ( index < 0 ) { + return null; + } + + // Loop through all the selected options + for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { + var option = options[ i ]; + + // Don't return options that are disabled or in a disabled optgroup + if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && + (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) { + + // Get the specific value for the option + value = jQuery(option).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + // Fixes Bug #2551 -- select.val() broken in IE after form.reset() + if ( one && !values.length && options.length ) { + return jQuery( options[ index ] ).val(); + } + + return values; + } + + // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified + if ( rradiocheck.test( elem.type ) && !jQuery.support.checkOn ) { + return elem.getAttribute("value") === null ? "on" : elem.value; + } + + // Everything else, we just grab the value + return (elem.value || "").replace(rreturn, ""); + + } + + return undefined; + } + + var isFunction = jQuery.isFunction(value); + + return this.each(function(i) { + var self = jQuery(this), val = value; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( isFunction ) { + val = value.call(this, i, self.val()); + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + } else if ( typeof val === "number" ) { + val += ""; + } else if ( jQuery.isArray(val) ) { + val = jQuery.map(val, function (value) { + return value == null ? "" : value + ""; + }); + } + + if ( jQuery.isArray(val) && rradiocheck.test( this.type ) ) { + this.checked = jQuery.inArray( self.val(), val ) >= 0; + + } else if ( jQuery.nodeName( this, "select" ) ) { + var values = jQuery.makeArray(val); + + jQuery( "option", this ).each(function() { + this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; + }); + + if ( !values.length ) { + this.selectedIndex = -1; + } + + } else { + this.value = val; + } + }); + } +}); + +jQuery.extend({ + attrFn: { + val: true, + css: true, + html: true, + text: true, + data: true, + width: true, + height: true, + offset: true + }, + + attr: function( elem, name, value, pass ) { + // don't get/set attributes on text, comment and attribute nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || elem.nodeType === 2 ) { + return undefined; + } + + if ( pass && name in jQuery.attrFn ) { + return jQuery(elem)[name](value); + } + + var notxml = elem.nodeType !== 1 || !jQuery.isXMLDoc( elem ), + // Whether we are setting (or getting) + set = value !== undefined; + + // Try to normalize/fix the name + name = notxml && jQuery.props[ name ] || name; + + // Only do all the following if this is a node (faster for style) + if ( elem.nodeType === 1 ) { + // These attributes require special treatment + var special = rspecialurl.test( name ); + + // Safari mis-reports the default selected property of an option + // Accessing the parent's selectedIndex property fixes it + if ( name === "selected" && !jQuery.support.optSelected ) { + var parent = elem.parentNode; + if ( parent ) { + parent.selectedIndex; + + // Make sure that it also works with optgroups, see #5701 + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + } + + // If applicable, access the attribute via the DOM 0 way + // 'in' checks fail in Blackberry 4.7 #6931 + if ( (name in elem || elem[ name ] !== undefined) && notxml && !special ) { + if ( set ) { + // We can't allow the type property to be changed (since it causes problems in IE) + if ( name === "type" && rtype.test( elem.nodeName ) && elem.parentNode ) { + jQuery.error( "type property can't be changed" ); + } + + if ( value === null ) { + if ( elem.nodeType === 1 ) { + elem.removeAttribute( name ); + } + + } else { + elem[ name ] = value; + } + } + + // browsers index elements by id/name on forms, give priority to attributes. + if ( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) ) { + return elem.getAttributeNode( name ).nodeValue; + } + + // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set + // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + if ( name === "tabIndex" ) { + var attributeNode = elem.getAttributeNode( "tabIndex" ); + + return attributeNode && attributeNode.specified ? + attributeNode.value : + rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? + 0 : + undefined; + } + + return elem[ name ]; + } + + if ( !jQuery.support.style && notxml && name === "style" ) { + if ( set ) { + elem.style.cssText = "" + value; + } + + return elem.style.cssText; + } + + if ( set ) { + // convert the value to a string (all browsers do this but IE) see #1070 + elem.setAttribute( name, "" + value ); + } + + // Ensure that missing attributes return undefined + // Blackberry 4.7 returns "" from getAttribute #6938 + if ( !elem.attributes[ name ] && (elem.hasAttribute && !elem.hasAttribute( name )) ) { + return undefined; + } + + var attr = !jQuery.support.hrefNormalized && notxml && special ? + // Some attributes require a special call on IE + elem.getAttribute( name, 2 ) : + elem.getAttribute( name ); + + // Non-existent attributes return null, we normalize to undefined + return attr === null ? undefined : attr; + } + // Handle everything which isn't a DOM element node + if ( set ) { + elem[ name ] = value; + } + return elem[ name ]; + } +}); + + + + +var rnamespaces = /\.(.*)$/, + rformElems = /^(?:textarea|input|select)$/i, + rperiod = /\./g, + rspace = / /g, + rescape = /[^\w\s.|`]/g, + fcleanup = function( nm ) { + return nm.replace(rescape, "\\$&"); + }; + +/* + * A number of helper functions used for managing events. + * Many of the ideas behind this code originated from + * Dean Edwards' addEvent library. + */ +jQuery.event = { + + // Bind an event to an element + // Original by Dean Edwards + add: function( elem, types, handler, data ) { + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // TODO :: Use a try/catch until it's safe to pull this out (likely 1.6) + // Minor release fix for bug #8018 + try { + // For whatever reason, IE has trouble passing the window object + // around, causing it to be cloned in the process + if ( jQuery.isWindow( elem ) && ( elem !== window && !elem.frameElement ) ) { + elem = window; + } + } + catch ( e ) {} + + if ( handler === false ) { + handler = returnFalse; + } else if ( !handler ) { + // Fixes bug #7229. Fix recommended by jdalton + return; + } + + var handleObjIn, handleObj; + + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + } + + // Make sure that the function being executed has a unique ID + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure + var elemData = jQuery._data( elem ); + + // If no elemData is found then we must be trying to bind to one of the + // banned noData elements + if ( !elemData ) { + return; + } + + var events = elemData.events, + eventHandle = elemData.handle; + + if ( !events ) { + elemData.events = events = {}; + } + + if ( !eventHandle ) { + elemData.handle = eventHandle = function() { + // Handle the second event of a trigger and when + // an event is called after a pagebreak has unloaded + return typeof jQuery !== "undefined" && !jQuery.event.triggered ? + jQuery.event.handle.apply( eventHandle.elem, arguments ) : + undefined; + }; + } + + // Add elem as a property of the handle function + // This is to prevent a memory leak with non-native events in IE. + eventHandle.elem = elem; + + // Handle multiple events separated by a space + // jQuery(...).bind("mouseover mouseout", fn); + types = types.split(" "); + + var type, i = 0, namespaces; + + while ( (type = types[ i++ ]) ) { + handleObj = handleObjIn ? + jQuery.extend({}, handleObjIn) : + { handler: handler, data: data }; + + // Namespaced event handlers + if ( type.indexOf(".") > -1 ) { + namespaces = type.split("."); + type = namespaces.shift(); + handleObj.namespace = namespaces.slice(0).sort().join("."); + + } else { + namespaces = []; + handleObj.namespace = ""; + } + + handleObj.type = type; + if ( !handleObj.guid ) { + handleObj.guid = handler.guid; + } + + // Get the current list of functions bound to this event + var handlers = events[ type ], + special = jQuery.event.special[ type ] || {}; + + // Init the event handler queue + if ( !handlers ) { + handlers = events[ type ] = []; + + // Check for a special event handler + // Only use addEventListener/attachEvent if the special + // events handler returns false + if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add the function to the element's handler list + handlers.push( handleObj ); + + // Keep track of which events have been used, for global triggering + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + global: {}, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, pos ) { + // don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + if ( handler === false ) { + handler = returnFalse; + } + + var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType, + elemData = jQuery.hasData( elem ) && jQuery._data( elem ), + events = elemData && elemData.events; + + if ( !elemData || !events ) { + return; + } + + // types is actually an event object here + if ( types && types.type ) { + handler = types.handler; + types = types.type; + } + + // Unbind all events for the element + if ( !types || typeof types === "string" && types.charAt(0) === "." ) { + types = types || ""; + + for ( type in events ) { + jQuery.event.remove( elem, type + types ); + } + + return; + } + + // Handle multiple events separated by a space + // jQuery(...).unbind("mouseover mouseout", fn); + types = types.split(" "); + + while ( (type = types[ i++ ]) ) { + origType = type; + handleObj = null; + all = type.indexOf(".") < 0; + namespaces = []; + + if ( !all ) { + // Namespaced event handlers + namespaces = type.split("."); + type = namespaces.shift(); + + namespace = new RegExp("(^|\\.)" + + jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)"); + } + + eventType = events[ type ]; + + if ( !eventType ) { + continue; + } + + if ( !handler ) { + for ( j = 0; j < eventType.length; j++ ) { + handleObj = eventType[ j ]; + + if ( all || namespace.test( handleObj.namespace ) ) { + jQuery.event.remove( elem, origType, handleObj.handler, j ); + eventType.splice( j--, 1 ); + } + } + + continue; + } + + special = jQuery.event.special[ type ] || {}; + + for ( j = pos || 0; j < eventType.length; j++ ) { + handleObj = eventType[ j ]; + + if ( handler.guid === handleObj.guid ) { + // remove the given handler for the given type + if ( all || namespace.test( handleObj.namespace ) ) { + if ( pos == null ) { + eventType.splice( j--, 1 ); + } + + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + + if ( pos != null ) { + break; + } + } + } + + // remove generic event handler if no more handlers exist + if ( eventType.length === 0 || pos != null && eventType.length === 1 ) { + if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { + jQuery.removeEvent( elem, type, elemData.handle ); + } + + ret = null; + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + var handle = elemData.handle; + if ( handle ) { + handle.elem = null; + } + + delete elemData.events; + delete elemData.handle; + + if ( jQuery.isEmptyObject( elemData ) ) { + jQuery.removeData( elem, undefined, true ); + } + } + }, + + // bubbling is internal + trigger: function( event, data, elem /*, bubbling */ ) { + // Event object or event type + var type = event.type || event, + bubbling = arguments[3]; + + if ( !bubbling ) { + event = typeof event === "object" ? + // jQuery.Event object + event[ jQuery.expando ] ? event : + // Object literal + jQuery.extend( jQuery.Event(type), event ) : + // Just the event type (string) + jQuery.Event(type); + + if ( type.indexOf("!") >= 0 ) { + event.type = type = type.slice(0, -1); + event.exclusive = true; + } + + // Handle a global trigger + if ( !elem ) { + // Don't bubble custom events when global (to avoid too much overhead) + event.stopPropagation(); + + // Only trigger if we've ever bound an event for it + if ( jQuery.event.global[ type ] ) { + // XXX This code smells terrible. event.js should not be directly + // inspecting the data cache + jQuery.each( jQuery.cache, function() { + // internalKey variable is just used to make it easier to find + // and potentially change this stuff later; currently it just + // points to jQuery.expando + var internalKey = jQuery.expando, + internalCache = this[ internalKey ]; + if ( internalCache && internalCache.events && internalCache.events[ type ] ) { + jQuery.event.trigger( event, data, internalCache.handle.elem ); + } + }); + } + } + + // Handle triggering a single element + + // don't do events on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) { + return undefined; + } + + // Clean up in case it is reused + event.result = undefined; + event.target = elem; + + // Clone the incoming data, if any + data = jQuery.makeArray( data ); + data.unshift( event ); + } + + event.currentTarget = elem; + + // Trigger the event, it is assumed that "handle" is a function + var handle = jQuery._data( elem, "handle" ); + + if ( handle ) { + handle.apply( elem, data ); + } + + var parent = elem.parentNode || elem.ownerDocument; + + // Trigger an inline bound script + try { + if ( !(elem && elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]) ) { + if ( elem[ "on" + type ] && elem[ "on" + type ].apply( elem, data ) === false ) { + event.result = false; + event.preventDefault(); + } + } + + // prevent IE from throwing an error for some elements with some event types, see #3533 + } catch (inlineError) {} + + if ( !event.isPropagationStopped() && parent ) { + jQuery.event.trigger( event, data, parent, true ); + + } else if ( !event.isDefaultPrevented() ) { + var old, + target = event.target, + targetType = type.replace( rnamespaces, "" ), + isClick = jQuery.nodeName( target, "a" ) && targetType === "click", + special = jQuery.event.special[ targetType ] || {}; + + if ( (!special._default || special._default.call( elem, event ) === false) && + !isClick && !(target && target.nodeName && jQuery.noData[target.nodeName.toLowerCase()]) ) { + + try { + if ( target[ targetType ] ) { + // Make sure that we don't accidentally re-trigger the onFOO events + old = target[ "on" + targetType ]; + + if ( old ) { + target[ "on" + targetType ] = null; + } + + jQuery.event.triggered = true; + target[ targetType ](); + } + + // prevent IE from throwing an error for some elements with some event types, see #3533 + } catch (triggerError) {} + + if ( old ) { + target[ "on" + targetType ] = old; + } + + jQuery.event.triggered = false; + } + } + }, + + handle: function( event ) { + var all, handlers, namespaces, namespace_re, events, + namespace_sort = [], + args = jQuery.makeArray( arguments ); + + event = args[0] = jQuery.event.fix( event || window.event ); + event.currentTarget = this; + + // Namespaced event handlers + all = event.type.indexOf(".") < 0 && !event.exclusive; + + if ( !all ) { + namespaces = event.type.split("."); + event.type = namespaces.shift(); + namespace_sort = namespaces.slice(0).sort(); + namespace_re = new RegExp("(^|\\.)" + namespace_sort.join("\\.(?:.*\\.)?") + "(\\.|$)"); + } + + event.namespace = event.namespace || namespace_sort.join("."); + + events = jQuery._data(this, "events"); + + handlers = (events || {})[ event.type ]; + + if ( events && handlers ) { + // Clone the handlers to prevent manipulation + handlers = handlers.slice(0); + + for ( var j = 0, l = handlers.length; j < l; j++ ) { + var handleObj = handlers[ j ]; + + // Filter the functions by class + if ( all || namespace_re.test( handleObj.namespace ) ) { + // Pass in a reference to the handler function itself + // So that we can later remove it + event.handler = handleObj.handler; + event.data = handleObj.data; + event.handleObj = handleObj; + + var ret = handleObj.handler.apply( this, args ); + + if ( ret !== undefined ) { + event.result = ret; + if ( ret === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + + if ( event.isImmediatePropagationStopped() ) { + break; + } + } + } + } + + return event.result; + }, + + props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // store a copy of the original event object + // and "clone" to set read-only properties + var originalEvent = event; + event = jQuery.Event( originalEvent ); + + for ( var i = this.props.length, prop; i; ) { + prop = this.props[ --i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Fix target property, if necessary + if ( !event.target ) { + // Fixes #1925 where srcElement might not be defined either + event.target = event.srcElement || document; + } + + // check if target is a textnode (safari) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && event.fromElement ) { + event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement; + } + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && event.clientX != null ) { + var doc = document.documentElement, + body = document.body; + + event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0); + event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0); + } + + // Add which for key events + if ( event.which == null && (event.charCode != null || event.keyCode != null) ) { + event.which = event.charCode != null ? event.charCode : event.keyCode; + } + + // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs) + if ( !event.metaKey && event.ctrlKey ) { + event.metaKey = event.ctrlKey; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && event.button !== undefined ) { + event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) )); + } + + return event; + }, + + // Deprecated, use jQuery.guid instead + guid: 1E8, + + // Deprecated, use jQuery.proxy instead + proxy: jQuery.proxy, + + special: { + ready: { + // Make sure the ready event is setup + setup: jQuery.bindReady, + teardown: jQuery.noop + }, + + live: { + add: function( handleObj ) { + jQuery.event.add( this, + liveConvert( handleObj.origType, handleObj.selector ), + jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) ); + }, + + remove: function( handleObj ) { + jQuery.event.remove( this, liveConvert( handleObj.origType, handleObj.selector ), handleObj ); + } + }, + + beforeunload: { + setup: function( data, namespaces, eventHandle ) { + // We only want to do this special case on windows + if ( jQuery.isWindow( this ) ) { + this.onbeforeunload = eventHandle; + } + }, + + teardown: function( namespaces, eventHandle ) { + if ( this.onbeforeunload === eventHandle ) { + this.onbeforeunload = null; + } + } + } + } +}; + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle, false ); + } + } : + function( elem, type, handle ) { + if ( elem.detachEvent ) { + elem.detachEvent( "on" + type, handle ); + } + }; + +jQuery.Event = function( src ) { + // Allow instantiation without the 'new' keyword + if ( !this.preventDefault ) { + return new jQuery.Event( src ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false || + src.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse; + + // Event type + } else { + this.type = src; + } + + // timeStamp is buggy for some events on Firefox(#3843) + // So we won't rely on the native value + this.timeStamp = jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +function returnFalse() { + return false; +} +function returnTrue() { + return true; +} + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + preventDefault: function() { + this.isDefaultPrevented = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + + // if preventDefault exists run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // otherwise set the returnValue property of the original event to false (IE) + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + this.isPropagationStopped = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + // if stopPropagation exists run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + // otherwise set the cancelBubble property of the original event to true (IE) + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + this.isImmediatePropagationStopped = returnTrue; + this.stopPropagation(); + }, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse +}; + +// Checks if an event happened on an element within another element +// Used in jQuery.event.special.mouseenter and mouseleave handlers +var withinElement = function( event ) { + // Check if mouse(over|out) are still within the same parent element + var parent = event.relatedTarget; + + // Firefox sometimes assigns relatedTarget a XUL element + // which we cannot access the parentNode property of + try { + + // Chrome does something similar, the parentNode property + // can be accessed but is null. + if ( parent !== document && !parent.parentNode ) { + return; + } + // Traverse up the tree + while ( parent && parent !== this ) { + parent = parent.parentNode; + } + + if ( parent !== this ) { + // set the correct event type + event.type = event.data; + + // handle event if we actually just moused on to a non sub-element + jQuery.event.handle.apply( this, arguments ); + } + + // assuming we've left the element since we most likely mousedover a xul element + } catch(e) { } +}, + +// In case of event delegation, we only need to rename the event.type, +// liveHandler will take care of the rest. +delegate = function( event ) { + event.type = event.data; + jQuery.event.handle.apply( this, arguments ); +}; + +// Create mouseenter and mouseleave events +jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + setup: function( data ) { + jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig ); + }, + teardown: function( data ) { + jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement ); + } + }; +}); + +// submit delegation +if ( !jQuery.support.submitBubbles ) { + + jQuery.event.special.submit = { + setup: function( data, namespaces ) { + if ( this.nodeName && this.nodeName.toLowerCase() !== "form" ) { + jQuery.event.add(this, "click.specialSubmit", function( e ) { + var elem = e.target, + type = elem.type; + + if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) { + trigger( "submit", this, arguments ); + } + }); + + jQuery.event.add(this, "keypress.specialSubmit", function( e ) { + var elem = e.target, + type = elem.type; + + if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) { + trigger( "submit", this, arguments ); + } + }); + + } else { + return false; + } + }, + + teardown: function( namespaces ) { + jQuery.event.remove( this, ".specialSubmit" ); + } + }; + +} + +// change delegation, happens here so we have bind. +if ( !jQuery.support.changeBubbles ) { + + var changeFilters, + + getVal = function( elem ) { + var type = elem.type, val = elem.value; + + if ( type === "radio" || type === "checkbox" ) { + val = elem.checked; + + } else if ( type === "select-multiple" ) { + val = elem.selectedIndex > -1 ? + jQuery.map( elem.options, function( elem ) { + return elem.selected; + }).join("-") : + ""; + + } else if ( elem.nodeName.toLowerCase() === "select" ) { + val = elem.selectedIndex; + } + + return val; + }, + + testChange = function testChange( e ) { + var elem = e.target, data, val; + + if ( !rformElems.test( elem.nodeName ) || elem.readOnly ) { + return; + } + + data = jQuery._data( elem, "_change_data" ); + val = getVal(elem); + + // the current data will be also retrieved by beforeactivate + if ( e.type !== "focusout" || elem.type !== "radio" ) { + jQuery._data( elem, "_change_data", val ); + } + + if ( data === undefined || val === data ) { + return; + } + + if ( data != null || val ) { + e.type = "change"; + e.liveFired = undefined; + jQuery.event.trigger( e, arguments[1], elem ); + } + }; + + jQuery.event.special.change = { + filters: { + focusout: testChange, + + beforedeactivate: testChange, + + click: function( e ) { + var elem = e.target, type = elem.type; + + if ( type === "radio" || type === "checkbox" || elem.nodeName.toLowerCase() === "select" ) { + testChange.call( this, e ); + } + }, + + // Change has to be called before submit + // Keydown will be called before keypress, which is used in submit-event delegation + keydown: function( e ) { + var elem = e.target, type = elem.type; + + if ( (e.keyCode === 13 && elem.nodeName.toLowerCase() !== "textarea") || + (e.keyCode === 32 && (type === "checkbox" || type === "radio")) || + type === "select-multiple" ) { + testChange.call( this, e ); + } + }, + + // Beforeactivate happens also before the previous element is blurred + // with this event you can't trigger a change event, but you can store + // information + beforeactivate: function( e ) { + var elem = e.target; + jQuery._data( elem, "_change_data", getVal(elem) ); + } + }, + + setup: function( data, namespaces ) { + if ( this.type === "file" ) { + return false; + } + + for ( var type in changeFilters ) { + jQuery.event.add( this, type + ".specialChange", changeFilters[type] ); + } + + return rformElems.test( this.nodeName ); + }, + + teardown: function( namespaces ) { + jQuery.event.remove( this, ".specialChange" ); + + return rformElems.test( this.nodeName ); + } + }; + + changeFilters = jQuery.event.special.change.filters; + + // Handle when the input is .focus()'d + changeFilters.focus = changeFilters.beforeactivate; +} + +function trigger( type, elem, args ) { + // Piggyback on a donor event to simulate a different one. + // Fake originalEvent to avoid donor's stopPropagation, but if the + // simulated event prevents default then we do the same on the donor. + // Don't pass args or remember liveFired; they apply to the donor event. + var event = jQuery.extend( {}, args[ 0 ] ); + event.type = type; + event.originalEvent = {}; + event.liveFired = undefined; + jQuery.event.handle.call( elem, event ); + if ( event.isDefaultPrevented() ) { + args[ 0 ].preventDefault(); + } +} + +// Create "bubbling" focus and blur events +if ( document.addEventListener ) { + jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + jQuery.event.special[ fix ] = { + setup: function() { + this.addEventListener( orig, handler, true ); + }, + teardown: function() { + this.removeEventListener( orig, handler, true ); + } + }; + + function handler( e ) { + e = jQuery.event.fix( e ); + e.type = fix; + return jQuery.event.handle.call( this, e ); + } + }); +} + +jQuery.each(["bind", "one"], function( i, name ) { + jQuery.fn[ name ] = function( type, data, fn ) { + // Handle object literals + if ( typeof type === "object" ) { + for ( var key in type ) { + this[ name ](key, data, type[key], fn); + } + return this; + } + + if ( jQuery.isFunction( data ) || data === false ) { + fn = data; + data = undefined; + } + + var handler = name === "one" ? jQuery.proxy( fn, function( event ) { + jQuery( this ).unbind( event, handler ); + return fn.apply( this, arguments ); + }) : fn; + + if ( type === "unload" && name !== "one" ) { + this.one( type, data, fn ); + + } else { + for ( var i = 0, l = this.length; i < l; i++ ) { + jQuery.event.add( this[i], type, handler, data ); + } + } + + return this; + }; +}); + +jQuery.fn.extend({ + unbind: function( type, fn ) { + // Handle object literals + if ( typeof type === "object" && !type.preventDefault ) { + for ( var key in type ) { + this.unbind(key, type[key]); + } + + } else { + for ( var i = 0, l = this.length; i < l; i++ ) { + jQuery.event.remove( this[i], type, fn ); + } + } + + return this; + }, + + delegate: function( selector, types, data, fn ) { + return this.live( types, data, fn, selector ); + }, + + undelegate: function( selector, types, fn ) { + if ( arguments.length === 0 ) { + return this.unbind( "live" ); + + } else { + return this.die( types, null, fn, selector ); + } + }, + + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); + }); + }, + + triggerHandler: function( type, data ) { + if ( this[0] ) { + var event = jQuery.Event( type ); + event.preventDefault(); + event.stopPropagation(); + jQuery.event.trigger( event, data, this[0] ); + return event.result; + } + }, + + toggle: function( fn ) { + // Save reference to arguments for access in closure + var args = arguments, + i = 1; + + // link all the functions, so any of them can unbind this click handler + while ( i < args.length ) { + jQuery.proxy( fn, args[ i++ ] ); + } + + return this.click( jQuery.proxy( fn, function( event ) { + // Figure out which function to execute + var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i; + jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 ); + + // Make sure that clicks stop + event.preventDefault(); + + // and execute the function + return args[ lastToggle ].apply( this, arguments ) || false; + })); + }, + + hover: function( fnOver, fnOut ) { + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + } +}); + +var liveMap = { + focus: "focusin", + blur: "focusout", + mouseenter: "mouseover", + mouseleave: "mouseout" +}; + +jQuery.each(["live", "die"], function( i, name ) { + jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) { + var type, i = 0, match, namespaces, preType, + selector = origSelector || this.selector, + context = origSelector ? this : jQuery( this.context ); + + if ( typeof types === "object" && !types.preventDefault ) { + for ( var key in types ) { + context[ name ]( key, data, types[key], selector ); + } + + return this; + } + + if ( jQuery.isFunction( data ) ) { + fn = data; + data = undefined; + } + + types = (types || "").split(" "); + + while ( (type = types[ i++ ]) != null ) { + match = rnamespaces.exec( type ); + namespaces = ""; + + if ( match ) { + namespaces = match[0]; + type = type.replace( rnamespaces, "" ); + } + + if ( type === "hover" ) { + types.push( "mouseenter" + namespaces, "mouseleave" + namespaces ); + continue; + } + + preType = type; + + if ( type === "focus" || type === "blur" ) { + types.push( liveMap[ type ] + namespaces ); + type = type + namespaces; + + } else { + type = (liveMap[ type ] || type) + namespaces; + } + + if ( name === "live" ) { + // bind live handler + for ( var j = 0, l = context.length; j < l; j++ ) { + jQuery.event.add( context[j], "live." + liveConvert( type, selector ), + { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } ); + } + + } else { + // unbind live handler + context.unbind( "live." + liveConvert( type, selector ), fn ); + } + } + + return this; + }; +}); + +function liveHandler( event ) { + var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret, + elems = [], + selectors = [], + events = jQuery._data( this, "events" ); + + // Make sure we avoid non-left-click bubbling in Firefox (#3861) and disabled elements in IE (#6911) + if ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click" ) { + return; + } + + if ( event.namespace ) { + namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)"); + } + + event.liveFired = this; + + var live = events.live.slice(0); + + for ( j = 0; j < live.length; j++ ) { + handleObj = live[j]; + + if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) { + selectors.push( handleObj.selector ); + + } else { + live.splice( j--, 1 ); + } + } + + match = jQuery( event.target ).closest( selectors, event.currentTarget ); + + for ( i = 0, l = match.length; i < l; i++ ) { + close = match[i]; + + for ( j = 0; j < live.length; j++ ) { + handleObj = live[j]; + + if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) && !close.elem.disabled ) { + elem = close.elem; + related = null; + + // Those two events require additional checking + if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) { + event.type = handleObj.preType; + related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0]; + } + + if ( !related || related !== elem ) { + elems.push({ elem: elem, handleObj: handleObj, level: close.level }); + } + } + } + } + + for ( i = 0, l = elems.length; i < l; i++ ) { + match = elems[i]; + + if ( maxLevel && match.level > maxLevel ) { + break; + } + + event.currentTarget = match.elem; + event.data = match.handleObj.data; + event.handleObj = match.handleObj; + + ret = match.handleObj.origHandler.apply( match.elem, arguments ); + + if ( ret === false || event.isPropagationStopped() ) { + maxLevel = match.level; + + if ( ret === false ) { + stop = false; + } + if ( event.isImmediatePropagationStopped() ) { + break; + } + } + } + + return stop; +} + +function liveConvert( type, selector ) { + return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspace, "&"); +} + +jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + + "change select submit keydown keypress keyup error").split(" "), function( i, name ) { + + // Handle event binding + jQuery.fn[ name ] = function( data, fn ) { + if ( fn == null ) { + fn = data; + data = null; + } + + return arguments.length > 0 ? + this.bind( name, data, fn ) : + this.trigger( name ); + }; + + if ( jQuery.attrFn ) { + jQuery.attrFn[ name ] = true; + } +}); + + +/*! + * Sizzle CSS Selector Engine + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){ + +var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, + done = 0, + toString = Object.prototype.toString, + hasDuplicate = false, + baseHasDuplicate = true, + rBackslash = /\\/g, + rNonWord = /\W/; + +// Here we check if the JavaScript engine is using some sort of +// optimization where it does not always call our comparision +// function. If that is the case, discard the hasDuplicate value. +// Thus far that includes Google Chrome. +[0, 0].sort(function() { + baseHasDuplicate = false; + return 0; +}); + +var Sizzle = function( selector, context, results, seed ) { + results = results || []; + context = context || document; + + var origContext = context; + + if ( context.nodeType !== 1 && context.nodeType !== 9 ) { + return []; + } + + if ( !selector || typeof selector !== "string" ) { + return results; + } + + var m, set, checkSet, extra, ret, cur, pop, i, + prune = true, + contextXML = Sizzle.isXML( context ), + parts = [], + soFar = selector; + + // Reset the position of the chunker regexp (start from head) + do { + chunker.exec( "" ); + m = chunker.exec( soFar ); + + if ( m ) { + soFar = m[3]; + + parts.push( m[1] ); + + if ( m[2] ) { + extra = m[3]; + break; + } + } + } while ( m ); + + if ( parts.length > 1 && origPOS.exec( selector ) ) { + + if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { + set = posProcess( parts[0] + parts[1], context ); + + } else { + set = Expr.relative[ parts[0] ] ? + [ context ] : + Sizzle( parts.shift(), context ); + + while ( parts.length ) { + selector = parts.shift(); + + if ( Expr.relative[ selector ] ) { + selector += parts.shift(); + } + + set = posProcess( selector, set ); + } + } + + } else { + // Take a shortcut and set the context if the root selector is an ID + // (but not if it'll be faster if the inner selector is an ID) + if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && + Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { + + ret = Sizzle.find( parts.shift(), context, contextXML ); + context = ret.expr ? + Sizzle.filter( ret.expr, ret.set )[0] : + ret.set[0]; + } + + if ( context ) { + ret = seed ? + { expr: parts.pop(), set: makeArray(seed) } : + Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); + + set = ret.expr ? + Sizzle.filter( ret.expr, ret.set ) : + ret.set; + + if ( parts.length > 0 ) { + checkSet = makeArray( set ); + + } else { + prune = false; + } + + while ( parts.length ) { + cur = parts.pop(); + pop = cur; + + if ( !Expr.relative[ cur ] ) { + cur = ""; + } else { + pop = parts.pop(); + } + + if ( pop == null ) { + pop = context; + } + + Expr.relative[ cur ]( checkSet, pop, contextXML ); + } + + } else { + checkSet = parts = []; + } + } + + if ( !checkSet ) { + checkSet = set; + } + + if ( !checkSet ) { + Sizzle.error( cur || selector ); + } + + if ( toString.call(checkSet) === "[object Array]" ) { + if ( !prune ) { + results.push.apply( results, checkSet ); + + } else if ( context && context.nodeType === 1 ) { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { + results.push( set[i] ); + } + } + + } else { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && checkSet[i].nodeType === 1 ) { + results.push( set[i] ); + } + } + } + + } else { + makeArray( checkSet, results ); + } + + if ( extra ) { + Sizzle( extra, origContext, results, seed ); + Sizzle.uniqueSort( results ); + } + + return results; +}; + +Sizzle.uniqueSort = function( results ) { + if ( sortOrder ) { + hasDuplicate = baseHasDuplicate; + results.sort( sortOrder ); + + if ( hasDuplicate ) { + for ( var i = 1; i < results.length; i++ ) { + if ( results[i] === results[ i - 1 ] ) { + results.splice( i--, 1 ); + } + } + } + } + + return results; +}; + +Sizzle.matches = function( expr, set ) { + return Sizzle( expr, null, null, set ); +}; + +Sizzle.matchesSelector = function( node, expr ) { + return Sizzle( expr, null, null, [node] ).length > 0; +}; + +Sizzle.find = function( expr, context, isXML ) { + var set; + + if ( !expr ) { + return []; + } + + for ( var i = 0, l = Expr.order.length; i < l; i++ ) { + var match, + type = Expr.order[i]; + + if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { + var left = match[1]; + match.splice( 1, 1 ); + + if ( left.substr( left.length - 1 ) !== "\\" ) { + match[1] = (match[1] || "").replace( rBackslash, "" ); + set = Expr.find[ type ]( match, context, isXML ); + + if ( set != null ) { + expr = expr.replace( Expr.match[ type ], "" ); + break; + } + } + } + } + + if ( !set ) { + set = typeof context.getElementsByTagName !== "undefined" ? + context.getElementsByTagName( "*" ) : + []; + } + + return { set: set, expr: expr }; +}; + +Sizzle.filter = function( expr, set, inplace, not ) { + var match, anyFound, + old = expr, + result = [], + curLoop = set, + isXMLFilter = set && set[0] && Sizzle.isXML( set[0] ); + + while ( expr && set.length ) { + for ( var type in Expr.filter ) { + if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { + var found, item, + filter = Expr.filter[ type ], + left = match[1]; + + anyFound = false; + + match.splice(1,1); + + if ( left.substr( left.length - 1 ) === "\\" ) { + continue; + } + + if ( curLoop === result ) { + result = []; + } + + if ( Expr.preFilter[ type ] ) { + match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); + + if ( !match ) { + anyFound = found = true; + + } else if ( match === true ) { + continue; + } + } + + if ( match ) { + for ( var i = 0; (item = curLoop[i]) != null; i++ ) { + if ( item ) { + found = filter( item, match, i, curLoop ); + var pass = not ^ !!found; + + if ( inplace && found != null ) { + if ( pass ) { + anyFound = true; + + } else { + curLoop[i] = false; + } + + } else if ( pass ) { + result.push( item ); + anyFound = true; + } + } + } + } + + if ( found !== undefined ) { + if ( !inplace ) { + curLoop = result; + } + + expr = expr.replace( Expr.match[ type ], "" ); + + if ( !anyFound ) { + return []; + } + + break; + } + } + } + + // Improper expression + if ( expr === old ) { + if ( anyFound == null ) { + Sizzle.error( expr ); + + } else { + break; + } + } + + old = expr; + } + + return curLoop; +}; + +Sizzle.error = function( msg ) { + throw "Syntax error, unrecognized expression: " + msg; +}; + +var Expr = Sizzle.selectors = { + order: [ "ID", "NAME", "TAG" ], + + match: { + ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, + ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, + TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, + CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, + POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, + PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ + }, + + leftMatch: {}, + + attrMap: { + "class": "className", + "for": "htmlFor" + }, + + attrHandle: { + href: function( elem ) { + return elem.getAttribute( "href" ); + }, + type: function( elem ) { + return elem.getAttribute( "type" ); + } + }, + + relative: { + "+": function(checkSet, part){ + var isPartStr = typeof part === "string", + isTag = isPartStr && !rNonWord.test( part ), + isPartStrNotTag = isPartStr && !isTag; + + if ( isTag ) { + part = part.toLowerCase(); + } + + for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { + if ( (elem = checkSet[i]) ) { + while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} + + checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? + elem || false : + elem === part; + } + } + + if ( isPartStrNotTag ) { + Sizzle.filter( part, checkSet, true ); + } + }, + + ">": function( checkSet, part ) { + var elem, + isPartStr = typeof part === "string", + i = 0, + l = checkSet.length; + + if ( isPartStr && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + + for ( ; i < l; i++ ) { + elem = checkSet[i]; + + if ( elem ) { + var parent = elem.parentNode; + checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; + } + } + + } else { + for ( ; i < l; i++ ) { + elem = checkSet[i]; + + if ( elem ) { + checkSet[i] = isPartStr ? + elem.parentNode : + elem.parentNode === part; + } + } + + if ( isPartStr ) { + Sizzle.filter( part, checkSet, true ); + } + } + }, + + "": function(checkSet, part, isXML){ + var nodeCheck, + doneName = done++, + checkFn = dirCheck; + + if ( typeof part === "string" && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML ); + }, + + "~": function( checkSet, part, isXML ) { + var nodeCheck, + doneName = done++, + checkFn = dirCheck; + + if ( typeof part === "string" && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML ); + } + }, + + find: { + ID: function( match, context, isXML ) { + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + return m && m.parentNode ? [m] : []; + } + }, + + NAME: function( match, context ) { + if ( typeof context.getElementsByName !== "undefined" ) { + var ret = [], + results = context.getElementsByName( match[1] ); + + for ( var i = 0, l = results.length; i < l; i++ ) { + if ( results[i].getAttribute("name") === match[1] ) { + ret.push( results[i] ); + } + } + + return ret.length === 0 ? null : ret; + } + }, + + TAG: function( match, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( match[1] ); + } + } + }, + preFilter: { + CLASS: function( match, curLoop, inplace, result, not, isXML ) { + match = " " + match[1].replace( rBackslash, "" ) + " "; + + if ( isXML ) { + return match; + } + + for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { + if ( elem ) { + if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) { + if ( !inplace ) { + result.push( elem ); + } + + } else if ( inplace ) { + curLoop[i] = false; + } + } + } + + return false; + }, + + ID: function( match ) { + return match[1].replace( rBackslash, "" ); + }, + + TAG: function( match, curLoop ) { + return match[1].replace( rBackslash, "" ).toLowerCase(); + }, + + CHILD: function( match ) { + if ( match[1] === "nth" ) { + if ( !match[2] ) { + Sizzle.error( match[0] ); + } + + match[2] = match[2].replace(/^\+|\s*/g, ''); + + // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' + var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( + match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || + !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); + + // calculate the numbers (first)n+(last) including if they are negative + match[2] = (test[1] + (test[2] || 1)) - 0; + match[3] = test[3] - 0; + } + else if ( match[2] ) { + Sizzle.error( match[0] ); + } + + // TODO: Move to normal caching system + match[0] = done++; + + return match; + }, + + ATTR: function( match, curLoop, inplace, result, not, isXML ) { + var name = match[1] = match[1].replace( rBackslash, "" ); + + if ( !isXML && Expr.attrMap[name] ) { + match[1] = Expr.attrMap[name]; + } + + // Handle if an un-quoted value was used + match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" ); + + if ( match[2] === "~=" ) { + match[4] = " " + match[4] + " "; + } + + return match; + }, + + PSEUDO: function( match, curLoop, inplace, result, not ) { + if ( match[1] === "not" ) { + // If we're dealing with a complex expression, or a simple one + if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { + match[3] = Sizzle(match[3], null, null, curLoop); + + } else { + var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); + + if ( !inplace ) { + result.push.apply( result, ret ); + } + + return false; + } + + } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { + return true; + } + + return match; + }, + + POS: function( match ) { + match.unshift( true ); + + return match; + } + }, + + filters: { + enabled: function( elem ) { + return elem.disabled === false && elem.type !== "hidden"; + }, + + disabled: function( elem ) { + return elem.disabled === true; + }, + + checked: function( elem ) { + return elem.checked === true; + }, + + selected: function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + parent: function( elem ) { + return !!elem.firstChild; + }, + + empty: function( elem ) { + return !elem.firstChild; + }, + + has: function( elem, i, match ) { + return !!Sizzle( match[3], elem ).length; + }, + + header: function( elem ) { + return (/h\d/i).test( elem.nodeName ); + }, + + text: function( elem ) { + // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) + // use getAttribute instead to test this case + return "text" === elem.getAttribute( 'type' ); + }, + radio: function( elem ) { + return "radio" === elem.type; + }, + + checkbox: function( elem ) { + return "checkbox" === elem.type; + }, + + file: function( elem ) { + return "file" === elem.type; + }, + password: function( elem ) { + return "password" === elem.type; + }, + + submit: function( elem ) { + return "submit" === elem.type; + }, + + image: function( elem ) { + return "image" === elem.type; + }, + + reset: function( elem ) { + return "reset" === elem.type; + }, + + button: function( elem ) { + return "button" === elem.type || elem.nodeName.toLowerCase() === "button"; + }, + + input: function( elem ) { + return (/input|select|textarea|button/i).test( elem.nodeName ); + } + }, + setFilters: { + first: function( elem, i ) { + return i === 0; + }, + + last: function( elem, i, match, array ) { + return i === array.length - 1; + }, + + even: function( elem, i ) { + return i % 2 === 0; + }, + + odd: function( elem, i ) { + return i % 2 === 1; + }, + + lt: function( elem, i, match ) { + return i < match[3] - 0; + }, + + gt: function( elem, i, match ) { + return i > match[3] - 0; + }, + + nth: function( elem, i, match ) { + return match[3] - 0 === i; + }, + + eq: function( elem, i, match ) { + return match[3] - 0 === i; + } + }, + filter: { + PSEUDO: function( elem, match, i, array ) { + var name = match[1], + filter = Expr.filters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + + } else if ( name === "contains" ) { + return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0; + + } else if ( name === "not" ) { + var not = match[3]; + + for ( var j = 0, l = not.length; j < l; j++ ) { + if ( not[j] === elem ) { + return false; + } + } + + return true; + + } else { + Sizzle.error( name ); + } + }, + + CHILD: function( elem, match ) { + var type = match[1], + node = elem; + + switch ( type ) { + case "only": + case "first": + while ( (node = node.previousSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + if ( type === "first" ) { + return true; + } + + node = elem; + + case "last": + while ( (node = node.nextSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + return true; + + case "nth": + var first = match[2], + last = match[3]; + + if ( first === 1 && last === 0 ) { + return true; + } + + var doneName = match[0], + parent = elem.parentNode; + + if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) { + var count = 0; + + for ( node = parent.firstChild; node; node = node.nextSibling ) { + if ( node.nodeType === 1 ) { + node.nodeIndex = ++count; + } + } + + parent.sizcache = doneName; + } + + var diff = elem.nodeIndex - last; + + if ( first === 0 ) { + return diff === 0; + + } else { + return ( diff % first === 0 && diff / first >= 0 ); + } + } + }, + + ID: function( elem, match ) { + return elem.nodeType === 1 && elem.getAttribute("id") === match; + }, + + TAG: function( elem, match ) { + return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match; + }, + + CLASS: function( elem, match ) { + return (" " + (elem.className || elem.getAttribute("class")) + " ") + .indexOf( match ) > -1; + }, + + ATTR: function( elem, match ) { + var name = match[1], + result = Expr.attrHandle[ name ] ? + Expr.attrHandle[ name ]( elem ) : + elem[ name ] != null ? + elem[ name ] : + elem.getAttribute( name ), + value = result + "", + type = match[2], + check = match[4]; + + return result == null ? + type === "!=" : + type === "=" ? + value === check : + type === "*=" ? + value.indexOf(check) >= 0 : + type === "~=" ? + (" " + value + " ").indexOf(check) >= 0 : + !check ? + value && result !== false : + type === "!=" ? + value !== check : + type === "^=" ? + value.indexOf(check) === 0 : + type === "$=" ? + value.substr(value.length - check.length) === check : + type === "|=" ? + value === check || value.substr(0, check.length + 1) === check + "-" : + false; + }, + + POS: function( elem, match, i, array ) { + var name = match[2], + filter = Expr.setFilters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + } + } + } +}; + +var origPOS = Expr.match.POS, + fescape = function(all, num){ + return "\\" + (num - 0 + 1); + }; + +for ( var type in Expr.match ) { + Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); + Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); +} + +var makeArray = function( array, results ) { + array = Array.prototype.slice.call( array, 0 ); + + if ( results ) { + results.push.apply( results, array ); + return results; + } + + return array; +}; + +// Perform a simple check to determine if the browser is capable of +// converting a NodeList to an array using builtin methods. +// Also verifies that the returned array holds DOM nodes +// (which is not the case in the Blackberry browser) +try { + Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; + +// Provide a fallback method if it does not work +} catch( e ) { + makeArray = function( array, results ) { + var i = 0, + ret = results || []; + + if ( toString.call(array) === "[object Array]" ) { + Array.prototype.push.apply( ret, array ); + + } else { + if ( typeof array.length === "number" ) { + for ( var l = array.length; i < l; i++ ) { + ret.push( array[i] ); + } + + } else { + for ( ; array[i]; i++ ) { + ret.push( array[i] ); + } + } + } + + return ret; + }; +} + +var sortOrder, siblingCheck; + +if ( document.documentElement.compareDocumentPosition ) { + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { + return a.compareDocumentPosition ? -1 : 1; + } + + return a.compareDocumentPosition(b) & 4 ? -1 : 1; + }; + +} else { + sortOrder = function( a, b ) { + var al, bl, + ap = [], + bp = [], + aup = a.parentNode, + bup = b.parentNode, + cur = aup; + + // The nodes are identical, we can exit early + if ( a === b ) { + hasDuplicate = true; + return 0; + + // If the nodes are siblings (or identical) we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + + // If no parents were found then the nodes are disconnected + } else if ( !aup ) { + return -1; + + } else if ( !bup ) { + return 1; + } + + // Otherwise they're somewhere else in the tree so we need + // to build up a full list of the parentNodes for comparison + while ( cur ) { + ap.unshift( cur ); + cur = cur.parentNode; + } + + cur = bup; + + while ( cur ) { + bp.unshift( cur ); + cur = cur.parentNode; + } + + al = ap.length; + bl = bp.length; + + // Start walking down the tree looking for a discrepancy + for ( var i = 0; i < al && i < bl; i++ ) { + if ( ap[i] !== bp[i] ) { + return siblingCheck( ap[i], bp[i] ); + } + } + + // We ended someplace up the tree so do a sibling check + return i === al ? + siblingCheck( a, bp[i], -1 ) : + siblingCheck( ap[i], b, 1 ); + }; + + siblingCheck = function( a, b, ret ) { + if ( a === b ) { + return ret; + } + + var cur = a.nextSibling; + + while ( cur ) { + if ( cur === b ) { + return -1; + } + + cur = cur.nextSibling; + } + + return 1; + }; +} + +// Utility function for retreiving the text value of an array of DOM nodes +Sizzle.getText = function( elems ) { + var ret = "", elem; + + for ( var i = 0; elems[i]; i++ ) { + elem = elems[i]; + + // Get the text from text nodes and CDATA nodes + if ( elem.nodeType === 3 || elem.nodeType === 4 ) { + ret += elem.nodeValue; + + // Traverse everything else, except comment nodes + } else if ( elem.nodeType !== 8 ) { + ret += Sizzle.getText( elem.childNodes ); + } + } + + return ret; +}; + +// Check to see if the browser returns elements by name when +// querying by getElementById (and provide a workaround) +(function(){ + // We're going to inject a fake input element with a specified name + var form = document.createElement("div"), + id = "script" + (new Date()).getTime(), + root = document.documentElement; + + form.innerHTML = ""; + + // Inject it into the root element, check its status, and remove it quickly + root.insertBefore( form, root.firstChild ); + + // The workaround has to do additional checks after a getElementById + // Which slows things down for other browsers (hence the branching) + if ( document.getElementById( id ) ) { + Expr.find.ID = function( match, context, isXML ) { + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + + return m ? + m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? + [m] : + undefined : + []; + } + }; + + Expr.filter.ID = function( elem, match ) { + var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); + + return elem.nodeType === 1 && node && node.nodeValue === match; + }; + } + + root.removeChild( form ); + + // release memory in IE + root = form = null; +})(); + +(function(){ + // Check to see if the browser returns only elements + // when doing getElementsByTagName("*") + + // Create a fake element + var div = document.createElement("div"); + div.appendChild( document.createComment("") ); + + // Make sure no comments are found + if ( div.getElementsByTagName("*").length > 0 ) { + Expr.find.TAG = function( match, context ) { + var results = context.getElementsByTagName( match[1] ); + + // Filter out possible comments + if ( match[1] === "*" ) { + var tmp = []; + + for ( var i = 0; results[i]; i++ ) { + if ( results[i].nodeType === 1 ) { + tmp.push( results[i] ); + } + } + + results = tmp; + } + + return results; + }; + } + + // Check to see if an attribute returns normalized href attributes + div.innerHTML = ""; + + if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && + div.firstChild.getAttribute("href") !== "#" ) { + + Expr.attrHandle.href = function( elem ) { + return elem.getAttribute( "href", 2 ); + }; + } + + // release memory in IE + div = null; +})(); + +if ( document.querySelectorAll ) { + (function(){ + var oldSizzle = Sizzle, + div = document.createElement("div"), + id = "__sizzle__"; + + div.innerHTML = "

    "; + + // Safari can't handle uppercase or unicode characters when + // in quirks mode. + if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { + return; + } + + Sizzle = function( query, context, extra, seed ) { + context = context || document; + + // Only use querySelectorAll on non-XML documents + // (ID selectors don't work in non-HTML documents) + if ( !seed && !Sizzle.isXML(context) ) { + // See if we find a selector to speed up + var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query ); + + if ( match && (context.nodeType === 1 || context.nodeType === 9) ) { + // Speed-up: Sizzle("TAG") + if ( match[1] ) { + return makeArray( context.getElementsByTagName( query ), extra ); + + // Speed-up: Sizzle(".CLASS") + } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) { + return makeArray( context.getElementsByClassName( match[2] ), extra ); + } + } + + if ( context.nodeType === 9 ) { + // Speed-up: Sizzle("body") + // The body element only exists once, optimize finding it + if ( query === "body" && context.body ) { + return makeArray( [ context.body ], extra ); + + // Speed-up: Sizzle("#ID") + } else if ( match && match[3] ) { + var elem = context.getElementById( match[3] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id === match[3] ) { + return makeArray( [ elem ], extra ); + } + + } else { + return makeArray( [], extra ); + } + } + + try { + return makeArray( context.querySelectorAll(query), extra ); + } catch(qsaError) {} + + // qSA works strangely on Element-rooted queries + // We can work around this by specifying an extra ID on the root + // and working up from there (Thanks to Andrew Dupont for the technique) + // IE 8 doesn't work on object elements + } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { + var oldContext = context, + old = context.getAttribute( "id" ), + nid = old || id, + hasParent = context.parentNode, + relativeHierarchySelector = /^\s*[+~]/.test( query ); + + if ( !old ) { + context.setAttribute( "id", nid ); + } else { + nid = nid.replace( /'/g, "\\$&" ); + } + if ( relativeHierarchySelector && hasParent ) { + context = context.parentNode; + } + + try { + if ( !relativeHierarchySelector || hasParent ) { + return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra ); + } + + } catch(pseudoError) { + } finally { + if ( !old ) { + oldContext.removeAttribute( "id" ); + } + } + } + } + + return oldSizzle(query, context, extra, seed); + }; + + for ( var prop in oldSizzle ) { + Sizzle[ prop ] = oldSizzle[ prop ]; + } + + // release memory in IE + div = null; + })(); +} + +(function(){ + var html = document.documentElement, + matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector, + pseudoWorks = false; + + try { + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( document.documentElement, "[test!='']:sizzle" ); + + } catch( pseudoError ) { + pseudoWorks = true; + } + + if ( matches ) { + Sizzle.matchesSelector = function( node, expr ) { + // Make sure that attribute selectors are quoted + expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); + + if ( !Sizzle.isXML( node ) ) { + try { + if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) { + return matches.call( node, expr ); + } + } catch(e) {} + } + + return Sizzle(expr, null, null, [node]).length > 0; + }; + } +})(); + +(function(){ + var div = document.createElement("div"); + + div.innerHTML = "
    "; + + // Opera can't find a second classname (in 9.6) + // Also, make sure that getElementsByClassName actually exists + if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { + return; + } + + // Safari caches class attributes, doesn't catch changes (in 3.2) + div.lastChild.className = "e"; + + if ( div.getElementsByClassName("e").length === 1 ) { + return; + } + + Expr.order.splice(1, 0, "CLASS"); + Expr.find.CLASS = function( match, context, isXML ) { + if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { + return context.getElementsByClassName(match[1]); + } + }; + + // release memory in IE + div = null; +})(); + +function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + + if ( elem ) { + var match = false; + + elem = elem[dir]; + + while ( elem ) { + if ( elem.sizcache === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 && !isXML ){ + elem.sizcache = doneName; + elem.sizset = i; + } + + if ( elem.nodeName.toLowerCase() === cur ) { + match = elem; + break; + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + + if ( elem ) { + var match = false; + + elem = elem[dir]; + + while ( elem ) { + if ( elem.sizcache === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 ) { + if ( !isXML ) { + elem.sizcache = doneName; + elem.sizset = i; + } + + if ( typeof cur !== "string" ) { + if ( elem === cur ) { + match = true; + break; + } + + } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { + match = elem; + break; + } + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +if ( document.documentElement.contains ) { + Sizzle.contains = function( a, b ) { + return a !== b && (a.contains ? a.contains(b) : true); + }; + +} else if ( document.documentElement.compareDocumentPosition ) { + Sizzle.contains = function( a, b ) { + return !!(a.compareDocumentPosition(b) & 16); + }; + +} else { + Sizzle.contains = function() { + return false; + }; +} + +Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; + + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +var posProcess = function( selector, context ) { + var match, + tmpSet = [], + later = "", + root = context.nodeType ? [context] : context; + + // Position selectors must be done after the filter + // And so must :not(positional) so we move all PSEUDOs to the end + while ( (match = Expr.match.PSEUDO.exec( selector )) ) { + later += match[0]; + selector = selector.replace( Expr.match.PSEUDO, "" ); + } + + selector = Expr.relative[selector] ? selector + "*" : selector; + + for ( var i = 0, l = root.length; i < l; i++ ) { + Sizzle( selector, root[i], tmpSet ); + } + + return Sizzle.filter( later, tmpSet ); +}; + +// EXPOSE +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[":"] = jQuery.expr.filters; +jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + +})(); + + +var runtil = /Until$/, + rparentsprev = /^(?:parents|prevUntil|prevAll)/, + // Note: This RegExp should be improved, or likely pulled from Sizzle + rmultiselector = /,/, + isSimple = /^.[^:#\[\.,]*$/, + slice = Array.prototype.slice, + POS = jQuery.expr.match.POS, + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend({ + find: function( selector ) { + var ret = this.pushStack( "", "find", selector ), + length = 0; + + for ( var i = 0, l = this.length; i < l; i++ ) { + length = ret.length; + jQuery.find( selector, this[i], ret ); + + if ( i > 0 ) { + // Make sure that the results are unique + for ( var n = length; n < ret.length; n++ ) { + for ( var r = 0; r < length; r++ ) { + if ( ret[r] === ret[n] ) { + ret.splice(n--, 1); + break; + } + } + } + } + } + + return ret; + }, + + has: function( target ) { + var targets = jQuery( target ); + return this.filter(function() { + for ( var i = 0, l = targets.length; i < l; i++ ) { + if ( jQuery.contains( this, targets[i] ) ) { + return true; + } + } + }); + }, + + not: function( selector ) { + return this.pushStack( winnow(this, selector, false), "not", selector); + }, + + filter: function( selector ) { + return this.pushStack( winnow(this, selector, true), "filter", selector ); + }, + + is: function( selector ) { + return !!selector && jQuery.filter( selector, this ).length > 0; + }, + + closest: function( selectors, context ) { + var ret = [], i, l, cur = this[0]; + + if ( jQuery.isArray( selectors ) ) { + var match, selector, + matches = {}, + level = 1; + + if ( cur && selectors.length ) { + for ( i = 0, l = selectors.length; i < l; i++ ) { + selector = selectors[i]; + + if ( !matches[selector] ) { + matches[selector] = jQuery.expr.match.POS.test( selector ) ? + jQuery( selector, context || this.context ) : + selector; + } + } + + while ( cur && cur.ownerDocument && cur !== context ) { + for ( selector in matches ) { + match = matches[selector]; + + if ( match.jquery ? match.index(cur) > -1 : jQuery(cur).is(match) ) { + ret.push({ selector: selector, elem: cur, level: level }); + } + } + + cur = cur.parentNode; + level++; + } + } + + return ret; + } + + var pos = POS.test( selectors ) ? + jQuery( selectors, context || this.context ) : null; + + for ( i = 0, l = this.length; i < l; i++ ) { + cur = this[i]; + + while ( cur ) { + if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { + ret.push( cur ); + break; + + } else { + cur = cur.parentNode; + if ( !cur || !cur.ownerDocument || cur === context ) { + break; + } + } + } + } + + ret = ret.length > 1 ? jQuery.unique(ret) : ret; + + return this.pushStack( ret, "closest", selectors ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + if ( !elem || typeof elem === "string" ) { + return jQuery.inArray( this[0], + // If it receives a string, the selector is used + // If it receives nothing, the siblings are used + elem ? jQuery( elem ) : this.parent().children() ); + } + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[0] : elem, this ); + }, + + add: function( selector, context ) { + var set = typeof selector === "string" ? + jQuery( selector, context ) : + jQuery.makeArray( selector ), + all = jQuery.merge( this.get(), set ); + + return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? + all : + jQuery.unique( all ) ); + }, + + andSelf: function() { + return this.add( this.prevObject ); + } +}); + +// A painfully simple check to see if an element is disconnected +// from a document (should be improved, where feasible). +function isDisconnected( node ) { + return !node || !node.parentNode || node.parentNode.nodeType === 11; +} + +jQuery.each({ + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return jQuery.dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return jQuery.dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return jQuery.nth( elem, 2, "nextSibling" ); + }, + prev: function( elem ) { + return jQuery.nth( elem, 2, "previousSibling" ); + }, + nextAll: function( elem ) { + return jQuery.dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return jQuery.dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return jQuery.dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return jQuery.dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return jQuery.sibling( elem.parentNode.firstChild, elem ); + }, + children: function( elem ) { + return jQuery.sibling( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.makeArray( elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ), + // The variable 'args' was introduced in + // https://github.com/jquery/jquery/commit/52a0238 + // to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed. + // http://code.google.com/p/v8/issues/detail?id=1050 + args = slice.call(arguments); + + if ( !runtil.test( name ) ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; + + if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + + return this.pushStack( ret, name, args.join(",") ); + }; +}); + +jQuery.extend({ + filter: function( expr, elems, not ) { + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 ? + jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : + jQuery.find.matches(expr, elems); + }, + + dir: function( elem, dir, until ) { + var matched = [], + cur = elem[ dir ]; + + while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { + if ( cur.nodeType === 1 ) { + matched.push( cur ); + } + cur = cur[dir]; + } + return matched; + }, + + nth: function( cur, result, dir, elem ) { + result = result || 1; + var num = 0; + + for ( ; cur; cur = cur[dir] ) { + if ( cur.nodeType === 1 && ++num === result ) { + break; + } + } + + return cur; + }, + + sibling: function( n, elem ) { + var r = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + r.push( n ); + } + } + + return r; + } +}); + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, keep ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep(elements, function( elem, i ) { + var retVal = !!qualifier.call( elem, i, elem ); + return retVal === keep; + }); + + } else if ( qualifier.nodeType ) { + return jQuery.grep(elements, function( elem, i ) { + return (elem === qualifier) === keep; + }); + + } else if ( typeof qualifier === "string" ) { + var filtered = jQuery.grep(elements, function( elem ) { + return elem.nodeType === 1; + }); + + if ( isSimple.test( qualifier ) ) { + return jQuery.filter(qualifier, filtered, !keep); + } else { + qualifier = jQuery.filter( qualifier, filtered ); + } + } + + return jQuery.grep(elements, function( elem, i ) { + return (jQuery.inArray( elem, qualifier ) >= 0) === keep; + }); +} + + + + +var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, + rleadingWhitespace = /^\s+/, + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, + rtagName = /<([\w:]+)/, + rtbody = /", "" ], + legend: [ 1, "
    ", "
    " ], + thead: [ 1, "", "
    " ], + tr: [ 2, "", "
    " ], + td: [ 3, "", "
    " ], + col: [ 2, "", "
    " ], + area: [ 1, "", "" ], + _default: [ 0, "", "" ] + }; + +wrapMap.optgroup = wrapMap.option; +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// IE can't serialize and "); +// } diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/testDesign/8eaccbef76094b364e2cfddaa1cc7cd98d109d49.jpg b/nezha-fronted/static/ueditor-1.4.3.3/_test/testDesign/8eaccbef76094b364e2cfddaa1cc7cd98d109d49.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9a744b88b67a2bbd9d0d3b5c292eb69e10069d6b GIT binary patch literal 251128 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

    {VWsMn;gl@fA`bz%BCV|J# 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�g3Iz|Q`u2sBR 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 z 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

    GbYs+=!w~3) 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 Lg%_CG}8Np-(O}ymWN^?Q;;V8r(nhllv#&#nwsD zQC0zE6@sEr1E&aL*-|LVDxj>wwssJdRX|yVM{%VJBUgcCpoG1Rx;*2?0n5KpO9a zTM3sS00{v|2tfMT1t3XdSAiE9SwH|10+0}ZG`5eU|KEz4L;%tOH8m9PK(1H^=Fow# zrJ*7KX?4aa905oY7pp2~^Lk8Yq4ors7sL$=jcb>$4KLk?K=1Gr0+0}Z1dLQb-`NsV z5z`YAo#alzmr)SriWq5x$w}b!XBW>g0@EZFIKmTN zWKn?)T?KR%&{aTJ0bK=j6-I8sY&+i_kuj-&Nd-(QoCP%C1}Gr93RUiLUbWM_YaW(Nd$}(9N;THjEs;`(U8NyVFrtV7C^9xe?~ieCwNEdg>qE{=;U4^a z>zlv$_x{nsQ%^m$@bX_=`8s$9?SI>I70Ad{5GWO>h@}eXDxj-?t^&FW=qjMAFxSqb ztI)?`VO9aN3Yb;sCEez^1M{wZCa%JN@L%o3RiKrtAQMRf4K|rYR{>oGbQRE5Kvw}> z1#}hARcLp@tuQ;FtAMTox(c6XSD~L(*jA}RrPVA|r3$jZGMtE1sYsQIRH?0jtY2)! zN+SOe@*iC$>%wPU!)*&4EkC6Z9;qew@u&qrvq=|?8N8sE~)|w;# z(KaL;QGo5|QGjh*oGP5pd9BK*_~6?TL^s)U+rPXV+?fGHKxM~FV!R^nUFOT7#too2Sju(YsJ zN&+uUjh@5}PbG;L7*=A0R^nz**Y?ASWcAf+E039Z=lMc0b&hDZuZWqi>P4hmY_4cp zuLB$eLj;Z^ptRF=VC~^6gTq$`cTd4yR#Uq5e1zs#%qd__0doqNQ^1@8<`giefH{Sq z)0{%3(_DKBAXCUutW&_80_GHY{sMXm=qaG5fSv++3g{`Ir+}Wq +S$uvtuuJQ>Y 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 D5Y5!E& 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%0D5rdgl>k$aEYqIDp7V^I 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%0Ac#g1y&%pZ#1l13 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 Xp;DL!#; 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

    )CIzJvvm0Zb6X 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�$jCO%jZJY!f8t3IU@!87U$ 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

    JH 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

    wH^2NuQySKUqnnT z(iPu`1bf)4L{xH48s8*ISs)H;yyUFzh%5|q(Clhshq&Bkbb7Og^_C9I`PDsr;5}ny zJvyXT8g*VM2)h^Hu_=wWVNFDI#{A$scJu&rP4IZp{Cc_S@}(^R)PYkq!|pTFur%Lx=*5N2}RYky!B6Cawyn z{~N#9U&V`k&;=1LgpDkEqgSx?!nLv=@M1|Ub9}Bcal>P=BgSrtS(4@QZsQ!PX%TVC z9PC)F#_&$|N*(fV^DnbC2XSrhOv#%KVci|--tpgePt9`?bLC8TXe~&+4__rprN6mQ(xR~;SGhp*cQhi zNTVVP5*U?Kvikk^(tYi1!{}QZ>5}s#q2=`(o3>B4d*@PsSk_fy33M3XBt^w|R9ku* z%`@Txe+fv6(D>UIHB$_1UK$mjeON+V3(b{OR05uOkyRBJhq{8eM_MZdkR3JDXET2S zrp-GPZ?dQ8vyZVq)Ta^V54y{P#{(w02IncXxZF z<(q4^nvc=@3$-<7<&@o7R@pYzv#ygI$fDc%ZL+tHdR@K#7B9-cB7fU?3}Jb5rn?mQ zwzO;+%#fH{N!@*Cb4%8CclUV=mgDK53O7a-Wd1@$Zjk#<)M;?;W(PDPI2nA{$LO3T z55jMwGo8?!Z(b-j@0<-zEe{cgML?m>_W(jR+n9L>Yj{hmx*Ds?yJ(9MM|Z#Pb}ymi zI_X+kI=ByZ&Y^>KjWJxIW3U05@j>1S=Eb%2H}%rTHil?6K1Q?6raambi%$Jxk=-d1UTt#tk=hT#yKk)|}^I|G(y1@&W45es?d%lzQdo_n!yZ?Bf}W?x=7CAI9)4$(Qoipv zC*sgNpZpP+v%_<}4oMX_C~|YNi3`%GKN>1?z4^)5F*w$VqDN$=z3^`S_v~e;3}~c0 zq`z7seZ9AGDzRprD%;NO4E5GZ0sG8WGym}n=tbau3Mf4M)C97U8;PfKJS`CKdfRZ@ zU1_|$-azpnN3_Y3z{pX0`=eu!yxP{D=CW8SE>5yaLP{#<(1+<+lk)sm(3o(L=^6?PsTde!i#Q-?G<3?gg&lw^GfK2!0w;+fN=k*uuF>KK zO_mkmlWykzLi zfp84272sw2!K!O98LpW&gqNlcw0K};MvUq;8)=+ctQZWr);ukoau+=>I}yXerb{$1 z@bL?b#`8B(@HsR;A(jp1%P`|}SboM~l=AZO@>8(-uvo>nc8O2RswYj~kGrC!SxP!- zyX>}iwWC&cx4jA6m~@!uw)Y+{6i_o0hQLwaTtQvXJkDmqm7=0@)p}27&|+A5xDFzVZaM9edAZ!)Re;DW!9371=kDB z*9PH5=VWGu9#9XFk*L_qqUwVouoibtudjUtH|r{Sn|$iU6C{efTA+TD1??U9qd#p>PbPkf*)OP@v@pTgG_ zci_EdlkxNJ0lG2aJa(HR?_eHdL=T5a^q0_#t0~ zXFQ8br{mfhCMPGU5jtzqz~$F&maqbJD=Z7~Q7FowKG*1XNO<%YWw$al6`%#IUgiPT z*0(6w7}e~E4>OXbjZMK+XM=*aVgK~B+IL>ix!LJ!)6TOQo0fw6hj=)B_0dtszbIapS=xCM&fh;6nIDl5CaQ2c_Q1eg#HWBE5vhd*lLacLmn339bPB_Lf z$y#Tt+1khXvdOWOntnQ>neb$6WV-o*vt_en`{Km>fj;NB%_RL+&v?0~1;~=;VbcZb zE!lht1K&j*yX$%JhA`m%Tpw?MX5pM(^EOeVw*3boaS}gFQ>c4+W{5M7Uh)x%GLw#n$YsT7xNL_farkh<)Bm-wcNz{z+GU*_qU+ z_E?)D;fmY_isWBL4CfSbKzooLC=Uai>l*G@_e?%W+n;C)Sj!9{2`ucq?sq4LQaNv0 z+>acbwBjS(Hy^MCq&&22Ot6AZ2IVHxzqj95W8s2eC`XfL!a*4NAmIL`l?6Syx7a><^{PcZ*Nc|cz#C@=pbZQ|jvBJ!`% z0zTEtYegH&BwW^G*xm_(g&O^At?b1$&;?x7|FMPml%dqTY8Q3>--k=_Pb4pAx}HVG z8ayV@Ti#lid-4v=xR$Id?$&=ZX_BsU8w5qk^E;Azs5%+xQWo}aoDI^}vmk>3s^h#% z1Yt~U`D!{tE+4gwRpzW&-9NIQCp^4yde3|zozSPdFlV>d2$~={Hbc$rANCijw|Jey zZ={wdUKK34-v167-x2WK`Mq(lm&UVI-?p?cSLcW(>#%UDXti6T7;W(*u^x1AnIa+| zXw>n2vKV={dwG>vJZ-T~{$Xy^QTYG&PN347ydaqo<@K;0PO_A@2bB1gcY#-vM=? zgMb^rMltHjDqyOm$8`}C7M(W&i(lP!!l}5p)NNF{M(Yw22Zh_pewZTMDJd$(*Rn1U zk^dcjPeoODCt1Lci2WjHWqxg-+&cZ%cw#0g3YAX1j@W+Aah|`}pkrq#qSRu+_1=83 zx*en3>Gc+i(`}|fCAtBqAU1-whcM=m|j z@!gZv03pA(6_D-3?1G=tZCB2}6zNrf68~Et^%dTh9Jj_}`e&`LT#5twIiS15C!J zR*$W1l#&I5{{A1TzA`MUE!r9+q`MmdX{5Vbx*L>6N;*VBkZwd;TDp;x?gr_2>F!cO z!f(BvbMC$0FMr7M?!DJqv&I~AtctZS9frLY6r5=zsP;6~pj878`hY;|M&eaTv}UDH zt?ylod4J44YZU*9j}vUjq(Tac^L`0 z=R8f_yszIzBUX31r(g5quS`NQ2&doX593%3JZoIc8c{C`S2D|LuiW18(5_G(io->L zAMa-mS9XC{<^w0`<4UKH09Z*$m1vk)2U|K+Le^Q)+H<7cbOAY1qZg^(#hGfh`@dKg z;T2#=0Deq|tPYba7$9QXo6A5zg_w;Mqb@1cjjbAlk?+PmgQ&eBO>K}@g-NfP8R!?O zIzLn_MfN7=v1BI9R2OJ)Un-Cs{$c?sgbzxZ0?FH{*@CL8*?rgc-#rbSKEE#9D)IL- zP3-!2ru~0SEiVbFw0a&Ej(tqH7F8f>zic#g$@yvovFlJ8F6YE7xPmUa7u}4$x4G&zuk?w>e5a#-JJoyijM3ZB(z5QPA+&okIqP})YcVMb zpsDiYDzpuo*Kc>C3MQ#HAbbPrORZzQM5n?Bc?M6&6n=I-9~U!+OgZ%f>F;QHvkXkh-eHE}u=zV#eOw zp`IDGs_yiROcE_&9gmEkI(e{+EJx3hs1(sWtVf?;YcrW>*~bLTU_<91CWN#cs&r-f z$k4G2AOQsC%&!KDg#ar66%Ao;O8S^}sF0|K?>%ZHX=IiHqZ*??eaF7u%NQRUWHWZW z*JquH)3GU!)n$Rl@Q2~HQ)ROHc~xE0Zfe>wOIYJ7c_tyhX<(a^moa{Gs$T*3k<`rm z#{!JNFoNQLgGAGMt`g^c>)T&|&@(*Mde13Lj~FvrdJWRn!jP+smv;RG79JMUfu9M2;bdb_$;>Eim!Wd-Tt0O@L{@!@_Y23`2%7HC&d@;09ilF?%DL~ z2`f}?*KxR+=)uh*L6_4ZdQr@Q)`#hJvB4lG#PBqfU#V*|G_#MTD~<(q)?o=oqB+20DKSuB~RDLNn<^-?Hw2<7=*BGpB7|Z zyXN;3NeW4XjQh}u=z)9R)!*I_)bkRRrHpK%(P=wveMpp-s)k#`BkHH(2w^e!GVsIR zVP46POf!fHtqIt8ZRJFR4HD)#GqG|gjI5%3UIoJUhPhf{H}vA|J01V#WxEBH%E~FA zh9z3n_>$@2=cnUONsgY8VjJ;Z)8?9fAY{~htO+YDG*z&Y&y#g2qF4-OmL%-Ghgfr} zdP_0Ct82vpQ~s>bi53KeeG~Mj{S}ufX6Bo2`us{*Aqg|yt0lW{Onf`QwDqJ)>#Fx* zSLOj-?X&)4;gd{*BdeT6FQ4(XZ;qO=3SA#yGd~j{u7#@x2NRU>_l#4&4=6!a%ixRd zAtPY~Sbf^AjepuZ>1PG`ycV3Kf6{)dIbaoQktSyQK~p*OzbojJfU#R!H0N%h^jcox zPYpmscN#%mqD`Uswj>&dih#|atdDX?rGJ_$pZ!-9Y0g zt31I(y%i&wdCoeR8_)FOLD!uxy{ch)^RfzEW&?{t8LLj9DsNP9WFb|0}GTGcPIh|8S->C`N zk!ep?A`%sjcPfHdFGLpWV-9p`Y!6|qU!B52*(x3()>cJ9QrP;tT3t?KM%^MZZz9|JdR8ig|D<$n2+$3 z;`ig<rOEiIz7($~BwfyVluNr!g#Q7$jtTqfqp@n2O8`fg{P zLxrF01rD%%<~8b^8TRT!PVC((qo|N1EC0sf2{U``oyO<2Vd6A|L(E{J5J)6^E8m9L zZ%ZJaYkAvH<*9{GgE_bw%@YY2`V9->Gq)11WLn9x65T`h@&L~d@KAkUgVW^Z-2WpkSh7(S@q>}2%ou#n9_wt*J#Agtl;zs zvhgZNc%`(M?gE7U=L4V=y*3273Shw>Ky75@asX6<<9x5CTT=sHi`~0O`g>=l1*hvu z^^eDpRI=#tQDp25lthz+?wQ~Mf?ykT5(7SYBc}xYM)+_^H!mxTd{<^A`uev|?py|| z$?4nk_Z$~94)j-t8khfwmbsmZcUmGLAx&GZGZl7Mkkb*U1`c1kd+foX&L+N67V&%C znReLpg9TDHoVu4qSm`4I2mu*{fC{uu2$X2VG<|fO1Z{at#l+fEM$=hwre}Bzb~zI% zr&@R1S9#dgfH1^=RT2vP+!`3ZfT%a?b~Dc7k!!wMwJ7X5pZl9Xk|K2aZG91V^k^x3 z5u8rmt_Oh!1LJ4HSMq6(0?uL)70G%cpd>2(CRN+<Bel>kDW6-$RfY4eY_~y%(!FS4KtUBd96;Ch%4YZ9Fm6ac8Dl|>B zj235CvOp<26NO&Pt9UncVHIIbB;R+y{ zQEx>N0UzJBP7@5~N8Ktza6kBy07rPmyt-213g5XB=JOn^Ejd(C;Yc#F+8z8l7}EfT z`DADffde`vTtgKg6(*f_lmQ2o4{!qFy+_)05(+>FW16K(E(M{vsmUB#9B8>>fteLq zyvP(VJSZmSZy~4jM~CSu#0;HD>P`4BxpMHn1o+9%vg=qSpY)Vw$s;ouQ|l`$`&L>* zpT6~Q;5@kGk2PQUKJWYjNS!RFGa|wD(fug}GC8hB7N!W0x!1^VepjQO*y(L>79kpt zMqMv@B%fkQ5Ggj2s#Usl6D0(WBqeM#~VC$x!K%z?C$V=pdS6XQsbl^-0L{I#lMGZ}{ zAi-*B|AK2q5?gTMo&u8$%6U#fAykT$qkmUUWVQbn(UZ_lZ0z`G<)lwi2%Y*)A~OX* z0P+JaB0kY;5M;&m!m+`e;eAoTS`iu?rhy<_RB;@lIjiNfQT1rlZbUQt@DmMlF0>ce zc}fFy3egA5a_rXx@YZtR)K{Tqpz+w%W70pq=I)?}fKOuBqss1kdeAA$8Zs^{y2Y^f z8m4m`+z_7FAW>c+skwJi zmvDti!)(Gyo9P9tVp0urV6mSV2)}XX+6FC^V>=7oEj-XpG0#1iyGd3$f52y%0fw(&#w28%& z`h|u&8^={%mh!#)NU`>Pz(*px8N?uBLQRJWv5eSC+4Oti;(N?V0%Tu#X4;s;8wr)` zA=E%rDyS+Ef^fM223Qu|EXT8t-Q8%a{1F&PQ;3B{jfrOHILtJLB-3ZkMQBc8!T4;H zS^TJzYw_W^P96n6N_a6irG}u~GU6!}H?spPl$e5D=tx zh35ZYy2h&2f9J!?d=wE(VHz`SyQy)P5nOs?(rrF1gdxJ!0{h#xQ$@yY_r7=;GkUXt zw!q<1tK(pV$(tpLyPq9*zLVplQ zL*#FD2Ov(h*NqM9hG9&M@~`l2r~4kz4e5=*-zWa=UKvicC!?k|0a(Z&XzddPZcmn$ z*x}+f?5$`>5W!RwE~bohq5J*;vcsA^IoRJ6CT3Umk40!iO_`$|cvGNK#>GI$_(=gJ$v^ydGi6e zG|3p>r?xVlIF4ZS!2hL zrKMY&Lf0iFF~(CP zCWp(1WO}EMm7e81{u1V&Di|jef75HcOstDyO$7rZr)W{SE-n$W5HwrFN?X^8M@ebv zkDFEu5xEfbl0}9g^0VowDb89C7}uA)j&Lu5YO%`qgLu;`*YQfdCd9RX+s)17&45!X zKF`=x*Ul~(7)sPD@{GGKMG)ioGbuRX5S|ron>14rJCTtH;@&#zFm0QB-ttl=AC}{# zaN3n|G#0=L-~iWCgb4-4H@;dCwXv}`%|%{{Xy`UPbes_fO6&n&cchJhX40k=nh6T# z=luM#_PM&Ptu0F{hi=%mvRdnLLDs^bQ+9I|#!L05ZuiVO??%DJBKA`__%iBeV3GvMALAerh~D;0q)pNJ+bj!4_r|00XsS;J;eDG@EMJ*PUD zIF1O98!;@f`ehH5``F)K~OuPVrK)#GP zH?g(vPb@{BvR2yyq2|TOER^9^uV0dNgA7I9>&Jm7Dal%1jlWwq+fzFvv`J;u@t&&B z$f`SzpQkl9y=b8oln3L=-m_74rf3+PA4A40ypT3+SQ=1hBrz}bD6m7-av0`4owka8 z;JoWrP-hXXVX(4FWwCuXfTk0jQRD_Tlje&p64U7D^3=rqq_Ksfl7r#L(sVc$7?He_Gl`LcWYWlB?zTY424hOEJfx?s{^Y|%6X!)PcOF45l3 zbOq_)vx~i7*(mR^IBf^K?W-!G_*kpyC}O*AQN#z7cRE9Csv;t+V2R+IhzQ|m zar!U5E@qqiyq;(O89yZj?waan`1FHr(t0x>xtrJR*h(B7&eaL|0li){+Q{kDI zbaoC^Z?UOc!j=iq=ODBJvG+GYQM1sUevd;+s_WYI($@oNLd-$lcN9w6uQ+nsFfSi& zccZzRA`cZ?@xE^x!#p_@eyAor{WD&ADCQ%0RcXjH`6a>lWo zF?8h{tP@^S59U4B0N@pFuHutUB|f({#VSuW)R!6ST&rO zf}L7mu}p&Bg^l@Kp}orl%NS2E^JxgWd9FM=vrdJCXP72KR_#YnmHsf!Y3L3H3|(b1 zRFxNLpcweh;1(@!%7C?tg>AC!1*d?j<{sF|55vDE&2E621!F9ffq1G%Y7!_7;anzP z`)kb|`L`R}x0i%_D-5156^4FyNzq+5Cq)dIBO{0N&J=(iM01b2?kCaJ>bqD$OyAtv zqt3CsS9`(&Etf|{V_etnybw>{Q_4*J$FwO+k{*jbVD5*s^ zd4dj-ajVwIDD-EkWwWwy1yE|MLyBzSVo@s)?y(f`t@1-yOJsU5w$`aWZR46Kl68ru%qd!?1rt$d1iz$hdqYbi`}Mqw^sKJ(&G}E zkqsX{R$!{-$|8kQ4S{=;k>S{sXMYwiN)(jsENs>zRTlq9YOIhHB|M4eBA1w&Psga} z>>*}sGfeYgL5sAWHI&{`8#cvug~~9t-znc)+%w)5duVH-c(YwlX5Uq-PCaoc$mAmp zwO3(Om%GEfGvd?OT?TlryjoMaVYI#62~721(@=UTh74}_#&77cmQjIIW%E3_SOL;t z;W=G6fNB>z2=eI z?NUS`@9&pfob@Y*25B!$V#31o-bdO_IdfVn7+&mFSo;>3&lL*Vnj9T9{?Pxu`$hXt zVeRER>pPz>)}jjwUaP-EvMQqQ-tCSawmj$K;~Sfcv_^%zpm@9Z4cw8bfEU-(Bi+(a zU*C3rG0f}yvGC?XG*Z{c=li%@+s;U85SnN4qVV|++bNDCM5Fp?F%3Fq{;C=l>%v995?xZ>bud=2R%u*iFqto(c(Capm6Q$RpF zLVX=if!1*#;|p!MX@$HEhRLE9spJeIVzvgEYkqVabN`DsFmFGaFuQZ0@Nr%Z>e=g9 zjKxU~Vxo~ghm|0k|0J6ixOs!As{R|qF5vD4giVJzPI!D>BUpTJDnqsOprJ|bUOwh6aO*s< zDkuc$k{e7Gj1>Lhy-?m_bfc`>qx{fcQShj*xcyvH+quaocREF5`1y5Y{{YbM7}zW+ zDVdmn&$nhGvofI;1u{;V@9tmc+P=Q2n|R8>{6Tvs$l;Hdo^pU$KnZ~Bdj zjg9@FhTT>cj7k_`JLSfH@^038apktw?#=b;{Lh6k=DIJ(zsT>}=XtbCj`eh7F1dv4 zP7j4$S4ZKpgyXSjpF|IDzXRh3Mc_(MK^{iNK`n>eygbz97qlCA7;#yXN)i&V6$dRm zjflxWor1@DjLep=g+SNR+Il>l53`?|ntC9>&N-?+mpceeiEoDNR4;wAu=0qZ{z|8Q zJIO>;Yx&r|jk2|F3B*Ca+ReJaMVUKM97i4eFX8joork1HVm?b6Zmr@T!ifP$!m1n2 ziJET2pF4IXzNLoQ zC)Q~3?4%&4a8VwW{dpQTHz#WNVko@xTHZY^Z6R9I;60W831K_&DP06(pCyT*#k1fi z@a(}{nspKst|s^~0y_PAMAHmUqLq?%AMus8EJ~Hk?bHv1?&k zh_ibN*3zON?*cn_th8c~WHU&{C*0Gb+sW&>8uHh^F^&}ldgs24fSs=ASBsE5BkZ5~ zk{az#II{CU7TwD?O87!oi$W6-!BVcoD=xnJ*9>4aIk+Xl&+p7h7mderwz z-Su+Wv}HWq>&8h$^}uPFL!5Y2{QKwEL^L)>9c z>Ue8Liqgy8f<-EX*t{|WEz(qHsb6wd$paa$!i6pIjW(hs;FY+wNf9}nzUZdvL`l0= zi*~nwUq^;Ft=YE^c~YlDb<!I=lAKmrDyTJN|x?x;h`TH#FPEfk8Ea_r%Q7KMSrX~Uztgb}?zKBxn%@}@41#uNa zv^j_LVTiC|*Q^uuuE&B~QB$9pID5FdJQ}T>U&pMuJjRRUL9_eez-_$GBa~u1B$_et z#?6hwao5QMC8KYp)kBCtULNsQVVDUQ2j}w#Ripb!I>n?jetLRLOiA!xA3_YD=&dyp zO9g?u;y3^Ji)jJTa8r=33uHB?oyo*HT{e*t1L>Kp<%N~`eS=wiXU(7CV;8H3IF2!^ zyYKE^NSm4>q0JEY4XkZz*5$MW60&(;4AMKJoYn$2D(G&jt&J~3kkKWFcSvs6eIOY% z_wCJ;m$sc<={T{*j)LHKk7I)te$GqrsXk-+Ifn}Q6^**mZ@-S~QfK;YTMc)tt9`OY z#U7Ue7X|KYUkRw)Ep}p>_*b&koK2&C2iIWxMmphoXRBzDVjD3S>ScboUhk&t!Tkci z=JYCaZS9=wvY&=B^no#PEw4-l&Xep|0-JTJJ z0l44<69WSU%cuKMQ=P#%IXU&3!NI}&J83*X&e&=&!+`E^|19A2{W=rk&b*cUHiaW= zS*!ZHg3GE>bL;Rr7iC+SZI08VTW_OBzWT(N1p{8{%K=QT;jBgPpM*jslCCjhV17th zHTBI3Ct05h;aRGD!=4FoEwi5*y3#cgbSfi%HG5Yv2ALc_bzGhjnko1-Ib+T?w@~0i z(LPI_yEvUu)O}h$xxe@Nt5|39$@G6oi43tuk!>D4l^4aytwv>p|8EBia3!z-6Q4WT zZEHQ3l09Bc=RvFO!7o9JL)tNDOJ8$lxf?gv4{!z=Uqw`I7Z5XEV4Or*Ca(wy0TkuB9x=`~rSUUA9O_-7z)aHyzv-D6nTi=8NFP9`lU zr}{PuV24LmAzC}mho%Rbb6_v01`M9WMqjD5HmH1x^S_vf2^#SsHuqu zBL&kSfJ&6IcyY~uYzik)R-(UPao&I`hjeBqSrJt<-Q;3hIh1nI;P?D&jlUZzAC5B@ z^YuKWB`q1!r9Ax@tCcPqdd_JTq12TSogp2zP9b8{8+1p23bE}sI@3;il2bsVfICC! z*qxF7J#?zTiF$5mJ>i=$osSk5j$FMsr>+8l;ug_9UO16+P(}??gu_dNx9DUNiFEjZ={CK+Ec{ARFfFnpy48QK`cRWE_OSsMdG+9^aZr&Td+vdjST54k9IPB72(8;Kzy&h)S1tlrr zEP-g;`J?reV)HY{dOsrPOVtpk%XEmj>qSiax9>ZnaPE;U9*;UF2(6k9eys;$*Rw6N z@3;3V6WR>@a~80N8|(*-e)f^Z@MY&R3@vAatn()<#34S&nCvOnwa%8yHH11Lo%0zf zU+fl6KnoP7;>2Dap%G9gi4kz?qeF}55)i;Abm^5oaiYFlzuR5W|MG^3MM-gd&9T6Y ziKYPzQQN#5h^ne`%COXQ3XAozbutmru!sBHh!S4&0?{u17lJ+1QIN3B-S)=E1GFk} zFAKfNzC^iyl(fz+up;?SZ2kO;Z>_iDhDXWGvyJ)>x225!9>>dfZyj%6k@t(87+lXB zCLahrU5D1_RobTyQ&&S`3d~kLqkQ#AB0H%}zos#;9ZPn1$T64R)B487;v|apx7)h5 zHErL8*ZP0D`U#1Oy}2#P8hJCJHB5v!ayVXni9*ER8&!Uo^*F z1z92j#w?x(R5{)p3j$+S0O;xqVJ(+RyXsQFx8tICjw=t4 z(G4-1QlK*6zG~m@)Wx{4&GyPOf00aV=01J<&M(8~h-;rNOYy~R< zzqq& z-WFfG`_@sjCZX#e>Wk`v$XRl2&!u@&*E{P*)eRLdSHl@ZwouPTZjF{k^x(J8I4L zVPjJ^?SYp&H3Zr60%#r85RnN`Y!iKuQ?=H?=UNu8-E(?TxY#}Z}H|)_7bNN-YSf3nHE`O zX8_&xH(Kp>;E)sP9%rX(6}noh|Gk2asiKGJVa~yDgSNw-Zk4T8zeD?)`Na0xN4KO{ zyxHCoOUxHWF{OJ;RPEOh^3rBsDT#QMN;auTB9gkEk=)Ye3~mwokhx*Ldc zd97ja4)NjH3dRvOrIL}RBgNbLT7k3YhSQq_Hmtq^m%ORb-Jfun#yFkBz1tfV96tn4 zT$>|n5GqN!au{SB%Zd?ODPlF>DpMN^TM$nt&U89NM14yM-)~mz;ZrQIW(#lhb)F;t zL#p+J42oP-RF(4&WQxz;O6>x^z=fh}$NfNe9o*Nq0REe&uRi>0i%UQd(-xf&y@0(T z>BxT|H{4h#FCKkEu=n{5)9=?RA-T8#81n^-PTDeFuiqz=i|?@xiUQbXaEe$XVnf*z z7FD5gKkMu(7+eYoK`h)(^m_-;gRz-cdSt|@@ztNxvmHhueQ>?{H8l-ym(v^+jcRB; z-ah(ewQt=n#?)j~rN zkz2F{5n_rueiRFVako!L$Rixzc!Kw~%k5yTgTU!4CXp#*56Y&5O!q3GnGhk593_Hb z=e!dw(nf}71Z#MOt+iyoY0rA%F!*BA{m=3E7(X2ld5n$@?49OlXVeBOlWk zGX2UTAq`)TsbEz*v1!Jv&b;11O_P0&jlbTe_xFtm~9}=h>KXf!=C%X_pXdL=Z3<=xH=e8gGf>HFwYJP=kv4 z;T*5ZzK-fg)Qy!2K}A9|r??tGx=&Cl8oJuBTJiqWYFcL7nmdv+b(0)b(9VBMfqQ}z zOA`~x0^8kYluy~r;)KvV#d&{<@`IlBHJA2pMXr*tD$hbx$sa>L^jaZ1HCR_ag?rDr zhq>gR8MmQB{Tz+3aLet6CDhM>vKB}mIak^(R8g1b=l8r3_?l(1Ps;Z@YFb=#Q;gUB z!-@k-`A-41Iq$cO^h^h%Wo5^rm*cBfJIrrlV-0W0m+RE$-q!bSi-}ycQ>ZYe`EDCL zjBK5 zoXgthyw4l|VB3vJ-yM6KoeN`c-mp){F6NIZ6Ko79dnSG6>(;VFedO*dt;eP5g5#g# z1eiA=VClj7vu6b@^h*uYY%Y)2}ppTn;rSWbrik#%Z5tiJ4p+qn{$Q)~;48-jJo` znsvc3A-p%b#;D!aatD(3x6X|!Va10W2j1C`AQ@w(ueVGc{wW~UnZ=fike3h-Y5 ztwn*?C|9N=3Fn^bT4;{z{AseHa9CmhlTMjYkf*JN(nnZMb9rz(1d^yru=EePJyCVj zb=GX#n^dpD8?ysKmmsu3Q$6kswuPJA?@Q7YB;yNu8j0`i3gmlUYH%jKY>30%RgWoN zJbOwtN_RrZA`#R9Cmq4EFVD4SzsaO&V#*LF59B@*zVECM%1g7}SFe*R_gJDx8=H~E zZTbg9`~&1c^YVZv(o$8(p#ezW>m628QyR^XYCVpd?;WjX8G?|+ zN|e2>(qGsUT`T;aKT|euzx>^Bl^J%t*XaDHar^15ug_pizvdM}`O0OAaviqPOn?u+ zT1rPPALXg#Mgnlb*dM-gtQ8w}J(E|o^I0*qQ}ret5P+oBbJRk;4=s#VKQ@2uGgn`c z>ZEu=&OSs%aQcb!amj>D0+r!iLlUrAyGmFrB)o@!c9#KBXg>x}*y*;tp;j5L+T z;S0=Wq8^5v5zOxt)baOvS*uJZm_0zA%Y5CZ<|1n7I&*z*X|GL|&5h`L$qX*(=$ce# zA*_?w9EgZ!U%4;{2w83W){aM46I0CAiAE4utMri=O(?;vIA#H7`_63G$G`BO&>z9+ z#;@zY4hG1L7vh=vS=AFCseL!Cd}-SV_ejPg%r@leZjC*rFHfUgm7S@fRt>zw+sP>+Y&28DW8NHa5fbz4-aLcHa` zZ3IH8??#QrCqE_`3UXM#(eGo+#fk5cp2DFBLzBMy;a0`Y!a~;31(1&x1Vj|)CbO}k zT$?VR_z0qBqw+~jnZHoZf9yJNHisVI=NUIjVjc8yjJ)o^Ye1Lz+89wvmNrZ^NlVhb z3b#2+tgdoLmoQ+&XCTd{S&KUp;;dJbg%?zkzpqwy9owlD)>wqT`Ri~sa)rvl@ztz0=UTui7=r1H zwZ%=s|CPSw-0qIb2SAYY{>O*I*n5VZc)BIZSDAM=5hAgy3%6dL)x4q{d~fR=wjijE z-$N7qN92hqe8$Jx6lq#Z8y#wYw!q$D8CHunD4s4CEY>Hqf*G8q@8kELm#jA}bv{4x zBPO9uCp=51srTnD00;@(gkM&bLnb;4!o-|gJNA)u{}ujq_+(8$Q$2(i$j$y4iu(O) z@$~+=H{|lLe^9GfCe=KzreC8me8lg5#sOJH-!B;omk)`HLmTiRcu*`2&hOx+Q^>I| zF2B0i^6?%aCOwA%4qmKebe0BTyo}=Rux>SV8{4r9ZGETw*xbL_#mM8p3_e7?zxIj5~ATSyDOurGH3!l9tvP=pK@c5t6-l zSbN`!uB(YVCTQdBav@aN_PgZ&)G8{^hS#jEj`>YA2`SsjPC=U$07UUDW3jQ@+cQR2 zVoXdSPZ91gp3@gD^3t$-wzVkgZEC8jZpI*1eGp=)A`s|3#(WM2R?r|8@e3^15fA9m ztdM%~2pM(A7_PPR3;qs=p;=^j#zxeZ!p=^{#G#d z`!(B@jjt|Ee2zcE-d?;(`HRVUKo^rf=L)tcWbKO~#YPGxoponhQ0`|KlxL8a@dn85 zS#6wAOSUedy}+>))$2K?BL8|O!eE0YucBgH?Sg*kR4Sh_G`b9T8TaIqSJH0`zKgBL zNbq8SJrZfl1zMvJm`R9^xWOPNubV~f8PnTgX!L?N_S!b-4rYgLSK@aGT^b!cOC)IN z%RdMfz_8k7^k_G8d}L7~^*JbR!>L$Uguyd42w03hX5{2>F`lS>H)TOnQSUbu5H)vj zalQV@hWM06L2LM9_$R&1vvtf|?)kpO^B6ZKp8Ek(Q!+Ivb48GFLzd6e1l0@Ti1+2C zDT*VTV|&KdV0fOzzXLQ~CGd8At)n_KvdCCknvHWAWkR^*uErN|ql(Q|x z5wk=JMVKQC|3@mfY4g_g74rV{59Upw5}5jGaU+{ZXRB2C&@VeH^UFobq+kXGI5iYUN95BNIRP)HV^sqn0k8FNiXD`V{CUbnpaeRd!*^pT|4(WN(yxv`;y7oH^l7psN}i5h3B{vD>H|FoquvI@+G} z%H=3e8zpELyKIXVv%3pgWLiU>#WySf6Nc@oKNk7`m_-g<-QDi%8UUiXQFmCg?-kcr>hewG1z$d91!ba?i(~(2dY@LLCIh?xbXCGh=ca2Ec6>SIy(-Vo_OVod6tYoL}zqD|MnOfkA{#MK@Uw9OZn2-KbfH7kb z&oAcSHbbn*?%_C7>CFbd6i}m3n#EQmbD!CIcZE}DAW3H6%ysw zII6$>W>DAst!&bnD}+}unf281RvYlD5SEL1f7$}$?LuD00rEbuen|a;Ye`{5u=F2K zl8Sf>cFo6Zt#5PnooogAcb%dVnvAGg$@`in8jvw4UQl4rB!5Lw$?6Y|Vy@Pv4=ZN) z=twjrvyELI%9G1&5u$D65jRF!@tFsG;dv6a9gQP}c0zof>=gAkNG2;AcdJmkgVAi< zV>y4tjvkdeM{}4xN^$&ceAktQd75XB!UMBS1gAWd96}ak{NlSs1w!{D+5;V&Hp&%w z;t2uqo?f==X8}2p4C-J_Puq0q>Keu8N92~AgeyOOM8xAPFt-ZHX-)9CiX#e`vL9Jn zR5~0ap;hUfn7rC>>2=)*PAa@SakNnc?Q8KAF+i)+9B!?k>v*}^C?MwF4rR|x+TEA( zzP}+{2SWXLj+pQ9$4>i%R62cfaA3urvY{`t4~sO?xpqJFdpZqD!X#rlJ&48&@H2)7 zX;14|VDPhn?dF74&?15YNGn$#(olD6RRQs8e>%v5GkzOmb*GB5mkL5szEOa+VLGG` zoV&S(GhA-{!&M4@T4zE{t8TCAha$H_9xZJ>AW$l;k6aiG#hnhs>X`NL!F`L5W}{nC z7aG-^ktI%m#_|~I%dbDC2J$V3$-`}%gv5r+Gxai&`*woKa7=I5_6NTmn7lr`-%A^K zjXHj@%pG#&x)(yYfw(}Nmo6u$$WBO6-$brK9u$=?krHMm(^Cz?3=UGG(JrB!tRM)F z^lv@=WczgbN7eAY&Otmt?ibI*(%>&6V^v{IEHRu%H9>7!RTV|SVcb{RY~DM>CsZ%6!pBkc)eaHxWY#w;|*7v^5*NlNDa&-NOX%2;41;3o;G2mscX zRE~4fI<=QIEygd5crlh&m!B=n;)9g4F5gKhSgl(qPeX7GWpdw-E?LX~k(7lYv{TXv~ zbX?i~*bLo{f4Hg{025*ByOOQ1at zqD}-SJT%UM=Of})S3C329{}_(0*iv8q7;d7h)U*fh6w}xL-0e{64$vW{#ws96FY|; zv`J5xdByY%Dr zx1Uj)Jnmq$;wB{{L(p_1zc4cs5paUJx$6PhGz0MGF3!3j5RuN#O+cl{F9L~F9P!+S zB(}0%7l_Alf>nc94Bmho?De!U|MjXw0hJg=(ej#$R)k$DdYzslF`cMilQ)c02dc9; z0z6&S3N{VJ25g5&4TJd71QI(7NQ~H|5h09|`Ya`~;NPhSZqA5aZJTHD8ET?K(uxWc z76A_oC<`fp7tZbSTOwdTL5ID4Q;b4}m>=riz%mAf0G=u_u^~AhP4)z@ZenL7(ITDFQ@=lO9m8(3}D!iF#<2;mza5`qqWs64z}O%)3oGPI5kD`t>d% zDHn|nnwvx0=iM6v^2vuSn^y36y9Y0TmH%@HvxR14C1r{%Qz#iDK_X^4qUhps05&5c zLQy~>e17LNB>~?3DPCX@==_9R$Me{z@oVEqvW9%1&)5JoZ;|r|1P#;p*OclWPD3s) zVBzl6F)Fsv7`NU4iaAA-+}j!1Ku-%M0&DqdcoJ1&q(b|{ixjXu9ezU`B5$6R@Zvez zm!Kb5j*NkHyNee1i{Ss3AMP_|h8ZaMqLr6LtARPc-dCxM55reyJF9-Z+6k)hX;Eld zBYl7ka{2QyEFh|Y14!tF`+FC}ag`zJXsFlBe7Qf=mt>QQwudc-;1^Z(J4%w!OKJ zMk7Zuw+^7t|7E|+5R+M0ISdaDx=Sn#Usu!{8Lzi^Va!6_C0@a7J@Rq4DkRrZyh*r+^<@W8tH(aXqEl%33~@j zD*qE3@MQK80G$-%GtX&h1A)3HsM;^}h>h~WeXYNgk@fyN$sL2uTtF5+CLKFvO`Td; z_}*kL7wUc@Hlm^BC^#xe6E6kFaLCDBYfhs6#x8~k9Gm~n6^t>~oIXf52q~DHA!r~x z$*4bpBG(_r-sp-Dc8i&4_D93eE$<3m%3s$?`-_#WoU%+x*FO-lUKd2I+`5a&$Plyi z^!3eT6n&qoV_1&=^eH*DZWI*v(BDGl2Cs?8U1;LyvDqw6u zp4au2*Bju6!k?u+KrXF{kiI^(#R@0{l`tNea3-a<&c$XPaSIoGSnMlNFj2vcS_N4| zH>hlBAyE$1gkj|G4WL0Wv>|KR-8pfFc*&^WXZsKd#09*!X!wED%)&g&8vyR8+pUbu(%;lAYcR$dhT-F}|q066m)*OGy82 z4IJwE`7j}<&t*IAK#>jMH%~+|h$4wzz>^Y%2Z8-xy0M_6Y(Sn+B{OuhC;xzr{rg-Z z3dx!0Aj<8b$}`S;VzKBohA~dlfEWrLr?`N>DEw;eRDs14nZv4@&FD02gZqY?4Vl|? zgBDprl8e(-ZGz~fG-7|WE?zHYG3g`*8G{=*`PKmOn3>-P7*0L8W` zgEDv$$PlzFK7!Dn@JZ8>niQG78WM<*?3@E*!S-7Crb z&__#>-7J4ddsk`n(up9B_*XB1f;vWQ@TSs1f;t| zM7jm(M!LH@r9?VDv~+jFGu+?*^LxX^8@SGyGqY#yz1LbhFY^U|$J_D%B={K5G=MaB$I} zVDuW?e#!2w`6wjd6XP!{w(J1~7P$k^@NA^Rec8ox6swq%TLO8rwnUKI{ow^m8iU?(9-Q5D{{O&>sXi#t z4aGK7BV!)$N&EPRa_1j(Pbks5V4tIZAR`Ftt7C@UrRL#sQv_;o4-XE;-c4#~*j)Xz z97BY-9Kq2CbNl z9d%~iQTN*ex1?_?8*9iX*Z>VJ4wYAyQapu-$sqD8V`9YO!EU^|TrUQA1&Jv~`n#+< zIXYY~GX)!(hZ3b-*eo-w!e%;~)PQGvY;Fx1!xq*-Oh+z=p0frZBhbMD^)q2hbJ- z(YA`Xd#=l|#-x=u;^EkBX<~jJ%q^A|?y*k-n2vvXV>jKO^96m>ood+N4pbSgk?D5( zibA8oZfG5S{FtMyR42lKX>fy5xWK#$&F)laOcj1>NU-G-LK0?>o6 zB?j#Fmb>1$xAr^+m;|}iz7j_8R!9@w@A6<%C%{YCU#s;5xgt&R0yOUd<~&*s)vAzB zEETn1mX~3eGZN5_^iW3ZR`O3KCRvQdh-AGu?Jn9;J;!A zs$Wv+cY0b@Dd?q+P;T4Q3505rab*G|d-#rUNSX>qL(ovWkcI@NoKN~#CW6;75v6#e z@)#kFO|4N`iV;J?8@i8y;LwW^I9){sxgZIj5K(;izzYsO62fX|mu5DJXorM2oaDWX zLbIzJA*g-g&3D(S(ODNqx@U;N-h4mV85d`TA-*2_YD>sgnX;Z(ORT4x>{&rQq$Kfj zrvB2!tBs2(Ee)`2Bd{Py-hJx)95C;ea~_k0zRSmRD)sGC(*k3#b|EE5@YdMrLXU-? zBdvD|KWHSJCsDK5$HRVB;avA*tUikZB=JrZB%HHPT4a-@Bfmu)8Bk622!?AUnVKaT z;Y^wa1Wa#D37N;F6@K%br{2LM#`Dw9SYr>fxglvPD|Tt?Bnv_r;PE4|+0VvLb1#Og zU^aW#LSYfkeXYl`K`iU)r1(H4|tmo=~j{EkQ2!l#-}Y+8_ive|2wOmJXAcw z(d5sBVjNN=pAG*&V0-yNzX6o9z)?C3qgPyo-C!N}$#9*P{RiVEzc|qfDIZMJ=qYg@ znYJ7mQDIfJ*C6AGCC0)s2^wULRc6?t*cq`%!owfJ#V~uvHwxuMD2a}T(gUTjq?sx? zzqdy^!IBz6wuRBeM4UzB-dPa@JJ+u3k32}D_B2rR0y0sk_Q!hr`Wou$Twpt`fYa?_ z!}k9JgG=QWuh0SYqWtOG%elz<8sM65*@H$I`(cNjj6eX});i4jh<)gFldzHv_n=e} z9SD{K8eGMZrLu)poMGtjFJM`w;brj%&s?|7&CU5<si?GM(Iw304qU6_y9C;^!7dkR~PkSXVEARDVbTQ8cNh4tfC z0Au1!O@Ebp@)`afSxAVB+XguqEA{G8&hOtv5UlL%sy?KYdPq02N+F;9kCwC_n<#kx z>rR~4O5YGsLL|k~hwG(l4w7O4Bh6^n45Sa7>~AI8(5`8^4r<*q;;qD8E}Nwz<2b_|BQKMn<&QC%do zdnng+J?{ZUWK=`zI&wRXH{VN5?FEm$e`$eHw*xszXjGJTm9ct-?9GCHl-Y{t|5q}`L$d4C>G1BJow6?amGC-Ed90G#>R(pKh!gj!+X^iiQ4OFQAE1SmKYIpcTWe|A%sJWa_C!o2n)+D|; z8jaeouuF|my~^0QHg-IPz+Hx}T%49#+w7FyXqneZHS)|-Kx$hbg=ORJgvU0@7EC*C z))UZBi68$MG%kBq2|DQaEN}r9<&|yor`lYX#f6c~rxSMt+vgp6pL!)|g-K zhgFW5sMy{V235>wfTv=I!P(Z9(Kh^duw9s5;QtEd& z1|~M@mUA0a6c^K)4URr4t&0rh%cpwp(ZC!fy78WIadO_ZegLX3bDl~#IOeRnx@ny{ zZNLBqN7A)*{^!xS{5)14v>#ftcmpVK3V^&Nk87~|=?zyhXVb9DU+eofbJ*p4hs9hC zLkTv0O<}2<^L!9-PV&SYQ&ela08nRg|5}nCJW}~HfHp=1X_Yf!*{bi9(IUwv*STqk zKjw0Kq<69VaM6Y!a(K_Dbb&pB$6;ej-lgGESWzwYi&f_1^qy45b$`#W6N%z7msyXO z2`7o?zaolgYaZ6NnwkxBJE7*5*112Mkl9JOro;SQUEhlB+qPX58_vj!vW0jb2qi>! z_+hfhAVb$|SZ2xR1F`66YgbI;#kA%7f;qk4^t~gPIvQr_JP*l>XiXmzX^_-u3N*50f*GQ=jJyHgyqm0o}Tp*U--gd7I$+ zOiwC7uQ5V>6)>-zh$!+p(ZIJUD=TaKQ8WymT{*%=X@=|tQ$qa+Yi>lW@(%1`Hhnh$b+Xiv~80cL&XJD^Il92Jc!sA z%&eLqmE45^*^L`g#ttjbh7oeVuv2khvOcv(ZzTlv9{m>0O^1KdE;gf(?b}P~dLP*XfH1 z+!U5EzZw>MtFj*eB6b)mqaBmwC{0ssO=I0@H-j?UA}z|(zr(EYc)!77-3#%l9y=S7 zn)1~uEDsSO?Yl!OE=C(6{Il@hV87(M<9g#SJaU0uH#3F0A%!1w^v*OtTvN-Bk`TAQ zA5u5-B`DZitVYyvT4^}(t*?@wNL5tVonNyGQrqYsgUWo6Zsb{@0K4E3D8(Mil{oxp z&*D1m&_h8ERvEmDh|Ors0Fdhq;|Zge>pCWCQdET`dLGQl=hJ;L2{OSU99p5bPKrw3 zGAYXY_y{6b1Zls`*UNKRu%)Q^y4Mmmbf)v&v`BD1g;tT-nslusJ@5=JW4~x^Ixu6= zY|O}GktwFvuI_J54?+`lLi6j_q){=`O_s6r{+RuJYWO^5@Ckhp&JZ|JNDO7l! z2VT__G{?t7EfUNy*e*97tk?e=_Ts818d-iA`6C`aU;9N>S65eB8h#n@c)4YRDaK zF2sMl=8vrCJmq$Ra`G?8oRh!c^!Ga&@0ra2LK3M{_fQkbBPA}hOF&m`gr*1=?JYSO z52sRBqf!j;-V#^Fgo(*iL17d*jQ73iq`5kO{X@O86;KJXg|Thp_+v0U3Ku#RV$qcl z!wvrD&UWDh|l*%soo4tp!Hsebwjx2iZQm~-(CZ>=q#oSV*F{~Ljbxfx&Rtpsa z-z=b5Ug3A%wO)FjIWMA>-M==wWIRsd<@1th5w?}v<)2nK2#RICWP58#hbF|ST%ONx zXfxB3(IW(HdH-U~fA|^EC2(}}PrCE;F~#<)Y8zU~-m7Nk&XF=~#ijR^Nl@8!JGO3U zO|+<`LV~^d^|`DMAlGo|aDwy7SNG@+PCnNpsl~_(80s~TcyXd$ClZs6b0eSZzjnYs zeRsFYSvc7?FXl8(_4c_5WQM_0qKCme$D!MME7oj}h?^XF0IKNVM3R~HfKYV|m8 z-ToL!EbuAEg}Vg-YwZk3g;u}f$Ml|sShD#&J@n_>QZV#60F|Q)LTXM7pSsP1)K?kZ z;%l0q_`6nw+fh<#(~ZKfZgM4ms5Ldr5n+Bhz#Knp1)^tpO2JtFjX#dtjq@LJWW5fg?yT`sdM=t9_@2;{oaawd6LVVuMxK*1szHY@Kg| zl!t{a(}l+;Kru9j{v9iHMG+Tj3>;SDZ?Ea=({jk?)ChFnKqZkm2n%lWW*>{( zuj=1a%KsHFUJYO|A9ucHU`~SPBqtbJOC&qRc^EXo{fHGR^DfE*QO!x5_cV9mfVOU3 zlO#gV!*HWKPCKx{`8xsXu?LUMK|DqD*dpiUSsh}qLK*RM|4t$ooSQR5%g4SO5Sncn z-ro7`+g2=`yd{Z*Eg88%2|at49m67HP4V_(r~IdDyjIByL%^o{K-Dj<%wmh-XRA!0 zp2-lZf6FzC_*^g&lVcf>3Fr4IJ^^=;jQ9Ov7uT=_{W4`c%me=`yM*NAH-!dDQ=P9n z1fQl?)BVV)V`x7xRP`+|Uqtxv0fE{eAxKO_ypw8q)`$Ak04^&GFt1-RFmiN+s5v% zdgUyDPQa=F2L~1$Q^&*E%PusRp4YFdt84r|P>q7Z%GOKC!ctXL6^s8)#s2G$(P5h^ z&cXBQ`#=*@TRXe!^4KcQ$CGE>T@KL2S`Bx7Nj>153l_$q*uCgnA@=^g+aeu?`=cK3 z(Tb3$^P&37SDZ)w@njabj|iK2N<~0PaG85ZiWs7o!>%EI+?R%C=R}hyGBQ&MF=3#NxmK7>A*P4C^)_{58e^6-R;xhLpJ@A~ z80b4c^T%;K{&l@IAzn>9V@5Gt$`bb3!K5a;$n@D}4q<3)1Hb=7p)x=36e5nmq}CUI zo?Dk;X58pgtWM75bfkrBx#c&H*t}oP+}Ceb0&^}%U!Xz6!}Wj|ju(z#`X|W`;hUkc zXvp1Xy)|0I4pL+ybD5`jKf?!4{J7XQNO<{BB`LCcVqU%0{l;p9iWDP_mmoAjb4^dneVVf~{Lni$_85>peCUE#vN1bwqo`M$2W2;x|=Gl65qe3`P54bzOW>6m7C~^Vgco(L+S$Ty6&s&fo+b-6%EgrqH^y z-CP$fWHlMS_2CODInk8rfL`HK$9ht>KSK4hj_CQJMfLRKc5!v(8@#&pYc#GVY2tqTvGER`PG37>jF8xJTgoAfOBHYTd zTz3=Oi1_3&WS4O$35Tdpgr%QZj7;*X9>)jQ3QW2ozqa3JsN%GWb8P2qJvr@QNVz#g zN8svs=(?4+vM;8&2b0$33rzI66W=XYGFE@y59`+4uGhgp@ln3#~CtC|Cw4RAPEQDkIgfkL*VxY#}+903OtbM8BCs%1b; z8} zQ%19;7HJmxV~OqBen($-Kd_GZNBxZ5x(G3a4o`LvmQq02wzkEC`z*}c_ zhET5xD0|(@N~J&&sC7go@RoYDhK`TenTI|hu@deFg~=R^V=?B_aZM_kl*pX~i&!%q z-cu6D0lkQ;P)JLdcug0AOhOe2;w2Y&~Sx)h0#XubmR72yRL8{T zANeuk?a&MsWC&i4W&w8o#>uX@ZNa}oMlX~Or<32?PQx)e~nFEidH_k*5 zCdC?#V{KR{5*$XGip*;F$27)XamJ5gg-hdBzv#)(cvYgVn>n2X==zkV*H@w*98OUa znvp6tkD=W}46tc{=uxr@)8iz#b61Uhns9`DAB$wni->OOGE~v~n`fNXppd|Crf}2w zRj5}uYU|CMFYtGC_wk;~@37=JlGwriV8vMiBDaffi_bcls6uR;_!~hu)NPOq( zFuBU1qESaVveM6luWh} zVSUD-%z-u)`(0F2ME!w<m@q@Y+uDm843OQ)wErIDbE>O|$)<;*P|Ybd){9(En(=B(#Ugid z%%1cvjb6N#6BC9jpgpV?u50rvN%v1=Kp;K7u+ic^R^azu=uZ%5xQM@59JeR{h=1{n9W%ZKJvN62?IZn1CJx?5S(A*i=nx&CfV5DMUXbOA+? z<9ijGG3)mFTSdP5$G3q53O|A8J2ZYWoD|77D5=^6A@uVK^2wTsN<1sEiV&esr?T*V zCe(2T6tiK*F0G&UxGA?r=wX)zSE3kx^dU{Jy&k~bU9ra^eo7FhGESZtT((4GNq0m^ z?}F7G9OST6VI2=veXwE67;ItBM17TS=~P$8acS4lbi5DhE^Big3>o8C4wEXiI0cNv zgJr&J$qOrit~PMQ=b}EA4`VA2z_a9tG*A-&XOOZP8&9#o87OWY_tx59S85yDW7!wv^^M-K2ql>_cvIz#9Fk`#_f80T$$L7|*I@^UeDOY9FFLT`Y z?8!neF6!G@`hh%S4*!9ABi>jDb;tjGDi1JmWRDOAEY?cr~Z~Np?2fW7MK#?cv zM#VON|7 zU}^_V#?2ueRkR-Pd}wMuu$XmS1x20thHavo!wz=!c-bi=O&m@GX&P#3!|}*llgcvr z$=wXmpD8H|yUVX>K{P>%6hXkkn};g~AhR+R=TFKhH}h8t@M#(c|4&5|wsDh8+UK&5 zyEk0Kaz@Vpr<)j~yqJI%)CxMa{exQl?0Cfl@gKHaYsw=x-wywLr-p*n8TU{4o3$tP zt(cg(BfuN^_8iL18xYjGV(iBha_)L+2p5v~=b2QnGsGlvcI{nw znzWsC2XtRc^?!0V(ESY>pA8PHJ0Yd*R8}0UXE4aDz@?D2lB%m)g(!0Et9HIQL-!FS zVRCN0nOL#`yOb8_vW5&ReF{n#&?1248s%6YXHdlD>-pwhbB5&w1_dKZn(R*e?`ugY zH|J3mk1A?Lq&6M#VcP0DEB^HK*`EVi9FzJ;y@Ydj<7E@YvZuNYF5}$1E*G=?ld&i| z*XgaPg#Dsxx3^rWz^Q9lsM&jGvJ5AcsDUR7d~v74iM$9Bg`wxI+3Uw?%@wa3QUopv z)dAwQa+MlCUB2fP+U@82>_V>A%_jfnm+-Ch|1(0tF#yC^q?~L{Baiwqb{wTRiG3b| zkZg8LBGXUw-4{TPfVe|&J2xMy$7TMOi<>-i^7@Tx?8g5w&u z@nwI%>+fb35A=kCk^@d2yr_Y&usGrEyM(qB=(@?f}M zS7)$;ZaV?#9*t6Lz0jJink-UIB?(X8=`-_M7iVED;&k70Yo-0%q`pOEpZ|U z)7RjCv-(~(4yN(X52-SU{cRj;1$6z7-kWZnOd8Qp9dh_wPD_nnO1@>vrMdjIZ1F0& zOVijNDq^T1xPJ1uhkI^&{1rTD@Vs;L&(Ch*J}>SIl&z=cdnNb64-}u<82;*j_uSYT z{lSG}cN<)F@5{XPm?@-uHB2>ZE~I`lT%_a6y{o$>@?SHg2t?M9s3;!LcL0=@KJBCQ z|0tJbM$LYsW60zt zyi-J1*IV~NWxymDD-hV`@;q_nP`ib`FkPI7e^6AtNV>|-!$U(u4Vp(z1?N%=3%L@R z{89((I?_+foNF1xydNf#k{SpbR8K!nrIPp>e6*Uqg~$V`!*c?IPFjNM-LATh4wxz2 zefs=r$fm1D*ldRLg)3xURLEcNero&x1uP{*AKR)vQWb+P&;{Phn@=z_=tXKN-$ibP zCz@=m4-E}1EG(p9s~;WiPZg6ZPp0X_K`le)PtWF-_E)>K&*~y2(<~@0UNVLdrhuhNZemnHFE!O znDe`E0#^WXecqVqNAHiZF88B{ut^p*5Z7Y}y|Am;YJJqQ)l#w!TlEzXJe6<%!Fuv& zVn}7rDxF{o-`j|4Yj>)R(u_l<< z3Ukyk2>Xv_cvd3>Sg;Uioe57A&Dw8>L81;Y-ky)#Z`Q|FM;iZGH29Ab`MheRP8C4? zpXxh@`Wh3wXEbvF(}}fRcnWy@;j-xOfq~~lgW8!@JZ|E)N5rwBh1`HoD_skZkOruI zfFCGr^JbSDn-t1CIj)NwlPQLb78WrLP^K$BH^vll7Q%C}0zF-h+qkb}BjEE4vO083 z)w?&1`l^zNDE}B7mS+g^M0TP0B7E++<)6;{>hi}6)jZAXF^`4q zf*Mx}#diD7q39~dXMnEf85$-B{GGx>?zW!? zY;jgkDzn3n3u^9g!RTrjl)}~bOKA~K*U$UP^mU}@vKl3Z;%9eP16Xh=`A`< zk7KV;7O#m%PD~-8@{kCq1|wN@@ukDY_cW;uLb3JwX9Y$upUpqL9LSs-DxZz5hlj_P zUM&jHJ^Ob+3qiLd3w6Kscj|s;q65vsk3AWHJ`E*^-iA*&`SaWHMUkRU3L~{1-w;M4 zbQB)yj`+tyj)KA(Q@pE@>t?^*@?1lvHe-RQ^O)% zN4nw?%6Awqn@<>3yf8XM{M++VLWNc;ShY~z*qZ8ZNCj_}@;(x_3wL~@HMQ^DOSUxe zFvZbb9-kvye&r=|A*p7g1T$QqyRKRniy7bJing80SDEwP%Kfv?>jMKQx4j~{K|8JW$ z9U{>*vN*~W1!hm?TS6tilzh?A$g5#gc625h{H=OLXz&KU#q}7P_G?T&$CI)crry|j zj7kRAumd2a>l7o1l}CtDMjBX71m*gwRWJ#m(Bi#NRNrh)4~+tAE4^p*`cxM&dx*_P zk+EDZ0&!*>^9!h+lsVS*50m@nQI+`vgRaa!iFAjRoRbC|CR^OLuq2wiK-XCCyHzRk zP|y%>=06@|!&?=b#x!KOcii+}Ghjo1WV=1@i~{z9RO;#l#npH{jZpk2_fArj-K|}0 z=CL?psA!%ao&Gqk+qDUaK)XMZmvduW5|V>zqVbu%-*K2LKj($4+g6b@#6oySHuxTy znsc!2Ud_gI?z_qR2vXz7d`DASZEI+hr1wHYQsm>2s}uYqxop3{>UoO%Pm1l%SP3Kn z0B_mzh=+dNU;$j;w}BZ}^bJzmlWNr51*rwxiU^7JDm*AVKJ&&l+;0Y0ge2=i?t0RY zT(LW%^zoKRdDZ0542GLIW`c4JFh3WDjt_z~B6GS+jdvnJN8tyHXv)CwYq3Z}h60PV zqs9Rkn@WCJX#3ki;$lwdpuhXMc-GX|7ELhtwgX)wrLt*qNvD7xbwL1#eetgYK}He0 zD#T3%Szi$dh8eF@A~S+zgrdLYd9C&DEuqtcNdD6D=8WhyGBf$+68K$Xr~Inv z_|2pDj|Tg2@c|mFvN57_;i==Qr$^`3^K)OfULgv~s1+k&Bv(gmYBYWTg3Xb=)>PSc zi}KQgZG{&?p~R`8iE4OxPcbw%km$POqqo>BHSZw=s1`;@tFb0N)Ijv#MHK{(7!EQA zkK&?W03KlI8X->&M0riuBz6G~Zo6@fatO!#;j3 z(32f*lNkfeS|voN5bna?6M!P!qxWl`UKM+iMT%<^eUh^(ndXUz)4z&y%bI>FB!3lo zUGgOM7@RqRIZ2MNH`oI(M9=;-|8t>Os;2y6^PgEih$u*=|FeTnWzt_hv0XUZw5u4O zC2AkH0ABrKP`pp-v~9V3(_8NH>7}r9;CN!BTAMbKnne}pfL1Ij-CSwCL!2ZKap4mNEVu^D-h!t6av43IJ5%MPNb0zwL z=_(IScs!O3V0|TgRmDuj4g3WND@f34b#I+lEi`~#DrR=;IyEX_VCy#8uQj{SL_N#A zj2U1Bpy+3Oyv<5R4VZMU;B&cGXZ~jyn8rl;{RD~U?br$ua(y3uYFD@Tn>+%19oz_d zBaQ?q$*MjXS!i~gOSX+JJfEJ=2J{UX#tY(md$Y zHbMRNI!MC|iAno6A?-bbI75npCYJV1f07TDla%Mo=<9j1N310?v-cef>igUlHTsW`8RL`FIxVoOavGjMseWuxY`ZQBYXxzB&XL>1(kViKSlz80> zK0b{x+9b|)!o}(n`5({a<)=gwgS!gws|SX!fE(fAe18RFa66m?*O7L2vyvAX`>6y3ED!%sao~`7tz-{5hG~t6TSN%TLw);WlL<1&}VmuU-Q@;-X4>AAu zlUe{sJ0QS&*x_&?r{Yol$YiDP;W9p`E}Y3)`}1abgKL`?BdNFB&Yy(nXSjk7KVIK7 zt4?nPe3!CQv#U*XJeq&uG_5sPoOk=Ak6zc6-mND;4ii3mKvc&#^>82e2JcEXH_bJC z{Z2c$jm4Ia9x5v}Wrt~r?2rM^pA=wsndh#uE}Kw@aqD&x=hW8k0;@JV#m0q*cy*lQ|!q;7s1a6sU+$o>Vo@Rq#HYHx|&(wK`jQNZ(&3 z`1xJOp5q*ii0sj^*3<(}Q=Vl^u*t;01iN@&W1v_ABD+Q$@@pb-84nK^M@L#W^IzWf zi;j)E8${|1pp!NL928!J1IO>#ohjXHzI#++O#ijEZ3#j0Hs@sup63o1pNIW%-QC6j zc+NnZcRuGD0Ld0EUKM?8)m>(2sO%n&Mc#5ie5D@(h5H++RdwrybXrTx_QDVK`OE)n zdT8-FNIr zNZ`I?>Bv=JQJ~<~^Ic{=V zx!>?QMuPDDxo^8}pJTt5q7chZn8TMH&3K6^qF4cW&k;xuNarlYGUEIqqFM;rY8 zJJ0>^-+6Ui6<&vlf8E_!hGv$ZWcOK`^G;$Un#+|SMjyHbSLmA;nG?N`J}7#KBmMXr z2?KM6D^bi@h{E}us3=4f9bGcn@q0H~Kzt#Y*O>0V&l0t8c5N{W#+u(Q8Uvv%V1&QO zy^6uep`-4iPSwgw1s>CJhTDh;-R}rd)ib@ftFn)l&n$F@C%XARMdx|$x zo`vdN?lL^FBxz~{q~CGj!E_n-i@#FxbsjZ&pGOBf_)ZM2In5R9(ys%^+q&hqZhPbf z1QN$enS8w-}&4(Mz0H8Gx^M`dq6jt+Wz0>W?p_inUa!{p^Utno13SnXOg|s z$!gbBJI*G$svJmx5$^P9XlSrepx-oxJH}Mk)YKFfhR~GB&3tPq(X8N{4yq^pnqw~^ ziTm*!A0Pi)SJuzyc;^0P6&F#Ya_Y$lk+stjPWdP5;?XJ+zpRC?GpOHFCrjGdPyYOs zoG26*e2oz95FKmwN;T>UMYCP^h)&@tI>+u8eMg@A{h^gx)Z^i>Ny(nw{ZX}!73!a3 zUcZ0K4?4^IPMngias=JPL_VcLc60s^mI;G$ODNgyh$`DEVbj^B^Mz4U~q)sq~r9`=8 zvvVuDjVZi>R~u-;T>bvF3M<~Ed(<{!9lG0~c<_6i2yuyo{$F_Kbu1jg*y{{FHaqlU zU5J`8{H2%_8`y3B+-$;F(qD1sgk|4F_mkn3YqY%VjF8lzM|ngXM)qm5b12lQ58inW zTLSVz?Z=lRyJbSpUAt!kOl`CKnG?5*-CUW!{k(iaadz}*r}gWaoBzE1yaZ4L4Gs9X z`Ey2qzSV$^1RF~kW{BpAg@q-b%nI|?Y$S=rZkhi>{^~bYwB7UD5v%-~8jM)kL`EA6 z3t<@A^S8fVEjF@8_rb*B6Hf{EUVBf}a*exM z_go2RCWU36IZ?HH4YPVzEf^c%O~m^L2Vwd+CD{-&*OO371+q^?d)UL)=k@~o4aNjc zur)Qd1q(!=u4~i0Sf-YJ7>;{yz6sQMO^*C*5NKRmUT-E@sk0x!@UQw@XL6p=!jSv0 zc&x{*Q+v+$tp0GB`FNyhi+z48FOB;ds!e;$Rogg!?Pm><_!$l67VU+I>tsNH)E}Gj z<8PZSDPw|~m)?HG$W+SoRxPnjq{{8`k z1u}9Uzx3ClqLk})i3{O)2CjB=6P6CO3&E3pNP$LWtZG%n%d;j%uZab$1CXp+5 zkD!n3^N1$A3s`Cr5-!4>IwJL6}W`1 zCm>%V+CAD@i)h|rU*a>pK3PJXXODpt4+n;sKF$QUERLjdMGt4`yRX4~caWHyVOay> zvW%3Jy*+M!;ZBzvkvELRIfD}zj{V8ZM%`;Y!Le4m6M4E2aV$y!0RcKXtD$(BM%Fex zWqiv&!^2`p?L4iY8QIvQ)tM)By+&sHFY`qrD3}LGtnk%SU%vk0^Vl*MZ8<6mtREk>R(1M>G9ErlFz zOQsPYaV6i#27C-Dvvr*&jOgZyCJr!WaS_4Syq}vrQ@Hd$uc+61Gab2Yzy~@0J@j;F z)uHLWSW(<@zZ~d$$!l3;~V`H@iX};>FqibkEb%A2=xujs2?( zB*#XSCUInP!S6y*YD2MwxD~GE)@&uzY{sdF%#RpG!ntqPicboQ<<$()CsL34&Arlo zB`0*vC*q{!I}#5QrGsL> zDl&7|JH!ZA5hk~`Z=-vczP1m~B`WL24PdtJOnU|6xZYj#wm>`N-#MOc(3?-^F%|=*$HH*GtRrsIH77-m2wqiU61ceFb*W0mV_sT9sCA^C|BpP-rrFs+gju+W872QLZC`@+c@<(S_*41C0siC4m z;BkcQkEE;1VgdwFN)SS^-J^M~$aHu!3GViOp)C8!)5Q)mMx=30%1_Ej=Un`4P`a5Y zwr_(;(LIX(y89@G9>56&Io=7LU{k@S?VT`eqhD}Tnp2q$XRIQ&EX?b(w>Ed}A1`jM zv|p`lA3e;h+ws>?<=%JC4+Zfw@UxoDUmd#{aK~LgaN$&R9J*bGLIF#m(yGjrS}K*g z>=x)Pq$$L1wbZ*UCmn-BT3vOx;n|Lh{yRPMJ5?LzIFU$Bq3lU^bKA5wd*hyFts)nq zQi%_lnGRkese4IQuK&n56v%0cR&%o{yPvje#GIP5Ya&MXM=HYBQF;bJK^UHiz3t)- zT9Ao7FgFoFK*kzaBc?a~8{ZEOgKf+BO9*k{pid>MUfhiw8%R!Da6pJW|;YVO?VYrhnYu8jzF4kn8R4islQ_Bv!|N*c(DBruV~>t(|Xg}SKAGo(HsS&M`$0* zB8SwFT;$-kJZUf1 zdd5TB*|1;3etyNl)7H+NAHgE?<5B;V7s^<3MN6BTSK>xT#&!P>I0bsYm;xD?hJ=b{ z^4KPg3jOqq3|oB$7#J814vrA^=`BE!TtlElJPEW1s9_U5L3o-H7m4$tEhb15^*Re6 zU>Xnkj~~~Ly5XG)jAW$Y$z_u&kju_)z0=dv^B2Ysgx`Oaj!Sqa$wSR=ok^7R?{0zr zYR-hCBEz$2*SjZ_SZVg|sehrq&MMd1V4`G!5R4(v^|ZOlE6dEacPg6Q$kzm*g6mt; zh*UqJk@d}n{hyT)LXRc-`Rq&ihwS}8Nv%7?b19DX-FIu30=iYo1gdWYQ>uS1>DHMd z&rdtMnmchV>MTN*GVNk3~1ec^jBa{MB}o2yT?+o-9Vu9 z78>R2Plr3>MIfCAf>z>lIw{o^zpcgStRM&>@xhGUA%%?9|lGS*Mm~;BR4VIpm(B3e!A0Ulc*|I9e10}Ivq1~5IH=8v&N=^ z`-`^_-mO1^XW{oNT0ij6ZHW(c4Vrm=)tr1Dk_NQv9EtEo5v0r5060`&P?_Y1uwGR8 z-WOcYU4}6&X!qWNz!JrwF%5w!gP~8}snI^vm&-Y)YANLW>`V#9q`JCV37+f2QK%N_ zrsu0XKKZQpo=YX$4{XhOO>Y}Ti|OX{mR4<+_hInIZ00damo6=*sNmX)M~h&T)lwhv z67?U>WpxPG@=sBDIlcXxtk0vQ4G10_xB6Y3%_|Gud*jB%vuCuUJ{V=D@lPj|oN)1w z_`m;A;&s5q??<{JB^aJp6RmTfYTgW00Sk5CTITh~c5%Cn$h)D#F46CPq4dn*oEAVA zlNI-7!Sl!P?LTQkDfN5x6ig6h4L(=-!#U>Zet54KD3eCrK1lLkguAN+PnLUs`Dnvy zk=Uw|-GlJUE}Q$6`3o8QrG8<*;>eZE=q+?QO!ctC8K9j_vCd*rlMbE=WnHk6|KQhvN52Q$AGa5>$iR}6^uZai_CFv*zOf#Q! z`;NgCm0f{ML7=&{b98id>n$N60b&XN@Rz?i5*UrJp^{3` zH3PWhw$65Rm{(X%5=+!IH6EMea6U*R*_#w2FPXGiv~y0uSKrqI2Y>}5g;M9TymuzH z_?R60158N-DOqx}1=AFzJa)C2c6>g9R}I4*K8FV!8(aKV-J=Y2mcAD^QO~VzACF^I z6x*G>cB80^kt1u%Ud_LSgnuu`)n}71VoN*ckpnhFeBLFXdMSkFZhZH5l;Yv> z2@|Qf^{<7HlEI;$66-1C&$Gk0ov2@ni;=~i7|=yStlntWc^sEExQ=v8`Cf{xnH|^K zwUO{Utyx#vZ05|8BrV^a*OH$f3$;;p(B2xzJ5$rr<^&*>Q|6A#2N56zhhp;A|6V@R z0*!ZYkLbeonNlb3|L9gg-VR?!F$hK_L1F9Er~XA%i(f+ZZ#6(uOiawu(o#bMTQNXJ zQBg`VL71bUwUyAV2-`u{1S8sdI8}POKO}DLu%Di3kHc)@f>^vAC_MndHh(wn? zSBR9e0rJD*?3kyeZV)*Ha$TYmcW(E18SW-nbs4pO*zjz&c=&j`fb=HO>+Jd`hDYV~ zfUmyh{l8s*Lfb>i5FgL$%DX!~Qr>f&5IU*i$akXP68*UjX8xov)U@p7`xQP8FdfU? z+=DQwv9j+F*BD(Ob7`xdWt4-a{xnfq9_u1_CzZX?B>mKq(wBR|<+>Iu;hBvxHPt!>4+xG^rcZ=3vC znWuw5AG!0}-(M8?3aV`(w_B2bf0s%73*7GC--+td7!@Pym#Od1tT;{%hZ-zi{xK+P zIkajSSb=yIPhI~&dDvNrdOGuGSZO()I%*cdlnlDuuT~?lFMWs#H$V6CTy{Zhs@(Tm z_PPrv{r_q^6S$c6_m3YHDx$QgC@q$>&dixJi&hn-ETL3XDy2nxNv@q1k(5Ywxz=1= z5=E9s%91@o_FZzxm7V`{&Y5b?8Nc7Z^LxEcUXR-y&AjLNE}!rEnI1j2vWoireaEkF zZ>+!l{CwlB7xCtLZHoMMDfaA-PZMYTc={^dzK4>q_oOWJ(clHwH`)7J$24!Ya0=D; z+Hic%r@!H2eb$&Q&$pTy@cFa4(_3rvbadDo$E6n>+sd*JeBNSxb62wyGjHX;f6(yl zUPZqJpZ^|XzwXYz_75Hie%v4P;Me`MS(kfnGvzf-9q)zjl#H{}@lRCREKc11G$!`f z7XPSURlP+&zAV?9`u$z>w*i~|7F1=fosT`8nl*0Ou`z=_X$<@kSYJLM|9;o`-*1$E z+oJ#JI`(9K>&5cb4;r!Pk4v1w?b6LRs=bySSs z;p`P{m*RgkCFM!_*&*JGpI9HBdQ|&FsmtHHi&T7091E<;-gI>k^3T1%cY2qXpQ?#^ zKd0{Mv*UN?ww%%VXRh|r0h6mtO>f!$d&Ox&B)qOEv8aG=+-5({)Qmm${;bE|0k>W^ zJw2CqVQpXM*4KMl%g%4vS6f#%?`2_z{`}96GK&B74hXofIas^s*7q+TjExf$64JlN zdMFwed$-rU%C`;6mb-tQS$1{rufD_f{S{SbR`IFVmkg7~P8DiB49|Ftkd*q6O85s$ z-;$7b^9B@u>^p4CsyeK$rbsY+pWL?a^Ic>#?y0kR2$jBzSMXy&} zjvcx6ufJ?ygLH94&D}fA77n^rN!`S9J;!aZGyW@N;6aYELeTq|MU@s^LQm^|iXIWF z*;JyNTUpm@$?+@e9$#DK1qxw~6@--lW)+g2<+vu06k@s#~>@eSfKlEc9Dp9^ktF-M0_(PWZx`8a#HrpWg&GL;2}b zbSIATyP7&-^&Y|P#OH$tW}QB?^Kf>svfH<7D#C)7)6RvPmQ3vC_%+u!))~QCEDsv1 zxCI{Tdu>+W_PtmCy=64e>Cx!R=2;3Rs?|o_>YR_KSfiLq{h-0wq3f1z+?0DRWT|t( zA!DnU@eM`0|4Mi^(D00b0lq54-=*3RE-YMZRX*PyuxA%1J)v8%SbSvZ?a$wzXJ0B_ zw7Mc_6Q^XDJ$~iSvo=<5wD}{eZ=XpXaxsOkUFUfC z$B)|6Z%NteA>V&~hpkD@&i!#+qjo-6aisE!eYIC~PTD@yKfRa8ldrna))jHjE<1Ga z9B1=a#nZL5<_iyP*jcq#Gc=b|AGzyvpXWtYwU_5UM+3GjQ2(0OqMCTXFlcN28?z7> zw>xJ|ubk6dwYqM>w0`&Z__&f(PW+V5(1g^zhy~a`j3xP37Wg+vYkQ zjPDv6`V4krht@oF`;?b`$#VNsIWto$lZ@qS;?{PZ@F0F(^z@xO3nMsv%3f+LIeJA| zcV(HYQl5`qpX*~+r~7#ZL|t76>GxASzQ`_2Gr;w0(1P@RRXnxs23Dpez2!bmXnkz4 z%;jZRsm8f(4SOAzj?==opYY0ADta~U(18_!u)9BgB4_mGtv(LE;4ZlrR=#`LxzT^T z`PfSdIF`=x}*;`J)%(GWx#NTaxbaZ=vqu!CR9f z`K8Xy>V_@ht}`)FuYkZbokj$}KF1 zKI=0iX47&r`J|Ty0j_4l7Zzps`^v2yJl^i1k?|jEc+f*;^B4?H`*fRd{WVATY(K4^td`I(|CAztY#g4z#`)TgE1BGSzXx{ghO zeUuM8^A89g7p#4*cWCX&nT~Uda!7%ME$qBg;xFG!zs!n@*XrB8r<<38ulo}FH{t@cN_kF{R1U#2qm zu)*?zys-_vL`m@_*Gp8Vdl%HbQ7!xM%IK-S)u2>u1&Q7%8a{qnT{i`U@V;GQOsxfe zHq@u1>Te&OS7W@=ret~@+I@YmML+)53vuxK#25aWUwd-C<6K>-cOHFr*2OLM3qZro zytNjEUdY$fu)DOs{H?hD=gpi2@@eI7CF1~|W=`b6z}h-!T=+p$TRS8E-TS{ikm+;? z7lke(;dhqa#aeEz=|4Prkc-8!Z6)~WQ5AM*rp;t))!q6_>nwA-=Vye*ue?3o;7#M( z3&SEdXstgL^l@A9{?GdlZ%|2oDN?UQma94TwCiX;eVh)h6GbEhKla%YJIUvJ=_?eD zG`fOFf7LzxIc`00Kqn#&cEi&g5?Va129936W{vTmJ7Obj&rTVCpd~CU zL~HG8BM(p~Uap?E&(f3&F^;34DV_OKD>b*<7&vJg0cUHvc~|F`W_P)69j<9S9=p%e z7i5GM_F8OeQeu!kbi9?D!-(n0p8iAoOm6!0!g!&dNf+BC$8H|qzi8ic|2q-4BkscI zZ+4j+*;-|jnyc?xp%&~aRTJ7pE6kL09Jb!k3?DYEVq1{_%0;6GqL~Lu3T@VW`+)=S z`MR&qjLO>+19EC+?x$AexXk&+N}nEH{Z86%X*mNO!6SK;o9;il@-u?Ed2N6rob4`^ zt9y8!PuaVamv?-G-0Lw~ndt^mD%^PrgQ{#M&dpI%appCS5EVr_9XY>ZxKaM z4tq>SmpXph=AhBT#PF2s`H?TX7o5?49m-dFpOuxQ2i;eWQv8K(kAL0}K2WzB80lfB znCQq=N)J8-GT{g9Q%zB!Xph^&n-_1CK8bFILAGYHtERk{x921apYj4Zm6C}^wr)Rd zRHEv9x9uwhwpyw zap;t0=FpcOwwX~HMpgON<2O302llky2O2eKtFmXR?klr1F=3Y*GUTeRoLlPB_v&Of z@&09cp+{0xmt=Lw{oFSv1nNV^Bv&0)&YZE}<%}mEUk!e{**r<}{kIQ$?s)v*p42=x zX6)w3ipyu9{@3quOwtbuIC_+$e+$&SzX6z+Dp+>J z^{}L*WW$AK!KS8rRkvPH63QnZ_iyYv{DvrJbC2B7et`pnVMWZ1TH~Sp@0r3EikezW z>f;Y+t~Ku}SKnCQ_3)UD{B;#CJRF9r?~eB<8UDwVxv74;yQUfITqx|FedO+y5nZb% zoG*N)_+(kds8LUH@6VhcWLdl;IR9s>d#~lQy!wSWU-n3FjMzUQ8Rj3`Ql0-EPyeh7)oZsm8D`=#cSW@U z9q+&8n){)X1@^yQuNhD_dSTW9+jyAKu6H2kn5n8pV|(%S&R@7N z6U6eE4#j|x8pcpRm5wpN8Rz?X{g(#@9*&&oQx5k;s(Zo*&BV@~j|Ri+_VKD~B_#<8 zFx7Qv-FT#Y>;^k|B~|Uf`boSJ^vbnAqCoiWZ!__Ox#v>n5sDSiy;d9z>@#7K=cM|7 zBD7mJYd9|5-I3v_p7n$0Txx{d2rz@5d-v+?HF(5+U4DDKo&#?+iemeAcx9~ZVVG{*Q3bf} z3+9c4N#l_NAm&2`X06|pD~2D1X`@5=fdlJKa9ovE2_0oPFg-Hy!%HsY0`J;- zScNteAY7Daysfhi643Bdef6Qvu^_U?Exw9Ek=SqMh{=;zj^D%8>mC$2GPh_9j3K5j z_`9y^-!W!p7T)n#ylzu P#Jq)8)RAb?N$J+$Lv!%{WlxX=`XkJp@Pp6Z{sgdqSJ zz>U?n?dE-V|5?v|LhEZUo<23=apTQLuYnne_GW6ytL}dO6AN&yc>lGv_s*KSi#PZK zEAPTc@Yc%7s(>@AUyOf$-*VV}fu|;#zWy3_@e3#fC)0gxMN-d5*LY85txd1;vB}Ma9O1+8V{g8rj>~w7rf2JUb@Q z)@Wuz%&?T`h?o%gJ17qRf=7q7{m?M{Rqbr1M?{5MgvKN#%r=-lGb+j=E+{G7)+i_` zDQH@FG(4VYWn>T?8WIs?ku*CFNJdtjc@9S$9~z!02t{KBG4Y&ejLQq-ghfTiMe!}e zlcJ+K`;yaQW0K%K;N?PnN>XS_k`?~we|$IXg-d;6C!Ww&K>rIhIy5Qhe|g@7(Bufb zt~+1a9nTO(38F)S#Uar#oT!*EGz=5Xh>Q*A$ApA+y6QUhVhN$i7F-K1D&h+H93Cd% zqL^%||G9iS&)`TPTvRON2-t!U6ciH(g*+~w!(k~EqQD3W%H<1qEKzuPiQyCxkH_Vq zEK$%likK%7q9T?kd~}h(v7F zi%3G@V|<2zg?@fGZZVMIi+Sr@(Zc%NB(c7$Kj_LSXPzcsvXhved+Qgunnr%)`V2lqIp`5haFGFaZV=8J0?n5E#Blz~gcR zA|6Wu!y^QSFXjt*sE99OX*R|q1O_M~On}eESt>C?U@(}w@Id$35`G>bFfdROa|^Zv zhNyhJQ^I77wN6RYJpmDOxhP9@PgFfuh>2mgCuXa-h?*xLVy;lklIRl^&xN@Q#z)0m zmLSByLO?Jcim{}V#JEC0V6^A3(;eG}6%L=r<8jz2Epk-B6A=oy@WqO*kb??W1T!!m zkI#~u-36EQnV&y%PMiowo~n8QwIY#SFjd=$DO zJKY2&_w-$O>jWAvU&Iv&*%?hx za;}2+5EK^N>?|Hpa;}0y1Y#kdr8*&0g@>Xr^rC#0rV%KiDg=ZJ8({1#9#BG600OHz zl*eZYLZ}K35n(9GV`oCtHWB6sVEdCT2B9iEK2ONuVlc+DGMexSRUsfku7ITtX+EJU zI0VD@3fU2QKA|cAfeixzDqyEC@`;KkAaGK|((0E_s0snWgaVefy!oW6@L}K;!sLz} zedLp>0uVli@=%s4o>Ub+%H_biLBLXnCshSzk9?7s&(i8dvhw9~xv=rUVW&zkQdJ-k zSOK8|c4l@MsVW3SEa0&-A;L&i0f-2Na|o6oq^jT$_`}jf7$a2$AYw5GR;H{dJw~bu z0pY`WDmxHTRWKgt7969oGs0t}s$eJw=E0bV9i_)eRRIVJ?Te+oE=-~-C`Z79LoRlT zi(HiAXEm@eWl0_d5>7(v9vQNBvl1Z1V${DP8x+0RlzS~ z3E`}fozjx1iV*e%IeZ~IEm$Z~72;$L4(Hg(M4~EiybQG>W@kz-l&Ff32d95rmZVE4 zQ57)?cl}_^$WC!dR0SZ=-C0^U2qmh5L*O8rr6x?Oijc!Wd2kzpon;o02(Bt990sto zOD`f+1#aKL)KM(vveOqugsK2UAQ1D}+Kmtqs)9pA_)M6cdKVF@0uUiz#1pc#c_SiJ z1t74L6YyACH;4#TL19~)1BWwwc8+I6gsK1pMl2p%(+ClvDmVlr1$rYZ(j_7~BS2sq zRSc)`>_7-rAs`q}#Ajz!N-zjj5%2_DcIsU$Q5Ad*kIz$CDJ`)?Rd5I#%ds6QLJptL5=5dZaH=d6vvmzxOsWbGRt<2b!P0#w zF{vsz1kM{+I>r=}s)FC-hiR9XozYiJstVLQet5#pa6&p-m~?Z`@R`xUF+mYgo%g{= zJte8_*_LrJVN}~sM08MCs1^P&7>3&YR(7~wt5}Qc7>yxFIE06L7dZ{2!?9Jm;@A4e z;MBSYq1a~KYX5JW*@yltId6qX-FO7igy_-!)A%>qT@Xad(?oyb;#&3DZ)_3d1q6@s z#2E<)(pdvdN3l!4{!1{RjqE@6$`l<0nFL`*dHu5e2qNwI`hWae^cU`KeYAe69D+=S zu%W#0jPsp;M(_;pN3#8^ZOc&?F%C7s2yz<2 zP6~t|dUqJ1$Z?P2G@`T2{Zi&%15TX`%fq%yr)%DV%OQt9oYn3(qO(s4x6~Cr`?}KX9dQ!UihwpAfF(p67}&B6Bf~xaf#}1DbZ0{ zk%2x{kkSd6wEW&NLXi?h@hZ_-PacHtJ`J4XGOXqPT^Uptmy{@qV~Ni4&eKq;22Q06 z>&SUVEK;He2xg%OL8C}2rBoan6iv1Ol{)DYx31XZFu9F!R3MRYG*qB?v|bkw-k*&DRt5JU}v zT3tIQFhUU$g{RfwcA~S2lS2-B0mnmzWm3h6MMxB|q&!b_)}PA9;*S8QREG5mRc2Cz zL>c0&4(Ah{^?tzj;rD>kAj9glgAt36D60R7&Qesmmv|pIw`Ew~T0NNLMMxCY1x06N zu8rFE062GKScMskScF7Ty-;+Plfk&x`mi9=fuOd-H=h}?2#KOPqNG{)2YqN&o?2-M zoS`zTWiWe})#j}#rXt?B2nU@ZjkhoEL<(@ljz2@(y1>Xf3R`i47~6#{0X3`$9l z35sYJRKFA*^`k1U|K+|2avp-3l_sAFif9&u*Qnh!MMsT4=k1`P4Z9W)RMfc9Oi;wY zMWEWfQ*_kR$t^u%0TU^MstI9&BKM$iFIc;SijMkI)kyQbJc7J|pzbpi&SQXT8@8l; zRCJQAi`COC*e1z9ju00fx< zK}9LFGC`5LL~&WsQM$7lo)iOSj|}R8X0Oic((k-hbktmf*EMed^Fjvo8DoMXb&2A* zl0p5mH_^-hK?Xxm3vk>dCMbz6N&BwosOtNTv95*);silOJxgYSlIW7O`-+a5bk*hS zn866*3PD8`6fi+abV=HSMMqUvCaZE3U{e)>s!JXx8KBz6U@0dSon(1txXp4%C|xG0 z*HuhN5?zw^W6@D}3QAXh8;T&U5Y+N}_?iid)Fp~5i;mjF39;K`iXa6LRMbe#-ktAO zzw>6%Q3KL!i%)P6

      6HP(R%imWS&LyL}D|GDI53l~9}A*iTX@k~&pE>V11bd;jg z*+Dk|b6Ey;<4-0ia=t`yYtd0F_;+ji!0Chv1T`!5n@muIE)jOBcFz_a74iwIN(M~4 z3@S%al|i#0bcsNe9vC3{Y(ob}26xopk5=I{R=ToNhr-lNz_5 z35n1pxOpPw=%S;Hh7=9E2$&ifl+jBjC_j;e9Qu6M=LfuLsPYoONo2KYO7 z7ajFzaq3$~93z7|=g$O1=n~~tynzXdXch#j-RVU~<@g@%^Lv!> zZ6+u}mk3n5-;0h~5s1b89(6^l4}-cQb&2BoqN7~Q)-Rq0n+O3A)MhcylL?B{C5rcp zj+(~Ndr%0NjWQ_rJSHeomnaS}ItmN)KCsFGX6z8uth}!=L6N!yE}9M>7#(HjbJ}H& zGJ+&SP<6>uUA^;lC0X4|yTRzBX2Z-I#~l%*9D zRMeJcCMZ&ua8$cXjE=guaSdm+3xceKprR(D8Vp(msY`(B@QTqUXX(I!YhYP@6gyF6Tf{ z%Wt~}6BMaS6mJAAs7Vcnn}eObf@twOUm6{?Vos}8I$##bpe~g%K}mE; z+MPy6)u?ScUk#W_8Pv&Mx(u?C=#sQYjgBhcb^Fd)z?_mn{S(dvCDA2mry3nKrEsfg z?PLU51wpMVgDNH{i7rX|)##`~pMc=eQxL=jf{HTI@5i73CAuW-TBD-^TBlb|28@>s z>h^3VD2Xmfd)MfwkZF4reF5VsgW6or1SQcWX$Kn})r9PGEdWfO3@Vu0pFsgibV=IB zMn{c2rEXRQm=iLn&=pKjq%Kk1Y;;su=DojCK$8+>bSdu@0~C=Iu1g)BHae;CNLbEk zNa(msQZqj?Arb31a8XG)+vuoWlN3i~1;NoD1huVi8?V>-s`{P3jgGqSZe&yrSAGvd zP*Lj+GC>i#M0L5*QI9U=j(7o>$10T3>qy2{p+i z_0Jt9B#ACbd*kS+2@7NAjsc9T49d;Uu=7>*JBJ({HTI~jmpx#H$)My4nV=-PB<+)< zqcA-?GXyZ-WYqRAc_Ri{NpwltEk{R%tm-}P_gVFw&IBdVC27wb9kqQ>b|J2`czdUI zt5da1P!e5|cFxgJyL19<+N>i~R4;R51_em!62(79M>VyMub2&Ln*>2cxvyk`B6W%4 zqNAg>J06IP0ZfDp%IX6X6sb!TFC87_@zC3;&F4eSO3`~Dg90RViQ=e}M&TC&rGGaV z+?JC18g_Ib@}I11^jDE~tZ7QU27>HeHRSidRm{V^Yd8ES)8Nl-0fJ1a9RmONf4{{> AIsgCw literal 0 HcmV?d00001 diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/testDesign/VersionUpdate/test list for 1.3.6.xmind b/nezha-fronted/static/ueditor-1.4.3.3/_test/testDesign/VersionUpdate/test list for 1.3.6.xmind new file mode 100644 index 0000000000000000000000000000000000000000..ac11a8d235c0e4daf0f704a95ea3e71a1bf9e63e GIT binary patch literal 83728 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

      D-yBVWz%Q^N)~ySLP0zHQwKMrQ}Uteeu?- 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%0A9I7BWRb`Nu({#LJ5aIsl30ce6_9&V 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 !{eF`NvbGA^c%&#%@dzgpy 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 E2PXftod5s; literal 0 HcmV?d00001 diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/testDesign/demo_1.3.0/IEAutolinkFalse_demo.html b/nezha-fronted/static/ueditor-1.4.3.3/_test/testDesign/demo_1.3.0/IEAutolinkFalse_demo.html new file mode 100644 index 000000000..7d96f2696 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/testDesign/demo_1.3.0/IEAutolinkFalse_demo.html @@ -0,0 +1,175 @@ + + + + 完整demo + + + + + + + + + + + + + + +

      + +
      +
      +
      + + + + + + + + + + + +
      +
      + + + + + + + +
      + +
      + + +
      + +
      +
      + + +
      + + + + \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/testDesign/demo_1.3.0/uparse.html b/nezha-fronted/static/ueditor-1.4.3.3/_test/testDesign/demo_1.3.0/uparse.html new file mode 100644 index 000000000..addf2d2de --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/testDesign/demo_1.3.0/uparse.html @@ -0,0 +1,179 @@ + + + + + + + + + + +

      解析编辑的内容

      +
      +
        +
      1. +

        + asdfsadf +

        +
      2. +
          +
        1. +

          + asfd +

          +
        2. +
            +
          1. +

            + asdf +

            +
          2. +
              +
            1. +

              + asdf +

              +
            2. +
                +
              1. +

                + asdf +

                +
              2. +
                  +
                1. +

                  + asdf     +

                  +
                2. +
                +
              +
            +
          +
        +
      +
        +
      • +

        + asdf +

        +
      • +
          +
        • +

          + sadf +

          +
        • +
            +
          • +

            + sdfsadf +

            +
          • +
              +
            • +

              +
              +

              +
            • +
            +
          +
        +
      +

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

      +
      bindEvents:{
      +            'ready':function(){
      +                utils.cssRule('anchor',
      +                    '.anchorclass{background: url(\''
      +                        + this.options.themePath
      +                        + this.options.theme +'/images/anchor.gif\') no-repeat scroll left center transparent;border: 1px dotted #0000FF;cursor: auto;display: inline-block;height: 16px;width: 15px;}',
      +                    this.document);
      +            }
      +        },
      +

      +
      +

      +
      +
      +
      asdf




















      + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + 1 + + 6 + + o + + 6 + + 6 + + 6 + + 6 + + 6 + + 6 +
      +
      + + + + + diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/testDesign/demo_1.3.6/Demo_3831.html b/nezha-fronted/static/ueditor-1.4.3.3/_test/testDesign/demo_1.3.6/Demo_3831.html new file mode 100644 index 000000000..943d86cfc --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/testDesign/demo_1.3.6/Demo_3831.html @@ -0,0 +1,175 @@ + + + + 完整demo + + + + + + + + + + +
      +

      完整demo

      + +
      +
      +
      + + + + + + + + + + + +
      +
      + + + + + + + +
      + +
      + + +
      + +
      +
      + + +
      + + + + \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/testDesign/demo_1.3.6/Demo_contentchange.html b/nezha-fronted/static/ueditor-1.4.3.3/_test/testDesign/demo_1.3.6/Demo_contentchange.html new file mode 100644 index 000000000..51d43565e --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/testDesign/demo_1.3.6/Demo_contentchange.html @@ -0,0 +1,178 @@ + + + + 完整demo + + + + + + + + + + +
      +

      完整demo

      + +
      +
      +
      + + + + + + + + + + + +
      +
      + + + + + + + +
      + +
      + + +
      + +
      +
      + + +
      + + + + \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/testDesign/demo_1.4.0/uparsedemo.html b/nezha-fronted/static/ueditor-1.4.3.3/_test/testDesign/demo_1.4.0/uparsedemo.html new file mode 100644 index 000000000..45cc4c7a6 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/testDesign/demo_1.4.0/uparsedemo.html @@ -0,0 +1,51 @@ + + + + + + + + + +

      解析编辑的内容

      +
      + +
      +               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;
      +        },
      +        
      +
      + + + + + + diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/testDesign/offical site.xmind b/nezha-fronted/static/ueditor-1.4.3.3/_test/testDesign/offical site.xmind new file mode 100644 index 0000000000000000000000000000000000000000..f9513ec1476840e5bb3bfbcbd13b8b9ff68331d7 GIT binary patch literal 161615 zcmeEv2UHZ-7dNJ85@R%$Xs|{R6$?9Mry!t4)L=stgT|IEv%Syks@PCt1T3i7uz^@W zRIrN*8e{KWW5dQ$>;){?zB{|JyMYaVHTll@zH`WliLkSC-@EU=TYmSxcl-4C^t0L? zUwrX}$8QsRclL1k=L`6|mf=M0Mrbvau6i_m>)!$X*2Kb?SfySU&=hGWXxfC)N%T^s zP9D&-e^}SHRMRFbC(=np8oiDQXsXjU?GWhCzoQ9!Q^y80HJfyPBeY7L6#gqRz<=Pk ze*6P|DE~IcyZN62{lgSytym{gY6AU3OiH;@7wA7AkQ4~~eFp^k4-6!5%-?rlpuca) zhd+uWYPm^o)=4|-HF{HEv#wZIyesYRTlxckUzb<=^7I4y^r-Shhg*38H(}OS;ZL7` z#)jS2(;U-+!#u@MSRt8w?B?X|W~9gk|1 zI`uz4%75Cl38&ODAP`yuNDD?GBu1kIg%f0%m1Y$T!!=P#;W?FvQ_Ex;p;4hHWh%8& zDdG$3YCP?Fq}?P{tJ|xh6%K$&Cko4 znY(#Pe)^pJmE-d!Z1eZ!Y@hf`6iSWM#DEOiXt7PWkp_@)5yy!n3PuXz>Kuarr?nDX zVjv9$u|b7eG%y7V&ahbNNniv`QY3<)2*tm^MyX)s+=8W>KZ-75kux+Y*DEb5MrWZp zwaF|;jRv*QSZeMzx|ijy2`cu&|s-FXLo1Zsr)h zM5;B(lxl$zm%5`t2!tTf4jLLpWYRS;Gg2j|H#O1ehnGW0DAr;kA&m<376VOVBC(m# zYE_H|cRLvZM==U>5Xw(WDwsd1oVVjDR)-mM0u{~>uy3_`Lao!0jErI2PD3cb5$AGP z7p3HF-({TV&9s<#J~%%G;D=jY-I# z=$!Y5P#2g;O3lK51V*DshqF=>fv}udZ#225j?=Vr6Xay9d}XiHY&{Zfp^GHi_>`9xnX_ZcN3E66L}|??B}T~&6fIXM5gm!pEFu%Rl~D>2Ag=ph z{Typ%qI0f)pMvBdZLL$S(s1cQjz^y9FYXrdrgj4lfx2~{G+M1gf zo0~W}KmGTdjOpNT$dqyzm2Ic4<@9=uSY%=gCQZxBN-J2p4Wub2BQk&TCdXjQG6W|{ z7Sk9xi%~-}7PAgvBr-w)66_3Uld*!d0}#apHIOL8NV9dr5+jv|~l+i@JmZ9-5HPSJW=rIku7j7F!ID*l0s2<_r^S=Vj1re~D%cElu;8Zd+~nx$GX z%PK``i$X%NmNJ1H@7vI@MhM|tqx^|ebK}!N4$2`QFbnmJ%8Zz#jDV0!NRf;+3Iz%i zVs^(IR6x)I=O!vxJwIoATJD^v+$B!O^g|Y&)LST2&&nyld?3~}o2 zf_U)K690wnMkGp;mSAYg!Wz_aP&X>6Mak(z61QT7qF}0>jtiqP0Op4*#N~4O# zalJ`K>jB#+>;9k^A;6s+bf}ix&1n#cmP1B})2!MoU=X!ftI#7xR?o01HKmlh7b1)% zF(<3?C#S;O3+C(sSuR7PJRx!licl@r>BL$y_{vhuXyGGJRu3XWDBVpH6VMpxbYlvV ze#=jea!~$|&4cI!m>#Fqw1Sd|2$NDLU^N;}#me2fPZ%mdDVMG5BB0<}=EkQ1$neg$ z*}ByhYwr3l&ApRds8L}7_lpv3@RyRtcXV9?e2GG&lQSB<+(EjmC4g|AQyVo1CgubR zi^V81b4ndv$1xX}$vSOv-uC3&c`K~DoS@Q&$f5wp8Ka0*i$rDxL5NY(s3B-vB0=5i5=@Aa zLZ>X2LbU+r%1>Wwja^}fy~=R>{dOfu=(Ivc!T?fDXe^kJk}7l>tqGKnJAU8-l0=;& zvSxtJS>>SoA)G)&G^-U#L~;-{k%dzz44{!9_SCq8`)JU4@UO!={6J1PHn})C;v{iwZLv473*chuPu+r!EIXH7|arb^FTvO`EJUlI^gAT`}hGT9P|`g*9rO z{Ub2B4yL%-03yIwO%k(OE*Gg7fdyBK6|6x_3fu|-AY7zNTm^$Dn2?s2w%(O|Zgd<( z{CYE|(d*S^D8HW|;3laEGw3Zki$+0t@m!?kIr zVhwFXtRXKt%8o)iM)DzoK^hdS%%C?T6r*BTy_zM&YONX9DN4gs_HhU?igXHwZ5%KJ z>#V6T80(Db*4TC6bLY<4WL+^YZ{v=<9SNm|R6msBjb5T2u4GH2rFK>k6pA>dnHSu&1=gt2 zVCILc6%NW%s8xuyYBO!nNDUH9pi;>&$^glmzk4pUkfbmOja>Xv5a5Ey=-lba0MmSw zq+pcEfGH56SSA&lq+*H?D>W=hgMoKLog{=bE^tbUoo?Rx9o8iuhmHt!I+awX(#piR zo+XS@+GxgPIug^AQ6(^U5)gAz=mf2JIastNKW%6EL6cCZAuJ|DYoJ)A84>Hn0+m!O zlSqxF^FhE`k|ZF?hAfQ(mP^~5KO-wQG1HnE>)@{&iPO_+&SEl}0E|}BG8R&xoPcBG zM48COMgtW>dcsK~c9wM#;BOQ2HYJurgA{ODy#@h1Kx2X(fl3U3xhthIvP_t6qk+*h zU`!?RutzSr(`SKRDTjtYPa7lxt;o#EP)4OS36%yFAb}WHMyuLr;E+Iau1EgT6kt?2 zZzq&ep}-m)*rkQQ4ImPNF3DJ^!pjcAl6UCfSS0J&Rt zKpc51a=bMv5ip%H%y24L(rCf~%;g~LF)LIGHDyFB21Kkai|gAaOwfc&G-s!0oiQzU z{!Z|(-yytfm*p)j7y2+76+%R+C&U(+Sfr*@U^s+29B0c!$Uu@;)rgDq+ezBtm4Cx# zJ;4wdCy^51aOrd?BUb29Mx#->V>2ZX5Qqy1XpLHIO`eiFZwv2o+5$m4zro*u2&f=( z0+`tU2>=mlwNZ&lNtIqJ5y&VBsaFZ)YO|;;PQY_PfCvd!hi}T<+$qk)Q&}x0G?QkQ zlTiwS(g4`0*HQvPD3zmSbF8+v1BgpHcaU4|mZd=m2(<~<<6@D)NE1eZKw;EE)<+;I z6G+-<5ELzN!f)27$+^>#ax%8t7txM60Y4#l%$>W9w;vs%XqRScvwC_>JeF@@H>_`rrFodpAK0nL)xl}Eq4&zy@+ zA`*=j#{ix(npG$zl0m3w(kj6oy5R~*p}-aA*m5#M$a_mOwe~}azGzud)>6lW_Fd{~;Hs~;rJgwfX z%)#EpT#$Ic!0b^~&i3Uw+h>)U--m20LO`i7H7k&*4J?HUIUT7M7&StLxJ-tX-&l}u zCWX$K7fhZ8Yx^K`fn9Tf;Rhrc;t2RlE+pjE$L6gqtH0h)_y`Rn$2ds;$`KiaQ*x=4 zWh_#O(c;e2qYz&DoR$QJ16mu_;@u8$w;~_HBveA{%u2JAl%YmkB3BWRG|@n1mfD?o zKzIj1r*kKiWs=>^<+&BN6Yz=;Wzu^xkVf@Vjh?m`2(^qO6$CA(NrOcrD}(Rx3yTW? zly{DquXXw@)()@&8}oMj1|CKk1^RviK@rAa)+miyiA=xYp(Qd_qBSa|79B*`guBH9TPOs>=+H<1I-7%u$a}K!OGC&Bc*!KXwLa{c@%y zP^z_*iNJI+y-KZDq9TCtP=iKZ7T9#Ne0CZT#o2XJIb=veVT#bf{_tcG(x69zLOQAk8uqZkU8 zRWvJA5GckfsM2_M_o!#0?hOD3Rjw(&o+1W+5c{T@0zqa2(W2mh%1BArvV^ zLZL)%#&EGx2=&%d5EC7zRF_U=+2}*HB#k=5H@o@ap~Tp^xm%*_Kf3V6F{TgU2%^v` zEPAyGD%B{B1~+3O5tLq|Izwq6(9RJGhhjK~$#NZtgZhVY1knpL0)s*(P-x6h`=^t# z0+SgLK&IZEAp`gg#aw*yj7fQ`c(4;vS1ydO|J5;|4`Bx>5@=OI9aO%9gHC8w0*hK@ zLIg@EIQe_t$i@yKC8S6f0dX0QgZc-u1JSEhB!i)5&Wtc(mQn}^PEK)D>G<9*AOL&| zoH1UmE$5N5V_9C}`2U6-sKSgx&5|59v8Y0as$?P+oC`1-Rc9og`;B%MZ#m6ZR3^(DpfkJRr zYZQpV3=ldM0S8l*rO|TRUGqxhEPPL(BgWXQmQ3Y60JZbG*YE)gq;#8BwT}Y8?FNO(mHi} z{?>Hs&foqsJ~>B7P$F8wm}!BS1Wk#m%{XNM$6IbLon7ZgNRbc^(#~CBKWyL_)rTlY z(8@xg1;9=PX)sYb0&KgO!#R&yGv*sGRM`e+Ny_Iu4hJAoHMP zm6Qb4(^8d4s#Gi8BGx2H3TP)ZVaH3X>6wtO=IcG#kK>5mL`uvW72qMb-oTO?OaMr= zP*FxV**OA!Eao)hb{715j=bMaMj1*cG+Qh>kqp5tN{JaG2(5^s>C!qK>OA3q85Cx? zES^*er=aBp6H}~Fzw-g1txn{lIEGVVlrysewH`{mC^5tFWo9&EDx(7VVITqlRA0I* znl0pl0odb;j~W1~)~n?f38It;F@#lOW(_4KrBFv-mJa|HAiyA(gOPBo<6TJOQm?^F zvx|@F4n%cPA}T2&F&ngI5l6^SDd3=50S5X+?@nlGDD|RgrwOprwl9Mxlu{9KtMwomSgPy;3GK~3o#l6GP#COGnmngV`810LM$AMh)R3u{PuevV7;?j-d$Y3=idcy5V0KUM<~jOnh9EA(YZ^Q(TD&_ z6P)`NlA*cLJ98KAf+B=+XpmBdlS_mYBNkCmNhb#|L&nHuGP*QCV&f75r%qi1BU|RJ zoVUZt0}%t*3zVv3a2U;iLN$?6%Ho#NuD$*37yu+r^ZD+W-`aV3YgU#+LqNzxq)KZR zYxJxbv6y9;h840bDsr#yK~h~nn1ArOU8G1Mwg?%sQ74e=I5P?7j1(NfX*j9dJq(}> z>=wrk$WQ*gAgR1EFvO%1F*-zU6cb{pNQSBrC}csTT9I3y7!e9xE93by&*dMoVO zfy!w_ZGp4hoCQums3F}!yYpvhI64OU(=m2CVEz%6_wVPe2qc6+FVe86MMcAD0EJX8 zGimh(f^$1I2$ujXc8u-c<@yl=t5eGjGPOyslY%WI4PulKv$)c&+TqjTF5AkUm9tKr zR4{oem}dusZnx8Rr_&*<9})!M2AKf2;7T28RI`j8CnR8wARQ-hm%HQv0k}KG$&i2V zY?G8uqSL6Mwn+;GW0(LyOt=fgfR=#-Y+Ds<748xt{}Wg2l>^r0zva#N{a^3~ffKA8 zCIYaWFym&EL}5^B5Iw~*Zq+O}7;vP~$s1b^#5Jkw@GtGyKJV|^>c-uUv#i+?C=C)+ zjzCUVj2IxvLJ5=>QirKHw=M}(=n8Qc(f#);CFBcIFB+@PDE%zs)$xNM!9+M!vE6RkOCCRp1tg&2 zQcjOU0EMd{j>ilXV^EkGeOZr;r%qw8ksQj-#)AHae=&L7pn|&=P(;Ww3Y`ef1Xu8v@P5KUa44KsQgNI~V-n+H3Q#&3rIx{|K6fL85_;G2P`g8Dzqsb3 zgaaz&)k3j^P@5G3JqDox9I%%`?K4u=OMum(0gn^DsiOcyPd$9j6wg#r9p4}|Jp?0S}00_xRg{eB&k=EP#nbybS6Yn z7WCm+fTOSv9n?!q#K%vbpmZvhGy}3iz%f=cIKn!a0@o`Mw@UiIHW3(tBWkTt$LWl; z#0c06gG03^)UcE-2D43GNE1#>p_GaEP#(OWGJuPdAmY|oP*kiX#cD#YHeza;RT|tn zG5@uRz!8xK(<$Y0gGMF5_25Fvg#x)ug}POea7+;nWI2SxVIn@1GfoqMFsxYs_v|UO z1~FV#qmT)8a-m!SeuO&%NuW4jLk{}?+C&Icq!G+AXVEYQomwb|N`9lpAk&pe^xF_i z@E+iH8VB`vCc@p^o%6$_09=^m77MNwi_J2z39ivGS>V1lwGr$u&c(8qKnBiQqrP_ z(_jLFtxRNM6k4d@fND5gpp)s!RD0U? z{(o(kP&o_7OJ#6DfKjj2SafoZA>haH=KuH65hIL;xvTr4(blm=a%`- zJtj~CWGpoyMuQZR{YJPe5l+>~Nyg35ZN5O_zhe}#N^yPTF9fJKJZBib` z9iQ2TS8}a692?S#Oe1-sj+@mHwTO`k6)37wsN@PL^fQtYR;3Y%%be|jYoFluJh;!- z$&=i4I29e4laXpK26kLI?5+~RF(j8epzQ-vGEkZKZfv&O-UTwa`v*~olqw2JL$n%{ zFu#Um*~H(Y70|S$ppBpvXe)jmZEaV~|MNV2;f$9HCCAFyE@tm%yQCg*a^7}p zJ$%FU8h=|Ofr0m0R;lr;heuWT^UsY0P-rC3m$5)47Wl8e|9tViuc_oATfYIU($P2n zrr&_$ZB4XrTe+z1yL;>n28~i8;$SSk7Pt+^ekYD?hE1F3m=RoC_+DF`SsTz4yiOC` zDg;?0#?H@wzOp~izl56OD*;XWmQ3e=%(*SnwxnwSMMD)0KYO0^yI~-uERg+z9@~>m z`E|6dN(p(^wl2EQAKs!Wd3a#(=bzWb{{z;=-54u1{`LC5>IhLX==W+3QSz{#tslq# zH@zWX8~?kW5AWSC!&QY52Y4k4r~nnP4Hhu}NX*qStu70n@-z>4M&70n?^b_87N zR?!@yqB(>UWvFNlQGPR`islgSY$+W3_}dNI){5p3uE9q|a|kDNVnbtGnN!gm!rola z0XaEfw~FQvB^@MfjYs&>Ko_L9qB(>^P%4^3ywfV~@Z+-ks-igrR?!@yqB(>O1*vEb z;YhDRLaL%UgiFKbisld%%^@n9L-0rRDw;!7G>2dyvHXEvW<_&|islenhIIt7{7pv{ z%^{ro$hMtq#XJ?wA)rLb#)*pN5EacK%5=MZAH(y0&__jch>GSAr7TiKbBK!O5Kf!? zerlwmIfUkeh)Tislfu;}!3EepNJwfHo)<%^{q=h!Y>E zXbw>V4^%XVV5EOPn^w^r!nK;JqB+Fhq@$uagv&9`islfU&ENQki)zaYeLwayrwOZQ z4&mfQMRSOX<`AXKI9Aad0uZGSx~QO{IYdQsh>GSA{Jjo%MRSOlRplJ9Kr5OceYv7J1ZHoZQPCX29w}8chp1={QPCWtqB+ErRk;<-A#68Y{&zQjS2Txc zTG1S$qB(@-pH4qlG>52Y4q=DgUGrNN%^@n9LsT?}aCZmuf8IZ+qB(@5GSAZdy}RG>72$<02oD+^=X3VPbUdDuFAS zL-1EF!bx&yd{NOH;$26G|A(7Hlw8tZa-+Yk8$mB-cd-|Ah-h4Hmxy}MjUY^6){1o^ zrH1w8O8(l;pp$!eM7|vt-KTfAYF~MN1lw|_FX4ZYZDt1Zzm-P!o8yZZ4hNsPECJ#M9Tt1)UvG|NdXw2Kg2hK5Z3qFul>(zdpbB!xQpz zkB)1b#CiOo4fjrN;58dLEgxF2s^zHXv)eMWa&xU$uZ|k*+pJk$|MUS#CvWE0oL0%> zkHIs7J+8M{y!bK@0-7l>y0tZumd~ucCpvC_t&qSK-Kx|J@Hv`Mqi$Tv-9%tbu5E6i zO$M&JJ`+aR0IMD9-}q*apyHRYR2nX9d%nkk=?NOefPD3pIB`UDd|dM$^LW^t0lNxjh8p`A|c+twV7zKxCR=izboEB+h8 zc6BRxB*r+`?BVs|>w6|X8x-=O{iv7O=8=UptG4>YqfaGRq5I1oJxXtupt-oA=;YEp z@x#CLh|K%}_~F0J@;Z0_wE8X5do$U!JUmR3V11q>uU5Z|-&hxYP}##{+mGIrB42a{ ziAZb!FB+Rc`JF#=Id9UpMSpD(^~*eaaa-F)XN0Qnt9q{-i9C|R=r0?tPMSIM z$xyG*nVshh?GP#i@i6p~+-e#?;B5wPv@9OlKk||3!OHOdt?E?gWzI%H*KOw9x#uSR zxO(Gn=vH zzUuR|&x^kv#id?Z&u(qhe_2Gr$rUY6|CRC6K<3ybv#wyjPwNvSI&5qZ<@g?VcmL5$aGh{({k8QMn0?i|d>asPDd^FyoB4mm%vl}wut#?EiRXQ%ZC&g9*7btvPoI9% zJZ@OPt97O>eUG-#)+f3QHs(Z4Xk0X_{@u&t64x7N5@DSN9m59!|K3e3VW!#09Sz?) ztWkm?tiRqA*oiD|y}~*oLaNh3Vs#O-NZMw)zD8 z?Eh8Cq@OR%%38Kcxn3N-;lP5;cV;7n`SZd+5LYIe7?aPX)@HALXR?x3YWH}DdY?*b z`p4{MJWHknOSXob>^`h%)59%N9~9hUA5xZA(xoRo@4ZeP*0=t=`kvpV4h<>FkmTKu zslux>+gIKm^fLB3$dhU3-&hR$zc8$AQA*`tBz|zCgp}}uTTxeAKY8pN z&?@%tb>N0S`2KtP!I3k)#!G)SWGs)r9F&#dGdHDc*w5ac$0eaz4W`z%yX`LOWn(bJAEG>JUFt$ z&_)S0!iUB$ih11T{`}y~C*1CK)2H`ebD`6%6$77E_UO2TmxZUdCx^T(CVR|n_vCQ& zP$IO*C!dk9S?iG?A^1GXGZbL8h&X5bY4Q`L1kBjtL1zc-INifX`sU&%9)@lpFwd2iKcoMQ^GX`L zboq_Sp4Sc(3^-mH3Aq_uGb>ed{o(bKeNWxH6Z~`x_wdA_19JVLac}7OSGg}|Ey<`c zKKWIC@S|D9)T*8Vp+UyU=X!pguzSUXS;4spZ9P1OgWirzNHfN+yMb+}9eTLm`1DpG zV*^8y@T73qUlC*X^lMkAdd^E-ufeb16t2))Zxm2$lj1^RR_dI^q<*; zh%ear$42;RQ2$ISaC)O5=g!PpcjJxpO)yNkI;^K)+yLy`5~bOB@;Boi-q`(8^&tCM z_T^_|{oB_5YVl&eOiQC#h> z*0%mRZGn7dll0XRuT%Y)S;voS4|{cQ)wb>G;dieLF*+X}4yxM! zQBJ?WPCdR13YpV2tk2+3&*)m)eRMra)c5@fHz!X#Fz3)J@LpQQrzA$4+q*0;#7EcL z@xY(p|4o|Ft?{VAhl2R2#56y|c`7x7m;VV~Qx|yb*Za2RnH~J}{uuI!j@O1ZFJmMc z_{O}nPyX8z&ElW^2JEoet1G*~71_Rh%e94|5G|ISIghI@Bs)C2@?>%czXdPa^LpFn zwLCkObFNhv&mG{<6c=fE>tr{8{OfsT>%w}cInAgF4k36Beqb0v^w&V^1G5aEB8u8u z?)Q#q?UUNocU7l-#}0vG%v+T|hV*F?nxgF2rU1oO%-*CZ#?^a(I)+$OpT!(B? zVho0Nx+nqH?bxv+a{{E`dc?Hs?wtzO;qBhIkZl|KDAs1sCB`kIYWF6vbp7)0URi1L zRVD#vM=p_Gd-JL53q@d!yElw!8q;`Xa_R*MY!-frpG5+jhA-X7UWTC;)~o&F=;pzo zUoXUM+B!V!$|8qIErxY~nT}@LUYppum28dz<~a4Gu9AmfIB!lmfN^>C=+?Nynf2kv zj%mQNUzaQ@=6;ILIeM|`-xdP|T%P*q!R8CsMii`YVKZme+GcNaM0i_gljWn0`BB=0 zb$HjV$HUv4_}n>faEC{O!vGxr)u;Vj(8+1L-u~2g@X0ZAUHF|cKNxJ&=1psU_6*$y zKEUH(@R3~>nihGypv8t-O80G5BlZjty_nC?R&l+{E>4RYZ@f& zP3n01YF4*NF$?2Lq-sZErV*TwB|{rDd~$C~?Jk8W8@>W+i=10f5CTf$#hg3M;2mSJCtKtA7t!FDM^^a;cxvcIS#)~hL9N+clX0w3iV-=5j^2AuXJaLR`^ z$O0d0(r3Q&?)UFhyAFh37qYXL);N83(||du#G{G5uJm0vs#oXDXLFMxm&(>ZkLYq~ zH0%P^UD>6+1dI;lZ84j~FseUyKsI+XysMtRz{u$Y5&R4Z7 zdwPC%dj+pSqPt{r+tEYQ7w;%KJ8<8T)l-P@X`b!FgSD?MNK`QQbe;Jy!J@nDn>lg73rR}}Rvn$o^FuO5c z`0TSNaU>e~)soi+*~5PFn%bn%HPM-z)#c~?xW~*rlQ>h9DPqaq@w@9T+WY&?>^+tCKdGNuxXd)^#ADNum~DR! zYITmf{k(=M{i@GjEgNp$I{au&<>RUEbYtWq)31i4hh1(r$LbgK+#oGLhkcg*)FFJeShV~GZ@+MXN|5+BR#$L)qlJ)!F!)I zC^IKY*_wRf>3#m%IIl~?U|Gj^FHXF*a(H_IwJ3Y=rv91R!N)H=!@JHNxnO9UjOtz+ z;Dy;$GP@T;jF&lE1bXB2q$NIc_x6qM?g=h0`_%AK8gXjR7uD70(|X7bdd(cvXv|$> z-P0pif?L{X^R}8j+IU<$xlZuQ?T)uqOHZcGRjphSHk$Xf>=f!Ypz)i->pdJj>CZo4 zdv$#~)NmE66Vp<4t431Cnj2d-j}IzpzOlj3!$YRcX_-0at0i|%=GHtERIqPjOI2dG zDqd%LpG}0#wqj=C?Z?f5Lmo#P#(&oF>FgT#{cs<{+!~Xrt@xx`@tjK28+M5AIr+PO zuTJ&|>~!SpfXk_ULpxpe!KgSY1wehsFNlio26j@R_r8#I~V zE{=XY$Md=J=#0I}U%v658GO3_?HYcIrr%j*3te~BfN{3ldoVkA4>Rpez{Z)cMlbPd zSaa|Lk6S&Hs2l5UR1Hnan(*7RHKT79e6!hiTkn9ZyybnpjbA(}7-Sm}Sdb>8Vrq2% zBBqMx&DNpM{aauAe6`p+`r_9-1T)uoXoo3k&wdCjHg~=^u$txWm3!63?ED!P@Wk=c zt5px!Jz>kLonc!Q)E^oDve~81=$JY&q%Q#I+=Y6xS({$p zcjxn@s=OnYobV0!a31rUfeeNnc>eqXxQ8>AEN~Fk4+oTJ3XgNc?_bH^cp`A&NK(dQ06Ba(n;HvSmyZG?Uu=}!+uk~^A0P+& z#C3y>-+rAw=SFzkO;69EidougQ~!y zUj*4Z|8>EG4may`ISU>|QEHRyO&XX2=-_szQlCX6dwf1rQ8dJUfTOFx`97reoM0mC+M1NTPOY(Aw}88;$$X4jDV z_3P5Vw5;6nN3Rame>nW5Dlu%GBv04yVAZ(QE5d7X%cFZH{gK$vPr3KU@k1L7$y|H; zYOQ-e59*TLr$<&*-_7^CcdIS0*?2)uRA0iZC&>`Y_feR0ep7$B_)vQ@5 z+gi408GbY{r0f-uS-U(yMJTn{^CQ0-w*a&JgVaZ+006(f4GsB8$9c#wR!Kr)Ke#~oS}meS4(jqv!lLiO*9H0cta|i&Z|~sSXMOccU}kL{ zGix0CpiUQXR_1($w+lBtd=ZLVxiDjhc5a&?-hs!0+X`>SE^g`Ze8Y^tD+-Luj%b>NA?T)E$MO3qzGX@i8if!$nm}Y(W6r4 zjqdvMq8_z%!>WM6F))IwgyI)I+r_qo%gOh|x8}AJV@BrX+X260EIP#dP#xE74BVRe#aV zPn+*M_(S#;rO(sE4ath`(l^5XHdk>QY^aV!wyoHn--?Z40FnGJpIw;Sc2L5NYrZd^ zUAm*68are{+j;*6orI zlEq;hQTHW#7#F|lkCpVhcX2=%6Jwao{G+yH0s`f9~gw zTt4wSetZ_dlAqV?kmVov11OeOi&A!$8sXPpf73p0)221|?_SxWe>)yRjcHRC4O?$I z2QF6sR!e?d1%b)(?IoLae)Yp%b-U?(BT~9u8{Xq{re^qpCC9mLzoNlro>_d<*5}iM zUg!9zj@NI0j9I?^L6ydhGON6Nn)Nn&=d=D)L}A>a)%~QiQpfp%%yt|*BiJJcVryh_ zT=v#yx+@v$mo1yvv#- zi(IXV%lvo!H16%pBe!b#6c#?+)-`0z)@#=*@4WW_3`PHCYxz7x|I_Fg^>rKue|3=e zqs0qeYi}QkDQ@{vy?Oj@(U@I6BaA&gJY--g9!_Zk&RVn3Y26ntoOkEc%v%tH_kHd3 zgHumEJYKx&Lf5nP!jA>bQLTCkP@zwwNj>`xIqsGGHsZ-2eNMj}Xv#l9z9B}o zzS{9xmxo)IDVF+f2ctf&S8>c@qW`K5L;H{EyywRNza&0A@N9K*gz(9;svZZy+lm}@ z0Z{fwDPMU;M~t@wsA}KYozm#Snjy*K?}9gRGiCv}f?oS}EnYn|q)zXo74^gYYrwiK z3ZC8d_g%%Izwdu@ZT$FE+@}Y=JVjbfeHT?f^(-a*=z45%aABR7%2)OFZhesWr{+tK zU%vweKkI#QkK|0l_QUV2s+<`3;_#k-;C-UJc?u}2gxcouW_2-}b(%UoQmzJCSw6{Z#754X= zSA6d1HD8Y=d9Z5tuL3p@OO0taw{e{K=ja|m;-79$Fddn5sFm>HzRD4vZTnmLwCd)) zDlGv$RIsqavAEGMIy7G7bIfZ=@xysHxurkK^N2CV-rl;Em5;BO**3OehgF(Y6FyDO z3zqq{uI>>DpuzRJrqc@jgOib)`zWRzo?jh+hn&NJDndMeKC&phdWQyeJHw>5fU}Gq zdS&qbKJ($3BCjfy<7V9nE)>3~y=MIG8wb5o!;YQ|U)eot`2@Y@dia@1T>QwIcJS_1 z({DSB-adW*8qaOTKg#=E{4!|UJ^(j^I$!2`XxpFZUj-CG%u8LXn9;QH&h4V_2l;gM zX{_a@X`FO3+K=Oj0V@qdi8kA`SW?NzDzEV?7B9&QRBCl z4*0=F1*G}pvxP5`D|sA*Tu;aBAv?xy?9+1eh{O(0mK+^&96QuHoeS7Cc1-To=i*1m-d>%G64jr@y+?Q1m>0PqG z16qyz&`q6UgN=utfILpItnPMi_mLqlTV`*&^t|IG|DW&m z8M$)KXID|bfg66=Qa$u^_Tn!A6uZ54`b}ZyS1U*Nxu9qfkxE3QPN=^(v@mSWrRbq^ zU~gxAzUxf>u6gHrjGJE&86q8DTh|uvEW9^tXU4#6@4&8OS`9rH*eb0@ zN=W~N_Fg5CP{+^L8_Zwd4LkYAdH~icPfGe> z)SAzd$1l4yug%wap({`KK(j_Hx|F}_b{3V`ZQ5Zk&rT65*n6FXjgq%)TGKn-i#l@< zwKQ555@62TOy2YQ4i8%~Z~GL_tkg!SeP4qc7N0$P`>89LgNO9JcD7^e{jUAah$lCf z*YrJh|5al0?R5)Zgz67Gz>6P}H0!}~m3H|Q2!tq7cqfJjSL*S{jp&N#JfMOVEx=GBX{k9J+T`?k#s)6Jg`#l}zgEwI{{ zPl~@TQr=ni^4y;4tFJ%5-Lqyv?}X%CRmaRh(yeE29R0q7r1<=+iQhhH!3S72SH2E- zJXP)oUhdu?Y;Zy#(sfVww*l=J55@0JZ+X+Wv}??ziOT!}t>kWgjik=2*LO`RIJ4-! zYRTRrq~Et^+8pmOw%PPrem}ojHFRCzPl@~m#@%rr8 zD^0GBym#!|pQ`jvFFYT%Y;pUeidqfB66SPRAD=CoCaY( zwCUsORx6YRe4iA1sl}02Vfm{X6>ZF^b^GSsHuByf!39$ckIyb!@Z!LpVd}m;w>+w~ z;?JJn^MMABpY|F5_V$`eo2rc4xqVNkeMMEj^G~Xj@FaTwB;CqyEq-y&`^IGq_KIh{ zgZoDR7`DV3QFEH2_3^mpg-e!?7~jb+F5l27wQIh~^At58b|)8f*^eI4!bjn;)^pq^ zmxwnbh9Pm!2b>xg?l=EMM&RXR8-pXx_DfJNPu}@_`CwR_i4)1nJD-o+Gwd~0XnotD zUeC0lZ@YbZq8mNx`7M*zle`&kdf&R)G~sSucpShKAw3Iwy@;s|sxk39h>*To6g+xh zm%dZ0Awvrbx;EO-VqeFkuo`(k(;g`s02@zk78Yd`75mKmqIw-HI{nPUdSSc0#}xM} z)--5%@M_eqRWEOUB47H~uJ#XVjTH~tTDW&o?47Zyguw0TI$PlLu>Ip;b@!hmZcEXA z-jDh}XcY4D!L$2Y4xH&dFmTaiA7QfroQg{^|iJ` zrVqllU9Uf3Rf{Fshei3PRur~f7-p$I?9}}pe31{h$!u#j6Zff%myi zK|EZa&^*6d)mNGw$3yik!3pm0y{F&nuirj?rhi?$1-!fSgS}fV8PLDwxb_jvp1l3O z_!@g6An#8=?}wYU`nS*OVsB^jU|1sL)tg-KPVYVD;f+qy9;jQ#fiu5$={SIb4vl-& z&6j6qV=#)sj?FHRZ%-_qH|j)n^iTs{JpokIu~*C5UqQg$6&`Qz{B?@5Znp!OeX|?( z&-~%;kcKJJ>W~*ZQhi9aX6~D#>+`xg9r2E7E5gIt3=3JeksZ`#Zq3#0wqNh^W9Gxr zA^L>yZ-V=IJ>1^^+^g=+%#l)xE`G6fSnsd_<4(T5xSkyjXnnX(vllIgzG?3B`o1{e!19cP%SKtx zS+j~`>J~rjiw*rFFnifA5#JWa7x(mz=P`#S5Jb}9JO3OW@n|=A>HE4*`l?RqNYExl z^``9Iu@gY3Tiw?r%&$GK*V+6lOtlT0YY9)*8?uaT(cr?UqWwbkg>8ww#0`rF`1-f< zZs5Byf5?h!6RH$H!q3YK^E(8jCnZ}iDz|T))Zyuv(a#Hy#m#&3GADoBvvG5mOQN5| zep7p9&(C*tv(^ePK6PVnbjy}UskjmGKl%2`4;Xc^Q~HqnI&EJ!>JgY?lFp*}=m(Z@ z2HU;i@p`?Rq@9hr*dlPBe{kQUjXYbgp7v?yz71BjUlA3a81jIAeYW*6_491Ni$_HX z?>3A34OIHgZr;X4QS@ikZ^qsHtIpLVOdud=T+ZNk&1t0y;p`pJ_+Tv9)4=js7DHEJd->`*PM z*_b}J*M5~+SQvG!_vr3#68-a*Exr>v(l=Y<8879NzP!hnv*<06zS~%QyXxm(SDO@< zAfHvJiIji&D%G?7r?aKA>a-5;aNd(Td*zV?JyZ{mr6NRTkAy?M|iX>rVg!Y_v$Dr}{_ z6tugu{$k@vTc+jod(^aXv$&(*@>_65aHRj4K9niy_v4;l9k714bJkLDe7e2xY^RR8 zc6Jlh?$yZwgFm0P@m$~fKK=@Q!JXhuBa0(y#vUB=Ra~Qh&wO_+=yLUB=*_04YInw@ zh4=00?H80;yL(#fvqjOrMD*TI|B!vQ&4sw5W2f!#yZe0Uv;2^b2|fKb?i=-}(_(UT z>cWtpdL*ovyTto+mDOpgw?2x5Z^BNY4ey;k=*9A-LtfIFO->xvYwGM7e(evRB|g=I z27bAF_>{-}Rz!V46f{gl+XYjDgjey|Mur!*oqmVidU{l!8BzE5 z&9Pc#yXvk>uO6))a?>)@k899+OlLvxR_;WP*(bIuR?j!Lx|o^S!zuES3;M8k;ug`P zmabNhasjTJ3)r*u{tshs85d>Oy@6sNg3=(;f;0+BBPk#-G)RaDDBUGF zz|h?cAxL+Rph$x#-6`GO-F5cxJU*}g^E)4o-z4VV_ugx-xUOq0Dy_QzWHLE7{z4{F z?);5ov;jgbdi-#RyXGn4XmrE+^|apUgUUrhX(@{VQtq(>S-*ZCAS?T?su$L$H6?EY znmpx^fp3nW@I}f(0LL}(nlQ<6ml0v11*$y{pyvpT?yBLaB61z-2Xy0#9lGwt0fVyG z|6DB!)9XP0%ue`9^c;LPaHTg32t(wfUjRCaAxDgKFsdM+s3v#E6EzIU1%eQt2DFA7 z^`?FK;abLmA%B%d%BqnNfN*7Xq=@wnd>h7pB=rdLT$#b6yy@OAzBoyMXc2uws~PAY z%a+)XI9QQkYu}gr8!Cv7PN>S9pWZ8VnT@gWXJs`udh^C6Ue(5V44Vyjfjc2ahGkAZU z_oFR9IjS=doL=ooE(+xSN9vAqL5D$ve+q z=l%Dy^T;5NMem12uIhAg$_2{CKP&k^kk55K@E->CcLD2uI>RZt&rr*2sZ`x;Q9!Fy z_18w^P-=a&0;UA07C3#93!nhYGxbZ`v{I}9TMo60(HFJ}`rm=Ozj)4OqctL0EVd&$ zBC4#AnWJV4l)1f*l_#;qfU&C0d4M3s_79us04%WdANc6l@5JWZO68h5n{1H#7;7F$ZI-#~q zkRg*JPzI_2yahO@Uj+_y7Za;B{#wU0WzobjY#zZauYGDiyLv>+%GmKPE&<3mR5Nze zKV;be1}poKw#wGp`cuZq&u_-E#$wmiKZ~91s{L){=ku!vlvo!hP0faNSI6sxUZSnB z_+@f4J)rc zJCjEPqwDPB{>y+(#sE&Y4$uW`EvWI>mfMwcEH?QIekVJV>GMvYsR9*MRKmlH)T?gp zJ~W%V#+F-FyqW+HN3y-c`abxvgzVJt;}_0`pFSxDOq|-pf_j}@o=xbF|G_R|H)I{I zy`Ze#-~A4PwW#RO1{d~3+XR3~wMLrB2Uj@|hhaCQF!H*>X z_mt!DU4_p2))c-Br^y$9E!C_R0zu{fu;Z}=h=Fm6Sh3~RjYhoWDq0LYDWc+0h>SIZ zx7arY-YhW!0|I`)WfdaTGp}&V6hk5*N(qwIsbqh>yq(A`Xvk&Fv$RO}U9W6%ml;2u z9{^wGY&QvT=%5*a!Y)q3ganhExK}}!8w*sjF zQt)vt@r6tv6^zJae;^=^4T(tu!#1(dqFAd^8?R1JpNlJTtGh5aby_&Tat1O)4L)sZ zxbk&I0JNhiay&2wM+T3K*jGo?Yu4HYaV*r`d;9^{YLLHviow~xyGyDY4qWrDNa~=q zkBsNFz=s$VsPxsoP+-UivNQ?S(4v$yhCbl8v$dYr%r5Fhq9Iu`BpaL}$6&V(l-=lJ zyz{%q-mz@T3yrfdm~k?^?Em~MN?FaxqDHnLIncAPQ~d=Imsx&4144|UqN$E* z`oF)E@?B-YpsLEg<^|OF$=(s$y}xeC|4(;^qFmqDixHb1rQBrh&l)B_zHteFy8n>z znzb#V5^(zJK=*tP1kd%&$vKsIK(AG#kZ>MKGXbJ2OaREYMy1U6k;>{uGa&HDLrT%E zW4v}l?k@tScex^vg&)&a00u>t6{5d>0#ggzWye>@rp=xZd?SAkzrvY@>)IdgS^d#UYtFS#?+b?MQVL zkT`vg1)AmU`2f#Ar9cWGCMax13TFRDJsimqKZbPL0VSGR)AlugE10Fj7(yWoE?SEei=Or1SUuG5uIZ2^%x5=$ zuqT!f{`E`OxaOWu=jSWI9ohdA9ZP}B8n;Zw3`@8?Prv};1&0l2DPpUpW6Dn8kL+Q( zh>-?ZcOBxp*~sX~NhGrNY|54QV{>b_^ZoaxWON{kXk6@5&reX9DHlhnf;$Z zvCZ`0wR5eIaY~wNWpfgL0icyrqsO7#bl(Bfv(jmL?_cvrIS{_4Ay!v5oI&IQ2}?OZ zPl1px&k~U0GHGpZ-fKmOK2=HgPxItfa{`eykQS=)*=P?CLMnN2IZf?-W#+>fiAKzv z3Ymww@o$1NegF791?&U}0UiMp0V#nTkjG@=>IVR~476*2b6NzIAgd5Uf*x~l3*5f2 zQL$FBNS#lREJL+#qLw;PNVJ@wtZdNZ;Q<`*ir2)}s&|?Q2yhFxlT`)*560%(CkY&+ ziB1wtTo+9np~+k}6q5Q174^PKUJ6k6S4W?(&iE0&Px$!YiKAGE-6L9Jfk+4psd7Zt zz&Y4b_u9~b8X3}ylsau2#IxsUXVszW&6o0o?6ui<3HhxY0m;A-TyoV zW%C|e>pSE@BcT$x{UgeevMb?H;6jw%sWo7xg~Q^DfV^Nador3C+-p}L%td8Y!yAJZ zN4yEGslJt0jik+JOCgk9?N6XrK*;wIsiXka77Fi-WXk-sM=g5*Q%zQCq$mKW1@bOI z^99tF*W?>oshNe=W-}0t|I9FsFTvWXU}zfLzhw5rRfyE?BE5O zq~A^}vCm0gR;;qIXOf_cyVeka({CXRIRg~7B6!NIhprc!yN#!oN{7M^g~{!7L#Bim z=gW6zO2-az4gpK4ZBYajYN83yIK`p0eL}8C3avR@&Irwc>eHa&McXw5Zu!Wt5g|_k z(3auMN#zROZ-BF-_FxO}y#x-5<5WHi-v_v0s7e?XMUibKc!bb?q^_5U&uVGF5mNWS zxlR0Tv_d45gux(3tNB2>i$;!fHYdFa_;b+MlS5(Btrw|{6!J=f`)@GGXQy0nKlec_6`-wNiym9RErG*BF zvsq3!o*90Ulmh7Vf4g20nRN8b?*=VK<9(pQwwh%O;yGzk|0yq!N|m%}Wwx!d9$}L3 zA_4M^a;pwhSEvG~3~f(G+v*<|(eKO$v;n7DipJK;id4QJ53yqQUjJOKh|kjV*3OqYcD+t(izGrwNBo+INEVPOSW;zW`av!hu#>O-J;^_bc zbO(~A2j~FGw4gOzT>0rmPopJT*OYRq4!d^xY)Q5|kO^iV&j*<#cnb6gm#>{8~!lX0;MM+FD$!_3NVeCPikjA%}OC|O8rL=~kKU=p#$>~@7cLtkdrI-vJVmwCLS--MCQRE%v^Z=%F z)R;AOv03AF%TM0zXyiByfak|MaT>qUx!XTyEH01XRTj)IJG!A9MIw6%667}gOGl0U(yoE45ZUM=LNxi3pix*>Z(tHptQ>FdfnSA#YKU+cq&skv`Eu!f(zl-lTe9F2x$_0A&YEq8vc z8eO^o+73<}wK;V`i2${4_%~0!V zqL&~&iS&69Lt#kL_PMWRXHO`hdVh+Z<#Otmn_QN~`ML@@OQO?xfJ%p)_0qe{CpARf z6k^_c8->-WznY#TD@7ep5dHvKa?_<+P0J@=KgEp6utAN@e)(b|>LwGNu&nKFoGMl2{IXI}IbUV4EcjI$8UDU2S9cg?>8*9xs z8C9(0L z{9NE?l55(pdmhd;+vU)PuVfSv-ARxH(P}gVThV2HHPGgOdz5EQ*E>1>$Te+L<|T97 z!FZwVwpIM@{V*Z%vYp`9tP@Fg$17Swj`AUfsjrl(uuattX&x$?+`4`G+?{Vr%u+8>E|_bg3?uK} zFLr8Nt8g8Cb30E`f~3k>FIn!UV01fL;)QP91<4UdH;iHL_~+>-bsIWJ@&e(^%cpZq zD3{?EOktymI!#zRYWkg&<`k z+oHC8&Yj{y)>VcPFH@H?b<{i9h(viQF8RRN;8?SwLjL5r$3WHW9E74!A|`&@SGxtD zZZjziH0h+0C-)^f$h-IzFGm{MF>ShKjUCW6j^I%$Qr03H7XEv*``Nrh-I?Z8)fwBC z_#b(YyP3=L!$IKF-!FBAT&}NZv#6T9PGz&~k|P3Q3}$g>2>WoCl6nmu&v2PUgc*x6mKXPW_QTNlPifJ3H^pq-@Y?beF^N_vx}m?kJJ z`X!bevRQKTEv5%YIyIw@zfF|wiv;fcmWuH^Vq@Lmu+Nt=XEE9GS#2LOd;Ztb<#jm7 z;u>xUbNC+q(DbpT>3PpxLsmX&8nvZ}*b7)wD|ojMoLX<&O3}Bk1clgOXOWW*P=b24;ou#YlSEl57llt;WJ zpmak8-}F&et$Vs4ho5*&Rn9<{N(E^3>k1szXnYU(U%q)1mJaluG>s7s(2;}vcYeOR zD~&^(eS>#3(#=C$ReD|zNzfImvq4(7Mor*-0?P%%=Xl1mi&AgDxuTHdQuq}QS{;i z0kfzrhbsu^jZL7ZPFgmG_gG(p%?jyzISGp`4Rja*&mEdv^SF@ zKbE=BdWqKvdbP(&WIuj+QlUW+dnWcc`zELVL;UplKzc0W<$|8HRF`+Q5d_&f=Syx| z{a!0^SyC>UV)qvwCm7*uwe#{5rE;gm)Q*d22DY;^o!ZR)u1}qx`&uR_cy^I0G*u40 zFrpE~UL0u2`8u6s>*=QWt#gtWQE@f?Zh(yS8zM$3h2o-$$w)dM)A9*Vl^yG z!1!QcU)|X7)#`*?SH>dhCaXdEV(SX!dOTURMkx91qY7Q4LTnPf;z(j}km!Dn)`=%R zr$We7IhQj1<02lx6PITW8ZIRXQ&CBInXHEL+H*y&r_>Jw=o($p?ht+?kJDrM_Z>RE zM)HQlEiy!wj18R{L-+P&Et%z_8PuYt9u9rHCulK_>zHK`b(?UbP%n8!E)RC-Jl9p^ zl2^|O8|X^+sM?Sq??np<>YXsxzthc^DMVbFuyCtxtZZ7d0-KQZ|9C<$QowG%&kUDA z^xrhz-2}+ZegbgWdt>5k5)2{;%LaYOYLknJQqi0yQ?*A&hc#=ve~MblmjAVc{I6x{ z|Fe(juP^3R@C)J|J=p}!T)V3>%;VV_O>CSNWDaD9d5oYIlbOPI0zE}xTAyiMrFBXf zg`odst~n$=en|Lt@Wj{GM~fclz0Q}jK~+QvnmZ6Tb7O$d90SN2C}w>yUg4S-ku=^n z&y3N+Vq+`{8v$}Gq_BEX3Q?UKFOsU_yuBN`=@r{DKrvvG1w%GtU-vQQt*mSWonWA% z6A|D=5hsxC=Ln~H&Po8#4#BatFn_=UOlEMFkm*~+&j4z_Q86~)p9tR%XmJ858z6dJ znf7u>^Lq1{Vp+wnH|M&^%S1`U>h8|EUu=!qd#mAaAPL~52c*0OXwwwkUv^33NgbGp z3(xo@uH5tb6+w6S@%od}9e}|p^cLCLs+^j!^a3&sMfeh+8!7Ps(*vG{fJ)3K;~`U| zGM%D=Vhu$!2Q{1_9PlUe$1}$GYNl4 z7b*#vfHy!Dk%`s)mO&0Fn`ZY3%;0fLvzpbz`%24{BR(#;2vJ6uyAlV0(m#+j$|1P7 zNI5rK&{}#1iKykEgC#jmlL?$cw#J;Ivs^Y&A}*u_aKchQ?Mmqym|C zzB*KtHQ*D$kkOGv|AkDMOyC-6RwMm1%L=@1j@$0w6#EyEWzvhIjpLy*DJ>hcKFahp zq(GSB)L%E`Z@81k)UW$4OaiEWn;!zI2>Q_wZ-_x?8HZ%ZWDnR|;hPGn)>P1fsdmv%@%F81 zzE&7TBh)DW5IT6EwZhMcH9kRUCw$f`JzDo7rG$uVz`~FiGw9B5lP$&aqug7@_iI4J z-QlXathCR(SW`KwUl9>d)IFkanl(v3T6;B;7)o{@cCh_xg{oGl!lO`!~&xVfhg;W$w{~uQ*xhYbl{`paUA)XG}*Ujh`u#Pd4Yev*+iR zu_+TOBVdELU2zRHvVm~^HuTZ#7wKUvi;(k46?|*vRrtXCr%}F+hM_`|(xI@x>;cHguMi(3`3_A% zSm*iG0hpzJ4mNna&bp!g*q}Q(V+rDNSEZ?C@)s11bVHjJ$o&GRJlO*zCJ9ffS;^%- z8+AkT98w+T-_N~YEX#$KDlZ*GQq0+M2FU-|dn#DpYT5Y__cF?bpl<3DbT^wM-OZ1i zp4M%51(Jt%Ysr%0bZ>yvxw|FRqxI;LBO1mj@GBi_EhVYOT23#Imu=@--zeop8;ievG|xXhrXKg$EqjO5MO?q@N!S{NL|#G?J)}7d z6fq?3O>xpILdEpC_vbq25}1M7$3)lWaoi<)wcoLzzEPGF9=V(poA28^*@U@yl)2vX z^|%J~2G>1^eyeRu05i)t_fa!t(2H=`=g|t2YRVwl{gdN&bn*-*C4rIBw&OnzFlb0d z_^$lf+_~dcOhJmGdS%#}+0FJSQGzkr z=C*P)h`X{^B~{cSpT+Kea-TWu3o`gwZYD|4^%h623_qqA&!0@UH&2^8#c(`&{mVA2 zr4%5fCR^-?zBrm9{+*}@Z9AJDif^Kro2~>k@p60%ELxWqAkTG>f2Z~+u5u>~YS%i_ zimz~*Fo)kykFykAk#8*k(NioNKwCrb2#OylXnW^05#iD{#^GzT5@=VF7xWas5+b7(+l4r)e@`p*9i;~5PfB-9FxA0?Ig_6Ez&H#-JPJaWg^HVHd=BS& zX4O&ABKP&FOmbzv;bSAyE}mb0e6Yf|O8UPA-Adx+)bHMiC#64Cm&=i>S7nkM$p@+Y8L?eqh* z{a>|UpF^on3kK-G%!`vH5y0&9L%bwcF3YW}r7nWW66$m2+moG1bXmgrbbo z=K+PDRl9_%G4EztSPS7vBO(b*8@qPcz5~J1GJskalZF1FqC-rFEF&QbYa9hfZLj3$ zc3Spb0(j`9-xL}W8Wv&rC$^Sm@q%L1aH9J<^pBIqWy>*E8w;*`R%v)^u`6%M3+RcyQqq_NpU(Yu;A zO5Kv_AH>lxCcR(885}M*%3_SS0TXvt>!z+%GQT8T0ZH>is9|LAX#BXSs}<1g2lez) zyx3q^zzj{#cs2h6>s=?+g}8=(A}n-8bw!ZsOl^*HV;+UH*SIU`VIS0gWW?2Uk$R(4 zjqZ3#fB@Xo$FgzwzGj!<4tR8Y!nsp9LZ`ejE`bfu!KF?a}r%O=yiU@i-ZWqIJ}~( z0F3>>3vJP~sfSYc0*OyUaEvG zs6FYTM{eMU)8iNyyM%4(LcySp_OCCTkGWHsN>k}oY@=+a5>yN-L-il9noSnGi9Atr z|7T%L29f*yJoFk@+F_{cM1V!S8d3|nnnGN;t+@@>HiiuGA$v$;IWTrE1xV*KHjVZ` z@=ts3hc4)T8mLs4J0^QbRy(&qjLS=1nPGXXQBt8LHMDFzzFnq+NSpMDtIRt+&TrG) zk)3D%*Sc0?L_Ap+_O&rU1-NlFayD>xa7{%!eD!ReNB5XXi5Anm)?nj>d8Ws!gv<>_ zf->c898O84Y=LL;Hfj%hP)dVjJdwm*jz%C^tzLgwR6u{hV{i)j(tyCvW`~^megb1$ zlx|H$W#t-MEAgNG++(t?R7>ESL2YTFaqzi;Y0@%3n42ykbOI*6?NSO@Rw*=Nk-u=+ zIPFvy1Warmz^zg&UJ>kg`+h}se9lk95s|Zydr8Yy&OYJ8?}$Zt#bzy%k_dY#_Q80j zU$O1ZaOAv&6(1R!vWGn>stH1F#&b;}HI`ckju*%oAP$TlPlb==9}XhZ;4&!|jWAx! zWPVLp|72tv&ye&1mTTbNb-x z-dMI@?srN(lLzrY)BhT~6VRUlXLx;-YCyN<1f1hJ&&3I^;>`JpbetOxZvzkZ^^c#H zW_5cXKopSOuXe9QuZoH`PKxbJmwp#&s31pV0kZ(`kl7-oV$riM(ZWv)hJ$7G&yr{2 z2rO@}HwL-X3C4;Rl#ujE)Bg6xrI6Km#>SM{=yz zWE13_F)*$`b(pFy?e903nh;UcMm)sCrok<*UtLcD-IxH;S=k2!zDX94Ct?IUAc0qdg9vWg+zE8NT=pxDU;LQNLrtc<4TqICiT!o=dJ z`q+cWSwW}dvs1h#S=!{IU(UG}cnP>~UY<2@$2r_N0BlwY1<-^XO_5(5wY(|OM7`Qk z3e!s0e0ovV0ip~Gk8(!$-7q_Bfyka55wH6pRAkcCchi$9djO;r;q9>SYF4)}5@^i9 z+=lC&JQx!W5D81#R0x4RT|V-qIMAS$n^GdZ7~Nr|)$T1Sfn6OpJiQ>;D1QNve@4ZC5=G^9CB@u$Lg|cYtHhN{uJz6 z=*XBVoTzYrTYc2J=sN>_)Ob2O7&OA*Yy{`|DgwIZkrPe2`OLtWB6iTUlPp%mffrk( zx=sTQc8-4l1E$())PC>)?Id;4V?cgp{@vTBId(~2g|r>=Z*$tQ((upYMVC%)*< z_I5JAQ8V8@KDS&8)hd>-ZV|{GmS=+iIf#i5Oclf<=xRUJ1^pB3-HWXKN!R{DkXaZ^ z5?>$iX+$l*Z4BvdS8eLVSew4Xc%Y1ur;O*@`ftJy1zmrmKix}8Ndgr=asuDKyNU^> zNae}Tb#hO&RnzCt1IJQovb#C};H!>`8t198v7;gkAb|xflJVfPtSL-Th4SmUCq}{O zMQ}}_z!|!qN%A(#h+SR5K773_g+uxtE~Tn=?0$X0W;3al;uM{c;rPPH*;#_kRqZ}^ z6~Exj=i`$k7(ht`$6kkk%Zlt3AF`EaO^=dC&i@e%0bafJ-?euBr@tyoP6RvOE8Ut^st zxm_;VevR9tNup$}9Zr>>3o1tZ_c7T2dWo!L6xlV=L1~B!a^%)K$#ABdjnSzxZ2jjqW2Hv2#wWbzq|Heg3^N*-^y{n$S;P* zz?cN@@vrKx;E@vZYVYM3o6q8`2t~y_hDW{E^LqQdy*rQSZ4Jl?Jz=f>FzjVDiSxXjDL!R{ zHg47wMQsaU>X6upomrO5EDvs~NF0r4;K^=30Dex5!K4}>K_8-T#PzyExgrxuK(CS@ z8l@5S(O?x1?Al{e<@VAw?gPr9BF(BY%PH&bNtpB2$zCjy4ogtqGy|7Cjf3;~^5nYCMR0z_ds6v7zOTN~-YgZu{7z+ttNAB9`+5 zqH{jG)dA2$3_68#&T-BQ?r6^eDX9W-5Y?(GQqbl7i7CJdZ)n^)sljb)e_XO7oB^KW z0(y6k_Cf0il&MyS(^bTY7hG0xuAD$Ha*vYVal6^%yvlCvcT>n`0vjo;`fii$QyLKV z4S`R_zdj_#ls9-oiF}qhP4se69q^3q8GG4;!wJwMqzHtbVl+sJwf2iynb|^@+yD`| zcN{=qgS?4(vj;;{JkEz^Dr^Cl=9A-Eg44gdO|+++Pvwu}X6u%coHygnt}Km~Z5NZx zd1-|Y%(LL*<3CIre>1?O4FO1yVo_>7995gqz)mIT!N+(9n>GZLA1lvU*q)n5)_#sT zoC_c*wQT{T7RcWYywPXnn|5{uGc)_B3@W9fuN_O?aII^z_SNaoSt8`{yx5O)IxsR) zFeK2hd}OhcmF&enY~$_J_aya{lYi&WA)|*%hdkX0GD6n%^OxIS7?_&ojpKt%dZVn~?=;Y|=Xk)V*YZ%!vWdJ+o_`aKOkyVGK zAK5zk>UuJVuqLsf>vzzM0{gdx#8%zd`=8CCP6VR?|5@-O1!R+a9U&uzfH2dihlE)%0XTy6q4X(T#4jCnKsW3|!E&Q#FJZd*((` z4^3Ii=|Ob9>c!Y%XL5LZEZ=%IiqN^0U1Q*t02fya0$5tyr{kjB70cm;xiFz}s~HYF z#h)Rhu8E0-lJ)fVAE*U)fC6HrB|_Y6c;;@OBG#_iR4s1u#)d@s;}41`wCu0qX$UeP z-Z*JiQPI)lyiopq69Vi$8fyC6O%@>`Ax~w`F8~nKzlNymGAC_YsFGNI=3xODq-n0w z1dWfq&U-_MJ21h)wLZ;!MC~CoNiLA~qkdgSP_W;tp^Bu_)2F%jtX{(TU3hN3)xa)z zdw{UB8@#O@m((^q%sGF4IChVa(5;?Jsr<41$!w57d+b%6fB^l~P8j~xp4+96WNsdm za;(K_Z&5!(_tyH@5hGr)bc$ZqHvXAbt;++{S>YIu%p1~Cbm*wYcvRjDWMGTW&xKzv z4>C|>K*Z#Z=izp>bi~BO9>d%E;%aI`9=FiSF6+Am-iyjl& z?|5wuGAj1u3}j0T<$smvTPpG@s|-Gh2-@n@{_^FUEyQ$8^ZksW9pd>iAt=XWW&*%dm7f%!BcgOI-gI2CTHPSz79WF6$k~M%-c# zn}^)!KkrDqY`nRa)ScjbL_a3?z3kh!($Yl1ShBWK{r0S6*eTX{oshEH(Q`qEt)gFQ z77n&#_j)ES7V=cCu3B0$&BsjYPO=P7b{!%-JDxsGR#PdgzXPkW%}u0D$-x#pzSp-C z;2N>JB*d!EwGNy9VWB6AejF&jsgr!$$?Az&%9{*0h@w|xY?5$qPmTZ_5dtjZNEGC$ zD=WJ^?4ju)t!2NR_c#RtyF6Jcn}Rt@$ttO-#pXe@tJi%k; zKoPsi@vGX2^^xo5_!1RO`KNN}9RDAo12iZ?ik9z51D^Dk?0j7NPL4u~LmJM4L&Y$T zk>UHnp9bUMk5?Uvl*-u7)|mTb-_N5jO`VTmzwL^ek75RfEaMZ-AGll`s4Xm9P369p z?d)`0TjudJ&v^g%M^6v$qQo7yX4%hqC}n4-a)~^>$G65y_+6^myN^SL)!v{4 z%jjg?f@~->@YNO+kRi^SE@T-zW@JC%)7@|rWI0F2W-&=3`|k3qRy@4&RMqvOskN2r zW>sB!`iP+0`A+0Tl#~dZe?}UWCFDHYE4i=HzD)EeUOQ~B_XvaJ1fb;s2Ep>=g=d6kbqUkIaK?%JNq_y6!3?&Q6mQ`!&KS;+khd8&@sp+H>*57=vB!Nf6CXeH@4WUwkL%0tQE;}j7Hi-<%+2Jr zl;f9rFZ|}m3d8VG$A}z3*Gp~Q)Z7&XJG;)P_8X#ben+bimxIBVUyS=D+%ETownj@~ zw)<&d*PKqSzHclpYPQr_Oq>l9t!R{~rjunnA|I1%kgusJOm?fSDFM5-TUNX?V)z*i zjj!PLd0=ul@!0TA)mGQc-hAuD@o7EUl`kfNPtBKmf)OXjJKg2!91wA_qMs& z^Iyh_F3^$3-UD6qm9y-Ltu+$^^ zXw<3sd^XK6itVI1GrhS>Q8<0Hj8HT4R_SCXO8`B;~Qubn97=)cnt|&eYmCLd)D>& z=;nYVq*cc_@<{~pT`MaM`m-v9gCpY3Gy7?H6eJ{weqkQ$@2fATs!P3KZGK(B2`#Ix zu0GlBwIyC%8wv~4j;|@uJWJ((%zzINX}D)}KeUjVi}_n#-kszi>+( zQh2lg%_bVLS@D6tlH~2tu8)GTU z#=|lG1yNiJyLYTN@xr1*%YJiIV8JXr`=)^J?;nPh_w&`R?DiH9zQ*qE)(JcKz|5O5 zuV4Harbp0L&k-OLdQa#jtViXixj#Mwd`x$4-+3GU`jw_lDNEPW8w@dcKFl6+PPW%h zRmb=K{rl$Q$_~fdz5UtpOJd>YyX~xmlrSE9Lw>7An)%{;GwI4k#Fvbz&K?FLzOV65 zM8Tm_VfcX?HR7b>`z_JT(&UA$>Ar=&zKXW?6gT^&snPII-)IaJ{B~29W>qiAE{*>< zwJfzaj*nu0_dohL)S(35GD zWveUj_D^N;gkwTJQI(di-DB^gn<#}ko4K@|=o)s}`%dyWiNuS|-@1;lIGRh)ZR%LM zoe2HM1~=);i5A}wbF`95PnnquH0nQl@Dz$mno!m>c&_ETVF&Y_d{^6T8_51Hf`uh^qSYN2N;YuCE@-qkFH51Ly-A`zKQziSEGT|i7a!afuxjWS4WT2Z^(Ks{W#gw5>!gdfUK^S6|_8LSM)bVzN0^z z^C8C@M=_M38+e{CXi^|u2^$IATd2M^&01NIa$RtpT&S`8h`)%!K!tqllP|X(>XDmxc;1-30rk4+)jLjHK;GxM8Cvl%*)PGJ7Pp7SJIMLxci|*= zx>R}J=GmqwmB_!I)liB-NN}o7bW2v&uZN`5FU(g9AD0%HQ%3kGc_b5H<4}a-_s|@3 zTnO9U2vAZ{@v_Y!U?4WZ!)loAxrc#wuKc#Lfuoggt9A*tM*oufuu_2QU|s&7yE95) z<5?yBE+1H(h|ro2%F}Ll>C_=HF?6K$>Uk);ceslnFQwG2QxE8^5|2R7h}+Bb6@ok+ z&!>ic*qWUBC0&NlR502a=rQKEpPAsHnCk{@XHWxkj~A2qe39&?*fJwpt~#Wu%C&CF z4_&`~y#Cd7{L`JUu8nzitpm8r#xRi{Zg++HYxk`LwrN>?J!L# zsRtiJ`38JsRk&qu-tfA~%aKq^WR^Y*PQ|wRJ<&Xbh*B2ZNREI{Ts{fYn~}O@FJ4sU zFoP(0uLkw!?C<3X!T=#m1AJbw>j&_-ubxFHx`kGKHhDfJjA4)Tb5BrxP-5Q^d>R{X z_cf;Kjk#~&tNf33t=uqmJXq!Q`4(VTc$%_PO7^AYX&;TqT}2-7{gy8L{#(DT%r{O& zC=`eCx(_#!O;(;pXk4F+&U)AJH#Dauuf@g3e(_=NZ?ReqAlC^zhk%vn#?^Vy^)F$^ zPBP7t+@jvSzE2dyWF%QU9v8}rim8nz*AGblfj>UcUo==aW`En)-G*!Qpne9EbTu!} z}ABuYxj1W-WU8;9OnIaWWAvSC2#}>?N(@0 ze_#9^t-|AQ>aFUtNpMr{MyqK%Czg1hFiM7ZW+hYIDgoIz4(ay-?d7Kl#2kVo8EI+M zz?fV9^%Ismm7SkO5#l?@%kXmMpUW^u!fSb8br;*+_U?Ug7S9eNbAeKjt<&*;3E@{@ z{kSC9eQ;VHHC2ET(w$jm5i*Hc!$wVV{mwJtbP)6Kp0!5?5yt)#&U3 z43pic3xZXG=Uzv^DL$BT*R6y%BZPJ{xcqUbAab zb;{q&tbZoKg4@zU7hb)$>3rB`U{D>=DR9%;)7F`lh?mb{L;N#{EZ8-4)FcG4bRSZl z+jDhje+jqle3!O_V$ZdyV$WXgeIvv?qerRPyxZ3ILleDg`r>`e;Dh-evVs!Zt>wln zJJZwh`#ClaWT@D<{Ey$fKa8IT)$I46BF-CJ+jevzzjm^K&jfdbeVPlRLw_BYLy9IYABq@J7L4gU_OewMxya7G-U zaJM`;6_bH5JoGb}cm=9%6K0rgECJzhz)qLh&A4155j94P`eL3eeA-9s$&BA7%x_>~ zP-K`*e7`01L7N$^N^iM)xf0B59__B-c0)Bpg9&m!yNE#8PNd*kiLLpj(xpz_%0~I( zA*T9}zU7rrcrypOR0^Mu&`iNd^@E<#YEiS09#(WJYF`eBiI=w)+VeGr^V<$b-%e;2 zFH-0})KPWZsg&C8S|D?HOWrWK$o0nbd+;bVIl1OrsPugJY#+_DTxsdp9`YHy^upmI z?EVq56gt9ixg*qPLIF;a6-}s`nZrr!hFFF6DE;HV>r1Sr4!GFR*&uk6)zdwBUt zLd_#GJQKnuM6Opu@b7#0+FI3WRfV_S-_p*WV9Pk?IW;9hk5b41Ab2|38ZMPj_%T+m($Cjk7 zIKQ7>^%mt-u;YcWmGr2 zQ&xeiKqnS-0^yMi9#MFN-Db=bL+QkTQo^4|b_yx5P}a}EdwVCkKDXCTR329jO*_5A~T+O<~5ot#x?4#WGb^)vN#6ed}1fV|nqQ$Oiov^fUW7-6p@eQNeZs%On{ z{%k9})~)C!!{lrMg2d-i7rKP){PxUCdywVf850UJ5%Cd&c<(gN!Vd>xoflc@hH*l1 zF&`OWcp(#b)Rh0-%%ITFB45`KA0d_^6*7lcyNK#)msgiyY7Phi_5B~(Z}@?Li5Vyj z7pAe2d$_KPHOqGKi-UzOl#&F9-p&;OC8i#K&U| z4p|1EkaGVvAO2EbTQv2>dag;``7;Qr@e#g$fZ{LMyj29safFjsPg{gzQy!P@SPMYL@9{>7*z@>uV z20WwHNJ$wo+P5aeYQcPpgQ;F^!=Li&Rvj}3DFr_IsIJbNPO7W>UFO46R#rq&QR|VS zm<%ZNP8ODn@gMD*+*PFcZ})W;`kZCV`9Gdm{O;`RE_t3`P3@^ zSqd7VP}S{svle>ig2{UmHC&HCH&Xjf)1KG+X9;&<`UsR;7mY;J|J;FVf zZ}j$6)b*;r$9wmbWZQKSd>Z|-YdwUjhmP0zruo8G(+X|&`@E*#g!L_5Qa+K5X}X4N zX@9iIZsnH)H1{`-Ky?0slObySD3JJWOWw^v9A~Kw?|8nmm0)s&O08Monqo#~q`Fu#H<|C9Zd{`l7!{o{9F+U0^-mFkh#Hp$beoCrmZ*;K8 z5PW?zk=PNB3bk1ues^%MHlsvjtRy#JCUVS-0$ zawENka_R%IOGmJWX2hu}E+~wH?^N`;Jw+x|+qSZveBQTcSC-w+x5-h-TwYOqD0}yw zgT_x%Df|6*kGu@KvryC$`1Fx zpKWfk0PVS(dae~BPaClAPs!g@5M&Z13URU)y*u6SOj?Ko|UyfA+)7@&aYy?2WW zH4)ZQ^OF~?tE*s?C~n09@i|QbR3C=-X4sZ&jkM5^IPG4o%Pt|W^q+r#`rF^kQfBqh(#1vv{DD_HAhQL~T5B_EJ zhFg%V!%WmelZR94^O0+@*Hynu21JRJX8(o%$j{Y5)22;tuAJNry))pV*ieYdp$C=b zOJO}@{Lv8+l)YGZG}KG{n(%Q7(xqM8C`y(O<*(sAmx5Ch(oa8VN$1>~y3FeM;xCeL zH&lo5nVCs!g?7sA;{Z(_wMheq;SM{}|A(!wj;o^kzNSm^(jAf#(k)$AT0v3)X$k3) zZV;tJ8l+Jg5$SG_?(UEd>3Gl8r{3@9_qPZ$XU^=i_S$Q$sgwaGek6({L$(qB>yg8Fkyij(vc#loIH*DCXS!JHmcYFBK;m%}Kz#EfcM{2OVpqPhCl;?ga2sX`dP%kA&oUEk|!9JGoN|8L0*Pk))P z2yg@IFg-1gi@7Igr82bc`vBa(bYD4UnkHjHl0ZCZkwa!Rnh`zSqA@1tKlL`8TG@^m z))=h@gI=$4Xa6f?SF8L#HzRYH1@1+L$}(p5pucusQ*%rk4nNq$NJb$(;&8ds@g(e& zRp&o7F!Ou}$(5Eak{60SS(;&c>mTH;SNq|#tj`8Up`TyK{^jEK|JXq7C_17PQJLv!ihTivGU$#WRX;`Q1 z?>R%25e^6)kabOa=CW=cfBesz&+Ne4{5({UMmYwt7zew={Z9J*1j1zg7Y}Z7oF{Gk z%o7wi@aA`L!%dU4iuK2LA1$vsIcX!jpOpiMJT$l~x?!E6kel<0cvO1voOGFcztIcG@HSXHdG@Lxnc}oO@aV{2K!mfb9II{xO@u zRw02#ncEA*;#V|y_wwc!7f)4ueoubh#(H5laUNabJ$cg}_XxG5^0~*L<4yC)mkJ|k zN)1%v+Xw8=r4r#y{R!ep#8EO@Qcgl7{E+nNMwvbp7N%H*{wM_m)xY2&oD{a10c#eh z1gKd)=*BPkyoc|^bMJ=MUNh!tk(qSBma4s>vkJVmCaMW*a;7HAcwIjRoBEI*DISg)nS=E|kkTaiTsue3j(qQ4dPQK4==zPFtSg?pcrN+%)XqTq= z$<(3(?lgTFDKUNIrHv8oc=#@ypfSJiukX6F)*Ms_A##=!vMnp+%{qF%EzzBiTZJ-l zsV2n2e2DzUn`qtWD(MO+(SB@(yqAd8r8}BTl!I8t94xVt4!nJTiyGgUSSN63F)h2) zfKY`6ScTAJBmubBhS?uJax7si~4=Mc#Mqd++TX&Swtx!Un)!H7go{XaUb)Ry^}hRT=z6wH|Y}52<|1O z6@MZ)%@70XEQ;Q-Ymc+@?gUHs66;j4MlDX!3auR;&zy(;4!^ODO^MSsv3cZwEAS8` z9euA<(#UrDal+2+26w`aP2jg4G3R5#16C!?x^f}w~;~Gn?qs%YwLGB88kjvXuZ-2#5r}3>I!?06|tcnG!)o zh@<*Q4W{2#IJ`Y0|RVtW=@GsHots1A6Zcv}~V7s@s;m{Wu+Q zN2BnN$`lm(uBPA?A9w>DhTDf#t1PEE*nSOCwBtGvsu<)OVVO-nLNQD5003DM; zzHBvy$ma{A5mkIdu0;HYxYmxqQ9u4t0%6t7aZYh``Ti_1cyV-R0vAaX>y^8g-VnKw z+>o{#mk(sy(p++uZ88)?cLQ>mmN66(XE}2p{b(aNKC2G5U%H8=)0@^WrlmD(vGeL< zI-Q+3tc-6y2Ym29KrJ&TGZSGydaxk+wRI&N@nL5kR*-+9V%EoiT#M}CWr3$N?x1n_ zBv3q`V7+~{b^Y#6)OAH%*Mn;IoOXATo#a6-bo2X?YH0wi)O9x|ud|(gjYT2qM=C_J zsht8oarBUAN2Mezi18x4BOYg?ct*P}N|+H7>p!IIDXF$!Bf zFv$^)igP1OC{&xkyJe3jl1!^lA-0cT_IcGaJD|r&K0oE_etJXyc^kPzPfMgeC|KHj zB=^U&3qW*$6sA~kiu~QhhU4esS;Pz$sFPSQHK_#)H6vRJzQp**adl-G+2SBe#Q}(= zh4G>?Y_)!w4G!-Mt%g+5p+`d=Ms%q(hldRCSHHFxB$kNIA}YDD+pzj|+L_j(l*{F9 zgfb%>)s=LXWCRH?E}|0=+oMUt&U@VXDjF@59QlKOj4wWh6ZFc*Bd71k@z|`-c+#S3 z4K+Kc7bd{e9}PjQP%2wwoqNWyB->neozfL7qXI8Q=Upyo`#CAl@pb;mCumg5;p=s# zrBQ>*2j0s_ka%1L{z*)CLHbDN5l=`o`l*Rs(SziI3QIX`-$g-Yeievs~RviCK7hZ0jHwNI^9tXtZAT}XZU z)a(hh&lHES(hh3@lA8H(fts!z@&lhIBAR}hR2{rtcq#gO1HNm*8s`-<*b(O5@hOI_ zBdh9FeeslNLeZgFc7d8-+GWLq#kVPCr?Pc)??$Nzo{vIAU9Fzu3rmSxd6F%#}SPk9ulQ_)Np;nWkA*OEwQyZHRaEIu2~pcc!45&cD|8BaY8i{u!RZ z2%o(D-50PhGSL7Q{lTV8WS6Wmg;9*%@RhvZ_Lg``4 zk95Gug*!mHb;z4R@xS<*HacZ-e*SiBzCQikT-c6ou~Z+DWsD_)drwC3$m0IHbZRjN zO!A$F{|lDU!d8*a{*X{oCBeAuVZ2bZgfvT$DQ_?*tuW~RFJ_Zfpl7NoDJrBOz2Jfo zF)0A&sQzC+BmX4!99}}7t~6M&@Mfi?CK-E&q>E^2k$m~{|M_1|0F5*C2};sG;P0(H z=oB1cUdnebx_@&gf}&-PJyYm@6lWSrKx*ykbT+0(mANY71dA7#!-*0hsycptQUDk5 zji*VdpgI3-hQNm|)M5H1{Qr4sWq94_d$u1fAj}v&n8C-!HSOA832f7aW}wfTIX4&> z-Yx(j*@KxMx-T!Mj<#~cm6V~FkBxF`%%-E3)TnZgnAGRTStNFVqY%K5LU`e{xLUsDVmJBf?G#7d)9<>e$ zp+$Hp(-tQ5kES7@e7Okl;`uJQF;L+x6NjNXE(jaRG<@mzhF{3)vlM>ayx4N0R zs*Axpbe!VhVFtI{3`Vx}kMQYcg3MO_SlNAvJg8$G_LfGaU-E^%ph5#2suXKb&~MV| z!ruYTY`s+;jF|dayp{dm5S@K1fu0982S366niKux=O&nLFe&)p1E^lxS}*SQ=V26j`V#X{@p*Qs#oC?ob@ErW zji4~L?5Dr61;qVD`2eRmL1yUK=EYv)`}Fh!pJf>11)tf%i#}4+I6`gUXE60JfUI0A zuC>P!x@Z(SJj|!Cc}JjbEdwU6$qY$>kH{tu9zjm&%LrzNcEXzOcey7arPpmABDET0 zL~^^RR<*SjRXCxe+Ey?0KR@I{4>!$J6xE}VioyzGPJB)~;&K;G2RJBHwQqWP2rrhv z`0S87H!C*lL6HG%++R&~^NshxPUH`B+i}}%IGcL>Jdf0Lza%hT6I?ji30UO`Tq)f( z@-N}NdH&=<=~)>Nfsnzaf8Zj0)_74qVRK%AKX!iIOWyf}7k#cyFwj|Px@}xT*4 z9$C#tBc=x_o%69;2&UtctQ$Cjk*sr@Gleu_Y8tmX2{^lF=(XYpoJ#>+Hl4;qs`b?T&D!FA=vqzu3v36NV~A5VY@kW8BLlYv!0F&M`t{VHSFh8Umxm zSK;PEa-r4)-+o~qQB@i}htK@e(W0JR-QwR+PI%`AWY*sq?JpvVBfeptf^NkS`4(vf zeCHlRm_G!1mNtH-uwhky^XMNOrUv&lC2M*rUO1^<)3@HaUthm|srYop?u57y|5<=> z^HVJ)O#pzj&-5R7DM%0(%`*`Uo95w zXO+6Yq#$WAh;A{*KFw4_B3BdfrsZEE+5)X80?X{Wgxc|m0}AC_*I#w0x@}+lQwY*2 z{2uFU`i@A7L&-nSslk2wwDK*s$ETc)=BZv=&*es+oDg^yaT(-=L*5fFr^y%eqD1B;x)-7~;<}jRf<)!^*&h{E+<*$M zJ+2W+;gh7)U0!Hr=Jyhxt5a3*l8G^UE7Qq@!j{+tX}V@Er5`&0ZmaTuKRzPC;q0&L z>NcBW$KJA?U1&3!;y8?2at!9-73`dwCE)l>D!BaCQAJ;hY7y^)?Wl#BHqFGL3Ew7e zV9?03|4De>qxQc4 z&_L>*e@2v<`Jq3NT(y*vkiL`v)R|tf)43P1aTO{h3iy(!E#V3LZp}%Uc<5hrn(2ml zmY+5a22*2WfN+uy1uCVH?E0Gmpq3rU%3Y7GsrfOPU-TR&d&z7)6@#J=}Je9s@Mg6l+n#fBi2Q6@FTb>N)BZ@Pdd@&Il_00VF#OnTm^tkxR3?i zVS0Hv_vA7dmRw+B=R7YK2w7ylm3(;m0$T%dwpKiG|J5v6eXp@(ltdz+zS7aa99cFC zD)@pGoRxS$Cb3EkyZmRx`WF{|xd2GgOQgeo&aU==Hjedyn0}*o>p1DP=Cfxu(;5Of zrvQ&YP{MyLc~E&{w9*N^mc$MY{+hy3_5zK^u`CMcY3|J%hV5DU74aN&3=5F@TlN^R z+g19d=<5mn3LVfzrQ*F(V;?85&ICk^H3K0B_=d&Old=eZ)95n(ga21rlc;I zuM<@s|9x@4gqa?CnN$b2(yQq`rVwzL++Q1edV9o-($PESWA!4H%-u6xQxF$EFl@8QyajH zE;)bbD=2AJd@tRUAqNbZ{vvmP806q{ad9=5C(j4z@2S?}4y#>#$mn-JfAZsCVj^SH zDjyXhS=+v?l2}OyQzM92U*+*>ma4h$sd}&V5tvP6NhOYEe8z${!F{W25+=kB56U+j z^vLFkc*F`_At$vsxle9|ES>I0W3<2{BlC*VI>6bmJHLC}MkN0giEGSJa04C{0bjG< zBtqqVFUc+?1JwH)op2v&rEp`I!x^BoI;TagJU;Zk)(4hN;eLWR z8QSwU7L!J*dfsmQ!Oe3mN$z3LeB>(0)7|J_;~X|(+u3t6;KoIi;T;wUgXG5HXK4L@=1;N(S|DUR#JXQ{?UT`{`lQ^k$Yyvi2%H{=(>ZrG|3Oz%z@F zDrqD?nO}(h(>f{eoiAmyf|u07J)RX-fhcNIT~=D2R_#Qx!;n@T{6r`8(G-+CC|STe zL*wrWeyBYtmN87{PvUk%<+7C{d(nypwo$}skr#D4zxm(su9e@2AMEFm{8$_lb|3n7 zCcZ;)xwe{<-jB5^@e#?1Kkm^(Yz>rnnz__`QN&`})CWP3g%Z&lS5>ULlt+K?D@-Yh z5^;WcFi$*8FB@6{HEd2UvhLv8-EVrKlx^HB$6Oug9B6}`)q=u38AU(B^8uFtk;CZ4 zNUphX&>#?_?%gBN;y=09*l$oe=;3XtcNy17imVbcB3fvbJSM?U@cva(pd-|I)e5o` z6eA>sDdc|n3@iH+@2UV3Xg*Vz#66=sxU?D=jo#{DB-{7+klHB5axiw6OD3(N*V(yO zSFP4DT(=&i-`+S5EU^}2{uCE}l0X_R#JLxB_qDI{)poMz{I3Fgyi-D1E!VBR(S~Vc-@qi zXpN2zhtLp3Fde^|(R=99D%Plt?=M?|(mSCi9i>|c_e-uBD)W`} zU*eM8@aT*KPqL5Ljpqw*2bHIv(;q3-rOq+MrWQtMNkJ5{Gx`#OBZ#UKURZAgEK zQ>XCIu5gI=R{h1c7UCe2&_S#kk=~j+bg5(I2)j^-NoY!+;n{p{XyQSR507)r%GIxwlis|=xlEQw(Twhx8k7?vD@XT0Yh*(geViL`RX}&Hh^rRT2PDauUd0X) zTQPffS*}#6Kb=uU_FPZIs{rL192erf_<`~L{lLBhc?#V%7XD3P%))dD`xXW==I7-G zRlA`7gAIjX+cIkKeibS&x=Ba$effFstKH(Zg+v~6Aa!@PmI&XOt;U}LPYD=!ii(SK z8Jp#PP8P8)s8H?O=Uq`(o`_Zn3hJyTwJ~-)jD$x0k1+}zW8ZcUhrTS~ zFrRmbi1G>js->^Du)1|C-&s5NE*VGqHHNx|LaeA?F~h7B?|8Ls0M_&|6VDWl6!w$V zD6s`-C*iWg=BuvqBTSOE9v-uI2JZdwQbmG^fpOpY<`Cir9PIc09+QB@rdd+4L;dkX z{z<1TPzLwWhgVC&ydL7fqg7N?q@Yvdv_*Y)-YI^wr8?;=SVjpvuG22%H=EUm{o9c$ z24wqWfrMh}Uya^ySwWUd@Y~-t9X(FTGm`!y=#-N6#hQe0^sTbu!M)djUfY?7wTSA^ zNRM<M7T1M%vyC@3j1lN3ZM5A96dBWJz)fv z6z(oQi9)5y-6NBz&wcE6yR}e#g~i&Tg_E+WpF2A_D+%!AA0oo-1KvBk2p^1IJ5wSU zxvGa2xpk>Xx@aQx$FHdk9N(oG6`}oBt@;OwG|w@}z0Y|C0nIqO`_(QOgm)xVIc}(g zM)_RC`y8$$Mnpsu8Z^!~*v{)4=;^&VnXPZ6rk=fNC-kg*K~hq*Ai#U_d{a3U_(#w? z!iYXgRvkK&ZILb-BV|7ZdHXtk^>6ieOaKH`VUQf#Z2E(}pXJdgdOjle zah{Xr8r|r}A94$L6rta8@cTXPT2 zqhvvGQ}Z~z(Hzi0NFHUFcd>Xh>bF%fx63w&a7$6EL8CBz$!JgOH~zLUnjycmXlFh} z-*`SU&@{GL-$9!(k2cA!1;rQ+|Ltjj4{QI#ZSwWT^aH%!SVfM@2krd=0C@vQ4SNb+ zb{18cnJ;^U_If|E7ZexUT3D2R&@6anFNV$=_JgN+uYqxCvIu{!*!*1l&Ffnaqt(Xu zuC+TSpO-+RSE-qI+|EuVbhqjmR$uu^jd~d{Q>k08)?q zh*K{q6OC*2dpHfWUC&Bh?D_=BKJg6*zB1nk?fg+QJ>5vXE#iEU7m(M8n8z_EKKqM2 zJ@~?(h23JcIyZHum8nkIfqZxp!?-DCV{Mw}s1*U#X#%F0)Sujr zT1eJnCm4RXj{jIzSjOwSeJz()rdcyZJ-`RC*jpJ%>+-d?-U;oEwKq~HU^-abY`mJ= zcl+Rkjq9IM8EVv|Xl%xtHCQEcCO(E77x0=PZ*MQAClKZPJCqaEHiif{la*_Rw_V+P zyt#v@Eia$)g)MmKFAeEN5*ii`W3v0YPJZs)>;C3+(LBX^S1%LTXfc1Zx{UACcuqwU zD|elj@Yv{WnQ@5_sR{v$6Y9`sDb(oHhdmW*1gX5;PC7s!27x`4yA1=+%dPhs%G~_? zr>8To@0M_UCaWFu7*v#$)MC$t5WOL&HJccN@lB(>FjiLvbXx;dip=io6 z!p1W`f&xrgug;G(E}}MQidoYAV6?T1H$o2*&T(07q|?>CbZsk0^lOxm;NITeGs<1% zJm|q{d6$e^)Kmi9PuzISj912*mWu!v;a1Y5c}2*XctboLcJC#%dp;}QrcCE3TmGt; zPq4FR1v#B(=<*r$}VND}auMzAnXNd8?yM$W`#&=2Kg^%xoOBVao0_h*n2c zUqA=hi1Ja*&%|##@7k-1M2SB_CH);H84H=Tv{uD?QL>e{n2ffEa=&X*D#xC`f6LNc z2))+&MA$OUX>Zy(Mq)D|YAtvsw zYJsf&-Z#7RuCgYIGoPCYpXW7BEL!Jt<)*#qwACK zo`p7cHB&u-1_{}x(7kLt5BGNTIJXmaMm>Ny&ax=@Bywa4U*7PmQ z2%ZrOFOj8%LsKNfF!nk#i}up`qtfSW6%W!&E8miiyE)NOhV@yG+{806MICU}hzh+6 zocqZ}#DYuWN#Q6_6gRaa`_c47>1&-0-`BOLKbSI-gUrbW=_eJQKcofS+~~tBM#H(S#_;&3*zX7@e5=7*}S4>#`VZ2`PzL=%RHF$ zp-6rJF$C3)3Y#J2%0^4yx6keM z1a-Y~d_>is?$lk(a0<8F#(rMoQ+_gl)N{D-)w-i8ImxsfwWkI9@(|Svwf4e)r(L&e zEMgfP=v@!3CZ73YI?f(?`Wf~37FOI%9`>1IRUV=lR>+GcB_>8v?X{R!UGn^;X+|Z*D3VH%K60?b^*0x+w0;Mf)9}2 z*lsIa(s&5J``q?e>kIOB>dWL$TX1=g67npniJ`HC#szes_;- zgl^|$vP0Lisk8Vx8UA9uCX%dkLcVOL><`Nz;`6e(FJm>*MG@GR!A;v`sMzJj!jxgS zD^-qPXsN6DC*Di@2to_=w8NLMGXlEUJk zyd3i=#*M&{@sZZ$OVy9=?LXK9WaKEm%L`MlQ#`I06{4&V5_G+`EPS zlM_?)0M^BY<}~&wExe;jpVZ1!h?AyI_<7$9sa`~Wy0%a$4ph)vIMPOZq6{jC8EeDv8{AMqMTRC9 zv-EccWqt2o@3q{K@w;VACon(j8-4GLd=U>n5On9!zg8Mr)KJ^;DyZk!&YF~8ohH)f z$N7zRAF0KonTei5=?=5V)XxT_A72L~Pf-Um{u23q?qh`h%yA}nB!H z4{I_AoN!rLtbmHBsNka(`#Icc|InAwKFw#6no7xvqy$I1m16C!IbLAM#ZpFohXHQkG(K+55|CsSwLI$x@mgd`IMgx-`#cUckVLTc%vEF7z&67dPS^`nhlsez)y zu5?9Atn5ZfQ?^WF)wf_@XM#^8`$ksl=@KRQ7}&sv?MZGjHoUeeyz;WDniKkWarvjHO57ZQ#*{C*j5$86b%#b-m}omWuJ;*rv&Cld z6!N_7J+Ko!1_tZC)GJXo32bUyA^I0U87tR+aG4v@zh~4GieGtM`ObMM!EO3PA7RX2 z!vt-752EVV-)!LV`Zj#v<30Qp`~fvp70X4k$2&NN1CJ(R*M@8o4_J&W#@0=c&ep>C z^xShPXj|7J&uNSa6pDFzzgD)}Y@xcn+J7x9rdxX&fb#$$GD9)GI9Dt=P$6faR)gbt z+H!fd)5Z26YvK*d4zLV0Uavjm^pf&{5CJ(NLd&PRI?)CBM2JrxiH!R5xpf2Y3)6M~ zHX$t?ouFe33XW99jPB+#xsx^&UUbwS)5}{#gWax-gO(D?5avc#yQ7o1kW%mouIuUX zvylayR6v=b-`wqS&)@DanTm6#&Vbsiw$5aajt;-wp1Yh7+csWkF2G93Sox|hXwv^( z=TMzffLfH@@O?IEis>C@%a}Tdi1N!9>hH0?cQ>bewYuN3MV{d#sWOW=%E|a#&|%0R zm@e+&LtzxfOE63TGp2>vYnCey2Q21(t(6KS3@@<=!D~EMLlpHkktvlBd?q$GSx1LN z-3J_}Sau(>i#SZN8Rmya?(MyJR#{$H$kraBho)MVuv-XJ?sGNHr+oHPqsT{|*Y>~6 z^dB2(@gZ)Hj};p<`pt0q0=&qsybM&2KvU0e`NNMX7 zng^{aM=LUkr`T#reC>%h@{FrD0Zhy93a!S@Vza51mw%;WyUdE8L>_{Ull!Cn<{gk! zpKf@t^A6`j1t&gm(C8J%VzrpEvkWuS7E%T=fqP=#A0jquXf(H)*czQX}@x5z(8HTW}G0uVEP zWr{eqr#A3g z=F=P7+cGR5C0jB3Hc6oV&1>i7hbMQnxUw*%Z8j88<}%v&v$g%dcIK{hXzY7v?bB-5Nqd8kacHw_%vyM$Inn3Q7*R2u4*Kns^U!iC&eXl zy7|Le^P(d62igqe#yzCg8pnN!!v1gXVc6$jr?6x>+Kq*R!rGXs*lGEI|I0gpqDREJ zet+~zz@-ek)qCP$rYpHMElTrUN{1E@QJl`bK8t25Jci{QsI}jH>?g}`?C&kOUBTAV zKHjlxLb-WBWK2%(M48k|AMlte{rqBBAaa7eeS=4t(MWUa)8ZnRFxMoP??8FE!}}N+ zI`d*w6Lj-B_2I$#UR9r4qE6dtlM0ODGDTV$CWy4E9Ycdt>{fdCzt_Z!Kl{ex5*UP^ zF9t|?*Z>2c@WaQ=%v7*OCm*=AN5cf@(%KYbNq|7r&IL)yog?Sf_U`b94b=#|J&1Ig z#b+L=^ouL&=cArYTdW+_Uns$xC%EWI&zDTHrz$SycHkQnrQDyP)>t|p4Ha|gg4FL@ zW1}~yy#8hM4-3|o0_+kY--aiKjF}!hc<_w=_P{|u`mQmKRV$bA*|TRswWYnm#TGqN_QfvHa05nHT$fmE2fe%!B{6!OqUgCc4=Yk5&b%W zw?Ci*VYbXcRZ$u6*zF}P}i(BBY84Dpit>nac}&m1Ce2K-}9<2R?P` zVE3h-d?G6QX{(TMDc}?TTXhY#-LleBh&mr1M@A#KO)#K&d+WJwy#Wp!!#6;j z76FCpUXu5g_MS1b4u&i(Fde}vP3+lQD>&ooZoT@WLS%oYvR0_g}L*8R3JJ)-wh4EhwD zLL|79!hu{PQ5oNUeNYU?@YD@Om}H07kx~pUOCv>`=0(3>cbLaA_Lf;H8=B@Tf;62P z&-c*dp3VDom^Fu-QS5aj7#r<8lcba8Ck+=h<|^uQ+atH{R`r_)?knr9iCR>A zc~=n4%sj|1BRCn2`8{Zd(9(Thqb(ixcsC_ZW_oJW#FY_o{C_z3Fdkg`CW(+skz#YS4 zQ2@OXibW5k39X);Uj8$|OEZ?^Gn&}SkuukpUmteFZd7 zRadL@_DhzK1cndzrNZZ9`qZVL4hZ=P**P{WAv38iZ!IA^%U4jrcYznLBi}Uwf9Np% zSC9e21OjiGm<6b*&2^S4xoEMIsfY#YF%(u6*ypu4xcZ`930ya9qV}|z-cVc5J2trJ zbuJ{K>OQPV)Jpqx$f_EN%AWwA7yR>3tP^WM1#R})WiQI;nR|*Nws`>bZvvIRl0ch2 z5Q3H?h^`oGXDwQYcN*1#)~xkj!Y|OUgxQ)sfrC->99n`l7Nm%VlfX4QhY>Or;AJ`4 z^rei8X3{V*L!j2}!7#n*Cvy1j7$x4=O4*eiV*^gJocd+h>1y{CGPs)wBWK{q=JrUf z%?If_-{|lE==6?xd%v-NR<)%k3!7i=ZCqYkruNIV-96Ja9qE*Ndzzxyg-1Z14ihm0 zPc4|cgs}s^Hul=r%JL%^lQvL8k`T;TW?8_&C48TAm;a3+pQLEhfp3}Qy>R0$(E4*n zd*vqjJ>oI#=5KAoXx93GdB3xyky#h)Q@EvO&c4=u6Rp^gwBGL(#=ptDomY z{onQ(XD+>$*``Lcs7|rPwk+$1eXvfR*I-mV$DAc;AoaL<>jb9yL5Xhs(x|$uAum+^ zt@t1PmF@PowtkzYHuOZZN9ZYdC9BvThPV#^i}F)$8Wrn=n%yz)ElI_*Igs20Z$rGF zzL~bUyKSJSqhrvBT?2l%HVTOI!I4>gEL(s_Pe=p-rWF}=FCi~Jv1(?mqkzyk4rc6^*E5B z@)cys+{eQ5!7(|{+%jCbMMTbr8XXLj)zqv9gopq5r6+Y~a1Unu`~3%zlNULdpbtoS zp};o5)HD60ZXq(l;md;)^fo96Y3UHCcrLduDm=tvzrHPR-r!B~bFpP@>0Pn||FvFQ zIE>H2*_%tZwzOQizu$47j0W6`v_K#W&V<8kL;P7IYA`+y@@|loMNuv{lAZ$sz8V?* zmo6gNXvC`(AAm8OM4R$ndG^L-z%gR%WYw@w(Tj&(TRH1JOpfm$DEH*aYI=8kz=ts~d0pYg6b+eHqKTi&1eX)4DN-B_2z+E{N-B ziL6Ox(2=+{Gh`801r}rg|AKUBvYHXf!#-u4oFq;> zJYGVP_x?%lVYd=eA$*(IWUsC#BK)OCH)Fl34KdN3t}4~;-XX{G`zfv4L{RErRuf-d zC?-pUuJ4aI=VB)CTyzHo8R>yIR5c69=Q6*scwqXQRbHPeesAPzFff!R(4D9c(w)iP zvnH9;B0%Kqiweml{slE8nChNKeS`gC4){?98tVXWYnm?<;r)d&!BLPdJSQR@Hbrf_t042GG{v96XI|- zpXW`us!FSx4OEN}TaD}4+?wrh4r4_>BP^Nl{m#);?bit(ta2u9y_>poWtK}Ri%Yd5 z+eG+UAi`*jF<*2aWA%H_@w4Wib`Wflp|PLgKUG?eSgpC$-}SHWZpxMWvYuV5UfFg)7IIu411|bSFt&))L*ok-zeM+$d42q@d|GPYN6Z_dkW>=T zpwJtJS$AU7b)R*=01woFBUn<9Wef?x;s&N8-X zaGC!dDaR?YG{YyTVQbS4I_7p)Lo0E6i*P1Bimar1sUA^S#hJy^>NYoa4V*X`6^$^M zN{~AXch$&Lo0=?26!#nI<4>`j51O1>--C%?$steya8+U31(8xzTX;iyT!lx0UF+D} zuDeW+&95d%08^g%ay|@hs+Rbx-*XO`C6^&LNG?1p{L(0o$)1TV zS|oI^2$cW}@9@?1mh5y#zi(OHEQWw`_JBMKdCf2&htJP3Zysq6(O!v=WC*AggpmFQ1CX)DDZSk)MtR_i}Mot$JJ|MAoC zOF(~T(@WxfepXfaa7zewQlI9(f(m+Da5W;M{nI@?dRea0;v;VUr=3q#R330)Wkac2 zgDR`s5Qv|YRx3wDAWBNLN2K)iQGV9@tK*dn z!WcpAF$E5I;%2lHA|TxUEpr3Hg|>H|s&<_>V_-v`j70E&+m8y;58i&88(`pRZ!v9! zW!}9&E-vo5s!e0R&~O9Vu7v$ps{z15D}5J2gbAA_05#O>sdD!J9N6UUsa_mRVX$}* zNVNQ?eZZ}G9V{*ZCpb(K4{NS$SDj&XTdMB`IHliHiImaZ`EW{Jm-t*Ly1z;T{UXsP zM&zrnj=&vQZFNRf;kbEcMH>$E=5Vap(3f&An5rhmi>WDkrY4PPWoW~`G2$WnBGO3% zeYvdv?^jGadIEh9^obxn1^b2~2zLY|b^VdY{pM2J!iyarfegcsc`a-7crTy*$Hode zt(UU5j8(l*x;AV1|M_1)_y^Q^Ygr~}kgk|PRW&p&8(=W>Z5D<@%tSVO|U!?a*e5`>E^k!11;WLzN_4`mWh)ZH0@ zHw6vH8iah-%J4d^(<)qho1B1R<;N!J{Q-{6$piCW2;d3aj9+VN7^xY+)yjaQJ245U zY1@GAYO=QJL0Kg3C0>KKtlo1RYkC0C@x32qB`% zcJZ+?p%%c#h^&UEMvO}jsLkdL5ch;SW)DK-_<(X)(#>!MXni}amSP+5HlslJ*CaAG zO8QAG4cAF5#=Zalw+&bsy3xusgR3ITe-8%IQ51uOaQ=Z($l~^FAH|)Kq>vlw$eE(5 zRy`r{C*K3Tg=t~IXn#QSc~m6&9#D1`7Zvsy;L82^HU1#w5iZ8KHMj;qq;r5XKFgh3 z;w$89M!|0t73CfL0?U-47|7BUP(soC>!!s`b!@ZUfM}GoN`Af$I&<^9OB+(;V#w5Tl$RP#|7MS&4 z6sFYGiFEdt&|I94Rz@X?@!~b`wblV|{=$ht{rdqwzl_0w@0|bE8pc)6s4>v{fu8y` zNHDq?4a5}!1-j94azfjnk)Z?xY!rXFBq1jk7+W%$h8^}_`vHdk`!>*LzWYqiOr*CW z*i%bx1bV-af+c!D$nM`4@5qP*I~Eq!0H7up?RWfHu)FCzfF%O@S8da}U-IvTV3*=> zgdnf8Txa6a0fM829{bdTqF+69=eN2Kf(qa>Ae2&D5v;5xaImpLyk7(@fzYcK1_@Xj zm1;Ct?k9qwz6!)H4KtuStzETAr)AprdBY*fm!~L-rhWclb>@Y*W95jCnU3ibY7>Ql z5gx^VuFsz4djNt%v0XTY904;cYkH&MQb9@mEr@(rWS9q*(-}28n2F{eHNzva@{X*7manKo)Gbu)H@{V}n}cGCM3*F+s|6nCiM9T?w{J z-Poa1>D4UG-g{M1$#WV7SEuQ1*aR9-ufStG@WN#UUr3N8pYa)r^Vj@ijth;J)=dyn zmw9yl6LN`U9vDJ~D6?GWFw^qy`Xg4SE>a0Fq0g@nkh>|j7Q?v(JdK5;*QMuO|LvGw zj9nUyqBe^_euAHA5mw8XA*&+UGPtuvkF>XYagS(tu#=w(x6e{e+_y;8k=i{9{-U~h zaqn}Jw)pVy*tCfIA6mgh|LUTE701EhMFhv|q`+6%0KYy6Ab3{(<){7mgP+XTZC{qH zY+FVCQQ^^JuiE)vH8l-(C_87QtJ7x8H@zhd!xZAgR|-@ZhJ6qHykBpo%$A}eYZypMX~dTr*Z&uw77$bk8Jz z$+h>v_YR`+t(2szO#jIwt%aJtkpE+Gb?-&Ng?`8T~jPg4NIc~p*w5ZEk9$L zfEECIyRZ;SE5%>K(;g4Lv;Sp_2RNuJb_RV9ROr2}t$R1w80ZGe6sbnW6bBDF6)9fZ zC<=(9uc3P9=o`_Mb5TB%45nR^0wS4if}}ukqZtNyBR{}^P3~0{Y?*wrHA3-+B>06< zNXTv=rqg^D9jDJj0bQXm7`xo|=`DMnVy zAaff9)7(Pb9R!;n1*<^f-6B_F0}3py7gMpHBDtXT;naOQ>@Y9MTw5}9@Odxtbx3At z7NVX4E{Y_VPJh{@{hjiLndKJbQkWfw5UrlN^a%JL?YkHuQ?W}ih&6qxF}5)%yT9Jx zM{@Y^ObMJAu69zOLE=ejgLE?(1$onSJ}~UC9BR!seMJxJl86hkv6k>MZLBlo|F@tV zt-kVq(;tx1$FVbJt>|mkC2h^8UWCjBxzD+cm_+={8PiCnY8d{fwXjM9*?dCR>mlHe$8^gv%pSfSVL6N z9p?x$m40yCzctx3|Da`yxsYu%Sam1ic#LPe5eW)&m%!%)**5i9V7VAL^GbW)D*v8R z&~C6{d>j^P^ppk%Sl_hy`gVo(X1|dq(VyH^;kF0-#t;^<1?YSBb}@?-1qD_+rbz{3 zu|Wy!;8z7INMLJDjE;_v=O+F7dI?=kH^yYTj}cA!yY3DJ@B5PyIqcuk+oo8YZFaWd z(aV4dZVNpVjumYio77(y-u+mo$`s@*1$lG0=VWCS7#SFY^oHMc7$gjaR)LZZfYLO` z%>bf*kyr>I6aX3$YLyBH8V*|U`~LG&EfNY6v3;dcf`U+eqNLT!#ZvG&_P(k9_0~>M zmwm*!d*B#3@Iu-?UNPw#g7U;x@zPdnf`Cp7&^o~q*)AybFH@p0-vH(hPvAEikV!~U zvI7i_5ciSs=0?nGFcS(E(F2tj#nr5d*V7ATU=(@*;y=sFkHA|PANmd@&Obf>5!so5 z&gL12BLbXzS2SZH9*8B)4fg9yjl7~3uP-}M_H38-!+8r*5d%ZXf74QQeSHh|)w-1h z=k8z918F07Su0^yxk;*sq4zf0WFI&*SU`c#2kP>fX5T%O!ViN3TA|?oo3;H8>1?U3 z2Zb>W!Hrqs<05=?u`0-%`g`qK`aJ#L0Q$Z;L%WSeH4oa?2kgx3ShllNZ|WZBSrS?| zof@tKB+-?^DQg(J2nLeiszHiXBHl^9|AP1#g@E0R0X0RM$eFwK*O6s#q-5ps5rV~E z203w{e4+8QqVFBr$5iEAKtCzXYhN-FgkquPy@TJCe2p%)rQnB*po35lfUg4Aj^0P8 z%NE6~!7W7qZd(Wr2U!#W7G3%jZpKX*L~MM6nkghY$p8Dh^SO`F_W%IEf)Pa^y7?=k zAC2Fn9XgAYjz2*H1t)*h`!-nIA{F6vPrsT4&MU}X5az7Jtz#K$;Nxpo#A5xTx0>s z)fEY18I0a6;)`FrwS`%KNNBs@SdkN-w`@Z$FEFCRdAlPP-`&8DYj^vG+OwlI_*r0! zmb%Vs{ZI>>qkr$DIMRki2Z*&jQ3jaL{1=Hxqp5TL*=%u%q2X0R&=fGu0s$}J%`x$O zMt~;;hy?&+)J=gU_-yZ{a9dw>Gfz$76ZG`9DC3U_XE9b)Y^tj4{mg|i@E~>WSv1r# z69GVuXuGmCcbCj>^WuB)#~FaLU@+*fTcQu3&~BT!6);LR2(0Y-0t;YH;bw3&HF} z+@Hik%u|%lejp8H9pJ66Ah&Y&{RAx{EzfL1&T-Ke1TUNf@50mdp(D3KVvwrJZ&42P zB;gdvb(Rd=lvIfibKA36wm(TL{+&mevJV}|aZJQ?5ADogLAh)n1WM=O@ud*YA%tCf#kL*pT zaM>eNHX(cOO(A5j?7jKEF5UP0eg8g>-~SiqdA`Q;c^t=c(YYTcKWdpC0ab^)eSm^I zJPyElkNqLwl<7dvx=PG99+Vqd$FK7=0Hf*}Uqfy~=qcL_M|_~?j*Rbplvu+EeDCAS zKzVqoxvV^C{q$aZpm;MDUWNt@R~Bo3mcM%aRjH}S!0ZCy4gO*Ae8Q!y@4Rk3^LNJi zx`Zk8-#Hs!Aa_R7Q^g^`3p7x=l)7a&>J3$}73cwU?8AGGDl`tdEN1P!+>Rw;4}Mp6 zT;RIs86u1d_Xn!J&KsuS!+VHQ(7&fF_3eG{iq1 zqhXbv&_K1-zvP}OXw2IdSLS|l;e7RHBWv0}%Evx}*k!pGPkO24<#W9&lNS#Gwf95DfeQ zel|X+ahn1a=J1&)?AH^rB`W&>@9>=bz56HUXrUp1h=e}h9uBW(ZgF-1@pqDNcyPHm zX~)>Z!^4&=Dn=as%F6yibCq+h9@lMOD@~2TAi6iB5J?~$WGjHa^Prk&dMe}r%Mf9^B)0k)(xgx+_|=FWMote#gEB=I~U1)JUER{BL;+5zqmO zTQIV=qkvKQ=tAhumc}m566&3+u?=p!5rK%PTynH4M6pZH36^%bmcVW@QA!qebvd58FEV!dJ$_61 zfNIXj>$?Zy#eg|;jrfNWv%UlE6#<3c2X;j=OQ%4tz+#lzyC_4?k!+HZStT*qas=eMn3$l+0EYF+5OhaaGGScLmA z^1ir&fRjIeR-60nnAkYuC|O0H>CP*}(O+WhobIRteL(v?M#khTLh+aP(!XvUl`R;! zFE2iL#Cvq`-?rJqB%oCLycJ1|iHcG5qKNF9f;wp4~bZj^~b zdoYtGx(q~w7O@}5c)iKxkN!dwxszf%5vW#p5p$U(x4bf#E@Cfc9j^zs;9(rY*n+2l zautTH9%i828eo-7(X;2d4#HNm^t^A^PtenaOQhnT_NhDNe!Pr#gn89ccrrY?Gf-I1Z8gZi&=%46av&b{{Ehpq z(>$+l_9jvQvd11n&~jVfwBRYEy@2{lMoJ2 zc3Cam5cGW7j1jbCl#uk7KYRyrCO}^@c++exW7||#4`2tXFy3PXM*y!bL{ zDzd@+4(Lm80)hjOCi-OiqWE?Gl|YxQtLHL2z)c?vyY3 z+1=C1Q>%c&EXq&)6ew3lKBTF4jsw1T^>AVxxx8}s_H5`MfX z1WGp2OGaa2xKP5e;O`8Y>@OY+rm{RXek2}V#Vq1p>H+M`m;8+GDEJ)=8wPPk)G1+U zpm)rUjgfikL?(b+4JvMa*!`yV6p)XDyFPpd{#+=7v>?$;mR_cTY{{z;LOa#+@4kJj zTZ`5a!vFh|!185CkBT4+er|IbDbHZ`Q%-b#3Nn2|pAgTF0W=4FAilTAonc`xsQ-Zl zeY{6CBZR~^0s#tL(9Ik{FudpHzDqG)9?b^=cgDpxFLv|CSDZ3xP3%LEruulPc+t4} zSG}*_?AyJ$0ua{9wEpdF`H}Io)jfkpN%RZ*)_@{A@S_HHRHQ}vriefYIm8+X<_5VY-z`Buo<*aU-7s*b3wd?uO!Hmj(h0KFl-Lj_gU zEH({D09AP+M8-bb$Kckl0EvW`mm}RPlC%Nc7xdVknGfuX4Iivg;iBMo1u&)NIUWF zu2^!t=ENDapOEpoZEK?0>d%B;aY3kqxyihKJx*vx1MZ{!NvWFWAIy{JvP&EXtoqdc ztXMaUx#wIXa_SY+OwX;y@wU8>Hfpb?IF*Rzm}(c#YFi(Zp&fV8&PT5_eJULwj$mk9 zTkTIyXxW_uG5xOjro*E17jw(=-RdVq&kwg=Agh?B>ECt}EqCG=q5Sc=7*gX>CyzFW$~x{27L<(nMHi4!_M2h|%G-ozo!s zMfwD&4c|xMHst-)1u#+^$Tz-qocAVWR11PM6kYna=Qs zFx<^Nif@~^eK~3OJ}?>8M8ON!1(LU$ixFIM)c-cgp`My&d^?j{e(jae+lPlkw^vO` zym@t>UO#Lo6p+C4FCp|GNxXNuFc(83>VszVvSZNM*qCzj`$;=>Yxp{WCRH8unM2{m zzC|Eo8zK2&C44DyOrlXiZLYdKBY1b3pHFJs5o7b7Ry-+|~ z?`*$Klsd-MsKU_a@SFhcU#GxyLM>b@nH^w#iSPTP>m*X`dD z$je$htSTM$*iK^K=A0zv5R+fM+!{rw`-20kxtMnLVk+rllkK0l1WS$iT zfjUhs`TOe{rj}C!6ExPUPs3uQ8{6lyCdR+w?M=-=Ht>pBs!e8hAorxiHZtd zmQL=ZbT5=lDWJ8fy=M~X6>78J>?)o_9SkqeUV39VuCnhrw`yu#cyFC%fJ)5fR|!o6 zrPA{HwBuJU`+YaX^t2kQw4K{~G;14u>YbgpE@51`;}C778akLve=64>cEiXUzAcS= zU1(cP9-_PNZXn(~P$D9{GPS-u=-J4b4qulQhQ%)hbV)|;S2JpRpLjxz#BLv)5fIS;7Y0UG}bw0)ODN^SOxDHykrclwDu@adDlEN$FG4LYE}NS zE@)18w6iN}S0l`cQU>XBQ}I>IaLLQ2mh}wN&wDj~_K?e@JJNE`={!mU`H$eV3uK z!avvg6u2G*5+K+o?NVY$67)`5nvM_l#ttqZu*C5jG^em1#yOaE_^r~1Jl-$?O4xum&YeD4~uw2)hfN3`Dnc8 z6JrEjN&I-+9F2G@tayVd>?B&^K?6zvz7Z$ZdRcu~||AyUBSuS!ychal}oG zSp@LYMy%uodMFs1rdz1zAFsjN9ke_@van#vij(IgiuqpsmY(hh!&*`G@79%fR<^dw z;jS%=s*BAXEk=s*LR_L8j6cwHLMAJzn{sx0TARjFLfQAHwp?JRdyegIfU8R zn^@UP94$!YZ~M70Gxc5`SAYBFbu&ch3|CH?#ZElAZKX*&hLiHm?~Pg z_tsXEo98|k_YNg0GyW{Mr!0|ma^t8wNg%9;#-T|itwFeVB|z=4NLe;1rxhU);wXn2 z{)A6=#H)C7iC6}=o9^D}#xky>-&|Z=RW^jbMEmKEP}|$q*Vn%w`>hUdmNco^Kv{_+ zzCyt^q$ei2ZT{q}=9l8_Dtq*d3IKOTe zU+|7Pop0czd=8QjtZh)2)QvPsY@x zR6EpUrw|6-BC?X&@bNITcc_j2_<^z^yV?8AX5zl4p!}`y3#{{DzRn*(u-sC|CrgdY z(O;!4*QQpl(Uxdm<2_@b_C9~H6iVm2es0%K0IOrtx*IJcFY7s|L`iv4I}NSLEY(f4%!uGz3;0snaMs4K0 z;d`fyIuxBiv!f8d&7$gec^Md(W1VIbBEyjAXyZ3-r`kF?eoqZ&e*R1!7)u}&sp(UW z=Q8%zJl^k&PM_;E^brL~3W#uWPfr+dPe}1M*A3*QD`~@{!h%O-qazTC%Y>QQH|#7d zXw!OP82lJaXn3YJuI2*aOL#Bd4ZYHos(hrYt83^-=q;iYL)&&*0k$QqI#_Iq*_@C< z?*1gAwNh(n0Oo-EQ^?VDbMrur01!v-CNMD2k3+anR6upYLz6vZ2zhKrdoi?<)p_(y zHQ^MLnT6#$g6{L@w7g{kUoT`8$W;TJ!9{HO0!mQqj46eSW5xdD`lC!&|Mra3Z4Y-9 zgBD6b9gO|t+MXMJ^|)=>N-llh4Vtv|SS;{fnAl#P^ul1U1QvDQw2iqexlnK)CQo&! z{c<@#FC4l_dBd7XFF%+5GRF*z;zhlIp+?ypbfCVm(cg=8HK=pi6&Ix zd2Fbq@gtf%agJ;_tl-8D#+uS463kl1$>Wwc+n{n7d^8c}Uw55d6Y5xlBxK#nW}rzF z#Hjq~oK3~OH+PQ>dpzlVF3ch%x17{bn7Rs$&|mp2an@c^L`fq}t>Vyoz^07gscw~9lKkfkh*2Za8yeR0ZOTfZ7u2saL| zPF^N*H_c2>OpskxTI_`?eZAJs&$%i50kPE_@WSDDvpTJD%&^{6S$40iG;EJuFdmDD zW4MC%qHQ&H{K1S{6OCX}An(;Jiy9&nH^S2jpv?{(9#Vf)aiLe#Zr4bE6~uI&mm!d( z>!Qtp+R0aymxH^c=IC&;_ovKpXKdrf5*%6QiS$W4o?c$Dc>$XVo_bLWB*Fr}{YA3x zxg<;=gDDw2}E zkiv(yh&t89LILg6b>Cd!6G3lM_uKl6`1nyE5Sg$8`Fv% z)`g!m=ErpJ7o@U3q3{n9^M5JL%(YgUKyDr6ZO+zG9hXwq-&jx5$mN~T-TwV7d(V_U z)#^u9Oe;xZe_0JNVJMn@*oRDoB%lMTn$} z{#Mx9S_C_5@qE|DHGFfPR+}OO?M)Rey)~g2ZUTCWA^!_27`AO!KeFZ^nF2c)k_SQy zLHIX_NLIg~QCH2%luOp;v_DsP`vN}$neO|wwk4}JCPj$M)p}rArP?WH8Sc(m?r^gI(QzVkGRDR$ z!bZ-Bw7Ou$^4whFZIYrHAWp#}r3>8aeJz^8V)W7|t%%Hao*doep>D{toYct)S9Vp;X#_QlEr`A%oKE<*zMAAqW}DD2qU|wQM4IqHiM8Gg_J-{Iic&husju3qn@vpulYDc7-cSG zR;FVWecYH5QmT<14%dFtkNYH?yp-zJ>@)yepYgYoT*&(}j~Lo|>v(^i&F z*m9pwm6!6`+2T>cWcXL;BueS${Lt_hUj6~d??Io?JvhEU!-|R8cx1YT+Fv~lO+tD& z-btE9x<;MDCxye<6HeIlnxM&BvJfPY8yHItB9e~piPBSdf>=jXpoaD zeP=F4GLQqqxcr${CymWU`P_;)vLU5zE^qh`$ZD0-SJpOew1De;!rxdmD8}Z4xepGk=$GDXBa<1k=f1)Hjb%U;p^A9Z_ec^~{7CPX})J zz00~{G7K{pRL!mx5p5x5zJ*Ygnv_W?+F9TzLvX0xt^fIBRzO|H8^>H0$Q()fvQinl z_LXYMp8pAc=&(gr!%82c7^^L%9RW7{{7NF4zgR~rJ`cMI`SO+quWNX{K&44x>g_&1 z+L()8zND!gKdwol!vyt&tW=kMEQ*!lL$d72OarWIQFqdO5mT}WGYU_q``bIK>0wx8 zUfc0Ve*!i`D86D9uV{$5Y_92_y{2Bh?`z}~O-nH!&Rmu^QQ9kv-%ia_*NNj@T|i{) z0K{JH-d4(ir4TAV@zCw=5zxMSJAH1F+H?Yf?H1Vd^XF5=Wqv;=0gT>hU3Wg1#c~VY z?6rFH-sw<45!7|3kiBGb_1q3U<4zpA7u5Q4b%wT<43p_-HbVq#@l&U7x1yb=sbe2l z^U~)WRmK7`18Ok$4!WGy>}6~VpMC444LbzTcx7dUD%(#PJ_$N1!#s8Zs(P@!eyEW( zE98s!tI?yp;>P5yKu;WF(HUDnbw8MCbO(VT$T`a*KIfdOX5>B(f6mTU*m*I@-*0rz zh~0I{a6L!%LHw|IZZv>$rgW4V3)rPY!!fA^fMc-K)KpkZP=#3s=JNfKu`#62;VLkV zDCYC4!=c#phUxP<%TTqsd$WNFm+EuZ0}j4R=b>qgF*H*8#pMza9{h=(S~L(07F&IJ{Rw!pi4b9E*=l_jVsFnVzrH&UA+^&+p7J(l4G z;|fjNP_Ht{{l@a3RkRY9c3!)}0-)W{rpcNcl@O`tP0Jd(n$OXdV9*de!iK&;F$&?5 zXYj#x7_Gm}ELm+3rk+_sRX5a=ermMc6ywB~E4)l931+J!XX*Pl8zpF1567idRK1Jk z%mu^FH?yEymQFiAqwCb$8i?Y={E%r9GiZgK$}AptAMTpQfV=w{UIc^R%9jf@Y)(2e z>08+Tpz|ri;d(h?AcNRW@gnjI<UB;SM!IWmG>5fV+M5 zsTCe8{yKgEfj0UJ!ik4T+6j9OuV2Rx?zk{wgtnD5-FVvAY=TkYQJ>q-YK)usoC+quPWc0*8I|8fWAM{Kcs6kaZD@&at8mT@;$2m@`!Vd(X3FMetglh+w?$jg1v6As zdyvrt2I;D6YK{PD2M5PXOl(M$L5kT^0NZDuqYA@PmvQZJSEv-ijW$yct)Sq)G z6d3zhHxO`mYB4LDw28e5g6$Cky#!n4x&01^8mF=mG6#7~2Psx#VaSX0pP5aUe9axv z^B?vKGtw>+qeA6zF*OA4fnt4L|3#zFG!JL^YW-<(hVVvghD%^~EuE!D7>H zX4l^<$1QSZxZR$}8W>y_&wAaLy{|xdD)7cNJ*^`cL|tD7L^8|R#C}XI5_*Ap_?c%b zS=qQ|GV&?S$_R~y?>xR26RBL^Zb8#h?^v5r8?Z6w7b&4iUa1a0%^W%n6XRT+L~OI5 z{azA=lnr>I#D;N+e4y*Xr-eBfl7}Bc`9_6*98V0rVU7>536my4L>+rCxGp!%<@PL~GoW9conzEvbDco!{mg3WNMqj4Ng? zbJHrIs9Q&lW?q1B9m&)%xkxJyw>l`OUawaDn6L-|`21d1G1_F9f#!LOVk%$GzX1<>G#Xh4Do} z(i7bfQ4~4tp0V-%Hwt<5(aQ5oY=<6lbq$Q(VU3*PRtJy?ji~y%hVk{v<%2kel@9`Z zsjv_4m%65b4r0lre6trSH9jFEZ$@oW{xrd{s;ErX(K|K-W>0nWQyQ=1H(CQiid)o8 z^1K1d5t-HPREIEskIJh3{>d=Wz69B&@C@Ds4d2ux%y-JNwtMoCd<3u{1dhX=qhJIr z34ge>uEx7P9sKGt*z(Q#B*?-rDI79-KQv$zQk5h~>dNx5XuESI3W?zbLRPTEh|j26 zYaJs0Z02#-o9GWn0vf)<*{z9MidOq5R8r_W$sgTv!dO4@4@~^$tJbx1ck94c9cDtC zM{>F>X`SjbGczx%ok%hJUaAJT{r#iwzU z*Y$OLcC6U$JzXJ(ePQmm4OGPe-an(f4Z~>YcJ5i9aOAOo91n63W(dGOMw%U)vdVVK zPnDMJ%cPn=VyQf^O^h}cR+Gnlq(z?Dpcq`>KN<`}{&C=QdrLr(CjijHYL(K#Vv2@v!i40o@@o@RE4VzW`(L#&0 ztP1gni@p(|6GJ3vW6Te-(I3+ zTuDh?eiu0!oGX@Rq9fJK#@0rQ@VQW6JSh7%2i^Qc@H5cM#Ex~#SMzFtql=|=IanWeOlr4xkg+#T92gaJ!)w-RTnK5)U$K zih32_oA*S3({fY&dWN%38*N^YDq4>h9kT$1;tgYKgIvIEC-G=J4?>4nexmX8y&69P52Gij$p zDaINiHjd{@3imKmyq@1wWFTGUH(x`pY2k@v_uv@-aogBqyYOLs*N_%CX&=oN5t{=; zHlUWJu+_)*)|#3;nihM*;)%n0`@88HwvjNwqTiM;aLL~2X)oIntcQAh|K37NB;xok zgHeCJW4=oYe^34Bo7I`CcF)E59frqX(^~T#HI1q+V}2U@-@XJjMR;)lYrrgq!j;c{ zYHJk;3F_|7In_@z_g|AKZoQyX!yA=7kh*o+4pCSMQ|HG2|!zn$(F&QTNtw;V`sX}!oNlg*4Rs!4?&o!gq9GkQK<_c7nWuME9xKi5>% zEyv^Xbd76hm(rzzc3YDALJWV8xTCpa*!5s=WWzW_xlq3jS46noF%*EyNV|o+fvuER zuQoL@bC=Ki^*&mJO@DHz$0#)=&qmz>@1o52n(H;3RXcxNn|qrC8oj_jFm7bA z>lL9bK&An&@+?vQ*^Y^_?tQ8!(DUj!@d>KQo7KZv+-Dc*lYQP(Z`Rf{cjIm+4Zm+h zUMq9lP7TE#sUNs}Y}Yq9NxhnyD>kfHAVSB;i#w0>^PqcC`hq9@;Kz4@pNBF~PIe_z zXLDASrz=G(-&A5uPe02%AAhk!S{&bdiXYFM>~){>zTlrts&i3n8vJEsZM1{3NR<=) zVLaA)iyoU920kITso4dBXW|-2o;;Z3Te7b+$>eb5<{1223y3Vsnio5`vk|xms9x$K z;{nHYr3_H>Ge`bje3r_HQh!Bf2L@P<)G(x2Uk26=WOcLi*A7o+%ak{dKj#)+?tTA# zM(1~{?sv<*D|V)%`KbZhwd{H-VhziH^KxqFyQ8D2wst1MV+JCY;@^81RqTg9e}2Qu zZVvraR~E@TSx&BQEiR<>=IDE*a!-0fcfY}@O)lP%`w&4e3D?6Ni4B+w*HhW8Fn~}bDQ9Zq zIhr^EdCxUWRX|aW99rO*RGPPDKj8Q!Nskp6<^`o;eh;~3$WuI_f6-}tJMfy?)873-@$A9MgXbt1wo(qFk!Ayl z>6zraxtaB4SIr*UVHJ+_mrBhN2s1-XS6wWVJ3IA(m+}JzkSa%pDlkz=V%ME3xE@!j#sw2y;2?{Y$ehp5f!$gveidrk^P++C}+p& z?B6V%e5#xR6Thm};pF@ai$PYi`vUr^=@v4H< zM8!qjj2|~|#+l6@F`&IEN3h38zO89QVDexwPWS7khB#6w=N?EXCva$3i4z3e?OvuR zJpCTX%UL~xJsv;YE9Fv`*T{xZ@C}IfuAU+Rn;v>+!L@w&U(f&2*7~`sWFC8UEpSs>PR9Hd|?33NQ=*#m0+|-GXpi^1v-r3Ei#4kRns3eP^QhyFmpA zWBz^ZgN``mC%4*K5vOU_v7B{o=@d@OjLuJHpBJ}v4$ye(0QMT0ops(igO=V(V-ZQ3X5HolV*%EG z7IyL^Em>eJ6qn{j_L_J5p?cZ;yZ`=&D!Q1h23{tu+!{le#m^cE7rbp#5Dzgag+QemP0_nzinX;`?;0m?Z9h-GX*K!8##i+B@GTrm9i()@#uK|LnkNChPpKXj@^ zdG-@P{-AkGm~VV5$b}6;zyC*jR2Cfdqr%Sek_{7U=b;#fJoyOki*qt0Bq530t^xR~ z-r0O3%RwMYE$-|A^BDQUpq(Z;M&5Azb8ax$u66zBPe7RJ8I%)<15cp4dD)^agqhCV zBTTyp98bC*M(f?g07egw-6H)u(48ZGVS1`&j*i9v2ptQKN>J#7L!vCF=g*WA+{4m; z=sm2zsmyhm-cZsZ%ahlV^-`~`^A7Y*$vAIq`0{5?XO~CxeGXa1Xj_->cj|77N>AD?bG?J`I&v;Hby!`c# zI^p*Do$x{?%C%4b`HsH%fvoJsp=##O%+eLwfAfsdMbZd5%S4f!cM3^_kX z0jp8=Sk@2u-4iXXXEoM*Z;Pc%g19g;u|3(9vDhzUahT{85JXErtjxA(gUqe~lf?{6 zgX&KlbI;4W)f}g_+L=S(=Ay+5rz=hq)FY*ajRTtE zM-P@*rX_CG2QY6YAo!4VpPz+BU8iQ1(}x=NJG{zR7SA-xoZQ@lFf6qE5vV_nN}E;) zz>q_uteKXe#%5V?(UneyYIb}^>xqG`re-+jv=#r6cLuT*OUp=2KFc3%c|-Wg8~P&~ zgcU#TJBOHJKEzPt;MiDLPc@3kQRg)+|WudDf4VtC92^ZJ5&_`5qv z$$}+W;XjYHIBJ;$vJgPzwRK*iVnc$vQdSDHCVOH5k9a!tnh)!Y@Hx;`5zFp;S#81~2taH;@40yM>-&wVnIJBX0SZ8NpsG7xt>_ zED!48HBSiHYD|E_!uJyK69^?e?lWb>e~Wy$Z5=R2W`R+aK39}QK3K>^0VOQtJ(sE`HhWnSf9vS6ASs8QiOdx3N80SLB_*=Lc3I%lQGea z&HQ1JLGm7Q-IOXaEwB#W?Lg$>wW;arV+T}FIvd2Dr{zxnF+H`?St)hKQ69e2jZB}@g7V^v`PPJ;$il%j2`K||YQ+oYUX30QhK@{itZCzM+tl7oxR9GT zp{}pJ-JBj~IfI7CemcWjG{%N7chtlA9KLjQ%S{eg*jl3K!_n)LTxh*4`1)Y`9c|{P z{3qfPvqkG{oo6y4W+7l(cR_?0!C!tA-A%PMj1He%gKV4%`{LfGg<(h(nk<=oDD#5r z$`>~p=js?^^4phZu??qrTr)RAL}RXmLrwU9tt$V+)}O-Mvkoe-cJ`w}E<@R@(G;QG z;g;E*4SUt0t=I3XH%S+o6%qhG;XA=+r(AD~2>DtoC90?@I~NZkFmajp7YOw=%n~mc*dVU(Dz{k zx;&Oz{}A`v5L0*dS1I!UKj)@3xDy}bERffHx4X>vm>Dg9;kx~s$cywt)SA$)&@)_` z^P@3!i6$KOef4;M`7I5UksrUCTMeU^eWU+<`6W|pPbfb@6op`fQ!BDO!1!@P<+J^p)1xm=u;5T)pf2bUcg zL2M6?jp=6z4U7Hsa|*Ev_LPmC9e?e%i36FV-8MX_E0djDOiWBOzQe=ASqBoI1oMe3 zC_*jUk@1PydQpu%c@-1WC!3$e=G>h`Sz7Og9$2Q|atDDDOMtcey_oq=AAhX>m|-l< zCq(I4wP7`orNd>o7422~@7wTeGj=8*o8=S~baTn}o3-FNl6KAkmvD5&c!uolFB#qu zcf_(W3;~`rdCE{cNbMEKDcDFT)%Imif$Bow#8|i&xxqLWS`IH~xk8smC)4%E z)&Ks-=q0Zx_b~>g{c?p0$3HI5XxP#9>Cm|{2rI1$2P8;m%y*IKdSU;j4&WI1(`@1Y zim)4xh%X%mq29?HQ{D=Xnns87LFP=Y;W(aGpk3G95+~(Nxgc0IS}!RcM*pOnmLI78 zpKk*3LZA-wCDas>tGk)#a^QMiUbt;dZk*@uApxgG#&sfk1zq3K)6(jNcHon|EoL02 zat(EVcBcQqBPFEO`#b6f;JhsT&{)dx;T9)igzES>dYIn!v-9icFLH*SK6j13V`tz# zT16Fw&)(C1#IS3J!by*%oG|%95s*6m9zX*>`WJT(ahGPZ+jqPo>?L6(3Q;d> zds92S*+EM<6$mb!WUw8-OwN!|)z;HWFX_VpW=T?DTK=LW@ZW=%C-)QHCYRkK+O~1- z$j)T?IK&@*<^30-{foG2hqF?|CQx3g73Pas-PwNI>_^0v?Yc1JTihN(p4q}dH*GNRZv#3eGpOyv+ zq6}zYGr_9^9A>mWJTQCV6eM3a)s8Qg->3EwjdTA4^ZpgBJW!SxL2ujK%TsSzDVmPz?64u@IVC> zV!lpLpQ(hw15842-of3~)WknhU4NU&Rlq+C{W1PCE8!2Iv~>WQqRW_J@{N~xbcB4_ zQY4`V6G8BOgIe26S!Bf0GmK3xkZdyXfeAlPC<*e=sTY_cEWp zqBqh2*=DLkQuE^TeyRbqU5$^$FfQ&F#DUFNuedJ`R%$hcm%2epG(@t`x0c3Slb{tI zuBFSegG1$caU=et1xGZ()fYcTg?_(Jvv>+;I1*o55MV*Bczm&ukOLPq5YlA+L6w8o z33{1E&w0NEdlmjILHZ4tI{ywXH({`|iAOP)Wz!_bF;#xlXp^ojeR6o!hG`6rR}kHI z9^oLtv;m=Cp1p-2MMb^bMK8|+-Y|=YdV!ec z4(k+29NVC9SV6T^UjuFPYjYsGE-Heq88RPUn6IBp6nmeukRhRjvv*9pT89Z*b3R3!L5x4w4~k;kPEn z4sw1DWCyd3*rXo+QMT_4Ic6q#@1d8;nZn0qyCf<(kIN!nL&o_Z9_VCd{YnXYSJ3V| z21@JtFh<1{DX+p*#jR?~R)WSSkmlc24+k*wTM`+Ypa&)*<=(rE%fmL{9 z8nT^a$Sgpw_c4ag%=}T(K?}v_nx(OQ@wA|ufOL@Iv)6H zU#6f?5Bmdxh1Sr+fQM@Gc_cr`RR=hQ(`XoW?=fY4b_`n#`Y_DVX21&znj=5P?tOx| zASmufcn5o4QV0%P{ThCn{b1REx-nppp5N~&|2s}Xgk;5pQWojHuvNls<~f#oTfB6^ z_o&uu9)GP9#DDxQf@Wfsj3FH8-L3+xBIKV?Q zIO{uOkiFY&!pZObh_todS9N%4jm`y^PT8B;uW`pTIag$kZqMq~80oiQ$Vyo{h1OHe zS>nd2P8LHw+T(nRYx{W+A?ZS(N>NCC8b~zqI2+a1b%x{v5?8N>VZF{t3NfT# zo+p%H@%=+$>7h%|MIwpn?daGH=PfWP?Y3sWbu|-A`VtkD9YqUC?6^j{%d;wN2+gs1 zI&Ijf---^f^I(!xRRd0bO-`BrYmAyprxh1tDrO~S_3sn2 zsoJO(RR*+N5|Pol4c@H0H}d?jhePIxwwyvQ=|v$Xw4-t~m+rndxn0}osg8tRESvWB zA{q-VAJah7N*{?U zs8__MufBEZtLO~2@tzYY|2E6d%6cB!?RrriqBY9Bi1k+<)!HtpF5Bk`?*{%J&|B$@ zmXq-YNQ!&q7ux`$7L4}F>?Ds$+(Wm283+!!Yl1?y@zYWCa0>Tu=^p8i95b0r&K)*w3gtIT{2k!ETsvULJc({1al zCvO!A4UaZ&SGAU(f9uUMwVgzx+pc7VSLq7=pP|A7j(fG9{*nq0~6V&!29@omKfpkz%G!b^+5oAnu zK!Lu4jsB0&LMgswzY|NVZX$H@!I@2}HY%S_W?TBu{YC6J8 zr>y<2yev*lOA{_zkzXLB702a-Aw5h;Uycc9YM5=k&qnZ>RFd>GQJuT}|5?_+uI((Z zERD|+T|1^`EF|Ez?r)XkavWtc$y$I}F0yCDArmk9+b?s>0XgKovU}qE7|?v>he`G` z&I13a+RD@nxge()B$wHi5&L_VKMW2h>PC&Al|A}6OD~*e? zudfWyO>+}DJa87}VgJRn{$LojBZgLbHV$anlt8RM3||UbxK{gMn5r^J!(Af*v|;-A z{{8AoL#WX@k@bHGCn{lR5Fk~iAWeTJ{y_+l3=SyMNfxQg_a&hZ0)Y(lg(n3<1yF#s zi$50yGPj&`&f~lKKOl>{pkTH=B(BlE>Fg13=s&i8R7ba>r)qFSJZhEexLsM;0_!b)UnCbK0`aWFPBd(N3 z_k%OX|3PmWPQoQ}c+#IBuldz|z8Qx_DCcr7)di@ueuMv-?*INeJS}d8P*36w-4Q^* zixZ*=3YB|ap&XjvkX*sDx+D>O1V#I>Svjxk%MY+1XM~#n98wu3*K1=kmg8}W*%nZm z)uOUvx3`M_>@f-_K`Yz?5+DyJf)~fVuRJ{Q>K_tW(2gqVg6ES|oA31uk(r>u=eo{y z_wI3UelLS$^zGlZR{_Pn=EJdc&$6LUK6}*$D(B)wn1xiY5%y@J|6h_$X#$`CHF=Ho zkdtw=P*pwF=eiEi)!*7gHf-vz{`wCDMj#TS>6_(``?%2R!>soQ(D=KXi!SwgrB@or zyO=Ze_9k#WN>t4 zQ;F?=r2<-f@PGLu(Zu@&+DHk`G- z!*TsP4>jFq&P9yE&f&FNQm+@xxR=qi(b_R^7$-YO*-#p=EHJhq{~J)j5iGOc+2Nwz z80>znZ!FA7h{E}RgCjMIvg|giYP?7q;7Ab92t~c!+3SWEb7D147`yf0uhfNBEa1Bh%p3k{$0j@ zvG4%M#R)FzU+o4pMX&l8m~Wm7^-W^88657O-Q7robUbV8 z`JMBBulK|G;&r(9${AyhIhHeoU3Gm6cZmGitj7k~RR}<+gUs1mZqRGDSQ5~PL-WR< zZ#bu9`*|9wQZ^q(9Evws6V*APdx2n@TNpz~8p%(G%i!k`WdovvNiKpH=!$kMLmi4qVJ(rfr`_hEivG z{@omUNm{1@gNkBML0|sFFeNMh>^M>4z}f4iCBRT}ENvMi&D7Q_3l>erC;7Qh=mfnm ze#&@4mMQ<3!2~j0ok)pfxa%BRdG(>YxH7u^hX1?-pUbUul29u*wYDr1X&eG$basqjc8V~8y^5*87ye&#R z0YoG%iW5TY$W3jaI`d{?Y+{~L)zLhJo@uUHaQJ7e)Js^KEWFIWCMKAn?4eMA%YNR8 zyXYjfFF^CBNsjVrK>}p5*XB40T^$WX!6tLYrBK{-{5_v0;4+METKT2L{~&eqo{HKJ z_BFBG>};y4AS23v3u?Tg92e8%|LlwUT=Y}Lyuwxd^puJ4zjVL835R$wqS@M(%ErbS z##i=}Wk9Q7NB6Y6u+ZjP1QzT`U%&-F)|hK6D`WdW&$KUi-~Z$LOORLLG@SHUY*Lyw z@l8!k4A3RD>#1I=`eZ8hM#@L&!&Xe<2v}`^7XB9$yj=P8I{%7#``E~3y28RHH)@wS z=-u*b_SP??LR8|Q!7xWIhJG4!rT_;0u6$%Z)mg6$_L9B3 zozA61w})akhtfPVazsXZZTpvPDyV?*jZ0&jP57THS&IHe1`1r5N#AZe-9_iUOC4q( z+w@M)zdB+F#s_@;QwIGSI~WacWDKf7`#l&thn};k!mY03J&Of{p!e{Ix&-PU2cpUF zzl!J~wDKkB<4g%IY$9N%`KbaZ;8C%Lb&eoAAVm+4p$Bh`ZG1B7Rtrf20#G;%`*+YQ zG*n4&W}hYq=%RRLtFiqpHQ4dtOqykAzvU7b&KO3q0AzG8+J`pl1AA$RJLZ?i>pJAW zCd+%?fyM$q(-t3I4^%8Bk#KAVY}J+eumA)gMF-;sfh&4&f2;>c`CpKn+Nwf0y@=x` zGoxM$HT)A-O-sz_KP~Pw9sD{fx>~hjJ_*gs%fq2gpiCgcfm-tsT1GQHC`E7?nVl6T zIB-(qRg{&bs|6^Vg`t^!$JbC$5eteO48l=_fjaRLk-*)v=pT~^5o{%2UCEuXX)r0k zQ7HXipph>@0SXYTt=0)`YXE7=A-}8dlO{W#zCv4DYepXrE;9qr!Vm+jsCZDD5WNQ& z#UMGzas2B+m*tBTk54d$`m?=quq$4qg#pq5`rk@4slpm@rTuxPLjK_GTz(01kJYoK zjoQ7p+-+_TdC_L>L2w4Zju$(?pEzM+Q{yQ;Kx4$ReF)46;;k&G=nG+_%SwhESC>7& zM~xKzVvmSscX*SCL-Po>kf_&0r)*PPlB$)bvHYrSA(`~U+y7dVeq>0huvV(&+loex ziYXf@Z|`t`o3o0i`J>0f3clRgbVIwQ4P0L-f@u&Vv(>Y;-m!R>7B?XIBObf3K|nWJ zHQ@d8#89a!u3pko%do)QBCZ1VsRXEfZutthyiV(EUi?&40=DAg(<80|p|5LeYA6MLUeMS1*WCL&-`)gL(8Jkc)m75Das>`RzJccGuR10UUMGd{nQr#BlMD^XG&w3|p! z(94IYfdc(g5Z)p`dYBGDe@j0uvJbQFUbZWrZIJC0szr`I-y;@18Nw+A1^&qyJ3B|o zJQ?Cuu5CS3CoplEAXpAI1_gCZ;R)`5mE7>Xj6|C_E^vDg`~`(PphN9dh3tTYCI~iX zV~_Ty^D)01oSiblqp-z)tNV}{NN^ILInF|zXs7@ksRIWz zztCo5JJaWuLQ6w~<8|<6_|tk=+)Z0{W;z)2I?;rlh)^Hc`)qna7c&vA(=1Tc1zq_s zZ#phQdjgp?Oc(3HX-U9Ipwz%8Ab6X;fJNZ4{_`uWq=9kaR~L zG#xA`x{|?gvCpZ=@0*g8z|+sxXhfbChvXl!aJ;yxV zg^vwY1%)-P{_THuWtV#R=CO|vR8-Ug;b@&j&AM?#|Z#*<-Z|9ibtJe;PvN&jpX*_!Z?Hk^dU^1Xkh$)PV4F-sG8R$OC(4H zQ{mBoqDHFzA~B3#P`Y}`A_JCdDHq7SvxL1+F!-j@K~(_B(nMVbY+b27v^eU5=@w3b zHD@b6HpD6cW)I5EWn@5>-H(ss1^Ds8mBpdMN~eWFzu%RtGr6KRg@vPW}H!6%fS$Y#|CrLxUmH>)5}r19xk1jHp%^&Iv38ta=#Hb~Q2?zLT(F>rU@gAO38vIP@dTnY{<(ZKvWKA`IrWRNKc%que_0rwC z0I$}l;uU_-bo`jvZ>alGDTa-rXH; z{bprU&Pi|rIIo=<`-;WL@@9Lcr+Dd6AMc3AN)y$)(dqA+_fm^3R??zG3UtVYu#ag5 zVUM~v!L2sq5q8&CvPS)$LdHbyOKe1YFFA@rPGNhrl#)3btAY6(o#14jGSvw3o(8@v zhPIx7fWkllRJ&M{M@6xVa6b`9jir*>>!IarPd^ zTn(5sbG5Ii_4)a4R(+#TxV_P&!INA4DGQE)OJB(&iFnf`Pk~-2{5SjWa5~>VrZd7N z{9q)mc$V%349;D-)BADHK+V9M)t@qp{S0Ra-RmUh5s%ZHiJK8457M7nrPsO)Vq*3c zo7Pk2KPPR^fJ^UvTkQPCOz4n_iaX{3a!slgcP){sxoqK!9JMrEXJh>Cb2yC$gnhEa z`7TieBM@2Yo+`$B#+?hvi~cH1aeNDMp?dF=0iYH__83!S>;b(a&!pGc9#;W3(9bS$ z*2HHbkpR;ZI~fhfaf|$Ou)2SeiCP4Ka$`_?oqi2k6VantQ8u!)FcZ2M-6J5X6n%>` zuo6wwI%+1A7%wxX#zoO^B0r-zb4~9!f1S9<*TPaHSCsLx?z=nYVrs$7QZ&!l7Y@7v zH4=$0A2G9wo?*dVda8CTg^oeT6hwM+6t`&AP#{Iv77S)j@Sp2w=-6-Ed1u`y&GSYB z4m^@Cu{PL0@d|H2Xqb1&T%M_pG7t3 zTmU3N15kTOqg^o}Uu~W}hiMsk7 zcgt?7Nmn}8;ZdNInG>jNtaf+QNB$)^q$<&IpSlO0zNEot?kZn6ags(ggN5nSD61AT ziURFFFbl}PnX{qxa`M+%`!nDdsE6O;>>-~SAV$l$RZ|gA>1m}u;l%?+n&heHlMpjglx zMkPoUmQ;qD4*G*BAYW{rK)b9qo&YhOS87JwS%EbcJp&7^0fTK=)L}3{@=vDL=S-K? zAP0T{?R}Qvj*`Vj*-j{bWJrro7!C$Di21Cs+>4$(8PC)(G11h&3SmgY0{A9c=E~ZYq1{AODhdg9NF|@W zyzo6eMUFYyZL*{vEe}O$#R_1BkyhJ?y}V7m7qL~+;>!$_} zX#WE^k$~zfE{BoG7#`A-7!3R_%=d%nXYtBW;eV-DtIbrnyJpEC(&+5!7cDLH*QJRC zFS0ybNKfwK4#NTTp}(M*0vK%2^2)~D{P%CUxw-hiQr~9px@0`n*aZD`iTCZz_XLj~ z>FQ0|s&f1xkS)st7XnKD;or#h$}oX5vX@Fsp&}L7aRoFWNq{3EVxDJ5J|||g286P% z4;;0==b3SFql*F8dt=S_qP}Ol6Qzc{yu94^Mp7&+e=x!rcN5da?=N4+z@bWpxC5XR z_=1E`2O2AoKqr9M1OD4Qn8Es&KVO_O1dYzRx&fT`cAa-#_jk7=BU*#^+ERTCf50Pv z55kY*0y>pW0~*|*#?}<5mVyk#AXj6bWb@CGi5Sg|&X+P)fMBWLZ;$2Lo$F>L?fl?e zH+e~29P1ytClw!+GVqp4N=h)kMyqoLp&g8}^@3U_ThT~O&*l*nY|^1~s@rdnu>#sl zv2Qe)Z~&z5Fu=J1ynkDUOb_S*FxE3HLHW|(>w9o(dWWus_;c<1Fdkr7h0^~3bVwd_ zD)Mu859>e6_VApp>eHuBLbNJj3k2xW0E%`;ZBYVCKfUQ_#xLFm zs|Ep3R?WRksEP{gWk_TbWmIp6kxME-qqSjF1TnFN(NS&@5hG(`2QGPed7wSxG~YPR zee1P1!|Utala;52FXp@i^TqGLe|Kwu8?EX}$qyEfD&zh6!rR9W zKxm1>>Y@&t`i3M>c?_9|?U$#gkQE85pkoItu+mOChBL3uxWmx&aDJ_u8)TNm5YfgM5enwV{lFIIJJ z2i0}DT^$7jp3T*(!XI#GKBoRlR__KdBy9Wbl7PCJQ6uN@u>I}6=Z*K-*1#g5 ztu}f_!eh;Vn4FxD%(!7^es0c6fRkZ!9P}obO}@f5$_^;qdWA7YUEc|?>@W^%ggmT9 zK^Ni(5NmWc7|~*{Yoe)H65DOp>rGar)zr(Isq@QSe}36$IQ*my@D#dd6tl^)MH9YG z*g}e;c6RKx&~1}`|C*$YeC~!X)MOyCfH(HP6$H*O>nDAOeZ>!%;G1&Y)H>WEeg)C+`q_0p~?K{~PH9!r|?^?=1039CIiZX;4DG8^iD-nVoNtZe( z80K!dA~dFQB6HopE7 zNV3)6RR7+s11;@>{@%M6;V!=Lm}0;}0G7khd$)vO7r3jJtu& z$T3i&qXYDRIZq!ZuT5f>eg9T>aGbXY`;(_}hVfXvDM zo33dg^so149p+>>(j~cwZlz#WR2|-W`7Yx3+&YD?WBx-)wF;=ezO3#3Jz-ZBSp^ z%@6gyFvdG%&WX({#xrl-AvC{+pbj~J;p%tJh3iUUBy5pNXJ8hEo7+mj)nI+V=fl>m zZjiWDu)x@Z&yJg-N&R3GQb0OLsmVF`PpX6gAxrn4=Rfk(aJ?Fc&OA_;Vey5x7~)6^ zGju=Oofni3VP_F+>y3HP_ek!fLb@0)ESVu0|or z(nR~(X)-`x(ap7gxsyUMCsxyWz_5O$0FynrE(4&j?7gCn`h{->z;P~rH;bj z0YYezqMA{)kK?T=rs@E;is$K_LUOk0=FN*d#i2ZlwRXpa6s7FP92(iLV0@ZOrcENoR`AU9`Kd?K%}f4S7pLx0%! zuF%&=)m&r}Abx>$j`JZ!*`#RLx8tU_1g=Rih+VbAC)-R;UY=UP`3*f`o?>@5gSv60 z5S#d3{S_wbSAIQ5z<9KUzo7lN#__;MEg#SkzVfc`rFFjIqn$YQ#o{jP)q#}YILkJP zNqX}zb@Tiz2sL5r#tko*dg(FBnA2ZTu;?{Jigi9XZIvmWYo7TJJOZ14E4lwfzz-pC zzMAf%zl{?d2aSFdC?tD;u;EOCEUH_&C9J%Q8kB$1(5gn_Gw9Nb?MEZZY%?WAc=79bNBdhD9*!b zYXKfbkJE>)=C@bBzeg4Y33vnPJli9M>itI^sB1kyU9mwqG}@nhnQ6As@Lvi6Ylmon z`ArUd^@EEBmnU+x42Q~ofXMJP#gXEsedPQ>VYbL*UG{BqZpSMULk%unYJmkV=ieBk zs8fLl-7j8$O5xMR4Z+*44=F${MfsWi#c!?(2CTv=?vmzg69^j!`hL>U!x8$ry`K+B zy;j0R@p8k%@%q=ly!X;q))}w2ov(S$B9y<#1DDId>^~Q5Px)V8?9qgmQJ!d&dR`=Q< z_(1idKX=VVkAbiqM6gkpp~}?L{(;kwK+D=pCG6#^3nrgC%s+ z64!mA^Zq4@5`&khmS_P2L#`->*u1=y*<~0Udxb)xff`*mFxt!wJozzT(m02Ry+IyH zpwS(>f=_LKl0-z_@ydtH)kLgtn&`bbDnZ#3DGTK}jOXC$#gPjqPNNUs-EjZXb((w1 zsG776HU3Jtswo0}J}&5{?iF)QN_y`7_>bYCHSIJN+10SUjyGj0OUn_4*#uHc@wWKwK&5 zNL6?4kOjRX+327Y=CwaJ-P$s8avz6t0wV*SygGt%me3iDn$Q5kH|Sbl?gFU(FJ z`4fa9!2F)oS#dM@Qqjg%iJ9l&%mMa0D)_Y8-Osg?8}Us z%tp4Nc?U2c;PvAv5FUntstO9SW5JU`DQ{F*;~}oOquJVgLqWc!vei1F3Sf_pgOCJd zCeM<``bCQe6^#rGupd{4&1mtvs;BSNM6Ckc3=rQgWEeN$HdebhJ#38tSaw!VLeDnX-(10m%3JJLfa zZ>akp9xKPZ-TF3LCj$6QRBAq8-uC9?#i*tm+!=SKgT;o41+hql^Qd)@jI68`Aaeke?GKj$Hruamf2)n>TtiR|`t1o3 zpqTaf^W4cp#xMooZg2wf0TEcs5_l&jsgC71uwMx@IIz+PtVbLGzLnN{jWVN+{~Le) z%EkgvU<4wjn9PGz&CxjKcQ7R1YYsFnR&RwjH=l#I`G7_~3lmfL&6ixfMqBD&{AE5( ztbZ2irB-U%+gFa!%3lH{r4W(9%HNfzQi3{pza(>YQ~T)5PU`3~~vpF9oM4q_V*^atQBgVW!ZEQAXL z%b3AWE5f4nL@e-!b=E)yAMDx%?4>Xm1tjM>FVLr?M>e=Yh~tDDi45j-K?=r~@alu_ zNYp`eLSYlm-JgRQyrB2@22=*?%*lde5k?)>zdd#*{G(E`Ob8C;rr}pi0q4V^;fYlR zz{%YOg|5G6`8%>!j6~Ad9u&9zjvNga4t8b`$%wuzA8noxX$_Nt-Z5MItiv zNMW#$uV4r1Yd}#!?SKi9)t5c6vK$VgrbJ7K%SjBNs8Arn1rjWeHh80zpKsw!(ws%# zf+`X@-G?+oXEZm#ugV-L<<#2*;m-eqGGIBgzSN(~xRBokO2VMeimM5c2klMtX4aU7 zme#8Zv2oP81TqB{lbc*)=4V^5R?`F;SV;rm&PvlkDvZIf+~>8qKv>cgO{@xiy`P^E z;3H8hJMV)Oi02gof6!I`M>n_koOpHUT_LRRKW$=Zt1cTE0f?p#<`FjtT1_f*GlF|H zL-U@3mRnj}!hcp6lFgINpY-U1;+MpMfhr&m4XEg7X)d1-YEP!56gZB6`PYD~t+$|v z25|{kPC~1nYcy(T5~+4bwPz$#tdf=p$kWJZ@~!?LCp1OQR@nzQbL zk~++6Rz~W~&1viN3g7}R+7g5qF*J*I=t~}VUEX2H?X5>2vx9Af<%4H2J zx}Ttg$*2vKfbF%df9@tPFV!T-b$J(^hS($`Gc=Lc6`79~DLh08=Lv~s%l`|5OiMF6 z?sJb3v>v+`J`a)hbBEV;fA>ZcX`;F(Y8YBAJ5sEI$@cKFJ3um9X5^WEn z64ZWP#y<37=cf@!WS)>yNx9@h<`JklJq&yd1TsdU1D8#^QdA-d4?YI7dOlCI>5)(k zc|@7IW&L@}mz|NA#PI1;&!iWiUSau=X`ok0wh`JPp1IG%`&5(s*e3AI#*jhXV?xf>Q{p$)97Fz0VGs^^%?BB43Z$32$Pa}H+<`QrzHn&(~Elf>0^~BP%+0fH(CBg*XnJK62wQ|WZVB7PO{1A+&(^o z@`WlpI+JP=9k}(o)Uy2N#4|!l%DHwv4_yidCOrMJSrOw=38lQY1 z{3xNO(%-!ZWJ{HmlQEd7VJ*@B`a1BxZ#@p7L<%4wHtkBkTYv9+eRT!2&6djR>n&ei zTu=47lydm-e6doFihgziy!v1kUBwqLH^7WI8U5>qKhwabaL4w?n%?T5hnEa*Z;lLWZ7QbR)&Q$~N1$xP8N)+Y;{Ua=HK@&HqL$2B->FE4CJUm=m zvt&+_dDwshQ)ZNb(=DUrVdF}DQwe&4c3}ja zaoZ$7b8(pZ0xwT(Y)d3b4;cb*7LnmvRf=@7$V-vw`TP95$wt3l4V6k)3G9Gh-_5uy zx9iy3v1GbzuA*yIA%n9nwKHFg3`(9%>oPltLK}Jcgv^aHk&B)BO}m>>YJ}obC{>4 zwx5|XM~ThIpJQGzJ$xF`0Y~c_@zUnyZ<)l;WWlqV6hiRf4VW#W9J#a!G}2usQW_*N zm%Y75-9_PWoezFKdp)B8x%Bk!Al>M%3NU$NM(iTw6hYa}5=Y6;)q)BFMZkDC<3Dpm zQ*GcSXHAT4+Ac8%{Bf8UeL?%%MyxA5)R>WZ=EWowuwL!~sEDqLum@iO&#Pr@9Lw`_ zY7aWKg5#=z%+;Na9bN^vK;^!r6IF{8LjIe-oG2)^1D1{x*n#&WzS;zp)}y-TXG|O^ z4ZwMLs!I8WR2Zim3E@?wg~2cBS4k%)0Dn83(+L_bADEYglV)>CX4F4EQ>soL8hfyf z@Un|e*+d#1IigO_oG1SFT?{^ufqNs}T(+rRoC1r34{3q8tT1c!9moKJ(gC;_J!AEc zGvw3qax2WbQYm`^N($eyp!n#VSiA@=!?Ux!2%f@dp5WbiQ9;4zV^L92K4C?d!AqwZ zc5%TuUQAWj+|6r?%^o8P*Xl$1{^2$P^4=@IkjaB63)5pw1untB-B*4NEur=~6}RFD1kb!Yik=R@1#=PoTKzdp1nd&>6E8<3f64~atZ zyf-g|b(4c`ZV=EPzA*yfDQHRi-kCy?fuu^Ot0Vs9LpEB-dk}TTO<^vjPK-I4DpeQofJp1eKS+s>Hx>Q=E9_=d~Tp}Cr^T)M;j zlfwNy9utGk!?DUw*At~>1y0RNUGEg|HP)1Ib_+;#G&G>Ge*CyJXi#^B!*$vz1)L<= z3)@A<#lpdZjRWhfWNFC24@I?r;zG~Ts2sB%RF8$J*F#@3=88ER%(J06JD$g~S4NCIGX-{4nlO8S9-nBCgOhLBc zO*BRTPcMGBdhAZ9N)wMGj^#0+A!odg`oL?M`M8*`8(F^aRYBs?14z7%MzIc&TDL#1 zF;t9pw9tBt&;Bg^Vpqi>58^S?Y2NIIJATicZDx@6w9&H zxpPj0$B~w%Sn4zeL9314=m^o$mcx=kR4Nql3O_-|GP>8|;*r(Z#zhabD0qgaUitjv zdUM}IUK}pln2ntXLbyeo5)X^-IZ+?kl;RFVIGPg=_j735?#&NmNb^{s(eSSfrP2b3 zz(5JZF4P*G>zMKyYo-vobLV!XG%dq=|EUXe`1Ejj$u z(4S;%-c3?1S3PM?o$KS@X*0Y!HU4GV{PIVNlTNo{_aSe3@{6fMHTg|_mkkxK{Qd{# z)39Ia9wVJ}nhO;40yg2y!I2Xy1OT794Hc04;%v$u3aWsriJoaOuXKrN1oToO>zHP zx~%kJm2jkO@wx14l4={a4i2XUiy1)~Qe3;chu=4jtuF!5Qp2=wROEBUBjxL*qUB~)*?+1!ClkvR1hYe#P&ZfFwO#?dIdEkzy@EU#DY|ELC zb1EvL-_Ll8TJg!Pbvz|EL1SB$GpvcI-q!n z#dR59P)541AeztgRsXKv#WReuF7>J#tW#L1_*NzMt=kF_GtEQl$b0pp;wPMOCp&1u z(W#X&erdvo_8siXVDnW{DUUxhCrnV@ybzDRBiC@<=#z&cGk<>g$zAE5$yF^k4wc}+ zT~64IrTBsr0b}&I(cZ7gdweCSisXdic8g^wwDN6aa;IjhPKg>s6gxf@eV%FVO_fhs zT3~#i%vUfJ85v4_D{+odMzi9mKBzE)K;-|nE-!6kVP>Xvd%hnWAI@*L33>30!E%bY zH4g$e-EN_lD+HEy%nAdFDkeM-Vb=AHQIXWYCN zyZq17Zwa9WRLrrls!23)bDD)?EqL16^~PJT8qMnys+u3vt6oksS-*P5z-islZfbL@ zJ=~*kRW2f+L}tlo?kANeeXCdduL6T9uW|CsSj79yzHb^sLtHZTGjSD^rRwsZm9*)7zGA z7@{7gU!Z);az#^Q$Rk>T%jyBSs~6 z8*d78_b+RdeXYD~Rlt1s7n$o0Oy2$CM+UO4GhTalv+1N3^dx`mWxWjeVued(sdV(j z#2NUs&|e3^9BR$O!xPhdQ{csaV)JFApRYUS5$tw`hoZ!1<5}btZ~q=IS)|Xo@A>EO zuf*7;T^H5zaCWPZ{jrJv=ihyu4*1L240TWVNG;@EXLP0rb-I{{nlW%{r)#RZp`;^n z7kgL5a^}HIKl#c(mwce8pyAuuxwy#7Lxuhi4l%?8uo3h0s8?Hgb&yd1`+3haUwiv& zFwV*5>FyLw@Kx)ON?_;$epB9G0>eNVxT5Hgsjx8^a97Re5-;<^{%@RO@%KR9k9<_- zOikmTCE|94ZJ>rmoN|j^T$Zh{f8*;gALU1EH(fnVXCn6n8k~UrbfN|9r$dr&b~n{2h5SBOR6HO5G(OWguf~N0bEPxS_h;~%|12dLY$@?i zAF%y4(UeLh=~=HZ)Q0UHd4|p8XMN%0(;*%WDifHhOaM4lHsMSmfyM<#(&%bq&*%FyGBRp(Lk$8P z=C67*x6?USi+)gZ;G$*23cO79Wi9e zXo7>0B7ClC{5`P`98L6()0I~CKS%}tT;lF1P8GKUK`*neS8qK*M3{O3=1eRO&VpF|K`4 zU80b~=~S+-Ey?iQ(XmYDNf&RHpxXur?ps<~Sfxz?!~kNn{r&kS6l7#j8+0v|Sq`!J53sgTOglS^*ptc6w{xWsbR(VkT zw9%c3kLJO$XZ2b`2O<0Opr40b%0}zkg;{d4I??H22#F`Rh|Wpirk9=lj^CRB_abq_ zbomI+VY=$-Yn%*U)-1V@AB%6TrGp?NCKQA^8V}H(Ks>B5?1wz~k^_G>a9Qj8Sxz2A z3{v>JHARjKx9DJ*N%>liKrFpd1Jw|Oo0|1c;TVBANhCwC`wb87cko7J%nl?Vl!Vmu zu_q+g&-}Kwme2g^J2Xy@5K$h}4D`TEe>X8Tf`pG-QQJ`A7P_uKDQvBm>9S2~6kFM4 z54=?Nv+!Pi>}A@LuXr5$Ik~8Y=h^zuqvwrwMHc4gASWQZ2}~EiXS)4>cZ_uxto7DUdbrK?w1WJ7LN@gGNn6ql z9eZ1D)tW6Ff|WTc57yE>dts*j;cg7^L;IH@>0#B~dV?R%iEI>|o3d_ip2u1(MFk`* zxsGr?lcW@$xbd<)hS`ssC~>!&b%VNqy!0@co96?bp@)SDZ8gag(P#s-f{{_1>Ht;orOVHbgqP2ch?;P zCE*x^KhbfJxf;?*MQ=|>r#r@|6g5QC-|}sFjs*oc=gl{H$(wm3B``f$hKz-4&sF3n z4?WxYvGB&cfv;B)J4+2^a8A&3zv-K?m$;KMqf+X5?6V9w<6vKAnS0#M!SqW7Kbi;% zoU6xgHYv&Os~DvfX?`=tBU7Q_YcGaK`F&g!r|POVy1nO$-Sy!}m*oTT8g@*0wVW_5 z@=e~F!AFmL4yz0GR}4c6{@9G?OS_+^-P}zFv?A<_lOOFw+Y&r?Wt0Y*(=3cLdGQ#< z+Wh?ix?5#QoG>496J-*YBASFAn2~2Ac-^4+6eaL@C65q&YtTG3*zkvoi9c|1^hDo4 zmc9N~Pe~}+I^r1;BfJ5Pn}GWkPT}`K58kzOLkp!~{)ra~F> zs+&>ki+z0G{1|n4dsmTEZm-F{vx$G0rB~N0h*r1;HPEZtXroFd0e9(l_ixfrEG#Tu zr-)*F;K(Xt%+jtuIJG_*QRJag(hM*(oK+7v#zVT&3O`mm_BS(+=85ph^+n|TYWJr5 zX+6fny3bt++wknky#21o(_rK%A?mi#H+-e1 z6GEY(bs}epLGnh{TQyBD)s(RHyNt*faqcGpC4=ueE7u(m!|KRhD@h)$I$iDJtWO<^ z3fdCZAK7E)XS}$`w;N}Djp34>mnaZGkOZaB2W(Jv`E7G9cJq(%&J+KfJ|?@^iD4P$hJ9V!^%lAt=pdH z1MvfJ5I!jz`fh@_tfc>VUDc_j#vmGtbb)v;GRm3;+%EcFqJjpS3`CTnA$oJ4*ydNi zYZyS7&gR5neelN$herHE-s_$f@KIYeoVBdt7_(}E;Q zmX3>Nz;V9uZSNDg-^m+~AVeg^argsvcWCU-QzF8i*P_*iW|0ZGD`YSWGBk)eZ`yA5 zs~aE-m^2-=eV8L`GwxiMc&Qro5Kwq=y+6x+q=?qpn$Ct3e1rL%+F1|l)0Zhl#&|eJ z?Jk}TrIRjByeCO}5XEn&$ub7B-Z^-4YLjwUI}FQ@81axKZUs4=WO%>xj44Z#@(`(v z&heJTgmv3@ec^Fba^S-2-=K7i4RA9Bu^JI~4hWQztuRODD4hpoK2wbdJdg}5lTbm8 zW}jBRET8McV;&|kBFP}&AOF;9aL->Ww=A`ttV_2~dNrcY)gTg);4j{1@D*T0s7#~O zIFG1N!CTG8kSn~2O}4?a;LguibFq~rw;Q^M6s+eN(I!UEpuNQL-Ypi%e|{YXDE;~M z$2IZ7xXxTdBh?}Q~?a5OKh7&Wlz*r7jAo1PH-NuR$)Tf>BHe4pm;51V{b zjbpwaE!(`u^yehiFXyP{iPqC;&lXwLkJc;Z4`e>%fF^bN9uWV{Dn`uqw3N0a^J||# zNKFmJu&XEwvGX#1Tf(ATqCLJEhwHda)0dh}Vjn}`f*x_;8gN6KS`7sSgMXnMgEg?X*0(K1!YHbzK4JHGL05Rsb?B zdz;0kynGy4aSh?vvHfbd>Xv+en@jhbc91>AQp-)ELwC@ltj0bv>NEW4`f2b(2F)R( zk1R2`iDe#yVvNvHJZIGkHsIw zzvt7)IaPVAP>@3&_|3T*`QxL4m@`}Ug_p@SOSJFZs5A47>xwvjg*C^fCrQ2yWaz;I zR$0)%a8|x%`w zas5aPt$+V0Nj=;I8!bYJr&_$_RC+(>xcCe7b!`SZ!!S*f0Tb8Rv@CQDI;KL;{?V*4 zv34wW0pbdR-jUD=EDQ9~lGjaP2#OeV1!@Sx1SqCB#@^Lzl zJ6Q_T7L5id@YJ;qawq4K+AbB1A@a-KCPXM*B~$?gc< zZ;7*=b!$_lyEI2*6H`<8oIWvFueo-zGz(QxBYa%(M@Ku-lPx!sW$2U+#SViw?dj&5 zw96qoz_hcw0{kU|hdo_pb(&F*-YHJV)4D$sPpxA*m7DSh_7Jn=_F%E_YUBr!X~qXdI4g|}mUt6QyOgNE%jBwxFk zRQ<9zSIt_e$MSyG_`NH5ZF{i%)a$h}4+1NJP+s+T*_@)Ncrk~57HM%xMn1>^`=*HY zc)Tq75PQIISv6m>zL6GSE7kxnhL{LW56i4QL%>bcmix7r#GUlkxmTn4yOXD2`LLsw zp=*~(DN_1u9)I1KlT{*9_{p36mxD`a0O?9GmlKA~8fNV*`ojKf3UJDfF{$5Sn*u-S zgcRhsiEo_<=$Yv`T-da^?GoNdo%(aPkxbggx%!3TSr>a*5|PyB?}V{ZC? z5WN2I&QFUQdrFZRAU-0fuL;?=oA?@$e#QcbS2(&Du5)@u+>rF;V8*qrW%q#3%ty!G zccpKAz>0SGlOb#*w+EEJ(e>6(Hi2cV{J1%9ES%|V%r|S_(u%(jv^Io7bTSJ@1^J*70Tn5%L2qPaA3O%>PZ`KfKO@ z0^m2^8r5C`iPh%6oFOBYO0p7${)H+=6q>w+^>!1xf)y2Yd^kGra}rG{g&{>6f)%ZA zg5Zqhf(5^$C};%k`l$8KfG3_h5_^lova|R?J&D%vQ|*w$i_=w@3q`y%GkBs)iuB*n zXr_WNuts~3$k`h;I*mO3^LgZ_`iucJIIe0)rP@0D?+*$u`dPCuuALGa*Z%+|AJc1P_? zIr_5Viu6lnIcz=!E=RE4|Akvw+1oFK4sKSw3JKp-KJdkA+i?h12VXUit;A}Ht1!RV zVp~V0(+l9pBkPDihI-Id_h- z+tc4V0sWGElwrK*-`~y9HjKo&zrA5tizIuivs#Qtsu>tZl1JtdjadDPD~+dvwB+bH zCsB+xwcri|+7s^8h>ZM7U>ZV~p6_>$VSzDb;|M*D(<>_dK_D}Z-h|dZu1bxf5I#*< z`T8PXoL)~OMMc$Zl1^r!5}&IffizJXL48PrQ&90KN*7flJ7YYxMree{$3FKrTXPy) z@p?<*Ox)Ef+NwivD*?u&UWvTLJ<@b<%X>8G1v$Skv%xQ5eP*K2_sUNk5p2=ZBvAiU z_IAZ*PF?HqF7$1enmGlIx*LCi7$~QqXQMV%R49^2_?6pcJ~OVWun>#3Zu#{|0q00N zvt(=>=PU`mBRL}XhNpT8pBL}5JtT@PIsmfn{I1(}AC<>YWx4U26LI z=0*Rs7i}h^L4c`i|EO{0fy&zngt)Gr%E#pK&C|tSswK)gmKS!C#F2|_1virPm@*9G z8Z0wto$UPZddtb2O&OwnUJ=HyT{>c(KSBc0;!m8>IsO+@^=_L3;_;J{JL682x5~=> zl#3~iFc0Q`?6J5vsD{atrP5@G+{lJ)t?n>g`Gi~`ji+3YV<#*XfNvf+&xZ_{-7joo zj9A3pMLfcJZIbu&#nL6ANncskqbe&JdHc$b9bb6*;Bz;XjO}(lX|=tJK+<})(A<-Y z9DZ$^M1K;dXUms3GEFyM9RTP2D@7(>_xbahl(9~I7O8mCjo2>5R-r(T#UIsmzv&Mg zuJuA25J0qG9up}RvV>23s6y1Tm@q)R~Ql~qGomXBi-?*#Fl{2By|ET(gG4G9DihLwXQ#7yMF!p}xN?-LFgeII1pWRZhlqnt8piu8K~$MxtuS%a3>* zqiZ$S)X-m8E;YjyVhAk|FSLDH9a=j! z{4mf2r^p$Wsb4VmUeDOG*xT6!Wry!o*lyu3Nfptp-h~w!$N>E9hJqzA$e?y>#XL
      u|inPKWULT;XXEn=K^NSm>-jh$<++1Ecjb7~s<|4!DP3(Udg1S1r z`R-Y_&9W<(?W)q`l}DQu{h#$!i(fqvxF0J^$UBzuids9XL^doOIJSl~0lPBejh`|O z7Xhk!3k8Z~6J_C}L|e#%tqeWl=}>1u#$p;&YA|t5PEVncPxG8hsT_YM%~ZE-oPn!i z6uVz6E)Oq$+Kah$p2Rum6rbl7xxVTV$8JK`lQ~)ZAVo?aRLhOoyQ(B4CN-KVn9fnn z;0ZaN`Bxc@!~+i_V*($WD2rcr#HvmbL>{r5vs5ABamb~Glg!jPJb&k+qZ8g_+1lkX zrYn?vccJd{Mhq^hPL;OCQbM=^pNLIHhWK;1NaGLk%5RE-Kerk9`51LDv(|-Koj`iX zw@5w<=}Qo=Zpk$RaY%H*TEjJo8<%~>-t6p~lcx!_6Fhs(D#xxJSLusSCRmxJ5s`j|y%g`^Ik@Xn`ZUzfp4uE$opKJ0ye^!`V}#`ZR;OU|BPT5)k7 zxFx1v1OUa4t;-WhU_@(;G<4wtx;pkmI=%F_3h&0mUWibc+~nx_kEo?};td$1atO8s zMHy1uXaaQ%mg?y%j&_ZBlQt7uzuq`5@>=flt(9WLcs?WCWfR6?%7fNxlH4z8*KBF>GL?VQ^V_1ZF zyT-RRCpf2?4-}3ohUaM&B_)>flBKp=iU}EDZH?YK;14`Qqr3~$Yr+^wc`z>)SHx)R zb%E*t3s~I?o+Co8R6DyG@>IPnA?09wk!Z@-O{~QZvbJ^yZ5>l`2Ue*H*+e|gyzt(6 zmcL=r#V(jwsELo#lC+l(q}3Yf7`unpITV-?1IpinghmU;jX@=lxXlHA0N4pgOJ4h} zugn(&_4f9vV4nk}8x{F?-e<3r_qMcdLSc^Oo=&F=zS=-|O>TBu+lX49zzCEq$DA|MXX_$CF*MfN~J>BsCXE zQ2MI5hksjLxN7`NN~qHGc0N7WzP;Pa%M025XHVq$P;#ZxNtWBy(yijzth1YPiT27d z_PK`i=0i{d!vn_0$dacMAWorZYzRhg?xjmhjzXDDC(D5`LSVSJYMOZ0EkJM=`BVZM zz`*GMOxZI6WB<=mU0!QH^*Xv=97DIXpp5d2P39e^KpCYr8(FW1WGn)5vu$LAO&DNx z;~MXWhfXVUk|t&>T6Q+{A?K~u&Rv7=plX^jpDTN|2M#IQkzj#@-QVi!Ai5E#CAxIT zROSfY13H2=-~xIC-nald7YI0{He__Z?g4G$jEd!9fNkhp1{H)evg|6+ieiccZ1}Ad zYQM?D2|CPcKMS78GruY`qH3C~*lL0T8*n`cPqq-C0s!La@$tT_1^@|Dmw^p3+V7|{ zl8upu;pVQmg2w=}gMEHAuk5C`)YOEerSb9t+_6}Tq~rr%?Y5s5If)>%Kqr9>d`?&jz`*hlRb0s94LYS6Ga|_^>->SQYqXzD$Q2^U{y(QDmzs6yHL5pIS@irJW3X_P9;@ssRSJS zNVBA@3hajXen73XSbd{TdtKg=|LedNCN6?F8!| z+!Q4QDRxOfLh9YIRnDdT{Ri~}K&J7onS;q(s9yV5JuHXX#Q}|M0I^;k)(wti{v%k* z@5O$p`1N?y2x8t)5tmZ4rtZ7_O+pZM1~5Yclcb!^Ck5c-Izh9AsU!61R|zXFI9_s? zPAnW0P!?XGR#lXKXaXzAF2J)7piBP-Zs;dT7SW#C#PHEYtN-)%b|F}~5ET_wHLI#| z_=qLT41_$L9*Tc2gAQPj5RbWlZY6&H=F45Tar?p}qn~Xtbl^Av^ZxeN4d?{G^h5!U z7K(+cg-f7!G@Y_$vRtVAIDR@E30_qgyw7O7=9@5+|V;QQS&A(081cznm6C`WL zAWO#}zVA)q$J&A?PrX~4o}hbkl`V~nk(JmyGxO_!+Awv(z?m{Ugukw+;Ov0<91q+X z#3@rGa8s^wB_3>2K(C%0E2eph!&^@}Int03zRV8&$RTS2^gh}=&Nh6BRLk>X2@iI1 zjBGJzYZ5OkWV3Y0r+rstJ|;LG;_-_tGm|F&pDPV-f7GC`20c<$`;Ruz`(4T;!w}soIu@uDi0V>Y zncU?j9(r@=IRk0Kk}u3M#6jlMX}g1Z3%ES%Vd)$|Au^D#vwwjf+!{3><}EIOP^?F@ zNh9m=CQ@%YzcC!H3-d}4h?d64`2nz_h!#={!pLl|gz%ok%bdv&dP&GN38#O;GC1wL zgN28|6TiCse=j5CUn~3?j`CAhbOzs}2bLdxKm}~{eAdYa#0D`RAOseMHRm`Bu!wpN zXy?AgQWjR0w&O;yUprWToBGhUDWpH-bw$)tYID0TC0#Nc@nS@VrxS@%b8l+ZFQW$* z2eKDXrChz4!OcavNPnifhWLn=L|YQxSKf$E&2TT1nya%tpkUrL%9+p1*}MzFq(+3fk_&p_}C^QnKoK1K$-zaC;9q4)-P zBlH8rP?*ZEH(myYv(dG|bZhz^1$PD5j9kco)`u<~w=S{)NP+GeVtde9GV)trJaEv@yX>+EWUDEkULW`?*(z4 zk#O!4gnr}K|M9_t{;Q5?{}a;>skkka=U0zupH@|P(vf-pHjEMj8Gb5{)ybpU8b_W_ z$3PA+nHFyYQ~>!d*Fd|FF!I!1V2y-?0dCO%;lalaP1LWVRP5w;OXQO5x+OiiA8oGf zl$=&p9tk0!udiW2O^u#N5;;m=C#0!bm9N=DPh8n7$}e{dpWixWZ0)R>=DN*$%T0=! z1H5EXJt43B#T;M`4W+n}f{25AhH~E}$ns%_7`yXWIoKs>mpAD4M1b};fR1be8W1Ab zlW-0%e9z^x6)(2Mlk!hK$&73slglV|aslIs6bZy^h%J;UGsOz=J)g$8jL1^jUu572 zoadq(g%e|hF0UU{zwQP>KvrnVO8D*wgHBuXWVu?NT$szYJK*^055EZp^_se`H8$X8 zSJy>&v6GUpk)s+B?h2VO{@8Yqa=@v-PoFuSJ&pMfu>y+_@G2fbet8(0)+C5Z-XGb~ zKpK(#j)I=s4Vs4UI=Fe>(dhgTc~&(BJ@~mA&b%~bn*nJ;`vql_=Lh&RG;Ld}q@n^nMFW z0QI=%i9Ls<%lwb$8t#`f%VNj8#x&J5^Tg#U;`iG?CN5GJ)CQ`Ww+w$d4}%$CKLy2%W}oPg z!T9K3p5Ehduvw}H(R}hKWhm{9UfB(wJMcLiRpH0;|)tr?SFQ8mN@l_g6 z#Z54w_rX)~hRZdrP&b@4eo7d~1B-wwww|+faUhJX#--{-caDv|EH7I=dDSMa`8!0( zhde@vMrf!Y{eU%zZMnQ6+|l~7ipTK9xHXaGRqd|bNyLfx2Y|EE-`$RlF@+XEYfM+= z-VwI~u=GdrEqcU6J1$r?u@Uc{ZRYCqVLrX_sLG8ghD$6_zG(&E`lk? z@;iv-qKCmX87w+G+;~3sEyUkY)-=n5=XWE(u3jLHmrhD2&c+zmqOc zYE2L>r~Whn5NAOV1WwF;--T3ZZ_2h0P79ykl$>^dGG=jQZ7qBb)J<%Ms76aU)aY{h z-FEbBLgonXDJe}s#&uiYqpM)EtHyttu>5u^F#Y}R;FIw&*R7we_~jmJE6=9=ogC5t zuTmvCnJ&=VIMXH%6WIMSib$da0aOM;TdHwE5ZizT2#`VW70{P<=4P|SO(3oceI}0X zrWp(g4~a!gkJOH~PY@tZr{Hy57Kp{k#bF^R3&0?_<2LSMcj%3ab6SDyYJ0AjkcQ-d ziXp3JBbTw@Yy!x4y4-uw-S51xmAt|~97W$qsWqg&=>Jf9Ya#4crk+{9V2OMsx+`mS z>XU2y--GkBfOszXt&$=OjBk$i(_v^|n7m6BL&1EoXccDif(_w8i1)fuCp*HuG6R`r z3+m~ixS*tZ+j)7Ob}sV4NMrlOhzs88&}9KL-iC+TpO&e*)>MnyI;!QXd&Udd z@Bu;=Q;vhRGJm%a&V(^?=={~@N!kNaS=g}~dU$5N@i1159H>q&?L z0wh3svG+UH)tK(-_Hm)H8MuG_%wa_Dn^og|Cx@V{mJbcT({=USL-uQz$Q8>V z(Ua8M*r*?I-B~>^Hh(@Rc1<|&GA#+G&@Pf*@^eXu5F`VMu2UfIqfCmd9-hROnMRGB zx4umh{!jesHIp9f0csMH;TP$XpcuaSeg6zUVA?YhzA({3cy;~p!TUi5UA?2#!_E)* zLSoNPcfENNVH}3PJ zGK7xgn{uwfIy*P8-TAUr544OalfCoL@Lj%gXfiW0eyG-YADb2A2R0(&23r9AecbJ9 zP<#HikeIwM>&h@mt0RN%ajMxdWD0}I63i$rNHf)JR1p6$fI09 zsQX0m6%0QRd$MJ6bx@*6rWq-?YdZzOC@bO$%fd=>@76W1e3=i7|1Ic`t!_!pn%G^L={*_n@u!dyn)PH=apH2DOhYA;R;iA>lt2 z_c@==nN9YUd>wo7Ymf<+d325VD2h{J*Lg6G+`mP@tEJ{OInm49(>{`4rw;X__(_JC z{RGt%Ym=8iSIRSZ!L|m@y-R_5r5OtE=)1&p1+@=mP15dK6Ot#wpQk~c8_JMh7fHP% znf6H`PbHh;#r=H0^TW>g#@lLR5E@~)Yw@+B)NUbbYoG(8E0>WF2BiefiVd0OH9Fyal3W3*l+u6?{6d`>bT#Wz)5EE=^u zv~*wV?TQIN;DntZ|qu#Q?^qeg)XDT!c@CPYOgmlO7>uiSoPP z8X7pUJmvlDpn-pzAI)!-=ELk~$xP-LuBhdg7uhMT>Df8vK>lFI;Ld)%q>Ou;yWs_5 z_Q%n%;=6B+m`N4f7^#PfMR$4Ui!!W~-ay{oy$)OJ-WmU1lP47e-pbT3K+sza% z%x111)9YXT>V2SK3dG+_aOCR?Hb$xf@%VNNBR&~5@)tWAgSBc*Zq_}+pdk9EjD5jU zTl)iy_m(;xJNF4Ny!h|`TY<*ESf$L)um9)*J5;m&Vmm8q%)k3<5~Unzbt_Q*2`=_l zDK^%csPxrPok-MQZ00v!&g@zt0lAQ&33c#eSWgDKd~*A9;x_pk(mkR{O_J+Z+N z6PL(@6O}IQF2;DxUgU0EJk^cVi9hjRt(?7RomLA)SF!i`{qmmk`vnN8Iq(;6;#xq4E^p)@yaeIB z3kq5V&?tOUK@2B*guQUUn$NXr``C0^(sZ&?@LmdsQMR>YNPxvHSV%N=0e z$yGCDpV*O{K?ONn-1{@v567@=Ns1F1o)c?lWzVF^$2VmW43tu#@v8{}eX;>yyhiAE z{u2KH-$F_VN~|`qMd$K2*O=@^*jAZrVmQSFN#dfAQ!OwAH35|DvhR%i(|7pz?(x6S zGnIc(quw3 zo=M0*&j5oZ6I$*Kx1CWzqD#!6&slI+qZAd1p}BxU=;^uM!=wplkM3_@uOVCB0LjEB-9OWWE!wCaCAL54*GVhMPQReb9*u`@KjYhOWtsx%5 zWDM%Wr-|aiwL6s>Hw`QKw^jd^%@{89jQSw39Uy}DNO7X}4t))cf$}-8{&0!VZy{h* z6*SHyC22~x0u1+`AChs0jzG3u{3y&ovy2;l5!%fto67UXlWE^w$Bw;vP)7NX(I!&- zp{dVGWkgCwo0*KV5>or|Ck|l_^Bqp7`)uc+t=K6L3T?%~z!R`ma)5sR(Bol)6^A4x zm-%uU_X}##;2q{7T(gIb|Hm5oeSf^GKF*@z3z(tOe`0L0(w~4*F7Wx2@B(IBo@9gK zlOZ?=()zuPXN6%OWs)8%VC!jzmVhShkBtMro4ekz2UDTyfpOa;SpabT7m~641{A{J zgvl-F_G^-56vVHJvsxe~RhOH|XWT21maf2Tw7Zy8_0C z4EI0uMvf%~1OkSQ-{qkW48V^K_;V>BVEAL@!$=_6k394#*%t|!(aq;6Y7>Jt0k>bhgEsH#o7nkq>_HwjS{ z!vPgXM*KU1ZQftJX-{?tGjJV9^YYn1SoB@>o%c`lnAd!tUiSI%SmB%qm%5~*rWNyv zqSC^8F@^qI^ag+dCTZNu)eEV=>mIEAE# z(qYVZ>@z%JEmYQ|2{|2X`u11Z8FK-;JfGDS5)i@UPCs7&SqHu8Bx4Z8nWUODAMXpOi1lN1 zpE&3=fm+asVrIt9?^KOy$`4QM^D(R$mTps@*&fZ8iPpN|0#jD#J1 zytkR|Gsy}o5UIokUPwNi2MJ%eZTj zG6S@gUSG}Qk(`OY9jLP#xECy+@_}*ZlNDcQt*BRWNRv{DY!h~I0ziWew7lf-Z{ z6sMr#fUo(dvt)2&b6Yq7`fTH-E%UGYCsW4sv`P`L=>;SSu9{G1RZJP!+o{RU}+Pn4uz{%aQ0?KjH(Rx#} zS)S>gC1jEPyawc^jUkOm2D*OY7BgSqsew(CfppObN|zT)2bV>M9F*XxZh{euU!7c* zQx9Nk?N0j1J~Ekyoz?E1yeF4E>?~gsFuL7La$I19gz~oSAwfW!)MK`uBq9A45C{&w z=)Li$;~*>gx)YLfQX-gQOCh1H<>JHr&o4|l!>%CcP|T6obGfj24qRD<=m5|kz(cy?UYmtG@Os^7c_s(l9iWS zfYKu;081RYvJM&fmcCDaqFsD`x)0=we;vXTD@f0$^q-%V6O@zt@l6S|G!UbmigWHD zzOveQezQy+`i;fG7sCS~MC3)LO7-4zOn4aHr+7B-!EivpqsfP6L6{_oiSt?DFz^I?%71#j7p4-m_(L_(X=X3=CD#j8Ioa69ip*RUy08;#y;T(C< z)AOa$Wo@-thjT5}_58q)w3+4WBCJm8i-!8cu|s#Q)0rPD-Z}!sJ{LxO)TJ=GhJZYE zg>eHsta|c^CfFp+AD6)k8OpAMZ_&w}_5(zBGCPw*<`Y)vzQBozupey3Mvm)u9rp|O z{_{gR2dsCRfJ<-r0`X(-b?_?oO->{NaIc^m_?`7Dj&VV=A!!h4(OJe z{|O?g6&1MDj=S|d!(X8=Nc)eM%b_V2C{I|MjYocm4K4rq4KZ=BR2_t8n(N2_8+iQ_ z34Tp?{u&>EaglkV)`vHbCaMH3NvH}7G5jgZw47hiXx7ZQ?&z{*Ari5gPJA;^#tiBg7{UqEUuA>vZ$#>{f2`Y_SsI{~Rt8aHgPOgz)xETp6;<%iW zO~|DB>JvW*Ntv{O%)T^zEp-=iI-^obH2zmYkW*-aGWLsTzWJJj$e-j>i66&}8wxK* zh=xHpPc})GMgA;Xoa(5mgHHNhkOB1Pe9@ z|7v}a@0(67!p@6{NVk$u5@LWoY*; z6(xxX?`{OnN)6_{(88+PP5;}F6iC77BADu0?R9>#62ok&N+qzD;oCGKmG%@-@DOna z!{-pLyh1{1Pg5v|BbT{*{t@eiSqj`XlwZ+Z z09xW@?7mvPM96r*VZHW!W&MtrCp?0}zJL{E2cw=5xFY`V`ZpHd;LE7U=bt7okk$w1 zi^3kX-60Fn*ha+XO&ETcc8{)^JAou5+`~JBVOsUwhO6=2?$1_Y=Aph$g0b|GN4C5u&pYbsq^glxYrgR&KlQ_> zOU>?PZH_fs^`f6F!@xD#&40x$@G1jE%s|psdVQYT{0`v2028(lGz@~wbhwdP7=TnM%eJ9*w`jA7 zq~%iDRPc~sHn$tO8VNB!fP)bK4!>{$BcQB#Q2w5+k~gQYa5NjpkrDz04OsSpq(IEm z<(i^E;|k1%6Wpxwb)n?8OKz7$vqb})_v`b?Fiz}sYii9mM|~W=CQM@3jd20h4Z<)z=V1Zg3+EV{s~&54m@JZ{wMD&DRLC0 z7@7(KifqgW@C}{9d}*9a9oFcHTT}{{XJ}GFboZR5-6tu0qX;k(h^n(W4RcZ1j3S#{ zf=Wti&2TlI#UKasHd|fRy`Pw&-&>6&4xWf9NK`0`-^CdDlXyQ$`rv0gPS2(DXpI+dS0T&8KhdR*FCyU?(2$qe4f!X&TN*aiM5lT6mHPS zZk=WUaH2mq|Eh!kNv^2p3t~&E3sS%C=;ANcUM3a9H6dydCK$f!ft_~oIUi!Xx_d0! zDZap)c)-zQ?3=``r`=;CCzQaps9BHl6*!N)1I+V3$Ni+Q_swFc)c9WMKFDi^kwO+L zlC2J9ymGVc;yn`2;})feNW9~{Zgq#~wl&+*%#!I@@@m4-8-D@SXQR&f(ZdHo_o6a{*f0q~qDrJ=oj@uP0 z=8g4anlxIo@}+<<2Cp`c2c3)8AS?e|g%yJ)9?IsN%lfVBY*OV<&a(67Ai(vVuhX7S z8Jd=Zep^<~zMP1`kU9@0jQuZ7W6HT*^rzIz_UOl z!D52;d%bM`Q!O30H?D^NJpa(Q|A|<`KKSIyWw$eaCi*~5w0xJO9qdo&fOZw6g2ww# z&y>r<*nT}3=(gQrRZX0Ddtp}u8|azFEDW0=28zc&MbmK?=!!rE6A%rg9ur(revhNo z@5W+vncLEPDF(jgseH#~bEaIhGQs2{ChJQ5)^sy0KlKW$>+ka##-E(qTheg8xt_ZX zPCEztO7P;i>&0=TO2RnUf{eba!}$O2axC_E_4@-_7j-nNN_DCS2QNi_fL1A2W3%G> zBA5|_tr`I0!ep?tq{bSbH2gAb6}970(P9{5dEhl{Sw+aaUMI5y0EfX+v45LNDEM(P ziw;QaMkXdiLTjX8{sf7dFl8+w&2G_I+sT$TEI;&rLJO;Ig!8*wmPKv~@tMnPNe&RFlZ;lR;`k(z}|O;32NT z0XA^yib{%BE`ViVXV<$`tBOS21Cz{ok^W%vJaV1Q9?TE?_q1c6hy&*U1qMB4Mb~YeVUsrr-QLFIFwp0` zdyd&{{H~jsSbN>h29+m%;bZcM#4NV1=4}iOOrztd`cG8~jMm&;*19tfSUS{(E@qUuR~m z86;(z0koV~d_Vtk8I~nnc)*dHs786sCg1~!OjJt^!j>zYWcmH*?MQ> zFu6nX+FY=$?H`GixNOD?Iy*599FJo|gTV(6hO<*8krC(d;P$b&GUYbyq)nF%bfdjw zWXhttBs?`yTX=P<7_~*CqnD>w)SMf?`Uc{xe?4?mtA%Nx6kQ191rt+=rs3}|WMN@v zq3W?41;pYBBefYBd<3*mR*WAXnB=6d)J&MWZ)%?1f`*I zvtV3*8IQ)_*fj(OBtY9L1#}T;VT_CyVpHgg7{kSeBsigH5CAFk+HDvpN7pKn$g39- zlXlXwF#+t6?7xMrfTnns+7D?NxJ%b73QmY$^!`XeOoYnQ7#!(NWnb1Ee~*ai z(bpiti4*-knV5_8lKqOg+lH`80MY#Cd(dA)&5%QLQ$CZ5~V z#fQB}1NQbjO2{a^4F9|A*4g~nV0^tm4%#xs4}AjvQ-fUt^dtPgP!40oW1zn?B?w#q zIwtvD?}+1C=bmMn?I?y0a-JOB)BhbOglZKw1sC6Vgiq86BeNii8s%7+J z6yW#Je|Hd94=iCFIhX5Cp&>EFhtXe&9F!z zeAoohcuR`QXQwC+286<$UyK?v^g9fO{VwBkb0_j=~ss<{& zmu-lYL8gOzJq;qx(*1c~Xk>z}efPJ{+1)9cTmRMYjm5~R33^1Mvb~^veW945Gi6VV z3@Q_ar{>&q0B@>G&r8GH<(Ye4zYK9sD@mT76nTV;@QE0diwg{* zg;TM0&W`?~xLYsM&CS_v&U3&2I6Sq96ws1GxgX1m`r15wmiNWuxu-6VeZIW!afqo( zoae|#L|vCF1(O8{0&`s^$_2cR9+G@7%rcN~6x<)aqP$V0MT}+i4Aj z3OBYIoB?iEe3V+Pt=L+DrB34G1f~Ixd>ha`qtWMaf4Dv@?veK~aGXL2#n^?wz3d1Y z(5{uSm~(|(%eTZ3J-A+A$Wt7mqDaRJUO$IEASV4z%1B9MMWdvg>@sMw)(P5%b!e`f zUFbDsm|5;~NnC=727=jG%nz9?67~a^1uRrfuNgc1!Up)kVu&<4r`*Zms`OYYC%0M+?o>)xnTlwe~7jr}87|W(k9T*<^@Z`?`*fi)wLS6NVvWrI=^%8pcRy@xo<` z!Y0W;h*MycjCh+^6O%SK(njw2P-Lp8q!s9wxnR(5OUc$ES0c%Q2Ye~+Ar#CUlYI(qia}U8*d0(S677Pf{ zIo6Lu@2SMPKGz3!wKih@Nhn(H5-Ph;<<%6?DVoKOJ;DNM#2uhIh1EqhV56hXji6nY zGnKe4!K?08*-eqyvw+)LwS(HwqwsZ?paDztq1PEecZsVWH$ojMJuC)?AK9*|ylLWF zqLAkiP5;P6twvgdX5jT_6Wpb&(0+csx*x+Byw}6IZ8=ShjK~ci0AMQ99^^!5qp-P zb{dVpPp?*fFQ%FEyEmbrSJBAyFl}QdPOA7=xeV>IwNBL${WFIVKJixhW~f7XTw`+< z&2OjDp@RQ(=_xk%lOvX!i~CD{X5-TBY}wnQsMldp8BLtW$}<#*Et7H(I`7j2IM!}qEBQ2mO3k%jo1+pe>L*Rf2*f7l*bIWu!awcuV!@2CW5Wlp%2FF|P^{ zeJm6TLs`xl-gEQC(R=KA9Do*W5;I;rXc)E#7_7t$9YrDTT^PL?VsES0g@=Dq<>Lx5 z;^&l?%|oe8^OE7I3KGoeSb&(N8e(R!8I7{uglu6z1-Z!cw5XBg-=k-FPHwANb9!Mj zpA3r8UT3WvgLRUvu^6`(#kWS%_Z<84T3`cBf7%&spT=~2f+l;@!|YGuKrJRgA$2$Q zV;i^OC67eo=%h6IP{313LP(6)s?56lFj(dB+10e`)5G;V3&=Lahgv#2L4bN#f|PIB zfZ4I~K1r5t1`&B^h`^}`6+E-jA%G%-+nW4A zn?R_Sb_FE90#TBL7=s8k9$u>ZkoPGhqTz`hKn#uJn7g1^k}ACJ7i4Jg^I1hM8X3(n z>ab(j7P$<|W6w~O9|r+p$(U4RQ@%4i%Y<zT@RpJkW7m5-3G#&5Op!`U7Pt$Y4}HS@w&j^wWFJ3H?@#6#a)$~@r*!(Xb4 z%?e}5!E{NrD1)v|s(zkscCm%&Pm!DfW6Q^Re&p1k_J|qyorCouG7Z6Liw5DgHC?}! zW~%;I^ov?vx6Okg!ONm!rAr~$ZplAgdlpd&5&rJQa{cLz^kJ0z{lCljd!K(;DwkGj zHa?@(ECsmcR%tlN1XP^qJP;OQK&<;eEDqgj!~Zl0u)UgpI6xuw&HAvZb{%=JsJL&3 zJqEsr(7{BzJW;$#^xywYTy8rbLrYEp`p;XQN%4?xE@0gden#a$TJMsu zB%nXQDDke*1`iO*ouUWx>@UO0>$N^NQI7UQ+4IS7+z=Rl3z~}k7_i0$Om|^y*XHE6 zFg#AeHEkvX3XnfUkPmQ9LvLFmlQdHzlY3@-+w$w4%776RmHSwhQPIh+=imr}N}6L4 zsWs>XGIHNIKeeK6;$Kl0R8>Qv($aXDu*jzw)@CH~a)~hBsbYKvq{&cx_^zrRk>1pyKcC)JECvB8i;yNe@3KSL6+_9Xf!C4-7NVW^99dCFH z$nA$8?v=mcW&p$r)9nw%|6zUMLK)wc2W_qsgvW4Th~Ej7c93}b9--HFhEiNz@|C1? z(Nnm@mCU?B5%NK0Bw-ptVcRg;5kkUn*eZ}9#GTGHE5X|dp*%jeC#E4}pH#aQeEcTm z^y^NWadXdgZy=KIJSXGRX(YjY|%3v515T1i6ol0-N?I1%O2V(@q{)L*hIka7Ia z0a`!=53y{}g|FU75?K@MWXDW@6oYM=1*=jRnVEB`%HO!)`u!lq98O2kI`~G4F2;Yu ze~oyt|7r1)6x?+TZ_9;xj$$rJ>~N1KOg5W19hSb*)9a4=3)#|{u|L6SY=<%u`Pb#d z`?L?Z)Px=pn|KQubv(<7p^q$fg#^#g!))&#-45zXq6dL9z{+LciKFjVwakM}>4BC_ zG}>toWGyR-c@jtv*T5hr)26RzwTBTH-U~-`|K5=yd0>5)D>lZT>vT zTnuyse=IEE?!D7TDjE4C10%1WrjSy!tNyPa$|b;3IhbQ{u`b=V={!P?B^T3GOsK4UO6s#~eB**o{nszo z^|Ria4~4CarZaD-xi}uv3XU#rylDe!$;g*OVC)ktyilqm?T%)ld}GlFCQ)6+M5Vqb z$NcTdI&H~dL+w2#^R|w^<3U>h4`5g{8@_69!3BW5dw)(VX8--5=UI5s_dj_(>vMrx zqm0_4pg?N1N+a*@z+(fA4Cet0Np%bl##~YX3PAO0H=oqSFiG*zQ@>L~nQpKYP-c}T zoTeq&28sC(8iD2w+d1la15}Wsb_c|b7V<0?K%WT2JI<;=9Jz7vEm2(|C)6(S(RLIj zcCD~>wHh(Wq?sOU%51TInS1B|`$h~8l!Tnb*SP5f6j}g`Y&imGkGSVJ*Py`mZDai< zg5Rd-5o<%D#;lngLtW2PrAdayv})Cf+*_?k0b3NYUjJK;uj!V=!O6&T?CUPF)SW=CzJD-;~qH1{)|(Ob7iB z52vkzaz0^Y4;4~HM{d_L(8Y#B1+uIC@p<@|(#BtN(r>2cy`s@n($vg-d_lx6uUhNa z_L_kImSco{FK0L34cfkkoQ%xf!JWr3@x@Y(s-jODeLy&;Af2Wq5#`uYk`@n7=Kf6O z?B+vto~3Uxi?wIIb?->vW8vLy`hW7#W#2a=H)+iDWXy)%p_o$LTbO>=5Dm zx`y-RVyVK;eCgESQ4Px2oRq3}Sqq^Q9N`qM=op2ADna(j z?al~?J(=a8bhcI?7vJI#h8T$^xjsY>xytg(zU`5s=i;I*9`?RU(%rO|FCjg4;nCjN zG@33yEyIf9Zw+d2N`p6DZK_;<=GA5QExo3qIH?|Fk~t|;t3`VNnQ`BlZsw>Bf3Ztw zsd3dZ^BUqIe(w&vF60%#acd+R4oL()XP=t+h|1}iJMuYU&WQ17UdiRPm9vR@?}v_e zZGC3BZDTUnJjE+p4&PdupEndta!9VTv!ka=2AS{jnAM=G7IT{5ey}Mb514Z?;`Wt1 z<@GK~v02!OFjSnvS2@1Z~YX@bfgyD`+2X!IPFAg0fcRuox z-Hl4BI~y~TNZdl$=zdd7^`3>|LXLxT$iVWmKKJUY^VNC&5pNqsRW_WJ9j>b zf4)`k)}l#byWBXi*&N=uxZr86LJD-d$=O&+U^Yt8_je)RZM+qJezaEWcoC!Mtww$VMH?vbkucB8} zs+mgWnne$>na!-6^)Seha1|!L^A~et6{pCFijKCsItDPRRhn5lkK`=j@l2X7+REqh z@0&^zbqhLH- zqd&P-?Z=k0W1M$zk!IN_cF$CRJs;U!B6@^71R+qxg6l_5b9uI1%W4lcmB&U#%;!oN zIKp!R*BCr{f?gm6N+4oW<$ogb?qXj~WSkZr!{EeR6i@5kETqMzj}_?E{IIW78^pd- z+Ypy4RBy*Lx`F2?l6kUGs`<9dKGXj!De=Yd(inMOU{`GfmB0U3Zmgz@pP6e=Xn4{> zZl!TBt$J)kU$NVq6!UA5kU1!%{-LL_VST-s zim3-VJ|2#(ehA_krqy)pw>rP+41Ty` zGUi}C7EGN8C3$MYDk0&O7%YVC%>r5{sN85)`XXFktQxQQ`Vh-%=!bDtGVkf zOXQ0Wo0r6d96iuQtv)#U7Zb_^69GF)@YbF!uIt~t@<^u{HP z!MF5N?L3`THAj+*O5})^65-R2Ex|r?Z9~<^c|i^MM+Z6n$uEX#YSmmq9#MRdp!MC7 zpEsrwbjZ-Fq;);+&K-S;eA#euO7wMmtYNqIf&lLTzoq$A5_It;$E`U2#opM_oOGq0;e&#td`fCG{gV%&rZM0r{(NJz*=@b)D`cFr-=|e#UNyu z(0C9`nDg@?A%p3RH6M=rkz(|q9{=b!zOMy`LJ7}zl-xXaTaZ6eI#WopE_n2$cq_Fk zU?-*pTfZ9cZAd}1yjP2T)@7{=so}i(Qe%8zGj@IQ>9yl+yAu!gYAUiGwwuT1aqH4I zv6Hi~1K+iTbu+HrRwavWwj_MDpXVfxXFG}iIG^_Ur3V%xQ~ZrMoj z1w((@R@sn?5(k-PeSmb+*|rFe**p-go^d{5$L;kIzbEid2rJO-rV4y@Soi;0yAp6H z*Y-atk%|(DvV^Qjk+m7J6k{C>vev{9F%xFW5X#boh!~k7ds&KbLY7k)WQnpQ*$E-W zzL)QrgXsLf@4C+SUH@^tW4zb1-S=}Zzu*17-ZAf?$}cF}vcBDjw_Vi{RBHDdpUF&p zAr;?sM^BuYWqFTHYy0Xk{l1@_ouqssZ@Dr&Nh8DcOX}@M5_7RgB(mVzM2`ykLF>hf zloLwi9lL-_{uPx@_qmo_yx(o{{kO9-?*z|+RJ#_pHa~}zw8FX0|?nFJEao|Yv{SG~4)0KWw!qh-wJr$hOfc#a(#wVD{8 zH8!qFzv^fep_g9?8-9Pd(X(}NYDz1=*&-iV7M_@BTzHqLHLjym2<@*A+%j26V!%}S z9QPS^iAWKsQ=(;pZK7!kqYOfYpyqrt=u3tnTun<`E+a)MP=Lr9YOXl6U>JJhXXKqq zA=5z+Z}+c*2M1`Mfk~crHERAz2{Vrtb2^(n>-`uJ?}bRDV;tR`+RP(7oGpQl&utU) zD=J3In#h#*U@<_H*XwzV{aXcxPl|j(*@(>5A5Nsi0ACHf?hB%Pq;XBHxG`c5v7Me3 zy@wr#M4cx#pEZpZh;V;-PNG`yZO7VPmNF&Z>m|J^^jzv=wP0f9*<;W<_ql+mg=?m7 zk*{1hE}5BP+MqBQh~a!VW|-p0hJV@(A@8`mZU_g}j9aoLEb>XDv6?3$yy3r8d}-LK z=z2d3mdB!aG$TTeu(~XnsT(_7*sXM^lB(ogf52V`0kUw#`tF+e1{Ott=rBDx(z2gp zX^F_D>EXG|L0wLdm|yJi3pVAQ?^?32ddD*4QPxTIhK>k-%8@geG_v=Q5H+K^GE40` z$g-}{UFJVsCnDX&_L_9P`p z#?=Ti@pLu*S@_h1OwkSr5Y{H@YHVg>5$MR*SlMAWSmEC9V_{jSV|IDBFi7`y< zNjTf5)A*@t_;jDfYk(I#*6~6>Rcx`i+%xlK)v6DE->U@;O--q=;SxD*ysmSHP)_VTzQJK;mvY82t!Ssk9_jW&T!k-&&#zyApJ;3+`3>2|Uc^ zJ8l4EZIERfTueGXO%Uql-Wg+&ZcKk-k0F?6^8;iV|j+IKdv#fGRnAr&5UFn zrFFY%XhZ-QVVqC&G0EoY$A2Djx!B#KZ(b~)M_o#se;1zQ^+S!YYAvFXKo}yV z?$sMJ8ld6T;CANNRPl`4Bc!`iKN-l66$woo0-33)D{%0Ppg9_#I~GywBg!VWt{ldi zUA=Ij{b*MDKme@H1%E&1G@D)*&)A#q?W_HfKh(XTi>!{t@1Kk(K638PHfo)*7mZ5o zsYp|`o61iO5hLl-ra2r76=YO4rC~lGgX+pjlHctzKcc#-P-f~r-cLd0LPw=xRucHA zxZ%d5EH3g9fTS!c)(ATGcWx)i&7>zOCI?g8`*jkv(Cj64Sl>VQe5_XUop7V4#XZ(i zHBOgG#=-N#EW64Y*lCPM(?31kMzUl@D`p`ap=I(U=|R$q66t5w*pirRrlvQu(hr57 zMi6)O4l&V!-6hm)cZ?!1`SE2+yX+iUyY-(iO;-k_f6Vxz zX}P0LJBTn69I9pTQH;Z`{Z4=$537HiI1MtrbkgmJg}Ti(p~suknoitQSR!H1bjr2N zx4cOn9aJ_yL0rIN?uVSwb5}tTgTlxii8_5;6)Xc`AmrIU7&~)4J)162I7`T|2Shp87S*+pWqvsyarZsh|syHyQbn_x&LMx`X0R zP>Ecz^6g@_xT!F{70Ydade9vQF`oT=B@c5)Obxk*2jEE+)j-u#Y6|Mv6oI2+H|A&3 zdQ7oQ!wi2wo2*Dd{2m#mGA7BdVX~RNUG?t5nnZiyB2QTl+O5QoIDZhCV*0%Cs)gq>wc4?47mdiUY6)*G$4fnrBH$pq3A?A3h;=qP zP_i-|t~i0na8p)IC>&&v;2*OL#LVT~6V@x1yc(MxBeJJvS4Qh|<1o!<7Tl_;c7%)x zTaWV~UeL30hg`i-F;sLJ0Z*AryDb%%DbNPSRw+%*OzQ-d7%MBUj$qhwsvK+&*^8y5cG+!;dAwS6t77x3 zDz&vfiHGdDe=q%rbYLHG_bGFvG5564xZ~5gwj$p2Z03rb&?R-Nqt?1voiH!L>Yr{~ zR>yWH8h%6}1`g6M9zV;>u0U4L0!Db4>+uYrgj&GXkR_S%rY);|58pJOGs!Z`n91>M zur?l%p?2TEY_8wex3@Vw79MGcq)~sa5@xWRQjqPASRGNoMa`q+tARFFPM+-Q0_92R|)zR*m^3yppthBSUgaeeU#7 zxWlvfm|hVm9AIzgcTc>#Qg4J}(o+!US_Y`GyTi?Vi%1tP40)&m;1nzOv#W9S`h&EaCgiT`- z{8B`XUBO$gdd{|(TDdQe-PlRY9E~z(;Pq~lotq4>;KQ{1ecF3SLOW>_<4$nL}}pKr6}#Hz|a9k`Upp`EW7RLm!_>jyFLyJ z{Bf{JI{|<%PmNV---rGuqpuqk~p+aFv7UepJmtIx%04E6V#m2Epkp(j$2je#2 zP#!p$bSW1oE$cE=U~>aYnNGDg2iuQ~4;!6~c9tc`+CNa>lK1>(*tJTzYOmmAE61oW z1($tgz!;dH@JIm@xS19akVsB|NCWEb?cPP+#z1vHR1t8)Cmn=h5GKH_uusVFsLIy< zd1fAH^n5$y$$>QpCjtRZSt4a@)^>s;<}90b9`*C^e%2O%I>x$k<&>t9RSAR?-gv{2 z37z|4oW2O{67E9`I;;)lDX=L0Y^U86!jXPA% zyM?~x^XNt0H$)cYl`F#>0&_kt@IDZ-gu?jD*64%^YNC=`i!bPaOFuJK<(m~F&}&DZ zQH+|Z-FagDUb2F4-`s=P^TqE-wOs?(mSD$;F06bm8+{S}?!5u4hE9kP@O(_~L54p- zOqm=$erzA9fVv4fO1ISD_Dw$vdJM*4o?}GBwG&3W%BuNB9u{tavs^P)*vPbe$xF_Xe!Aycp^& zBaef0n^4Ph>((}f4g$w{I<2HUyeJ9^?N&yf>5G;Q z!*+kgLBjw*4rt}zJ3t z9?&X=wxBH^0n{EvUBR=);STCY)eY45SLizv+$nRs@{#ivu|PvKR0;`0gz|b{*IuNM z)zQjDEuXs5^3&^(L+tNbc0jrr6{OJ+Fz%(jV3(iqypqd!_yGWu<*l4_VwP1%Dgu}d{f0@ z-(-DiRQ?MG(?BM!v*Bkvs37QT0c^rV#uH&O=e8vkJ=4b;XC?1%SQ$u^t_Hys3TjOG-MX(V$sW_4lA+DGmEn$eZR5|R;9{?`fR`l(sNQ`L z$X^4JOo=ht^2!CW?WG>`chGqD{42=iFhZz!D7nB+cHLy&GR^#4_W8b)cq7z>70r5# z>0Ef;Ts^3Lih36)feRWL1yY{)tj~>pf?^aq=?#lBi3gRrB^Iv1Xnj}v%Z;^!#WV?$ zl`lGc(*|A|Es+eWVFkhvcbVz+TGG5h8%8~IsT6k76sC7y*StJpIsh;f1Q$dwK+}o zQG=YN&B#~E2Ib;Iy62E85^%lqlFlfMgB{upcf#G-XzszcgzV1L%mYd{1op!Uw zDMu9Us-2yajLQ|QoSoxU2WMN^lP)JuJIMb34(5u!E^$iYl(hUQIcWtcd4Uy z|5;D}Xu)8PH9h<{BO|ZioiAfh4o?4Edt18THhQ19hOz%$`wq@1d$c6&G%%N6X0AkY zlbBNfPhaUEkZy1ww71c*K{g#lxqk@O2OOjm9E=+t^Xs=W8i%4u_xE0AV zX~(bDv=4{2K_FW!`tKbv^b`H^poug%q<-s&LO~$^z1sgizAn0SN$?T`!V3=QZ{sgs z{^#TWJJb35Oj~2mq2FdAmO~)_Y0v&X%GRx+#i`8~!jcircle)) return array();//如果已经被分析过则直接返回 + array_push($this->circle, $domain); + + $include = array(); + $cnts = self::get_src_cnt($domain); + $is = $cnts['i']; + if(sizeof($is) > 0) + foreach($is as $d){ + if($recurse) + $include = array_merge($include, $this->get_import_srcs($d)); + else + $include[$d] = self::$_cache[$d]; + } + + //因为依赖关系的前后联系,最后在include中加入当前domain + if($recurse) + $include[$domain] = $cnts['c']; + return $include; + } + + + /** + * 读取源文件内容,支持缓存,支持覆盖率文件读取,覆盖率路径在Config中配置 + * @param string $domain + * @see Config::$COVERAGE_PATH + */ + static function get_src_cnt($domain){ + new Analysis(); + if(!array_key_exists($domain, self::$_cache)){ + $cnt =''; $covcnt = ''; + //$path = join('/', explode('.', $domain)).'.js'; //为了支持xx.xx.js类型的文件名而修改 田丽丽 + //文件在当前项目存在则取当前项目,否则取tangram项目 + require_once 'config.php'; + foreach(Config::$SOURCE_PATH as $i=>$d){ + if(Config::$DEBUG) + var_dump($d.$path); + if(file_exists($d.$path)){ + $cnt = file_get_contents($d.$path); + $cnt.="\n";//读取文件内容必须加个回车 + break; + } + } + //尝试读取cov目录下的文件,如果不存在则忽略 + $covpath = Config::$COVERAGE_PATH.$path; + if(file_exists($covpath)){ + if(Config::$DEBUG)var_dump($covpath); + $covcnt = file_get_contents($covpath); + } + else $covcnt = $cnt; + if($cnt == ''){ + if(Config::$DEBUG) + print "fail read file : ".$path; + return array('', array(), ''); + } + + if(Config::$DEBUG) + print "start read file $domain
      "; + + $is = array(); + //正则匹配,提取所有(///import xxx;)中的xxx + preg_match_all('/\/\/\/import\s+([^;]+);?/ies', $cnt, $is, PREG_PATTERN_ORDER); + + //移除//,顺便移除空行 + // $cnt = preg_replace('/\/\/.*/m', '', $cnt);TODO:正则处理出现在“”或者正则中的//时出现问题 + //移除/**/ + // $cnt = preg_replace('/\/\*.*\*\//sU', '', $cnt); + + self::$_cache[$domain] = array('c'=>$cnt, 'i'=>$is[1], 'cc'=>$covcnt); + } + return self::$_cache[$domain]; + } +} +?> diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/batchrun.sh b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/batchrun.sh new file mode 100644 index 000000000..f88256c14 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/batchrun.sh @@ -0,0 +1,10 @@ +/home/work/.bash_profile +cd /home/work/repos/Tangram-base +/home/work/soft/git-1.7.3.5/bin-wrappers/git pull +sh release/output.sh +rm -rf test/tools/br/report +wget -q -O /tmp/tmp.php http://10.32.34.115:8000/Tangram-base/test/tools/br/runall.php?clearreport=true&cov=true +sleep 3m +rm -rf test/tools/br/report +wget -q -O /tmp/tmp.php http://10.32.34.115:8000/Tangram-base/test/tools/br/runall.php?release=true&clearreport=true +cd - \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/case.class.php b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/case.class.php new file mode 100644 index 000000000..40278b6eb --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/case.class.php @@ -0,0 +1,242 @@ +projroot = $projroot; + $this->name = $name; + + $this->ext = $ext; + if ( strlen( $ext ) > 0 ) { + $ns = explode( '.' , $name ); + + $n = array_pop( $ns ); + array_push( $ns , $ext , $n ); + $path = implode( '/' , $ns ); + } else { + //$path = implode( '/' , explode( '.' , $name ) ); + $path = $name; //为了支持xx.xx.js类型的文件名而修改 田丽丽 + } +// $dir = explode('/',$path); +// if($dir[0]=='dialogs') +// $this->path = $this->projroot . '_test/' . $path . '.html'; +// else + $this->path = $this->projroot . '_test/' . $path . '.js'; + if ( filesize( $this->path ) < 20 ) { + $this->empty = true; + return; + } + $this->case_id = 'id_case_' . join( '_' , explode( '.' , $name ) ); + } + + + public function print_js( $cov, $release = false ) + { + print '' . "\n"; + print '' . "\n"; + print '' . "\n"; + print '' . "\n"; + print '' . "\n"; + print '' . "\n"; + print '' . "\n"; + print '' . "\n"; + + print '' . "\n"; // print '' . "\n"; + print '' . "\n"; + + + /* load case source*/ + $importurl = "{$this->projroot}_test/tools/br/import.php?f=$this->name"; + if ( $cov ) $importurl .= '^&cov=true'; + print "\n"; + + /* load case and case dependents*/ + //$ps = explode( '.' , $this->name ); + $ps = explode( '/' , $this->name ); //为了支持xx.xx.js类型的文件名而修改 田丽丽 + array_pop( $ps ); + array_push( $ps , 'tools' ); + + if ( file_exists( $this->projroot . '_test/' . implode( '/' , $ps ) . '.js' ) ) //没有就不加载了 + print '' . "\n"; + print '' . "\n"; + + + } + public function print_all_js( $cov, $release = false ) + { + print '' . "\n"; + print '' . "\n"; + print '' . "\n"; + print '' . "\n"; + print '' . "\n"; + print '' . "\n"; + print '' . "\n"; + print '' . "\n"; + + print '' . "\n"; + + print '' . "\n"; + + + /* load case source*/ + $importurl = "{$this->projroot}ueditor/ueditor.all.min.js"; + print "\n"; + + /* load case and case dependents*/ + //$ps = explode( '.' , $this->name ); + $ps = explode( '/' , $this->name ); //为了支持xx.xx.js类型的文件名而修改 田丽丽 + array_pop( $ps ); + array_push( $ps , 'tools' ); + + if ( file_exists( $this->projroot . '_test/' . implode( '/' , $ps ) . '.js' ) ) //没有就不加载了 + print '' . "\n"; + print '' . "\n"; + + + } + public function match( $matcher ) + { + if ( $matcher == '*' ) + return true; + $len = strlen( $matcher ); + + /** + * 处理多选分支,有一个成功则成功,filter后面参数使用|切割 + * @var unknown_type + */ + $as = explode( ';' , $matcher ); + if ( sizeof( $as ) > 1 ) { + + //这里把或的逻辑改成与 + foreach ( $as as $matcher1 ) { + if ( $this->match( $matcher1 ) ) + return true; + } + return false; + } + $ms = explode( ',' , $matcher ); + if ( sizeof( $ms ) > 1 ) { + + //这里把或的逻辑改成与 + foreach ( $ms as $matcher1 ) { + if ( !$this->match( $matcher1 ) ) + return false; + } + return true; + } + + /** + * 处理反向选择分支 + */ + if ( substr( $matcher , 0 , 1 ) == '!' ) { + $m = substr( $matcher , 1 ); + if ( substr( $this->name , 0 , strlen( $m ) ) == $m ) + return false; + return true; + } + + if ( $len > strlen( $this->name ) ) { + return false; + } + return substr( $this->name , 0 , $len ) == $matcher; + } + + public static function listcase( $filter = "*" , $filterRun = '*',$projroot = '../../../' ) + { + $srcpath = $projroot . '_src/'; + $testpath = $projroot . '_test/'; + require_once 'filehelper.php'; + $caselist = getSameFile( $srcpath , $testpath , '' ); + sort($caselist,SORT_STRING); + foreach ( $caselist as $caseitem ) { + /*将文件名替换为域名方式,替换/为.,移除.js*/ + //$name = str_replace( '/' , '.' , substr( $caseitem , 0 , -3 ) ); + $name = substr( $caseitem , 0 , -3 ); //为了支持xx.xx.js类型的文件名而修改 田丽丽 + $c = new Kiss( $projroot , $name ); + if ( $c->empty ) + continue; + if ( $c->match( $filterRun ) ) { + $newName = explode( '\\.' , $name ); + $newName = $newName[ count( $newName ) - 1 ]; + print( "
      case_id\" class=\"jsframe_qunit\" target=\"_blank\" title=\"$name\" onclick=\"run('$name');\$('#id_rerun').html('$name');return false;\">" + /*过长的时候屏蔽超出20的部分,因为隐藏的处理,所有用例不能直接使用标签a中的innerHTML,而应该使用title*/ + . $newName . "\n" ); + } + } + /** + * 设置在源码路径下没有同名文件对应的测试文件 + */ + foreach(Config::$special_Case as $s_caseitem => $s_source){ + //取形如 'plugins/config_test.js' 中 'plugins/config_test'部分 + $s_newName = str_replace(".js","", $s_caseitem ); + print( "". $s_newName . "\n" ); + } + } + + public static function listSrcOnly( $print = true , $projroot = '../../../' ) + { + $srcpath = $projroot . '_src/'; + $testpath = $projroot . '_test/'; + require_once 'filehelper.php'; + $caselist = getSameFile( $srcpath , $testpath , '' ); + $srclist = getSrcOnlyFile( $srcpath , $testpath , '' ); + $srcList = array(); + foreach ( $srclist as $case ) { + if ( in_array( $case , $caselist ) ) + continue; + $name = str_replace( '/' , '.' , substr( $case , 0 , -3 ) ); + $tag = "" . ( strlen( $name ) > 20 ? substr( $name , 6 ) + : $name ) . ""; + array_push( $srcList , $tag ); + if ( $print ) + echo $tag; + } + return $srcList; + } +} + +?> \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/config.php b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/config.php new file mode 100644 index 000000000..fbc842dc9 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/config.php @@ -0,0 +1,83 @@ + array( '10.94.26.94' , "C:\\Program Files\\Internet Explorer\\iexplore.exe" ) + , 'ie11main' => array( '10.81.96.46' , "C:\\Program Files\\Internet Explorer\\iexplore.exe" ) + + , + 'firefox' => array( '10.94.26.95' , "C:\\Program Files\\mozilla firefox\\firefox.exe" ) +// 'firefox' => array( '10.81.96.46@8500' , "C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe" ) +// , '360ie8' => array('10.81.58.64@8500',"C:\\Program Files\\360\\360se\\360SE.exe") +// , '360ie7' => array( '10.81.58.87@8500' , "C:\\Program Files\\360\\360se\\360SE.exe" ) + + +// , 'ie6' => array( '10.81.58.86@8500' , "C:\\Program Files\\Internet Explorer\\iexplore.exe" ) +//C:\Program Files\Google\Chrome\Application\chrome.exe +// "C:\Program Files\Mozilla Firefox\firefox.exe" + , 'chrome' => array( '10.94.26.95' , "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe" ) + , + 'ie8main' => array( '10.94.26.94' , "C:\\Program Files\\Internet Explorer\\iexplore.exe" ) + , 'ie11supp' => array( '10.81.96.46' , "C:\\Program Files\\Internet Explorer\\iexplore.exe" ) +// , 'ie7' => array( '10.81.58.87@8500' , "C:\\Program Files\\Internet Explorer\\iexplore.exe" ) +// , 'opera' => array( '10.81.58.64@8500' , "C:\\Program Files\\Opera\\opera.exe" ) +// , 'safari' => array( '10.81.58.63@8500' , "C:\\Program Files\\Safari\\Safari.exe" ) + ); + + public static $DEBUG = false; + + public static $HISTORY_REPORT_PATH = '/report'; + + public static function getBrowserSet($browsers){ + if(strcmp($browsers,'')==0){ + return Config::$BROWSERS; + } + $selectedBrowsers =array(); + $browserName = explode('_',$browsers); + foreach($browserName as $s){ + if(array_key_exists($s,Config::$BROWSERS));{ + $selectedBrowsers[$s] =Config::$BROWSERS[$s]; + } + } + return $selectedBrowsers; + } + + public static function StopAll() + { + $hostarr = array(); + foreach ( Config::$BROWSERS as $b => $h ) { + $host = $h[ 0 ]; + if ( array_search( $host , $hostarr ) ) + continue; + array_push( $hostarr , $host ); + require_once 'lib/Staf.php'; + Staf::process_stop( '' , $host , true ); + Staf::process( "free all" ); + } + } + public static function StopOne($key){ + $host = Config::$BROWSERS[$key][0]; + require_once 'lib/Staf.php'; + Staf::process_stop( '' , $host , true ); + } + /** + * 源码路径配置,会在所有位置寻找源码 + * @var ArrayIterator::String + */ + public static $SOURCE_PATH = array( "../../../_src/" ); + + public static $test_PATH = "../../../_test/"; + + /** + * 覆盖率相关源码所在路径,如果路径中没有找到会回到$SOURCH_PATH中查找 + * @var string + */ + public static $COVERAGE_PATH = "../../coverage/"; + /** + * 设置在源码路径下没有同名文件对应的测试文件 + * @var array + */ + public static $special_Case = array('plugins/ueditor.config.js'=>'../../../ueditor.config.js'); + } + +?> \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/coverage/jscov.php b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/coverage/jscov.php new file mode 100644 index 000000000..fe8d96413 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/coverage/jscov.php @@ -0,0 +1,61 @@ + \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/coverage/jscoverage-highlight.css b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/coverage/jscoverage-highlight.css new file mode 100644 index 000000000..d2ad01da5 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/coverage/jscoverage-highlight.css @@ -0,0 +1,38 @@ +/* + jscoverage-highlight.css - JSCoverage syntax highlighting style sheet + Copyright (C) 2008, 2009, 2010 siliconforks.com + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +/* keyword, type, symbol, cbracket */ +#sourceTable .k { + font-weight: bold; +} + +/* string, regexp, number */ +#sourceTable .s { + color: #006400; +} + +/* specialchar */ +#sourceTable .t { + color: #2e8b57; +} + +/* comment */ +#sourceTable .c { + font-style: italic; +} diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/coverage/jscoverage-ie.css b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/coverage/jscoverage-ie.css new file mode 100644 index 000000000..05cad2afa --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/coverage/jscoverage-ie.css @@ -0,0 +1,108 @@ +/* + jscoverage-ie.css - JSCoverage style sheet for Internet Explorer + Copyright (C) 2007, 2008, 2009, 2010 siliconforks.com + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#headingDiv { + position: static; + margin-left: 10px; + margin-right: 10px; + padding-top: 0.5em; +} + +#tabs { + clear: all; + position: static; + top: auto; + left: auto; + right: auto; + height: auto; + margin-left: 10px; + margin-right: 10px; +} + +#tabs div { + position: relative; + height: auto; + line-height: normal; + padding-top: 5px; + padding-bottom: 5px; +} + +#tabs div.selected { + padding-bottom: 6px; + z-index: 2; +} + +.TabPage { + position: relative; + top: -1px; + left: auto; + right: auto; + bottom: auto; + clear: left; + margin-left: 10px; + margin-right: 10px; + padding: 10px; + z-index: 1; +} + +#locationDiv { + margin-bottom: 10px; +} + +#iframeDiv { + position: static; + width: 100%; +} + +#summaryDiv { + position: static; + width: 100%; +} + +#fileDiv { + margin-bottom: 10px; +} + +#sourceDiv { + position: static; + width: 100%; +} + +#storeDiv { + position: static; + width: 100%; +} + +/* some defaults */ + +.TabPage { + height: 650px; +} + +#iframeDiv { + height: 600px; +} + +#summaryDiv { + height: 600px; +} + +#sourceDiv { + height: 600px; +} diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/coverage/jscoverage-throbber.gif b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/coverage/jscoverage-throbber.gif new file mode 100644 index 0000000000000000000000000000000000000000..f13c0b4ecc4327d891568b6494d60f0428741094 GIT binary patch literal 425 zcmZ?wbhEHbWM^P!c+AZJ1gxyA3JMB#c6JU94habfwY9Yk4GjwxEI4rBz=H=5{-XlL z|J;7AA;Hd$0j@@R2F#2={fa+X7`Yhu8FWB~fsAEf5&Ph&u(TrN>S}q#&`BOgn?s%^ zhV^T?;!vunS}Ag6b-d=(MIOf|ho~muQL2<$8FFRyeM?aWj}wbSQt>D~sr0mR%9Yjf zPE!>;PBMoq#ivwRwQ38{0bZhx9;cK;R1@$xKqa;6%azshgF*v64mgJ_#iR73%F-$k kU smaller than surrounding text. Because +the table already has font-size small, this would make the font-size within the +
       x-small.  So we don't rely on the default.
      +*/
      +table#sourceTable pre {
      +  font-size: medium;
      +}
      +
      +table#sourceTable td {
      +  border: 0px;
      +  padding-top: 0px;
      +  padding-bottom: 0px;
      +  padding-left: 10px;
      +  padding-right: 10px;
      +}
      +
      +table#sourceTable pre {
      +  border: 0px;
      +  margin: 0px;
      +}
      +
      +.g {
      +  background-color: #bfffbf;
      +}
      +
      +.y {
      +  background-color: #ffffbf;
      +}
      +
      +.r {
      +  background-color: #ffbfbf;
      +}
      +
      +/*******************************************************************************
      +store tab
      +*/
      +
      +#storeDiv {
      +  position: absolute;
      +  top: 3em;
      +  left: 1em;
      +  right: 1em;
      +  bottom: 1em;
      +  overflow: auto;
      +}
      +
      +/*******************************************************************************
      +about tab
      +*/
      +
      +p {
      +  margin-top: 0;
      +}
      +
      +/*******************************************************************************
      +tabs
      +*/
      +
      +#tabs {
      +  position: absolute;
      +  top: 3em;
      +  left: 1.5em;
      +  right: 1.5em;
      +  height: 2em;
      +}
      +
      +#tabs div {
      +  background-color: white;
      +  position: relative;
      +  float: left;
      +  border: 1px solid black;
      +  border-bottom-width: 0;
      +  cursor: pointer;
      +  margin-left: 0.5em;
      +  margin-right: 0.5em;
      +  padding-left: 0.5em;
      +  padding-right: 0.5em;
      +  height: 2em;
      +  z-index: 1;
      +  line-height: 1.8em;
      +}
      +
      +#tabs div.selected {
      +  z-index: 3;
      +  cursor: default;
      +}
      +
      +#tabs div.disabled {
      +  /* windows system color GrayText */
      +  color: #808080;
      +  cursor: default; 
      +}
      +
      +.TabPage {
      +  background-color: white;
      +  border: 1px solid black;
      +  position: absolute;
      +  top: 5em;
      +  left: 1.5em;
      +  right: 1.5em;
      +  bottom: 1.5em;
      +  z-index: 2;
      +  padding: 1em;
      +  display: none;
      +}
      +
      +#tabPages div.selected {
      +  display: block;
      +}
      +
      +img {
      +  visibility: hidden;
      +}
      diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/coverage/jscoverage.html b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/coverage/jscoverage.html
      new file mode 100644
      index 000000000..e6288fce2
      --- /dev/null
      +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/coverage/jscoverage.html
      @@ -0,0 +1,168 @@
      +
      +
      +
      +
      +
      +
      +JSCoverage
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + + +
      +

      +Recent web browsers tend to place significant security restrictions on the use +of file: URLs. These restrictions can prevent JSCoverage from +working properly. To avoid problems, it is recommended that you do either of the +following: +

      +
        +
      • If you are using the jscoverage program to instrument your +JavaScript code, install the instrumented files on a web server.
      • +
      • Use the jscoverage-server program (which itself acts as a web +server).
      • +
      +

      +See the +manual +for further details. +

      + +
      + +
      +

      +Recent web browsers tend to place significant security restrictions on the use +of file: URLs. These restrictions can prevent JSCoverage from +working properly. To avoid problems, it is recommended that you view coverage +reports stored to the filesystem by serving them from a web server. +

      +

      +See the +manual +for further details. +

      + +
      + +
      + +
      Summary
      +
      Source
      +
      Store
      +
      About
      +
      +
      + +
      + +
      +
      + + + + + + + + + + + + + + + + + + + + + +
      FileStatementsExecutedCoverage
      + Total: + 0 + 00 +
      +
      +
      + 0% +
      +
      +
      +
      +
      +
      +
      +
      + + loading... +
      +
      +
      +

      + This is version 0.5.1 of JSCoverage, a program that calculates code + coverage statistics for JavaScript. +

      +

      + See http://siliconforks.com/jscoverage/ for more information. +

      +

      + Copyright © 2007, 2008, 2009, 2010 siliconforks.com +

      +
      +
      +
      + + diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/coverage/jscoverage.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/coverage/jscoverage.js new file mode 100644 index 000000000..4233615a4 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/coverage/jscoverage.js @@ -0,0 +1,1176 @@ +/* + jscoverage.js - code coverage for JavaScript + Copyright (C) 2007, 2008, 2009, 2010 siliconforks.com + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +function jscoverage_openWarningDialog() { + var id; + if (jscoverage_isReport) { + id = 'reportWarningDialog'; + } + else { + id = 'warningDialog'; + } + var dialog = document.getElementById(id); + dialog.style.display = 'block'; +} + +function jscoverage_closeWarningDialog() { + var id; + if (jscoverage_isReport) { + id = 'reportWarningDialog'; + } + else { + id = 'warningDialog'; + } + var dialog = document.getElementById(id); + dialog.style.display = 'none'; +} + +/** +Initializes the _$jscoverage object in a window. This should be the first +function called in the page. +@param w this should always be the global window object +*/ +function jscoverage_init(w) { + try { + // in Safari, "import" is a syntax error + Components.utils['import']('resource://app/modules/jscoverage.jsm'); + jscoverage_isInvertedMode = true; + return; + } + catch (e) {} + + // check if we are in inverted mode + if (w.opener) { + try { + if (w.opener.top._$jscoverage) { + jscoverage_isInvertedMode = true; + if (! w._$jscoverage) { + w._$jscoverage = w.opener.top._$jscoverage; + } + } + else { + jscoverage_isInvertedMode = false; + } + } + catch (e) { + try { + if (w.opener._$jscoverage) { + jscoverage_isInvertedMode = true; + if (! w._$jscoverage) { + w._$jscoverage = w.opener._$jscoverage; + } + } + else { + jscoverage_isInvertedMode = false; + } + } + catch (e2) { + jscoverage_isInvertedMode = false; + } + } + } + else { + jscoverage_isInvertedMode = false; + } + + if (! jscoverage_isInvertedMode) { + if (! w._$jscoverage) { + w._$jscoverage = {}; + } + } +} + +var jscoverage_currentFile = null; +var jscoverage_currentLine = null; + +var jscoverage_inLengthyOperation = false; + +/* +Possible states: + isInvertedMode isServer isReport tabs +normal false false false Browser +inverted true false false +server, normal false true false Browser, Store +server, inverted true true false Store +report false false true +*/ +var jscoverage_isInvertedMode = false; +var jscoverage_isServer = false; +var jscoverage_isReport = false; + +jscoverage_init(window); + +function jscoverage_createRequest() { + // Note that the IE7 XMLHttpRequest does not support file URL's. + // http://xhab.blogspot.com/2006/11/ie7-support-for-xmlhttprequest.html + // http://blogs.msdn.com/ie/archive/2006/12/06/file-uris-in-windows.aspx +//#JSCOVERAGE_IF + if (window.ActiveXObject) { + return new ActiveXObject("Microsoft.XMLHTTP"); + } + else { + return new XMLHttpRequest(); + } +} + +// http://www.quirksmode.org/js/findpos.html +function jscoverage_findPos(obj) { + var result = 0; + do { + result += obj.offsetTop; + obj = obj.offsetParent; + } + while (obj); + return result; +} + +// http://www.quirksmode.org/viewport/compatibility.html +function jscoverage_getViewportHeight() { +//#JSCOVERAGE_IF /MSIE/.test(navigator.userAgent) + if (self.innerHeight) { + // all except Explorer + return self.innerHeight; + } + else if (document.documentElement && document.documentElement.clientHeight) { + // Explorer 6 Strict Mode + return document.documentElement.clientHeight; + } + else if (document.body) { + // other Explorers + return document.body.clientHeight; + } + else { + throw "Couldn't calculate viewport height"; + } +//#JSCOVERAGE_ENDIF +} + +/** +Indicates visually that a lengthy operation has begun. The progress bar is +displayed, and the cursor is changed to busy (on browsers which support this). +*/ +function jscoverage_beginLengthyOperation() { + jscoverage_inLengthyOperation = true; + + var progressBar = document.getElementById('progressBar'); + progressBar.style.visibility = 'visible'; + ProgressBar.setPercentage(progressBar, 0); + var progressLabel = document.getElementById('progressLabel'); + progressLabel.style.visibility = 'visible'; + + /* blacklist buggy browsers */ +//#JSCOVERAGE_IF + if (! /Opera|WebKit/.test(navigator.userAgent)) { + /* + Change the cursor style of each element. Note that changing the class of the + element (to one with a busy cursor) is buggy in IE. + */ + var tabs = document.getElementById('tabs').getElementsByTagName('div'); + var i; + for (i = 0; i < tabs.length; i++) { + tabs.item(i).style.cursor = 'wait'; + } + } +} + +/** +Removes the progress bar and busy cursor. +*/ +function jscoverage_endLengthyOperation() { + var progressBar = document.getElementById('progressBar'); + ProgressBar.setPercentage(progressBar, 100); + setTimeout(function() { + jscoverage_inLengthyOperation = false; + progressBar.style.visibility = 'hidden'; + var progressLabel = document.getElementById('progressLabel'); + progressLabel.style.visibility = 'hidden'; + progressLabel.innerHTML = ''; + + var tabs = document.getElementById('tabs').getElementsByTagName('div'); + var i; + for (i = 0; i < tabs.length; i++) { + tabs.item(i).style.cursor = ''; + } + }, 50); +} + +function jscoverage_setSize() { +//#JSCOVERAGE_IF /MSIE/.test(navigator.userAgent) + var viewportHeight = jscoverage_getViewportHeight(); + + /* + border-top-width: 1px + padding-top: 10px + padding-bottom: 10px + border-bottom-width: 1px + margin-bottom: 10px + ---- + 32px + */ + var tabPages = document.getElementById('tabPages'); + var tabPageHeight = (viewportHeight - jscoverage_findPos(tabPages) - 32) + 'px'; + var nodeList = tabPages.childNodes; + var length = nodeList.length; + for (var i = 0; i < length; i++) { + var node = nodeList.item(i); + if (node.nodeType !== 1) { + continue; + } + node.style.height = tabPageHeight; + } + + var iframeDiv = document.getElementById('iframeDiv'); + // may not exist if we have removed the first tab + if (iframeDiv) { + iframeDiv.style.height = (viewportHeight - jscoverage_findPos(iframeDiv) - 21) + 'px'; + } + + var summaryDiv = document.getElementById('summaryDiv'); + summaryDiv.style.height = (viewportHeight - jscoverage_findPos(summaryDiv) - 21) + 'px'; + + var sourceDiv = document.getElementById('sourceDiv'); + sourceDiv.style.height = (viewportHeight - jscoverage_findPos(sourceDiv) - 21) + 'px'; + + var storeDiv = document.getElementById('storeDiv'); + if (storeDiv) { + storeDiv.style.height = (viewportHeight - jscoverage_findPos(storeDiv) - 21) + 'px'; + } +//#JSCOVERAGE_ENDIF +} + +/** +Returns the boolean value of a string. Values 'false', 'f', 'no', 'n', 'off', +and '0' (upper or lower case) are false. +@param s the string +@return a boolean value +*/ +function jscoverage_getBooleanValue(s) { + s = s.toLowerCase(); + if (s === 'false' || s === 'f' || s === 'no' || s === 'n' || s === 'off' || s === '0') { + return false; + } + return true; +} + +function jscoverage_removeTab(id) { + var tab = document.getElementById(id + 'Tab'); + tab.parentNode.removeChild(tab); + var tabPage = document.getElementById(id + 'TabPage'); + tabPage.parentNode.removeChild(tabPage); +} + +function jscoverage_isValidURL(url) { + // RFC 3986 + var matches = /^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/.exec(url); + if (matches === null) { + return false; + } + var scheme = matches[1]; + if (typeof scheme === 'string') { + scheme = scheme.toLowerCase(); + return scheme === '' || scheme === 'file:' || scheme === 'http:' || scheme === 'https:'; + } + return true; +} + +/** +Initializes the contents of the tabs. This sets the initial values of the +input field and iframe in the "Browser" tab and the checkbox in the "Summary" +tab. +@param queryString this should always be location.search +*/ +function jscoverage_initTabContents(queryString) { + var showMissingColumn = false; + var url = null; + var windowURL = null; + var parameters, parameter, i, index, name, value; + if (queryString.length > 0) { + // chop off the question mark + queryString = queryString.substring(1); + parameters = queryString.split(/&|;/); + for (i = 0; i < parameters.length; i++) { + parameter = parameters[i]; + index = parameter.indexOf('='); + if (index === -1) { + // still works with old syntax + url = decodeURIComponent(parameter); + } + else { + name = parameter.substr(0, index); + value = decodeURIComponent(parameter.substr(index + 1)); + if (name === 'missing' || name === 'm') { + showMissingColumn = jscoverage_getBooleanValue(value); + } + else if (name === 'url' || name === 'u' || name === 'frame' || name === 'f') { + url = value; + } + else if (name === 'window' || name === 'w') { + windowURL = value; + } + } + } + } + + var checkbox = document.getElementById('checkbox'); + checkbox.checked = showMissingColumn; + if (showMissingColumn) { + jscoverage_appendMissingColumn(); + } + + var isValidURL = function (url) { + var result = jscoverage_isValidURL(url); + if (! result) { + alert('Invalid URL: ' + url); + } + return result; + }; + + if (url !== null && isValidURL(url)) { + // this will automatically propagate to the input field + frames[0].location = url; + } + else if (windowURL !== null && isValidURL(windowURL)) { + window.open(windowURL); + } + + // if the browser tab is absent, we have to initialize the summary tab + if (! document.getElementById('browserTab')) { + jscoverage_recalculateSummaryTab(); + } +} + +function jscoverage_body_load() { + // check if this is a file: URL + if (window.location && window.location.href && /^file:/i.test(window.location.href)) { + var warningDiv = document.getElementById('warningDiv'); + warningDiv.style.display = 'block'; + } + + var progressBar = document.getElementById('progressBar'); + ProgressBar.init(progressBar); + + function reportError(e) { + jscoverage_endLengthyOperation(); + var summaryThrobber = document.getElementById('summaryThrobber'); + summaryThrobber.style.visibility = 'hidden'; + var div = document.getElementById('summaryErrorDiv'); + div.innerHTML = 'Error: ' + e; + } + + if (jscoverage_isReport) { + jscoverage_beginLengthyOperation(); + var summaryThrobber = document.getElementById('summaryThrobber'); + summaryThrobber.style.visibility = 'visible'; + var request = jscoverage_createRequest(); + try { + request.open('GET', 'jscoverage.json', true); + request.onreadystatechange = function (event) { + if (request.readyState === 4) { + try { + if (request.status !== 0 && request.status !== 200) { + throw request.status; + } + var response = request.responseText; + if (response === '') { + throw 404; + } + + var json; + if (window.JSON && window.JSON.parse) { + json = window.JSON.parse(response); + } + else { + json = eval('(' + response + ')'); + } + + var file; + for (file in json) { + if (! json.hasOwnProperty(file)) { + continue; + } + + var fileCoverage = json[file]; + _$jscoverage[file] = fileCoverage.coverage; + _$jscoverage[file].source = fileCoverage.source; + } + jscoverage_recalculateSummaryTab(); + summaryThrobber.style.visibility = 'hidden'; + } + catch (e) { + reportError(e); + } + } + }; + request.send(null); + } + catch (e) { + reportError(e); + } + + jscoverage_removeTab('browser'); + jscoverage_removeTab('store'); + } + else { + if (jscoverage_isInvertedMode) { + jscoverage_removeTab('browser'); + } + + if (! jscoverage_isServer) { + jscoverage_removeTab('store'); + } + } + + jscoverage_initTabControl(); + + jscoverage_initTabContents(location.search); +} + +function jscoverage_body_resize() { + if (/MSIE/.test(navigator.userAgent)) { + jscoverage_setSize(); + } +} + +// ----------------------------------------------------------------------------- +// tab 1 + +function jscoverage_updateBrowser() { + var input = document.getElementById("location"); + frames[0].location = input.value; +} + +function jscoverage_openWindow() { + var input = document.getElementById("location"); + var url = input.value; + window.open(url); +} + +function jscoverage_input_keypress(e) { + if (e.keyCode === 13) { + if (e.shiftKey) { + jscoverage_openWindow(); + } + else { + jscoverage_updateBrowser(); + } + } +} + +function jscoverage_openInFrameButton_click() { + jscoverage_updateBrowser(); +} + +function jscoverage_openInWindowButton_click() { + jscoverage_openWindow(); +} + +function jscoverage_browser_load() { + /* update the input box */ + var input = document.getElementById("location"); + + /* sometimes IE seems to fire this after the tab has been removed */ + if (input) { + input.value = frames[0].location; + } +} + +// ----------------------------------------------------------------------------- +// tab 2 + +function jscoverage_createHandler(file, line) { + return function () { + jscoverage_get(file, line); + return false; + }; +} + +function jscoverage_createLink(file, line) { + var link = document.createElement("a"); + link.href = '#'; + link.onclick = jscoverage_createHandler(file, line); + + var text; + if (line) { + text = line.toString(); + } + else { + text = file; + } + + link.appendChild(document.createTextNode(text)); + + return link; +} + +function jscoverage_recalculateSummaryTab(cc) { + var checkbox = document.getElementById('checkbox'); + var showMissingColumn = checkbox.checked; + + if (! cc) { + cc = window._$jscoverage; + } + if (! cc) { +//#JSCOVERAGE_IF 0 + throw "No coverage information found."; +//#JSCOVERAGE_ENDIF + } + + var tbody = document.getElementById("summaryTbody"); + while (tbody.hasChildNodes()) { + tbody.removeChild(tbody.firstChild); + } + + var totals = { files:0, statements:0, executed:0 }; + + var file; + var files = []; + for (file in cc) { + if (! cc.hasOwnProperty(file)) { + continue; + } + + files.push(file); + } + files.sort(); + + var rowCounter = 0; + for (var f = 0; f < files.length; f++) { + file = files[f]; + var lineNumber; + var num_statements = 0; + var num_executed = 0; + var missing = []; + var fileCC = cc[file]; + var length = fileCC.length; + var currentConditionalEnd = 0; + var conditionals = null; + if (fileCC.conditionals) { + conditionals = fileCC.conditionals; + } + for (lineNumber = 0; lineNumber < length; lineNumber++) { + var n = fileCC[lineNumber]; + + if (lineNumber === currentConditionalEnd) { + currentConditionalEnd = 0; + } + else if (currentConditionalEnd === 0 && conditionals && conditionals[lineNumber]) { + currentConditionalEnd = conditionals[lineNumber]; + } + + if (currentConditionalEnd !== 0) { + continue; + } + + if (n === undefined || n === null) { + continue; + } + + if (n === 0) { + missing.push(lineNumber); + } + else { + num_executed++; + } + num_statements++; + } + + var percentage = ( num_statements === 0 ? 0 : parseInt(100 * num_executed / num_statements) ); + + var row = document.createElement("tr"); + row.className = ( rowCounter++ % 2 == 0 ? "odd" : "even" ); + + var cell = document.createElement("td"); + cell.className = 'leftColumn'; + var link = jscoverage_createLink(file); + cell.appendChild(link); + + row.appendChild(cell); + + cell = document.createElement("td"); + cell.className = 'numeric'; + cell.appendChild(document.createTextNode(num_statements)); + row.appendChild(cell); + + cell = document.createElement("td"); + cell.className = 'numeric'; + cell.appendChild(document.createTextNode(num_executed)); + row.appendChild(cell); + + // new coverage td containing a bar graph + cell = document.createElement("td"); + cell.className = 'coverage'; + var pctGraph = document.createElement("div"), + covered = document.createElement("div"), + pct = document.createElement("span"); + pctGraph.className = "pctGraph"; + if( num_statements === 0 ) { + covered.className = "skipped"; + pct.appendChild(document.createTextNode("N/A")); + } else { + covered.className = "covered"; + covered.style.width = percentage + "px"; + pct.appendChild(document.createTextNode(percentage + '%')); + } + pct.className = "pct"; + pctGraph.appendChild(covered); + cell.appendChild(pctGraph); + cell.appendChild(pct); + row.appendChild(cell); + + if (showMissingColumn) { + cell = document.createElement("td"); + for (var i = 0; i < missing.length; i++) { + if (i !== 0) { + cell.appendChild(document.createTextNode(", ")); + } + link = jscoverage_createLink(file, missing[i]); + + // group contiguous missing lines; e.g., 10, 11, 12 -> 10-12 + var j, start = missing[i]; + for (;;) { + j = 1; + while (i + j < missing.length && missing[i + j] == missing[i] + j) { + j++; + } + var nextmissing = missing[i + j], cur = missing[i] + j; + if (isNaN(nextmissing)) { + break; + } + while (cur < nextmissing && ! fileCC[cur]) { + cur++; + } + if (cur < nextmissing || cur >= length) { + break; + } + i += j; + } + if (start != missing[i] || j > 1) { + i += j - 1; + link.innerHTML += "-" + missing[i]; + } + + cell.appendChild(link); + } + row.appendChild(cell); + } + + tbody.appendChild(row); + + totals['files'] ++; + totals['statements'] += num_statements; + totals['executed'] += num_executed; + + // write totals data into summaryTotals row + var tr = document.getElementById("summaryTotals"); + if (tr) { + var tds = tr.getElementsByTagName("td"); + tds[0].getElementsByTagName("span")[1].firstChild.nodeValue = totals['files']; + tds[1].firstChild.nodeValue = totals['statements']; + tds[2].firstChild.nodeValue = totals['executed']; + + var coverage = parseInt(100 * totals['executed'] / totals['statements']); + if( isNaN( coverage ) ) { + coverage = 0; + } + tds[3].getElementsByTagName("span")[0].firstChild.nodeValue = coverage + '%'; + tds[3].getElementsByTagName("div")[1].style.width = coverage + 'px'; + } + + } + jscoverage_endLengthyOperation(); +} + +function jscoverage_appendMissingColumn() { + var headerRow = document.getElementById('headerRow'); + var missingHeader = document.createElement('th'); + missingHeader.id = 'missingHeader'; + missingHeader.innerHTML = 'Missing'; + headerRow.appendChild(missingHeader); + var summaryTotals = document.getElementById('summaryTotals'); + var empty = document.createElement('td'); + empty.id = 'missingCell'; + summaryTotals.appendChild(empty); +} + +function jscoverage_removeMissingColumn() { + var missingNode; + missingNode = document.getElementById('missingHeader'); + missingNode.parentNode.removeChild(missingNode); + missingNode = document.getElementById('missingCell'); + missingNode.parentNode.removeChild(missingNode); +} + +function jscoverage_checkbox_click() { + if (jscoverage_inLengthyOperation) { + return false; + } + jscoverage_beginLengthyOperation(); + var checkbox = document.getElementById('checkbox'); + var showMissingColumn = checkbox.checked; + setTimeout(function() { + if (showMissingColumn) { + jscoverage_appendMissingColumn(); + } + else { + jscoverage_removeMissingColumn(); + } + jscoverage_recalculateSummaryTab(); + }, 50); + return true; +} + +// ----------------------------------------------------------------------------- +// tab 3 + +function jscoverage_makeTable() { + var coverage = _$jscoverage[jscoverage_currentFile]; + var lines = coverage.source; + + // this can happen if there is an error in the original JavaScript file + if (! lines) { + lines = []; + } + + var rows = ['']; + var i = 0; + var progressBar = document.getElementById('progressBar'); + var tableHTML; + var currentConditionalEnd = 0; + + function joinTableRows() { + tableHTML = rows.join(''); + ProgressBar.setPercentage(progressBar, 60); + /* + This may be a long delay, so set a timeout of 100 ms to make sure the + display is updated. + */ + setTimeout(appendTable, 100); + } + + function appendTable() { + var sourceDiv = document.getElementById('sourceDiv'); + sourceDiv.innerHTML = tableHTML; + ProgressBar.setPercentage(progressBar, 80); + setTimeout(jscoverage_scrollToLine, 0); + } + + while (i < lines.length) { + var lineNumber = i + 1; + + if (lineNumber === currentConditionalEnd) { + currentConditionalEnd = 0; + } + else if (currentConditionalEnd === 0 && coverage.conditionals && coverage.conditionals[lineNumber]) { + currentConditionalEnd = coverage.conditionals[lineNumber]; + } + + var row = ''; + row += ''; + var timesExecuted = coverage[lineNumber]; + if (timesExecuted !== undefined && timesExecuted !== null) { + if (currentConditionalEnd !== 0) { + row += ''; + } + else { + row += ''; + } + row += ''; + row += ''; + row += '\n'; + rows[lineNumber] = row; + i++; + } + rows[i + 1] = '
      ' + lineNumber + ''; + } + else if (timesExecuted === 0) { + row += ''; + } + else { + row += ''; + } + row += timesExecuted; + row += '
      ' + lines[i] + '
      '; + ProgressBar.setPercentage(progressBar, 40); + setTimeout(joinTableRows, 0); +} + +function jscoverage_scrollToLine() { + jscoverage_selectTab('sourceTab'); + if (! window.jscoverage_currentLine) { + jscoverage_endLengthyOperation(); + return; + } + var div = document.getElementById('sourceDiv'); + if (jscoverage_currentLine === 1) { + div.scrollTop = 0; + } + else { + var cell = document.getElementById('line-' + jscoverage_currentLine); + + // this might not be there if there is an error in the original JavaScript + if (cell) { + var divOffset = jscoverage_findPos(div); + var cellOffset = jscoverage_findPos(cell); + div.scrollTop = cellOffset - divOffset; + } + } + jscoverage_currentLine = 0; + jscoverage_endLengthyOperation(); +} + +/** +Loads the given file (and optional line) in the source tab. +*/ +function jscoverage_get(file, line) { + if (jscoverage_inLengthyOperation) { + return; + } + jscoverage_beginLengthyOperation(); + setTimeout(function() { + var sourceDiv = document.getElementById('sourceDiv'); + sourceDiv.innerHTML = ''; + jscoverage_selectTab('sourceTab'); + if (file === jscoverage_currentFile) { + jscoverage_currentLine = line; + jscoverage_recalculateSourceTab(); + } + else { + if (jscoverage_currentFile === null) { + var tab = document.getElementById('sourceTab'); + tab.className = ''; + tab.onclick = jscoverage_tab_click; + } + jscoverage_currentFile = file; + jscoverage_currentLine = line || 1; // when changing the source, always scroll to top + var fileDiv = document.getElementById('fileDiv'); + fileDiv.innerHTML = jscoverage_currentFile; + jscoverage_recalculateSourceTab(); + return; + } + }, 50); +} + +/** +Calculates coverage statistics for the current source file. +*/ +function jscoverage_recalculateSourceTab() { + if (! jscoverage_currentFile) { + jscoverage_endLengthyOperation(); + return; + } + var progressLabel = document.getElementById('progressLabel'); + progressLabel.innerHTML = 'Calculating coverage ...'; + var progressBar = document.getElementById('progressBar'); + ProgressBar.setPercentage(progressBar, 20); + setTimeout(jscoverage_makeTable, 0); +} + +// ----------------------------------------------------------------------------- +// tabs + +/** +Initializes the tab control. This function must be called when the document is +loaded. +*/ +function jscoverage_initTabControl() { + var tabs = document.getElementById('tabs'); + var i; + var child; + var tabNum = 0; + for (i = 0; i < tabs.childNodes.length; i++) { + child = tabs.childNodes.item(i); + if (child.nodeType === 1) { + if (child.className !== 'disabled') { + child.onclick = jscoverage_tab_click; + } + tabNum++; + } + } + jscoverage_selectTab(0); +} + +/** +Selects a tab. +@param tab the integer index of the tab (0, 1, 2, or 3) + OR + the ID of the tab element + OR + the tab element itself +*/ +function jscoverage_selectTab(tab) { + if (typeof tab !== 'number') { + tab = jscoverage_tabIndexOf(tab); + } + var tabs = document.getElementById('tabs'); + var tabPages = document.getElementById('tabPages'); + var nodeList; + var tabNum; + var i; + var node; + + nodeList = tabs.childNodes; + tabNum = 0; + for (i = 0; i < nodeList.length; i++) { + node = nodeList.item(i); + if (node.nodeType !== 1) { + continue; + } + + if (node.className !== 'disabled') { + if (tabNum === tab) { + node.className = 'selected'; + } + else { + node.className = ''; + } + } + tabNum++; + } + + nodeList = tabPages.childNodes; + tabNum = 0; + for (i = 0; i < nodeList.length; i++) { + node = nodeList.item(i); + if (node.nodeType !== 1) { + continue; + } + + if (tabNum === tab) { + node.className = 'selected TabPage'; + } + else { + node.className = 'TabPage'; + } + tabNum++; + } +} + +/** +Returns an integer (0, 1, 2, or 3) representing the index of a given tab. +@param tab the ID of the tab element + OR + the tab element itself +*/ +function jscoverage_tabIndexOf(tab) { + if (typeof tab === 'string') { + tab = document.getElementById(tab); + } + var tabs = document.getElementById('tabs'); + var i; + var child; + var tabNum = 0; + for (i = 0; i < tabs.childNodes.length; i++) { + child = tabs.childNodes.item(i); + if (child.nodeType === 1) { + if (child === tab) { + return tabNum; + } + tabNum++; + } + } +//#JSCOVERAGE_IF 0 + throw "Tab not found"; +//#JSCOVERAGE_ENDIF +} + +function jscoverage_tab_click(e) { + if (jscoverage_inLengthyOperation) { + return; + } + var target; +//#JSCOVERAGE_IF + if (e) { + target = e.target; + } + else if (window.event) { + // IE + target = window.event.srcElement; + } + if (target.className === 'selected') { + return; + } + jscoverage_beginLengthyOperation(); + setTimeout(function() { + if (target.id === 'summaryTab') { + var tbody = document.getElementById("summaryTbody"); + while (tbody.hasChildNodes()) { + tbody.removeChild(tbody.firstChild); + } + } + else if (target.id === 'sourceTab') { + var sourceDiv = document.getElementById('sourceDiv'); + sourceDiv.innerHTML = ''; + } + jscoverage_selectTab(target); + if (target.id === 'summaryTab') { + jscoverage_recalculateSummaryTab(); + } + else if (target.id === 'sourceTab') { + jscoverage_recalculateSourceTab(); + } + else { + jscoverage_endLengthyOperation(); + } + }, 50); +} + +// ----------------------------------------------------------------------------- +// progress bar + +var ProgressBar = { + init: function(element) { + element._percentage = 0; + + /* doing this via JavaScript crashes Safari */ +/* + var pctGraph = document.createElement('div'); + pctGraph.className = 'pctGraph'; + element.appendChild(pctGraph); + var covered = document.createElement('div'); + covered.className = 'covered'; + pctGraph.appendChild(covered); + var pct = document.createElement('span'); + pct.className = 'pct'; + element.appendChild(pct); +*/ + + ProgressBar._update(element); + }, + setPercentage: function(element, percentage) { + element._percentage = percentage; + ProgressBar._update(element); + }, + _update: function(element) { + var pctGraph = element.getElementsByTagName('div').item(0); + var covered = pctGraph.getElementsByTagName('div').item(0); + var pct = element.getElementsByTagName('span').item(0); + pct.innerHTML = element._percentage.toString() + '%'; + covered.style.width = element._percentage + 'px'; + } +}; + +// ----------------------------------------------------------------------------- +// reports + +function jscoverage_pad(s) { + return '0000'.substr(s.length) + s; +} + +function jscoverage_quote(s) { + return '"' + s.replace(/[\u0000-\u001f"\\\u007f-\uffff]/g, function (c) { + switch (c) { + case '\b': + return '\\b'; + case '\f': + return '\\f'; + case '\n': + return '\\n'; + case '\r': + return '\\r'; + case '\t': + return '\\t'; + // IE doesn't support this + /* + case '\v': + return '\\v'; + */ + case '"': + return '\\"'; + case '\\': + return '\\\\'; + default: + return '\\u' + jscoverage_pad(c.charCodeAt(0).toString(16)); + } + }) + '"'; +} + +function jscoverage_serializeCoverageToJSON() { + var json = []; + for (var file in _$jscoverage) { + if (! _$jscoverage.hasOwnProperty(file)) { + continue; + } + + var coverage = _$jscoverage[file]; + + var array = []; + var length = coverage.length; + for (var line = 0; line < length; line++) { + var value = coverage[line]; + if (value === undefined || value === null) { + value = 'null'; + } + array.push(value); + } + + var source = coverage.source; + var lines = []; + length = source.length; + for (var line = 0; line < length; line++) { + lines.push(jscoverage_quote(source[line])); + } + + json.push(jscoverage_quote(file) + ':{"coverage":[' + array.join(',') + '],"source":[' + lines.join(',') + ']}'); + } + return '{' + json.join(',') + '}'; +} + +function jscoverage_storeButton_click() { + if (jscoverage_inLengthyOperation) { + return; + } + + jscoverage_beginLengthyOperation(); + var img = document.getElementById('storeImg'); + img.style.visibility = 'visible'; + + var request = jscoverage_createRequest(); + request.open('POST', '/jscoverage-store', true); + request.onreadystatechange = function (event) { + if (request.readyState === 4) { + var message; + try { + if (request.status !== 200 && request.status !== 201 && request.status !== 204) { + throw request.status; + } + message = request.responseText; + } + catch (e) { + if (e.toString().search(/^\d{3}$/) === 0) { + message = e + ': ' + request.responseText; + } + else { + message = 'Could not connect to server: ' + e; + } + } + + jscoverage_endLengthyOperation(); + var img = document.getElementById('storeImg'); + img.style.visibility = 'hidden'; + + var div = document.getElementById('storeDiv'); + div.appendChild(document.createTextNode(new Date() + ': ' + message)); + div.appendChild(document.createElement('br')); + } + }; + request.setRequestHeader('Content-Type', 'application/json'); + var json = jscoverage_serializeCoverageToJSON(); + request.setRequestHeader('Content-Length', json.length.toString()); + request.send(json); +} diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/coverage/readCoverage.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/coverage/readCoverage.js new file mode 100644 index 000000000..fbd437322 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/coverage/readCoverage.js @@ -0,0 +1,98 @@ +/** + * + */ +///import source +function creatJscoverage(){ + try { + if (typeof top === 'object' && top !== null && typeof top.opener === 'object' && top.opener !== null) { + // this is a browser window that was opened from another window + if (! top.opener._$jscoverage) { + top.opener._$jscoverage = {}; + } + } + } + + catch (e) {} + try { + if (typeof top === 'object' && top !== null) { + // this is a browser window + try { + if (typeof top.opener === 'object' && top.opener !== null && top.opener._$jscoverage) { + top._$jscoverage = top.opener._$jscoverage; + } + } + catch (e) {} + + if (! top._$jscoverage) { + top._$jscoverage = {}; + } + } + } + catch (e) {} + + try { + if (typeof top === 'object' && top !== null && top._$jscoverage) { + _$jscoverage = top._$jscoverage; + } + } + catch (e) {} + if (typeof _$jscoverage !== 'object') { + _$jscoverage = {}; + } +} + +(function(){ + var xmlDoc; + if (window.ActiveXObject) + { + xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); + if(xmlDoc != null) + { + xmlDoc.async=true; + xmlDoc.load("../HTML_Report/report.xml"); + } + } + else if(document.implementation && document.implementation.createDocument) + { + var xmlHttp=new window.XMLHttpRequest(); + xmlHttp.open("GET","../HTML_Report/report.xml",false); + xmlHttp.send(null); + xmlDoc = xmlHttp.responseXML; + }else{ + xmlDom=null; + } + function readCoverage(){ + creatJscoverage(); + var nodeNumber=xmlDoc.getElementsByTagName("testsuite").length; + for(i=0;i1r6Nk%w1VG;l^0M!5h`1tts_4V1=+4A!8(b3WS`}^+h?zgwM*x1FMdu&(F-v%+Aiv+}zy7#l^3$udJ-Bt*x!i&CSWl$-=_I z($dn%$jIQ};J?4W@bK`;%F5N%)x^Za{QUg7y1L%p-rCyQ`uh6s@9)&q)Z5$J;^N}# z>+7njs_N?M;o;%u=jY_)>97R{cuD2epaP4lShH$n zF=BzOud+PgaX_}L*|QVixLO;7LNf?(Cey4&d$!w&CR#Bx7XL#%*@Q(+}y>*#jLEXt*x!Eudm6;$-=_I%F4>p($c@bzwq$z z;NalM$jI8-+SS$7-rnB2y1K-~#P9F#{QUg-`uh0z`1SSm^78W8+1b?8)Z5$J;^N}# z>+9<3>fzzx=jZ3-Ryr-QC^)|Nj60000000000000000000000000000000 z00000A^8LV00000EC2ui04xD8000L6z?yJaOFSeF%52GOI-k&}bV{vSuh^`1%k6r< z;3~1!f>bgw6lu(EyWjA*d`_?1@A$la&+q$%5e_sZe}#sJh>41ejExTy8;z2al$Dm3 zlo1mrn4O-VprMj24w0g#sHv)|5Hzc=u(7g+2^A&?xVgH!yuH4^z`?@9#Kp$P$jQpf z%+1RW1q9O5)YaD4*xB0K+}+;a;Njxq(BTJr4xw7TUm@{kM%z1My5HCWD9!C>oFt6t5zwd>cgW6PdRyS8oG zH6UP+!MnHb-@t+RL9$zrOwZ`19-kKID=0{Qw3i;D7`cxE~RLbl`!33^wTCgAn33 zMi~`c(7*>PM5y709Cq0MU>imtp+p!YmT2OMD5j|5iYzVx;t@%-DC3MY)@b96C{Acb z2p4n!K?6VrDddnu7HQ;>NG7S|l1w(~0+o_zM{=bwNED(Iku7Ha6Bh$gD&qKqE; z9s~tMD(R$@R%+>`m}aW!rkr-_>8GHED(a}DmTIb~)L|gNs;su^>Z`EED(kGY)@tjm zxaO+suDtf@>#xA}n%e~i6l?6U$R?}ovdlK??6c5DEA6z@R%`9G*k-FOwzUYL!nfdt zEAF`DmTT_0=%%ax?z-%@>+ZYo#w+i<^ve5y1_0!%@4o!@>+in+2Q2Ww1Q%@Z!3Za; z@WKo?>~O;pSP;O(6jyBV#TaL-@x~l??D5AShb;2QB$sUR$ta)fKn5wa?DESn$1L;A zG}mnN%{b?*^Ugf??DNk+2Q75a6r`}i(MTt)^wLZ>?ex=7M=kZ#R99{F)mUe(_10W( zO+khphAsBkWYg!s1Jb3f_S$T>?e^Pn$99!$-FWA%_uhQ>?Kf)=h`_?&gcol3 z;fN=$_~MK=?)c-7M=tr~lvi%~<(OYy3kRKb?)m4Shc5c)q?aC9ZVVit`s%E=?)vMn z$1eNqwAXH^`|Y^ruKVu1_wM`ey;BzfVZ;}2{PD;qul(}N-}N2~3Pdmc^wd{x{q@*q zul@Gickli8;D;~%_~e&wzW8*?pw{~Ax9|S@@W(Iz{99ou01PeUumAr1_wWDz01Ti2 z2S~sI8t{M!OrQc6$iN0V@PIn1fCU}^y#!eBf*8!81~ li:last-child { + border-radius: 0 0 15px 15px; + -moz-border-radius: 0 0 15px 15px; + -webkit-border-bottom-right-radius: 15px; + -webkit-border-bottom-left-radius: 15px; +} + +#qunit-tests .fail { color: #000000; background-color: #EE5757; } +#qunit-tests .fail .test-name, +#qunit-tests .fail .module-name { color: #000000; } + +#qunit-tests .fail .test-actual { color: #EE5757; } +#qunit-tests .fail .test-expected { color: green; } + +#qunit-banner.qunit-fail { background-color: #EE5757; } + + +/** Result */ + +#qunit-testresult { + padding: 0.5em 0.5em 0.5em 2.5em; + + color: #2b81af; + background-color: #D2E0E6; + + border-bottom: 1px solid white; +} + +/** Fixture */ + +#qunit-fixture { + position: absolute; + top: -10000px; + left: -10000px; +} diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/css/tangramtest.css b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/css/tangramtest.css new file mode 100644 index 000000000..cd306e139 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/css/tangramtest.css @@ -0,0 +1,173 @@ +* { + margin: 0; + padding: 0; +} + +html { + border: 0; + height: 100%; +} + +body { + font: 12px/1.5 Lucida Grande, Helvetica, Arial, sans-serif; + background: #F3F1F1; + color: #41464D; +} + +body,#container { + width: 100%; + height: 100%; +} + +.clear { /* generic container (i.e. div) for floating buttons */ + overflow: hidden; + width: 100%; +} + +a { + text-decoration: none; + overflow: hidden; +} + +#title { + top: 0; + left: 0; + width: 100%; + padding: 5px 0; + background: #aaa; + background: #41464D; + color: #F3F1F1; + height: 30px; +} + +a:link,a:visited { + color: #528CE0; +} + +a:hover,a:active { + color: #41464D !important; + cursor: pointer !important; +} + +#title h1 { + height: 30px; + font: 25px/1.1 Arial, sans-serif; + font-weight: bolder; + float: left; + margin: 1px 0 2px 20px; + text-shadow: 0 2px 2px rgba(0, 0, 0, 0.4); +} + +h3 { + font-size: 14px; + padding: 3px 5px 1px; +} + +.control { + background: #d5ded7; + width: 99%; +} + +.testlist { + max-height: 200px; + overflow-y: scroll; + border-style: double; +} + +.testlist a { + display: block; + width: 150px; + color: #657528; + background: #d5dea7; + border: 1px solid #c8dc7b; + margin: 5px 0 0 5px; + text-indent: 5px; + line-height: 24px; + font-size: 14px; + float: left; +} + +a.button { + background: transparent url('bg_button_a.gif') no-repeat scroll top + right; + color: #444; + display: block; + float: left; + font: normal 12px arial, sans-serif; + height: 24px; + margin-right: 6px; + padding-right: 18px; /* sliding doors padding */ + text-decoration: none; +} + +a.button span { + background: transparent url('bg_button_span.gif') no-repeat; + display: block; + line-height: 14px; + padding: 5px 0 5px 18px; +} + +a.button:active { + background-position: bottom right; + color: #000; + outline: none; /* hide dotted outline in Firefox */ +} + +a.button:active span { + background-position: bottom left; + padding: 6px 0 4px 18px; /* push text down 1px */ +} + +.testlist a:link { + +} + +.testlist a:visited { + +} + +.testlist a:hover { + background: #c8dc7b; +} + +.testlist a.jsframe_jsspec { + background: #DDDDDD +} + +.testlist a.running_case { + color: yellow; +} + +.testlist a.fail_case { + color: red; +} + +.testlist a.pass_case { + color: green; +} + +.runningarea { + height: 60%; +} + +.runningmaindiv { + height: 99%; +} + +.runningframe { + height: 99.99%; + width: 99.99%; +} + +.runningstatus { + clear: both; + height: 10%; + border: solid +} + +.reportarea { + padding: 10px; + border: 10px blue; + max-height: 200px; + overflow-y: scroll; +} \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/css/testsuite.css b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/css/testsuite.css new file mode 100644 index 000000000..5714bf4a5 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/css/testsuite.css @@ -0,0 +1,119 @@ + +ol#qunit-tests { + font-family:"Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial; + margin:0; + padding:0; + list-style-position:inside; + + font-size: smaller; +} +ol#qunit-tests li{ + padding:0.4em 0.5em 0.4em 2.5em; + border-bottom:1px solid #fff; + font-size:small; + list-style-position:inside; +} +ol#qunit-tests li ol{ + box-shadow: inset 0px 2px 13px #999; + -moz-box-shadow: inset 0px 2px 13px #999; + -webkit-box-shadow: inset 0px 2px 13px #999; + margin-top:0.5em; + margin-left:0; + padding:0.5em; + background-color:#fff; + border-radius:15px; + -moz-border-radius: 15px; + -webkit-border-radius: 15px; +} +ol#qunit-tests li li{ + border-bottom:none; + margin:0.5em; + background-color:#fff; + list-style-position: inside; + padding:0.4em 0.5em 0.4em 0.5em; +} + +ol#qunit-tests li li.pass{ + border-left:26px solid #C6E746; + background-color:#fff; + color:#5E740B; + } +ol#qunit-tests li li.fail{ + border-left:26px solid #EE5757; + background-color:#fff; + color:#710909; +} +ol#qunit-tests li.pass{ + background-color:#D2E0E6; + color:#528CE0; +} +ol#qunit-tests li.fail{ + background-color:#EE5757; + color:#000; +} +ol#qunit-tests li strong { + cursor:pointer; +} +h1#qunit-header{ + background-color:#0d3349; + margin:0; + padding:0.5em 0 0.5em 1em; + color:#fff; + font-family:"Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial; + border-top-right-radius:15px; + border-top-left-radius:15px; + -moz-border-radius-topright:15px; + -moz-border-radius-topleft:15px; + -webkit-border-top-right-radius:15px; + -webkit-border-top-left-radius:15px; + text-shadow: rgba(0, 0, 0, 0.5) 4px 4px 1px; +} +h2#qunit-banner{ + font-family:"Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial; + height:5px; + margin:0; + padding:0; +} +h2#qunit-banner.qunit-pass{ + background-color:#C6E746; +} +h2#qunit-banner.qunit-fail, #qunit-testrunner-toolbar { + background-color:#EE5757; +} +#qunit-testrunner-toolbar { + font-family:"Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial; + padding:0; + /*width:80%;*/ + padding:0em 0 0.5em 2em; + font-size: small; +} +h2#qunit-userAgent { + font-family:"Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial; + background-color:#2b81af; + margin:0; + padding:0; + color:#fff; + font-size: small; + padding:0.5em 0 0.5em 2.5em; + text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px; +} +p#qunit-testresult{ + font-family:"Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial; + margin:0; + font-size: small; + color:#2b81af; + border-bottom-right-radius:15px; + border-bottom-left-radius:15px; + -moz-border-radius-bottomright:15px; + -moz-border-radius-bottomleft:15px; + -webkit-border-bottom-right-radius:15px; + -webkit-border-bottom-left-radius:15px; + background-color:#D2E0E6; + padding:0.5em 0.5em 0.5em 2.5em; +} +strong b.fail{ + color:#710909; + } +strong b.pass{ + color:#5E740B; + } diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/filehelper.php b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/filehelper.php new file mode 100644 index 000000000..bd4d691a1 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/filehelper.php @@ -0,0 +1,57 @@ + \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/geneHTML.php b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/geneHTML.php new file mode 100644 index 000000000..6549fe7f0 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/geneHTML.php @@ -0,0 +1,209 @@ +来设置css是因为有的邮件客户端会过滤这样的信息 + * + * ***/ +function geneHTML($caseList, $name=''){ + date_default_timezone_set('PRC'); +// $url = (isset ($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '') . $_SERVER['PHP_SELF']; + $url =""; + $html = " +
      +

      自动化用例测试结果".date('Y-m-d H:i:s')."

      +网页版 + +".getTrCase($caseList,true,1)."
      fail的用例统计
      用例名称


      + +".getTrCase($caseList,false,1)."".getTrCase($caseList,false,0)."
      全部用例统计
      用例名称
      未覆盖到的用例
      "; +// ."

    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%0A7rcFg5&N}Ja9=ZgCMPxuSUNk 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�$w$u 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

    "._srcOnlyList()."" + return $html; +} + +/** + * 创建遗漏用例列表 + * FIXME: 需要过滤package类型,考虑使用js名称同名目录存在进行过滤或者白名单 + */ +function _srcOnlyList(){ + require 'case.class.php'; + $list = Kiss::listSrcOnly(false); + $len = sizeof($list); + $flag="
    遗漏列表:总计$len,未过滤无需用例的package类型
    "; + $flag.=implode("
    ", $list); + $flag.="
    "; + return $flag; +} + +/** + * + * 根据实际浏览器书目确认生成表头 + * @param unknown_type $caseList + */ +function getThBrowser($caseList){ + //创建浏览器相关单元格 + $thBrowser = ''; + $count = 0; + foreach ($caseList as $casename => $casedetail) { + //每一个用例 + foreach ($casedetail as $b => $info) { + $thBrowser .= "$b"; + $count++; + } + $thBrowser .=""; + break;//遍历一次就知道所有浏览器的信息 + } + for($index = 0; $index < $count; $index++) { + $thBrowser .= "covfailtotal"; + } + + return $thBrowser.""; +} + +/** + * + * 根据执行结果生成单元格信息 + * @param unknown_type $caseList + */ +function getTrCase($caseList,$onlyFail,$onlyCoverd){ +//$onlyFail 为真时,只显示 fail 的用例 + //$onlyCoverd 为0时,只显示全浏览器覆盖率为0的用例;为1时,只显示全浏览器覆盖率不为0的用例;为其他时,显示所有的用例 + //创建case名对应的单元格 + $totalTrCase = ''; + require_once 'config.php'; + $rowColor = '#B0E0E6';//标记行的颜色,单双数行显示的背景颜色不同 + $numBro = count(Config::getBrowserSet($configBrowserSet)); + $averageCov = 0;//所有用例的全浏览器覆盖率的平均值(全浏览器覆盖率为0的不计) + $numCov = 0;//全浏览器覆盖率不为0的用例数量 + foreach ($caseList as $casename => $caseDetail) { + //每一个用例 + $ifFail = false; + $cnurl = implode('.', explode('_', $casename)); + $trCase = ''; + $totalCov = calTotalCov($caseDetail,$numBro); + $averageCov +=$totalCov; + $numCov = $totalCov==0?$numCov:$numCov+1; + if(($onlyCoverd==0&&$totalCov!=0)||($onlyCoverd==1&&$totalCov==0))//$onlyCoverd 为0时,只显示全浏览器覆盖率为0的用例;为1时,只显示全浏览器覆盖率不为0的用例; + continue; + if(!$onlyFail){//对于展示 fail 的用例的列表,不显示全浏览器覆盖率 + $trCase .= "".$totalCov.($totalCov=="_"?"":"%").""; + } + foreach ($caseDetail as $br => $infos) { + //$b为browser名字,$info为详细信息 + $fail = $infos['fail']; + $ifFail = $fail==0?$ifFail:true; + $total = $infos['total']; + $cov = $infos['cov']; + $color = $fail == 0 ? $rowColor : '#CD5C5C'; + $PercentSign = $cov=='_'?'':'%'; + $trCase .= "".$cov.$PercentSign."".$fail."".$total.""; + } + $trCase ="运行$casename".$trCase.""; + if(!$onlyFail||$ifFail){ + $totalTrCase =$totalTrCase.$trCase; + $rowColor = $rowColor=='#F0FFFF'?'#B0E0E6':'#F0FFFF'; + } + else; + } + $averageCov = number_format($averageCov/$numCov,1); + if($onlyCoverd==0) + $tableContent = $totalTrCase; + elseif(!$onlyFail) + $tableContent = "总覆盖率
    (平均值:".$averageCov."%)".getThBrowser($caseList).$totalTrCase; + else + $tableContent = getThBrowser($caseList).$totalTrCase; + return $tableContent; +} + +/** + * + * 计算总覆盖率信息 + * @param unknown_type $caseDetail + * @param unknown_type $brcount + */ +function calTotalCov($caseDetail,$brcount){ + $length = -1; + $num_statements = 0; + $num_executed = 0; + $totalInfo = null;//数组,记录全浏览器的覆盖情况,对文件中的每一行:覆盖为1,没覆盖为0,不计数为2 + $flag = 1;//$flag==-1时,各个浏览器覆盖率记录的文件信息有冲突,不能计算出全浏览器覆盖率(统计的文件长度不同/标记为2的不计入统计的行信息不同) + foreach ($caseDetail as $caseInfo){ + //如果recordCovForBrowser为空,跳过这个$caseInfo + if($caseInfo['recordCovForBrowser']==''){ + continue; + } + $infos = explode(',',$caseInfo['recordCovForBrowser']); + + $length = ($length==-1||$length==count($infos))?count($infos):-1; + if($length==-1||$length!=count($infos)) + break;//统计的文件长度不同 + else + ; + if($totalInfo==null){ +// if(count($infos)==1){ +// $flag = 0;//没有覆盖率信息 +// break; +// } + for($i=0;$i \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/geneHistory.php b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/geneHistory.php new file mode 100644 index 000000000..7448bfd5e --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/geneHistory.php @@ -0,0 +1,19 @@ + \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/geneXML.php b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/geneXML.php new file mode 100644 index 000000000..ae0742c1b --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/geneXML.php @@ -0,0 +1,82 @@ +testsuite as $testsuite){ + foreach ($testsuite->testcase as $testResult) { + // $totalCov = 0; + $browser = $testResult['browserInfo']; + $host = $testResult['hostInfo']; + $caseName = $testResult['name']; //得到用例名称 + settype($caseName, "string"); //$caseName本来类型为object,需要做转换 + $fail = $testResult['failNumber']; + $total = $testResult['totalNumber']; + $cov = $testResult['cov']; + settype($browser, "string"); + settype($host, "string"); + settype($fail, "string"); + settype($total, "string"); + settype($cov, "float"); + + if (!array_key_exists($caseName, $caseList)) { //如果这个用例不存在 + $caseInfo = array ( + 'hostInfo' => $host, + 'fail' => $fail, + 'total' => $total, + 'cov' => $cov + ); + // $totalCov += $cov; + $caseList[$caseName] = array ( + $browser => $caseInfo//, + // 'totalCov'=>$totalCov + ); + + // $caseList['totalCov'] = $totalCov; + } else { //否则添加到相应的用例中去 + $foundCase = $caseList[$caseName]; //找到用例名称对应的array,$caseName为key + if (!array_key_exists($browser, $foundCase)) { //如果没有该浏览器信息,则添加 + // $totalCov += $cov; + $caseList[$caseName][$browser] = array ( + 'hostInfo' => $host, + 'fail' => $fail, + 'total' => $total, + 'cov' => $cov + ); + // $caseList[$caseName]['totalCov'] = $totalCov; + } else { + $foundBrowser = $foundCase[$browser]; //有这个浏览器 + array_push($foundBrowser, array ( + 'hostInfo' => $host, + 'fail' => $fail, + 'total' => $total, + 'cov' => $cov + )); + } + } + + } + } + + //根据需求添加仅记录失败情况的接口 + if($onlyfails){//如果仅考虑失败情况,此处根据用例情况过滤 + foreach($caseList as $name => $info){ + $all_success = true;//记录当前用例是否全部运行成功 + foreach($info as $b => $result){ + if($result['fail'] > 0) + $all_success = false;//如果有失败情况则终止循环并进入下一个用例分析 + break; + } + //if($all_success) //如果全部通过则从记录中移除 + //unset($caseList[$name]); + } + } + return $caseList; +} +?> \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/import.php b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/import.php new file mode 100644 index 000000000..c1672bd64 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/import.php @@ -0,0 +1,71 @@ +$d){ +// if(preg_match("/editorui/",$dd)){ +// echo "*************".file_get_contents($d.$path)."************"; +// } + if(file_exists($d.$path)){ + $source.= file_get_contents($d.$path); + $source.="\n";//读取文件内容必须加个回车 + break; + } + } + } + } + return $source; +} +//update by bell 2011-03-25, 更新覆盖率相关逻辑 +echo importSrc($cov); +?> \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/js/UserAction manual.rar b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/js/UserAction manual.rar new file mode 100644 index 0000000000000000000000000000000000000000..75853cb989bff81b498aa5f2a3cdc734b2c45b31 GIT binary patch literal 93842 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 YQ2kE|u>Y+9)P%pF_49fH1Rwza1+05iUjP6A literal 0 HcmV?d00001 diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/js/UserAction.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/js/UserAction.js new file mode 100644 index 000000000..17b784798 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/js/UserAction.js @@ -0,0 +1,1888 @@ +/** + * 测试用例库文件,提供如event mock、iframe封装等各种常用功能 部分方法来源于YUI测试框架 + */ +UserAction = { + beforedispatch:null, +// flag : true, + isf /* is function ? */:function (value) { + return value && (typeof value == 'function'); + }, + isb /* is boolean? */:function (value) { + return value && (typeof value == 'boolean'); + }, + iso /* is object? */:function (value) { + return value && (typeof value == 'object'); + }, + iss /* is string? */:function (value) { + return value && (typeof value == 'string'); + }, + isn /* is number? */:function (value) { + return value && (typeof value == 'number'); + }, + // -------------------------------------------------------------------------- + // Generic event methods + // -------------------------------------------------------------------------- + + /** + * Simulates a key event using the given event information to populate the + * generated event object. This method does browser-equalizing calculations + * to account for differences in the DOM and IE event models as well as + * different browser quirks. Note: keydown causes Safari 2.x to crash. + * + * @method simulateKeyEvent + * @private + * @static + * @param {HTMLElement} + * target The target of the given event. + * @param {String} + * type The type of event to fire. This can be any one of the + * following: keyup, keydown, and keypress. + * @param {Boolean} + * bubbles (Optional) Indicates if the event can be bubbled up. + * DOM Level 3 specifies that all key events bubble by default. + * The default is true. + * @param {Boolean} + * cancelable (Optional) Indicates if the event can be canceled + * using preventDefault(). DOM Level 3 specifies that all key + * events can be cancelled. The default is true. + * @param {Window} + * view (Optional) The view containing the target. This is + * typically the window object. The default is window. + * @param {Boolean} + * ctrlKey (Optional) Indicates if one of the CTRL keys is + * pressed while the event is firing. The default is false. + * @param {Boolean} + * altKey (Optional) Indicates if one of the ALT keys is pressed + * while the event is firing. The default is false. + * @param {Boolean} + * shiftKey (Optional) Indicates if one of the SHIFT keys is + * pressed while the event is firing. The default is false. + * @param {Boolean} + * metaKey (Optional) Indicates if one of the META keys is + * pressed while the event is firing. The default is false. + * @param {int} + * keyCode (Optional) The code for the key that is in use. The + * default is 0. + * @param {int} + * charCode (Optional) The Unicode code for the character + * associated with the key being used. The default is 0. + */ + simulateKeyEvent:function (target /* :HTMLElement */, type /* :String */, bubbles /* :Boolean */, cancelable /* :Boolean */, view /* :Window */, ctrlKey /* :Boolean */, altKey /* :Boolean */, shiftKey /* :Boolean */, metaKey /* :Boolean */, keyCode /* :int */, charCode /* :int */) /* :Void */ { + // check target + target = typeof target == 'string' ? document.getElementById(target) + : target; + if (!target) { + throw new Error("simulateKeyEvent(): Invalid target."); + } + + // check event type + if (typeof type == 'string') { + type = type.toLowerCase(); + switch (type) { + case "compositionend": + case "compositionstart": + case "paste": + case "cut": + case "keyup": + case "keydown": + case "keypress": + break; + case "textevent": // DOM Level 3 + type = "keypress"; + break; + // @TODO was the fallthrough intentional, if so throw error + default: + throw new Error("simulateKeyEvent(): Event type '" + type + + "' not supported."); + } + } else { + throw new Error("simulateKeyEvent(): Event type must be a string."); + } + + // setup default values + if (!this.isb(bubbles)) { + bubbles = true; // all key events bubble + } + if (!this.isb(cancelable)) { + cancelable = true; // all key events can be cancelled + } + if (!this.iso(view)) { + view = window; // view is typically window + } + if (!this.isb(ctrlKey)) { + ctrlKey = false; + } + if (!this.isb(typeof altKey == 'boolean')) { + altKey = false; + } + if (!this.isb(shiftKey)) { + shiftKey = false; + } + if (!this.isb(metaKey)) { + metaKey = false; + } + if (!(typeof keyCode == 'number')) { + keyCode = 0; + } + if (!(typeof charCode == 'number')) { + charCode = 0; + } + + // try to create a mouse event + var customEvent /* :MouseEvent */ = null; + + // check for DOM-compliant browsers first + if (this.isf(document.createEvent)) { + + try { + + // try to create key event + customEvent = document.createEvent("KeyEvents"); + + /* + * Interesting problem: Firefox implemented a non-standard + * version of initKeyEvent() based on DOM Level 2 specs. Key + * event was removed from DOM Level 2 and re-introduced in DOM + * Level 3 with a different interface. Firefox is the only + * browser with any implementation of Key Events, so for now, + * assume it's Firefox if the above line doesn't error. + */ + // TODO: Decipher between Firefox's implementation and a correct + // one. + customEvent.initKeyEvent(type, bubbles, cancelable, view, + ctrlKey, altKey, shiftKey, metaKey, keyCode, charCode); + + } catch (ex /* :Error */) { + + /* + * If it got here, that means key events aren't officially + * supported. Safari/WebKit is a real problem now. WebKit 522 + * won't let you set keyCode, charCode, or other properties if + * you use a UIEvent, so we first must try to create a generic + * event. The fun part is that this will throw an error on + * Safari 2.x. The end result is that we need another + * try...catch statement just to deal with this mess. + */ + try { + + // try to create generic event - will fail in Safari 2.x + customEvent = document.createEvent("Events"); + + } catch (uierror /* :Error */) { + + // the above failed, so create a UIEvent for Safari 2.x + customEvent = document.createEvent("UIEvents"); + + } finally { + + customEvent.initEvent(type, bubbles, cancelable); + + // initialize + customEvent.view = view; + customEvent.altKey = altKey; + customEvent.ctrlKey = ctrlKey; + customEvent.shiftKey = shiftKey; + customEvent.metaKey = metaKey; + customEvent.keyCode = keyCode; + customEvent.charCode = charCode; + + } + + } + + // before dispatch + if (this.beforedispatch && typeof this.beforedispatch == 'function') + this.beforedispatch(customEvent); + this.beforedispatch = null; + + // fire the event + target.dispatchEvent(customEvent); + + } else if (this.iso(document.createEventObject)) { // IE + + // create an IE event object + customEvent = document.createEventObject(); + + // assign available properties + customEvent.bubbles = bubbles; + customEvent.cancelable = cancelable; + customEvent.view = view; + customEvent.ctrlKey = ctrlKey; + customEvent.altKey = altKey; + customEvent.shiftKey = shiftKey; + customEvent.metaKey = metaKey; + + /* + * IE doesn't support charCode explicitly. CharCode should take + * precedence over any keyCode value for accurate representation. + */ + customEvent.keyCode = (charCode > 0) ? charCode : keyCode; + + // before dispatch + if (this.beforedispatch && typeof this.beforedispatch == 'function') + this.beforedispatch(customEvent); + this.beforedispatch = null; + + // fire the event + target.fireEvent("on" + type, customEvent); + + } else { + throw new Error( + "simulateKeyEvent(): No event simulation framework present."); + } + + this.beforedispatch = null; + }, + + /** + * Simulates a mouse event using the given event information to populate the + * generated event object. This method does browser-equalizing calculations + * to account for differences in the DOM and IE event models as well as + * different browser quirks. + * + * @method simulateMouseEvent + * @private + * @static + * @param {HTMLElement} + * target The target of the given event. + * @param {String} + * type The type of event to fire. This can be any one of the + * following: click, dblclick, mousedown, mouseup, mouseout, + * mouseover, and mousemove. + * @param {Boolean} + * bubbles (Optional) Indicates if the event can be bubbled up. + * DOM Level 2 specifies that all mouse events bubble by default. + * The default is true. + * @param {Boolean} + * cancelable (Optional) Indicates if the event can be canceled + * using preventDefault(). DOM Level 2 specifies that all mouse + * events except mousemove can be cancelled. The default is true + * for all events except mousemove, for which the default is + * false. + * @param {Window} + * view (Optional) The view containing the target. This is + * typically the window object. The default is window. + * @param {int} + * detail (Optional) The number of times the mouse button has + * been used. The default value is 1. + * @param {int} + * screenX (Optional) The x-coordinate on the screen at which + * point the event occured. The default is 0. + * @param {int} + * screenY (Optional) The y-coordinate on the screen at which + * point the event occured. The default is 0. + * @param {int} + * clientX (Optional) The x-coordinate on the client at which + * point the event occured. The default is 0. + * @param {int} + * clientY (Optional) The y-coordinate on the client at which + * point the event occured. The default is 0. + * @param {Boolean} + * ctrlKey (Optional) Indicates if one of the CTRL keys is + * pressed while the event is firing. The default is false. + * @param {Boolean} + * altKey (Optional) Indicates if one of the ALT keys is pressed + * while the event is firing. The default is false. + * @param {Boolean} + * shiftKey (Optional) Indicates if one of the SHIFT keys is + * pressed while the event is firing. The default is false. + * @param {Boolean} + * metaKey (Optional) Indicates if one of the META keys is + * pressed while the event is firing. The default is false. + * @param {int} + * button (Optional) The button being pressed while the event is + * executing. The value should be 0 for the primary mouse button + * (typically the left button), 1 for the terciary mouse button + * (typically the middle button), and 2 for the secondary mouse + * button (typically the right button). The default is 0. + * @param {HTMLElement} + * relatedTarget (Optional) For mouseout events, this is the + * element that the mouse has moved to. For mouseover events, + * this is the element that the mouse has moved from. This + * argument is ignored for all other events. The default is null. + */ + simulateMouseEvent:function (target /* :HTMLElement */, type /* :String */, bubbles /* :Boolean */, cancelable /* :Boolean */, view /* :Window */, detail /* :int */, screenX /* :int */, screenY /* :int */, clientX /* :int */, clientY /* :int */, ctrlKey /* :Boolean */, altKey /* :Boolean */, shiftKey /* :Boolean */, metaKey /* :Boolean */, button /* :int */, relatedTarget /* :HTMLElement */,button) /* :Void */ { + + // check target + target = typeof target == 'string' ? document.getElementById(target) + : target; + if (!target) { + throw new Error("simulateMouseEvent(): Invalid target."); + } + + // check event type + if (this.iss(type)) { + type = type.toLowerCase(); + switch (type) { + case "mouseover": + case "mouseout": + case "mousedown": + case "mouseup": + case "click": + case "dblclick": + case "mousemove": + case "mouseenter":// 非标准支持,仅为测试提供,该项仅IE下work + case "mouseleave": + case "contextmenu": + case "dragend": + case "blur": + break; + default: + throw new Error("simulateMouseEvent(): Event type '" + type + + "' not supported."); + } + } else { + throw new Error( + "simulateMouseEvent(): Event type must be a string."); + } + + // setup default values + if (!this.isb(bubbles)) { + bubbles = true; // all mouse events bubble + } + if (!this.isb(cancelable)) { + cancelable = (type != "mousemove"); // mousemove is the only one + // that can't be cancelled + } + if (!this.iso(view)) { + view = window; // view is typically window + } + if (!this.isn(detail)) { + detail = 1; // number of mouse clicks must be at least one + } + if (!this.isn(screenX)) { + screenX = 0; + } + if (!this.isn(screenY)) { + screenY = 0; + } + if (!this.isn(clientX)) { + clientX = 0; + } + if (!this.isn(clientY)) { + clientY = 0; + } + if (!this.isb(ctrlKey)) { + ctrlKey = false; + } + if (!this.isb(altKey)) { + altKey = false; + } + if (!this.isb(shiftKey)) { + shiftKey = false; + } + if (!this.isb(metaKey)) { + metaKey = false; + } + if (!this.isn(button)) { + button = 0; + } + // try to create a mouse event + var customEvent /* :MouseEvent */ = null; + + // check for DOM-compliant browsers first + if (this.isf(document.createEvent)) { + + customEvent = document.createEvent("MouseEvents"); + // Safari 2.x (WebKit 418) still doesn't implement initMouseEvent() + if (this.browser.ie < 9 && customEvent.initMouseEvent) { + + customEvent.initMouseEvent(type, bubbles, cancelable, view, + detail, screenX, screenY, clientX, clientY, ctrlKey, + altKey, shiftKey, metaKey, button, relatedTarget); + } else { // Safari + + // the closest thing available in Safari 2.x is UIEvents + customEvent = document.createEvent("UIEvents"); + customEvent.initEvent(type, bubbles, cancelable); + customEvent.view = view; + customEvent.detail = detail; + customEvent.screenX = screenX; + customEvent.screenY = screenY; + customEvent.clientX = clientX; + customEvent.clientY = clientY; + customEvent.ctrlKey = ctrlKey; + customEvent.altKey = altKey; + customEvent.metaKey = metaKey; + customEvent.shiftKey = shiftKey; + customEvent.button = button; + customEvent.relatedTarget = relatedTarget; + } + + /* + * Check to see if relatedTarget has been assigned. Firefox versions + * less than 2.0 don't allow it to be assigned via initMouseEvent() + * and the property is readonly after event creation, so in order to + * keep YAHOO.util.getRelatedTarget() working, assign to the IE + * proprietary toElement property for mouseout event and fromElement + * property for mouseover event. + */ + if (relatedTarget && !customEvent.relatedTarget) { + if (type == "mouseout") { + customEvent.toElement = relatedTarget; + } else if (type == "mouseover") { + customEvent.fromElement = relatedTarget; + } + } + + // before dispatch + if (this.beforedispatch && typeof this.beforedispatch == 'function') + this.beforedispatch(customEvent); + this.beforedispatch = null; + + // fire the event + target.dispatchEvent(customEvent); + + } else if (this.iso(document.createEventObject)) { // IE + + // create an IE event object + customEvent = document.createEventObject(); + + // assign available properties + customEvent.bubbles = bubbles; + customEvent.cancelable = cancelable; + customEvent.view = view; + customEvent.detail = detail; + customEvent.screenX = screenX; + customEvent.screenY = screenY; + customEvent.clientX = clientX; + customEvent.clientY = clientY; + customEvent.ctrlKey = ctrlKey; + customEvent.altKey = altKey; + customEvent.metaKey = metaKey; + customEvent.shiftKey = shiftKey; + + // fix button property for IE's wacky implementation + switch (button) { + case 0: + customEvent.button = 1; + break; + case 1: + customEvent.button = 4; + break; + case 2: + customEvent.button = 2; + // leave as is + break; + default: + customEvent.button = 0; + } + + /* + * Have to use relatedTarget because IE won't allow assignment to + * toElement or fromElement on generic events. This keeps + * YAHOO.util.customEvent.getRelatedTarget() functional. + */ + customEvent.relatedTarget = relatedTarget; + + // before dispatch + if (this.beforedispatch && typeof this.beforedispatch == 'function') + this.beforedispatch(customEvent); + this.beforedispatch = null; + // fire the event + target.fireEvent("on" + type, customEvent); + + } else { + throw new Error( + "simulateMouseEvent(): No event simulation framework present."); + } + }, + + // -------------------------------------------------------------------------- + // Mouse events + // -------------------------------------------------------------------------- + + /** + * Simulates a mouse event on a particular element. + * + * @param {HTMLElement} + * target The element to click on. + * @param {String} + * type The type of event to fire. This can be any one of the + * following: click, dblclick, mousedown, mouseup, mouseout, + * mouseover, and mousemove. + * @param {Object} + * options Additional event options (use DOM standard names). + * @method mouseEvent + * @static + */ + fireMouseEvent:function (target /* :HTMLElement */, type /* :String */, options /* :Object */) /* :Void */ { + options = options || {}; + this.simulateMouseEvent(target, type, options.bubbles, + options.cancelable, options.view, options.detail, + options.screenX, options.screenY, options.clientX, + options.clientY, options.ctrlKey, options.altKey, + options.shiftKey, options.metaKey, options.button, + options.relatedTarget,options.button); + }, + + /** + * Simulates a click on a particular element. + * + * @param {HTMLElement} + * target The element to click on. + * @param {Object} + * options Additional event options (use DOM standard names). + * @method click + * @static + */ + click:function (target /* :HTMLElement */, options /* :Object */) /* :Void */ { + this.fireMouseEvent(target, "click", options); + }, + + /** + * Simulates a double click on a particular element. + * + * @param {HTMLElement} + * target The element to double click on. + * @param {Object} + * options Additional event options (use DOM standard names). + * @method dblclick + * @static + */ + dblclick:function (target /* :HTMLElement */, options /* :Object */) /* :Void */ { + this.fireMouseEvent(target, "dblclick", options); + }, + + /** + * Simulates a mousedown on a particular element. + * + * @param {HTMLElement} + * target The element to act on. + * @param {Object} + * options Additional event options (use DOM standard names). + * @method mousedown + * @static + */ + mousedown:function (target /* :HTMLElement */, options /* Object */) /* :Void */ { + this.fireMouseEvent(target, "mousedown", options); + }, + + /** + * Simulates a mousemove on a particular element. + * + * @param {HTMLElement} + * target The element to act on. + * @param {Object} + * options Additional event options (use DOM standard names). + * @method mousemove + * @static + */ + mousemove:function (target /* :HTMLElement */, options /* Object */) /* :Void */ { + this.fireMouseEvent(target, "mousemove", options); + }, + + /** + * Simulates a mouseout event on a particular element. Use "relatedTarget" + * on the options object to specify where the mouse moved to. Quirks: + * Firefox less than 2.0 doesn't set relatedTarget properly, so toElement is + * assigned in its place. IE doesn't allow toElement to be be assigned, so + * relatedTarget is assigned in its place. Both of these concessions allow + * YAHOO.util.Event.getRelatedTarget() to work correctly in both browsers. + * + * @param {HTMLElement} + * target The element to act on. + * @param {Object} + * options Additional event options (use DOM standard names). + * @method mouseout + * @static + */ + mouseout:function (target /* :HTMLElement */, options /* Object */) /* :Void */ { + this.fireMouseEvent(target, "mouseout", options); + }, + + /** + * Simulates a mouseover event on a particular element. Use "relatedTarget" + * on the options object to specify where the mouse moved from. Quirks: + * Firefox less than 2.0 doesn't set relatedTarget properly, so fromElement + * is assigned in its place. IE doesn't allow fromElement to be be assigned, + * so relatedTarget is assigned in its place. Both of these concessions + * allow YAHOO.util.Event.getRelatedTarget() to work correctly in both + * browsers. + * + * @param {HTMLElement} + * target The element to act on. + * @param {Object} + * options Additional event options (use DOM standard names). + * @method mouseover + * @static + */ + mouseover:function (target /* :HTMLElement */, options /* Object */) /* :Void */ { + this.fireMouseEvent(target, "mouseover", options); + }, + + /** + * Simulates a mouseup on a particular element. + * + * @param {HTMLElement} + * target The element to act on. + * @param {Object} + * options Additional event options (use DOM standard names). + * @method mouseup + * @static + */ + mouseup:function (target /* :HTMLElement */, options /* Object */) /* :Void */ { + this.fireMouseEvent(target, "mouseup", options); + }, + mouseenter:function (target /* :HTMLElement */, options /* Object */) /* :Void */ { + this.fireMouseEvent(target, "mouseenter", options); + }, + mouseleave:function (target /* :HTMLElement */, options /* Object */) /* :Void */ { + this.fireMouseEvent(target, "mouseleave", options); + }, + /** + * Simulates a contextmenu on a particular element. + * + * @param {HTMLElement} + * target The element to show contextmenu. + * @param {Object} + * options Additional event options (use DOM standard names). + * @method contextmenu + * @static + */ + contextmenu:function (target /* :HTMLElement */, options /* :Object */) /* :Void */ { + this.fireMouseEvent(target, "contextmenu", options); + }, + /** + * Simulates a dragend on a particular element. + * + * @param {HTMLElement} + * target The element to show dragend. + * @param {Object} + * options Additional event options (use DOM standard names). + * @method dragend + * @static + */ + dragend:function (target /* :HTMLElement */, options /* :Object */) /* :Void */ { + this.fireMouseEvent(target, "dragend", options); + }, + /** + * Simulates a blur on a particular element. + * + * @param {HTMLElement} + * target The element to show blur. + * @param {Object} + * options Additional event options (use DOM standard names). + * @method blur + * @static + */ + blur:function (target /* :HTMLElement */, options /* :Object */) /* :Void */ { + this.fireMouseEvent(target, "blur", options); + }, + dragto:function (target, options) { + var me = this; + me.mousemove(target, { + clientX:options.startX, + clientY:options.startY + }); + setTimeout(function () { + me.mousedown(target, { + clientX:options.startX, + clientY:options.startY + }); + setTimeout(function () { + me.mousemove(target, { + clientX:options.endX, + clientY:options.endY + }); + setTimeout(function () { + me.mouseup(target, { + clientX:options.endX, + clientY:options.endY + }); + if (options.callback) + options.callback(); + }, options.aftermove || 20); + }, options.beforemove || 20); + }, options.beforestart || 50); + }, + + // -------------------------------------------------------------------------- + // Key events + // -------------------------------------------------------------------------- + + /** + * Fires an event that normally would be fired by the keyboard (keyup, + * keydown, keypress). Make sure to specify either keyCode or charCode as an + * option. + * + * @private + * @param {String} + * type The type of event ("keyup", "keydown" or "keypress"). + * @param {HTMLElement} + * target The target of the event. + * @param {Object} + * options Options for the event. Either keyCode or charCode are + * required. + * @method fireKeyEvent + * @static + */ + fireKeyEvent:function (type /* :String */, target /* :HTMLElement */, options /* :Object */) /* :Void */ { + options = options || {}; + this.simulateKeyEvent(target, type, options.bubbles, + options.cancelable, options.view, options.ctrlKey, + options.altKey, options.shiftKey, options.metaKey, + options.keyCode, options.charCode); + }, + + /** + * Simulates a cut event on a particular element. + * + * @param {HTMLElement} + * target The element to act on. + * @param {Object} + * options Additional event options (use DOM standard names). + * @method cut + * @static + */ + cut:function (target /* :HTMLElement */, options /* :Object */) /* :Void */ { + this.fireKeyEvent("cut", target, options); + }, + + /** + * Simulates a paste event on a particular element. + * + * @param {HTMLElement} + * target The element to act on. + * @param {Object} + * options Additional event options (use DOM standard names). + * @method paste + * @static + */ + paste:function ( target /* :HTMLElement */, options /* :Object */ ) /* :Void */ { + this.fireKeyEvent( "paste", target, options ); + }, + + /** + * Simulates a keydown event on a particular element. + * + * @param {HTMLElement} + * target The element to act on. + * @param {Object} + * options Additional event options (use DOM standard names). + * @method keydown + * @static + */ + keydown:function (target /* :HTMLElement */, options /* :Object */) /* :Void */ { + this.fireKeyEvent("keydown", target, options); + }, + + /** + * Simulates a keypress on a particular element. + * + * @param {HTMLElement} + * target The element to act on. + * @param {Object} + * options Additional event options (use DOM standard names). + * @method keypress + * @static + */ + keypress:function (target /* :HTMLElement */, options /* :Object */) /* :Void */ { + this.fireKeyEvent("keypress", target, options); + }, + + /** + * Simulates a keyup event on a particular element. + * + * @param {HTMLElement} + * target The element to act on. + * @param {Object} + * options Additional event options (use DOM standard names). + * @method keyup + * @static + */ + keyup:function (target /* :HTMLElement */, options /* Object */) /* :Void */ { + this.fireKeyEvent("keyup", target, options); + }, + + /** + * Simulates a compositionstart event on a particular element. + * + * @param {HTMLElement} + * target The element to act on. + * @param {Object} + * options Additional event options (use DOM standard names). + * @method compositionstart + * @static + */ + compositionstart:function (target /* :HTMLElement */, options /* Object */) /* :Void */ { + this.fireKeyEvent("compositionstart", target, options); + }, + + /** + * Simulates a compositionstart event on a particular element. + * + * @param {HTMLElement} + * target The element to act on. + * @param {Object} + * options Additional event options (use DOM standard names). + * @method compositionstart + * @static + */ + compositionend:function (target /* :HTMLElement */, options /* Object */) /* :Void */ { + this.fireKeyEvent("compositionend", target, options); + }, + + /** + * 提供iframe扩展支持,用例测试需要独立场景的用例,由于异步支持,通过finish方法触发start + *

  • 事件绑定在frame上,包括afterfinish和jsloaded + * + * @param op.win + * @param op.nojs + * 不加载额外js + * @param op.ontest + * 测试步骤 + * @param op.onbeforestart + * 测试启动前处理步骤,默认为QUnit.stop(); + * @param op.onafterfinish + * 测试完毕执行步骤,默认为QUnit.start() + * + */ + frameExt:function (op) { + stop(); + op = typeof op == 'function' ? { + ontest:op + } : op; + var pw = op.win || window, w, f, url = '', id = typeof op.id == 'undefined' ? 'f' + : op.id, fid = 'iframe#' + id; + + op.finish = function () { + pw.$(fid).unbind(); + setTimeout(function () { + pw.$('div#div' + id).remove(); + start(); + }, 20); + }; + + if (pw.$(fid).length == 0) { + /* 添加frame,部分情况下,iframe没有边框,为了可以看到效果,添加一个带边框的div */ + pw.$(pw.document.body).append('
    '); + pw.$('div#div' + id).append(''); + } + op.onafterstart && op.onafterstart($('iframe#f')[0]); + pw.$('script').each(function () { + if (this.src && this.src.indexOf('import.php') >= 0) { + url = this.src.split('import.php')[1]; + } + }); + pw.$(fid).one('load', + function (e) { + var w = e.target.contentWindow; + var h = setInterval(function () { + if (w.baidu) {// 等待加载完成,IE6下这地方总出问题 + clearInterval(h); + op.ontest(w, w.frameElement); + } + }, 20); + // 找到当前操作的iframe,然后call ontest + }).attr('src', cpath + 'frame.php' + url); + }, + + /** + * + * 判断2个数组是否相等 + * + * @static + */ + isEqualArray:function (array1, array2) { + if ('[object Array]' != Object.prototype.toString.call(array1) + || '[object Array]' != Object.prototype.toString.call(array2)) + return (array1 === array2); + else if (array1.length != array2.length) + return false; + else { + for (var i in array1) { + if (array1[i] != array2[i]) + return false; + } + return true; + } + }, + + /*************************************************************************** + * + * 通用数据模块 + * + * @static + * + **************************************************************************/ + commonData:{// 针对测试文件的路径而不是UserAction的路径 + "testdir":'../../', + datadir:(function () { + return location.href.split("/_test/")[0] + "/_test/tools/data/"; + })(), + currentPath:function () { + var params = location.search.substring(1).split('&'); + for (var i = 0; i < params.length; i++) { + var p = params[i]; + if (p.split('=')[0] == 'case') { + var casepath = p.split('=')[1].split('.').join('/'); + return location.href.split('/_test/')[0] + '/_test/' + + casepath.substring(0, casepath.lastIndexOf('/')) + + '/'; + } + } + return ""; + } + }, + + importsrc:function (src, callback, matcher, exclude, win) { + win = win || window; + var doc = win.document; + + var srcpath = location.href.split("/_test/")[0] + + "/_test/tools/br/import.php"; + var param0 = src; + var ps = { + f:src + }; + if (exclude) + ps.e = exclude; + var param1 = exclude || ""; + /** + * IE下重复载入会出现无法执行情况 + */ + if (win.execScript) { + $.get(srcpath, ps, function (data) { + win.execScript(data); + }); + } else { + var head = doc.getElementsByTagName('head')[0]; + var sc = doc.createElement('script'); + sc.type = 'text/javascript'; + sc.src = srcpath + "?f=" + param0 + "&e=" + param1; + head.appendChild(sc); + } + + matcher = matcher || src; + var mm = matcher.split(",")[0].split("."); + var h = setInterval(function () { + var p = win; + for (var i = 0; i < mm.length; i++) { + if (typeof (p[mm[i]]) == 'undefined') { + // console.log(mm[i]); + return; + } + p = p[mm[i]]; + } + clearInterval(h); + if (callback && 'function' == typeof callback) + callback(); + }, 20); + }, + + /* 用于加载css文件,如果没有加载完毕则不执行回调函数 */ + loadcss:function (url, callback, classname, style, value) { + var links = document.getElementsByTagName('link'); + for (var link in links) { + if (link.href == url) { + callback(); + return; + } + } + var head = document.getElementsByTagName('head')[0]; + var link = head.appendChild(document.createElement('link')); + link.setAttribute("rel", "stylesheet"); + link.setAttribute("type", "text/css"); + link.setAttribute("href", url); + var div = document.body.appendChild(document.createElement("div")); + $(document).ready( + function () { + div.className = classname || 'cssloaded'; + var h = setInterval(function () { + if ($(div).css(style || 'width') == value + || $(div).css(style || 'width') == '20px') { + clearInterval(h); + document.body.removeChild(div); + setTimeout(callback, 20); + } + }, 20); + }); + }, + + /** + * options supported + */ + delayhelper:function (oncheck, onsuccess, onfail, timeout) { + onsuccess = onsuccess || oncheck.onsuccess; + onfail = onfail || oncheck.onfail || function () { + window.QUnit.fail('timeout wait for timeout : ' + timeout + 'ms'); + start(); + }; + timeout = timeout || oncheck.timeout || 10000; + + oncheck = (typeof oncheck == 'function') ? oncheck : oncheck.oncheck; + var h1 = setInterval(function () { + if (!oncheck()) + return; + else { + clearInterval(h1); + clearTimeout(h2); + typeof onsuccess == "function" && onsuccess(); + } + }, 20); + var h2 = setTimeout(function () { + clearInterval(h1); + clearTimeout(h2); + onfail(); + }, timeout); + }, + + browser:(function () { + var win = window; + var numberify = function (s) { + var c = 0; + return parseFloat(s.replace(/\./g, function () { + return (c++ == 1) ? '' : '.'; + })); + }, + + nav = win && win.navigator, + + o = { + + /** + * Internet Explorer version number or 0. Example: 6 + * + * @property ie + * @type float + * @static + */ + ie:0, + + /** + * Opera version number or 0. Example: 9.2 + * + * @property opera + * @type float + * @static + */ + opera:0, + + /** + * Gecko engine revision number. Will evaluate to 1 if Gecko is + * detected but the revision could not be found. Other browsers will + * be 0. Example: 1.8 + * + *
    +                 * Firefox 1.0.0.4: 1.7.8   <-- Reports 1.7
    +                 * Firefox 1.5.0.9: 1.8.0.9 <-- 1.8
    +                 * Firefox 2.0.0.3: 1.8.1.3 <-- 1.81
    +                 * Firefox 3.0   <-- 1.9
    +                 * Firefox 3.5   <-- 1.91
    +                 * 
    + * + * @property gecko + * @type float + * @static + */ + gecko:0, + + /** + * AppleWebKit version. KHTML browsers that are not WebKit browsers + * will evaluate to 1, other browsers 0. Example: 418.9 + * + *
    +                 * Safari 1.3.2 (312.6): 312.8.1 <-- Reports 312.8 -- currently the
    +                 *                                   latest available for Mac OSX 10.3.
    +                 * Safari 2.0.2:         416     <-- hasOwnProperty introduced
    +                 * Safari 2.0.4:         418     <-- preventDefault fixed
    +                 * Safari 2.0.4 (419.3): 418.9.1 <-- One version of Safari may run
    +                 *                                   different versions of webkit
    +                 * Safari 2.0.4 (419.3): 419     <-- Tiger installations that have been
    +                 *                                   updated, but not updated
    +                 *                                   to the latest patch.
    +                 * Webkit 212 nightly:   522+    <-- Safari 3.0 precursor (with native SVG
    +                 *                                   and many major issues fixed).
    +                 * Safari 3.0.4 (523.12) 523.12  <-- First Tiger release - automatic update
    +                 *                                   from 2.x via the 10.4.11 OS patch
    +                 * Webkit nightly 1/2008:525+    <-- Supports DOMContentLoaded event.
    +                 *                                   yahoo.com user agent hack removed.
    +                 * 
    + * + * http://en.wikipedia.org/wiki/Safari_version_history + * + * @property webkit + * @type float + * @static + */ + webkit:0, + + /** + * Chrome will be detected as webkit, but this property will also be + * populated with the Chrome version number + * + * @property chrome + * @type float + * @static + */ + chrome:0, + + safari:0, + + firefox:0, + + maxthon:0, + maxthonIE:0, + + /** + * The mobile property will be set to a string containing any + * relevant user agent information when a modern mobile browser is + * detected. Currently limited to Safari on the iPhone/iPod Touch, + * Nokia N-series devices with the WebKit-based browser, and Opera + * Mini. + * + * @property mobile + * @type string + * @static + */ + mobile:null, + + /** + * Adobe AIR version number or 0. Only populated if webkit is + * detected. Example: 1.0 + * + * @property air + * @type float + */ + air:0, + + /** + * Google Caja version number or 0. + * + * @property caja + * @type float + */ + caja:nav && nav.cajaVersion, + + /** + * Set to true if the pagebreak appears to be in SSL + * + * @property secure + * @type boolean + * @static + */ + secure:false, + + /** + * The operating system. Currently only detecting windows or + * macintosh + * + * @property os + * @type string + * @static + */ + os:null + + }, + + ua = nav && nav.userAgent, + + loc = win && win.location, + + href = loc && loc.href, + + m; + + o.secure = href && (href.toLowerCase().indexOf("https") === 0); + + if (ua) { + + if ((/windows|win32/i).test(ua)) { + o.os = 'windows'; + } else if ((/macintosh/i).test(ua)) { + o.os = 'macintosh'; + } else if ((/rhino/i).test(ua)) { + o.os = 'rhino'; + } + + // Modern KHTML browsers should qualify as Safari X-Grade + if ((/KHTML/).test(ua)) { + o.webkit = 1; + } + if (window.external && /(\d+\.\d)/.test(external.max_version)) { + + o.maxthon = parseFloat(RegExp['\x241']); + if (/MSIE/.test(ua)) { + o.maxthonIE = 1; + o.maxthon = 0; + } + + } + // Modern WebKit browsers are at least X-Grade + m = ua.match(/AppleWebKit\/([^\s]*)/); + if (m && m[1]) { + o.webkit = numberify(m[1]); + + // Mobile browser check + if (/ Mobile\//.test(ua)) { + o.mobile = "Apple"; // iPhone or iPod Touch + } else { + m = ua.match(/NokiaN[^\/]*|Android \d\.\d|webOS\/\d\.\d/); + if (m) { + o.mobile = m[0]; // Nokia N-series, Android, webOS, + // ex: + // NokiaN95 + } + } + + var m1 = ua.match(/Safari\/([^\s]*)/); + if (m1 && m1[1]) // Safari + o.safari = numberify(m1[1]); + m = ua.match(/Chrome\/([^\s]*)/); + if (o.safari && m && m[1]) { + o.chrome = numberify(m[1]); // Chrome + } else { + m = ua.match(/AdobeAIR\/([^\s]*)/); + if (m) { + o.air = m[0]; // Adobe AIR 1.0 or better + } + } + } + + if (!o.webkit) { // not webkit + // @todo check Opera/8.01 (J2ME/MIDP; Opera Mini/2.0.4509/1316; + // fi; U; + // try get firefox and it's ver + // ssr) + m = ua.match(/Opera[\s\/]([^\s]*)/); + if (m && m[1]) { + m = ua.match(/Version[\s\/]([^\s]*)/); + o.opera = numberify(m[1]); + m = ua.match(/Opera Mini[^;]*/); + if (m) { + o.mobile = m[0]; // ex: Opera Mini/2.0.4509/1316 + } + } else { // not opera or webkit + m = ua.match(/MSIE\s([^;]*)/); + if (m && m[1]) { + o.ie = numberify(m[1]); + }else if (ua.match(/Gecko([^\s]*)/)&&ua.match(/rv:11/)){//todo + o.ie = 11; + } else { // not opera, webkit, or ie + m = ua.match(/Gecko\/([^\s]*)/); + if (m) { + o.gecko = 1; // Gecko detected, look for revision + m = ua.match(/rv:([^\s\)]*)/); + if (m && m[1]) { + o.gecko = numberify(m[1]); + } + } + } + } + } + } + + return o; + }) + (), + + /** + * 提供队列方式执行用例的方案,接口包括start、add、next,方法全部执行完毕时会启动用例继续执行 + */ + functionListHelper:function () { + var check = { + list:[], + start:function () { + var self = this; + $(this).bind('next', function () { + setTimeout(function () {// 避免太深的堆栈 + if (self.list.length == 0) + start(); + else + self.list.shift()(); + }, 0); + }); + self.next(); + }, + add:function (func) { + this.list.push(func); + }, + next:function (delay) { + var self = this; + if (delay) { + setTimeout(function () { + $(self).trigger('next'); + }, delay); + } else + $(this).trigger('next'); + } + }; + return check; + }, + getHTML:function (co) { + var div = document.createElement('div'), h; + if (!co) + return 'null'; + div.appendChild(co.cloneNode(true)); + h = div.innerHTML.toLowerCase(); + + h = h.replace(/[\r\n\t\u200b\ufeff]/g, ''); // Remove line feeds and tabs + h = h.replace(/ (\w+)=([^\"][^\s>]*)/gi, ' $1="$2"'); // Restore + // attribs on IE + return h; + }, + getChildHTML:function (co) { + + var h = co.innerHTML.toLowerCase(); + + h = h.replace(/[\r\n\t\u200b\ufeff]/g, ''); // Remove line feeds and tabs + h = h.replace(/ (\w+)=([^\"][^\s>]*)/gi, ' $1="$2"'); // Restore attribs on IE + + return h.replace(/\u200B/g, ''); + }, + getIndex:function (node) { + var childNodes = node.parentNode.childNodes, i = 0; + while (childNodes[i] !== node) + i++; + return i; + }, + checkResult:function (range, sc, ec, so, eo, collapsed, descript) { + descript = descript ? descript : ''; + equal(range.collapsed, collapsed, "check collapsed --" + descript); + ok(range.startContainer === sc, "check startContainer--" + descript); + ok(range.endContainer === ec, "check endContainer--" + descript); + equal(range.startOffset, so, "check startOffset--" + descript); + equal(range.endOffset, eo, "check endOffset--" + descript); + }, + isSameRange:function (rangeA, rangeB, descript) { + descript = descript ? descript : ''; + equal(rangeA.collapsed, rangeB.collapsed, "check collapsed --" + descript); + ok(rangeA.document === rangeB.document, "check document--" + descript); + ok(rangeA.startContainer === rangeB.startContainer, "check startContainer--" + descript); + ok(rangeA.endContainer === rangeB.endContainer, "check endContainer--" + descript); + equal(rangeA.startOffset, rangeB.startOffset, "check startOffset--" + descript); + equal(rangeA.endOffset, rangeB.endOffset, "check endOffset--" + descript); + }, + manualDeleteFillData:function (node) { + var childs = node.childNodes; + for (var i = 0; i < childs.length; i++) { + var fillData = childs[i]; + if ((fillData.nodeType == 3) && ( fillData.data == domUtils.fillChar )) { + domUtils.remove(fillData); + fillData = null; + + } + else + this.manualDeleteFillData(fillData); + } + + + }, + cssStyleToDomStyle:function (cssName) { + var test = document.createElement('div').style, + cssFloat = test.cssFloat != undefined ? 'cssFloat' + : test.styleFloat != undefined ? 'styleFloat' + : 'float', + cache = { 'float':cssFloat }; + + function replacer(match) { + return match.charAt(1).toUpperCase(); + } + +// return function( cssName ) { + return cache[cssName] || (cache[cssName] = cssName.replace(/-./g, replacer) ); +// }; + }, + isSameStyle:function (elementA, elementB) { +// var styleA = elementA.style.cssText, +// styleB = elementB.style.cssText; +// if ( this.browser.ie && this.browser.version == 6 ) { +// styleA = styleA.toLowerCase(); +// styleB = styleB.toLowerCase(); +// } +// if ( !styleA && !styleB ) { +// return true; +// } else if ( !styleA || !styleB ) { +// return false; +// } +// var styleNameMap = {}, +// record = [], +// exit = {}; +// styleA.replace( /[\w-]+\s*(?=:)/g, function ( name ) { +// styleNameMap[name] = record.push( name ); +// } ); +// try { +// styleB.replace( /[\w-]+\s*(?=:)/g, function ( name ) { +// var index = styleNameMap[name]; +// if ( index ) { +//// name = this.cssStyleToDomStyle( name ); +// if ( elementA.style[name] !== elementB.style[name] ) { +// throw exit; +// } +// record[index - 1] = ''; +// } else { +// throw exit; +// } +// } ); +// } catch ( ex ) { +// if ( ex === exit ) { +// return false; +// } +// } +// return !record.join( '' ); + function indexOf(array, item, at) { + for (var i = at || 0, l = array.length; i < l; i++) { + if (array[i] === item) { + return i; + } + } + return -1; + } + + var styleA = elementA.style.cssText.replace(/( ?; ?)/g, ';').replace(/( ?: ?)/g, ':'), + styleB = elementB.style.cssText.replace(/( ?; ?)/g, ';').replace(/( ?: ?)/g, ':'); + if (browser.opera) { + styleA = elementA.style; + styleB = elementB.style; + if (styleA.length != styleB.length) + return 0; + for (var p in styleA) { + if (/^(\d+|csstext)$/i.test(p)) + continue; + if (styleA[p] != styleB[p]) + return 0; + } + return 1; + } + + + if (!styleA || !styleB) { + return styleA == styleB ? 1 : 0; + } + styleA = styleA.split(';'); + styleB = styleB.split(';'); + + if (styleA.length != styleB.length) + return 0; + for (var j = 0; j < styleB.length; j++) { + if (styleB[j].toLowerCase().indexOf("color") > -1 && styleB[j].toLowerCase().indexOf("rgb") > -1) { + var color = this.formatColor(styleB[j].substr(styleB[j].indexOf("rgb"), styleB[j].length)); + styleB[j] = styleB[j].replace(styleB[j].substr(styleB[j].indexOf("rgb"), styleB[j].length), color); + } + } + for (var i = 0, ci; ci = styleA[i++];) { + if (ci.toLowerCase().indexOf("color") > -1 && ci.toLowerCase().indexOf("rgb") > -1) { + var color = this.formatColor(ci.substr(ci.indexOf("rgb"), ci.length)); + ci = ci.replace(ci.substr(ci.indexOf("rgb"), ci.length), color); + } + if (indexOf(styleB, ci) == -1) { + + return 0; + + }//styleA[0].substr(styleA[0].indexOf("rga"),styleA[0].length) + } + return 1; + }, + + + formatColor:function (color) { + var reg1 = /^\#[\da-f]{6}$/i, + reg2 = /^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/, + keyword = { + black:'#000000', + silver:'#c0c0c0', + gray:'#808080', + white:'#ffffff', + maroon:'#800000', + red:'#ff0000', + purple:'#800080', + fuchsia:'#ff00ff', + green:'#008000', + lime:'#00ff00', + olive:'#808000', + yellow:'#ffff0', + navy:'#000080', + blue:'#0000ff', + teal:'#008080', + aqua:'#00ffff' + }; + if (reg1.test(color)) { + // #RRGGBB 直接返回 + return color; + } else if (reg2.test(color)) { + // 非IE中的 rgb(0, 0, 0) + for (var s, i = 1, color = "#"; i < 4; i++) { + s = parseInt(RegExp["\x24" + i]).toString(16); + color += ("00" + s).substr(s.length); + } + return color; + } else if (/^\#[\da-f]{3}$/.test(color)) { + // 简写的颜色值: #F00 + var s1 = color.charAt(1), + s2 = color.charAt(2), + s3 = color.charAt(3); + return "#" + s1 + s1 + s2 + s2 + s3 + s3; + } else if (keyword[color]) + return keyword[color]; + + return ""; + + }, + hasSameAttrs:function (nodeA, nodeB) { + if (nodeA.tagName != nodeB.tagName) + return 0; + var thisAttribs = nodeA.attributes, + otherAttribs = nodeB.attributes; + if (thisAttribs.length != otherAttribs.length) + return 0; + if (thisAttribs.length == 0) + return 1; + var attrA, attrB; + for (var i = 0; attrA = thisAttribs[i++];) { + if (attrA.nodeName == 'style') { + if (this.isSameStyle(nodeA, nodeB)) { + continue + } else { + return 0; + } + } + if (!ua.browser.ie || attrA.specified) { + attrB = nodeB.attributes[attrA.nodeName]; + if (!attrB) { + return 0; + } + } + return 1; + } + return 1; + }, + /** + *清除空Text节点 + */ + + clearWhiteNode:function (node) { + for (var i = 0; i < node.childNodes.length; i++) { + var tmpNode = node.childNodes[i]; + if (tmpNode.nodeType == 3 && !tmpNode.length) { + tmpNode.parentNode.removeChild(tmpNode); + i--; + } + } + }, + /** + *检查两个节点(包含所有子节点)是否具有相同的属性 + */ + flag:true, + checkAllChildAttribs:function (nodeA, nodeB) { + var k = nodeA.childNodes.length; + if (k != nodeB.childNodes.length) { + if (ua.browser.opera) { + this.clearWhiteNode(nodeA); + k = nodeA.childNodes.length; + if (k != nodeB.childNodes.length) + this.flag = false; + } + else + this.flag = false; + } + if (!this.flag) + return this.flag; + while (k) { + var tmpNodeA = nodeA.childNodes[k - 1]; + var tmpNodeB = nodeB.childNodes[k - 1]; + k--; + + if (tmpNodeA.nodeType == 3 || tmpNodeB.nodeType == 3 || tmpNodeA.nodeType == 8 || tmpNodeB.nodeType == 8) + continue; + if (!this.hasSameAttrs(tmpNodeA, tmpNodeB)) { + this.flag = false; + break; + + } + + this.checkAllChildAttribs(tmpNodeA, tmpNodeB); + } + return this.flag; + }, + haveSameAllChildAttribs:function (nodeA, nodeB) { + this.flag = true; + return this.checkAllChildAttribs(nodeA, nodeB); + }, + /*查看传入的html是否与传入的元素ele具有相同的style*/ + checkHTMLSameStyle:function (html, doc, ele, descript) { + var tagEle = doc.createElement(ele.tagName); + tagEle.innerHTML = html; + /*会有一些不可见字符,在比较前提前删掉*/ + this.manualDeleteFillData(ele); + ok(this.haveSameAllChildAttribs(ele, tagEle), descript); +// ok(this.equalsNode(ele.innerHMTL,html),descript); + }, + + + equalsNode:function (na, nb) { + function compare(nodeA, nodeB) { + if (nodeA.nodeType != nodeB.nodeType) { + return 0; + } + if (nodeA.nodeType == 3) { + return nodeA.nodeValue == nodeB.nodeValue + } + if (domUtils.isSameElement(nodeA, nodeB)) { + if (!nodeA.firstChild && !nodeB.firstChild) { + return 1; + } + if (nodeA.firstChild && !nodeB.firstChild || !nodeA.firstChild && nodeB.firstChild) { + return 0 + } + for (var i = 0, ai, bi; ai = nodeA.childNodes[i], bi = nodeB.childNodes[i++];) { + + if (!compare(ai, bi)) { + return 0 + } + } + return 1; + } else { + return 0; + } + } + + return compare(domUtils.createElement(document, 'div', { + 'innerHTML':na + }), domUtils.createElement(document, 'div', { + 'innerHTML':nb + })); + }, + + + getSelectedText:function () { + if (window.getSelection) { + // This technique is the most likely to be standardized. + // getSelection() returns a Selection object, which we do not document. + return window.getSelection().toString(); + } + else if (document.getSelection) { + // This is an older, simpler technique that returns a string + return document.getSelection(); + } + else if (document.selection) { + // This is the IE-specific technique. + // We do not document the IE selection property or TextRange objects. + return document.selection.createRange().text; + } + }, + findPosition:function (oElement) { + var x2 = 0; + var y2 = 0; + var width = oElement.offsetWidth; + var height = oElement.offsetHeight; + if (typeof( oElement.offsetParent ) != 'undefined') { + for (var posX = 0, posY = 0; oElement; oElement = oElement.offsetParent) { + posX += oElement.offsetLeft; + posY += oElement.offsetTop; + } + x2 = posX + width; + y2 = posY + height; + return [ posX, posY , x2, y2]; + + } else { + x2 = oElement.x + width; + y2 = oElement.y + height; + return [ oElement.x, oElement.y, x2, y2]; + } + }, + + checkElementPath:function (arr1, arr2, descript) { + if (!descript) + descript = ''; + var index = arr1.length; + if (index != arr2.length) + ok(false, '路径深度不相同'); + else { + + while (index > 0) + equal(arr1[--index ], arr2[index ], descript + '---第' + index + '个元素' + arr1[index]); + } + }, + getBrowser:function () { + var browser = ""; + if (this.browser.ie == 6) + browser = 'ie6'; + if (this.browser.ie == 7) + browser = 'ie7'; + if (this.browser.ie == 8) + browser = 'ie8'; + if (this.browser.ie == 9) + browser = 'ie9'; + if (this.browser.safari) + browser = 'safari'; + if (this.browser.firefox) + browser = 'firefox'; + if (this.browser.chrome) + browser = 'chrome'; + if (this.browser.maxthon) { + browser = 'maxthon'; + } + if (this.browser.maxthonIE) + browser = 'maxIE'; + if (this.browser.opera) + browser = 'opera'; + return browser; + }, + getFloatStyle:function (ele) { + if (this.browser.ie) + return ele.style['styleFloat']; + else + return ele.style['cssFloat']; + }, + + getComputedStyle:function(ele ){ + if(this.browser.ie&&ua.browser.ie<9){ + return ele.currentStyle; + }else{ + return window.getComputedStyle(ele); + } + }, + readFile:function (name, f) { + var args = {}; + args['name'] = name; + $.ajax({ + url:'read.php', + type:'post', + data:args, + success:function (msg) { + f(msg); + }, + error:function (xhr, msg) { + f(null); + } + }); + }, + readTxt:function (name, f) { + var args = {}; + args['name'] = './txt/' + name; + $.ajax({ + url:'read.php', + type:'post', + data:args, + success:function (msg) { + f(msg); + }, + error:function (xhr, msg) { + f(null); + } + }); + }, checkLowerCase:function (stringA, stringB) { + if (!(stringA || stringB)) + return true; + else if (!stringA || !stringB) + return false; + else { + return stringA.toLowerCase() == stringB.toLowerCase(); + } + }, removeEndSemicolon:function (styleValue) { + if (styleValue.length - 1 == styleValue.lastIndexOf(';')) + styleValue = styleValue.substring(0, styleValue.length - 1); + return styleValue; + }, checkNodeStyle:function (nodeA, nodeB) { + var nodeAStyle = this.removeEndSemicolon(nodeA.getAttr("style").replace(/\s+/g, "")).replace(/"/g,'').split(";"); + var nodeBStyle = this.removeEndSemicolon(nodeB.getAttr("style").replace(/\s+/g, "")).replace(/"/g,'').split(";"); + var lengthA = nodeAStyle.length; + var lengthB = nodeBStyle.length; + if (!(lengthA && lengthB)) + return true; + else if (lengthA != lengthB) + return false; + else { + for (var i = 0; i < lengthA; i++) { + if (nodeAStyle[i].match(/[-\w]+\s*:/) ) { + var styleName = nodeAStyle[i].match(/[-\w]+\s*:/)[0].replace(/\s*:/, ""); + nodeA.attrs.style = nodeA.attrs.style.replace(/"/g,''); + nodeB.attrs.style = nodeB.attrs.style.replace(/"/g,''); + var styleValueA = nodeA.getStyle(styleName).toLowerCase().replace(/\s+/g, ""); + var styleValueB = nodeB.getStyle(styleName).toLowerCase().replace(/\s+/g, ""); + if(/color/.test(styleName)){ + styleValueA = this.formatColor(styleValueA); + styleValueB = this.formatColor(styleValueB); + } + else; + if (styleValueA != styleValueB) + return false; + } + } + } + return true; + }, getPropertyCount:function (o) { + var n, count = 0; + for (n in o) { + if (o.hasOwnProperty(n)) { + count++; + } + } + return count; + },formHref:function(str){ + if(str.lastIndexOf('/')== str.length-1){ + str = str.substring(0,str.length-1); + } + return str; + },checkSameNodeAttrs:function (nodeA, nodeB) { + var lengthA = this.getPropertyCount(nodeA.attrs); + var lengthB = this.getPropertyCount(nodeB.attrs); + if (!(lengthA && lengthB)) + return true; + else if (lengthA != lengthB) + return false; + else { + for (var p in nodeA.attrs) { + if(!nodeB.getAttr(p)&&!nodeA.getAttr(p)) + return true; + else if (!nodeB.getAttr(p)||!nodeA.getAttr(p)) + return false; + else if (p.toLowerCase() == "style") { + if (!this.checkNodeStyle(nodeA, nodeB)) + return false; + } + else if(p.toLowerCase() == "href"){ + if (this.formHref(nodeA.getAttr(p).toLowerCase()) != this.formHref(nodeB.getAttr(p).toLowerCase())) + return false; + } + else { + if (nodeA.getAttr(p).toLowerCase().replace(/^\s+|\s+$/g, "") != nodeB.getAttr(p).toLowerCase().replace(/^\s+|\s+$/g, "")) + return false; + } + } + } + return true; + + }, checkChildren:function (nodeA, nodeB) { + if (!(nodeA.children || nodeB.children)) + return true; + else if (!(nodeA.children && nodeB.children)) + return false; + else if (nodeA.children.length != nodeB.children.length) + return false; + else { + var lengthA = nodeA.children.length; + for (var i = 0; i < lengthA; i++) { + if (!this.checkSameNode(nodeA.children[i], nodeB.children[i])) + return false; + } + } + return true; + }, checkSameNode:function (nodeA, nodeB) { + if (!this.checkSameNodeAttrs(nodeA, nodeB)) + return false; + else if (!this.checkChildren(nodeA, nodeB)) + return false; + else if (nodeA.data != nodeB.data) + return false; + else if (!this.checkLowerCase(nodeA.tagName, nodeB.tagName)) + return false; + else if (!this.checkLowerCase(nodeA.type, nodeB.type)) + return false; + else + return true; + }, checkSameHtml:function (stringA, stringB, scholium) { + ok(this.checkSameNode(UE.htmlparser(stringA), UE.htmlparser(stringB)), scholium); + }, + getContextmenuIndexByName:function(contextmenu,name){ + for(var i=0;i)[^>]*$|#([\w\-]+)$)/, + + // Check if a string has a non-whitespace character in it + rnotwhite = /\S/, + + // Used for trimming whitespace + trimLeft = /^\s+/, + trimRight = /\s+$/, + + // Check for digits + rdigit = /\d/, + + // Match a standalone tag + rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, + + // JSON RegExp + rvalidchars = /^[\],:{}\s]*$/, + rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, + rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, + rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, + + // Useragent RegExp + rwebkit = /(webkit)[ \/]([\w.]+)/, + ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, + rmsie = /(msie) ([\w.]+)/, + rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, + + // Keep a UserAgent string for use with jQuery.browser + userAgent = navigator.userAgent, + + // For matching the engine and version of the browser + browserMatch, + + // Has the ready events already been bound? + readyBound = false, + + // The deferred used on DOM ready + readyList, + + // Promise methods + promiseMethods = "then done fail isResolved isRejected promise".split( " " ), + + // The ready event handler + DOMContentLoaded, + + // Save a reference to some core methods + toString = Object.prototype.toString, + hasOwn = Object.prototype.hasOwnProperty, + push = Array.prototype.push, + slice = Array.prototype.slice, + trim = String.prototype.trim, + indexOf = Array.prototype.indexOf, + + // [[Class]] -> type pairs + class2type = {}; + +jQuery.fn = jQuery.prototype = { + constructor: jQuery, + init: function( selector, context, rootjQuery ) { + var match, elem, ret, doc; + + // Handle $(""), $(null), or $(undefined) + if ( !selector ) { + return this; + } + + // Handle $(DOMElement) + if ( selector.nodeType ) { + this.context = this[0] = selector; + this.length = 1; + return this; + } + + // The body element only exists once, optimize finding it + if ( selector === "body" && !context && document.body ) { + this.context = document; + this[0] = document.body; + this.selector = "body"; + this.length = 1; + return this; + } + + // Handle HTML strings + if ( typeof selector === "string" ) { + // Are we dealing with HTML string or an ID? + match = quickExpr.exec( selector ); + + // Verify a match, and that no context was specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) { + context = context instanceof jQuery ? context[0] : context; + doc = (context ? context.ownerDocument || context : document); + + // If a single string is passed in and it's a single tag + // just do a createElement and skip the rest + ret = rsingleTag.exec( selector ); + + if ( ret ) { + if ( jQuery.isPlainObject( context ) ) { + selector = [ document.createElement( ret[1] ) ]; + jQuery.fn.attr.call( selector, context, true ); + + } else { + selector = [ doc.createElement( ret[1] ) ]; + } + + } else { + ret = jQuery.buildFragment( [ match[1] ], [ doc ] ); + selector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes; + } + + return jQuery.merge( this, selector ); + + // HANDLE: $("#id") + } else { + elem = document.getElementById( match[2] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[2] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[0] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return (context || rootjQuery).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return rootjQuery.ready( selector ); + } + + if (selector.selector !== undefined) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }, + + // Start with an empty selector + selector: "", + + // The current version of jQuery being used + jquery: "1.5.1", + + // The default length of a jQuery object is 0 + length: 0, + + // The number of elements contained in the matched element set + size: function() { + return this.length; + }, + + toArray: function() { + return slice.call( this, 0 ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num == null ? + + // Return a 'clean' array + this.toArray() : + + // Return just the object + ( num < 0 ? this[ this.length + num ] : this[ num ] ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems, name, selector ) { + // Build a new jQuery matched element set + var ret = this.constructor(); + + if ( jQuery.isArray( elems ) ) { + push.apply( ret, elems ); + + } else { + jQuery.merge( ret, elems ); + } + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + ret.context = this.context; + + if ( name === "find" ) { + ret.selector = this.selector + (this.selector ? " " : "") + selector; + } else if ( name ) { + ret.selector = this.selector + "." + name + "(" + selector + ")"; + } + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + ready: function( fn ) { + // Attach the listeners + jQuery.bindReady(); + + // Add the callback + readyList.done( fn ); + + return this; + }, + + eq: function( i ) { + return i === -1 ? + this.slice( i ) : + this.slice( i, +i + 1 ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ), + "slice", slice.call(arguments).join(",") ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function( elem, i ) { + return callback.call( elem, i, elem ); + })); + }, + + end: function() { + return this.prevObject || this.constructor(null); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: [].sort, + splice: [].splice +}; + +// Give the init function the jQuery prototype for later instantiation +jQuery.fn.init.prototype = jQuery.fn; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( length === i ) { + target = this; + --i; + } + + for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) { + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray(src) ? src : []; + + } else { + clone = src && jQuery.isPlainObject(src) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend({ + noConflict: function( deep ) { + window.$ = _$; + + if ( deep ) { + window.jQuery = _jQuery; + } + + return jQuery; + }, + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Handle when the DOM is ready + ready: function( wait ) { + // A third-party is pushing the ready event forwards + if ( wait === true ) { + jQuery.readyWait--; + } + + // Make sure that the DOM is not already loaded + if ( !jQuery.readyWait || (wait !== true && !jQuery.isReady) ) { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( !document.body ) { + return setTimeout( jQuery.ready, 1 ); + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.trigger ) { + jQuery( document ).trigger( "ready" ).unbind( "ready" ); + } + } + }, + + bindReady: function() { + if ( readyBound ) { + return; + } + + readyBound = true; + + // Catch cases where $(document).ready() is called after the + // browser event has already occurred. + if ( document.readyState === "complete" ) { + // Handle it asynchronously to allow scripts the opportunity to delay ready + return setTimeout( jQuery.ready, 1 ); + } + + // Mozilla, Opera and webkit nightlies currently support this event + if ( document.addEventListener ) { + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", jQuery.ready, false ); + + // If IE event model is used + } else if ( document.attachEvent ) { + // ensure firing before onload, + // maybe late but safe also for iframes + document.attachEvent("onreadystatechange", DOMContentLoaded); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", jQuery.ready ); + + // If IE and not a frame + // continually check to see if the document is ready + var toplevel = false; + + try { + toplevel = window.frameElement == null; + } catch(e) {} + + if ( document.documentElement.doScroll && toplevel ) { + doScrollCheck(); + } + } + }, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return jQuery.type(obj) === "function"; + }, + + isArray: Array.isArray || function( obj ) { + return jQuery.type(obj) === "array"; + }, + + // A crude way of determining if an object is a window + isWindow: function( obj ) { + return obj && typeof obj === "object" && "setInterval" in obj; + }, + + isNaN: function( obj ) { + return obj == null || !rdigit.test( obj ) || isNaN( obj ); + }, + + type: function( obj ) { + return obj == null ? + String( obj ) : + class2type[ toString.call(obj) ] || "object"; + }, + + isPlainObject: function( obj ) { + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + // Not own constructor property must be Object + if ( obj.constructor && + !hasOwn.call(obj, "constructor") && + !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { + return false; + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + + var key; + for ( key in obj ) {} + + return key === undefined || hasOwn.call( obj, key ); + }, + + isEmptyObject: function( obj ) { + for ( var name in obj ) { + return false; + } + return true; + }, + + error: function( msg ) { + throw msg; + }, + + parseJSON: function( data ) { + if ( typeof data !== "string" || !data ) { + return null; + } + + // Make sure leading/trailing whitespace is removed (IE can't handle it) + data = jQuery.trim( data ); + + // Make sure the incoming data is actual JSON + // Logic borrowed from http://json.org/json2.js + if ( rvalidchars.test(data.replace(rvalidescape, "@") + .replace(rvalidtokens, "]") + .replace(rvalidbraces, "")) ) { + + // Try to use the native JSON parser first + return window.JSON && window.JSON.parse ? + window.JSON.parse( data ) : + (new Function("return " + data))(); + + } else { + jQuery.error( "Invalid JSON: " + data ); + } + }, + + // Cross-browser xml parsing + // (xml & tmp used internally) + parseXML: function( data , xml , tmp ) { + + if ( window.DOMParser ) { // Standard + tmp = new DOMParser(); + xml = tmp.parseFromString( data , "text/xml" ); + } else { // IE + xml = new ActiveXObject( "Microsoft.XMLDOM" ); + xml.async = "false"; + xml.loadXML( data ); + } + + tmp = xml.documentElement; + + if ( ! tmp || ! tmp.nodeName || tmp.nodeName === "parsererror" ) { + jQuery.error( "Invalid XML: " + data ); + } + + return xml; + }, + + noop: function() {}, + + // Evalulates a script in a global context + globalEval: function( data ) { + if ( data && rnotwhite.test(data) ) { + // Inspired by code by Andrea Giammarchi + // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html + var head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement, + script = document.createElement( "script" ); + + if ( jQuery.support.scriptEval() ) { + script.appendChild( document.createTextNode( data ) ); + } else { + script.text = data; + } + + // Use insertBefore instead of appendChild to circumvent an IE6 bug. + // This arises when a base node is used (#2709). + head.insertBefore( script, head.firstChild ); + head.removeChild( script ); + } + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); + }, + + // args is for internal usage only + each: function( object, callback, args ) { + var name, i = 0, + length = object.length, + isObj = length === undefined || jQuery.isFunction(object); + + if ( args ) { + if ( isObj ) { + for ( name in object ) { + if ( callback.apply( object[ name ], args ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.apply( object[ i++ ], args ) === false ) { + break; + } + } + } + + // A special, fast, case for the most common use of each + } else { + if ( isObj ) { + for ( name in object ) { + if ( callback.call( object[ name ], name, object[ name ] ) === false ) { + break; + } + } + } else { + for ( var value = object[0]; + i < length && callback.call( value, i, value ) !== false; value = object[++i] ) {} + } + } + + return object; + }, + + // Use native String.trim function wherever possible + trim: trim ? + function( text ) { + return text == null ? + "" : + trim.call( text ); + } : + + // Otherwise use our own trimming functionality + function( text ) { + return text == null ? + "" : + text.toString().replace( trimLeft, "" ).replace( trimRight, "" ); + }, + + // results is for internal usage only + makeArray: function( array, results ) { + var ret = results || []; + + if ( array != null ) { + // The window, strings (and functions) also have 'length' + // The extra typeof function check is to prevent crashes + // in Safari 2 (See: #3039) + // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 + var type = jQuery.type(array); + + if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) { + push.call( ret, array ); + } else { + jQuery.merge( ret, array ); + } + } + + return ret; + }, + + inArray: function( elem, array ) { + if ( array.indexOf ) { + return array.indexOf( elem ); + } + + for ( var i = 0, length = array.length; i < length; i++ ) { + if ( array[ i ] === elem ) { + return i; + } + } + + return -1; + }, + + merge: function( first, second ) { + var i = first.length, + j = 0; + + if ( typeof second.length === "number" ) { + for ( var l = second.length; j < l; j++ ) { + first[ i++ ] = second[ j ]; + } + + } else { + while ( second[j] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, inv ) { + var ret = [], retVal; + inv = !!inv; + + // Go through the array, only saving the items + // that pass the validator function + for ( var i = 0, length = elems.length; i < length; i++ ) { + retVal = !!callback( elems[ i ], i ); + if ( inv !== retVal ) { + ret.push( elems[ i ] ); + } + } + + return ret; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var ret = [], value; + + // Go through the array, translating each of the items to their + // new value (or values). + for ( var i = 0, length = elems.length; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + + // Flatten any nested arrays + return ret.concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + proxy: function( fn, proxy, thisObject ) { + if ( arguments.length === 2 ) { + if ( typeof proxy === "string" ) { + thisObject = fn; + fn = thisObject[ proxy ]; + proxy = undefined; + + } else if ( proxy && !jQuery.isFunction( proxy ) ) { + thisObject = proxy; + proxy = undefined; + } + } + + if ( !proxy && fn ) { + proxy = function() { + return fn.apply( thisObject || this, arguments ); + }; + } + + // Set the guid of unique handler to the same of original handler, so it can be removed + if ( fn ) { + proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; + } + + // So proxy can be declared as an argument + return proxy; + }, + + // Mutifunctional method to get and set values to a collection + // The value/s can be optionally by executed if its a function + access: function( elems, key, value, exec, fn, pass ) { + var length = elems.length; + + // Setting many attributes + if ( typeof key === "object" ) { + for ( var k in key ) { + jQuery.access( elems, k, key[k], exec, fn, value ); + } + return elems; + } + + // Setting one attribute + if ( value !== undefined ) { + // Optionally, function values get executed if exec is true + exec = !pass && exec && jQuery.isFunction(value); + + for ( var i = 0; i < length; i++ ) { + fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); + } + + return elems; + } + + // Getting an attribute + return length ? fn( elems[0], key ) : undefined; + }, + + now: function() { + return (new Date()).getTime(); + }, + + // Create a simple deferred (one callbacks list) + _Deferred: function() { + var // callbacks list + callbacks = [], + // stored [ context , args ] + fired, + // to avoid firing when already doing so + firing, + // flag to know if the deferred has been cancelled + cancelled, + // the deferred itself + deferred = { + + // done( f1, f2, ...) + done: function() { + if ( !cancelled ) { + var args = arguments, + i, + length, + elem, + type, + _fired; + if ( fired ) { + _fired = fired; + fired = 0; + } + for ( i = 0, length = args.length; i < length; i++ ) { + elem = args[ i ]; + type = jQuery.type( elem ); + if ( type === "array" ) { + deferred.done.apply( deferred, elem ); + } else if ( type === "function" ) { + callbacks.push( elem ); + } + } + if ( _fired ) { + deferred.resolveWith( _fired[ 0 ], _fired[ 1 ] ); + } + } + return this; + }, + + // resolve with given context and args + resolveWith: function( context, args ) { + if ( !cancelled && !fired && !firing ) { + firing = 1; + try { + while( callbacks[ 0 ] ) { + callbacks.shift().apply( context, args ); + } + } + // We have to add a catch block for + // IE prior to 8 or else the finally + // block will never get executed + catch (e) { + throw e; + } + finally { + fired = [ context, args ]; + firing = 0; + } + } + return this; + }, + + // resolve with this as context and given arguments + resolve: function() { + deferred.resolveWith( jQuery.isFunction( this.promise ) ? this.promise() : this, arguments ); + return this; + }, + + // Has this deferred been resolved? + isResolved: function() { + return !!( firing || fired ); + }, + + // Cancel + cancel: function() { + cancelled = 1; + callbacks = []; + return this; + } + }; + + return deferred; + }, + + // Full fledged deferred (two callbacks list) + Deferred: function( func ) { + var deferred = jQuery._Deferred(), + failDeferred = jQuery._Deferred(), + promise; + // Add errorDeferred methods, then and promise + jQuery.extend( deferred, { + then: function( doneCallbacks, failCallbacks ) { + deferred.done( doneCallbacks ).fail( failCallbacks ); + return this; + }, + fail: failDeferred.done, + rejectWith: failDeferred.resolveWith, + reject: failDeferred.resolve, + isRejected: failDeferred.isResolved, + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + if ( obj == null ) { + if ( promise ) { + return promise; + } + promise = obj = {}; + } + var i = promiseMethods.length; + while( i-- ) { + obj[ promiseMethods[i] ] = deferred[ promiseMethods[i] ]; + } + return obj; + } + } ); + // Make sure only one callback list will be used + deferred.done( failDeferred.cancel ).fail( deferred.cancel ); + // Unexpose cancel + delete deferred.cancel; + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + return deferred; + }, + + // Deferred helper + when: function( object ) { + var lastIndex = arguments.length, + deferred = lastIndex <= 1 && object && jQuery.isFunction( object.promise ) ? + object : + jQuery.Deferred(), + promise = deferred.promise(); + + if ( lastIndex > 1 ) { + var array = slice.call( arguments, 0 ), + count = lastIndex, + iCallback = function( index ) { + return function( value ) { + array[ index ] = arguments.length > 1 ? slice.call( arguments, 0 ) : value; + if ( !( --count ) ) { + deferred.resolveWith( promise, array ); + } + }; + }; + while( ( lastIndex-- ) ) { + object = array[ lastIndex ]; + if ( object && jQuery.isFunction( object.promise ) ) { + object.promise().then( iCallback(lastIndex), deferred.reject ); + } else { + --count; + } + } + if ( !count ) { + deferred.resolveWith( promise, array ); + } + } else if ( deferred !== object ) { + deferred.resolve( object ); + } + return promise; + }, + + // Use of jQuery.browser is frowned upon. + // More details: http://docs.jquery.com/Utilities/jQuery.browser + uaMatch: function( ua ) { + ua = ua.toLowerCase(); + + var match = rwebkit.exec( ua ) || + ropera.exec( ua ) || + rmsie.exec( ua ) || + ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || + []; + + return { browser: match[1] || "", version: match[2] || "0" }; + }, + + sub: function() { + function jQuerySubclass( selector, context ) { + return new jQuerySubclass.fn.init( selector, context ); + } + jQuery.extend( true, jQuerySubclass, this ); + jQuerySubclass.superclass = this; + jQuerySubclass.fn = jQuerySubclass.prototype = this(); + jQuerySubclass.fn.constructor = jQuerySubclass; + jQuerySubclass.subclass = this.subclass; + jQuerySubclass.fn.init = function init( selector, context ) { + if ( context && context instanceof jQuery && !(context instanceof jQuerySubclass) ) { + context = jQuerySubclass(context); + } + + return jQuery.fn.init.call( this, selector, context, rootjQuerySubclass ); + }; + jQuerySubclass.fn.init.prototype = jQuerySubclass.fn; + var rootjQuerySubclass = jQuerySubclass(document); + return jQuerySubclass; + }, + + browser: {} +}); + +// Create readyList deferred +readyList = jQuery._Deferred(); + +// Populate the class2type map +jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +}); + +browserMatch = jQuery.uaMatch( userAgent ); +if ( browserMatch.browser ) { + jQuery.browser[ browserMatch.browser ] = true; + jQuery.browser.version = browserMatch.version; +} + +// Deprecated, use jQuery.browser.webkit instead +if ( jQuery.browser.webkit ) { + jQuery.browser.safari = true; +} + +if ( indexOf ) { + jQuery.inArray = function( elem, array ) { + return indexOf.call( array, elem ); + }; +} + +// IE doesn't match non-breaking spaces with \s +if ( rnotwhite.test( "\xA0" ) ) { + trimLeft = /^[\s\xA0]+/; + trimRight = /[\s\xA0]+$/; +} + +// All jQuery objects should point back to these +rootjQuery = jQuery(document); + +// Cleanup functions for the document ready method +if ( document.addEventListener ) { + DOMContentLoaded = function() { + document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + jQuery.ready(); + }; + +} else if ( document.attachEvent ) { + DOMContentLoaded = function() { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( document.readyState === "complete" ) { + document.detachEvent( "onreadystatechange", DOMContentLoaded ); + jQuery.ready(); + } + }; +} + +// The DOM ready check for Internet Explorer +function doScrollCheck() { + if ( jQuery.isReady ) { + return; + } + + try { + // If IE is used, use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + document.documentElement.doScroll("left"); + } catch(e) { + setTimeout( doScrollCheck, 1 ); + return; + } + + // and execute any waiting functions + jQuery.ready(); +} + +// Expose jQuery to the global object +return jQuery; + +})(); + + +(function() { + + jQuery.support = {}; + + var div = document.createElement("div"); + + div.style.display = "none"; + div.innerHTML = "
    a"; + + var all = div.getElementsByTagName("*"), + a = div.getElementsByTagName("a")[0], + select = document.createElement("select"), + opt = select.appendChild( document.createElement("option") ), + input = div.getElementsByTagName("input")[0]; + + // Can't get basic test support + if ( !all || !all.length || !a ) { + return; + } + + jQuery.support = { + // IE strips leading whitespace when .innerHTML is used + leadingWhitespace: div.firstChild.nodeType === 3, + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + tbody: !div.getElementsByTagName("tbody").length, + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + htmlSerialize: !!div.getElementsByTagName("link").length, + + // Get the style information from getAttribute + // (IE uses .cssText insted) + style: /red/.test( a.getAttribute("style") ), + + // Make sure that URLs aren't manipulated + // (IE normalizes it by default) + hrefNormalized: a.getAttribute("href") === "/a", + + // Make sure that element opacity exists + // (IE uses filter instead) + // Use a regex to work around a WebKit issue. See #5145 + opacity: /^0.55$/.test( a.style.opacity ), + + // Verify style float existence + // (IE uses styleFloat instead of cssFloat) + cssFloat: !!a.style.cssFloat, + + // Make sure that if no value is specified for a checkbox + // that it defaults to "on". + // (WebKit defaults to "" instead) + checkOn: input.value === "on", + + // Make sure that a selected-by-default option has a working selected property. + // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) + optSelected: opt.selected, + + // Will be defined later + deleteExpando: true, + optDisabled: false, + checkClone: false, + noCloneEvent: true, + noCloneChecked: true, + boxModel: null, + inlineBlockNeedsLayout: false, + shrinkWrapBlocks: false, + reliableHiddenOffsets: true + }; + + input.checked = true; + jQuery.support.noCloneChecked = input.cloneNode( true ).checked; + + // Make sure that the options inside disabled selects aren't marked as disabled + // (WebKit marks them as diabled) + select.disabled = true; + jQuery.support.optDisabled = !opt.disabled; + + var _scriptEval = null; + jQuery.support.scriptEval = function() { + if ( _scriptEval === null ) { + var root = document.documentElement, + script = document.createElement("script"), + id = "script" + jQuery.now(); + + try { + script.appendChild( document.createTextNode( "window." + id + "=1;" ) ); + } catch(e) {} + + root.insertBefore( script, root.firstChild ); + + // Make sure that the execution of code works by injecting a script + // tag with appendChild/createTextNode + // (IE doesn't support this, fails, and uses .text instead) + if ( window[ id ] ) { + _scriptEval = true; + delete window[ id ]; + } else { + _scriptEval = false; + } + + root.removeChild( script ); + // release memory in IE + root = script = id = null; + } + + return _scriptEval; + }; + + // Test to see if it's possible to delete an expando from an element + // Fails in Internet Explorer + try { + delete div.test; + + } catch(e) { + jQuery.support.deleteExpando = false; + } + + if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { + div.attachEvent("onclick", function click() { + // Cloning a node shouldn't copy over any + // bound event handlers (IE does this) + jQuery.support.noCloneEvent = false; + div.detachEvent("onclick", click); + }); + div.cloneNode(true).fireEvent("onclick"); + } + + div = document.createElement("div"); + div.innerHTML = ""; + + var fragment = document.createDocumentFragment(); + fragment.appendChild( div.firstChild ); + + // WebKit doesn't clone checked state correctly in fragments + jQuery.support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked; + + // Figure out if the W3C box model works as expected + // document.body must exist before we can do this + jQuery(function() { + var div = document.createElement("div"), + body = document.getElementsByTagName("body")[0]; + + // Frameset documents with no body should not run this code + if ( !body ) { + return; + } + + div.style.width = div.style.paddingLeft = "1px"; + body.appendChild( div ); + jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2; + + if ( "zoom" in div.style ) { + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + // (IE < 8 does this) + div.style.display = "inline"; + div.style.zoom = 1; + jQuery.support.inlineBlockNeedsLayout = div.offsetWidth === 2; + + // Check if elements with layout shrink-wrap their children + // (IE 6 does this) + div.style.display = ""; + div.innerHTML = "
    "; + jQuery.support.shrinkWrapBlocks = div.offsetWidth !== 2; + } + + div.innerHTML = "
    t
    "; + var tds = div.getElementsByTagName("td"); + + // Check if table cells still have offsetWidth/Height when they are set + // to display:none and there are still other visible table cells in a + // table row; if so, offsetWidth/Height are not reliable for use when + // determining if an element has been hidden directly using + // display:none (it is still safe to use offsets if a parent element is + // hidden; don safety goggles and see bug #4512 for more information). + // (only IE 8 fails this test) + jQuery.support.reliableHiddenOffsets = tds[0].offsetHeight === 0; + + tds[0].style.display = ""; + tds[1].style.display = "none"; + + // Check if empty table cells still have offsetWidth/Height + // (IE < 8 fail this test) + jQuery.support.reliableHiddenOffsets = jQuery.support.reliableHiddenOffsets && tds[0].offsetHeight === 0; + div.innerHTML = ""; + + body.removeChild( div ).style.display = "none"; + div = tds = null; + }); + + // Technique from Juriy Zaytsev + // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/ + var eventSupported = function( eventName ) { + var el = document.createElement("div"); + eventName = "on" + eventName; + + // We only care about the case where non-standard event systems + // are used, namely in IE. Short-circuiting here helps us to + // avoid an eval call (in setAttribute) which can cause CSP + // to go haywire. See: https://developer.mozilla.org/en/Security/CSP + if ( !el.attachEvent ) { + return true; + } + + var isSupported = (eventName in el); + if ( !isSupported ) { + el.setAttribute(eventName, "return;"); + isSupported = typeof el[eventName] === "function"; + } + el = null; + + return isSupported; + }; + + jQuery.support.submitBubbles = eventSupported("submit"); + jQuery.support.changeBubbles = eventSupported("change"); + + // release memory in IE + div = all = a = null; +})(); + + + +var rbrace = /^(?:\{.*\}|\[.*\])$/; + +jQuery.extend({ + cache: {}, + + // Please use with caution + uuid: 0, + + // Unique for each copy of jQuery on the pagebreak + // Non-digits removed to match rinlinejQuery + expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), + + // The following elements throw uncatchable exceptions if you + // attempt to add expando properties to them. + noData: { + "embed": true, + // Ban all objects except for Flash (which handle expandos) + "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", + "applet": true + }, + + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; + + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var internalKey = jQuery.expando, getByName = typeof name === "string", thisCache, + + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, + + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, + + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando; + + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ( (!id || (pvt && id && !cache[ id ][ internalKey ])) && getByName && data === undefined ) { + return; + } + + if ( !id ) { + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if ( isNode ) { + elem[ jQuery.expando ] = id = ++jQuery.uuid; + } else { + id = jQuery.expando; + } + } + + if ( !cache[ id ] ) { + cache[ id ] = {}; + + // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery + // metadata on plain JS objects when the object is serialized using + // JSON.stringify + if ( !isNode ) { + cache[ id ].toJSON = jQuery.noop; + } + } + + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if ( typeof name === "object" || typeof name === "function" ) { + if ( pvt ) { + cache[ id ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name); + } else { + cache[ id ] = jQuery.extend(cache[ id ], name); + } + } + + thisCache = cache[ id ]; + + // Internal jQuery data is stored in a separate object inside the object's data + // cache in order to avoid key collisions between internal data and user-defined + // data + if ( pvt ) { + if ( !thisCache[ internalKey ] ) { + thisCache[ internalKey ] = {}; + } + + thisCache = thisCache[ internalKey ]; + } + + if ( data !== undefined ) { + thisCache[ name ] = data; + } + + // TODO: This is a hack for 1.5 ONLY. It will be removed in 1.6. Users should + // not attempt to inspect the internal events object using jQuery.data, as this + // internal data object is undocumented and subject to change. + if ( name === "events" && !thisCache[name] ) { + return thisCache[ internalKey ] && thisCache[ internalKey ].events; + } + + return getByName ? thisCache[ name ] : thisCache; + }, + + removeData: function( elem, name, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var internalKey = jQuery.expando, isNode = elem.nodeType, + + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + + // See jQuery.data for more information + id = isNode ? elem[ jQuery.expando ] : jQuery.expando; + + // If there is already no cache entry for this object, there is no + // purpose in continuing + if ( !cache[ id ] ) { + return; + } + + if ( name ) { + var thisCache = pvt ? cache[ id ][ internalKey ] : cache[ id ]; + + if ( thisCache ) { + delete thisCache[ name ]; + + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( !isEmptyDataObject(thisCache) ) { + return; + } + } + } + + // See jQuery.data for more information + if ( pvt ) { + delete cache[ id ][ internalKey ]; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject(cache[ id ]) ) { + return; + } + } + + var internalCache = cache[ id ][ internalKey ]; + + // Browsers that fail expando deletion also refuse to delete expandos on + // the window, but it will allow it on all other JS objects; other browsers + // don't care + if ( jQuery.support.deleteExpando || cache != window ) { + delete cache[ id ]; + } else { + cache[ id ] = null; + } + + // We destroyed the entire user cache at once because it's faster than + // iterating through each key, but we need to continue to persist internal + // data if it existed + if ( internalCache ) { + cache[ id ] = {}; + // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery + // metadata on plain JS objects when the object is serialized using + // JSON.stringify + if ( !isNode ) { + cache[ id ].toJSON = jQuery.noop; + } + + cache[ id ][ internalKey ] = internalCache; + + // Otherwise, we need to eliminate the expando on the node to avoid + // false lookups in the cache for entries that no longer exist + } else if ( isNode ) { + // IE does not allow us to delete expando properties from nodes, + // nor does it have a removeAttribute function on Document nodes; + // we must handle all of these cases + if ( jQuery.support.deleteExpando ) { + delete elem[ jQuery.expando ]; + } else if ( elem.removeAttribute ) { + elem.removeAttribute( jQuery.expando ); + } else { + elem[ jQuery.expando ] = null; + } + } + }, + + // For internal use only. + _data: function( elem, name, data ) { + return jQuery.data( elem, name, data, true ); + }, + + // A method for determining if a DOM node can handle the data expando + acceptData: function( elem ) { + if ( elem.nodeName ) { + var match = jQuery.noData[ elem.nodeName.toLowerCase() ]; + + if ( match ) { + return !(match === true || elem.getAttribute("classid") !== match); + } + } + + return true; + } +}); + +jQuery.fn.extend({ + data: function( key, value ) { + var data = null; + + if ( typeof key === "undefined" ) { + if ( this.length ) { + data = jQuery.data( this[0] ); + + if ( this[0].nodeType === 1 ) { + var attr = this[0].attributes, name; + for ( var i = 0, l = attr.length; i < l; i++ ) { + name = attr[i].name; + + if ( name.indexOf( "data-" ) === 0 ) { + name = name.substr( 5 ); + dataAttr( this[0], name, data[ name ] ); + } + } + } + } + + return data; + + } else if ( typeof key === "object" ) { + return this.each(function() { + jQuery.data( this, key ); + }); + } + + var parts = key.split("."); + parts[1] = parts[1] ? "." + parts[1] : ""; + + if ( value === undefined ) { + data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); + + // Try to fetch any internally stored data first + if ( data === undefined && this.length ) { + data = jQuery.data( this[0], key ); + data = dataAttr( this[0], key, data ); + } + + return data === undefined && parts[1] ? + this.data( parts[0] ) : + data; + + } else { + return this.each(function() { + var $this = jQuery( this ), + args = [ parts[0], value ]; + + $this.triggerHandler( "setData" + parts[1] + "!", args ); + jQuery.data( this, key, value ); + $this.triggerHandler( "changeData" + parts[1] + "!", args ); + }); + } + }, + + removeData: function( key ) { + return this.each(function() { + jQuery.removeData( this, key ); + }); + } +}); + +function dataAttr( elem, key, data ) { + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + data = elem.getAttribute( "data-" + key ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + !jQuery.isNaN( data ) ? parseFloat( data ) : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch( e ) {} + + // Make sure we set the data so it isn't changed later + jQuery.data( elem, key, data ); + + } else { + data = undefined; + } + } + + return data; +} + +// TODO: This is a hack for 1.5 ONLY to allow objects with a single toJSON +// property to be considered empty objects; this property always exists in +// order to make sure JSON.stringify does not expose internal metadata +function isEmptyDataObject( obj ) { + for ( var name in obj ) { + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} + + + + +jQuery.extend({ + queue: function( elem, type, data ) { + if ( !elem ) { + return; + } + + type = (type || "fx") + "queue"; + var q = jQuery._data( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( !data ) { + return q || []; + } + + if ( !q || jQuery.isArray(data) ) { + q = jQuery._data( elem, type, jQuery.makeArray(data) ); + + } else { + q.push( data ); + } + + return q; + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + fn = queue.shift(); + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + } + + if ( fn ) { + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift("inprogress"); + } + + fn.call(elem, function() { + jQuery.dequeue(elem, type); + }); + } + + if ( !queue.length ) { + jQuery.removeData( elem, type + "queue", true ); + } + } +}); + +jQuery.fn.extend({ + queue: function( type, data ) { + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + } + + if ( data === undefined ) { + return jQuery.queue( this[0], type ); + } + return this.each(function( i ) { + var queue = jQuery.queue( this, type, data ); + + if ( type === "fx" && queue[0] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + }); + }, + dequeue: function( type ) { + return this.each(function() { + jQuery.dequeue( this, type ); + }); + }, + + // Based off of the plugin by Clint Helfers, with permission. + // http://blindsignals.com/index.php/2009/07/jquery-delay/ + delay: function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[time] || time : time; + type = type || "fx"; + + return this.queue( type, function() { + var elem = this; + setTimeout(function() { + jQuery.dequeue( elem, type ); + }, time ); + }); + }, + + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + } +}); + + + + +var rclass = /[\n\t\r]/g, + rspaces = /\s+/, + rreturn = /\r/g, + rspecialurl = /^(?:href|src|style)$/, + rtype = /^(?:button|input)$/i, + rfocusable = /^(?:button|input|object|select|textarea)$/i, + rclickable = /^a(?:rea)?$/i, + rradiocheck = /^(?:radio|checkbox)$/i; + +jQuery.props = { + "for": "htmlFor", + "class": "className", + readonly: "readOnly", + maxlength: "maxLength", + cellspacing: "cellSpacing", + rowspan: "rowSpan", + colspan: "colSpan", + tabindex: "tabIndex", + usemap: "useMap", + frameborder: "frameBorder" +}; + +jQuery.fn.extend({ + attr: function( name, value ) { + return jQuery.access( this, name, value, true, jQuery.attr ); + }, + + removeAttr: function( name, fn ) { + return this.each(function(){ + jQuery.attr( this, name, "" ); + if ( this.nodeType === 1 ) { + this.removeAttribute( name ); + } + }); + }, + + addClass: function( value ) { + if ( jQuery.isFunction(value) ) { + return this.each(function(i) { + var self = jQuery(this); + self.addClass( value.call(this, i, self.attr("class")) ); + }); + } + + if ( value && typeof value === "string" ) { + var classNames = (value || "").split( rspaces ); + + for ( var i = 0, l = this.length; i < l; i++ ) { + var elem = this[i]; + + if ( elem.nodeType === 1 ) { + if ( !elem.className ) { + elem.className = value; + + } else { + var className = " " + elem.className + " ", + setClass = elem.className; + + for ( var c = 0, cl = classNames.length; c < cl; c++ ) { + if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) { + setClass += " " + classNames[c]; + } + } + elem.className = jQuery.trim( setClass ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + if ( jQuery.isFunction(value) ) { + return this.each(function(i) { + var self = jQuery(this); + self.removeClass( value.call(this, i, self.attr("class")) ); + }); + } + + if ( (value && typeof value === "string") || value === undefined ) { + var classNames = (value || "").split( rspaces ); + + for ( var i = 0, l = this.length; i < l; i++ ) { + var elem = this[i]; + + if ( elem.nodeType === 1 && elem.className ) { + if ( value ) { + var className = (" " + elem.className + " ").replace(rclass, " "); + for ( var c = 0, cl = classNames.length; c < cl; c++ ) { + className = className.replace(" " + classNames[c] + " ", " "); + } + elem.className = jQuery.trim( className ); + + } else { + elem.className = ""; + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isBool = typeof stateVal === "boolean"; + + if ( jQuery.isFunction( value ) ) { + return this.each(function(i) { + var self = jQuery(this); + self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal ); + }); + } + + return this.each(function() { + if ( type === "string" ) { + // toggle individual class names + var className, + i = 0, + self = jQuery( this ), + state = stateVal, + classNames = value.split( rspaces ); + + while ( (className = classNames[ i++ ]) ) { + // check each className given, space seperated list + state = isBool ? state : !self.hasClass( className ); + self[ state ? "addClass" : "removeClass" ]( className ); + } + + } else if ( type === "undefined" || type === "boolean" ) { + if ( this.className ) { + // store className if set + jQuery._data( this, "__className__", this.className ); + } + + // toggle whole className + this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; + } + }); + }, + + hasClass: function( selector ) { + var className = " " + selector + " "; + for ( var i = 0, l = this.length; i < l; i++ ) { + if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { + return true; + } + } + + return false; + }, + + val: function( value ) { + if ( !arguments.length ) { + var elem = this[0]; + + if ( elem ) { + if ( jQuery.nodeName( elem, "option" ) ) { + // attributes.value is undefined in Blackberry 4.7 but + // uses .value. See #6932 + var val = elem.attributes.value; + return !val || val.specified ? elem.value : elem.text; + } + + // We need to handle select boxes special + if ( jQuery.nodeName( elem, "select" ) ) { + var index = elem.selectedIndex, + values = [], + options = elem.options, + one = elem.type === "select-one"; + + // Nothing was selected + if ( index < 0 ) { + return null; + } + + // Loop through all the selected options + for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { + var option = options[ i ]; + + // Don't return options that are disabled or in a disabled optgroup + if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && + (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) { + + // Get the specific value for the option + value = jQuery(option).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + // Fixes Bug #2551 -- select.val() broken in IE after form.reset() + if ( one && !values.length && options.length ) { + return jQuery( options[ index ] ).val(); + } + + return values; + } + + // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified + if ( rradiocheck.test( elem.type ) && !jQuery.support.checkOn ) { + return elem.getAttribute("value") === null ? "on" : elem.value; + } + + // Everything else, we just grab the value + return (elem.value || "").replace(rreturn, ""); + + } + + return undefined; + } + + var isFunction = jQuery.isFunction(value); + + return this.each(function(i) { + var self = jQuery(this), val = value; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( isFunction ) { + val = value.call(this, i, self.val()); + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + } else if ( typeof val === "number" ) { + val += ""; + } else if ( jQuery.isArray(val) ) { + val = jQuery.map(val, function (value) { + return value == null ? "" : value + ""; + }); + } + + if ( jQuery.isArray(val) && rradiocheck.test( this.type ) ) { + this.checked = jQuery.inArray( self.val(), val ) >= 0; + + } else if ( jQuery.nodeName( this, "select" ) ) { + var values = jQuery.makeArray(val); + + jQuery( "option", this ).each(function() { + this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; + }); + + if ( !values.length ) { + this.selectedIndex = -1; + } + + } else { + this.value = val; + } + }); + } +}); + +jQuery.extend({ + attrFn: { + val: true, + css: true, + html: true, + text: true, + data: true, + width: true, + height: true, + offset: true + }, + + attr: function( elem, name, value, pass ) { + // don't get/set attributes on text, comment and attribute nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || elem.nodeType === 2 ) { + return undefined; + } + + if ( pass && name in jQuery.attrFn ) { + return jQuery(elem)[name](value); + } + + var notxml = elem.nodeType !== 1 || !jQuery.isXMLDoc( elem ), + // Whether we are setting (or getting) + set = value !== undefined; + + // Try to normalize/fix the name + name = notxml && jQuery.props[ name ] || name; + + // Only do all the following if this is a node (faster for style) + if ( elem.nodeType === 1 ) { + // These attributes require special treatment + var special = rspecialurl.test( name ); + + // Safari mis-reports the default selected property of an option + // Accessing the parent's selectedIndex property fixes it + if ( name === "selected" && !jQuery.support.optSelected ) { + var parent = elem.parentNode; + if ( parent ) { + parent.selectedIndex; + + // Make sure that it also works with optgroups, see #5701 + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + } + + // If applicable, access the attribute via the DOM 0 way + // 'in' checks fail in Blackberry 4.7 #6931 + if ( (name in elem || elem[ name ] !== undefined) && notxml && !special ) { + if ( set ) { + // We can't allow the type property to be changed (since it causes problems in IE) + if ( name === "type" && rtype.test( elem.nodeName ) && elem.parentNode ) { + jQuery.error( "type property can't be changed" ); + } + + if ( value === null ) { + if ( elem.nodeType === 1 ) { + elem.removeAttribute( name ); + } + + } else { + elem[ name ] = value; + } + } + + // browsers index elements by id/name on forms, give priority to attributes. + if ( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) ) { + return elem.getAttributeNode( name ).nodeValue; + } + + // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set + // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + if ( name === "tabIndex" ) { + var attributeNode = elem.getAttributeNode( "tabIndex" ); + + return attributeNode && attributeNode.specified ? + attributeNode.value : + rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? + 0 : + undefined; + } + + return elem[ name ]; + } + + if ( !jQuery.support.style && notxml && name === "style" ) { + if ( set ) { + elem.style.cssText = "" + value; + } + + return elem.style.cssText; + } + + if ( set ) { + // convert the value to a string (all browsers do this but IE) see #1070 + elem.setAttribute( name, "" + value ); + } + + // Ensure that missing attributes return undefined + // Blackberry 4.7 returns "" from getAttribute #6938 + if ( !elem.attributes[ name ] && (elem.hasAttribute && !elem.hasAttribute( name )) ) { + return undefined; + } + + var attr = !jQuery.support.hrefNormalized && notxml && special ? + // Some attributes require a special call on IE + elem.getAttribute( name, 2 ) : + elem.getAttribute( name ); + + // Non-existent attributes return null, we normalize to undefined + return attr === null ? undefined : attr; + } + // Handle everything which isn't a DOM element node + if ( set ) { + elem[ name ] = value; + } + return elem[ name ]; + } +}); + + + + +var rnamespaces = /\.(.*)$/, + rformElems = /^(?:textarea|input|select)$/i, + rperiod = /\./g, + rspace = / /g, + rescape = /[^\w\s.|`]/g, + fcleanup = function( nm ) { + return nm.replace(rescape, "\\$&"); + }; + +/* + * A number of helper functions used for managing events. + * Many of the ideas behind this code originated from + * Dean Edwards' addEvent library. + */ +jQuery.event = { + + // Bind an event to an element + // Original by Dean Edwards + add: function( elem, types, handler, data ) { + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // TODO :: Use a try/catch until it's safe to pull this out (likely 1.6) + // Minor release fix for bug #8018 + try { + // For whatever reason, IE has trouble passing the window object + // around, causing it to be cloned in the process + if ( jQuery.isWindow( elem ) && ( elem !== window && !elem.frameElement ) ) { + elem = window; + } + } + catch ( e ) {} + + if ( handler === false ) { + handler = returnFalse; + } else if ( !handler ) { + // Fixes bug #7229. Fix recommended by jdalton + return; + } + + var handleObjIn, handleObj; + + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + } + + // Make sure that the function being executed has a unique ID + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure + var elemData = jQuery._data( elem ); + + // If no elemData is found then we must be trying to bind to one of the + // banned noData elements + if ( !elemData ) { + return; + } + + var events = elemData.events, + eventHandle = elemData.handle; + + if ( !events ) { + elemData.events = events = {}; + } + + if ( !eventHandle ) { + elemData.handle = eventHandle = function() { + // Handle the second event of a trigger and when + // an event is called after a pagebreak has unloaded + return typeof jQuery !== "undefined" && !jQuery.event.triggered ? + jQuery.event.handle.apply( eventHandle.elem, arguments ) : + undefined; + }; + } + + // Add elem as a property of the handle function + // This is to prevent a memory leak with non-native events in IE. + eventHandle.elem = elem; + + // Handle multiple events separated by a space + // jQuery(...).bind("mouseover mouseout", fn); + types = types.split(" "); + + var type, i = 0, namespaces; + + while ( (type = types[ i++ ]) ) { + handleObj = handleObjIn ? + jQuery.extend({}, handleObjIn) : + { handler: handler, data: data }; + + // Namespaced event handlers + if ( type.indexOf(".") > -1 ) { + namespaces = type.split("."); + type = namespaces.shift(); + handleObj.namespace = namespaces.slice(0).sort().join("."); + + } else { + namespaces = []; + handleObj.namespace = ""; + } + + handleObj.type = type; + if ( !handleObj.guid ) { + handleObj.guid = handler.guid; + } + + // Get the current list of functions bound to this event + var handlers = events[ type ], + special = jQuery.event.special[ type ] || {}; + + // Init the event handler queue + if ( !handlers ) { + handlers = events[ type ] = []; + + // Check for a special event handler + // Only use addEventListener/attachEvent if the special + // events handler returns false + if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add the function to the element's handler list + handlers.push( handleObj ); + + // Keep track of which events have been used, for global triggering + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + global: {}, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, pos ) { + // don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + if ( handler === false ) { + handler = returnFalse; + } + + var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType, + elemData = jQuery.hasData( elem ) && jQuery._data( elem ), + events = elemData && elemData.events; + + if ( !elemData || !events ) { + return; + } + + // types is actually an event object here + if ( types && types.type ) { + handler = types.handler; + types = types.type; + } + + // Unbind all events for the element + if ( !types || typeof types === "string" && types.charAt(0) === "." ) { + types = types || ""; + + for ( type in events ) { + jQuery.event.remove( elem, type + types ); + } + + return; + } + + // Handle multiple events separated by a space + // jQuery(...).unbind("mouseover mouseout", fn); + types = types.split(" "); + + while ( (type = types[ i++ ]) ) { + origType = type; + handleObj = null; + all = type.indexOf(".") < 0; + namespaces = []; + + if ( !all ) { + // Namespaced event handlers + namespaces = type.split("."); + type = namespaces.shift(); + + namespace = new RegExp("(^|\\.)" + + jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)"); + } + + eventType = events[ type ]; + + if ( !eventType ) { + continue; + } + + if ( !handler ) { + for ( j = 0; j < eventType.length; j++ ) { + handleObj = eventType[ j ]; + + if ( all || namespace.test( handleObj.namespace ) ) { + jQuery.event.remove( elem, origType, handleObj.handler, j ); + eventType.splice( j--, 1 ); + } + } + + continue; + } + + special = jQuery.event.special[ type ] || {}; + + for ( j = pos || 0; j < eventType.length; j++ ) { + handleObj = eventType[ j ]; + + if ( handler.guid === handleObj.guid ) { + // remove the given handler for the given type + if ( all || namespace.test( handleObj.namespace ) ) { + if ( pos == null ) { + eventType.splice( j--, 1 ); + } + + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + + if ( pos != null ) { + break; + } + } + } + + // remove generic event handler if no more handlers exist + if ( eventType.length === 0 || pos != null && eventType.length === 1 ) { + if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { + jQuery.removeEvent( elem, type, elemData.handle ); + } + + ret = null; + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + var handle = elemData.handle; + if ( handle ) { + handle.elem = null; + } + + delete elemData.events; + delete elemData.handle; + + if ( jQuery.isEmptyObject( elemData ) ) { + jQuery.removeData( elem, undefined, true ); + } + } + }, + + // bubbling is internal + trigger: function( event, data, elem /*, bubbling */ ) { + // Event object or event type + var type = event.type || event, + bubbling = arguments[3]; + + if ( !bubbling ) { + event = typeof event === "object" ? + // jQuery.Event object + event[ jQuery.expando ] ? event : + // Object literal + jQuery.extend( jQuery.Event(type), event ) : + // Just the event type (string) + jQuery.Event(type); + + if ( type.indexOf("!") >= 0 ) { + event.type = type = type.slice(0, -1); + event.exclusive = true; + } + + // Handle a global trigger + if ( !elem ) { + // Don't bubble custom events when global (to avoid too much overhead) + event.stopPropagation(); + + // Only trigger if we've ever bound an event for it + if ( jQuery.event.global[ type ] ) { + // XXX This code smells terrible. event.js should not be directly + // inspecting the data cache + jQuery.each( jQuery.cache, function() { + // internalKey variable is just used to make it easier to find + // and potentially change this stuff later; currently it just + // points to jQuery.expando + var internalKey = jQuery.expando, + internalCache = this[ internalKey ]; + if ( internalCache && internalCache.events && internalCache.events[ type ] ) { + jQuery.event.trigger( event, data, internalCache.handle.elem ); + } + }); + } + } + + // Handle triggering a single element + + // don't do events on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) { + return undefined; + } + + // Clean up in case it is reused + event.result = undefined; + event.target = elem; + + // Clone the incoming data, if any + data = jQuery.makeArray( data ); + data.unshift( event ); + } + + event.currentTarget = elem; + + // Trigger the event, it is assumed that "handle" is a function + var handle = jQuery._data( elem, "handle" ); + + if ( handle ) { + handle.apply( elem, data ); + } + + var parent = elem.parentNode || elem.ownerDocument; + + // Trigger an inline bound script + try { + if ( !(elem && elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]) ) { + if ( elem[ "on" + type ] && elem[ "on" + type ].apply( elem, data ) === false ) { + event.result = false; + event.preventDefault(); + } + } + + // prevent IE from throwing an error for some elements with some event types, see #3533 + } catch (inlineError) {} + + if ( !event.isPropagationStopped() && parent ) { + jQuery.event.trigger( event, data, parent, true ); + + } else if ( !event.isDefaultPrevented() ) { + var old, + target = event.target, + targetType = type.replace( rnamespaces, "" ), + isClick = jQuery.nodeName( target, "a" ) && targetType === "click", + special = jQuery.event.special[ targetType ] || {}; + + if ( (!special._default || special._default.call( elem, event ) === false) && + !isClick && !(target && target.nodeName && jQuery.noData[target.nodeName.toLowerCase()]) ) { + + try { + if ( target[ targetType ] ) { + // Make sure that we don't accidentally re-trigger the onFOO events + old = target[ "on" + targetType ]; + + if ( old ) { + target[ "on" + targetType ] = null; + } + + jQuery.event.triggered = true; + target[ targetType ](); + } + + // prevent IE from throwing an error for some elements with some event types, see #3533 + } catch (triggerError) {} + + if ( old ) { + target[ "on" + targetType ] = old; + } + + jQuery.event.triggered = false; + } + } + }, + + handle: function( event ) { + var all, handlers, namespaces, namespace_re, events, + namespace_sort = [], + args = jQuery.makeArray( arguments ); + + event = args[0] = jQuery.event.fix( event || window.event ); + event.currentTarget = this; + + // Namespaced event handlers + all = event.type.indexOf(".") < 0 && !event.exclusive; + + if ( !all ) { + namespaces = event.type.split("."); + event.type = namespaces.shift(); + namespace_sort = namespaces.slice(0).sort(); + namespace_re = new RegExp("(^|\\.)" + namespace_sort.join("\\.(?:.*\\.)?") + "(\\.|$)"); + } + + event.namespace = event.namespace || namespace_sort.join("."); + + events = jQuery._data(this, "events"); + + handlers = (events || {})[ event.type ]; + + if ( events && handlers ) { + // Clone the handlers to prevent manipulation + handlers = handlers.slice(0); + + for ( var j = 0, l = handlers.length; j < l; j++ ) { + var handleObj = handlers[ j ]; + + // Filter the functions by class + if ( all || namespace_re.test( handleObj.namespace ) ) { + // Pass in a reference to the handler function itself + // So that we can later remove it + event.handler = handleObj.handler; + event.data = handleObj.data; + event.handleObj = handleObj; + + var ret = handleObj.handler.apply( this, args ); + + if ( ret !== undefined ) { + event.result = ret; + if ( ret === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + + if ( event.isImmediatePropagationStopped() ) { + break; + } + } + } + } + + return event.result; + }, + + props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // store a copy of the original event object + // and "clone" to set read-only properties + var originalEvent = event; + event = jQuery.Event( originalEvent ); + + for ( var i = this.props.length, prop; i; ) { + prop = this.props[ --i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Fix target property, if necessary + if ( !event.target ) { + // Fixes #1925 where srcElement might not be defined either + event.target = event.srcElement || document; + } + + // check if target is a textnode (safari) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && event.fromElement ) { + event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement; + } + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && event.clientX != null ) { + var doc = document.documentElement, + body = document.body; + + event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0); + event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0); + } + + // Add which for key events + if ( event.which == null && (event.charCode != null || event.keyCode != null) ) { + event.which = event.charCode != null ? event.charCode : event.keyCode; + } + + // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs) + if ( !event.metaKey && event.ctrlKey ) { + event.metaKey = event.ctrlKey; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && event.button !== undefined ) { + event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) )); + } + + return event; + }, + + // Deprecated, use jQuery.guid instead + guid: 1E8, + + // Deprecated, use jQuery.proxy instead + proxy: jQuery.proxy, + + special: { + ready: { + // Make sure the ready event is setup + setup: jQuery.bindReady, + teardown: jQuery.noop + }, + + live: { + add: function( handleObj ) { + jQuery.event.add( this, + liveConvert( handleObj.origType, handleObj.selector ), + jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) ); + }, + + remove: function( handleObj ) { + jQuery.event.remove( this, liveConvert( handleObj.origType, handleObj.selector ), handleObj ); + } + }, + + beforeunload: { + setup: function( data, namespaces, eventHandle ) { + // We only want to do this special case on windows + if ( jQuery.isWindow( this ) ) { + this.onbeforeunload = eventHandle; + } + }, + + teardown: function( namespaces, eventHandle ) { + if ( this.onbeforeunload === eventHandle ) { + this.onbeforeunload = null; + } + } + } + } +}; + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle, false ); + } + } : + function( elem, type, handle ) { + if ( elem.detachEvent ) { + elem.detachEvent( "on" + type, handle ); + } + }; + +jQuery.Event = function( src ) { + // Allow instantiation without the 'new' keyword + if ( !this.preventDefault ) { + return new jQuery.Event( src ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false || + src.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse; + + // Event type + } else { + this.type = src; + } + + // timeStamp is buggy for some events on Firefox(#3843) + // So we won't rely on the native value + this.timeStamp = jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +function returnFalse() { + return false; +} +function returnTrue() { + return true; +} + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + preventDefault: function() { + this.isDefaultPrevented = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + + // if preventDefault exists run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // otherwise set the returnValue property of the original event to false (IE) + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + this.isPropagationStopped = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + // if stopPropagation exists run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + // otherwise set the cancelBubble property of the original event to true (IE) + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + this.isImmediatePropagationStopped = returnTrue; + this.stopPropagation(); + }, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse +}; + +// Checks if an event happened on an element within another element +// Used in jQuery.event.special.mouseenter and mouseleave handlers +var withinElement = function( event ) { + // Check if mouse(over|out) are still within the same parent element + var parent = event.relatedTarget; + + // Firefox sometimes assigns relatedTarget a XUL element + // which we cannot access the parentNode property of + try { + + // Chrome does something similar, the parentNode property + // can be accessed but is null. + if ( parent !== document && !parent.parentNode ) { + return; + } + // Traverse up the tree + while ( parent && parent !== this ) { + parent = parent.parentNode; + } + + if ( parent !== this ) { + // set the correct event type + event.type = event.data; + + // handle event if we actually just moused on to a non sub-element + jQuery.event.handle.apply( this, arguments ); + } + + // assuming we've left the element since we most likely mousedover a xul element + } catch(e) { } +}, + +// In case of event delegation, we only need to rename the event.type, +// liveHandler will take care of the rest. +delegate = function( event ) { + event.type = event.data; + jQuery.event.handle.apply( this, arguments ); +}; + +// Create mouseenter and mouseleave events +jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + setup: function( data ) { + jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig ); + }, + teardown: function( data ) { + jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement ); + } + }; +}); + +// submit delegation +if ( !jQuery.support.submitBubbles ) { + + jQuery.event.special.submit = { + setup: function( data, namespaces ) { + if ( this.nodeName && this.nodeName.toLowerCase() !== "form" ) { + jQuery.event.add(this, "click.specialSubmit", function( e ) { + var elem = e.target, + type = elem.type; + + if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) { + trigger( "submit", this, arguments ); + } + }); + + jQuery.event.add(this, "keypress.specialSubmit", function( e ) { + var elem = e.target, + type = elem.type; + + if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) { + trigger( "submit", this, arguments ); + } + }); + + } else { + return false; + } + }, + + teardown: function( namespaces ) { + jQuery.event.remove( this, ".specialSubmit" ); + } + }; + +} + +// change delegation, happens here so we have bind. +if ( !jQuery.support.changeBubbles ) { + + var changeFilters, + + getVal = function( elem ) { + var type = elem.type, val = elem.value; + + if ( type === "radio" || type === "checkbox" ) { + val = elem.checked; + + } else if ( type === "select-multiple" ) { + val = elem.selectedIndex > -1 ? + jQuery.map( elem.options, function( elem ) { + return elem.selected; + }).join("-") : + ""; + + } else if ( elem.nodeName.toLowerCase() === "select" ) { + val = elem.selectedIndex; + } + + return val; + }, + + testChange = function testChange( e ) { + var elem = e.target, data, val; + + if ( !rformElems.test( elem.nodeName ) || elem.readOnly ) { + return; + } + + data = jQuery._data( elem, "_change_data" ); + val = getVal(elem); + + // the current data will be also retrieved by beforeactivate + if ( e.type !== "focusout" || elem.type !== "radio" ) { + jQuery._data( elem, "_change_data", val ); + } + + if ( data === undefined || val === data ) { + return; + } + + if ( data != null || val ) { + e.type = "change"; + e.liveFired = undefined; + jQuery.event.trigger( e, arguments[1], elem ); + } + }; + + jQuery.event.special.change = { + filters: { + focusout: testChange, + + beforedeactivate: testChange, + + click: function( e ) { + var elem = e.target, type = elem.type; + + if ( type === "radio" || type === "checkbox" || elem.nodeName.toLowerCase() === "select" ) { + testChange.call( this, e ); + } + }, + + // Change has to be called before submit + // Keydown will be called before keypress, which is used in submit-event delegation + keydown: function( e ) { + var elem = e.target, type = elem.type; + + if ( (e.keyCode === 13 && elem.nodeName.toLowerCase() !== "textarea") || + (e.keyCode === 32 && (type === "checkbox" || type === "radio")) || + type === "select-multiple" ) { + testChange.call( this, e ); + } + }, + + // Beforeactivate happens also before the previous element is blurred + // with this event you can't trigger a change event, but you can store + // information + beforeactivate: function( e ) { + var elem = e.target; + jQuery._data( elem, "_change_data", getVal(elem) ); + } + }, + + setup: function( data, namespaces ) { + if ( this.type === "file" ) { + return false; + } + + for ( var type in changeFilters ) { + jQuery.event.add( this, type + ".specialChange", changeFilters[type] ); + } + + return rformElems.test( this.nodeName ); + }, + + teardown: function( namespaces ) { + jQuery.event.remove( this, ".specialChange" ); + + return rformElems.test( this.nodeName ); + } + }; + + changeFilters = jQuery.event.special.change.filters; + + // Handle when the input is .focus()'d + changeFilters.focus = changeFilters.beforeactivate; +} + +function trigger( type, elem, args ) { + // Piggyback on a donor event to simulate a different one. + // Fake originalEvent to avoid donor's stopPropagation, but if the + // simulated event prevents default then we do the same on the donor. + // Don't pass args or remember liveFired; they apply to the donor event. + var event = jQuery.extend( {}, args[ 0 ] ); + event.type = type; + event.originalEvent = {}; + event.liveFired = undefined; + jQuery.event.handle.call( elem, event ); + if ( event.isDefaultPrevented() ) { + args[ 0 ].preventDefault(); + } +} + +// Create "bubbling" focus and blur events +if ( document.addEventListener ) { + jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + jQuery.event.special[ fix ] = { + setup: function() { + this.addEventListener( orig, handler, true ); + }, + teardown: function() { + this.removeEventListener( orig, handler, true ); + } + }; + + function handler( e ) { + e = jQuery.event.fix( e ); + e.type = fix; + return jQuery.event.handle.call( this, e ); + } + }); +} + +jQuery.each(["bind", "one"], function( i, name ) { + jQuery.fn[ name ] = function( type, data, fn ) { + // Handle object literals + if ( typeof type === "object" ) { + for ( var key in type ) { + this[ name ](key, data, type[key], fn); + } + return this; + } + + if ( jQuery.isFunction( data ) || data === false ) { + fn = data; + data = undefined; + } + + var handler = name === "one" ? jQuery.proxy( fn, function( event ) { + jQuery( this ).unbind( event, handler ); + return fn.apply( this, arguments ); + }) : fn; + + if ( type === "unload" && name !== "one" ) { + this.one( type, data, fn ); + + } else { + for ( var i = 0, l = this.length; i < l; i++ ) { + jQuery.event.add( this[i], type, handler, data ); + } + } + + return this; + }; +}); + +jQuery.fn.extend({ + unbind: function( type, fn ) { + // Handle object literals + if ( typeof type === "object" && !type.preventDefault ) { + for ( var key in type ) { + this.unbind(key, type[key]); + } + + } else { + for ( var i = 0, l = this.length; i < l; i++ ) { + jQuery.event.remove( this[i], type, fn ); + } + } + + return this; + }, + + delegate: function( selector, types, data, fn ) { + return this.live( types, data, fn, selector ); + }, + + undelegate: function( selector, types, fn ) { + if ( arguments.length === 0 ) { + return this.unbind( "live" ); + + } else { + return this.die( types, null, fn, selector ); + } + }, + + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); + }); + }, + + triggerHandler: function( type, data ) { + if ( this[0] ) { + var event = jQuery.Event( type ); + event.preventDefault(); + event.stopPropagation(); + jQuery.event.trigger( event, data, this[0] ); + return event.result; + } + }, + + toggle: function( fn ) { + // Save reference to arguments for access in closure + var args = arguments, + i = 1; + + // link all the functions, so any of them can unbind this click handler + while ( i < args.length ) { + jQuery.proxy( fn, args[ i++ ] ); + } + + return this.click( jQuery.proxy( fn, function( event ) { + // Figure out which function to execute + var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i; + jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 ); + + // Make sure that clicks stop + event.preventDefault(); + + // and execute the function + return args[ lastToggle ].apply( this, arguments ) || false; + })); + }, + + hover: function( fnOver, fnOut ) { + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + } +}); + +var liveMap = { + focus: "focusin", + blur: "focusout", + mouseenter: "mouseover", + mouseleave: "mouseout" +}; + +jQuery.each(["live", "die"], function( i, name ) { + jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) { + var type, i = 0, match, namespaces, preType, + selector = origSelector || this.selector, + context = origSelector ? this : jQuery( this.context ); + + if ( typeof types === "object" && !types.preventDefault ) { + for ( var key in types ) { + context[ name ]( key, data, types[key], selector ); + } + + return this; + } + + if ( jQuery.isFunction( data ) ) { + fn = data; + data = undefined; + } + + types = (types || "").split(" "); + + while ( (type = types[ i++ ]) != null ) { + match = rnamespaces.exec( type ); + namespaces = ""; + + if ( match ) { + namespaces = match[0]; + type = type.replace( rnamespaces, "" ); + } + + if ( type === "hover" ) { + types.push( "mouseenter" + namespaces, "mouseleave" + namespaces ); + continue; + } + + preType = type; + + if ( type === "focus" || type === "blur" ) { + types.push( liveMap[ type ] + namespaces ); + type = type + namespaces; + + } else { + type = (liveMap[ type ] || type) + namespaces; + } + + if ( name === "live" ) { + // bind live handler + for ( var j = 0, l = context.length; j < l; j++ ) { + jQuery.event.add( context[j], "live." + liveConvert( type, selector ), + { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } ); + } + + } else { + // unbind live handler + context.unbind( "live." + liveConvert( type, selector ), fn ); + } + } + + return this; + }; +}); + +function liveHandler( event ) { + var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret, + elems = [], + selectors = [], + events = jQuery._data( this, "events" ); + + // Make sure we avoid non-left-click bubbling in Firefox (#3861) and disabled elements in IE (#6911) + if ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click" ) { + return; + } + + if ( event.namespace ) { + namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)"); + } + + event.liveFired = this; + + var live = events.live.slice(0); + + for ( j = 0; j < live.length; j++ ) { + handleObj = live[j]; + + if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) { + selectors.push( handleObj.selector ); + + } else { + live.splice( j--, 1 ); + } + } + + match = jQuery( event.target ).closest( selectors, event.currentTarget ); + + for ( i = 0, l = match.length; i < l; i++ ) { + close = match[i]; + + for ( j = 0; j < live.length; j++ ) { + handleObj = live[j]; + + if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) && !close.elem.disabled ) { + elem = close.elem; + related = null; + + // Those two events require additional checking + if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) { + event.type = handleObj.preType; + related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0]; + } + + if ( !related || related !== elem ) { + elems.push({ elem: elem, handleObj: handleObj, level: close.level }); + } + } + } + } + + for ( i = 0, l = elems.length; i < l; i++ ) { + match = elems[i]; + + if ( maxLevel && match.level > maxLevel ) { + break; + } + + event.currentTarget = match.elem; + event.data = match.handleObj.data; + event.handleObj = match.handleObj; + + ret = match.handleObj.origHandler.apply( match.elem, arguments ); + + if ( ret === false || event.isPropagationStopped() ) { + maxLevel = match.level; + + if ( ret === false ) { + stop = false; + } + if ( event.isImmediatePropagationStopped() ) { + break; + } + } + } + + return stop; +} + +function liveConvert( type, selector ) { + return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspace, "&"); +} + +jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + + "change select submit keydown keypress keyup error").split(" "), function( i, name ) { + + // Handle event binding + jQuery.fn[ name ] = function( data, fn ) { + if ( fn == null ) { + fn = data; + data = null; + } + + return arguments.length > 0 ? + this.bind( name, data, fn ) : + this.trigger( name ); + }; + + if ( jQuery.attrFn ) { + jQuery.attrFn[ name ] = true; + } +}); + + +/*! + * Sizzle CSS Selector Engine + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){ + +var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, + done = 0, + toString = Object.prototype.toString, + hasDuplicate = false, + baseHasDuplicate = true, + rBackslash = /\\/g, + rNonWord = /\W/; + +// Here we check if the JavaScript engine is using some sort of +// optimization where it does not always call our comparision +// function. If that is the case, discard the hasDuplicate value. +// Thus far that includes Google Chrome. +[0, 0].sort(function() { + baseHasDuplicate = false; + return 0; +}); + +var Sizzle = function( selector, context, results, seed ) { + results = results || []; + context = context || document; + + var origContext = context; + + if ( context.nodeType !== 1 && context.nodeType !== 9 ) { + return []; + } + + if ( !selector || typeof selector !== "string" ) { + return results; + } + + var m, set, checkSet, extra, ret, cur, pop, i, + prune = true, + contextXML = Sizzle.isXML( context ), + parts = [], + soFar = selector; + + // Reset the position of the chunker regexp (start from head) + do { + chunker.exec( "" ); + m = chunker.exec( soFar ); + + if ( m ) { + soFar = m[3]; + + parts.push( m[1] ); + + if ( m[2] ) { + extra = m[3]; + break; + } + } + } while ( m ); + + if ( parts.length > 1 && origPOS.exec( selector ) ) { + + if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { + set = posProcess( parts[0] + parts[1], context ); + + } else { + set = Expr.relative[ parts[0] ] ? + [ context ] : + Sizzle( parts.shift(), context ); + + while ( parts.length ) { + selector = parts.shift(); + + if ( Expr.relative[ selector ] ) { + selector += parts.shift(); + } + + set = posProcess( selector, set ); + } + } + + } else { + // Take a shortcut and set the context if the root selector is an ID + // (but not if it'll be faster if the inner selector is an ID) + if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && + Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { + + ret = Sizzle.find( parts.shift(), context, contextXML ); + context = ret.expr ? + Sizzle.filter( ret.expr, ret.set )[0] : + ret.set[0]; + } + + if ( context ) { + ret = seed ? + { expr: parts.pop(), set: makeArray(seed) } : + Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); + + set = ret.expr ? + Sizzle.filter( ret.expr, ret.set ) : + ret.set; + + if ( parts.length > 0 ) { + checkSet = makeArray( set ); + + } else { + prune = false; + } + + while ( parts.length ) { + cur = parts.pop(); + pop = cur; + + if ( !Expr.relative[ cur ] ) { + cur = ""; + } else { + pop = parts.pop(); + } + + if ( pop == null ) { + pop = context; + } + + Expr.relative[ cur ]( checkSet, pop, contextXML ); + } + + } else { + checkSet = parts = []; + } + } + + if ( !checkSet ) { + checkSet = set; + } + + if ( !checkSet ) { + Sizzle.error( cur || selector ); + } + + if ( toString.call(checkSet) === "[object Array]" ) { + if ( !prune ) { + results.push.apply( results, checkSet ); + + } else if ( context && context.nodeType === 1 ) { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { + results.push( set[i] ); + } + } + + } else { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && checkSet[i].nodeType === 1 ) { + results.push( set[i] ); + } + } + } + + } else { + makeArray( checkSet, results ); + } + + if ( extra ) { + Sizzle( extra, origContext, results, seed ); + Sizzle.uniqueSort( results ); + } + + return results; +}; + +Sizzle.uniqueSort = function( results ) { + if ( sortOrder ) { + hasDuplicate = baseHasDuplicate; + results.sort( sortOrder ); + + if ( hasDuplicate ) { + for ( var i = 1; i < results.length; i++ ) { + if ( results[i] === results[ i - 1 ] ) { + results.splice( i--, 1 ); + } + } + } + } + + return results; +}; + +Sizzle.matches = function( expr, set ) { + return Sizzle( expr, null, null, set ); +}; + +Sizzle.matchesSelector = function( node, expr ) { + return Sizzle( expr, null, null, [node] ).length > 0; +}; + +Sizzle.find = function( expr, context, isXML ) { + var set; + + if ( !expr ) { + return []; + } + + for ( var i = 0, l = Expr.order.length; i < l; i++ ) { + var match, + type = Expr.order[i]; + + if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { + var left = match[1]; + match.splice( 1, 1 ); + + if ( left.substr( left.length - 1 ) !== "\\" ) { + match[1] = (match[1] || "").replace( rBackslash, "" ); + set = Expr.find[ type ]( match, context, isXML ); + + if ( set != null ) { + expr = expr.replace( Expr.match[ type ], "" ); + break; + } + } + } + } + + if ( !set ) { + set = typeof context.getElementsByTagName !== "undefined" ? + context.getElementsByTagName( "*" ) : + []; + } + + return { set: set, expr: expr }; +}; + +Sizzle.filter = function( expr, set, inplace, not ) { + var match, anyFound, + old = expr, + result = [], + curLoop = set, + isXMLFilter = set && set[0] && Sizzle.isXML( set[0] ); + + while ( expr && set.length ) { + for ( var type in Expr.filter ) { + if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { + var found, item, + filter = Expr.filter[ type ], + left = match[1]; + + anyFound = false; + + match.splice(1,1); + + if ( left.substr( left.length - 1 ) === "\\" ) { + continue; + } + + if ( curLoop === result ) { + result = []; + } + + if ( Expr.preFilter[ type ] ) { + match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); + + if ( !match ) { + anyFound = found = true; + + } else if ( match === true ) { + continue; + } + } + + if ( match ) { + for ( var i = 0; (item = curLoop[i]) != null; i++ ) { + if ( item ) { + found = filter( item, match, i, curLoop ); + var pass = not ^ !!found; + + if ( inplace && found != null ) { + if ( pass ) { + anyFound = true; + + } else { + curLoop[i] = false; + } + + } else if ( pass ) { + result.push( item ); + anyFound = true; + } + } + } + } + + if ( found !== undefined ) { + if ( !inplace ) { + curLoop = result; + } + + expr = expr.replace( Expr.match[ type ], "" ); + + if ( !anyFound ) { + return []; + } + + break; + } + } + } + + // Improper expression + if ( expr === old ) { + if ( anyFound == null ) { + Sizzle.error( expr ); + + } else { + break; + } + } + + old = expr; + } + + return curLoop; +}; + +Sizzle.error = function( msg ) { + throw "Syntax error, unrecognized expression: " + msg; +}; + +var Expr = Sizzle.selectors = { + order: [ "ID", "NAME", "TAG" ], + + match: { + ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, + ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, + TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, + CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, + POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, + PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ + }, + + leftMatch: {}, + + attrMap: { + "class": "className", + "for": "htmlFor" + }, + + attrHandle: { + href: function( elem ) { + return elem.getAttribute( "href" ); + }, + type: function( elem ) { + return elem.getAttribute( "type" ); + } + }, + + relative: { + "+": function(checkSet, part){ + var isPartStr = typeof part === "string", + isTag = isPartStr && !rNonWord.test( part ), + isPartStrNotTag = isPartStr && !isTag; + + if ( isTag ) { + part = part.toLowerCase(); + } + + for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { + if ( (elem = checkSet[i]) ) { + while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} + + checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? + elem || false : + elem === part; + } + } + + if ( isPartStrNotTag ) { + Sizzle.filter( part, checkSet, true ); + } + }, + + ">": function( checkSet, part ) { + var elem, + isPartStr = typeof part === "string", + i = 0, + l = checkSet.length; + + if ( isPartStr && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + + for ( ; i < l; i++ ) { + elem = checkSet[i]; + + if ( elem ) { + var parent = elem.parentNode; + checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; + } + } + + } else { + for ( ; i < l; i++ ) { + elem = checkSet[i]; + + if ( elem ) { + checkSet[i] = isPartStr ? + elem.parentNode : + elem.parentNode === part; + } + } + + if ( isPartStr ) { + Sizzle.filter( part, checkSet, true ); + } + } + }, + + "": function(checkSet, part, isXML){ + var nodeCheck, + doneName = done++, + checkFn = dirCheck; + + if ( typeof part === "string" && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML ); + }, + + "~": function( checkSet, part, isXML ) { + var nodeCheck, + doneName = done++, + checkFn = dirCheck; + + if ( typeof part === "string" && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML ); + } + }, + + find: { + ID: function( match, context, isXML ) { + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + return m && m.parentNode ? [m] : []; + } + }, + + NAME: function( match, context ) { + if ( typeof context.getElementsByName !== "undefined" ) { + var ret = [], + results = context.getElementsByName( match[1] ); + + for ( var i = 0, l = results.length; i < l; i++ ) { + if ( results[i].getAttribute("name") === match[1] ) { + ret.push( results[i] ); + } + } + + return ret.length === 0 ? null : ret; + } + }, + + TAG: function( match, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( match[1] ); + } + } + }, + preFilter: { + CLASS: function( match, curLoop, inplace, result, not, isXML ) { + match = " " + match[1].replace( rBackslash, "" ) + " "; + + if ( isXML ) { + return match; + } + + for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { + if ( elem ) { + if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) { + if ( !inplace ) { + result.push( elem ); + } + + } else if ( inplace ) { + curLoop[i] = false; + } + } + } + + return false; + }, + + ID: function( match ) { + return match[1].replace( rBackslash, "" ); + }, + + TAG: function( match, curLoop ) { + return match[1].replace( rBackslash, "" ).toLowerCase(); + }, + + CHILD: function( match ) { + if ( match[1] === "nth" ) { + if ( !match[2] ) { + Sizzle.error( match[0] ); + } + + match[2] = match[2].replace(/^\+|\s*/g, ''); + + // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' + var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( + match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || + !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); + + // calculate the numbers (first)n+(last) including if they are negative + match[2] = (test[1] + (test[2] || 1)) - 0; + match[3] = test[3] - 0; + } + else if ( match[2] ) { + Sizzle.error( match[0] ); + } + + // TODO: Move to normal caching system + match[0] = done++; + + return match; + }, + + ATTR: function( match, curLoop, inplace, result, not, isXML ) { + var name = match[1] = match[1].replace( rBackslash, "" ); + + if ( !isXML && Expr.attrMap[name] ) { + match[1] = Expr.attrMap[name]; + } + + // Handle if an un-quoted value was used + match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" ); + + if ( match[2] === "~=" ) { + match[4] = " " + match[4] + " "; + } + + return match; + }, + + PSEUDO: function( match, curLoop, inplace, result, not ) { + if ( match[1] === "not" ) { + // If we're dealing with a complex expression, or a simple one + if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { + match[3] = Sizzle(match[3], null, null, curLoop); + + } else { + var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); + + if ( !inplace ) { + result.push.apply( result, ret ); + } + + return false; + } + + } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { + return true; + } + + return match; + }, + + POS: function( match ) { + match.unshift( true ); + + return match; + } + }, + + filters: { + enabled: function( elem ) { + return elem.disabled === false && elem.type !== "hidden"; + }, + + disabled: function( elem ) { + return elem.disabled === true; + }, + + checked: function( elem ) { + return elem.checked === true; + }, + + selected: function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + parent: function( elem ) { + return !!elem.firstChild; + }, + + empty: function( elem ) { + return !elem.firstChild; + }, + + has: function( elem, i, match ) { + return !!Sizzle( match[3], elem ).length; + }, + + header: function( elem ) { + return (/h\d/i).test( elem.nodeName ); + }, + + text: function( elem ) { + // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) + // use getAttribute instead to test this case + return "text" === elem.getAttribute( 'type' ); + }, + radio: function( elem ) { + return "radio" === elem.type; + }, + + checkbox: function( elem ) { + return "checkbox" === elem.type; + }, + + file: function( elem ) { + return "file" === elem.type; + }, + password: function( elem ) { + return "password" === elem.type; + }, + + submit: function( elem ) { + return "submit" === elem.type; + }, + + image: function( elem ) { + return "image" === elem.type; + }, + + reset: function( elem ) { + return "reset" === elem.type; + }, + + button: function( elem ) { + return "button" === elem.type || elem.nodeName.toLowerCase() === "button"; + }, + + input: function( elem ) { + return (/input|select|textarea|button/i).test( elem.nodeName ); + } + }, + setFilters: { + first: function( elem, i ) { + return i === 0; + }, + + last: function( elem, i, match, array ) { + return i === array.length - 1; + }, + + even: function( elem, i ) { + return i % 2 === 0; + }, + + odd: function( elem, i ) { + return i % 2 === 1; + }, + + lt: function( elem, i, match ) { + return i < match[3] - 0; + }, + + gt: function( elem, i, match ) { + return i > match[3] - 0; + }, + + nth: function( elem, i, match ) { + return match[3] - 0 === i; + }, + + eq: function( elem, i, match ) { + return match[3] - 0 === i; + } + }, + filter: { + PSEUDO: function( elem, match, i, array ) { + var name = match[1], + filter = Expr.filters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + + } else if ( name === "contains" ) { + return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0; + + } else if ( name === "not" ) { + var not = match[3]; + + for ( var j = 0, l = not.length; j < l; j++ ) { + if ( not[j] === elem ) { + return false; + } + } + + return true; + + } else { + Sizzle.error( name ); + } + }, + + CHILD: function( elem, match ) { + var type = match[1], + node = elem; + + switch ( type ) { + case "only": + case "first": + while ( (node = node.previousSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + if ( type === "first" ) { + return true; + } + + node = elem; + + case "last": + while ( (node = node.nextSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + return true; + + case "nth": + var first = match[2], + last = match[3]; + + if ( first === 1 && last === 0 ) { + return true; + } + + var doneName = match[0], + parent = elem.parentNode; + + if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) { + var count = 0; + + for ( node = parent.firstChild; node; node = node.nextSibling ) { + if ( node.nodeType === 1 ) { + node.nodeIndex = ++count; + } + } + + parent.sizcache = doneName; + } + + var diff = elem.nodeIndex - last; + + if ( first === 0 ) { + return diff === 0; + + } else { + return ( diff % first === 0 && diff / first >= 0 ); + } + } + }, + + ID: function( elem, match ) { + return elem.nodeType === 1 && elem.getAttribute("id") === match; + }, + + TAG: function( elem, match ) { + return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match; + }, + + CLASS: function( elem, match ) { + return (" " + (elem.className || elem.getAttribute("class")) + " ") + .indexOf( match ) > -1; + }, + + ATTR: function( elem, match ) { + var name = match[1], + result = Expr.attrHandle[ name ] ? + Expr.attrHandle[ name ]( elem ) : + elem[ name ] != null ? + elem[ name ] : + elem.getAttribute( name ), + value = result + "", + type = match[2], + check = match[4]; + + return result == null ? + type === "!=" : + type === "=" ? + value === check : + type === "*=" ? + value.indexOf(check) >= 0 : + type === "~=" ? + (" " + value + " ").indexOf(check) >= 0 : + !check ? + value && result !== false : + type === "!=" ? + value !== check : + type === "^=" ? + value.indexOf(check) === 0 : + type === "$=" ? + value.substr(value.length - check.length) === check : + type === "|=" ? + value === check || value.substr(0, check.length + 1) === check + "-" : + false; + }, + + POS: function( elem, match, i, array ) { + var name = match[2], + filter = Expr.setFilters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + } + } + } +}; + +var origPOS = Expr.match.POS, + fescape = function(all, num){ + return "\\" + (num - 0 + 1); + }; + +for ( var type in Expr.match ) { + Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); + Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); +} + +var makeArray = function( array, results ) { + array = Array.prototype.slice.call( array, 0 ); + + if ( results ) { + results.push.apply( results, array ); + return results; + } + + return array; +}; + +// Perform a simple check to determine if the browser is capable of +// converting a NodeList to an array using builtin methods. +// Also verifies that the returned array holds DOM nodes +// (which is not the case in the Blackberry browser) +try { + Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; + +// Provide a fallback method if it does not work +} catch( e ) { + makeArray = function( array, results ) { + var i = 0, + ret = results || []; + + if ( toString.call(array) === "[object Array]" ) { + Array.prototype.push.apply( ret, array ); + + } else { + if ( typeof array.length === "number" ) { + for ( var l = array.length; i < l; i++ ) { + ret.push( array[i] ); + } + + } else { + for ( ; array[i]; i++ ) { + ret.push( array[i] ); + } + } + } + + return ret; + }; +} + +var sortOrder, siblingCheck; + +if ( document.documentElement.compareDocumentPosition ) { + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { + return a.compareDocumentPosition ? -1 : 1; + } + + return a.compareDocumentPosition(b) & 4 ? -1 : 1; + }; + +} else { + sortOrder = function( a, b ) { + var al, bl, + ap = [], + bp = [], + aup = a.parentNode, + bup = b.parentNode, + cur = aup; + + // The nodes are identical, we can exit early + if ( a === b ) { + hasDuplicate = true; + return 0; + + // If the nodes are siblings (or identical) we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + + // If no parents were found then the nodes are disconnected + } else if ( !aup ) { + return -1; + + } else if ( !bup ) { + return 1; + } + + // Otherwise they're somewhere else in the tree so we need + // to build up a full list of the parentNodes for comparison + while ( cur ) { + ap.unshift( cur ); + cur = cur.parentNode; + } + + cur = bup; + + while ( cur ) { + bp.unshift( cur ); + cur = cur.parentNode; + } + + al = ap.length; + bl = bp.length; + + // Start walking down the tree looking for a discrepancy + for ( var i = 0; i < al && i < bl; i++ ) { + if ( ap[i] !== bp[i] ) { + return siblingCheck( ap[i], bp[i] ); + } + } + + // We ended someplace up the tree so do a sibling check + return i === al ? + siblingCheck( a, bp[i], -1 ) : + siblingCheck( ap[i], b, 1 ); + }; + + siblingCheck = function( a, b, ret ) { + if ( a === b ) { + return ret; + } + + var cur = a.nextSibling; + + while ( cur ) { + if ( cur === b ) { + return -1; + } + + cur = cur.nextSibling; + } + + return 1; + }; +} + +// Utility function for retreiving the text value of an array of DOM nodes +Sizzle.getText = function( elems ) { + var ret = "", elem; + + for ( var i = 0; elems[i]; i++ ) { + elem = elems[i]; + + // Get the text from text nodes and CDATA nodes + if ( elem.nodeType === 3 || elem.nodeType === 4 ) { + ret += elem.nodeValue; + + // Traverse everything else, except comment nodes + } else if ( elem.nodeType !== 8 ) { + ret += Sizzle.getText( elem.childNodes ); + } + } + + return ret; +}; + +// Check to see if the browser returns elements by name when +// querying by getElementById (and provide a workaround) +(function(){ + // We're going to inject a fake input element with a specified name + var form = document.createElement("div"), + id = "script" + (new Date()).getTime(), + root = document.documentElement; + + form.innerHTML = ""; + + // Inject it into the root element, check its status, and remove it quickly + root.insertBefore( form, root.firstChild ); + + // The workaround has to do additional checks after a getElementById + // Which slows things down for other browsers (hence the branching) + if ( document.getElementById( id ) ) { + Expr.find.ID = function( match, context, isXML ) { + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + + return m ? + m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? + [m] : + undefined : + []; + } + }; + + Expr.filter.ID = function( elem, match ) { + var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); + + return elem.nodeType === 1 && node && node.nodeValue === match; + }; + } + + root.removeChild( form ); + + // release memory in IE + root = form = null; +})(); + +(function(){ + // Check to see if the browser returns only elements + // when doing getElementsByTagName("*") + + // Create a fake element + var div = document.createElement("div"); + div.appendChild( document.createComment("") ); + + // Make sure no comments are found + if ( div.getElementsByTagName("*").length > 0 ) { + Expr.find.TAG = function( match, context ) { + var results = context.getElementsByTagName( match[1] ); + + // Filter out possible comments + if ( match[1] === "*" ) { + var tmp = []; + + for ( var i = 0; results[i]; i++ ) { + if ( results[i].nodeType === 1 ) { + tmp.push( results[i] ); + } + } + + results = tmp; + } + + return results; + }; + } + + // Check to see if an attribute returns normalized href attributes + div.innerHTML = ""; + + if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && + div.firstChild.getAttribute("href") !== "#" ) { + + Expr.attrHandle.href = function( elem ) { + return elem.getAttribute( "href", 2 ); + }; + } + + // release memory in IE + div = null; +})(); + +if ( document.querySelectorAll ) { + (function(){ + var oldSizzle = Sizzle, + div = document.createElement("div"), + id = "__sizzle__"; + + div.innerHTML = "

    "; + + // Safari can't handle uppercase or unicode characters when + // in quirks mode. + if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { + return; + } + + Sizzle = function( query, context, extra, seed ) { + context = context || document; + + // Only use querySelectorAll on non-XML documents + // (ID selectors don't work in non-HTML documents) + if ( !seed && !Sizzle.isXML(context) ) { + // See if we find a selector to speed up + var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query ); + + if ( match && (context.nodeType === 1 || context.nodeType === 9) ) { + // Speed-up: Sizzle("TAG") + if ( match[1] ) { + return makeArray( context.getElementsByTagName( query ), extra ); + + // Speed-up: Sizzle(".CLASS") + } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) { + return makeArray( context.getElementsByClassName( match[2] ), extra ); + } + } + + if ( context.nodeType === 9 ) { + // Speed-up: Sizzle("body") + // The body element only exists once, optimize finding it + if ( query === "body" && context.body ) { + return makeArray( [ context.body ], extra ); + + // Speed-up: Sizzle("#ID") + } else if ( match && match[3] ) { + var elem = context.getElementById( match[3] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id === match[3] ) { + return makeArray( [ elem ], extra ); + } + + } else { + return makeArray( [], extra ); + } + } + + try { + return makeArray( context.querySelectorAll(query), extra ); + } catch(qsaError) {} + + // qSA works strangely on Element-rooted queries + // We can work around this by specifying an extra ID on the root + // and working up from there (Thanks to Andrew Dupont for the technique) + // IE 8 doesn't work on object elements + } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { + var oldContext = context, + old = context.getAttribute( "id" ), + nid = old || id, + hasParent = context.parentNode, + relativeHierarchySelector = /^\s*[+~]/.test( query ); + + if ( !old ) { + context.setAttribute( "id", nid ); + } else { + nid = nid.replace( /'/g, "\\$&" ); + } + if ( relativeHierarchySelector && hasParent ) { + context = context.parentNode; + } + + try { + if ( !relativeHierarchySelector || hasParent ) { + return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra ); + } + + } catch(pseudoError) { + } finally { + if ( !old ) { + oldContext.removeAttribute( "id" ); + } + } + } + } + + return oldSizzle(query, context, extra, seed); + }; + + for ( var prop in oldSizzle ) { + Sizzle[ prop ] = oldSizzle[ prop ]; + } + + // release memory in IE + div = null; + })(); +} + +(function(){ + var html = document.documentElement, + matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector, + pseudoWorks = false; + + try { + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( document.documentElement, "[test!='']:sizzle" ); + + } catch( pseudoError ) { + pseudoWorks = true; + } + + if ( matches ) { + Sizzle.matchesSelector = function( node, expr ) { + // Make sure that attribute selectors are quoted + expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); + + if ( !Sizzle.isXML( node ) ) { + try { + if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) { + return matches.call( node, expr ); + } + } catch(e) {} + } + + return Sizzle(expr, null, null, [node]).length > 0; + }; + } +})(); + +(function(){ + var div = document.createElement("div"); + + div.innerHTML = "
    "; + + // Opera can't find a second classname (in 9.6) + // Also, make sure that getElementsByClassName actually exists + if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { + return; + } + + // Safari caches class attributes, doesn't catch changes (in 3.2) + div.lastChild.className = "e"; + + if ( div.getElementsByClassName("e").length === 1 ) { + return; + } + + Expr.order.splice(1, 0, "CLASS"); + Expr.find.CLASS = function( match, context, isXML ) { + if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { + return context.getElementsByClassName(match[1]); + } + }; + + // release memory in IE + div = null; +})(); + +function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + + if ( elem ) { + var match = false; + + elem = elem[dir]; + + while ( elem ) { + if ( elem.sizcache === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 && !isXML ){ + elem.sizcache = doneName; + elem.sizset = i; + } + + if ( elem.nodeName.toLowerCase() === cur ) { + match = elem; + break; + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + + if ( elem ) { + var match = false; + + elem = elem[dir]; + + while ( elem ) { + if ( elem.sizcache === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 ) { + if ( !isXML ) { + elem.sizcache = doneName; + elem.sizset = i; + } + + if ( typeof cur !== "string" ) { + if ( elem === cur ) { + match = true; + break; + } + + } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { + match = elem; + break; + } + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +if ( document.documentElement.contains ) { + Sizzle.contains = function( a, b ) { + return a !== b && (a.contains ? a.contains(b) : true); + }; + +} else if ( document.documentElement.compareDocumentPosition ) { + Sizzle.contains = function( a, b ) { + return !!(a.compareDocumentPosition(b) & 16); + }; + +} else { + Sizzle.contains = function() { + return false; + }; +} + +Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; + + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +var posProcess = function( selector, context ) { + var match, + tmpSet = [], + later = "", + root = context.nodeType ? [context] : context; + + // Position selectors must be done after the filter + // And so must :not(positional) so we move all PSEUDOs to the end + while ( (match = Expr.match.PSEUDO.exec( selector )) ) { + later += match[0]; + selector = selector.replace( Expr.match.PSEUDO, "" ); + } + + selector = Expr.relative[selector] ? selector + "*" : selector; + + for ( var i = 0, l = root.length; i < l; i++ ) { + Sizzle( selector, root[i], tmpSet ); + } + + return Sizzle.filter( later, tmpSet ); +}; + +// EXPOSE +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[":"] = jQuery.expr.filters; +jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + +})(); + + +var runtil = /Until$/, + rparentsprev = /^(?:parents|prevUntil|prevAll)/, + // Note: This RegExp should be improved, or likely pulled from Sizzle + rmultiselector = /,/, + isSimple = /^.[^:#\[\.,]*$/, + slice = Array.prototype.slice, + POS = jQuery.expr.match.POS, + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend({ + find: function( selector ) { + var ret = this.pushStack( "", "find", selector ), + length = 0; + + for ( var i = 0, l = this.length; i < l; i++ ) { + length = ret.length; + jQuery.find( selector, this[i], ret ); + + if ( i > 0 ) { + // Make sure that the results are unique + for ( var n = length; n < ret.length; n++ ) { + for ( var r = 0; r < length; r++ ) { + if ( ret[r] === ret[n] ) { + ret.splice(n--, 1); + break; + } + } + } + } + } + + return ret; + }, + + has: function( target ) { + var targets = jQuery( target ); + return this.filter(function() { + for ( var i = 0, l = targets.length; i < l; i++ ) { + if ( jQuery.contains( this, targets[i] ) ) { + return true; + } + } + }); + }, + + not: function( selector ) { + return this.pushStack( winnow(this, selector, false), "not", selector); + }, + + filter: function( selector ) { + return this.pushStack( winnow(this, selector, true), "filter", selector ); + }, + + is: function( selector ) { + return !!selector && jQuery.filter( selector, this ).length > 0; + }, + + closest: function( selectors, context ) { + var ret = [], i, l, cur = this[0]; + + if ( jQuery.isArray( selectors ) ) { + var match, selector, + matches = {}, + level = 1; + + if ( cur && selectors.length ) { + for ( i = 0, l = selectors.length; i < l; i++ ) { + selector = selectors[i]; + + if ( !matches[selector] ) { + matches[selector] = jQuery.expr.match.POS.test( selector ) ? + jQuery( selector, context || this.context ) : + selector; + } + } + + while ( cur && cur.ownerDocument && cur !== context ) { + for ( selector in matches ) { + match = matches[selector]; + + if ( match.jquery ? match.index(cur) > -1 : jQuery(cur).is(match) ) { + ret.push({ selector: selector, elem: cur, level: level }); + } + } + + cur = cur.parentNode; + level++; + } + } + + return ret; + } + + var pos = POS.test( selectors ) ? + jQuery( selectors, context || this.context ) : null; + + for ( i = 0, l = this.length; i < l; i++ ) { + cur = this[i]; + + while ( cur ) { + if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { + ret.push( cur ); + break; + + } else { + cur = cur.parentNode; + if ( !cur || !cur.ownerDocument || cur === context ) { + break; + } + } + } + } + + ret = ret.length > 1 ? jQuery.unique(ret) : ret; + + return this.pushStack( ret, "closest", selectors ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + if ( !elem || typeof elem === "string" ) { + return jQuery.inArray( this[0], + // If it receives a string, the selector is used + // If it receives nothing, the siblings are used + elem ? jQuery( elem ) : this.parent().children() ); + } + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[0] : elem, this ); + }, + + add: function( selector, context ) { + var set = typeof selector === "string" ? + jQuery( selector, context ) : + jQuery.makeArray( selector ), + all = jQuery.merge( this.get(), set ); + + return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? + all : + jQuery.unique( all ) ); + }, + + andSelf: function() { + return this.add( this.prevObject ); + } +}); + +// A painfully simple check to see if an element is disconnected +// from a document (should be improved, where feasible). +function isDisconnected( node ) { + return !node || !node.parentNode || node.parentNode.nodeType === 11; +} + +jQuery.each({ + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return jQuery.dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return jQuery.dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return jQuery.nth( elem, 2, "nextSibling" ); + }, + prev: function( elem ) { + return jQuery.nth( elem, 2, "previousSibling" ); + }, + nextAll: function( elem ) { + return jQuery.dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return jQuery.dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return jQuery.dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return jQuery.dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return jQuery.sibling( elem.parentNode.firstChild, elem ); + }, + children: function( elem ) { + return jQuery.sibling( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.makeArray( elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ), + // The variable 'args' was introduced in + // https://github.com/jquery/jquery/commit/52a0238 + // to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed. + // http://code.google.com/p/v8/issues/detail?id=1050 + args = slice.call(arguments); + + if ( !runtil.test( name ) ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; + + if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + + return this.pushStack( ret, name, args.join(",") ); + }; +}); + +jQuery.extend({ + filter: function( expr, elems, not ) { + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 ? + jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : + jQuery.find.matches(expr, elems); + }, + + dir: function( elem, dir, until ) { + var matched = [], + cur = elem[ dir ]; + + while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { + if ( cur.nodeType === 1 ) { + matched.push( cur ); + } + cur = cur[dir]; + } + return matched; + }, + + nth: function( cur, result, dir, elem ) { + result = result || 1; + var num = 0; + + for ( ; cur; cur = cur[dir] ) { + if ( cur.nodeType === 1 && ++num === result ) { + break; + } + } + + return cur; + }, + + sibling: function( n, elem ) { + var r = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + r.push( n ); + } + } + + return r; + } +}); + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, keep ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep(elements, function( elem, i ) { + var retVal = !!qualifier.call( elem, i, elem ); + return retVal === keep; + }); + + } else if ( qualifier.nodeType ) { + return jQuery.grep(elements, function( elem, i ) { + return (elem === qualifier) === keep; + }); + + } else if ( typeof qualifier === "string" ) { + var filtered = jQuery.grep(elements, function( elem ) { + return elem.nodeType === 1; + }); + + if ( isSimple.test( qualifier ) ) { + return jQuery.filter(qualifier, filtered, !keep); + } else { + qualifier = jQuery.filter( qualifier, filtered ); + } + } + + return jQuery.grep(elements, function( elem, i ) { + return (jQuery.inArray( elem, qualifier ) >= 0) === keep; + }); +} + + + + +var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, + rleadingWhitespace = /^\s+/, + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, + rtagName = /<([\w:]+)/, + rtbody = /", "" ], + legend: [ 1, "
    ", "
    " ], + thead: [ 1, "", "
    " ], + tr: [ 2, "", "
    " ], + td: [ 3, "", "
    " ], + col: [ 2, "", "
    " ], + area: [ 1, "", "" ], + _default: [ 0, "", "" ] + }; + +wrapMap.optgroup = wrapMap.option; +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// IE can't serialize and "); +// } diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/lib/Staf.php b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/lib/Staf.php new file mode 100644 index 000000000..4420c7bc2 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/lib/Staf.php @@ -0,0 +1,58 @@ +]] COMMAND [PARMS ] + * @param $path + * @param $params + * @param $host + */ + public static function process_start($path, $params, $host='local', $wait=false){ + $cmd = "start shell command \\\"\"$path\"\\\" parms \\\"\"$params\"\\\""; + if($wait){ + $cmd.=" wait returnstdout returnstderr"; + } + return self::process($cmd, $host); + } + + /** + * STOP | HANDLE > [USING ] + * @param unknown_type $handle + * @param unknown_type $host + */ + public static function process_stop($handle, $host='local', $all=0){ + $cmd = $all ? "STOP ALL CONFIRM":"STOP HANDLE $handle"; + return self::process($cmd, $host); + } + + public static function queryHandle($browser){ + $filename = "temp\\$browser"; + if(file_exists($filename)){ + $handle = file_get_contents($filename); + delete($filename); + return $handle; + } + return false; + } + + public static function saveHandle($browser){ + $filename = "temp\\$browser"; + $fp = fopen($filename, 'w'); + fwrite($fp, 'test'); + fclose($fp); + } +} +?> \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/lib/StafResult.php b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/lib/StafResult.php new file mode 100644 index 000000000..6942dd16b --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/lib/StafResult.php @@ -0,0 +1,20 @@ +rc = $rc; + $this->info = $info; + } + + public function __toString() + { + return "return code : ".$rc.", return info : ".$info."\n"; + } + + public static function parse($result){ + return new StafResult(0, $result); + } +}?> \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/list.php b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/list.php new file mode 100644 index 000000000..27b0450bb --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/list.php @@ -0,0 +1,78 @@ + + + + + + + Ueditor Test Index Page + + + + + + + + + +
    +

    Ueditor Test Index Page

    + +

    + ueditor +

    +
    + + +
    + + + +
    + +
    + 自动下一个出错时终止 +
    + +
    +
    +
    + +
    +
    + + +
    + + + diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/log.php b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/log.php new file mode 100644 index 000000000..cf43ba0c5 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/log.php @@ -0,0 +1,45 @@ + \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/mail.php b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/mail.php new file mode 100644 index 000000000..be79bed14 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/mail.php @@ -0,0 +1,113 @@ + + * @version $Id: mail.php 156323 2011-11-28 02:57:21Z peng.shan $ + */ +class Mail { + function send_mail($to,$subject = "",$body = "") { + //error_reporting(E_STRICT); + date_default_timezone_set("Asia/Shanghai");//设定时区东八区 + require_once('../libs/phpmailer/class.phpmailer.php'); + include("../libs/phpmailer/class.pop3.php"); + $mail = new PHPMailer(); //new一个PHPMailer对象出来 + $body = str_replace("[\]",'',$body); //对邮件内容进行必要的过滤 + $mail->CharSet ="UTF-8";//设定邮件编码,默认ISO-8859-1,如果发中文此项必须设置,否则乱码 +// $mail->IsSMTP(); // 设定使用SMTP服务 +// $mail->SMTPDebug = 1; // 启用SMTP调试功能 + // 1 = errors and messages + // 2 = messages only + $mail->SMTPAuth = true; // 启用 SMTP 验证功能 + $mail->SMTPSecure = "ssl"; // 安全协议 + $mail->Host = "MAILBOX03.internal.baidu.com"; // SMTP 服务器 + $mail->Port = 465; // SMTP服务器的端口号 + $mail->Username = "zhuwemxuan"; // SMTP服务器用户名 + $mail->Password = "Zwx19840818"; // SMTP服务器密码 + $mail->SetFrom('zhuewnxuan@baidu.com', '朱文轩'); + $mail->AddReplyTo("zhuwenxuan@baidu.com","邮件回复人的名称"); + $mail->Subject = $subject; + $mail->AltBody = "To view the message, please use an HTML compatible email viewer! - From www.jiucool.com"; // optional, comment out and test + $mail->MsgHTML($body); + $address = $to; + $mail->AddAddress($address, "收件人名称"); + if(!$mail->Send()) { + echo "Mailer Error: " . $mail->ErrorInfo; + } else { + echo "Message sent!恭喜,邮件发送成功!"; + } + } + function new_send_mail(){ + mail("zhuwenxuan@baidu.com","asdfasdf","asdfasdf"); +// require_once('../libs/phpmailer/class.phpmailer.php'); +// $mail = new PHPMailer(); +// $body = "asdfdsf"; +// $body = str_replace("[\]",'',$body); +// $mail->SMTPAuth = true; // 启用 SMTP 验证功能 +// $mail->SMTPSecure = "ssl"; // 安全协议 +// $mail->IsSMTP(); +// $mail->CharSet='UTF-8'; +// $mail->SMTPDebug = 2; +// $mail->Host = 'smtp.baidu.com'; +// $mail->Port = 25; +// $mail->Username = "zhuwenxuan@baidu.com"; +// $mail->Password = "Zwx19840818"; +// $mail->SetFrom('zhuwenxuan@baidu.com', 'First Last'); +// +// $mail->AddReplyTo("zhuwen_xuan@126.com","First Last"); +// +// $mail->Subject = "PHPMailer Test Subject via POP before SMTP, basic"; +// +// $mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test +// +// $mail->MsgHTML($body); +// +// $address = "zhuwen_xuan@126.com"; +// $mail->AddAddress($address, "John Doe"); +// if(!$mail->Send()) { +// echo "Mailer Error: " . $mail->ErrorInfo; +// } else { +// echo "Message sent!"; +// } + } + + function sendMain126(){ + require_once('../libs/phpmailer/class.phpmailer.php'); + $mail = new PHPMailer(); + $body = "asdfdsf"; + $body = str_replace("[\]",'',$body); + $mail->SMTPAuth = true; // 启用 SMTP 验证功能 + $mail->SMTPSecure = "ssl"; // 安全协议 + $mail->IsSMTP(); + $mail->CharSet='UTF-8'; + $mail->SMTPDebug = 2; + $mail->Host = 'smtp.126.com'; + $mail->Port = 465; + $mail->Username = "zhuwen_xuan@126.com"; + $mail->Password = "zwx19840818"; + $mail->SetFrom('zhuwen_xuan@126.com', 'First Last'); + + $mail->AddReplyTo("zhuwenxuan@baidu.com","First Last"); + + $mail->Subject = "PHPMailer Test Subject via POP before SMTP, basic"; + + $mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test + + $mail->MsgHTML($body); + + $address = "zhuwenxuan@baidu.com"; + $mail->AddAddress($address, "John Doe"); + if(!$mail->Send()) { + echo "Mailer Error: " . $mail->ErrorInfo; + } else { + echo "Message sent!"; + } + } + +} +$m = new Mail(); +$m->new_send_mail(); + + + + + \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/read.php b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/read.php new file mode 100644 index 000000000..4fb5a2f72 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/read.php @@ -0,0 +1,12 @@ + \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/record.php b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/record.php new file mode 100644 index 000000000..883860ad9 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/record.php @@ -0,0 +1,95 @@ +testsuite as $testsuite){ + foreach ($testsuite->testcase as $testResult) { + // $totalCov = 0; + $browser =strval( $testResult['browserInfo']); + $host = strval($testResult['hostInfo']); + $caseName = strval($testResult['name']); + $fail = strval($testResult['failNumber']); + $total = strval($testResult['totalNumber']); + $cov = strval($testResult['cov']); + $recordCovForBrowser = strval($testResult['recordCovForBrowser']); + if (!array_key_exists($caseName, $caseList)) { //如果这个用例不存在 + $caseInfo = array ( + 'hostInfo' => $host, + 'fail' => $fail, + 'total' => $total, + 'cov' => $cov, + 'recordCovForBrowser' => $recordCovForBrowser + ); + // $totalCov += $cov; + $caseList[$caseName] = array ( + $browser => $caseInfo//, + // 'totalCov'=>$totalCov + ); + // $caseList['totalCov'] = $totalCov; + } else { //否则添加到相应的用例中去 + $foundCase = $caseList[$caseName]; //找到用例名称对应的array,$caseName为key + if (!array_key_exists($browser, $foundCase)) { //如果没有该浏览器信息,则添加 + // $totalCov += $cov; + $caseList[$caseName][$browser] = array ( + 'hostInfo' => $host, + 'fail' => $fail, + 'total' => $total, + 'cov' => $cov, + 'recordCovForBrowser' => $recordCovForBrowser + ); + // $caseList[$caseName]['totalCov'] = $totalCov; + } else { + $foundBrowser = $foundCase[$browser]; //有这个浏览器 + array_push($foundBrowser, array ( + 'hostInfo' => $host, + 'fail' => $fail, + 'total' => $total, + 'cov' => $cov, + 'recordCovForBrowser' => $recordCovForBrowser + )); + } + } + + } + } + + //根据需求添加仅记录失败情况的接口 + if($onlyfails){//如果仅考虑失败情况,此处根据用例情况过滤 + foreach($caseList as $name => $info){ + $all_success = true;//记录当前用例是否全部运行成功 + foreach($info as $b => $result){ + if($result['fail'] > 0) + $all_success = false;//如果有失败情况则终止循环并进入下一个用例分析 + break; + } + //if($all_success) //如果全部通过则从记录中移除 + //unset($caseList[$name]); + } + } + return $caseList; +} + +function record() +{ +// require_once 'geneXML.php'; + /*如果全部运行完毕,发送邮件*/ + $kissList = interXML(false); + require_once 'geneHTML.php'; + if (sizeof($kissList) > 0) { + //针对kissList过滤,移除全部正确用例 + $html = geneHTML($kissList); + $report = 'report.html'; + $handle = fopen("$report", "w"); + fwrite($handle, $html); + fclose($handle); +// require_once 'geneHistory.php'; +// geneHistory($html); + } +} +?> diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/report.php b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/report.php new file mode 100644 index 000000000..5162a8487 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/report.php @@ -0,0 +1,158 @@ +"; + return; +} + + +function match($fileName, $matcher ) +{ + if ( $matcher == '*' ) + return true; + $len = strlen( $matcher ); + + + $as = explode( ';' , $matcher ); + if ( sizeof( $as ) > 1 ) { + + //这里把或的逻辑改成与 + foreach ( $as as $matcher1 ) { + if ( match($fileName, $matcher1 ) ) + return true; + } + return false; + } + $ms = explode( ',' , $matcher ); + if ( sizeof( $ms ) > 1 ) { + //这里把或的逻辑改成与 + foreach ( $ms as $matcher1 ) { + if ( !match($fileName, $matcher1 ) ) + return false; + } + return true; + } + + /** + * 处理反向选择分支 + */ + if ( substr( $matcher , 0 , 1 ) == '!' ) { + $m = substr( $matcher , 1 ); + if ( substr( $fileName , 0 , strlen( $m ) ) == $m ) + return false; + return true; + } + + if ( $len > strlen( $fileName ) ) { + return false; + } + return substr( $fileName , 0 , $len ) == $matcher; +} +function report() +{ + /** + * for junit report + */ + $dom = new DOMDocument('1.0', 'utf-8'); + $suite = $dom->appendChild($dom->createElement('testsuite')); + $cfg = preg_split('/[&=]/', $_POST['config']); + $config = array(); + for ($i = 0; $i < sizeof($cfg); $i += 2) { + // echo "{$cfg[$i]} {$cfg[$i+1]}\r\n
    "; + $config[$cfg[$i]] = $cfg[$i + 1]; + $p = $suite->appendChild($dom->createElement("property")); + + $p->setAttribute('name', $cfg[$i]); + $p->setAttribute('value', $cfg[$i + 1]); + + } + $suite->setAttribute("name", $config['browser']); + $errors = 0; + $failures = 0; + $tests = 0; + $time = 0; + $filter = $config['filterRun']; + foreach ($_POST as $key => $value) { + if ($key == 'config') + continue; + echo $key.' '; + $info = explode(";", $value); + + if ($filter!='' && (!match($key,$filter))){ + continue; + } + //errornum + ',' + allnum + ','+ kissPerc || 0 + ',' + wb.kissstart + ','+ wb.kissend; + $casetime = ($info[4] - $info[3]) / 1000; + $time += $casetime; + $tests++; + $failure = (int)($info[0]); + $case = $suite->appendChild($dom->createElement('testcase')); + $case->setAttribute("name", str_replace('_','.',$key)); + $case->setAttribute("time", $casetime); + $case->setAttribute("cov", $info[2]); + $case->setAttribute('failNumber', $info[0]); + $case->setAttribute('totalNumber', $info[1]); + $case->setAttribute('recordCovForBrowser',$info[5]); + $case->setAttribute('browserInfo', $config['browser']); + $case->setAttribute('hostInfo', Config::$BROWSERS[$config['browser']][0]); + // covHtml( $config[ 'browser' ] . '/' . $key , $info[ 2 ] ); + if ($failure > 0) { + $failures++; + $failinfo = $case->appendChild($dom->createElement('failure')); + $failinfo->setAttribute('type', 'junit.framework.AssertionFailedError'); + //FROM php.net, You cannot simply overwrite $textContent, to replace the text content of a DOMNode, as the missing readonly flag suggests. + $kiss = join(".", split("/", $key)); + // $failinfo->appendChild( new DOMText( $value ) ); + $failinfo->appendChild(new DOMText("run")); + } + //TODO add more case info in xml + } + + $suite->setAttribute('time', $time); + $suite->setAttribute('failures', $failures); + $suite->setAttribute('tests', $tests); + +// $dirName = "report_{$config['filter']}"; + $dirName = str_replace('/','_',"report_{$config['filter']}"); + if (!is_dir($dirName)) + mkdir($dirName); + $dom->save($dirName."/{$config['browser']}.xml"); +} +include 'config.php'; +$config; +$configs = preg_split('/[&=]/', $_POST['config']); +for ($j = 0; $j < sizeof($configs); $j += 2) { + // echo "{$cfg[$i]} {$cfg[$i+1]}\r\n
    "; +// if(strcmp($configs[$j],'browserSet')==0){ + $config[$configs[$j]] = $configs[$j + 1]; +// } + +} +report(); + +$dom = new DOMDocument('1.0', 'utf-8'); +$testsuites = $dom->appendChild($dom->createElement('testsuites')); +$dirName = str_replace('/','_',"report_{$config['filter']}"); +foreach (Config::getBrowserSet($configBrowserSet) as $key => $value) { + + $file = $dirName."/$key.xml"; + if (!file_exists($file)) { + echo "wait for report : $file\r\n
    "; + return; + } +// Config::StopOne($key); + $xmlDoc = new DOMDocument('1.0', 'utf-8'); + $xmlDoc->load($file); + $xmlDom = $xmlDoc->documentElement; + //echo $xmlDom->nodeName; + $testsuites->appendChild($dom->importNode($xmlDom, true)); +} +$dom->save("report.xml"); +$browserNum = count(Config::getBrowserSet($configBrowserSet)); +require_once 'record.php'; +record(); + +Config::StopAll(); +?> \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/run.php b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/run.php new file mode 100644 index 000000000..2d355eba5 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/run.php @@ -0,0 +1,46 @@ +'; +} +; +require_once "case.class.php"; +$c = new Kiss( '../../../' , $_GET[ 'case' ] ); +$title = $c->name; +$cov = array_key_exists( 'cov' , $_GET ); +?> + + + + <?php print( "run case $title" );?> + print_js( $cov ); ?> + + +

    name );?>

    + +

    + +

    +
      + +
      + + + +
      + + \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/runC.php b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/runC.php new file mode 100644 index 000000000..3671cbb81 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/runC.php @@ -0,0 +1,46 @@ +'; +} +; +require_once "case.class.php"; +$c = new Kiss( '../../../' , $_GET[ 'case' ] ); +$title = $c->name; +$cov = array_key_exists( 'cov' , $_GET ); +?> + + + + <?php print( "run case $title" );?> + print_all_js( $cov ); ?> + + +

      name );?>

      + +

      + +

      +
        + +
        + + + +
        + + \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/runall.php b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/runall.php new file mode 100644 index 000000000..b1cf61e5e --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/runall.php @@ -0,0 +1,119 @@ +\n"; + } + } + } + closedir( $handle ); + if ( rmdir( $dirName ) ) echo "成功删除目录: $dirName
        \n"; + } +} + +if ( array_key_exists( 'clear' , $_GET ) ) { + print 'debug - clear report'; + //Config::StopAll(); + if ( file_exists( 'report' ) ) + delDirAndFile( 'report' ); +} +$reportfile = "report_{$_GET['filter']}"; +if ( file_exists( $reportfile ) ) { + // rmdir('report'); + $reports = scandir( $reportfile ); + /*自己和父节点*/ + print 'on batch run, please waiting : ' . ( sizeof( $reports ) - 2 ); + return; +} else { + mkdir( $reportfile ); +} + +if ( file_exists( "./coverage/source.js" ) ) { + if ( unlink( "./coverage/source.js" ) ) echo "成功删除文件:source.js"; +} +source(); + +if ( file_exists( "covreport.html" ) ) { + if ( unlink( "covreport.html" ) ) echo "成功删除覆盖率报告文件: covreport.html
        \n"; +} +if ( file_exists( "jshintReport.html" ) ) { + if ( unlink( "jshintReport.html" ) ) echo "成功删除: jshintReport.html
        \n"; +} +exec("python ../lib/jshunter_1.2.0.1/jshunter_dev/jshunter/hint.py jshintReport.html ../../../_src", $back); +echo "jshint: ".$back."
        \n"; +/*记录运行时信息*/ +$b = array_key_exists( 'browser' , $_GET ) ? $_GET[ 'browser' ] : 'all'; + +//if ( array_key_exists( 'cov' , $_GET ) ){ + + +if ( $b != 'all' ) { + run( $b , true ); +} else { + Config::StopAll(); //添加启动前结束浏览器步骤 + $browsers = array_key_exists( 'browserSet' , $_GET )?Config::getBrowserSet($_GET[ 'browserSet' ]):Config::$BROWSERS; + foreach ( $browsers as $b => $i ) { + run( $b ); + sleep(40); + } +} +?> \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/txt/test1_1.txt b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/txt/test1_1.txt new file mode 100644 index 000000000..2814efbfe --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/txt/test1_1.txt @@ -0,0 +1,76 @@ +

        +

        + 欢迎使用ueditor! + + +

        +

        + 欢迎使用ueditor! + + +

        +

        + 欢迎使用ueditor! + + +

        +

        + 欢迎使用ueditor! + + +

        +

        + 欢迎使用ueditor! + + +

        +

        + 欢迎使用ueditor! + + +

        +

        + +

        +

        + 欢迎使用ueditor! + + +

        +

        + +

        +

        + 欢迎使用ueditor! + + +

        +

        + +

        +

        + 1. +欢迎使用ueditor! + + +

        +

        + 2. +欢迎使用ueditor! + + +

        +

        + +

        +

        + l 欢迎使用ueditor! + + +

        +

        + l 欢迎使用ueditor! + + +

        +

        \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/txt/test1_2.txt b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/txt/test1_2.txt new file mode 100644 index 000000000..34ebd9f70 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/txt/test1_2.txt @@ -0,0 +1,38 @@ +

        +

        + +

        +

        + 欢迎使用ueditor! + + +

        +

        + +

        +

        + 欢迎使用ueditor! + + +

        +

        + 欢迎使用ueditor! + + +

        +

        + 欢迎使用ueditor! + + +

        +

        + 欢迎使用ueditor! + + +

        +

        + 欢迎使用ueditor! + + +

        +

        \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/txt/test1_3.txt b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/txt/test1_3.txt new file mode 100644 index 000000000..81a09424b --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/txt/test1_3.txt @@ -0,0 +1,65 @@ + + + + + + + + + + + +
        +

        欢迎使用ueditor!

        +
        +

         

        +
        +

         

        +
        +

         

        +
        +

         

        +
        +

        欢迎使用ueditor!

        +
        + +

        + +

        www.baidu.com

        \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/txt/test2_1.txt b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/txt/test2_1.txt new file mode 100644 index 000000000..a918d07de --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/txt/test2_1.txt @@ -0,0 +1,57 @@ +

        +

        + 欢迎使用ueditor! + + +

        +

        + 欢迎使用ueditor! + + +

        +

        + 欢迎使用ueditor! + + +

        +

        + 欢迎使用ueditor! + + +

        +

        + 欢迎使用ueditor! + + +

        +

        + 欢迎使用ueditor! + + +

        +

        + 欢迎使用ueditor! + + +

        +

        + 一、欢迎使用ueditor! + + +

        +

        + 二、欢迎使用ueditor! + + +

        +

        + l 欢迎使用ueditor! + + +

        +

        + l 欢迎使用ueditor! + + +

        +

        \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/txt/test2_2.txt b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/txt/test2_2.txt new file mode 100644 index 000000000..36a45ee8f --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/txt/test2_2.txt @@ -0,0 +1,32 @@ +

        +

        + 欢迎使用ueditor! + + +

        +

        + 欢迎使用ueditor! + + +

        +

        + 欢迎使用ueditor! + + +

        +

        + 欢迎使用ueditor! + + +

        +

        + 欢迎使用ueditor! + + +

        +

        + 欢迎使用ueditor! + + +

        +

        \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/txt/test2_3.txt b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/txt/test2_3.txt new file mode 100644 index 000000000..b26ec40b0 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/txt/test2_3.txt @@ -0,0 +1,156 @@ +

        +

        +

        + +

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

        + 欢迎使用ueditor! + + +

        + +
        + +
        + + +

        + +

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

        + +

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

        + +

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

        + +

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

        + 欢迎使用ueditor! + + +

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

        + + + +

        www.baidu.com
        +

        +

        \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/txt/test3_1.txt b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/txt/test3_1.txt new file mode 100644 index 000000000..24bc0bd06 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/br/txt/test3_1.txt @@ -0,0 +1,131 @@ + + +

        欢迎使用ueditor!

        + +

        欢迎使用ueditor!

        + +

         

        + +

        欢迎使用ueditor!

        + +

        欢迎使用ueditor!

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

        欢迎使用ueditor!

        +
        +

         

        +
        +

         

        +
        +

         

        +
        +

         

        +
        +

        欢迎使用ueditor!

        +
        + +

         

        \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/coverage/cov.bat b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/coverage/cov.bat new file mode 100644 index 000000000..3bc2d3f22 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/coverage/cov.bat @@ -0,0 +1,2 @@ +@echo off +jscoverage.exe --encoding=UTF-8 ../../../_src ../../coverage \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/coverage/jscoverage.exe b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/coverage/jscoverage.exe new file mode 100644 index 0000000000000000000000000000000000000000..1151644a120627c4192a7f7312c21ba06d2d35fc GIT binary patch literal 1088512 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

        oUV%W-S# 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

        $$Z$G#-k_DS#fg77<2L(SdR%B$N*92LX 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 z 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 F{vU^4wrl_Z literal 0 HcmV?d00001 diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/data/frame.html b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/data/frame.html new file mode 100644 index 000000000..d5f7c5a3e --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/data/frame.html @@ -0,0 +1,10 @@ + + + + + + + + \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/data/frame.php b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/data/frame.php new file mode 100644 index 000000000..b5ec9a2f0 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/data/frame.php @@ -0,0 +1,16 @@ + + + + +"; +else +print ""; +?> + + + + diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/data/test.JPG b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/data/test.JPG new file mode 100644 index 0000000000000000000000000000000000000000..68343f2d1153da77987a98434551db72dccf5c85 GIT binary patch literal 7964 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 literal 0 HcmV?d00001 diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/data/test.html b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/data/test.html new file mode 100644 index 000000000..ff34eec49 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/data/test.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/data/testReady.html b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/data/testReady.html new file mode 100644 index 000000000..27dcb3f17 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/data/testReady.html @@ -0,0 +1,10 @@ + + + + + + diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/lib/ant_tangram_ext.jar b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/lib/ant_tangram_ext.jar new file mode 100644 index 0000000000000000000000000000000000000000..4cd595a13865653ddaa138e4905fc0d4cfd03d65 GIT binary patch literal 3063 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 Ul;>B@nRq@H&eu!lYy<%Q2cEuFqW}N^ literal 0 HcmV?d00001 diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/lib/js.jar b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/lib/js.jar new file mode 100644 index 0000000000000000000000000000000000000000..2369f99a9edc78dbd027b839cf9e7a7e77ac3436 GIT binary patch literal 871260 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

        xR`13KH3|k9&A`0x1eE1(c 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
        S5ov>aq)XmA?|B)m-RZ+2zJ|+@;=X< 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%0AE5d^|Ju`G!Mzu6xdKU$NL~hmT)( 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

        qoOd<_2H(?Xx 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

        q9&tQK$OcEQ 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
        oZiV8iJkt3ZMky_~T3o6#^K6Q@UAZl80J#tv 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

        rt53YpQCLNGLb3ni2w@kj}FD9K*Wv`iA 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Ðup=kE}IfzyPmFlm$zU$3?ODLStR}i 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�k*?G6Iul2 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 ' + (err.evidence || '').replace(/^\s*(\S*(\s+\S+)*)\s*$/, "$1")); + //print(''); + //print("==========="); + //print(err.evidence); + //print(err.raw); + //print(err.a); + //print("==========="); + //var myReport = JSHINT.report(false); + //print(myReport); + } + retval = 1; + } + }); + + quit(retval); +}(arguments)); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/lib/jshunter_1.2.0.1/jshunter_dev/jshunter/core/tpl/htmlpart.html b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/lib/jshunter_1.2.0.1/jshunter_dev/jshunter/core/tpl/htmlpart.html new file mode 100644 index 000000000..51de2a626 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/lib/jshunter_1.2.0.1/jshunter_dev/jshunter/core/tpl/htmlpart.html @@ -0,0 +1,15 @@ + + +
        {$title}
        +
        + + + + + + + + + [---to be replaced 2---] + +
        \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/lib/jshunter_1.2.0.1/jshunter_dev/jshunter/core/tpl/toggle_tpl.html b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/lib/jshunter_1.2.0.1/jshunter_dev/jshunter/core/tpl/toggle_tpl.html new file mode 100644 index 000000000..ce857cd1a --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/lib/jshunter_1.2.0.1/jshunter_dev/jshunter/core/tpl/toggle_tpl.html @@ -0,0 +1,324 @@ + + + + + +JsHunter Check Report + + + + + + + + + +
        JSHunter Report
        +
        + +

        +
        + [---to be replace 1---] +
        + + diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/lib/jshunter_1.2.0.1/jshunter_dev/jshunter/hint.py b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/lib/jshunter_1.2.0.1/jshunter_dev/jshunter/hint.py new file mode 100644 index 000000000..cd9b718d6 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/lib/jshunter_1.2.0.1/jshunter_dev/jshunter/hint.py @@ -0,0 +1,425 @@ +#!/usr/bin/python +#encoding=utf-8 +import sys,os +import ConfigParser +import commands +import time +import codecs + +htmlMap = {} +def processHtml(filename): + f = open(filename,"r") + if f is None: + raise Exception('open %s error!' % (filename)) + newName = os.sep.join(os.path.abspath(__file__).split(os.sep)[:-1]) + os.sep + "core" + os.sep + "data"+os.sep+os.path.basename(filename) + "." + str(time.time()) + #print newName + tmp = "" + flag=False + orig_num = 0 + new_num = 0 + for ln in f: + orig_num += 1 + if ln.find("") == -1: + flag=True + continue + if ln.find("") != -1: + flag=False + continue + if ln.find("") == -1: + flag=True + continue + if ln.find("") != -1: + flag=False + continue + if ln.find("") != -1: + flag=False + continue + if flag == True: + tmp += ln + new_num += 1 + htmlMap[filename+os.sep+str(orig_num)]=newName + os.sep + str(new_num) + if tmp == "": + print ('[WARNING]file %s not contain js code' % (filename)) + return "" + outfile = open(newName,"w") + if outfile is None: + raise Exception('open %s error!' % (newName)) + outfile.write(tmp) + #print htmlMap + return newName + +def clearTmpFiles(): + dels=[] + for key in htmlMap.keys(): + fn = os.sep.join(htmlMap[key].split(os.sep)[:-1]) + if not fn in dels: + dels.append(fn) + #print dels + for item in dels: + os.remove(item) +def isHiddenFile(path): + itms = path.split(os.sep) + for itm in itms: + if itm != "" and itm != "." and itm != ".." and itm[0]==".": + return True + return False +''' +@input +a file (or a top dir) to be checked +@process +recuresively read all the files of a dir.only support .html and .js. +if it is a html file then we only check the code between +if it is a js file then we check all the code +@return +file(or folder) to be checked +''' +def getFiles(paths): + #print paths + ret = [] + omitpath = os.path.dirname(__file__) + os.sep + "conf" + os.sep + "omitfiles.conf" + for path in paths: + path = path.rstrip(os.sep) + if not os.path.isdir(path): + omitfiles = getOmitedFiles(omitpath,os.sep.join(path.split(os.sep)[:-1])+os.sep) + if (os.path.getsize(path)==0) or (path in omitfiles): + continue + if path.find(".js") != -1 and isHiddenFile(path)==False: + ret.append(path) + elif path.find(".html") != -1 and isHiddenFile(path)==False: + np = processHtml(path) + if np != "": + ret.append(np) + else: + omitfiles = getOmitedFiles(omitpath,path) + for root, dirs, files in os.walk(path): + for f in files: + if (os.path.getsize(root + os.sep + f)==0) or ((root + os.sep + f) in omitfiles): + continue + if f.find(".js") != -1 and isHiddenFile(root + os.sep + f) == False: + ret.append(root + os.sep + f) + elif f.find(".html") != -1 and isHiddenFile(root + os.sep + f) == False: + np=processHtml(root + os.sep + f) + if np != "": + ret.append(np) + else: + continue + return ret + + +def getopt(path): + _opt=[] + _predef=[] + conf = ConfigParser.ConfigParser() + conf.read(path) + for item in conf.options('option'): + _opt.append("%s=%s"%(item,conf.get('option',item))) + for item in conf.options('predef'): + _predef.append("%s=%s"%(item,conf.get('predef',item))) + return "%s %s"%(",".join(_opt),",".join(_predef)) + +def getBlackList(path): + lst={} + conf = ConfigParser.ConfigParser() + conf.read(path) + for item in conf.options('level'): + lst[item]=conf.get('level',item) + return lst + +def printReport(rptstr): + if rptstr=="": + return + array = rptstr.split('\n') + for ln in array: + items = ln.split("***") + if items[1].find("Stopping") != -1: + print items[1] + else: + print "文件:%s\t错误原因:%s\t错误位置:第%s行\t错误语句:%s"%(items[0],items[1],items[2],items[4]) +def processItem(item,blacklst,hp): + itm = item + for key in hp.keys(): + if item[0]+os.sep+item[2] == hp[key]: + itm[0]=os.sep.join(key.split(os.sep)[:-1]) + itm[2]=key.split(os.sep)[-1] + #print "====",itm,"======" + itm.append("error") + for err in blacklst.keys(): + if itm[1].lower().find(err.lower())!=-1: + itm[5] = blacklst[err] + break + return itm +''' +parse jshint output +''' +def splitOutput(rptstr,blacklist,mp): + if rptstr=="": + return + array = rptstr.split('\n') + lst=[] + parsecnt = 0; + parsetotal=len(array) + for ln in array: + #print ln + if ln.find("***") == -1: + continue + items = processItem(ln.split("***"),blacklist,mp) + if items[1].find("Stopping") != -1: + print items[1] + else: + lst.append(items) + parsecnt = parsecnt + 1 + return (lst,parsecnt,parsetotal) +''' +get the table body according to the result-list +''' +def getBody(lst): + files={} + error=0 + warning=0 + ignore=0; + count=0 + for item in lst: + count = count + 1 + if len(item)<6: + continue + if not files.has_key(item[0]): + if item[5] == "ignore": + ignore = ignore + 1 + elif item[5] == "error": + error = error + 1 + files[item[0]] = getLine(item,count) + else: + files[item[0]] = getLine(item,count) + warning = warning + 1 + else: + if item[5] == "ignore": + ignore = ignore + 1 + elif item[5] == "error": + error = error + 1 + files[item[0]] = files[item[0]] + getLine(item,count) + else: + files[item[0]] = files[item[0]] + getLine(item,count) + warning = warning + 1 + return (files,ignore,warning,error) + +def generateHtml(rptstr,outfile,blacklst,mp): + print "start parsing jshint output..." + (lst,parsecnt,parsetotal) = splitOutput(rptstr,blacklst,mp) + print "prepare main tpl..." + tpl="" + tplPath=os.sep.join(os.path.abspath(__file__).split(os.sep)[:-1])+os.sep+"core"+os.sep+"tpl"+os.sep+"toggle_tpl.html" + if not os.path.exists(tplPath): + raise Exception('%s file does not exists!'%(tplPath)) + f=open(tplPath,"r") + if f is None: + raise Exception('open %s error!' % (tplPath)) + for ln in f: + tpl+=ln + strStartTime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()) + tpl=tpl.replace("{$pnumber}",str(len(lst))) + tpl=tpl.replace("{$timeData}",strStartTime) + f.close() + print "blacklist filtering..." + (files,ignore,warning,error) = getBody(lst) + tpl=tpl.replace("{$ignumber}","%s(%5.1f%%)"%(str(ignore),(float(ignore)/len(lst)*100))) + tpl=tpl.replace("{$errnumber}","%s(%5.1f%%)"%(str(error),(float(error)/len(lst)*100))) + tpl=tpl.replace("{$warnumber}","%s(%5.1f%%)"%(str(warning),(float(warning)/len(lst)*100))) + print "prepare body" + bodys="" + for key in files: + tblPath=os.sep.join(os.path.abspath(__file__).split(os.sep)[:-1])+os.sep+"core"+os.sep+"tpl"+os.sep+"htmlpart.html" + if not os.path.exists(tblPath): + raise Exception('%s file does not exists!'%(tblPath)) + f=open(tblPath,"r") + body='''''' + for ln in f: + body += ln + body = body.replace("{$title}",key) + body = body.replace("{$fname}",key) + f.close() + body = body.replace("[---to be replaced 2---]",files[key]) + bodys = bodys + body + if bodys=="": + #raise Exception('no report generated') + bodys = "no informatin maybe they are filtered" + tpl=tpl.replace("[---to be replace 1---]",bodys) + ts=str(int(time.time())) + resf=open(outfile,"w") + if resf is None: + raise Exception('open %s error!' % (outfile)) + resf.write(tpl) + resf.close() + print "generate html file %s OK!"%(outfile) + return ts + +def getLine(item,no): + #print item + text = '''%s%s%s%s%s'''%(str(no),item[5],item[1],item[2],item[4].replace("<","<").replace(">",">")) + return text + +def genReport(status,output,blackpath,outfile,htmlMap): + #if status == 0: + # print "[WARNING][NO ERROR DETECTED BY JSHUNTER]" + #else: + if output.find("open file") != -1: + raise Exception("File Not Found Error!") + print "[ERROR DETECTED BY JSHUNTER]" + blacklist = getBlackList(blackpath) + ts = generateHtml(output,outfile,blacklist,htmlMap) + return ts + +def checkJavaExist(): + cmd="java" + (status,output) = commands.getstatusoutput(cmd) + if status != 0: + raise Exception("jshunter depend on java enviroment.please make sure your java is OK") +def checkPythonExist(): + cmd="python -h" + (status,output) = commands.getstatusoutput(cmd) + if status != 0: + raise Exception("jshunter depend on python enviroment.please make sure your python is OK") + +def getCustomerCheckFiles(paths): + omitpath = os.path.dirname(__file__) + os.sep + "conf" + os.sep + "omitfiles.conf" + ret = [] + for path in paths: + path = path.rstrip(os.sep) + if not os.path.isdir(path): + omitfiles = getOmitedFiles(omitpath,os.sep.join(path.split(os.sep)[:-1])+os.sep) + if ((os.path.getsize(path)==0) or (path in omitfiles)): + continue + ret.append(path) + else: + omitfiles = getOmitedFiles(omitpath,path) + for root, dirs, files in os.walk(path): + for f in files: + if (os.path.getsize(root + os.sep + f)==0) or ((root + os.sep + f) in omitfiles): + continue + else: + ret.append(root + os.sep + f) + return ret +def getOmitedFiles(confpath,topdir): + _res = [] + _opt = [] + conf = ConfigParser.ConfigParser() + conf.read(confpath) + for item in conf.options('omitfils'): + if conf.get('omitfils',item) == "true": + _opt.append(item) + if (not os.path.isdir(topdir)) and (len(_opt) > 0): + return [] + for item in _opt: + cmd = 'find %s -name "%s"'%(topdir,item) + #print cmd + (status,output) = commands.getstatusoutput(cmd) + if status != 0: + raise Exception("[FATAL]cmd failed!%s"%(cmd)) + #print output + for ln in output.split("\n"): + _res.append(ln) + return _res + +def usage(): + print "====================================================================================================================" + print "[Usage]\n./hint outpath.html fileToCheck.js\t\t检查fileToCheck.js这个文件" + print "./hint outpath.html folderToCheck\t\t检查folderToCheck这个目录内的所有js文件和html文件(递归检查)" + print "./hint outpath.html folderToCheck/*.js\t\t检查folderToCheck一级目录下的所有js文件和html文件(忽略目录)" + print "[Notice]使用时请确保当前目录中包含jshint.js文件,建议cd到jshunter的目录中执行./hint.py" + print "[Contact] pankai01@baidu.com liulanying01@baidu.com" + print "====================================================================================================================" + +def doJsHint(_path): + fileToCheck=getFiles(_path) + step = 50 + javapath = "java" + jsjar = os.path.dirname(__file__) + os.sep + "core" + os.sep + "jshint" + os.sep + "js.jar" + rhino = os.path.dirname(__file__) + os.sep + "core" + os.sep + "jshint" + os.sep + "jshint-rhino.js" + confpath = os.path.dirname(__file__) + os.sep + "conf" + os.sep + "check.cfg" + blackpath = os.path.dirname(__file__) + os.sep + "conf" + os.sep + "ignore.list" + opt = getopt(confpath) + sz = len(fileToCheck) + if sz <= 0: + print "[WARNING]no file to be checked in doJsHint" + return "" + print "Files to be checked Number: %d"%(sz) + for i in range(0,sz): + print (i+1),":",fileToCheck[i] + output="" + if sz <= step: + opt = "%s %s"%(getopt(confpath)," ".join(fileToCheck[:])) + cmd = "%s -jar %s %s %s %s"%(javapath,jsjar,rhino,os.path.dirname(__file__) + os.sep,opt) + (status,output) = commands.getstatusoutput(cmd) + else: + rd=sz/step+1 + for j in range(0,rd): + if (j+1)*step>sz: + opt = "%s %s"%(getopt(confpath)," ".join(fileToCheck[j*step:sz])) + else: + opt = "%s %s"%(getopt(confpath)," ".join(fileToCheck[j*step:(j+1)*step])) + cmd = "%s -jar %s %s %s %s"%(javapath,jsjar,rhino,os.path.dirname(__file__) + os.sep,opt) + (status,output_tmp)=commands.getstatusoutput(cmd) + if status != 0 and output_tmp.find("open file") != -1: + raise Exception("File Not Found Error.ERRMSG:%s\n"%(output_tmp)) + else: + output = output + output_tmp + print "Finish %5.1f%%"%((j+1)*float(str(step))/sz*100.0) + return output + +def doCustomerCheck(_path): + confpath = os.path.dirname(__file__) + os.sep + "conf" + os.sep + "custcheck.conf" + custpath = os.path.dirname(__file__) + os.sep + "core" + os.sep + "customcheck" + os.sep + ops = getCustCheckOpt(confpath) + fileToCheck = getCustomerCheckFiles(_path) + sz = len(fileToCheck) + if sz == 0: + print "[WARNING]no file to be checked in doCustomerCheck" + return "" + custout = '' + #print ops + for item in ops: + for i in range(0,sz): + cmd = "%s %s"%(custpath+item,fileToCheck[i]) + #print cmd + (status,output_tmp)=commands.getstatusoutput(cmd) + for ln in output_tmp.split("\n"): + #print ln + if ln.find("***") != -1: + custout += (ln+"\n") + + #print custout + return custout + +def getCustCheckOpt(path): + _opt=[] + conf = ConfigParser.ConfigParser() + conf.read(path) + for item in conf.options('command'): + if conf.get('command',item) == "true": + _opt.append(item) + return _opt + +if __name__ == "__main__": + try: + #checkJavaExist() + #checkPythonExist() + #print "check enviroment ok" + if len(sys.argv) < 3: + usage() + raise Exception("arg number error!") + outfile=sys.argv[1] + if os.path.exists(outfile): + raise Exception('%s already exist!In order to avoid overwrite the file,please change a none-exist file!'%(outfile)) + blackpath = os.path.dirname(__file__) + os.sep + "conf" + os.sep + "ignore.list" + filepath = sys.argv[2:] + output1 = doJsHint(filepath) + output2 = doCustomerCheck(filepath) + output = output1 + output2 + if output != "": + ts = genReport(0,output,blackpath,outfile,htmlMap) + else: + print "[WARNING]%s"%("no error detected") + clearTmpFiles() + except Exception,err: + print "[FATAL]%s"%(err) + clearTmpFiles() + sys.exit(1) diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/lib/jshunter_1.2.0.1/jshunter_dev/jshunter/jshint.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/lib/jshunter_1.2.0.1/jshunter_dev/jshunter/jshint.js new file mode 100644 index 000000000..9b08c0df1 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/lib/jshunter_1.2.0.1/jshunter_dev/jshunter/jshint.js @@ -0,0 +1,4278 @@ +/*! + * JSHint, by JSHint Community. + * + * Licensed under the same slightly modified MIT license that JSLint is. + * It stops evil-doers everywhere. + * + * JSHint is a derivative work of JSLint: + * + * Copyright (c) 2002 Douglas Crockford (www.JSLint.com) + * + * 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 shall be used for Good, not Evil. + * + * 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. + * + * JSHint was forked from 2010-12-16 edition of JSLint. + * + */ + +/* + JSHINT is a global function. It takes two parameters. + + var myResult = JSHINT(source, option); + + The first parameter is either a string or an array of strings. If it is a + string, it will be split on '\n' or '\r'. If it is an array of strings, it + is assumed that each string represents one line. The source can be a + JavaScript text or a JSON text. + + The second parameter is an optional object of options which control the + operation of JSHINT. Most of the options are booleans: They are all + optional and have a default value of false. One of the options, predef, + can be an array of names, which will be used to declare global variables, + or an object whose keys are used as global names, with a boolean value + that determines if they are assignable. + + If it checks out, JSHINT returns true. Otherwise, it returns false. + + If false, you can inspect JSHINT.errors to find out the problems. + JSHINT.errors is an array of objects containing these members: + + { + line : The line (relative to 0) at which the lint was found + character : The character (relative to 0) at which the lint was found + reason : The problem + evidence : The text line in which the problem occurred + raw : The raw message before the details were inserted + a : The first detail + b : The second detail + c : The third detail + d : The fourth detail + } + + If a fatal error was found, a null will be the last element of the + JSHINT.errors array. + + You can request a Function Report, which shows all of the functions + and the parameters and vars that they use. This can be used to find + implied global variables and other problems. The report is in HTML and + can be inserted in an HTML . + + var myReport = JSHINT.report(limited); + + If limited is true, then the report will be limited to only errors. + + You can request a data structure which contains JSHint's results. + + var myData = JSHINT.data(); + + It returns a structure with this form: + + { + errors: [ + { + line: NUMBER, + character: NUMBER, + reason: STRING, + evidence: STRING + } + ], + functions: [ + name: STRING, + line: NUMBER, + last: NUMBER, + param: [ + STRING + ], + closure: [ + STRING + ], + var: [ + STRING + ], + exception: [ + STRING + ], + outer: [ + STRING + ], + unused: [ + STRING + ], + global: [ + STRING + ], + label: [ + STRING + ] + ], + globals: [ + STRING + ], + member: { + STRING: NUMBER + }, + unuseds: [ + { + name: STRING, + line: NUMBER + } + ], + implieds: [ + { + name: STRING, + line: NUMBER + } + ], + urls: [ + STRING + ], + json: BOOLEAN + } + + Empty arrays will not be included. + +*/ + +/*jshint + evil: false, nomen: false, onevar: true, regexp: false, strict: false, boss: true, eqeqeq : false,bitwise: false,newcap: false,white: false, asi: true,trailing: false,funcscope: false,noarg:true,sub:true,loopfunc:true, +onevar: true, esnext: true,debug: false,laxbreak: trueundef: true, maxlen: 100, indent:4 +*/ + +/*members "\b", "\t", "\n", "\f", "\r", "!=", "!==", "\"", "%", "(begin)", + "(breakage)", "(context)", "(error)", "(global)", "(identifier)", "(last)", + "(line)", "(loopage)", "(name)", "(onevar)", "(params)", "(scope)", + "(statement)", "(verb)", "*", "+", "++", "-", "--", "\/", "<", "<=", "==", + "===", ">", ">=", $, $$, $A, $F, $H, $R, $break, $continue, $w, Abstract, Ajax, + __filename, __dirname, ActiveXObject, Array, ArrayBuffer, ArrayBufferView, Audio, + Autocompleter, Assets, Boolean, Builder, Buffer, Browser, COM, CScript, Canvas, + CustomAnimation, Class, Control, Chain, Color, Cookie, Core, DataView, Date, + Debug, Draggable, Draggables, Droppables, Document, DomReady, DOMReady, Drag, + E, Enumerator, Enumerable, Element, Elements, Error, Effect, EvalError, Event, + Events, FadeAnimation, Field, Flash, Float32Array, Float64Array, Form, + FormField, Frame, FormData, Function, Fx, GetObject, Group, Hash, HotKey, + HTMLElement, HTMLAnchorElement, HTMLBaseElement, HTMLBlockquoteElement, + HTMLBodyElement, HTMLBRElement, HTMLButtonElement, HTMLCanvasElement, HTMLDirectoryElement, + HTMLDivElement, HTMLDListElement, HTMLFieldSetElement, + HTMLFontElement, HTMLFormElement, HTMLFrameElement, HTMLFrameSetElement, + HTMLHeadElement, HTMLHeadingElement, HTMLHRElement, HTMLHtmlElement, + HTMLIFrameElement, HTMLImageElement, HTMLInputElement, HTMLIsIndexElement, + HTMLLabelElement, HTMLLayerElement, HTMLLegendElement, HTMLLIElement, + HTMLLinkElement, HTMLMapElement, HTMLMenuElement, HTMLMetaElement, + HTMLModElement, HTMLObjectElement, HTMLOListElement, HTMLOptGroupElement, + HTMLOptionElement, HTMLParagraphElement, HTMLParamElement, HTMLPreElement, + HTMLQuoteElement, HTMLScriptElement, HTMLSelectElement, HTMLStyleElement, + HtmlTable, HTMLTableCaptionElement, HTMLTableCellElement, HTMLTableColElement, + HTMLTableElement, HTMLTableRowElement, HTMLTableSectionElement, + HTMLTextAreaElement, HTMLTitleElement, HTMLUListElement, HTMLVideoElement + Iframe, IframeShim, Image, Int16Array, Int32Array, Int8Array, + Insertion, InputValidator, JSON, Keyboard, Locale, LN10, LN2, LOG10E, LOG2E, + MAX_VALUE, MIN_VALUE, Mask, Math, MenuItem, MoveAnimation, MooTools, Native, + NEGATIVE_INFINITY, Number, Object, ObjectRange, Option, Options, OverText, PI, + POSITIVE_INFINITY, PeriodicalExecuter, Point, Position, Prototype, RangeError, + Rectangle, ReferenceError, RegExp, ResizeAnimation, Request, RotateAnimation, + SQRT1_2, SQRT2, ScrollBar, ScriptEngine, ScriptEngineBuildVersion, + ScriptEngineMajorVersion, ScriptEngineMinorVersion, Scriptaculous, Scroller, + Slick, Slider, Selector, SharedWorker, String, Style, SyntaxError, Sortable, Sortables, + SortableObserver, Sound, Spinner, System, Swiff, Text, TextArea, Template, + Timer, Tips, Type, TypeError, Toggle, Try, "use strict", unescape, URI, URIError, URL, + VBArray, WSH, WScript, XDomainRequest, Web, Window, XMLDOM, XMLHttpRequest, XPathEvaluator, + XPathException, XPathExpression, XPathNamespace, XPathNSResolver, XPathResult, "\\", a, + addEventListener, address, alert, apply, applicationCache, arguments, arity, + asi, b, bitwise, block, blur, boolOptions, boss, browser, c, call, callee, + caller, cases, charAt, charCodeAt, character, clearInterval, clearTimeout, + close, closed, closure, comment, condition, confirm, console, constructor, + content, couch, create, css, curly, d, data, datalist, dd, debug, decodeURI, + decodeURIComponent, defaultStatus, defineClass, deserialize, devel, document, + dojo, dijit, dojox, define, edition, else, emit, encodeURI, encodeURIComponent, + entityify, eqeqeq, eqnull, errors, es5, escape, esnext, eval, event, evidence, evil, + ex, exception, exec, exps, expr, exports, FileReader, first, floor, focus, + forin, fragment, frames, from, fromCharCode, fud, funcscope, funct, function, functions, + g, gc, getComputedStyle, getRow, GLOBAL, global, globals, globalstrict, + hasOwnProperty, help, history, i, id, identifier, immed, implieds, importPackage, include, + indent, indexOf, init, ins, instanceOf, isAlpha, isApplicationRunning, isArray, + isDigit, isFinite, isNaN, iterator, java, join, jshint, + JSHINT, json, jquery, jQuery, keys, label, labelled, last, lastsemic, laxbreak, + latedef, lbp, led, left, length, line, load, loadClass, localStorage, location, + log, loopfunc, m, match, maxerr, maxlen, member,message, meta, module, moveBy, + moveTo, mootools, multistr, name, navigator, new, newcap, noarg, node, noempty, nomen, + nonew, nonstandard, nud, onbeforeunload, onblur, onerror, onevar, onecase, onfocus, + onload, onresize, onunload, open, openDatabase, openURL, opener, opera, options, outer, param, + parent, parseFloat, parseInt, passfail, plusplus, predef, print, process, prompt, + proto, prototype, prototypejs, push, quit, range, raw, reach, reason, regexp, + readFile, readUrl, regexdash, removeEventListener, replace, report, require, + reserved, resizeBy, resizeTo, resolvePath, resumeUpdates, respond, rhino, right, + runCommand, scroll, screen, scripturl, scrollBy, scrollTo, scrollbar, search, seal, + send, serialize, sessionStorage, setInterval, setTimeout, shift, slice, sort,spawn, + split, stack, status, start, strict, sub, substr, supernew, shadow, supplant, sum, + sync, test, toLowerCase, toString, toUpperCase, toint32, token, top, trailing, type, + typeOf, Uint16Array, Uint32Array, Uint8Array, undef, unused, urls, validthis, value, valueOf, + var, version, WebSocket, white, window, Worker, wsh*/ + +/*global exports: false */ + +// We build the application inside a function so that we produce only a single +// global variable. That function will be invoked immediately, and its return +// value is the JSHINT function itself. + +var JSHINT = (function () { + "use strict"; + + var anonname, // The guessed name for anonymous functions. + +// These are operators that should not be used with the ! operator. + + bang = { + '<' : true, + '<=' : true, + '==' : true, + '===': true, + '!==': true, + '!=' : true, + '>' : true, + '>=' : true, + '+' : true, + '-' : true, + '*' : true, + '/' : true, + '%' : true + }, + + // These are the JSHint boolean options. + boolOptions = { + asi : true, // if automatic semicolon insertion should be tolerated + bitwise : true, // if bitwise operators should not be allowed + boss : true, // if advanced usage of assignments should be allowed + browser : true, // if the standard browser globals should be predefined + couch : true, // if CouchDB globals should be predefined + curly : true, // if curly braces around all blocks should be required + debug : true, // if debugger statements should be allowed + devel : true, // if logging globals should be predefined (console, + // alert, etc.) + dojo : true, // if Dojo Toolkit globals should be predefined + eqeqeq : true, // if === should be required + eqnull : true, // if == null comparisons should be tolerated + es5 : true, // if ES5 syntax should be allowed + esnext : true, // if es.next specific syntax should be allowed + evil : true, // if eval should be allowed + expr : true, // if ExpressionStatement should be allowed as Programs + forin : true, // if for in statements must filter + funcscope : true, // if only function scope should be used for scope tests + globalstrict: true, // if global "use strict"; should be allowed (also + // enables 'strict') + immed : true, // if immediate invocations must be wrapped in parens + iterator : true, // if the `__iterator__` property should be allowed + jquery : true, // if jQuery globals should be predefined + lastsemic : true, // if semicolons may be ommitted for the trailing + // statements inside of a one-line blocks. + latedef : true, // if the use before definition should not be tolerated + laxbreak : true, // if line breaks should not be checked + loopfunc : true, // if functions should be allowed to be defined within + // loops + mootools : true, // if MooTools globals should be predefined + multistr : true, // allow multiline strings + newcap : true, // if constructor names must be capitalized + noarg : true, // if arguments.caller and arguments.callee should be + // disallowed + node : true, // if the Node.js environment globals should be + // predefined + noempty : true, // if empty blocks should be disallowed + nonew : true, // if using `new` for side-effects should be disallowed + nonstandard : true, // if non-standard (but widely adopted) globals should + // be predefined + nomen : true, // if names should be checked + onevar : true, // if only one var statement per function should be + // allowed + onecase : true, // if one case switch statements should be allowed + passfail : true, // if the scan should stop on first error + plusplus : true, // if increment/decrement should not be allowed + proto : true, // if the `__proto__` property should be allowed + prototypejs : true, // if Prototype and Scriptaculous globals should be + // predefined + regexdash : true, // if unescaped first/last dash (-) inside brackets + // should be tolerated + regexp : true, // if the . should not be allowed in regexp literals + rhino : true, // if the Rhino environment globals should be predefined + undef : true, // if variables should be declared before used + scripturl : true, // if script-targeted URLs should be tolerated + shadow : true, // if variable shadowing should be tolerated + strict : true, // require the "use strict"; pragma + sub : true, // if all forms of subscript notation are tolerated + supernew : true, // if `new function () { ... };` and `new Object;` + // should be tolerated + trailing : true, // if trailing whitespace rules apply + validthis : true, // if 'this' inside a non-constructor function is valid. + // This is a function scoped option only. + white : true, // if strict whitespace rules apply + wsh : true // if the Windows Scripting Host environment globals + // should be predefined + }, + + // browser contains a set of global names which are commonly provided by a + // web browser environment. + browser = { + ArrayBuffer : false, + ArrayBufferView : false, + Audio : false, + addEventListener : false, + applicationCache : false, + blur : false, + clearInterval : false, + clearTimeout : false, + close : false, + closed : false, + DataView : false, + defaultStatus : false, + document : false, + event : false, + FileReader : false, + Float32Array : false, + Float64Array : false, + FormData : false, + focus : false, + frames : false, + getComputedStyle : false, + HTMLElement : false, + HTMLAnchorElement : false, + HTMLBaseElement : false, + HTMLBlockquoteElement : false, + HTMLBodyElement : false, + HTMLBRElement : false, + HTMLButtonElement : false, + HTMLCanvasElement : false, + HTMLDirectoryElement : false, + HTMLDivElement : false, + HTMLDListElement : false, + HTMLFieldSetElement : false, + HTMLFontElement : false, + HTMLFormElement : false, + HTMLFrameElement : false, + HTMLFrameSetElement : false, + HTMLHeadElement : false, + HTMLHeadingElement : false, + HTMLHRElement : false, + HTMLHtmlElement : false, + HTMLIFrameElement : false, + HTMLImageElement : false, + HTMLInputElement : false, + HTMLIsIndexElement : false, + HTMLLabelElement : false, + HTMLLayerElement : false, + HTMLLegendElement : false, + HTMLLIElement : false, + HTMLLinkElement : false, + HTMLMapElement : false, + HTMLMenuElement : false, + HTMLMetaElement : false, + HTMLModElement : false, + HTMLObjectElement : false, + HTMLOListElement : false, + HTMLOptGroupElement : false, + HTMLOptionElement : false, + HTMLParagraphElement : false, + HTMLParamElement : false, + HTMLPreElement : false, + HTMLQuoteElement : false, + HTMLScriptElement : false, + HTMLSelectElement : false, + HTMLStyleElement : false, + HTMLTableCaptionElement : false, + HTMLTableCellElement : false, + HTMLTableColElement : false, + HTMLTableElement : false, + HTMLTableRowElement : false, + HTMLTableSectionElement : false, + HTMLTextAreaElement : false, + HTMLTitleElement : false, + HTMLUListElement : false, + HTMLVideoElement : false, + history : false, + Int16Array : false, + Int32Array : false, + Int8Array : false, + Image : false, + length : false, + localStorage : false, + location : false, + moveBy : false, + moveTo : false, + name : false, + navigator : false, + onbeforeunload : true, + onblur : true, + onerror : true, + onfocus : true, + onload : true, + onresize : true, + onunload : true, + open : false, + openDatabase : false, + opener : false, + Option : false, + parent : false, + print : false, + removeEventListener : false, + resizeBy : false, + resizeTo : false, + screen : false, + scroll : false, + scrollBy : false, + scrollTo : false, + sessionStorage : false, + setInterval : false, + setTimeout : false, + SharedWorker : false, + status : false, + top : false, + Uint16Array : false, + Uint32Array : false, + Uint8Array : false, + WebSocket : false, + window : false, + Worker : false, + XMLHttpRequest : false, + XPathEvaluator : false, + XPathException : false, + XPathExpression : false, + XPathNamespace : false, + XPathNSResolver : false, + XPathResult : false + }, + + couch = { + "require" : false, + respond : false, + getRow : false, + emit : false, + send : false, + start : false, + sum : false, + log : false, + exports : false, + module : false + }, + + devel = { + alert : false, + confirm : false, + console : false, + Debug : false, + opera : false, + prompt : false + }, + + dojo = { + dojo : false, + dijit : false, + dojox : false, + define : false, + "require" : false + }, + + escapes = { + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '"' : '\\"', + '/' : '\\/', + '\\': '\\\\' + }, + + funct, // The current function + + functionicity = [ + 'closure', 'exception', 'global', 'label', + 'outer', 'unused', 'var' + ], + + functions, // All of the functions + + global, // The global scope + implied, // Implied globals + inblock, + indent, + jsonmode, + + jquery = { + '$' : false, + jQuery : false + }, + + lines, + lookahead, + member, + membersOnly, + + mootools = { + '$' : false, + '$$' : false, + Assets : false, + Browser : false, + Chain : false, + Class : false, + Color : false, + Cookie : false, + Core : false, + Document : false, + DomReady : false, + DOMReady : false, + Drag : false, + Element : false, + Elements : false, + Event : false, + Events : false, + Fx : false, + Group : false, + Hash : false, + HtmlTable : false, + Iframe : false, + IframeShim : false, + InputValidator : false, + instanceOf : false, + Keyboard : false, + Locale : false, + Mask : false, + MooTools : false, + Native : false, + Options : false, + OverText : false, + Request : false, + Scroller : false, + Slick : false, + Slider : false, + Sortables : false, + Spinner : false, + Swiff : false, + Tips : false, + Type : false, + typeOf : false, + URI : false, + Window : false + }, + + nexttoken, + + node = { + __filename : false, + __dirname : false, + Buffer : false, + console : false, + exports : false, + GLOBAL : false, + global : false, + module : false, + process : false, + require : false, + setTimeout : false, + clearTimeout : false, + setInterval : false, + clearInterval : false + }, + + noreach, + option, + predefined, // Global variables defined by option + prereg, + prevtoken, + + prototypejs = { + '$' : false, + '$$' : false, + '$A' : false, + '$F' : false, + '$H' : false, + '$R' : false, + '$break' : false, + '$continue' : false, + '$w' : false, + Abstract : false, + Ajax : false, + Class : false, + Enumerable : false, + Element : false, + Event : false, + Field : false, + Form : false, + Hash : false, + Insertion : false, + ObjectRange : false, + PeriodicalExecuter: false, + Position : false, + Prototype : false, + Selector : false, + Template : false, + Toggle : false, + Try : false, + Autocompleter : false, + Builder : false, + Control : false, + Draggable : false, + Draggables : false, + Droppables : false, + Effect : false, + Sortable : false, + SortableObserver : false, + Sound : false, + Scriptaculous : false + }, + + rhino = { + defineClass : false, + deserialize : false, + gc : false, + help : false, + importPackage: false, + "java" : false, + load : false, + loadClass : false, + print : false, + quit : false, + readFile : false, + readUrl : false, + runCommand : false, + seal : false, + serialize : false, + spawn : false, + sync : false, + toint32 : false, + version : false + }, + + scope, // The current scope + src, + stack, + + // standard contains the global names that are provided by the + // ECMAScript standard. + standard = { + Array : false, + Boolean : false, + Date : false, + decodeURI : false, + decodeURIComponent : false, + encodeURI : false, + encodeURIComponent : false, + Error : false, + 'eval' : false, + EvalError : false, + Function : false, + hasOwnProperty : false, + isFinite : false, + isNaN : false, + JSON : false, + Math : false, + Number : false, + Object : false, + parseInt : false, + parseFloat : false, + RangeError : false, + ReferenceError : false, + RegExp : false, + String : false, + SyntaxError : false, + TypeError : false, + URIError : false + }, + + // widely adopted global names that are not part of ECMAScript standard + nonstandard = { + escape : false, + unescape : false + }, + + standard_member = { + E : true, + LN2 : true, + LN10 : true, + LOG2E : true, + LOG10E : true, + MAX_VALUE : true, + MIN_VALUE : true, + NEGATIVE_INFINITY : true, + PI : true, + POSITIVE_INFINITY : true, + SQRT1_2 : true, + SQRT2 : true + }, + + directive, + syntax = {}, + tab, + token, + urls, + useESNextSyntax, + warnings, + + wsh = { + ActiveXObject : true, + Enumerator : true, + GetObject : true, + ScriptEngine : true, + ScriptEngineBuildVersion : true, + ScriptEngineMajorVersion : true, + ScriptEngineMinorVersion : true, + VBArray : true, + WSH : true, + WScript : true, + XDomainRequest : true + }; + + // Regular expressions. Some of these are stupidly long. + var ax, cx, tx, nx, nxg, lx, ix, jx, ft; + (function () { + /*jshint maxlen:300 */ + + // unsafe comment or string + ax = /@cc|<\/?|script|\]\s*\]|<\s*!|</i; + + // unsafe characters that are silently deleted by one or more browsers + cx = /[\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/; + + // token + tx = /^\s*([(){}\[.,:;'"~\?\]#@]|==?=?|\/(\*(jshint|jslint|members?|global)?|=|\/)?|\*[\/=]?|\+(?:=|\++)?|-(?:=|-+)?|%=?|&[&=]?|\|[|=]?|>>?>?=?|<([\/=!]|\!(\[|--)?|<=?)?|\^=?|\!=?=?|[a-zA-Z_$][a-zA-Z0-9_$]*|[0-9]+([xX][0-9a-fA-F]+|\.[0-9]*)?([eE][+\-]?[0-9]+)?)/; + + // characters in strings that need escapement + nx = /[\u0000-\u001f&<"\/\\\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/; + nxg = /[\u0000-\u001f&<"\/\\\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g; + + // star slash + lx = /\*\/|\/\*/; + + // identifier + ix = /^([a-zA-Z_$][a-zA-Z0-9_$]*)$/; + + // javascript url + jx = /^(?:javascript|jscript|ecmascript|vbscript|mocha|livescript)\s*:/i; + + // catches /* falls through */ comments + ft = /^\s*\/\*\s*falls\sthrough\s*\*\/\s*$/; + }()); + + function F() {} // Used by Object.create + + function is_own(object, name) { + +// The object.hasOwnProperty method fails when the property under consideration +// is named 'hasOwnProperty'. So we have to use this more convoluted form. + + return Object.prototype.hasOwnProperty.call(object, name); + } + +// Provide critical ES5 functions to ES3. + + if (typeof Array.isArray !== 'function') { + Array.isArray = function (o) { + return Object.prototype.toString.apply(o) === '[object Array]'; + }; + } + + if (typeof Object.create !== 'function') { + Object.create = function (o) { + F.prototype = o; + return new F(); + }; + } + + if (typeof Object.keys !== 'function') { + Object.keys = function (o) { + var a = [], k; + for (k in o) { + if (is_own(o, k)) { + a.push(k); + } + } + return a; + }; + } + +// Non standard methods + + if (typeof String.prototype.entityify !== 'function') { + String.prototype.entityify = function () { + return this + .replace(/&/g, '&') + .replace(//g, '>'); + }; + } + + if (typeof String.prototype.isAlpha !== 'function') { + String.prototype.isAlpha = function () { + return (this >= 'a' && this <= 'z\uffff') || + (this >= 'A' && this <= 'Z\uffff'); + }; + } + + if (typeof String.prototype.isDigit !== 'function') { + String.prototype.isDigit = function () { + return (this >= '0' && this <= '9'); + }; + } + + if (typeof String.prototype.supplant !== 'function') { + String.prototype.supplant = function (o) { + return this.replace(/\{([^{}]*)\}/g, function (a, b) { + var r = o[b]; + return typeof r === 'string' || typeof r === 'number' ? r : a; + }); + }; + } + + if (typeof String.prototype.name !== 'function') { + String.prototype.name = function () { + +// If the string looks like an identifier, then we can return it as is. +// If the string contains no control characters, no quote characters, and no +// backslash characters, then we can simply slap some quotes around it. +// Otherwise we must also replace the offending characters with safe +// sequences. + + if (ix.test(this)) { + return this; + } + if (nx.test(this)) { + return '"' + this.replace(nxg, function (a) { + var c = escapes[a]; + if (c) { + return c; + } + return '\\u' + ('0000' + a.charCodeAt().toString(16)).slice(-4); + }) + '"'; + } + return '"' + this + '"'; + }; + } + + + function combine(t, o) { + var n; + for (n in o) { + if (is_own(o, n)) { + t[n] = o[n]; + } + } + } + + function assume() { + if (option.couch) { + combine(predefined, couch); + } + + if (option.rhino) { + combine(predefined, rhino); + } + + if (option.prototypejs) { + combine(predefined, prototypejs); + } + + if (option.node) { + combine(predefined, node); + } + + if (option.devel) { + combine(predefined, devel); + } + + if (option.dojo) { + combine(predefined, dojo); + } + + if (option.browser) { + combine(predefined, browser); + } + + if (option.nonstandard) { + combine(predefined, nonstandard); + } + + if (option.jquery) { + combine(predefined, jquery); + } + + if (option.mootools) { + combine(predefined, mootools); + } + + if (option.wsh) { + combine(predefined, wsh); + } + + if (option.esnext) { + useESNextSyntax(); + } + + if (option.globalstrict && option.strict !== false) { + option.strict = true; + } + } + + + // Produce an error warning. + function quit(message, line, chr) { + var percentage = Math.floor((line / lines.length) * 100); + + throw { + name: 'JSHintError', + line: line, + character: chr, + message: message + " (" + percentage + "% scanned)." + }; + } + + function warning(m, t, a, b, c, d) { + var ch, l, w; + t = t || nexttoken; + if (t.id === '(end)') { // `~ + t = token; + } + l = t.line || 0; + ch = t.from || 0; + w = { + id: '(error)', + raw: m, + evidence: lines[l - 1] || '', + line: l, + character: ch, + a: a, + b: b, + c: c, + d: d + }; + w.reason = m.supplant(w); + JSHINT.errors.push(w); + if (option.passfail) { + quit('Stopping. ', l, ch); + } + warnings += 1; + if (warnings >= option.maxerr) { + quit("Too many errors.", l, ch); + } + return w; + } + + function warningAt(m, l, ch, a, b, c, d) { + return warning(m, { + line: l, + from: ch + }, a, b, c, d); + } + + function error(m, t, a, b, c, d) { + var w = warning(m, t, a, b, c, d); + } + + function errorAt(m, l, ch, a, b, c, d) { + return error(m, { + line: l, + from: ch + }, a, b, c, d); + } + + + +// lexical analysis and token construction + + var lex = (function lex() { + var character, from, line, s; + +// Private lex methods + + function nextLine() { + var at, + tw; // trailing whitespace check + + if (line >= lines.length) + return false; + + character = 1; + s = lines[line]; + line += 1; + at = s.search(/ \t|\t /); + + if (at >= 0) + warningAt("Mixed spaces and tabs.", line, at + 1); + + s = s.replace(/\t/g, tab); + at = s.search(cx); + + if (at >= 0) + warningAt("Unsafe character.", line, at); + + if (option.maxlen && option.maxlen < s.length) + warningAt("Line too long.", line, s.length); + + // Check for trailing whitespaces + tw = /\s+$/.test(s); + if (option.trailing && tw && !/^\s+$/.test(s)) { + warningAt("Trailing whitespace.", line, tw); + } + return true; + } + +// Produce a token object. The token inherits from a syntax symbol. + + function it(type, value) { + var i, t; + if (type === '(color)' || type === '(range)') { + t = {type: type}; + } else if (type === '(punctuator)' || + (type === '(identifier)' && is_own(syntax, value))) { + t = syntax[value] || syntax['(error)']; + } else { + t = syntax[type]; + } + t = Object.create(t); + if (type === '(string)' || type === '(range)') { + if (!option.scripturl && jx.test(value)) { + warningAt("Script URL.", line, from); + } + } + if (type === '(identifier)') { + t.identifier = true; + if (value === '__proto__' && !option.proto) { + warningAt("The '{a}' property is deprecated.", + line, from, value); + } else if (value === '__iterator__' && !option.iterator) { + warningAt("'{a}' is only available in JavaScript 1.7.", + line, from, value); + } else if (option.nomen && (value.charAt(0) === '_' || + value.charAt(value.length - 1) === '_')) { + if (!option.node || token.id == '.' || + (value != '__dirname' && value != '__filename')) { + warningAt("Unexpected {a} in '{b}'.", line, from, "dangling '_'", value); + } + } + } + t.value = value; + t.line = line; + t.character = character; + t.from = from; + i = t.id; + if (i !== '(endline)') { + prereg = i && + (('(,=:[!&|?{};'.indexOf(i.charAt(i.length - 1)) >= 0) || + i === 'return' || + i === 'case'); + } + return t; + } + + // Public lex methods + return { + init: function (source) { + if (typeof source === 'string') { + lines = source + .replace(/\r\n/g, '\n') + .replace(/\r/g, '\n') + .split('\n'); + } else { + lines = source; + } + + // If the first line is a shebang (#!), make it a blank and move on. + // Shebangs are used by Node scripts. + if (lines[0] && lines[0].substr(0, 2) == '#!') + lines[0] = ''; + + line = 0; + nextLine(); + from = 1; + }, + + range: function (begin, end) { + var c, value = ''; + from = character; + if (s.charAt(0) !== begin) { + errorAt("Expected '{a}' and instead saw '{b}'.", + line, character, begin, s.charAt(0)); + } + for (;;) { + s = s.slice(1); + character += 1; + c = s.charAt(0); + switch (c) { + case '': + errorAt("Missing '{a}'.", line, character, c); + break; + case end: + s = s.slice(1); + character += 1; + return it('(range)', value); + case '\\': + warningAt("Unexpected '{a}'.", line, character, c); + } + value += c; + } + + }, + + + // token -- this is called by advance to get the next token + token: function () { + var b, c, captures, d, depth, high, i, l, low, q, t, isLiteral, isInRange; + + function match(x) { + var r = x.exec(s), r1; + if (r) { + l = r[0].length; + r1 = r[1]; + c = r1.charAt(0); + s = s.substr(l); + from = character + l - r1.length; + character += l; + return r1; + } + } + + function string(x) { + var c, j, r = '', allowNewLine = false; + + if (jsonmode && x !== '"') { + warningAt("Strings must use doublequote.", + line, character); + } + + function esc(n) { + var i = parseInt(s.substr(j + 1, n), 16); + j += n; + if (i >= 32 && i <= 126 && + i !== 34 && i !== 92 && i !== 39) { + warningAt("Unnecessary escapement.", line, character); + } + character += n; + c = String.fromCharCode(i); + } + j = 0; + for (;;) { + while (j >= s.length) { + j = 0; + if (allowNewLine) { + allowNewLine = false; + } else { + warningAt("Unclosed string.", line, from); + } + if (!nextLine()) { + errorAt("Unclosed string.", line, from); + } + } + c = s.charAt(j); + if (c === x) { + character += 1; + s = s.substr(j + 1); + return it('(string)', r, x); + } + if (c < ' ') { + if (c === '\n' || c === '\r') { + break; + } + warningAt("Control character in string: {a}.", + line, character + j, s.slice(0, j)); + } else if (c === '\\') { + j += 1; + character += 1; + c = s.charAt(j); + switch (c) { + case '\\': + case '"': + case '/': + break; + case '\'': + if (jsonmode) { + warningAt("Avoid \\'.", line, character); + } + break; + case 'b': + c = '\b'; + break; + case 'f': + c = '\f'; + break; + case 'n': + c = '\n'; + break; + case 'r': + c = '\r'; + break; + case 't': + c = '\t'; + break; + case 'u': + esc(4); + break; + case 'v': + if (jsonmode) { + warningAt("Avoid \\v.", line, character); + } + c = '\v'; + break; + case 'x': + if (jsonmode) { + warningAt("Avoid \\x-.", line, character); + } + esc(2); + break; + case '': + // last character is escape character + // always allow new line if escaped, but show + // warning if option is not set + allowNewLine = true; + if (option.multistr) { + if (jsonmode) { + warningAt("Avoid EOL escapement.", line, character); + } + c = ''; + character -= 1; + break; + } + warningAt("Bad escapement of EOL. Use option multistr if needed.", + line, character); + break; + default: + warningAt("Bad escapement.", line, character); + } + } + r += c; + character += 1; + j += 1; + } + } + + for (;;) { + if (!s) { + return it(nextLine() ? '(endline)' : '(end)', ''); + } + t = match(tx); + if (!t) { + t = ''; + c = ''; + while (s && s < '!') { + s = s.substr(1); + } + if (s) { + errorAt("Unexpected '{a}'.", line, character, s.substr(0, 1)); + } + } else { + + // identifier + + if (c.isAlpha() || c === '_' || c === '$') { + return it('(identifier)', t); + } + + // number + + if (c.isDigit()) { + if (!isFinite(Number(t))) { + warningAt("Bad number '{a}'.", + line, character, t); + } + if (s.substr(0, 1).isAlpha()) { + warningAt("Missing space after '{a}'.", + line, character, t); + } + if (c === '0') { + d = t.substr(1, 1); + if (d.isDigit()) { + if (token.id !== '.') { + warningAt("Don't use extra leading zeros '{a}'.", + line, character, t); + } + } else if (jsonmode && (d === 'x' || d === 'X')) { + warningAt("Avoid 0x-. '{a}'.", + line, character, t); + } + } + if (t.substr(t.length - 1) === '.') { + warningAt( +"A trailing decimal point can be confused with a dot '{a}'.", line, character, t); + } + return it('(number)', t); + } + switch (t) { + + // string + + case '"': + case "'": + return string(t); + + // // comment + + case '//': + if (src) { + warningAt("Unexpected comment.", line, character); + } + s = ''; + token.comment = true; + break; + + // /* comment + + case '/*': + if (src) { + warningAt("Unexpected comment.", line, character); + } + for (;;) { + i = s.search(lx); + if (i >= 0) { + break; + } + if (!nextLine()) { + errorAt("Unclosed comment.", line, character); + } + } + character += i + 2; + if (s.substr(i, 1) === '/') { + errorAt("Nested comment.", line, character); + } + s = s.substr(i + 2); + token.comment = true; + break; + + // /*members /*jshint /*global + + case '/*members': + case '/*member': + case '/*jshint': + case '/*jslint': + case '/*global': + case '*/': + return { + value: t, + type: 'special', + line: line, + character: character, + from: from + }; + + case '': + break; + // / + case '/': + if (token.id === '/=') { + errorAt( +"A regular expression literal can be confused with '/='.", line, from); + } + if (prereg) { + depth = 0; + captures = 0; + l = 0; + for (;;) { + b = true; + c = s.charAt(l); + l += 1; + switch (c) { + case '': + errorAt("Unclosed regular expression.", + line, from); + return; + case '/': + if (depth > 0) { + warningAt("Unescaped '{a}'.", + line, from + l, '/'); + } + c = s.substr(0, l - 1); + q = { + g: true, + i: true, + m: true + }; + while (q[s.charAt(l)] === true) { + q[s.charAt(l)] = false; + l += 1; + } + character += l; + s = s.substr(l); + q = s.charAt(0); + if (q === '/' || q === '*') { + errorAt("Confusing regular expression.", + line, from); + } + return it('(regexp)', c); + case '\\': + c = s.charAt(l); + if (c < ' ') { + warningAt( +"Unexpected control character in regular expression.", line, from + l); + } else if (c === '<') { + warningAt( +"Unexpected escaped character '{a}' in regular expression.", line, from + l, c); + } + l += 1; + break; + case '(': + depth += 1; + b = false; + if (s.charAt(l) === '?') { + l += 1; + switch (s.charAt(l)) { + case ':': + case '=': + case '!': + l += 1; + break; + default: + warningAt( +"Expected '{a}' and instead saw '{b}'.", line, from + l, ':', s.charAt(l)); + } + } else { + captures += 1; + } + break; + case '|': + b = false; + break; + case ')': + if (depth === 0) { + warningAt("Unescaped '{a}'.", + line, from + l, ')'); + } else { + depth -= 1; + } + break; + case ' ': + q = 1; + while (s.charAt(l) === ' ') { + l += 1; + q += 1; + } + if (q > 1) { + warningAt( +"Spaces are hard to count. Use {{a}}.", line, from + l, q); + } + break; + case '[': + c = s.charAt(l); + if (c === '^') { + l += 1; + if (option.regexp) { + warningAt("Insecure '{a}'.", + line, from + l, c); + } else if (s.charAt(l) === ']') { + errorAt("Unescaped '{a}'.", + line, from + l, '^'); + } + } + if (c === ']') { + warningAt("Empty class.", line, + from + l - 1); + } + isLiteral = false; + isInRange = false; +klass: do { + c = s.charAt(l); + l += 1; + switch (c) { + case '[': + case '^': + warningAt("Unescaped '{a}'.", + line, from + l, c); + if (isInRange) { + isInRange = false; + } else { + isLiteral = true; + } + break; + case '-': + if (isLiteral && !isInRange) { + isLiteral = false; + isInRange = true; + } else if (isInRange) { + isInRange = false; + } else if (s.charAt(l) === ']') { + isInRange = true; + } else { + if (option.regexdash !== (l === 2 || (l === 3 && + s.charAt(2) === '^'))) { + warningAt("Unescaped '{a}'.", + line, from + l - 1, '-'); + } + isLiteral = true; + } + break; + case ']': + if (isInRange && !option.regexdash) { + warningAt("Unescaped '{a}'.", + line, from + l - 1, '-'); + } + break klass; + case '\\': + c = s.charAt(l); + if (c < ' ') { + warningAt( +"Unexpected control character in regular expression.", line, from + l); + } else if (c === '<') { + warningAt( +"Unexpected escaped character '{a}' in regular expression.", line, from + l, c); + } + l += 1; + + // \w, \s and \d are never part of a character range + if (/[wsd]/i.test(c)) { + if (isInRange) { + warningAt("Unescaped '{a}'.", + line, from + l, '-'); + isInRange = false; + } + isLiteral = false; + } else if (isInRange) { + isInRange = false; + } else { + isLiteral = true; + } + break; + case '/': + warningAt("Unescaped '{a}'.", + line, from + l - 1, '/'); + + if (isInRange) { + isInRange = false; + } else { + isLiteral = true; + } + break; + case '<': + if (isInRange) { + isInRange = false; + } else { + isLiteral = true; + } + break; + default: + if (isInRange) { + isInRange = false; + } else { + isLiteral = true; + } + } + } while (c); + break; + case '.': + if (option.regexp) { + warningAt("Insecure '{a}'.", line, + from + l, c); + } + break; + case ']': + case '?': + case '{': + case '}': + case '+': + case '*': + warningAt("Unescaped '{a}'.", line, + from + l, c); + } + if (b) { + switch (s.charAt(l)) { + case '?': + case '+': + case '*': + l += 1; + if (s.charAt(l) === '?') { + l += 1; + } + break; + case '{': + l += 1; + c = s.charAt(l); + if (c < '0' || c > '9') { + warningAt( +"Expected a number and instead saw '{a}'.", line, from + l, c); + } + l += 1; + low = +c; + for (;;) { + c = s.charAt(l); + if (c < '0' || c > '9') { + break; + } + l += 1; + low = +c + (low * 10); + } + high = low; + if (c === ',') { + l += 1; + high = Infinity; + c = s.charAt(l); + if (c >= '0' && c <= '9') { + l += 1; + high = +c; + for (;;) { + c = s.charAt(l); + if (c < '0' || c > '9') { + break; + } + l += 1; + high = +c + (high * 10); + } + } + } + if (s.charAt(l) !== '}') { + warningAt( +"Expected '{a}' and instead saw '{b}'.", line, from + l, '}', c); + } else { + l += 1; + } + if (s.charAt(l) === '?') { + l += 1; + } + if (low > high) { + warningAt( +"'{a}' should not be greater than '{b}'.", line, from + l, low, high); + } + } + } + } + c = s.substr(0, l - 1); + character += l; + s = s.substr(l); + return it('(regexp)', c); + } + return it('(punctuator)', t); + + // punctuator + + case '#': + return it('(punctuator)', t); + default: + return it('(punctuator)', t); + } + } + } + } + }; + }()); + + + function addlabel(t, type) { + + if (t === 'hasOwnProperty') { + warning("'hasOwnProperty' is a really bad name."); + } + +// Define t in the current function in the current scope. + + if (is_own(funct, t) && !funct['(global)']) { + if (funct[t] === true) { + if (option.latedef) + warning("'{a}' was used before it was defined.", nexttoken, t); + } else { + if (!option.shadow) + warning("'{a}' is already defined.", nexttoken, t); + } + } + + funct[t] = type; + if (funct['(global)']) { + global[t] = funct; + if (is_own(implied, t)) { + if (option.latedef) + warning("'{a}' was used before it was defined.", nexttoken, t); + delete implied[t]; + } + } else { + scope[t] = funct; + } + } + + + function doOption() { + var b, obj, filter, o = nexttoken.value, t, v; + switch (o) { + case '*/': + error("Unbegun comment."); + break; + case '/*members': + case '/*member': + o = '/*members'; + if (!membersOnly) { + membersOnly = {}; + } + obj = membersOnly; + break; + case '/*jshint': + case '/*jslint': + obj = option; + filter = boolOptions; + break; + case '/*global': + obj = predefined; + break; + default: + error("What?"); + } + t = lex.token(); +loop: for (;;) { + for (;;) { + if (t.type === 'special' && t.value === '*/') { + break loop; + } + if (t.id !== '(endline)' && t.id !== ',') { + break; + } + t = lex.token(); + } + if (t.type !== '(string)' && t.type !== '(identifier)' && + o !== '/*members') { + error("Bad option.", t); + } + v = lex.token(); + if (v.id === ':') { + v = lex.token(); + if (obj === membersOnly) { + error("Expected '{a}' and instead saw '{b}'.", + t, '*/', ':'); + } + if (t.value === 'indent' && (o === '/*jshint' || o === '/*jslint')) { + b = +v.value; + if (typeof b !== 'number' || !isFinite(b) || b <= 0 || + Math.floor(b) !== b) { + error("Expected a small integer and instead saw '{a}'.", + v, v.value); + } + obj.white = true; + obj.indent = b; + } else if (t.value === 'maxerr' && (o === '/*jshint' || o === '/*jslint')) { + b = +v.value; + if (typeof b !== 'number' || !isFinite(b) || b <= 0 || + Math.floor(b) !== b) { + error("Expected a small integer and instead saw '{a}'.", + v, v.value); + } + obj.maxerr = b; + } else if (t.value === 'maxlen' && (o === '/*jshint' || o === '/*jslint')) { + b = +v.value; + if (typeof b !== 'number' || !isFinite(b) || b <= 0 || + Math.floor(b) !== b) { + error("Expected a small integer and instead saw '{a}'.", + v, v.value); + } + obj.maxlen = b; + } else if (t.value == 'validthis') { + if (funct['(global)']) { + error("Option 'validthis' can't be used in a global scope."); + } else { + if (v.value === 'true' || v.value === 'false') + obj[t.value] = v.value === 'true'; + else + error("Bad option value.", v); + } + } else if (v.value === 'true') { + obj[t.value] = true; + } else if (v.value === 'false') { + obj[t.value] = false; + } else { + error("Bad option value.", v); + } + t = lex.token(); + } else { + if (o === '/*jshint' || o === '/*jslint') { + error("Missing option value.", t); + } + obj[t.value] = false; + t = v; + } + } + if (filter) { + assume(); + } + } + + +// We need a peek function. If it has an argument, it peeks that much farther +// ahead. It is used to distinguish +// for ( var i in ... +// from +// for ( var i = ... + + function peek(p) { + var i = p || 0, j = 0, t; + + while (j <= i) { + t = lookahead[j]; + if (!t) { + t = lookahead[j] = lex.token(); + } + j += 1; + } + return t; + } + + + +// Produce the next token. It looks for programming errors. + + function advance(id, t) { + switch (token.id) { + case '(number)': + if (nexttoken.id === '.') { + warning("A dot following a number can be confused with a decimal point.", token); + } + break; + case '-': + if (nexttoken.id === '-' || nexttoken.id === '--') { + warning("Confusing minusses."); + } + break; + case '+': + if (nexttoken.id === '+' || nexttoken.id === '++') { + warning("Confusing plusses."); + } + break; + } + + if (token.type === '(string)' || token.identifier) { + anonname = token.value; + } + + if (id && nexttoken.id !== id) { + if (t) { + if (nexttoken.id === '(end)') { + warning("Unmatched '{a}'.", t, t.id); + } else { + warning("Expected '{a}' to match '{b}' from line {c} and instead saw '{d}'.", + nexttoken, id, t.id, t.line, nexttoken.value); + } + } else if (nexttoken.type !== '(identifier)' || + nexttoken.value !== id) { + warning("Expected '{a}' and instead saw '{b}'.", + nexttoken, id, nexttoken.value); + } + } + + prevtoken = token; + token = nexttoken; + for (;;) { + nexttoken = lookahead.shift() || lex.token(); + if (nexttoken.id === '(end)' || nexttoken.id === '(error)') { + return; + } + if (nexttoken.type === 'special') { + doOption(); + } else { + if (nexttoken.id !== '(endline)') { + break; + } + } + } + } + + +// This is the heart of JSHINT, the Pratt parser. In addition to parsing, it +// is looking for ad hoc lint patterns. We add .fud to Pratt's model, which is +// like .nud except that it is only used on the first token of a statement. +// Having .fud makes it much easier to define statement-oriented languages like +// JavaScript. I retained Pratt's nomenclature. + +// .nud Null denotation +// .fud First null denotation +// .led Left denotation +// lbp Left binding power +// rbp Right binding power + +// They are elements of the parsing method called Top Down Operator Precedence. + + function expression(rbp, initial) { + var left, isArray = false; + + if (nexttoken.id === '(end)') + error("Unexpected early end of program.", token); + + advance(); + if (initial) { + anonname = 'anonymous'; + funct['(verb)'] = token.value; + } + if (initial === true && token.fud) { + left = token.fud(); + } else { + if (token.nud) { + left = token.nud(); + } else { + if (nexttoken.type === '(number)' && token.id === '.') { + warning("A leading decimal point can be confused with a dot: '.{a}'.", + token, nexttoken.value); + advance(); + return token; + } else { + error("Expected an identifier and instead saw '{a}'.", + token, token.id); + } + } + while (rbp < nexttoken.lbp) { + isArray = token.value == 'Array'; + advance(); + if (isArray && token.id == '(' && nexttoken.id == ')') + warning("Use the array literal notation [].", token); + if (token.led) { + left = token.led(left); + } else { + error("Expected an operator and instead saw '{a}'.", + token, token.id); + } + } + } + return left; + } + + +// Functions for conformance of style. + + function adjacent(left, right) { + left = left || token; + right = right || nexttoken; + if (option.white) { + if (left.character !== right.from && left.line === right.line) { + warning("Unexpected space after '{a}'.", right, left.value); + } + } + } + + function nobreak(left, right) { + left = left || token; + right = right || nexttoken; + if (option.white && (left.character !== right.from || left.line !== right.line)) { + warning("Unexpected space before '{a}'.", right, right.value); + } + } + + function nospace(left, right) { + left = left || token; + right = right || nexttoken; + if (option.white && !left.comment) { + if (left.line === right.line) { + adjacent(left, right); + } + } + } + + function nonadjacent(left, right) { + if (option.white) { + left = left || token; + right = right || nexttoken; + if (left.line === right.line && left.character === right.from) { + left.from += (left.character - left.from); + warning("Missing space after '{a}'.", + left, left.value); + } + } + } + + function nobreaknonadjacent(left, right) { + left = left || token; + right = right || nexttoken; + if (!option.laxbreak && left.line !== right.line) { + warning("Bad line breaking before '{a}'.", right, right.id); + } else if (option.white) { + left = left || token; + right = right || nexttoken; + if (left.character === right.from) { + left.from += (left.character - left.from); + warning("Missing space after '{a}'.", + left, left.value); + } + } + } + + function indentation(bias) { + var i; + if (option.white && nexttoken.id !== '(end)') { + i = indent + (bias || 0); + if (nexttoken.from !== i) { + warning( +"Expected '{a}' to have an indentation at {b} instead at {c}.", + nexttoken, nexttoken.value, i, nexttoken.from); + } + } + } + + function nolinebreak(t) { + t = t || token; + if (t.line !== nexttoken.line) { + warning("Line breaking error '{a}'.", t, t.value); + } + } + + + function comma() { + if (token.line !== nexttoken.line) { + if (!option.laxbreak) { + warning("Bad line breaking before '{a}'.", token, nexttoken.id); + } + } else if (token.character !== nexttoken.from && option.white) { + warning("Unexpected space after '{a}'.", nexttoken, token.value); + } + advance(','); + nonadjacent(token, nexttoken); + } + + +// Functional constructors for making the symbols that will be inherited by +// tokens. + + function symbol(s, p) { + var x = syntax[s]; + if (!x || typeof x !== 'object') { + syntax[s] = x = { + id: s, + lbp: p, + value: s + }; + } + return x; + } + + + function delim(s) { + return symbol(s, 0); + } + + + function stmt(s, f) { + var x = delim(s); + x.identifier = x.reserved = true; + x.fud = f; + return x; + } + + + function blockstmt(s, f) { + var x = stmt(s, f); + x.block = true; + return x; + } + + + function reserveName(x) { + var c = x.id.charAt(0); + if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) { + x.identifier = x.reserved = true; + } + return x; + } + + + function prefix(s, f) { + var x = symbol(s, 150); + reserveName(x); + x.nud = (typeof f === 'function') ? f : function () { + this.right = expression(150); + this.arity = 'unary'; + if (this.id === '++' || this.id === '--') { + if (option.plusplus) { + warning("Unexpected use of '{a}'.", this, this.id); + } else if ((!this.right.identifier || this.right.reserved) && + this.right.id !== '.' && this.right.id !== '[') { + warning("Bad operand.", this); + } + } + return this; + }; + return x; + } + + + function type(s, f) { + var x = delim(s); + x.type = s; + x.nud = f; + return x; + } + + + function reserve(s, f) { + var x = type(s, f); + x.identifier = x.reserved = true; + return x; + } + + + function reservevar(s, v) { + return reserve(s, function () { + if (typeof v === 'function') { + v(this); + } + return this; + }); + } + + + function infix(s, f, p, w) { + var x = symbol(s, p); + reserveName(x); + x.led = function (left) { + if (!w) { + nobreaknonadjacent(prevtoken, token); + nonadjacent(token, nexttoken); + } + if (typeof f === 'function') { + return f(left, this); + } else { + this.left = left; + this.right = expression(p); + return this; + } + }; + return x; + } + + + function relation(s, f) { + var x = symbol(s, 100); + x.led = function (left) { + nobreaknonadjacent(prevtoken, token); + nonadjacent(token, nexttoken); + var right = expression(100); + if ((left && left.id === 'NaN') || (right && right.id === 'NaN')) { + warning("Use the isNaN function to compare with NaN.", this); + } else if (f) { + f.apply(this, [left, right]); + } + if (left.id === '!') { + warning("Confusing use of '{a}'.", left, '!'); + } + if (right.id === '!') { + warning("Confusing use of '{a}'.", left, '!'); + } + this.left = left; + this.right = right; + return this; + }; + return x; + } + + + function isPoorRelation(node) { + return node && + ((node.type === '(number)' && +node.value === 0) || + (node.type === '(string)' && node.value === '') || + (node.type === 'null' && !option.eqnull) || + node.type === 'true' || + node.type === 'false' || + node.type === 'undefined'); + } + + + function assignop(s, f) { + symbol(s, 20).exps = true; + return infix(s, function (left, that) { + var l; + that.left = left; + if (predefined[left.value] === false && + scope[left.value]['(global)'] === true) { + warning("Read only.", left); + } else if (left['function']) { + warning("'{a}' is a function.", left, left.value); + } + if (left) { + if (option.esnext && funct[left.value] === 'const') { + warning("Attempting to override '{a}' which is a constant", left, left.value); + } + if (left.id === '.' || left.id === '[') { + if (!left.left || left.left.value === 'arguments') { + warning('Bad assignment.', that); + } + that.right = expression(19); + return that; + } else if (left.identifier && !left.reserved) { + if (funct[left.value] === 'exception') { + warning("Do not assign to the exception parameter.", left); + } + that.right = expression(19); + return that; + } + if (left === syntax['function']) { + warning( +"Expected an identifier in an assignment and instead saw a function invocation.", + token); + } + } + error("Bad assignment.", that); + }, 20); + } + + + function bitwise(s, f, p) { + var x = symbol(s, p); + reserveName(x); + x.led = (typeof f === 'function') ? f : function (left) { + if (option.bitwise) { + warning("Unexpected use of '{a}'.", this, this.id); + } + this.left = left; + this.right = expression(p); + return this; + }; + return x; + } + + + function bitwiseassignop(s) { + symbol(s, 20).exps = true; + return infix(s, function (left, that) { + if (option.bitwise) { + warning("Unexpected use of '{a}'.", that, that.id); + } + nonadjacent(prevtoken, token); + nonadjacent(token, nexttoken); + if (left) { + if (left.id === '.' || left.id === '[' || + (left.identifier && !left.reserved)) { + expression(19); + return that; + } + if (left === syntax['function']) { + warning( +"Expected an identifier in an assignment, and instead saw a function invocation.", + token); + } + return that; + } + error("Bad assignment.", that); + }, 20); + } + + + function suffix(s, f) { + var x = symbol(s, 150); + x.led = function (left) { + if (option.plusplus) { + warning("Unexpected use of '{a}'.", this, this.id); + } else if ((!left.identifier || left.reserved) && + left.id !== '.' && left.id !== '[') { + warning("Bad operand.", this); + } + this.left = left; + return this; + }; + return x; + } + + + // fnparam means that this identifier is being defined as a function + // argument (see identifier()) + function optionalidentifier(fnparam) { + if (nexttoken.identifier) { + advance(); + if (token.reserved && !option.es5) { + // `undefined` as a function param is a common pattern to protect + // against the case when somebody does `undefined = true` and + // help with minification. More info: https://gist.github.com/315916 + if (!fnparam || token.value != 'undefined') { + warning("Expected an identifier and instead saw '{a}' (a reserved word).", + token, token.id); + } + } + return token.value; + } + } + + // fnparam means that this identifier is being defined as a function + // argument + function identifier(fnparam) { + var i = optionalidentifier(fnparam); + if (i) { + return i; + } + if (token.id === 'function' && nexttoken.id === '(') { + warning("Missing name in function declaration."); + } else { + error("Expected an identifier and instead saw '{a}'.", + nexttoken, nexttoken.value); + } + } + + + function reachable(s) { + var i = 0, t; + if (nexttoken.id !== ';' || noreach) { + return; + } + for (;;) { + t = peek(i); + if (t.reach) { + return; + } + if (t.id !== '(endline)') { + if (t.id === 'function') { + warning( +"Inner functions should be listed at the top of the outer function.", t); + break; + } + warning("Unreachable '{a}' after '{b}'.", t, t.value, s); + break; + } + i += 1; + } + } + + + function statement(noindent) { + var i = indent, r, s = scope, t = nexttoken; + +// We don't like the empty statement. + + if (t.id === ';') { + warning("Unnecessary semicolon.", t); + advance(';'); + return; + } + +// Is this a labelled statement? + + if (t.identifier && !t.reserved && peek().id === ':') { + advance(); + advance(':'); + scope = Object.create(s); + addlabel(t.value, 'label'); + if (!nexttoken.labelled) { + warning("Label '{a}' on {b} statement.", + nexttoken, t.value, nexttoken.value); + } + if (jx.test(t.value + ':')) { + warning("Label '{a}' looks like a javascript url.", + t, t.value); + } + nexttoken.label = t.value; + t = nexttoken; + } + +// Parse the statement. + + if (!noindent) { + indentation(); + } + r = expression(0, true); + + // Look for the final semicolon. + if (!t.block) { + if (!option.expr && (!r || !r.exps)) { + warning("Expected an assignment or function call and instead saw an expression.", + token); + } else if (option.nonew && r.id === '(' && r.left.id === 'new') { + warning("Do not use 'new' for side effects."); + } + + if (nexttoken.id !== ';') { + if (!option.asi) { + // If this is the last statement in a block that ends on + // the same line *and* option lastsemic is on, ignore the warning. + // Otherwise, complain about missing semicolon. + if (!option.lastsemic || nexttoken.id != '}' || + nexttoken.line != token.line) { + warningAt("Missing semicolon.", token.line, token.from + + token.value.length); + } + } + } else { + adjacent(token, nexttoken); + advance(';'); + nonadjacent(token, nexttoken); + } + } + +// Restore the indentation. + + indent = i; + scope = s; + return r; + } + + + function statements(startLine) { + var a = [], f, p; + + while (!nexttoken.reach && nexttoken.id !== '(end)') { + if (nexttoken.id === ';') { + warning("Unnecessary semicolon."); + advance(';'); + } else { + a.push(statement(startLine === nexttoken.line)); + } + } + return a; + } + + + /* + * read all directives + * recognizes a simple form of asi, but always + * warns, if it is used + */ + function directives() { + var i, p, pn; + + for (;;) { + if (nexttoken.id === "(string)") { + p = peek(0); + if (p.id === "(endline)") { + i = 1; + do { + pn = peek(i); + i = i + 1; + } while (pn.id === "(endline)"); + + if (pn.id !== ";") { + if (pn.id !== "(string)" && pn.id !== "(number)" && + pn.id !== "(regexp)" && pn.identifier !== true && + pn.id !== "}") { + break; + } + warning("Missing semicolon.", nexttoken); + } else { + p = pn; + } + } else if (p.id === "}") { + // directive with no other statements, warn about missing semicolon + warning("Missing semicolon.", p); + } else if (p.id !== ";") { + break; + } + + indentation(); + advance(); + if (directive[token.value]) { + warning("Unnecessary directive \"{a}\".", token, token.value); + } + + if (token.value === "use strict") { + option.newcap = true; + option.undef = true; + } + + // there's no directive negation, so always set to true + directive[token.value] = true; + + if (p.id === ";") { + advance(";"); + } + continue; + } + break; + } + } + + + /* + * Parses a single block. A block is a sequence of statements wrapped in + * braces. + * + * ordinary - true for everything but function bodies and try blocks. + * stmt - true if block can be a single statement (e.g. in if/for/while). + * isfunc - true if block is a function body + */ + function block(ordinary, stmt, isfunc) { + var a, + b = inblock, + old_indent = indent, + m, + s = scope, + t, + line, + d; + + inblock = ordinary; + if (!ordinary || !option.funcscope) scope = Object.create(scope); + nonadjacent(token, nexttoken); + t = nexttoken; + + if (nexttoken.id === '{') { + advance('{'); + line = token.line; + if (nexttoken.id !== '}') { + indent += option.indent; + while (!ordinary && nexttoken.from > indent) { + indent += option.indent; + } + + if (isfunc) { + m = {}; + for (d in directive) { + if (is_own(directive, d)) { + m[d] = directive[d]; + } + } + directives(); + + if (option.strict && funct['(context)']['(global)']) { + if (!m["use strict"] && !directive["use strict"]) { + warning("Missing \"use strict\" statement."); + } + } + } + + a = statements(line); + + if (isfunc) { + directive = m; + } + + indent -= option.indent; + if (line !== nexttoken.line) { + indentation(); + } + } else if (line !== nexttoken.line) { + indentation(); + } + advance('}', t); + indent = old_indent; + } else if (!ordinary) { + error("Expected '{a}' and instead saw '{b}'.", + nexttoken, '{', nexttoken.value); + } else { + if (!stmt || option.curly) + warning("Expected '{a}' and instead saw '{b}'.", + nexttoken, '{', nexttoken.value); + + noreach = true; + indent += option.indent; + // test indentation only if statement is in new line + a = [statement(nexttoken.line === token.line)]; + indent -= option.indent; + noreach = false; + } + funct['(verb)'] = null; + if (!ordinary || !option.funcscope) scope = s; + inblock = b; + if (ordinary && option.noempty && (!a || a.length === 0)) { + warning("Empty block."); + } + return a; + } + + + function countMember(m) { + if (membersOnly && typeof membersOnly[m] !== 'boolean') { + warning("Unexpected /*member '{a}'.", token, m); + } + if (typeof member[m] === 'number') { + member[m] += 1; + } else { + member[m] = 1; + } + } + + + function note_implied(token) { + var name = token.value, line = token.line, a = implied[name]; + if (typeof a === 'function') { + a = false; + } + if (!a) { + a = [line]; + implied[name] = a; + } else if (a[a.length - 1] !== line) { + a.push(line); + } + } + + + // Build the syntax table by declaring the syntactic elements of the language. + + type('(number)', function () { + return this; + }); + + type('(string)', function () { + return this; + }); + + syntax['(identifier)'] = { + type: '(identifier)', + lbp: 0, + identifier: true, + nud: function () { + var v = this.value, + s = scope[v], + f; + + if (typeof s === 'function') { + // Protection against accidental inheritance. + s = undefined; + } else if (typeof s === 'boolean') { + f = funct; + funct = functions[0]; + addlabel(v, 'var'); + s = funct; + funct = f; + } + + // The name is in scope and defined in the current function. + if (funct === s) { + // Change 'unused' to 'var', and reject labels. + switch (funct[v]) { + case 'unused': + funct[v] = 'var'; + break; + case 'unction': + funct[v] = 'function'; + this['function'] = true; + break; + case 'function': + this['function'] = true; + break; + case 'label': + warning("'{a}' is a statement label.", token, v); + break; + } + } else if (funct['(global)']) { + // The name is not defined in the function. If we are in the global + // scope, then we have an undefined variable. + // + // Operators typeof and delete do not raise runtime errors even if + // the base object of a reference is null so no need to display warning + // if we're inside of typeof or delete. + if (anonname != 'typeof' && anonname != 'delete' && + option.undef && typeof predefined[v] !== 'boolean') { + warning("'{a}' is not defined.", token, v); + } + note_implied(token); + } else { + // If the name is already defined in the current + // function, but not as outer, then there is a scope error. + + switch (funct[v]) { + case 'closure': + case 'function': + case 'var': + case 'unused': + warning("'{a}' used out of scope.", token, v); + break; + case 'label': + warning("'{a}' is a statement label.", token, v); + break; + case 'outer': + case 'global': + break; + default: + // If the name is defined in an outer function, make an outer entry, + // and if it was unused, make it var. + if (s === true) { + funct[v] = true; + } else if (s === null) { + warning("'{a}' is not allowed.", token, v); + note_implied(token); + } else if (typeof s !== 'object') { + // Operators typeof and delete do not raise runtime errors even + // if the base object of a reference is null so no need to + // display warning if we're inside of typeof or delete. + if (anonname != 'typeof' && anonname != 'delete' && option.undef) { + warning("'{a}' is not defined.", token, v); + } else { + funct[v] = true; + } + note_implied(token); + } else { + switch (s[v]) { + case 'function': + case 'unction': + this['function'] = true; + s[v] = 'closure'; + funct[v] = s['(global)'] ? 'global' : 'outer'; + break; + case 'var': + case 'unused': + s[v] = 'closure'; + funct[v] = s['(global)'] ? 'global' : 'outer'; + break; + case 'closure': + case 'parameter': + funct[v] = s['(global)'] ? 'global' : 'outer'; + break; + case 'label': + warning("'{a}' is a statement label.", token, v); + } + } + } + } + return this; + }, + led: function () { + error("Expected an operator and instead saw '{a}'.", + nexttoken, nexttoken.value); + } + }; + + type('(regexp)', function () { + return this; + }); + + +// ECMAScript parser + + delim('(endline)'); + delim('(begin)'); + delim('(end)').reach = true; + delim(''); + delim('(error)').reach = true; + delim('}').reach = true; + delim(')'); + delim(']'); + delim('"').reach = true; + delim("'").reach = true; + delim(';'); + delim(':').reach = true; + delim(','); + delim('#'); + delim('@'); + reserve('else'); + reserve('case').reach = true; + reserve('catch'); + reserve('default').reach = true; + reserve('finally'); + reservevar('arguments', function (x) { + if (directive['use strict'] && funct['(global)']) { + warning("Strict violation.", x); + } + }); + reservevar('eval'); + reservevar('false'); + reservevar('Infinity'); + reservevar('NaN'); + reservevar('null'); + reservevar('this', function (x) { + if (directive['use strict'] && !option.validthis && ((funct['(statement)'] && + funct['(name)'].charAt(0) > 'Z') || funct['(global)'])) { + warning("Possible strict violation.", x); + } + }); + reservevar('true'); + reservevar('undefined'); + assignop('=', 'assign', 20); + assignop('+=', 'assignadd', 20); + assignop('-=', 'assignsub', 20); + assignop('*=', 'assignmult', 20); + assignop('/=', 'assigndiv', 20).nud = function () { + error("A regular expression literal can be confused with '/='."); + }; + assignop('%=', 'assignmod', 20); + bitwiseassignop('&=', 'assignbitand', 20); + bitwiseassignop('|=', 'assignbitor', 20); + bitwiseassignop('^=', 'assignbitxor', 20); + bitwiseassignop('<<=', 'assignshiftleft', 20); + bitwiseassignop('>>=', 'assignshiftright', 20); + bitwiseassignop('>>>=', 'assignshiftrightunsigned', 20); + infix('?', function (left, that) { + that.left = left; + that.right = expression(10); + advance(':'); + that['else'] = expression(10); + return that; + }, 30); + + infix('||', 'or', 40); + infix('&&', 'and', 50); + bitwise('|', 'bitor', 70); + bitwise('^', 'bitxor', 80); + bitwise('&', 'bitand', 90); + relation('==', function (left, right) { + var eqnull = option.eqnull && (left.value == 'null' || right.value == 'null'); + + if (!eqnull && option.eqeqeq) + warning("Expected '{a}' and instead saw '{b}'.", this, '===', '=='); + else if (isPoorRelation(left)) + warning("Use '{a}' to compare with '{b}'.", this, '===', left.value); + else if (isPoorRelation(right)) + warning("Use '{a}' to compare with '{b}'.", this, '===', right.value); + + return this; + }); + relation('==='); + relation('!=', function (left, right) { + var eqnull = option.eqnull && + (left.value == 'null' || right.value == 'null'); + + if (!eqnull && option.eqeqeq) { + warning("Expected '{a}' and instead saw '{b}'.", + this, '!==', '!='); + } else if (isPoorRelation(left)) { + warning("Use '{a}' to compare with '{b}'.", + this, '!==', left.value); + } else if (isPoorRelation(right)) { + warning("Use '{a}' to compare with '{b}'.", + this, '!==', right.value); + } + return this; + }); + relation('!=='); + relation('<'); + relation('>'); + relation('<='); + relation('>='); + bitwise('<<', 'shiftleft', 120); + bitwise('>>', 'shiftright', 120); + bitwise('>>>', 'shiftrightunsigned', 120); + infix('in', 'in', 120); + infix('instanceof', 'instanceof', 120); + infix('+', function (left, that) { + var right = expression(130); + if (left && right && left.id === '(string)' && right.id === '(string)') { + left.value += right.value; + left.character = right.character; + if (!option.scripturl && jx.test(left.value)) { + warning("JavaScript URL.", left); + } + return left; + } + that.left = left; + that.right = right; + return that; + }, 130); + prefix('+', 'num'); + prefix('+++', function () { + warning("Confusing pluses."); + this.right = expression(150); + this.arity = 'unary'; + return this; + }); + infix('+++', function (left) { + warning("Confusing pluses."); + this.left = left; + this.right = expression(130); + return this; + }, 130); + infix('-', 'sub', 130); + prefix('-', 'neg'); + prefix('---', function () { + warning("Confusing minuses."); + this.right = expression(150); + this.arity = 'unary'; + return this; + }); + infix('---', function (left) { + warning("Confusing minuses."); + this.left = left; + this.right = expression(130); + return this; + }, 130); + infix('*', 'mult', 140); + infix('/', 'div', 140); + infix('%', 'mod', 140); + + suffix('++', 'postinc'); + prefix('++', 'preinc'); + syntax['++'].exps = true; + + suffix('--', 'postdec'); + prefix('--', 'predec'); + syntax['--'].exps = true; + prefix('delete', function () { + var p = expression(0); + if (!p || (p.id !== '.' && p.id !== '[')) { + warning("Variables should not be deleted."); + } + this.first = p; + return this; + }).exps = true; + prefix('console', function () { + if (!option.debug) { + warning("All 'console' statements should be removed."); + } + return this; + }).exps = true; + prefix('alert', function () { + if (!option.debug) { + warning("All 'alert' statements should be removed."); + } + return this; + }).exps = true; + prefix('~', function () { + if (option.bitwise) { + warning("Unexpected '{a}'.", this, '~'); + } + expression(150); + return this; + }); + + prefix('!', function () { + this.right = expression(150); + this.arity = 'unary'; + if (bang[this.right.id] === true) { + warning("Confusing use of '{a}'.", this, '!'); + } + return this; + }); + prefix('typeof', 'typeof'); + prefix('new', function () { + var c = expression(155), i; + if (c && c.id !== 'function') { + if (c.identifier) { + c['new'] = true; + switch (c.value) { + case 'Object': + warning("Use the object literal notation {}.", token); + break; + case 'Number': + case 'String': + case 'Boolean': + case 'Math': + case 'JSON': + warning("Do not use {a} as a constructor.", token, c.value); + break; + case 'Function': + if (!option.evil) { + warning("The Function constructor is eval."); + } + break; + case 'Date': + case 'RegExp': + break; + default: + if (c.id !== 'function') { + i = c.value.substr(0, 1); + if (option.newcap && (i < 'A' || i > 'Z')) { + warning("A constructor name should start with an uppercase letter.", + token); + } + } + } + } else { + if (c.id !== '.' && c.id !== '[' && c.id !== '(') { + warning("Bad constructor.", token); + } + } + } else { + if (!option.supernew) + warning("Weird construction. Delete 'new'.", this); + } + adjacent(token, nexttoken); + if (nexttoken.id !== '(' && !option.supernew) { + warning("Missing '()' invoking a constructor."); + } + this.first = c; + return this; + }); + syntax['new'].exps = true; + + prefix('void').exps = true; + + infix('.', function (left, that) { + adjacent(prevtoken, token); + nobreak(); + var m = identifier(); + if (typeof m === 'string') { + countMember(m); + } + that.left = left; + that.right = m; + if (left && left.value === 'arguments' && (m === 'callee' || m === 'caller')) { + if (option.noarg) + warning("Avoid arguments.{a}.", left, m); + else if (directive['use strict']) + error('Strict violation.'); + } else if (!option.evil && left && left.value === 'document' && + (m === 'write' || m === 'writeln')) { + warning("document.write can be a form of eval.", left); + } + if (!option.evil && (m === 'eval' || m === 'execScript')) { + warning('eval is evil.'); + } + return that; + }, 160, true); + + infix('(', function (left, that) { + if (prevtoken.id !== '}' && prevtoken.id !== ')') { + nobreak(prevtoken, token); + } + nospace(); + if (option.immed && !left.immed && left.id === 'function') { + warning("Wrap an immediate function invocation in parentheses " + + "to assist the reader in understanding that the expression " + + "is the result of a function, and not the function itself."); + } + var n = 0, + p = []; + if (left) { + if (left.type === '(identifier)') { + if (left.value.match(/^[A-Z]([A-Z0-9_$]*[a-z][A-Za-z0-9_$]*)?$/)) { + if (left.value !== 'Number' && left.value !== 'String' && + left.value !== 'Boolean' && + left.value !== 'Date') { + if (left.value === 'Math') { + warning("Math is not a function.", left); + } else if (option.newcap) { + warning( +"Missing 'new' prefix when invoking a constructor.", left); + } + } + } + } + } + if (nexttoken.id !== ')') { + for (;;) { + p[p.length] = expression(10); + n += 1; + if (nexttoken.id !== ',') { + break; + } + comma(); + } + } + advance(')'); + nospace(prevtoken, token); + if (typeof left === 'object') { + if (left.value === 'parseInt' && n === 1) { + warning("Missing radix parameter.", left); + } + if (!option.evil) { + if (left.value === 'eval' || left.value === 'Function' || + left.value === 'execScript') { + warning("eval is evil.", left); + } else if (p[0] && p[0].id === '(string)' && + (left.value === 'setTimeout' || + left.value === 'setInterval')) { + warning( + "Implied eval is evil. Pass a function instead of a string.", left); + } + } + if (!left.identifier && left.id !== '.' && left.id !== '[' && + left.id !== '(' && left.id !== '&&' && left.id !== '||' && + left.id !== '?') { + warning("Bad invocation.", left); + } + } + that.left = left; + return that; + }, 155, true).exps = true; + + prefix('(', function () { + nospace(); + if (nexttoken.id === 'function') { + nexttoken.immed = true; + } + var v = expression(0); + advance(')', this); + nospace(prevtoken, token); + if (option.immed && v.id === 'function') { + if (nexttoken.id === '(') { + warning( +"Move the invocation into the parens that contain the function.", nexttoken); + } else { + warning( +"Do not wrap function literals in parens unless they are to be immediately invoked.", + this); + } + } + return v; + }); + + infix('[', function (left, that) { + nobreak(prevtoken, token); + nospace(); + var e = expression(0), s; + if (e && e.type === '(string)') { + if (!option.evil && (e.value === 'eval' || e.value === 'execScript')) { + warning("eval is evil.", that); + } + countMember(e.value); + if (!option.sub && ix.test(e.value)) { + s = syntax[e.value]; + if (!s || !s.reserved) { + warning("['{a}'] is better written in dot notation.", + e, e.value); + } + } + } + advance(']', that); + nospace(prevtoken, token); + that.left = left; + that.right = e; + return that; + }, 160, true); + + prefix('[', function () { + var b = token.line !== nexttoken.line; + this.first = []; + if (b) { + indent += option.indent; + if (nexttoken.from === indent + option.indent) { + indent += option.indent; + } + } + while (nexttoken.id !== '(end)') { + while (nexttoken.id === ',') { + warning("Extra comma."); + advance(','); + } + if (nexttoken.id === ']') { + break; + } + if (b && token.line !== nexttoken.line) { + indentation(); + } + this.first.push(expression(10)); + if (nexttoken.id === ',') { + comma(); + if (nexttoken.id === ']' && !option.es5) { + warning("Extra comma.", token); + break; + } + } else { + break; + } + } + if (b) { + indent -= option.indent; + indentation(); + } + advance(']', this); + return this; + }, 160); + + + function property_name() { + var id = optionalidentifier(true); + if (!id) { + if (nexttoken.id === '(string)') { + id = nexttoken.value; + advance(); + } else if (nexttoken.id === '(number)') { + id = nexttoken.value.toString(); + advance(); + } + } + return id; + } + + + function functionparams() { + var i, t = nexttoken, p = []; + advance('('); + nospace(); + if (nexttoken.id === ')') { + advance(')'); + nospace(prevtoken, token); + return; + } + for (;;) { + i = identifier(true); + p.push(i); + addlabel(i, 'parameter'); + if (nexttoken.id === ',') { + comma(); + } else { + advance(')', t); + nospace(prevtoken, token); + return p; + } + } + } + + + function doFunction(i, statement) { + var f, + oldOption = option, + oldScope = scope; + + option = Object.create(option); + scope = Object.create(scope); + + funct = { + '(name)' : i || '"' + anonname + '"', + '(line)' : nexttoken.line, + '(context)' : funct, + '(breakage)' : 0, + '(loopage)' : 0, + '(scope)' : scope, + '(statement)': statement + }; + f = funct; + token.funct = funct; + functions.push(funct); + if (i) { + addlabel(i, 'function'); + } + funct['(params)'] = functionparams(); + + block(false, false, true); + scope = oldScope; + option = oldOption; + funct['(last)'] = token.line; + funct = funct['(context)']; + return f; + } + + + (function (x) { + x.nud = function () { + var b, f, i, j, p, seen = {}, t; + + b = token.line !== nexttoken.line; + if (b) { + indent += option.indent; + if (nexttoken.from === indent + option.indent) { + indent += option.indent; + } + } + for (;;) { + if (nexttoken.id === '}') { + break; + } + if (b) { + indentation(); + } + if (nexttoken.value === 'get' && peek().id !== ':') { + advance('get'); + if (!option.es5) { + error("get/set are ES5 features."); + } + i = property_name(); + if (!i) { + error("Missing property name."); + } + t = nexttoken; + adjacent(token, nexttoken); + f = doFunction(); + if (!option.loopfunc && funct['(loopage)']) { + warning("Don't make functions within a loop.", t); + } + p = f['(params)']; + if (p) { + warning("Unexpected parameter '{a}' in get {b} function.", t, p[0], i); + } + adjacent(token, nexttoken); + advance(','); + indentation(); + advance('set'); + j = property_name(); + if (i !== j) { + error("Expected {a} and instead saw {b}.", token, i, j); + } + t = nexttoken; + adjacent(token, nexttoken); + f = doFunction(); + p = f['(params)']; + if (!p || p.length !== 1 || p[0] !== 'value') { + warning("Expected (value) in set {a} function.", t, i); + } + } else { + i = property_name(); + if (typeof i !== 'string') { + break; + } + advance(':'); + nonadjacent(token, nexttoken); + expression(10); + } + if (seen[i] === true) { + warning("Duplicate member '{a}'.", nexttoken, i); + } + seen[i] = true; + countMember(i); + if (nexttoken.id === ',') { + comma(); + if (nexttoken.id === ',') { + warning("Extra comma.", token); + } else if (nexttoken.id === '}' && !option.es5) { + warning("Extra comma.", token); + } + } else { + break; + } + } + if (b) { + indent -= option.indent; + indentation(); + } + advance('}', this); + return this; + }; + x.fud = function () { + error("Expected to see a statement and instead saw a block.", token); + }; + }(delim('{'))); + +// This Function is called when esnext option is set to true +// it adds the `const` statement to JSHINT + + useESNextSyntax = function () { + var conststatement = stmt('const', function (prefix) { + var id, name, value; + + this.first = []; + for (;;) { + nonadjacent(token, nexttoken); + id = identifier(); + if (funct[id] === "const") { + warning("const '" + id + "' has already been declared"); + } + if (funct['(global)'] && predefined[id] === false) { + warning("Redefinition of '{a}'.", token, id); + } + addlabel(id, 'const'); + if (prefix) { + break; + } + name = token; + this.first.push(token); + + if (nexttoken.id !== "=") { + warning("const " + + "'{a}' is initialized to 'undefined'.", token, id); + } + + if (nexttoken.id === '=') { + nonadjacent(token, nexttoken); + advance('='); + nonadjacent(token, nexttoken); + if (nexttoken.id === 'undefined') { + warning("It is not necessary to initialize " + + "'{a}' to 'undefined'.", token, id); + } + if (peek(0).id === '=' && nexttoken.identifier) { + error("Constant {a} was not declared correctly.", + nexttoken, nexttoken.value); + } + value = expression(0); + name.first = value; + } + + if (nexttoken.id !== ',') { + break; + } + comma(); + } + return this; + }); + conststatement.exps = true; + }; + + var varstatement = stmt('var', function (prefix) { + // JavaScript does not have block scope. It only has function scope. So, + // declaring a variable in a block can have unexpected consequences. + var id, name, value; + + if (funct['(onevar)'] && option.onevar) { + warning("Too many var statements."); + } else if (!funct['(global)']) { + funct['(onevar)'] = true; + } + this.first = []; + for (;;) { + nonadjacent(token, nexttoken); + id = identifier(); + if (option.esnext && funct[id] === "const") { + warning("const '" + id + "' has already been declared"); + } + if (funct['(global)'] && predefined[id] === false) { + warning("Redefinition of '{a}'.", token, id); + } + addlabel(id, 'unused'); + if (prefix) { + break; + } + name = token; + this.first.push(token); + if (nexttoken.id === '=') { + nonadjacent(token, nexttoken); + advance('='); + nonadjacent(token, nexttoken); + if (nexttoken.id === 'undefined') { + warning("It is not necessary to initialize '{a}' to 'undefined'.", token, id); + } + if (peek(0).id === '=' && nexttoken.identifier) { + error("Variable {a} was not declared correctly.", + nexttoken, nexttoken.value); + } + value = expression(0); + name.first = value; + } + if (nexttoken.id !== ',') { + break; + } + comma(); + } + return this; + }); + varstatement.exps = true; + + blockstmt('function', function () { + if (inblock) { + warning("Function declarations should not be placed in blocks. " + + "Use a function expression or move the statement to the top of " + + "the outer function.", token); + + } + var i = identifier(); + if (option.esnext && funct[i] === "const") { + warning("const '" + i + "' has already been declared"); + } + adjacent(token, nexttoken); + addlabel(i, 'unction'); + doFunction(i, true); + if (nexttoken.id === '(' && nexttoken.line === token.line) { + error( +"Function declarations are not invocable. Wrap the whole function invocation in parens."); + } + return this; + }); + + prefix('function', function () { + var i = optionalidentifier(); + if (i) { + adjacent(token, nexttoken); + } else { + nonadjacent(token, nexttoken); + } + doFunction(i); + if (!option.loopfunc && funct['(loopage)']) { + warning("Don't make functions within a loop."); + } + return this; + }); + + blockstmt('if', function () { + var t = nexttoken; + advance('('); + nonadjacent(this, t); + nospace(); + expression(20); + if (nexttoken.id === '=') { + if (!option.boss) + warning("Expected a conditional expression and instead saw an assignment."); + advance('='); + expression(20); + } + advance(')', t); + nospace(prevtoken, token); + block(true, true); + if (nexttoken.id === 'else') { + nonadjacent(token, nexttoken); + advance('else'); + if (nexttoken.id === 'if' || nexttoken.id === 'switch') { + statement(true); + } else { + block(true, true); + } + } + return this; + }); + + blockstmt('try', function () { + var b, e, s; + + block(false); + if (nexttoken.id === 'catch') { + advance('catch'); + nonadjacent(token, nexttoken); + advance('('); + s = scope; + scope = Object.create(s); + e = nexttoken.value; + if (nexttoken.type !== '(identifier)') { + warning("Expected an identifier and instead saw '{a}'.", + nexttoken, e); + } else { + addlabel(e, 'exception'); + } + advance(); + advance(')'); + block(false); + b = true; + scope = s; + } + if (nexttoken.id === 'finally') { + advance('finally'); + block(false); + return; + } else if (!b) { + error("Expected '{a}' and instead saw '{b}'.", + nexttoken, 'catch', nexttoken.value); + } + return this; + }); + + blockstmt('while', function () { + var t = nexttoken; + funct['(breakage)'] += 1; + funct['(loopage)'] += 1; + advance('('); + nonadjacent(this, t); + nospace(); + expression(20); + if (nexttoken.id === '=') { + if (!option.boss) + warning("Expected a conditional expression and instead saw an assignment."); + advance('='); + expression(20); + } + advance(')', t); + nospace(prevtoken, token); + block(true, true); + funct['(breakage)'] -= 1; + funct['(loopage)'] -= 1; + return this; + }).labelled = true; + + reserve('with'); + + blockstmt('switch', function () { + var t = nexttoken, + g = false; + funct['(breakage)'] += 1; + advance('('); + nonadjacent(this, t); + nospace(); + this.condition = expression(20); + advance(')', t); + nospace(prevtoken, token); + nonadjacent(token, nexttoken); + t = nexttoken; + advance('{'); + nonadjacent(token, nexttoken); + indent += option.indent; + this.cases = []; + for (;;) { + switch (nexttoken.id) { + case 'case': + switch (funct['(verb)']) { + case 'break': + case 'case': + case 'continue': + case 'return': + case 'switch': + case 'throw': + break; + default: + // You can tell JSHint that you don't use break intentionally by + // adding a comment /* falls through */ on a line just before + // the next `case`. + if (!ft.test(lines[nexttoken.line - 2])) { + warning( + "Expected a 'break' statement before 'case'.", + token); + } + } + indentation(-option.indent); + advance('case'); + this.cases.push(expression(20)); + g = true; + advance(':'); + funct['(verb)'] = 'case'; + break; + case 'default': + switch (funct['(verb)']) { + case 'break': + case 'continue': + case 'return': + case 'throw': + break; + default: + if (!ft.test(lines[nexttoken.line - 2])) { + warning( + "Expected a 'break' statement before 'default'.", + token); + } + } + indentation(-option.indent); + advance('default'); + g = true; + advance(':'); + break; + case '}': + indent -= option.indent; + indentation(); + advance('}', t); + if (this.cases.length === 1 || this.condition.id === 'true' || + this.condition.id === 'false') { + if (!option.onecase) + warning("This 'switch' should be an 'if'.", this); + } + funct['(breakage)'] -= 1; + funct['(verb)'] = undefined; + return; + case '(end)': + error("Missing '{a}'.", nexttoken, '}'); + return; + default: + if (g) { + switch (token.id) { + case ',': + error("Each value should have its own case label."); + return; + case ':': + g = false; + statements(); + break; + default: + error("Missing ':' on a case clause.", token); + return; + } + } else { + if (token.id === ':') { + advance(':'); + error("Unexpected '{a}'.", token, ':'); + statements(); + } else { + error("Expected '{a}' and instead saw '{b}'.", + nexttoken, 'case', nexttoken.value); + return; + } + } + } + } + }).labelled = true; + + stmt('debugger', function () { + if (!option.debug) { + warning("All 'debugger' statements should be removed."); + } + return this; + }).exps = true; +// stmt('alert', function () { +// if (!option.debug) { +// warning("All 'alert' statements should be removed."); +// } +// return this; +// }).exps = true; +// stmt('console', function () { +// if (!option.debug) { +// warning("All 'console' statements should be removed."); +// } +// return this; +// }).exps = true; + + (function () { + var x = stmt('do', function () { + funct['(breakage)'] += 1; + funct['(loopage)'] += 1; + this.first = block(true); + advance('while'); + var t = nexttoken; + nonadjacent(token, t); + advance('('); + nospace(); + expression(20); + if (nexttoken.id === '=') { + if (!option.boss) + warning("Expected a conditional expression and instead saw an assignment."); + advance('='); + expression(20); + } + advance(')', t); + nospace(prevtoken, token); + funct['(breakage)'] -= 1; + funct['(loopage)'] -= 1; + return this; + }); + x.labelled = true; + x.exps = true; + }()); + + blockstmt('for', function () { + var s, t = nexttoken; + funct['(breakage)'] += 1; + funct['(loopage)'] += 1; + advance('('); + nonadjacent(this, t); + nospace(); + if (peek(nexttoken.id === 'var' ? 1 : 0).id === 'in') { + if (nexttoken.id === 'var') { + advance('var'); + varstatement.fud.call(varstatement, true); + } else { + switch (funct[nexttoken.value]) { + case 'unused': + funct[nexttoken.value] = 'var'; + break; + case 'var': + break; + default: + warning("Bad for in variable '{a}'.", + nexttoken, nexttoken.value); + } + advance(); + } + advance('in'); + expression(20); + advance(')', t); + s = block(true, true); + if (option.forin && (s.length > 1 || typeof s[0] !== 'object' || + s[0].value !== 'if')) { + warning("The body of a for in should be wrapped in an if statement to filter " + + "unwanted properties from the prototype.", this); + } + funct['(breakage)'] -= 1; + funct['(loopage)'] -= 1; + return this; + } else { + if (nexttoken.id !== ';') { + if (nexttoken.id === 'var') { + advance('var'); + varstatement.fud.call(varstatement); + } else { + for (;;) { + expression(0, 'for'); + if (nexttoken.id !== ',') { + break; + } + comma(); + } + } + } + nolinebreak(token); + advance(';'); + if (nexttoken.id !== ';') { + expression(20); + if (nexttoken.id === '=') { + if (!option.boss) + warning("Expected a conditional expression and instead saw an assignment."); + advance('='); + expression(20); + } + } + nolinebreak(token); + advance(';'); + if (nexttoken.id === ';') { + error("Expected '{a}' and instead saw '{b}'.", + nexttoken, ')', ';'); + } + if (nexttoken.id !== ')') { + for (;;) { + expression(0, 'for'); + if (nexttoken.id !== ',') { + break; + } + comma(); + } + } + advance(')', t); + nospace(prevtoken, token); + block(true, true); + funct['(breakage)'] -= 1; + funct['(loopage)'] -= 1; + return this; + } + }).labelled = true; + + + stmt('break', function () { + var v = nexttoken.value; + + if (funct['(breakage)'] === 0) + warning("Unexpected '{a}'.", nexttoken, this.value); + + if (!option.asi) + nolinebreak(this); + + if (nexttoken.id !== ';') { + if (token.line === nexttoken.line) { + if (funct[v] !== 'label') { + warning("'{a}' is not a statement label.", nexttoken, v); + } else if (scope[v] !== funct) { + warning("'{a}' is out of scope.", nexttoken, v); + } + this.first = nexttoken; + advance(); + } + } + reachable('break'); + return this; + }).exps = true; + + + stmt('continue', function () { + var v = nexttoken.value; + + if (funct['(breakage)'] === 0) + warning("Unexpected '{a}'.", nexttoken, this.value); + + if (!option.asi) + nolinebreak(this); + + if (nexttoken.id !== ';') { + if (token.line === nexttoken.line) { + if (funct[v] !== 'label') { + warning("'{a}' is not a statement label.", nexttoken, v); + } else if (scope[v] !== funct) { + warning("'{a}' is out of scope.", nexttoken, v); + } + this.first = nexttoken; + advance(); + } + } else if (!funct['(loopage)']) { + warning("Unexpected '{a}'.", nexttoken, this.value); + } + reachable('continue'); + return this; + }).exps = true; + + + stmt('return', function () { + if (this.line === nexttoken.line) { + if (nexttoken.id === '(regexp)') + warning("Wrap the /regexp/ literal in parens to disambiguate the slash operator."); + + if (nexttoken.id !== ';' && !nexttoken.reach) { + nonadjacent(token, nexttoken); + this.first = expression(0); + } + } else if (!option.asi) { + nolinebreak(this); // always warn (Line breaking error) + } + reachable('return'); + return this; + }).exps = true; + + + stmt('throw', function () { + nolinebreak(this); + nonadjacent(token, nexttoken); + this.first = expression(20); + reachable('throw'); + return this; + }).exps = true; + +// Superfluous reserved words + + reserve('class'); + reserve('const'); + reserve('enum'); + reserve('export'); + reserve('extends'); + reserve('import'); + reserve('super'); + + reserve('let'); + reserve('yield'); + reserve('implements'); + reserve('interface'); + reserve('package'); + reserve('private'); + reserve('protected'); + reserve('public'); + reserve('static'); + + +// Parse JSON + + function jsonValue() { + + function jsonObject() { + var o = {}, t = nexttoken; + advance('{'); + if (nexttoken.id !== '}') { + for (;;) { + if (nexttoken.id === '(end)') { + error("Missing '}' to match '{' from line {a}.", + nexttoken, t.line); + } else if (nexttoken.id === '}') { + warning("Unexpected comma.", token); + break; + } else if (nexttoken.id === ',') { + error("Unexpected comma.", nexttoken); + } else if (nexttoken.id !== '(string)') { + warning("Expected a string and instead saw {a}.", + nexttoken, nexttoken.value); + } + if (o[nexttoken.value] === true) { + warning("Duplicate key '{a}'.", + nexttoken, nexttoken.value); + } else if ((nexttoken.value === '__proto__' && + !option.proto) || (nexttoken.value === '__iterator__' && + !option.iterator)) { + warning("The '{a}' key may produce unexpected results.", + nexttoken, nexttoken.value); + } else { + o[nexttoken.value] = true; + } + advance(); + advance(':'); + jsonValue(); + if (nexttoken.id !== ',') { + break; + } + advance(','); + } + } + advance('}'); + } + + function jsonArray() { + var t = nexttoken; + advance('['); + if (nexttoken.id !== ']') { + for (;;) { + if (nexttoken.id === '(end)') { + error("Missing ']' to match '[' from line {a}.", + nexttoken, t.line); + } else if (nexttoken.id === ']') { + warning("Unexpected comma.", token); + break; + } else if (nexttoken.id === ',') { + error("Unexpected comma.", nexttoken); + } + jsonValue(); + if (nexttoken.id !== ',') { + break; + } + advance(','); + } + } + advance(']'); + } + + switch (nexttoken.id) { + case '{': + jsonObject(); + break; + case '[': + jsonArray(); + break; + case 'true': + case 'false': + case 'null': + case '(number)': + case '(string)': + advance(); + break; + case '-': + advance('-'); + if (token.character !== nexttoken.from) { + warning("Unexpected space after '-'.", token); + } + adjacent(token, nexttoken); + advance('(number)'); + break; + default: + error("Expected a JSON value.", nexttoken); + } + } + + +// The actual JSHINT function itself. + + var itself = function (s, o, g) { + var a, i, k; + JSHINT.errors = []; + predefined = Object.create(standard); + combine(predefined, g || {}); + if (o) { + a = o.predef; + if (a) { + if (Array.isArray(a)) { + for (i = 0; i < a.length; i += 1) { + predefined[a[i]] = true; + } + } else if (typeof a === 'object') { + k = Object.keys(a); + for (i = 0; i < k.length; i += 1) { + predefined[k[i]] = !!a[k[i]]; + } + } + } + option = o; + } else { + option = {}; + } + option.indent = option.indent || 4; + option.maxerr = option.maxerr || 5000000; + + tab = ''; + for (i = 0; i < option.indent; i += 1) { + tab += ' '; + } + indent = 1; + global = Object.create(predefined); + scope = global; + funct = { + '(global)': true, + '(name)': '(global)', + '(scope)': scope, + '(breakage)': 0, + '(loopage)': 0 + }; + functions = [funct]; + urls = []; + src = false; + stack = null; + member = {}; + membersOnly = null; + implied = {}; + inblock = false; + lookahead = []; + jsonmode = false; + warnings = 0; + lex.init(s); + prereg = true; + directive = {}; + + prevtoken = token = nexttoken = syntax['(begin)']; + assume(); + + // combine the passed globals after we've assumed all our options + combine(predefined, g || {}); + + try { + advance(); + switch (nexttoken.id) { + case '{': + case '[': + option.laxbreak = true; + jsonmode = true; + jsonValue(); + break; + default: + directives(); + if (directive["use strict"] && !option.globalstrict) { + warning("Use the function form of \"use strict\".", prevtoken); + } + + statements(); + } + advance('(end)'); + } catch (e) { + if (e) { + JSHINT.errors.push({ + reason : e.message, + line : e.line || nexttoken.line, + character : e.character || nexttoken.from + }, null); + } + } + return JSHINT.errors.length === 0; + }; + + // Data summary. + itself.data = function () { + + var data = { functions: [], options: option }, fu, globals, implieds = [], f, i, j, + members = [], n, unused = [], v; + if (itself.errors.length) { + data.errors = itself.errors; + } + + if (jsonmode) { + data.json = true; + } + + for (n in implied) { + if (is_own(implied, n)) { + implieds.push({ + name: n, + line: implied[n] + }); + } + } + if (implieds.length > 0) { + data.implieds = implieds; + } + + if (urls.length > 0) { + data.urls = urls; + } + + globals = Object.keys(scope); + if (globals.length > 0) { + data.globals = globals; + } + + for (i = 1; i < functions.length; i += 1) { + f = functions[i]; + fu = {}; + for (j = 0; j < functionicity.length; j += 1) { + fu[functionicity[j]] = []; + } + for (n in f) { + if (is_own(f, n) && n.charAt(0) !== '(') { + v = f[n]; + if (v === 'unction') { + v = 'unused'; + } + if (Array.isArray(fu[v])) { + fu[v].push(n); + if (v === 'unused') { + unused.push({ + name: n, + line: f['(line)'], + 'function': f['(name)'] + }); + } + } + } + } + for (j = 0; j < functionicity.length; j += 1) { + if (fu[functionicity[j]].length === 0) { + delete fu[functionicity[j]]; + } + } + fu.name = f['(name)']; + fu.param = f['(params)']; + fu.line = f['(line)']; + fu.last = f['(last)']; + data.functions.push(fu); + } + + if (unused.length > 0) { + data.unused = unused; + } + + members = []; + for (n in member) { + if (typeof member[n] === 'number') { + data.member = member; + break; + } + } + + return data; + }; + + itself.report = function (option) { + var data = itself.data(); + + var a = [], c, e, err, f, i, k, l, m = '', n, o = [], s; + + function detail(h, array) { + var b, i, singularity; + if (array) { + o.push('
        ' + h + ' '); + array = array.sort(); + for (i = 0; i < array.length; i += 1) { + if (array[i] !== singularity) { + singularity = array[i]; + o.push((b ? ', ' : '') + singularity); + b = true; + } + } + o.push('
        '); + } + } + + + if (data.errors || data.implieds || data.unused) { + err = true; + o.push('
        Error:'); + if (data.errors) { + for (i = 0; i < data.errors.length; i += 1) { + c = data.errors[i]; + if (c) { + e = c.evidence || ''; + o.push('

        Problem' + (isFinite(c.line) ? ' at line ' + + c.line + ' character ' + c.character : '') + + ': ' + c.reason.entityify() + + '

        ' + + (e && (e.length > 80 ? e.slice(0, 77) + '...' : + e).entityify()) + '

        '); + } + } + } + + if (data.implieds) { + s = []; + for (i = 0; i < data.implieds.length; i += 1) { + s[i] = '' + data.implieds[i].name + ' ' + + data.implieds[i].line + ''; + } + o.push('

        Implied global: ' + s.join(', ') + '

        '); + } + + if (data.unused) { + s = []; + for (i = 0; i < data.unused.length; i += 1) { + s[i] = '' + data.unused[i].name + ' ' + + data.unused[i].line + ' ' + + data.unused[i]['function'] + ''; + } + o.push('

        Unused variable: ' + s.join(', ') + '

        '); + } + if (data.json) { + o.push('

        JSON: bad.

        '); + } + o.push('
        '); + } + + if (!option) { + + o.push('
        '); + + if (data.urls) { + detail("URLs
        ", data.urls, '
        '); + } + + if (data.json && !err) { + o.push('

        JSON: good.

        '); + } else if (data.globals) { + o.push('
        Global ' + + data.globals.sort().join(', ') + '
        '); + } else { + o.push('
        No new global variables introduced.
        '); + } + + for (i = 0; i < data.functions.length; i += 1) { + f = data.functions[i]; + + o.push('
        ' + f.line + '-' + + f.last + ' ' + (f.name || '') + '(' + + (f.param ? f.param.join(', ') : '') + ')
        '); + detail('Unused', f.unused); + detail('Closure', f.closure); + detail('Variable', f['var']); + detail('Exception', f.exception); + detail('Outer', f.outer); + detail('Global', f.global); + detail('Label', f.label); + } + + if (data.member) { + a = Object.keys(data.member); + if (a.length) { + a = a.sort(); + m = '
        /*members ';
        +                    l = 10;
        +                    for (i = 0; i < a.length; i += 1) {
        +                        k = a[i];
        +                        n = k.name();
        +                        if (l + n.length > 72) {
        +                            o.push(m + '
        '); + m = ' '; + l = 1; + } + l += n.length + 2; + if (data.member[k] === 1) { + n = '' + n + ''; + } + if (i < a.length - 1) { + n += ', '; + } + m += n; + } + o.push(m + '
        */
        '); + } + o.push('
        '); + } + } + return o.join(''); + }; + + itself.jshint = itself; + itself.edition = '2011-04-16'; + + return itself; +}()); + +// Make JSHINT a Node module, if possible. +if (typeof exports == 'object' && exports) + exports.JSHINT = JSHINT; diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/lib/jshunter_1.2.0.1/jshunter_dev/jshunter/version b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/lib/jshunter_1.2.0.1/jshunter_dev/jshunter/version new file mode 100644 index 000000000..93b9d970b --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/lib/jshunter_1.2.0.1/jshunter_dev/jshunter/version @@ -0,0 +1,22 @@ +#beta version +version:1.2.0.1 + +[changelog] +1.ָļѾܾ飬ԷԴļǵ +2.ֵ֧ݹĿ¼ڵļ +3.ּ֧htmlļеjs루ȡͬһʱѭһbug +5.޸isHiddenжϼĿ¼..ʱbug +6.޸·bug +7.˱Ҫdebug +8.޸Ŀ¼ṹconfĿ¼core/data/Ŀ¼ +9.˷ɨĹ +10.htmlļʽ⣨֮ǰĴļ<>Ҫת壬룩 +11.ɨ +12.˺ִ󼶱error,warning,ignoreignore +13.еĺ֣ά +14.warningerrorĸͰٷֱ +15.޸˴ļбΪδ +16.[1.2.0]ļ˹ +17.[1.2.0]ûԶù +18.[1.2.0.1]ȥ˻鲽 diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/lib/jslint4java-2.0.2.jar b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/lib/jslint4java-2.0.2.jar new file mode 100644 index 0000000000000000000000000000000000000000..710551645b25076d641a4f9fe7980fdf994210b1 GIT binary patch literal 1270598 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
        JG{mFNirMqjaMS2XLC42NH4QVa~_ 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

        GERWeUqqk7*4a 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

          W9yM6(zp3%3+|VgtXwzg|~>5-`qJs4;Th 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ɰ}s0?9pAC|5yG`gOp2#oqFlzqz)IutBsU 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

          0B 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%0A$R1Zr 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�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

          LDcB6*RPhX?Ar3h3VKUI_j`4em(WS2 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�J9e3tWp|ItgbBnWuA`F8UP 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

          {lmcz`4WA{i(VcT^l(A-) zR$|fWXQ}HpUt}&{HM@i0j>VVK~xfs@JI%=N2$JUlzk|7Ed z98Lqg0D<{f%z$Hf!m`(( zt)*u9vAgAS2%k>7tWxbV(x4Yg)j^UVNWP*w5sYfoZGg<(Wl%~c@#)BX6+ zwTM8M3#xs8vhwW!mI^zZvMdPQ7UY|A>+Q&1V-n>3x{g^u!+= zpn12y1~-Yr9M1`Wsq%MITQKHK`2(Pt%74^A$tt73lt{pb$QzZCn^mI;cVm1(F=zXU zA`&F10N4|t|J;5iU6WQTv9QE{LWW`?o^}B@m@WE}>;0v~fCsqF_~1hn`uNwQp}zZk`d+JEqitbMLc1VI zjb!i>j!U z7(d218CcC6)$?rR0r{dimvhl4hYyG+azbcN7Bp{o-9+iMpadm|(F1}gz$d&8nTZeN zBWHn*d5Nhh#r>m5C8U%S?FCii(4E;Xhq?dlh1nW8D!@eAf6xJNq$v?kD}U>ET-IeY2GqtSv4uUOMB zeG%90VFBYVl{$vvE)^3Y{=JM==t4bK%8BUkp5bRg#^3qfvIS?R<@s{P8hyr5vr19AHd;z&R{ys-uk1$$ky6d@QZvZgSPi7`H%@z}TwAwb$Y~5LM z%*MPnAQRQAy%}R1m$eXIIp5h3G|Rcx&);I^sy67I$Y#7LLlqmryQ&PDxnFU*i?zp= zg5fk@rcAQgV-Sx4676IWg@#zWQV;cDjs)BOR-K^7)Wt4T;cafdyMZ2X^<|3czyw1t zvBu-Ex|DIcjKnc3=w1*|zW!X0%X}Ne*9%vRz$G~#FvB3|lRSA~fQ#@1my!H(Kf@E+ zau{XUS?&Pi5%0rt5B-+D_ic|W`YFDi##?+EcF6#tH#PI0cUlzn8^Q?k@MAQ77rzWP zBXt0_S%D{dr#0cHa54|V!h=0?RN<#;XV>YcEUPpf!%)D@l_M1CVCH%D4xFAag6`Z> z@fR3ql6Btg{sZ@o7F?5=OVG|Ff|N87=jD*E|h0f80*#ru$~mEtaV4?2D2=c1gHo+-Vy4g5Ua2d zs>}#<=|op~&;)3!!W9Q|zGu(Fmswb=Y*!nn7q-tDVlyWaElFksf@aL@FB|t)_^rPz`6h%e(1#2PK zh5K)k{5rOwt;36I7P9~*zL_{0;)%I0p!u&*gipfouoM8!M<+BbY6$dY@H>Q&ndaa| zq>fR>H;Z_)7|@i+wHP%g&`@+S`X@Y57_F^=6lV(il5~-gz4Ohej`A^{nzur&hbo`- z>Low=i(@c36@3@j{8!kmWvRngRp?CxVWXgX$Il$ejLd&NrmDK5a4r^qIUY3c6OLZp zMC|0an&Vy|X*W}qin*Jjiq&z6erkJiv8}6Bah-BRX$C}NaNY+_r%G!RVGp~F{yPoP z(up+)7)+GL^zwahGz9!+YY9|Baa2@mEze&$@5j7q2&=| zyB!@Wm}JEt__<@BcJk7Fv4RPP5uK}QCs=v$#97TVN->Hy5zgGAsBFm@AZN&rG7shT zzb!(@Q8vTqP6REQ*p4mv6(S5GYhfA@ZAlUB;C&~Qs1t|uaa87<5qt}kc~M+3G<(#c zw)E=5TPJ9_-1pm0{FQZ+*CdDvBoFSJ7TF>#icGlGdM^HvR{69?VDaboUhZU@14EVa zm=ZY$NKx6uFH1LKa(jVcliWeY)lW{L7M$Y0gxqD9x}fM>sOBJnBsK&yF8`4-%mlP6 z0_3DyhV~nLYv}US^}6dSG<*dLv!HKk=XV2_c}jP8N>m4&sC|GwAAb{eAwXNMq4oE# zJL!qXVc)X{(rD z!=#L^mIw@>21}_cHf3EwHEZ94#-j0K_2QLMZ`YKEt(l`|@-S^?;txl4NW{}lRcU2e@Cwvy z2-*oHF0^|VT*{_!1?Xe25-Z0%+}pgJiVZ48Y#>)$m6&4QZdcqQr5y~=Hc_yy{;;lb z!CIyP4p~r(QyRJBR`M*Yr9+sDDtSw`>GyorS@|s^N`ycK1K2=Eruo_=KY(pGg^Rpoc|T-y0G=rOK?ww}-m*$M zjew}_711#@&s<3a;$4N3@D)`@=>Z_4;OJulsshC)Tfl^uyu0;YstkT0>+6m07F#`v z007+|K)5hM_@kiNJA%JhvmQvx4~BY2%+0z%%w|b2K3XHrdKd$I(U=?H2uNbYt!SMc zk})tXCPGMLw_eD%k$;hR-2p{Rl{o5F(LjS=WvBTK`hEvmO{4+}da1hIv#!0b>SNME%9A0w2)o??t z43~Vb29ks#qBgMy*VfTt0ndTQ9V8_;?yw`OmOCFL^cLu_obwI>e)btPEqP*}4$I)H z5ASbKq(qgU!wWG|LQ4||5VApgT>M|K$bg zyf)#)`yE91!S?4s?KI$nZs-bX_1r3v?;E&-ws9Vq>!-H0<-J9f3|d#r%-|?LmQxrU zFb;FbjABy`fp1;@5%z$t*2+j}8^~7^mJX@z3Vt`}Qc*9E_vr7D5OC+;$T zP)AvnMv?Lk8fr}}+&NhG^?_)sts{>=D!FPAZ!g1xvWL z$M&&(QsYJ!7yh}iH}Nct6|X4tPy36sDl05Xk9DP{u)IT{)TsW%_} z=8wVM)B{S_zrgo&ado3MsiwHQcmLE@GIBm5?T!%9T(h&1bC(YNL%vZ6Td1hs+DPqT za!TfLf=(!MH)a{O;aTm1_+JLqYo+yA@nz=RDfxu11q>9T37$WLHGe3f-Y24L8bY@O zWw@o?t^cw){^bl@E4T8yJrhD-k#%sgse3dV<|{2aA>TdzFb8vKvLUsj?e zRTAxtK$4BUhpP*mvO+meF6P$uy_7Alcn&+J{2tVUEBh}saHorM2vzX%g+9xwcH~!Y zdLzR>oD&ee@PGa`Lb5EPz)J1GXnH%wQcX_!nM&8Y@d3?54_>Go=s(gS{Hvhj;oh6= ztD|Rw0;*BK#Vm}bb8{dT;@T6`0Qeh?mNJb@Jwvx-s3V*$Lbf^MVO*j_QH;O%RiGO- zP4laQ!%oFyPk9fq)~%sjx|glK$y;mN<6B5f`wTvYk`) zJ)|wa12?#Dh;^=1qX@?{Ihm2@uGsLsbFMczF-sUx7dR5diegcn#~9|gIZLX&hg*H6 z?C7stem;;jIgvZJ3I{s+mjI&I7trQ9f3syLb_xhZOR(FFCve!Hyh~KZ3>$UIg;?E>YrE#Jk7PgZ8?egBBUbx;$5u2MVqKJ&WYe$ zZB94|wqB_BI-I2Z0Wp-}NLr~rWKNiOp%tH0apdC5*iJP04NOx4`5M@RK}^sFGw{H~ zUBV@sQ3CT=jlK0>1OVOBui3`GUis_a-`0#4}*a^C0-^U7j7Uwgi!rDP#cbT z`qiP3q<1F0sSphYFvUTnlSHO*8j26NkJ)PdX5g=&)|a_GF!8igU_0Q1v7W*z zy)iaZZCdDbC}dNkCCF&5vGI%1+I|JKFnxlfJ{K+PZ+Kd}$95c6Vok>us6-~Hlc~L% z%xNS?5US5dzY1a#V9Hwvva0Y$XH#He6Kgs;^AkMcq|}TlgUQ_+-z9v-BL7@)2#g>g zsuaEjdv2EBCehGZFVK>=4gdw;8VhNmLodUth+;f|A(zE=DkTTI>A!jNc6~pF=2Yjw znxUts>?8@xSNTK2x-yg*Ks}>KTeikvz@phH^i>9P6r#qWnSMRPj2if)+t_#H(p6eR z4H%uS?`-oeUH)Eodhptna_sn%xflG_H~YB)Qs{yj_?)`f$$#@?OxdDlyq(|_yg1Je zc=Ezw=bf1Kl_q)B*QDIY)*v>G*we$;VC_ujs2>}!#Ev#r8p-k+Ccgs`Nz&mI6-rq~ zMzyfh4v#15GE?DWbi%G{wQbG=TMyTL3oM1$Lt$oob|0J*bfoh36copoByx`=yhND; z6m$8F?!pP;fk=Qy&EdED$znE@1DQb{^^lz}#h)M+o8iwbGe1BYyovOmcZB+I^=iPe zXQ^069eke;7wNxdbK0jfcT;k*H-ebd;If4BmQdS%$nrAJ&$5f^adN}_$cgSK9 zYN!c+ecu$hz>gB@Tj$lRl#NgUK*}$?TQ-JaPT6vDwV$a-7eRA)&jF;wlr>h zI1GLD0Yc)0z)<}}Kl4>)=8Ow@D(UzXW8$jaI!yd_Qb->qm2S%%_3h+Y-E-aAxLSjPZ_cwbRm0gdD?}ljbuirvUSlDaDe_)Ul>{ z%q3C{;^|DxybEGR?$I$7?sd#khmK{;6UGA$96rgLKFu+fZb8g=3$3aL?OxRa0=i3YQ@l`4u#5*%Oa`JD*Nbj#URx#7Geihm%)Kmmbw*ppCNFiniE<>} zVp4kckGSpuoW4sFt`a@d6P_j$Tm6k-fNoNt>$tfU6Q`QUb>j!vsOyCnpQvZR2M{vD z8OvNLqTW2BEOF#drM>YdapvZ7kI#BH?q7Ud*w$zC`_iD0M7WTyl`Q*V;?(WMrWD9E z`j~aZzhsC9<__2G#9H>YANna~dY*N~a2H0!wU~dgB@c3PMVTYnxf3l2JJvJcTCyUA zi8oe(g&b^6N%##W|8R8I@gxQixA#whDfy^vij#U`9mJUl%>5GLB@l3E9^_0D zY&r>P32srbI=?7Ag&O&7nQsWFY}2~Z-NZRFXV{+@m>N^>bOlcE)Uu?G78=qBiNCdD zCRjkNSSYw4D$oQ2F-qtCh+;3n3P^2jW&LGaaT;kIF3G z8ZLsP?gfTR0H~PGCQu7AeVQ%3&wq>*5j9Rdh(iVW@{eq_q@mo2e|(d4HA&sC8+&DI zVv9vrS5}PMrM+Uf$rnqbsaP{~#i16KGs$K#{Ls6DK4fxtq(6eikl)~}y!rho^=3haGZBX_qVe85>I)#rR?ojSGX@$AaM`6|1w{|qClr2N#)-x{y&UlnG z?8k1=m))GbZVb7X*U%&O){$dCfBBhLoo(>g6XiJ>{AgXki8;Q|!C?ZPq2>i^mCW4r zWgS=+M&8oVsdJk*2b?ngFUsBlx)NsF8jX#P(Lu)@+a24sZQHhO+evq9+qP|XoV?xN zIsgCOyZ4^&oSQNBNXAZf?d+;qYpzw`K^oMu_0T)X=pN8D(a>_F?U#my z1^F!TqBOF}bBs+bAl_y9c#S6NdXS6X-q$x&!zfKDymt(hx|XebX6W$g;oCQ8Iv zLJAjP)UaF3t&cuC98Ik${xY9iJynM$-Yf(M?NlS@nlob=wJ!N!(R2_r{uXW|r;&iV zLm^T`=3X%3OoU~o+~hiEt#!iztEldUzE3lZo4gN#rK2(zTg5`QQfg3eibSbFWVIo{ zY~>hn^82(etGGZFCFIP`8U?3;R3V7j`^yfU`90Od_K)i3eN$D=NUQJ~(t^Y|IJBy) zh+!FoexBm8z97*|Hm7DT5fVR}*3(*^)+oB7pNaAYAh-?%^Ro4^L_`)O^XgJb4U^A&YR3(r4)$S@jgeZ~{i9SY;xFsKX~&RsqN1vr3u zq!iV_t`e2$|B{IHPbE?wpYN*@D>4^*V9y^hRpMKF2_`Qru=qB{tT?o{qdk@_lAfDf z-?zRC!FGYZlsViV*#jB9Yd;pel|d@d_$uk8g@;t*&F`$ttg&tS7CZTB)-_0;^?D4R zb(zb>fu9S?@i+$@g+IuIKYv2$SR#!$<6X@7*@Z>AeNDu1QPk!nKI5JBV*3?0@lekU zFYZv|zEryHgfz=K?$FrGI_Z$56_?Z`N7wX?It#yu%!#`{#K}9dt7?wtiIc-C>2mg@ z?OP0f2?nz_{}I_Uc~%a(yD_dodvFc5@&S{#@R7+gdsfcTm3icAC)slQ@Yd1^**(mg zEejOoE`j+G1Vfe%$m$!YnfEa5*?lq&9%rI?g)(Nt7dxQb@Na>pyZ2`NuQ9shbFnXn z)RlA?7$^5!?nt`(EH`4%Po#`KjW{|xx+0CpM!w|LDMin9lRSEPJ;K0F-bp%hPbC~( z(lIA*5T8^b6f-(mK9gP3&r;qJC9EfCQCo}8DQ}diClp{4*DOWEwZRWg4MOw>ZOB4d zJDd5&%c^Y1)G%Zb90p;Aa#ZH1fCem!PfHx1!9EptoNt_2-n=}L2CQtxgmyT(8>7~R z16jh0`JJRNI_v8+WmA^LD?=DsLCjrCCpP!oOoq$d1Z`Wmy(dn}-_x8Tfdz8k_>OpP zbATuovBZ-1MBO50){$810x+(aWkKK7j=HXqM#kcl+&H2PJt~Ec9-nF?OWsuY(1b4P zf)%r}^GgPRHm=w7vOWi|&fZ+O{mEZSCO>tV@I~)vKUm*ZZLN!{7t5cni|#`7vGMun z)l8Z$zd;^hrW}AdA>6uVi2$K^kM9i6h(kBE_L0|W`WIX5%-`B??Cf6o`W+n9;tlmO zI)-R;wm|8aP|dobVjLqNp0DQ3ytek84bS0ni*#O2KT{V2D$ioNNmrAjRMp-B?e23uUJ1 zEtZnu+Of;in8eSXX4fhrr_Fv%rk6#X`q9{gO6)c8J1pg*ZER#<=s}-BB#9EdB^tAF zK~Hck{sOZ*roW;J*$29_PfLp;FI~3X(DXKeJQ6m-ijl}inIrq=w?c?f1Z9Jrl%8{q)mpy%_G!=DK?M!8#N`%Ma;P+4cV&2 zbxA4<7A#nXU@nG12GwNf(>&cRCnrFQ1|thpS11^Mq+K|RqAefdO9kG)itv#LX~zN$I9hsq&)R=WmTVZ+XD6$2syGV`H` zsYwb|l%FOBC+@^BE;*W&;xZ4x%wT&4^{1YUROBYSLICwQ5y_>5n8CS}V~EHuNkN2G zB%jjW`6uIwu7OjV26sinW7?!qxrgs)N-_BoRRz-mJkSL-GhC)!(KXb^xW^?a#i0U_ z!*w~Cc_G6m;&Br0CgJO;zt71ofWh~*>-RVNDkGa z;K)w{o4;R-X}BN+xX@n5Ecr(A(;6$M1-z)iX^b#pFMB%heIMWVSmBoja2;7hST-CA z*E}M-fJzZtQvfpu#-ej~t1YG~aS>nD_q$j@M+-<@jG-s9kk*^55HSw%Iv0OmyI3N| zOme-st@XvM;UVnfb@u$eM!7GX*r9I;aaqH07Hu)b?TpE!`<{;mX?7mWjjeK|$poEE z*c?J3K~`ky*%P{Erhh`bWQ_G{O*W;Ct)aXvF%#(IVJ4WiN`#-n?sg?2lTu{5+ldp< zfp%fFA5u!%YnRlkmIcD<1aX)Q4BA5j2IpDN8#YJYY$(|7pPgsoSC)c4=WyRHpLjJ3 z%M!@>c<{x$3w~#AUv2O3eZfKWBq zJ^nNzHHZOvG%&0Pl(Bg!s_F%aO4gGGd^jDp$WN`sCi+*l_TMO~9uO5WAT39z{6av= zp&v#saSTPg!BfC5b^LtWLo2>hEs1T_J% zI&U)2Zj@3`IZ&b2<5xfgd0L7p&Z+zllj17f4H+N@2k(lbvJ$!4G-cgS<6z@%tOqHt zCKXBd_2alaloa-AazaEio$$(U$i#0j=TFRu=d9n}a4}!5jvZe><3o97+3zt{MMb_8 zY!yUI>xf@bvQYcap4x)j?6sqmV1N!veY;<$TD%ypwT8^is9d8Dbo!Y*(F&q_qmke= znbkZ1iGI2F65xo8vw`zDLY@vAkbagEQY;Bkk}D=>lmy$kJ^ykW;J6wbz~mz^y&$6G zRsT&0wnEW#S!fJl_5|o>=_m?}yT7%m==7Y737wJ|UscYe;i`~=k>UiDbVNlvpA8SS zUc5E=Q^#Y$5;5-zkoxZ}AZ#np(%oiY@QwF+O=2H(X}5hg#cn6EgV(9wOE|e`A(dqt zOzg+#MlY!Xd^NYpJYkj9?J?#7n_he|3S}_LlCJhk#`j3wB?Bi;`1VYNRiEo zp!%0*j=&M(&JRngPtly}v1(0dw`Sj&V!R$BOqTRj&Pn_T*WLl@7%@1;#T#?`5lyzO z11+=f_9G1A)=+y=;R%NZ1fi(iZ_IaqX|s3EjdKc!yU3IL(D_!fGuY$?UUQsv_a1M2 zYr;tUGbgCw{yW(%$F4YL-43p5lyDT2P75?*f0A|w*{@d04w%Tf3K5118)M}uKeXZU zK@HPzc7Nut_a5tKAo$ADZM8D2Dcgr8xQ3dRQU$`-%Yx`RE+P9jT57te1tw(U4a=Fy#~YuM_ZJ~YtV~ZTB{YA z@=()d8*8MQ3MEksxfwOQp+a!zKI`%!j!QtgRr~wO(sa2JZhcR2zOf@pvIRL-=YweT z8nna@-k33=Z86?tMaS&beqMc3-!*U})uB)V6Zd?Be4i6cEzxc2U!#UJn}E>$g^pPr z09_ptvQi6t+EyoSjzukmUt`~=JNe*4D0HM(JJPj+6ZkG=E{iVsKGU8;s@Rf*)trQ7 z7$tB(ZhleF=*6oGk`+{6D)e9>2hR@CPN$-PM_Y{I3N5v5#1xPckYOT6k^?Uy3mRnu zi2J!xFU_h~2OP4>qA&@H>OjAz`H7!`zF_c6QWJl=EJu7rONiuF)H9J7gtd`N59H5C zKPDng+ORY<9#JOceW9(3FKWNnnDqjsjAvd*!OQ*4!AR)#_Uke4BVs<~b?T~w+7=7Y zS!c`7b?&4vmMx%^u3A?;Tt5lVVOj~g3HiF21+sey_V+=k8$6R6;0hdGarmnlgHLAo zv*vS5IaAJ5!9Y8?043dstilxDqHoDpyHl&8nV{_>+*(*Nkaw|rh93d2?}p2(zm}PE zK(3KQgODm5UBlN%uwwB=sMLAtO|7WCB6s6$aEe{Skzap`x}?At;W(1vt~k`jX{d_tK@?8N7CFP#lYsrus7?qxlHT@lveH%yEMDmS!u78C~7AGwQLTQoN3=u66 z4YllcD5&ySrig+z1Jo}>F}?@~sPQPmFNIH&PbI01idc9fBmd$|u_aId;}S$KQ4pZ-FPn`tk<+{8JBGWvTO3Ry0zmqD0VM+?)*(xe1hS5_cBj9mCkf7^5>s|fFl|S;F@f*+;Z*N- zbwEK&_TtUavE~N|^Bo5Hs7}6i;CTd+I?a)mBjQ!@>$9==4fQ?LmblOM+A-9YU%qt= z@?s0!DZe6JJVdLm^IVH;P?b6qdG0)Ic$~-t7k|kuCSFDV|W(sBpj%_8egxMV3X+~29A(i|^1pS(cUL$SI=LO%! zh{G}s|7=vPh7jW<{i6lZ&UFeYSa*<3)C7F6r^do{xlQ1AiiW}Mx&TrH2C!OP$iZ+PiL>q2TBfKC`JyH5amp3dkaQ6`sY z#S=l`uXofP)PWYnbSGcy-H;PyZc#+t&KUe4XWV>~C%Sj+_qI2-_oSR$#AiUsh73WH zN4kl@kC+?*!p9#rhZxJ-S9Y{MI%Yc^P}U!j=##;1@o^a}({ASbLY!+j1XY<8!rXyM zxMBGi2&TZZ(qdzUZ_C*;;}@ez;VA2qD0aPmb9O}q(y}Yv35m)z+X=2eXYZ9n@k?xx z)@Rg-lNIC$%|vr)j?6??+o9MoW-3%C6v$KA6dgVt&smp@btn8_kVhvOPhdxdIF210 zspb4IES6?5MjrA1MAgBtd?Fvwfq;ep%_si#brqm(1(1P_6|KIJlY=8IDBv$40R^K# zK!9-kUtjF~cA@6VOw|M*Y+ zf5zk2b1)M4Kg0jynjlGG<*)ABd*_3N1dawS`~rK0RcbH3>EDs7c*{{65W^^3`J)ZM zMZ$2|_e9?*W4|Tw?t(sj@5f!M`pGpN(lVBo=8)2IcXTzi1*E+r8|TKbZ^1(?(?7Hkn3Wk9j-MNl$<8w{w4w{%BdEVj#L` zHFO9c9Cdr!=-l&#$F9xMt;&pZF^%V3ReS9i4uoTg2?8V71eOP6?=6DMcsiq)bDlGq z=g>W8Ja5O5T8352MBi=wcJQT+zEQebYg8b6!qFl7#okfM$CY!_y-myF%kxI|z?8|; z(%5Rbw&BUL$CN|I7d_Xud@{<``fy5mdI;{I_~x-#vlXtP?M@NiwoUHz7Te7e4bmFs z|ms1@kEX4tF%Q(PS^An8XPEdaQ1e^*a7UmMg7j9POfkE5Xy?CtJ;*Vp(0Gk z14Ijs?|e%u2j=qz4WbQbN|)s@o1p@)P3}m+>-u?cMW5w~1j^{3X-vXIV<+*NM`|u84M!&06fimCHVS@2S}watxE1atWhB z7{2RgwNG3#u?+L;S|L&Pv8)ivH$VC^p>#y$w-ZtSMozkl?c4+th0rDchCoY3xO>4a zI6ZKKDMQ#QAXWOihwqF-XG96*IpqaxP*_o z*IhW7DIplWh+u}A0CpZRFX!{GX4{(3^i=$SjnnpTJE#6zh?ilV3IPyg;u3od0Y>Y7Qj#~|ghB-sSd1FQ2bPH^j8 zZqTO0!fcmtX2a0r@ceo5nI;XNr^_4k8jc#4RhC|^L09lBJuHO1Qls{Im>(j^RE1HF zbw+pCT1+R{D!53vWNK&~&vvV!Eib;at;Mc8b`v2QtWQ(qMc-%tA@F6`1C(Dpt9vH^ zwA#=yy2sI#Dg=&}Lwb9Kiyk}JIj0ftF(&Y5RyRH@8Vqy&mgr-ZZQ&5)T33%01mzRX zX!q7pHp>$c0R-cst|=+W55FIHcvEb$s-vHR;R|V@V$^MZgtwDnMD_Iaj0W78NKMWS z?ZKOmFTK#@-E3~7u~*_tM?0c&`)y|tM*{TJ9+d1y&hydMbn?;5Npcn{$m+j|VW@L` z0oCJT3~&`oiQ}>|l8>M&OyIYvdg!hP@~yt`Ot7lG41IT>n5=z!KBp)GGiW=}@_y-& z0Xs&$kssU*nEYrn)M44Es`ETA=qK~VoCeeBR*jQAozs)uI9}9I$|ovbZM=uID-=dky4ggJS)sfLZiNOJ`3R**@?>Md zjpbjAXSUW;D3_Bn2w~*uHo-)_2(B6e&i8)1vmwV(h?l z3X7spr=~LL$_o%~H4e$wm|fXkRqxas*L2ecndbk&+e(2Vh)}QAPgYLOyB|~I=kFhP z?_|D4?bGzpmLR`4@bqc?+;C%J6~_F7Jwd>6A;LMB43m^*uL0My0-h7jmR-HEBTMS- zV-qYc>Bbu=jdPmRmW+ZGm({wdr7O|Pa2)UiJlDb*KTgsuZho_*G_F2o$$chV&{xh= zH5sr7Za*7Gj3c->2Qg7Eoxq&Ho}}4mHc>Y#a6MEq9A9?Yv`vy;1s-F})0uh!1qbPw zPc^?>C!(C)I`jIrP%<=PQ|mn^eqsO47`b>+-1p8afB3R6U@HShq4t%qAb+%?&9A;+ zL*s$mq4R?z$?#hkG(i7tEql7wuv<`#SqY+Ei>228ryrTCI6P+g30KNIm;V}Dt>Cg0 zMUcr?GDC>$ofbch<_X!(OJ7X%ngxj9`DgD02~UL5Mi;4}q&T$=~3~wcN_L55Ba1>O^+J{<>d_6yPG#HJ7a~HdWyZ)c&ST zh3n@<}_)RX)s#Xjw>H4c)Aqk!O$U z31*!^KcWxst149y3Rff^-zRgfL_C#lbm<{|)H>E^ukTM^&Txi@^zS9Fi8UW1S9<5R zz8EDA+nXe_SHZJHj@7$Ydwfq>&wnA4x7qO*3jmohe~Zi?{{b=u{|p$%sq+p|8^nx=kS(L%(+AsrUmL1I zquu7Zw@cl#q7cSl)hlT69xA&bBSWl5su=c`jMysggRzmyIYAdC=t*4v^TFzuxwMk- zGIW9C7e}M)wA`r^UScwNNV#;lA{Kd*o=z(~7;1?4v&k4$tU)b)>R;@74QRgyWWnl0 z-T8)0lkT0D#+0oUaRMnAletmtv@IEXN#{AsQ=k$oNYCE_HaEW)O)zMaO*j#EefQ`a zxXJLTPv9n%BbzRcaN#zt-Pd0kf>DOf`I!2`zh_+(V67u;Iq};-T?c=WyhhlSXEJ`z zPMGD=^QE%kX+-8cbX;9n)#9B?{*vuQUX?$}2e;>dR#nfigw0(OJhESPtr_T@BD#c) zLuk%#YK9g%br41PBg&L+450~&GIBG-_y7kbr8Ij(p%eq=j^s?a$M~1&?em;J*U-u@ z!i=uJvZbtLM)%VIts+SOwpGL*p`(9ioCIy0^ez9p$EGEN4OsiWrQTK{@r7BLS|!EO z>ie>?;6iXOek*>1*&#iw6Xa#)KAIhq6%1yp+0I81=8j*L;)%)48RJ78N7)WnS!r87 zou6Q`JsP+U-;Y%XDVf_BYxDJ(!}1YuEjV^Z%M7&of`gF-^p~71Yes9EH;-=#SUuKH zQl(^8rA`{nK-MMab$>6t05Uj;w(#J3fb5?qpZwc+w z2!`;M1^T*35^#rHQwe%^+8esV>(-Ec>*Oh*b`2Tsd}of7{t28Ma-lEt60w(1HZtNW z(FK^BQh6_*bs?nga;IKpv@pd8{)0>x<)PDv#Nr3AwKnzPy4k{9wTBD81cH?%3{de1 zzt$38L&5gRX`Jy?|i8Xm`S7UAuaB2sph|#sSWv2}rm(wxgU} zE$biO9M&MellhKhlY{q{$f5ED5eY{Xm1_O&r|I}<7h}m&avxUUW9t|>griJ`{7GCK z|KlCv&w-U8;x|wPz}9^GTU*2QAJ`gUOB+4M|K2Yw6KjT)EBnc`tBmK5y*m}4 zHdnJ{6(3mS4X!^#8_Px~YJ(2y#z}Y2Mhg9xRRu!TEJDoL41`W*t#>0p(<-#+U-!F!EHc{MEWdX)GeLY(B85R-|22@ zt3P*mloV|{Xdxo-B7k(RIiI(_o)x5zxWw#C zV*2*mUM9u>9hVo}ZuCZ{bw0TvhU|)+pkOrk z3b91TW7Rn%6=_@}_%mz@xG=4?x(*J3#`W`mavk+wT=$+z(0G&$=%!VC5h~ENg?>w9 z^Ee!D){1_G>tI&lWg6+0a{=7vJZJxEtnmaobw2xZDhq``YRoB^-<=;}Ja{iGI@ZI7 z>JQr;{)6pa8q6{4zxe7|DK{t-f62E0i|r1uS?#v}u$@RUlqfkJ_dZuns)R#s%&L~2 z8;qNxfoQ{dbRU2IAp7NvM#P#0!J`1bx_ zKdDr>Aa?3_Q^v8^ZW40oVTCvjm+;@I%e?R!5I=|M=dC@;;l4J-2kM=qlfsQK(m?t* zvaZiUY(#EfM@wVb9}J#H{2@FY0O8GHYEN{(e9iy}Pvtb}58*}sA-vN+gh#O;QA-OT zJU;;8q0jI25mwpneWxNo$tAW$e1r}lPZOwA2#=o4tkEX04?2E+wF&hpS7Z!>HBAxy z$YtXdK(31=!R@b!H9{j#1Suv2bb9sj_3Tc|u|2$zwWH}Im=qy6Is>5an-g~#50Wic zOWyAxz6+$=il-7+^zoprKPY?`qP8OhpfKTYQONcm7(uar;crJtbHelj#GneEQyZhQ0rg$O&@6V)U*n@JS=cj!Ag^V2g<&I@q#3W^uNbG6-hp)k%3``jL~S!P z$l>+sB4Ib}lY4Q0fIrznGkBKhpHFR8S^|H_}(u*6yBCFpZfnKwBxnf8~JwrL)IQEol4$L@&^L zm>_aT^-`V1-z4snFM;*X>`Zm2u{Hxf`&R%>{Ogz|$A2je9uk~>0&{NVEW zea~wH3ld^cM(8o_9~e0W$jZc(430KM2#s48=N%)32$+MjWa?T9R^H|nY8{&7H`Eh{ zoW)9u=S~nd{H%_gBXpS7q{&PLrN&kgtl?*I0uWQhYTIyLW*ggW4ffF*km}WfqI6b= z4YPU1C%YZs?&pv0NqX#AtYhZUOXZF3{CaAPFzfPn#d1f<6IJCe9BoZM+iSnqTYdZMzdwnHgjaTh~dukThOD4+RCb8exWWRr8)q7cr|da7O~ zEXJ4xjcZEl(tFp-v~&UzKpRKf(C!ctr0`Lx&BWAZjHGm017T^pa5jn3WJDH(q4vx8 z;5nKm64%URxm~qL7bpP6zqv#gJ_a+Gvtg8OO&QH7ZmZvg$U&2lUy*^vJUBYbtj>)< zG50p_+L5{UOS4s^zY{TWyKHQ~1b9uX{Ix6;_Qems`2)z80md}fyzbh29)rFwpJczx z`Y3xbR_WK)F}&2~uX)*Kt=B=C=wHTgnhI+g(^8sTj*6&lY~t3|l8w~6)Kpeu-`#LD zzK|Z{9G9R3Mxrb5#sRXqU|JDpG>~apfozzZft{t}U>{FtIFI3QNq%7#o0g^pA?^C1 zaCKwa(bYvzS984C&N03rRjYzt{u(D~jn1#jUAjY?jmy}E@LZX?X8op<`^s4bO8g|M z@XNgB7q{>*j@>}kC_(QVW(noKDU^;Gl!8kkK`bGBj0W~%^{W{#d)w*I*?ju(^jP6s z1foK!^^GK_xNo+^Jr1}B?ersbwZqV`MXMNLx}ErVJmyX08_1t6^EmN}GX^jyb%2)q z|9Z>(Cmytt=d`~9nR8>-ZPnlrx*d(CfIcf58XP0@6oyEL zw7_sv`wSo*AHBKVtGB3RP>vp{^RX39dIFw9THwAl4^Y4v@>;^rVZHqr1Q&G9(a>#k z`GIN8pxWbh4E}+1WqP_*NtZff9=uCjVL&n<1*@;$UCXA7zq*BJ7!u+Es$wbxLi*ai zL9{Z9y16GT(VVA`SIJm-ragD0Co?;mRrcyN(WYO&Ri!gwT>*B=C)29G714`3W+K&N zwcKo#Z@$N_Y*pE#H!QP)(|0RqVAEWf8|DUQcFmt5XjN&@Hwe&5RsK9f{RH+Q0uLUa z!2CYvK+~qbobx1rH|>)vbM_ReSM5o+v&<-kbSZ{4yn`K_f)e`SJuMe@8Ph6t8WvFY zR5mef`jy@txIn%GVEUYbu>9e5ZI{mqElRrqiV%i>K|txcSt_NqXd}@|{!PtYPIkKOkD}oX zsD>=zjv5oSk+*+j5X7Z12Ur3f1BKHhuyOODcqw>#~Gk-#gzJ0Zp-D;q&}j{Cw4&7YoBDHSI$ z45eU!sOz$iiTTX}(5Sp{q?i*7PCqm@C}C&-T>opJmkeDsUaaf0Tu#&}8E0lQ_q{M3 zO!5j@QJtz8nKHxD;#FMx1-ppI(AzvcJ>IFTGvTg`K1J_|%b(?L#i&z=1+X*z-yY)r zlYo(eqrKUGH#q-i$&16H78cddRQP^;e+M$4#j_+A<@=J4N6}$3TU1;KT_|>Aaw60d zz|)OSB0c*(9({gn{5<1vb5i>Dex}YYm%WS+1@^UuJ+iV75++^O(WV`~f&% z{Vv!)Pj|Vx8Jev4`l|Wli#)@R2u{$;wHbEcgYC_1hI+WMjN@Xc5> zlU~F?o`qLGo3?^YjA>)p1e!j(3CugJCEUwsWc{{ID0)Mab?800WF{Yn7UrQ|n9%QB znGE|czlRU_juSQ>2rZsHs^x2rsWz93VCy?EUXq*Z3*eI!(i24ELqM2gm@65NKQ(a$ z=(%Y6W^xV(2)sP7>P27h84}H4!YLhR$r(pi24R;`(2(s>lQ1j!3sQ4XYQ@n?i%(E) zu#CuOneY`x160-0Tu_V@(PY6WwPS~bckQH2`{l7GOhnCcP7(1B)dC@e9WQN;QA2ZZ{bqFsgN{m7ew=iv z2IxB-m*Ais6po1Ii7Lc5F!UsdAcQui8dsr&)mgl)0DcC;f(emg{~T1cduZJ$JAP43 zMRkO!KLEN{7gq<@7QgZZpq^!nNn?oHMgXT_`89b6tA5pb!|8M#jnsw?4w62bu4;TW zEo-;+Dx;D75R(IC#41>Hai!q+Bj4-}twwqGvRLkCv*c+ayv3TWR10Dhk{mO%XPv6E zc^dK~HlYLWSi0Vo9qX^5NBAjZ!M!^2N4?FycC(wJZA25LZqoJXpGQA7{~)+gIGHfsyt z>MsSav8;TZ7Cco~utU(Pi)rBjY!NJx2<|c^-eY^x-YGOyKb*E>zIao~wc#AtDTDnG zyO2jitE;|rP12b!ei~gBL9sNJJY#z7B%sLb8Kp%Yk*Z^<@Y%(OQtXAN-ouIwm&lY@ zSK@22EFvU;RvZi}Nk9I%^`VbxdZJB@d(H4LQ`J}+w8XzxHC>6S6)K&|YvD+rtplqqeElb&9SW zLq0`hf)Dx$iZiLgsH`o$N7#k zdiw+mSDc;a(H>@s!X?t|2I6!C*0EnWK*KbXQv9jP11|-KV{pAhq^aS(aHM~Xg2(gV zL`@i?I_#F13W7Du5d{2F_O-W7v2ksmQA*oI?25}hm$5S$^#&*Rj%kpbLk5G+PfSPW zL{f)*ehA8eV*Zi(SjhZgB#v}EW)hZuSikU zVg^F9%96)(7niEmzdSImHc3u&?t1XIV;ClpB`h}jLnbCO*^kC2M?T&j-XVQ4*sg1j zcEUou_*Y6(75IzP&l-YH#h>FCK)d!TSprf5qg)1wrP;GmIee7V_Msw@yNp)tMZYUq z9Ffq2>yhj;)xI#4AUBpb5OVHRN!@T?ht}HW^~DPPaxWspr5MtwZ~JEXVRXYSZ$^PI zrOt=^>NP2Ugjf`r1ikX&Qy3=op0IDZ4&_r;04dxu&aiU)p472k^W zWEGdu9$#eCLWA;J@F^>kAPPx@^xRPqrE8fM;PJ3$;uB!=Q}yYG|0Dw8Ur)(U9zt& zk7w}sSJXj?%AcSMK!Zwu>(l&8T!{UTw8Z&fv&0Pn0U-b(?F`}U41pjFk#|3joHAeE zKbsj}+n+hB*z`sy48aVaQ`!Gh@IAA?-SK@pK7YL3(Lzd+Kp3KW`)xLVU$JRCQ&AW~ zPNtL(Sm@a(jl4|A{Tps1T=~dz%Zpf9(E!Pd8n3anKAx;Jz7{=E08lT;XJO_1J~E3i zgfIjt#1~ydJwsh%UEn%QRX<`B(64{xj%kx{xupScJ`Q;NYvRZIS3AM%pIX8HtE8`g zIe-6mG=Tf>0LXCo$G#Ghnt<`=#muDr9R1;Vf&|i0?|Av$5e6oZCQDgMP|d|)!MzEA zix&~Cir^mCI5) z_3e1uWuBCn?cRPma<3#}@s|*F7!9$8(|Xi3yYO0a$1!_)M=py>%NB|tJ!fgm0g{Z- zz=h8{avQ;!SFm2VJ$9NNKUme@q`#4t1L>OB`gZ@i$!e>rhp7Zi*uvjV=^u%y|IzLF zzmxD!F#Z4LBI&PuBGixKCab21^*ET&T;4G&z8iJHT;KcyWCG&;5;M;3c;}RHYoU+W zsZmhk_~SO7QCH)&dS9WvzU(xvlq=681|A=;R|H*b3yxJf^gcFHN6B7Aeeu5f*&p*r zgGBI*9Qm%5{U{{a6wF~JuGN6BbA7b&xVdYYo^&5&@NlJ(#wLycUD~Q1lu@R?uIZ$D zqbhBRJ-_vxW*n218rf6?r>6R8S2>&;WbznY+5{&FBiU%R3Epf&|Al{Sv5^P=YP%^- z7?(DUJJyhMR=y}>U<@%97DvL0z(-t$ko8rD1|Iq2T)0r}{$)j?4<;59Amf=4Q~tV_ z)Mdj!1U*!O;ekLPFPRd{ogy#Upn6rrC?+4Awu8)v0Gdcw&edhYsII+OoMd7o(Cj-~yGgg=Dhonoz8@Xco$ ziGYNc@YfcBxRPr4cicR=*5q*;-Z*T?M3Dy?9)8HW8TgVR#8rEK5)I2{=pWEZyGZV{%jxP)}i z;dgO2DZG{7oX+~Rc$_|^O!Ll6sRI{Z5bHe@&A~4i{S_(bocyjY$qA39 ze`17QMrRQsBi`XwC{}Zi9Kceb_3V=(!uPGiP(8p zLc-pm-pQ32=L^`JOujt6qc_bIU=v1yJ?N%BfsZf>>&#BkDV>>&);Qe%Wo@}miIYYE z2M)Wx4OnshFE+|QQc#8U3> zGY}U@L9MaXT&UFwpTk*Vt9ICDx3*p1Pu*!ApdXu7b2n_s*UY}}Fme8}%9obM)kT~Q z{R^3++D(9}1gqX(;a*S`+A?^kq9aY!DM*Ehj6~kOieN6M=`FrRS7kJ>MNnVNRpz`q zlP1t_56vQt(F?`w*~oN~EgMCej@ZNf2rHfRove{+?B+ZpY1SWiJPbUAO3Q5v`LZ1f zr%WYEYA0VH0&|V6Y)_6-DqSk-MJ#ZyxE&k`K5?oJ*mE7`+2JDd#;ggvMsD_rn#q&f?j zo#p}qJQpmE)9hv_2!}rGs?{@t>N4dau5~i`Q_;D3|9nH|QY1xY`5t$mguJTgq(>tu z&?sNS)LD6>9))UJ{@@;AD7j3KJi3HC%9)6z*fcg-U^&r|mre^<8+dc zOCJFi!_?cS#^alKD2$0ph4GbS1!S5&+dh8t9vD@PciZ8x*m5kh<^A6Ar?fl;2K64S z_nM8ia#}`MiAJFgu9h+_B>__{r}h~v!69IQrdB_LeI?FjbA7hk$6n}ogpx!Po-T^f z2s!`B>`f;~Yx@>{u_0E`))9vE!^^E!$+b724GOrBdnNO?{u+IFG3+z}} zq~U0`S{TBjp6@Q23t!ZaDJmEHAxedxpP!*MxWDmjL!`rBPnnACS{Ir_$TL51HI|nH zZ}3*^S}7=jUO;f5+LV-IA2aBF-?S<>*KPB|4R--Nv23KYJA_DR_Z$TXG4gbg-X^uHJ z6AXzx$ovC!TD)4pfl~gPlIAZK>R+woz^*=Nw9wX^}7OJ85BS@Oe zX~v?`ZK~~58#2*O(j=+4hRRc?in9?h_;>ep1Bp$Fx=yR19PtTvM_ADq==+#oPUo(~ z?KhgRsHW?y&DndsHcRSoY-5xy4tRoAGzzWxOb7IwWz;Dhl&cyK+{f|83{zm>I4n0z zNDZ}yfvP5jkTP6Y+v79qlHjaDU~m*aAUNptw&6J7BzKV>e(;hjrVjD~E5Q9&1%;o3 zFuqpJ?cf82FSJ|iR=US*4#x8f-QC>u&ExgyOCDFtR!Ryi_n;`30sHy6!RObR;C1Fb z6L~7$PW7H^%rIdXArhFID8?Z&^CNUPo)SZ}J9B_TZh1TRq>k=dPMr4i9Ny4NU0;}CGq$dQkQ z@bv;$Q+)gwqkEl@s$cPK-wpA50eziDEn;nvie^u^lEU4L%FgC{j|6UDSGA8^;@&1r zW94Zr;2la-*;7T#W+X^nO1nGF#eP$bAw9CO@5dtMLq57f!-1h`e!~Abik6DE6>bAa zaN}=Dko@0n9!WC?$A8Ku7b&a(sw2K|WfV$V$-5WTlLsXupQ0iMya?xumV(GFnB%Jp z?atU$ItLgK>F^#@j4BYvJ^^vV(4Q?2*de0^;u|}g9A&04wtYOGtsw%@-thbRzY{8g zv!BB%pdIFhn!pev#mQ3dx*;(`l#Srx0ZJmw8zyAg?Ay@$@+Wc6n9g0Ou6mD`QPpO& z=4#i1hX%M2(ETYd85JGpE-Y{Bx<%_*a6E!`^~l;+PStQtHKPOP zD^|EqJsFznb%%&066M@U3_kawQIbbv17$ZWfVkbDg8C{Y2rA4bva1Vr~HYSZiaXTeAR3p z>$xQWcv(e#-1_5t}qJ@&)q8(^*JfUTXbMptlht>??6h!lDuC5aI zp}#p5-6himN5j>O7BC;!_%EU;69RueSN>e(`R>7ACtmOV@|VG;v>iGAlK^A$x0w6> zZ!ssOXZugc1<6aht&eH!=dL4ciYUs;!2 zr?laK((EZ4*RhtM(FC7u_D)OwO40cWkgzbzPM6KHsys)zR5D+_CyD0JWVtw|#6WW^ zuI^^mAdGQz`E*m}F0O38Ppzzg1EHh^{pT5lB&Dws?4&u*A4_?Ywhh$ancSV`h1bv8X5D$R_iImlLmvF*8Yzja8 zpT>y;-KyhqU9m8l2Seahy9o^>pAAw#O0fPP!rn1RlxRuY?cQzMwr$(CZM*kw+qP}n zwr$(CyT3i>%zSh2+&Sk)R7Cx$KP%&{tXxmMxpIl=11Il9Y?hY+&Fq$<5;zhqteqJK zh1Aj%I|(;$`>uKr;+zM?JaUaLbg}WHZ2u0dGC92L%8>HY@PjHJGrJ2Wi1+(jLora3 zKNTN*bnXFEg4H33A;43gYAPF?N}>|fzrN9fBy|R}f82{=};NSi+{QuXXlF5IizM$9%$pQJlM$d)fltD{6UCSjA6tt?)zABn6 za6;zO{G#1^VxGp5Vu-{1nxYDSf4E(tFegO|67cMyPo@FSAL;wIr)R)j#1K%(RjOQD z`~v44-{MAvUO=I4Djtj{^!lpjP=Su;5&t}E3AxQ7CoNzh+m6LDjqZUh1h~R-pL9*; zB!YpmqgST|R0s4lCdrdctcc!3UE*Ic9mo8_1|fa7gAX)tCCZG-S~gb0IjtCCjA^-m zUif6VG5fxiGaX+QN4^tXVQzLafk-ay7Uf)*zuf~>M>A}_kq?$Yjdn-;h-?enmDSj^ z$r}R+o!5JsH4vU$=#E_Of57Hp&YT<~xxYM~>h&$@L;@%i6621iQT1yQjcWxMa+tBm z6{u;zYQtz0aZHrWCHrI)pTciOxv68l@-n~nW8`J9t%PlUL@b1l=9Qg97%qv|uK%%5 zlb*04RrpKA{-amwU)OiE|0-Slw>?SKz}mvt;P2k-pIb8XSjMP zsgr3C0eSpCdMhHxe12F{jwmVlo?tp6t`iCZi; z5LE08g|21?D_Z0i0-g7Du);$LE}{~3w@*QPy6?w`)J13F9^ zZr`Gy{MOa4fdzqL@=)`_lJ{%|Fi+8qc@$n?|D(7I=qkS*{2L>+e;cEJS=>pe8aP@Q z{B5QXaI|p#PoDALTKT^;InF=-^Kfy0zjiQxaF#-@i8N|aW(Yi4B6S14MTK^4l%==4;+Mbk0(9DsL0>iJ4qeT zZdS!Ed!YmxaGd@G8_r%1^p`Cne?~WO2~yJi2D*rF+t0Z{6DUzY=~H2L&AWz%B>|2w=(ANIJ1oq)-kNFJ0cX zY(BT{H0d>a^v5+>5J%ru=VLM#DPa;ywrp0<9Lb}+zjIILIrDVjz64C*Z>ACL=s+4b z`Wu{vo>aFdU*_=IQ8)@_zeS@7SMPWc96HR-)tU77f*_GvBcUj}a5LY5Z$JnAL|Yqz zsF}l>ZL{W3`7BMo5S}hHs(CKh8ec%GQn1&4&QPcpq%EwM)Ou`wv%TYNRIY4CtB1ZItBk&xDLUs| z`bWU*z3QjnxwAtGpE&vn=!U~%+sSR3V+QN{^QA=%AXpwe7YoV8SsHXUfTCI^q7?~X z0GaO^^p3=oc=O=C0-rJUNKADwGw=hk`&f1dcsANCTVG(1@JAi7j=EQGoxFlXhM&Bl z;5(Nz+|rGU!4AXS%|n=9%R-3eyu2*!S37n{dJ!5D##ZC&Q)jo1YE`CL#4pc;BpS(`w7Ch*X4P?vVgGchbzdsCrq)tS&L7t(-ilnL z2|o|c^&LwzoJ0DejHUeci`S+$UsLLE4pr0PdFZ8b zbmRjDr(e@-CK;t?BIgO%`8506bsS~6=^$np+vY!!0IDp`(L(rJcIKv4;{2cMFDy;s zLgyU35pA2%$t7OZiq<483!|(r@rbIG{-*LI75j@Q@bV9CQ_MtT#)|x$?*bWC93nFZ zhYHIC*(~&WWf*Q((bH_JZi!a0ViWT42@arUCXWUp!yK7t_Rly#Np;~Ngv-X<{hTnQ zltw@qgyb@?7mW9-`M;eRQ?U;oSLloaS1|ioFfhAO1lY#Gn5m7>*)Z?95}IB_pdTuh z%2i2$foROvxhsj{otYI=Tgx*Ripra;%!;!l+of>au|f`cB!=W0k`NI}>er1T_!zaA z9ebvs!&>cn^Z>VDaGT?>`)|^a;vXy4gnCMF17BGspzd@8`D<*t0K$y%Xyd;TEOz1^ z<1Zs|da;yrdyyh~d~eVg-4L1wya1&7M}lXEtMdYMMo8-Q9Q*At5PFxZ}i6?1}_LN-$eq875zF?aj z0enRFG@c1);~u*LiFYB2ljJwzDDd@JzYzrh`3Uo4NumBkxnA$4?|c^oa=yMSwD?fu z$yQT*oVx4cjp6$PpP&-6`YTx@qiH}Qum%gTMq^#F7HeQ?u=<&>M!~qY@Ky`#dtw6x zrone?iK`QF;q~veV%HG6L3~EFW}VxX>{Z{E(k-D}Q{Bq$@IUg3^jf?xnwHzu@ba74 zVfNx5W4*F}X45we8J}JDbf9&3@pV_QGOTA}GwUcuLI^K%7A`&Ko z_!{I(Tsh5l=^b@I^vMn377yDfmF3%$?IzM6c;v&d_T%UA9YsYjmNGY+U>{MPolr$E zg>y)%GVtXQ^sgcsVx^yEjq#IPkw_UvYn6~6ctvj+9qx;1%v}ZyOjw-HC|e>iKrZ_k znD`@fn~KG~P1q`Ogxcrqv%$OY8fff$-G1kre*OjbA4Np&S`(Gc-#mr~@$X8`f9cKo z?_BoJ{MF?Np|8BOblWyD**Vz>EDlZ|+glqV-H*t;4`2W`fEZhg4sReHOdlIH87NW} zDz){3qTNSgxwJ1R7*0qFbKOkaq-nJ^t68O5C53jxchb#fw=GQyzwYg0wcT;k{V~mR zve~fh5q#qFzT^#nPQ=!p2iLPaRdcXX(&y|Aq+{#+aODZsWSc)R_4o&>$+l?1hSs|S zi`x^8XHy`BYwJ&21nuvIqBPo<*$5Av&%cNBT<-VS3(KM} z4$yvwVmZDw(SDbLf!^}qZue`Q)vo~E+_DN@t36)vqIIO>^NQBu{l5Fc^y!BodIfa% zRy>fK8(4UpVp@D>(OEy+5_mt?u;dX-IXS!krK4L&uwwa1(%vIopnG?_bGzgITHzTJ z(IaZ4TawMj{rP+Gp%|?Aey8JAYw@iaOY#*@`x7VXXAY*}74X+Bt;_e=)Xu?;(gjeI zkN8Urv$yyGUPqq4k6;QP(y1K8N{{>nlckqzN>BSMn)A>6&~yQtPr-!RnA-2)Z?EsLGc{Ah!zVfzgumOAU%!cF8eC--pf_Mv{gzGbC?gi-qFUgcyrem&i5ST_hAF~bA~lqm z!4gs&TN>i}Q5H;ip6l)+l35w%VP&h<6O3=!i&N(>8@5yDF-Ym`Bg-h88>WHj!cT-H zE3woGB9-JxhbN`07lq-&XkQ^D<%iP}ustGMF?TB=Ev2hpAR5S2E)2R0R)``s*|v%- zB8WaU(iZ~e_mQy99!5RF6W}XYvdozjkh0EsHIO#XemS>i3gkPG>UfLBn6(Y5IH8|>F{@CT*Hbdf_7xn>h4rF_m`&uM*xjZP8{%4g27a?Xo zmIv3>-#l+d>&&4>D)%Uj#QO;G1AN(t_O3M~3gP2y4+3rH6cubR!P#w`B)ga{o51!f zUGplPU3?%G)5HZ=a9-YP$SM7gE)t#jzDUX+2_(9XHD_gZ@2o#VB;E(6WOr5=e^8m1 z)!0C-Cj6TSK;12LbV?mGW#|zhM9__;a~NFiDwCj4r}gNK_VOV?)0|d7*g(aWfG^6$ zlEknET$TUGg7V+@sbZ1~Q=h~>Y!iz}vh^}n5SffSitjj!vsPN$ogvMVbM^;%(Vp=&Ay42YGf zy-K*wlYur0SEn)I=N9%Uou8i<2oU=F-H;<6oOmVhwlMhl{h+f4bC>I^p|8&(+d`{Q zNXFVkaOouo=f^l$G_EIEO;XghwU}LNNYHh58n% zyEbz~s5vpZCEN2YKJs)x}p6wiN(8+;{v4BP92B{fX-?KlDUM9NnSUU}WIcQl> z>Q0@7fXoUHm8DW$P}Wkz<;9`UFOtlonu}dbsC2G>+~WjRK`TsK;s;J-vGHC*WY%Ir ztmZKS?jfw|XqZ07xV?pU zMqyn}Bt$J1#Q%yCia%|c?5TuU+MBo(C%0Vi9aVM$bbN^JRD>;hCZBf8qOVH9tYwZ| zWQj9^RZHtG`n_E*%R9%4IS>jm5!*O=F8tdJI%^%dngLk8x&n@QSpZf^A)G|fph>L+UnUmGts3%jt#8?fouYzq8=;GC_DPrEXIR|PfSw{2}F&!%f ziRuUTka$ZA~NcPy+I@Dl3s;ig$GHA2R@*~dU(QlKgy!Q3nblyV4_gyjrggIE}I z3z)8oG(`=JaN$ewyYgUJAPl9s%e-zbb14|mb<)t6m~b<=R{>LKDi7JYE=mYSMq8M7 z;SWVJGUohx(6Va-tUSemyX1+87nxDAzN@75^n?U<&^Be+9^EFG4l;V6US*ZG##E14 zO#5Y-rzmnl&o}1BNy<9>i5Y!!$n?rIcs3U6P7*DMgGsec)Rob?xk+=XDgK&q;*gpO zVcbHNl@isrUwb+xzyHqEdn0+~V?V>!TKS!Dscfnx|9awbYfM4Z+GLr?SynPKBPCi`mN zJNqjF$Pfl*U+FC9Vg$b#R*B8`Ve|G%Edvz^GYTukTmm+?vh4E z_E15!W%N>4pBgZb%It>RGo?28=k-ccq0upO-eBoVZqHtTj>@gk10DN8Nsup6!Lj(8 zJP(TLGIBCrIxgghEQ?E4aJnT+E3p70ffFV+Q;(87qv0G0y6CG%g`hZE8Ij-|o?5>$ zoBU3}4WJ^Wj(QfFJZ+=IwxG|rlOdQ{*EiPuq%imx z#3&;xn9(;3@qJqT)$WHJifdw2B)1(3yw+?}HFZ8bODGEX%xIBh~?M}9F zIL0KW-UzNH7}SEpU#bRuPD%|~$S!*7o667)U-s3{rpJY1-dlY+?{pxOvVu6dO~@i$6@|K5T6)_aiVOHgt%5h zEiGVau{HcI$>OL`i{Qe;P^FBl?&jxU9Nf$V_*B#gMkBDQsnrhb8vysG@+>#;<#+Qh-KM7$1c^l$`o**C}+;Vz*xSBxa#;o z73is`=H_6`KZw%O6dJk~^}`?)I`%_VsL0r0wi>?}D}!{5%i$eSC9AeHB%mmrZRG~( z#DO0qSsJiCTr5dMc~`W~DUMA@r6Rt^>Z(#)1_t&Nr*}nPLGbPr4c!z$#>l{v>VZrg z1Cc59ncSDAqaJ9quuNN>+K1b6KXm-2SKdhbR3@J*Ma0GBSEi!SjDXDLKdezemhCLx zoCAM~UhV>tZOVBKqavlh*EiJ-1c+N0eiTC`7oro4hQOrx{ zuojm)ushfQ1To&n3?47pI=5Rf=bRu0E9_(!-;vziQT<8#RZg49#vxee+7No@JF&ZJ zsZR;Co3Iy`JHJ?j zOPs^!H`bs6E1>pQjzP982D-naRT|*d#M)mwUYAL_BN!O&{s^J%M8M7QVT*`6-vQm7 z;B|7Pml4g_ahOCNp;f`WEibMtF4_?uqi6IY=+!bDMl6*AdvbCmRm~3Z4fSa6@3gMk6BL1 zpCz?ma6urP$d0$F4e-r87(O^*gM(;mo?5mOaH>V`r^ zh4`cS$|!LAbipJWTR<@_MiHZ6wPYH|a{%GhUayD~{=N$K?L6JmQq(ZewQ+#Ff4XMk z*Ik$t>bWDa2MW;Z{3-^lfnSB~tex%OwtSdh?xPaoY}=~f7WIY`0qV+ zkgU(dVM{#{HwkU%9J+c{3WL_>zR@DDu!FcM$8y?|v9r?DAak&J>cLr#Q4Dl>bg9t# zj^IG7tu7dsr*TiCGm!aPCs#kI>BS>zZ5i4_iFWFw28_o6X1%@B9N z^n^!SB=4Ymb|Qvi!7b^={o>F9jK`%QK@|kO#%$qE@2Hr0G(0b*T z1$t07CBh3O3;P6$zGH0S{uD#=;f^>GZT^%5h!O$MS}EE^6Aq6g0NAA?LJp86Ykxvv ziC@Fs)kDtc2>jixUK28WZTDu?q zI@N{tbWQE9^e2A4Y?n9CqBvIv#Kf^G z6DJx{VG;G|zkiQO>Zp#%3vOC6(WMo+l=qG*%g2*0cDE|WJjyU|$CYgYrf3&TShlI2 zV6o?8Cto=03O!aI?Fo;>I?6>Z8}Zy9p*IgXYY6p8&eh%c=W53y)FipkYSc`CwgDQ9 z4NrHv-RGZsQtcE^fP-jjy{)0YQ(JBdzJ~<=N;pbwCm4WCq^c0hKvwv0v{YutWZ>bV z9W(xj_KvX#7K#d-O_skuBKont^^OE_btz?BMeZ}lKi9%44D~fEpjpK!kHFw~z@mAE zS+9r9ZsQKW-fZ4Chzw+KFB-(!s<3$McTp}1eMc;>*c5zKq(+#~rH(B3pW8jxCuW{M z(P~5uK>n;D?c@#glYxhEd=lUJ<=lu69*K31RY2r|ktCCv>&n6+x!!}f$S`VNX-l|b zTtM1X(cqf^!5@6#k|&ca!9ObY4bFr}SutQI3n{u>o_}%us*il5sUyU>hS@^0);MI4 zsGTQjScqMLCgUQ!;ZQ-X(iE(svR=~g`~1<>=<6LmNejn~h*U(Ps7awTXv$rQQn=Pm zZuMNAiR(H4gI|LN$|kxTsmVmSsstBt=B3I4_*~)dG+AW_F)o2&TRT} zc8P2WK*$c|I21Ze7m*7Y_%$~oMSHTcT+{V+eIpK1?^3cnqW-1)r@Do^e&s`)y@kiX zLv)J`^JG$zoWpfXEcfE`l789o%89aI5(grf4n#9WqtLzMF}V6=YN)(v#)COZ;kD(V-<#<`nhz(r530s5x*ILZeQ23r(DgTBm&Jyai6d zHt;Z$LH4IA()t8h!>XhiDGk3&Me)o~m)P)i>~nQO7XopzCib*F@o-^Ax~JW12?5za z@Mv^bn^OeJ;;WF6Y01QW3WWoGPs}P76q6}EBWL+Nq zS%dyKk~oYNRqtRXgeoEp!Og?Wsb%L+iP-G-$#P0acG8nQW7X;Pi*$5J4KZWH66p^0 zG-xW+sd?Uq@>)F%#^^(V`!n4XfN3n*UE+RJ1?DBCM5xjti;rc_{h!h?U%&chn{n&J zGU_l_=8&Ds@FR&65=ZLqZHbz28QmYvL6xF04M;vS35y_3EqQP;yRI323t2HY)O9E4 zCr6XoVywj?Ka*bfC`l>b--MnTWA!MhsxP?|gN$XXEwfoGxUk?n7Bh>alv^Q|i@N+- zSzPJG%B?e39^P+|GFH9Me!RiH+H>@87iYlT)L&HgQsY|HZtGJ zvKmlPAxNi4`iPEws4ijbMsOPob=B2Bj<%{f8(UOdDUYvA6se@>vMV7NLOj?+JVKy> zviL2>Wm%{9g#l`0+8USMe)rIzetkXYTTu-WG>ufH7b&1{(1`!m2CcPTt=pl@EI$4I zT5X=CBM;I0y1HE|809`51$mN=>CaKARAP%~_gxt!&-ZSJPi;0k!b|^sz&6A+SrZ8p zFdlpNke<5Jj8mpGCu1pdfyF$gHCu8&b8B3dRmBivgDZ1g(k9bk%3qBd;x`%Fwz zwcotbBd3r__W~@R9==!z58xC+mo;SyXn6cKtU>xSV+M8iVeH(E;5(^7Wck7HQ>#C@ z{F$Osa4V(m=-iu9EAP5wty?e5ry@Q(z`Ds&t)9{aZf(1!ug7xZLGu%e$a_)OY!^x{jD9bzM6)wI*LFMERj*T6^Nr>g#&hu;lg+|0A@ zV6zb%dsGIL-8!x~lkN4V*KS!a+#^qH_Kw##?&u$JKt7zBx830j9q?vo?ppBn0nSsH zr&+vd-@IBB$X!QtuoVG_&8g|$xc0v}IpGWXCU9MY)ba%%I{GEyn``m@i)I$aqkY7I zx?cm(dkzHqCdA?vVA3B9rMe5+Q(C*M2_+?)qH>0{&Ko!nvNPqIu9nu^4|mL*ZyluZ z1%I8Ub-oJHCdV%}$h9o&FPP4Qc3cex&NM=tjlLz>p7>S+K16HgH_Z$;6d$?xrj@?~ zR&)R;`-6DgrxYIV3B(i;&-nLBK(x%7m=+2TD}MNiK_y{wQ^>yh#W6#`F+;>bhwY*e z3IJ>2%x#2d&lF9%{|ioNSpYo)gomkN=wP-2#C>MWZ1sHM*LK@Su3bJV)tCFu&lHl)4wTSdg9|?LR0xJ$^*GLX~IRy=#Yc#)6wgn&ln6jd$Aa8ht1V+c#L%m-L|3pAd=>SJ({W2QpLrR`lOm^wvjaKw)m$-+wEu@9&xA8vmoriy zgFe_L1fmj5S~NyyynfesdBKzdRr8hBm}^x=vI{l+{7Ce{i>V_BonM8M6b5aV$?J>^ zQ`2CRTOs~prw8iq#A}e>0>@$Eqw~LfY!#q@le5X>zj-NFZ3tFUh;yDmqn`Y(C!xO7 z_0S`)5U584$6&og7wxauo+Mj^x;5+< zXJoZTMr6TsuV;{-4A)2Hf=zSz6}ZOEo&iF?O;J~vi_VCA01PcUV2GZPecFCK&_w3S zk`domhCZne%LgV_aAE8<=QAa=w5~@jQb)8ANAtTcvEN!uq4&(iG<)+GREv;ajZ!ne zTd&Hl%TJr=_2c9VrF6PuJ6hO7(FkLmM%w{0eKR682Rl=$YH=~m(pbOYE@X+SE zG_l7r8+wM1sZv6K`$Aiy1J^MfA;$YgDPQ~wvunF zh3-I9ArS}Oy3s}9`fghQ0$v>|v4@Rrd826j+For5xKNUJIhE@c^npN+%oFpVZD2IGwM(#ht8MMarxmid@Ftcf{$q*A1p2f zq*1j)MG!tno;mJ*oaX%G^#y}ZFppU075c~g*mrF{4cVd>_At=Phl>n4ca;t{ZwU{} z9dI+vfIYx>EYTGz4dE)*SbLK!VZkz^n!gY{F9IPW)$Q1{kuIJ=%>v%%( zI9korp_&5~rSBg>udBdU(3dQuELDmf>8u8*D6D>G#u0`>Ax*^Cm!?;Rl)13xdkbEsgN%mc@Q*y zaFa>)GEIflq*w;(xoEDh;?;pkdxO@I-&a7qbs;3z$-wuq-uFAck>zcDCG8VfP&w%I zL(r=@YykpJN`_v@I&(_N*j#}&6*m)ZB|mk`-|;0IUJdm8g%`zFuxYSE88>1XoyC>4 z{EhrBP?cQ}+VvQPt$brAwn7me(NiIRr&n|q&lI7`j3V4gH{)qF(#zEX9Vh!P zucK$Uu%nUowl*lvAF>wu5Z0__&(Sq^4~XBI3ehui@EXVe8SswI(ec%8TNSi}w_Hgu zzYJq4pqZAglg~DEBsG1Gx|5>_%rTuw1@{SwC0ExHv9;3CFyLZ`{QZ$IM7)EH#1dL5 z&c)uPnYI!%H)yeOhD3s5w`%j^-pB>w5Rio|svWgA#Zua|k~ggr^SlSj9=#R%s1xGu zmXLp^JXirxzj$tiKJ#MIqk2CNL(@q>$1}%(c|VUOnttz}sE(~}LbFckG?z&p!Ii}9 zK*_@5W)H&4b*o!?SQwm25B^kyYP3&XYUTG1Brk?-0TzQM;{+72l}0u!(v9X7sSp`) z)zAJ6%Z&b8kk_i2+l98U!EDV*k`|KY@E=zgrfE25$@uaQbQ?^dwh^Oa5C0*q@S%6u zC{N%h&$}M}N%6ey0IY%fjl5npKV2||JTMxcq??u!m33xFL{C|MB~CrUR=F0O&p``g zG~YqR)Ko0n3@u$rLJe7nOE3X@oq3;uAJ#3thkZ zGZu1m${z4DB(+(MrttG%?~TYaV*DK1(~C(_6Irg2JIF}Fe5L#}kbN>Fa*POT5rey? z4d}28N&4}+@T3hQ-@ezew$JfQBI%1-R70~6ThCx=iDdrSX8VSmK%cFTYmd2wx(KO!%s;w#JUU9f& z3k%*iH7=V8CEOE)uzLccE#T<810gIBeHK425T+6|!I_OF&f z*&x*|Cy_h|3!4)F9&=ZDc+WeX8yEUakBPB(mo5fPHUu`gzz42Mw~V!7Co^nT-L{Cu z?CE!HgG)Lsu5Me|t^l+xse7w_cG~PW=GyE%O0;tUK1blkcc>#N!;PidsFNq zEKJu8pe;vJN}==w*q&Jq>+JM-Ke(t(clsrtaolfi7^>d@SsQ!?RG*2oC%yf3F6lQT z!auZVcV%ezaISsfT9LlTSdNb@tl3L^NL9@${%}UzLN`bKHd4FAt;E>j>-DJT*_^;V z@mf>r#QR7+sh@cRcqX}->F)p7X^Z&^fa~kDA;;?txfA5gOu0kwgqbg?e@I zB=!N=;p^`{w(+F)iN~vHe79OW0Do7n-`k?+>(&<0!;tRv8qaV~1^rE7SIz{dD6q|p zQ-&F~ZNP!qH8R)x4NK#XaT1*5 ziQs`%l?~PJ$?5^7g(>`M{48c&B!Jr!*fo)yA9Oi(BlyQhFk>;~hS})F`%{(4RjdQ) zL1UGX)d&02p)vQSASoQfq2L54>DGIcxBluP?k4?`P0&bzImXcwde+qepN*>@v7c*F zp7cSs6IrwWlumfSVMQnmH7iDFIum@28$g#ASN0G|ACayOBq@Q0j!VNKhJY=6jo`?n zVQ$;U8Z;?q&^3IpK)ei$-~|CGiU#4?a~gK}dWME@qzCO9mYrHTLqZQ5HT=z+Nyk%? z0+iI@MZR5C@XeA-Tb44qai;?Z^iaven`%?6*%eRpSyzqfGauyIF4$?x04`T*;^jmU z_d{QTX;J=#PD`K7d(Rymw;hTIUJaGolkG4KkGtP41Y0^1PlP`B*FKm{t=Lf_1|;&- zynip~s*E5N0>Qy@E`}}<=gYM(TBJ@AM&W`CdQ!6>Ry-j@fUl|gy&ez5M zNvInb#6by7WR67d>&hWFZqRd=y*(Uv1m2b3$*l34(^0wVpKcJwBjNSl_cC?{uYx7! zt!Hve3=HjFfeQ{hu1AIB={$AwO2WMr&)1^Y;kbHrPgHwvL~-5lcXq7$SM1Y?6F~&J z00>Wl$)ku}<8E}>BNX|m6ageX*o?O_ds;mZwOe@W69etMr(5(IzZ5r|&LOPXaFJcG zZQ!5%5~jWx{jFEk<&2!E_d6SF0KOEI+lN(lZ{CbypXuXUsMWI49+po>)FZXphSwzX zqiQ3xyNfliPtfIlJL8x;tyQPeA-Y?gOA~Lf51O6~ubGTB18=ySsT;L*N4{a)CG))R z$h$Bo4aT%DkfwDIr#_DmU5>NCGbVY(tbM@p;aP{zrxa!)cGY znl+ik^SmKduJGh4hTBhoyF=v(+x2v($wvEBKGK{vZy|OHCgpq$)ly(2C5mKZqWh4! zeC}Uqp9+nh9{TVj;t@aN_2g-(p@?Ygk3zEWXyk<0rW$Dmms*X5$ZXyr$e0;k1-D%5 ze5;aaz+qbnxBbzB;JYG9`62SwkBZu8UH1T;@b>z>c=pGmDnr%QXg2evM&xli#cE zZxQySK5LS&7IQxQ#~q>Y5t~)2=k-ZnKs%00jEZPv)_o#1{QGi&X_q;ddgkg<^a|f> z5YU-nt(U}qmJKm)H1BXqa-`ET=;+F-jD77sIYa;xhQ-L0j$8baudG2S!dh|YF{23T zZj*3g{hk$AT7-54CvZ{MC-=5EzQ5`%(J~X>u=wtq#7UNiSw-rS6RtExw6pOe7U~!3 zb$<8W3i`;pu9sWes336q!ro3x4WPX8cn1Ti%2>;8s(jH@o3d(lsWItE-J%+sBVFEJ zNYps(L$P8V!MQ7(ZfJS@hH;KmW&#AthPU z7>}6t4DC2u8x(s#*A>K(9@Pj!$|~{)KuJ7l)gcn*l+3lbJKHjQ3VIF7E_L#DL{aHb z1nV;zsM|7tjbTf6Q+R);Ao*K=VmDa*6>blfD4+nZB8`cKAUkpU<@si&jB-qb2148? zS}lCD>(-+t5=iX~^M{S`Qw+M=+dunP^IeJnfrY#V_8hX!YW(*2#-iZ@b|vlGEClw+85mWYA}OZoz!hs zSU^$J?>^My1NzSn$b?v++v!gKfLdSI)rMW10k0d?ai(?Hu^BdgysP0ugt6OJ)nIfzC^qCE;sXt|N+=;RO0IYS2Q z^RQcyrH4SEt(epj^MmrYp$5$;cSHA1+W}_jT+A`)X8j_D`FbE2CPAj547Kuqt#n^n zy921D`NBLWvi7E2q^x+}BgGfvP!N3f3IJXr1keaXdGe9|e@&O^UBEkVe#|7su-I8e zu(lR@4z2h3#0Vm&WZ{2MZzMDU3X| zP}lNE*RJ*_M#-{b+?WwaZ_F@v>s@j)?ZouIK&(goG7dk zS({0($D2`5vK&3iSh66INwbpW7+LIL&ZK;(LVaaUOAcZeXoIm&2VtKAmah6n-327w z%^LS8*BM29mEu4Cpn!FqZ8mZhFra?b(Tsh=*y@Bm|KR3r<3xdSV(RFH!oN^D;%oHn}pM*pITppX!8kxGRFbG<+nV%S(AhZpk94T+%dmn z3-)c9PPhQR>*z_a7?fenQ2JVDuNzX z?gx>NS{%;FF2cN8`REwYdPM3Vt6n*KLJtU$7p3m!f32eBg{Yzrk7pg{qX%M$ilyFEeQRh@@pbX66GG@a-8ow*5_cR463h!g%Jdy1j0wZMrP? z*fj0$u-sDs|G|Z{-=HwuEYQvl*14~p!8r^&zznT!ry5d4Y#=n{Mw)S6b@U-b=cX$%py2S`33NYt2u$rr8UBTO}_au$ho}S0vj&2EON*7D; zPK+d0mZcOsFB+9}c0@0syqK$|N*xy3bBSS$AVDsf{QbRlo zL0a2l0&31e#vJSd(@s9kz=A7(Zp7}wq|Puuw9`N|%g-ZZ^%JTOs#6A(O~q+#)s|vJ zj#Aj)!_Bt|*8lLgLAG8=Pa5K;PvVGi>|`wWJ7*H(z_?l;5Bwf#cn9l?nVOj0(1UH; z$9z0m=_ho+VLSj;C$kNN8mh7nYlW#sZV`%Dg^&x^x%F>F+D87}*RgN=%D)K|G8kZf zh-)CoJq{YiQ_0_0TbG}dMgCkrmLHWxfopUUF|wv&$k(C3-Disiwz@M|vt}?i9WmtO zng1tS4z=d?Y@f}u`cD*F_{y8cV-0TD&K=jFmS@YKjFxb|TfHzoN)j)$rAHZP<&cWM zB@^VNQ|HD~+eZ?57+NhZrJ=ZyQCh~yoCOzGoCL4G?8ch$Yut$wA86&tfUYioN64jU zE0l~1$lpHU${fI$vrBd$Ts|nIVL{b^>kH3FBGG&Trw7s0KC!xvIpIvm5{!dUa&?R^ z-UVm*iIPZt+McAC;Z0rq$cR^TlVG~N0yj964ehb7PVp;RW~|`R%st#f>8=AK3XMV^ zxZcPf(X=`om6@WEss;qv9y6$IY}2G@gm>fu7B0USCO_)hmD-{akb&ArJU=09Nu7aV zIpwFZJAerH^C|!;--gH&Bu?e=Cn<6&R?|18>3a*Z25I5r*e{yB1Zj2GdZze>&>61y zs8Q)-rOBg4X+H*VzY3iQu6<`P`c{BDw#N%SgV}qQNBEsw zwlA*3P&$geaW(g2xWRs-_3(E{Hpz=58NJ^Yppz>Gfq|xWV+;w|Lf&tTe4bm32)Ve-?tt0Io zo!KqwbfqCjJ%w2eG=3Eod=7I({^-PJ%r@x?QQO?0TmB$Ykt|)RbMCN|^nH$OK~PBl zm%3||pWo${G1>I1<eVd-$y^!_LC@Z+8UH0$W5|XrH`o@Vn60t6fdZpxaClQk_KJqrS0Fk2RG?g(T zm;4Fp$23%rEp^@4k-tF5M5j_U)-AP^UHqv7yB&$4lM8z3#0JDQjDscv5CXC+)k^3f zCp$s`hrS1B-o>LRxl3-^$94IGWT(-@v|YoAlR5BPyp zj_!=>sIG~Dn4|4WpMo6mfj!eSSYKIwttbqqyhRyVbC!w9Vi)S@)>sRXfhGzy)nNyp zXDDsUjpA+F}?`#jcSeV3tAK)IW#DI#DZKqxh= zTh}2rC+;s#4#10&qQF}r>vwUQnmC5mw|NOR%BB-HNnMzy51x>l>pT-dGbd7F1jxG{ z7bbq4OTM)4--Lk8gQMALQenLbo7vPfV{vriTnC!6BD2=dp-Uo{e-O8dY@O696qo8m z69PISo;p$*kDZx6n)aG=V3Cfu(d$eHtU2;#QcoC!X#-Oo8itO#)G93Zs%k)~jd8Bh zV(rRe1evx0UMEG}wr_&pjLY1z9AoZGG^8qJPqk0jP)lWx{GF4yYVJmYMMY;iG9k4} z>_(A6NN419cx0X3=}(iSrX_|=m5Zh~%_~;djrMto05ch^K2md3&2R!l z>+j*fk|<=lAT4DFf^1y4Ke~GY(0Rr35nW+bZsm4O<*^#3NqDqOaDcT#RA=_ePhNT4 z(bMCr8`d0-j3G(4l%5y-NnDhnCQ-8Te{S`@Z`XS--rxWGdvEpjdwo9V zIp;j*oaa2xeZID#{$pfK%3iPYRuz=@sBpt*r?<|eMa{5E(~x`lhGJfByRACe!$NSA zqxa0Y>2qziIO(y^A_S+nF!e>E(zM{oQ%=@)GhRy)50hit9u0z@y? zoO7?8CzfHlC0>R7ZQRq-DC_0pkb3>H0lL-Wy8H=)pY^8iwB#9x25Mzk-oK7d{$}Cn z8YffSQH7J=X%}s?Th@T zzSq-6lEvHx6aot_=I4PX{MiG zu9#scD>FXUFfmfdLFwuy<6Q|tJM%A{L+K1bpV=_p95e6P#9@!Y^GvyGAG)bh@kvb5 zKXf#jzBx77NL;w_j!PD*%}JS}uWh?>Ke)@RGdlc*vDr4YskSYLMf#N7zU=1GR{4i2 zd`m{JV@oL�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 literal 0 HcmV?d00001 diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/lib/jslint4java-ant-1.4.2.jar b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/lib/jslint4java-ant-1.4.2.jar new file mode 100644 index 0000000000000000000000000000000000000000..5f6bd7ec9cf07d618dc3626daf5f62cb5616be8a GIT binary patch literal 18281 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 f>le5mOE-Bb@Yg^C1oY)bYS^@`S1S$k)UP8 literal 0 HcmV?d00001 diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/lib/npPlugintest.dll b/nezha-fronted/static/ueditor-1.4.3.3/_test/tools/lib/npPlugintest.dll new file mode 100644 index 0000000000000000000000000000000000000000..07df0b3ec9db71987e1547ecf54791962e89e217 GIT binary patch literal 1179136 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 z zxc^yOFH)X}#SF0CR#*ohzXTN4HG zcOx}mk%*$Sx7)Uf_m&DN`7pbd=}HVuNS6Cp4m@}2Ip|mu5;`u1_MR0TWqSqxCtcr$ zMJy2;df?wfu<3T6;J5NXzu^C4Y_iV(@zQJSLvi`6U>&~<%7jgZ6kHndYm$IM5D5GG zBnuPKgRl1zb~c;jrt|hKh>46@h;7=Hu`O9QlVHHV?Q2cmt7^OT4B42Y$p#@rhu33; z_nYbPt^!*?UQ11Qr~BDxg0;@x9<1T_t|m|+BmlKQ2<>ElI;h^>i(JoENbGFvAe9MT z1C^1{RzSS~^Z^46*YiuDBjSV#I3&P~yJXH`w+@8aK2~x2x3%hJ%-QoCMSqoXJ)$JIp zgIfMBTDD$wBH+dR)$~hq{;IV^(G7nfbfY1JyalLc_8_0TLdcTUm#4?WU_ayj7@Q@H zpjj96jclTcNPm^LKT8Vh`+Gb{S$JIAI-ssF@%FNiT~-q4{&)At$Rd z)`c_L6%mULY)3%+YEpK&;b1MojqVy`M2-eZt)Xf$9*Wf=<>4?kDqzjA9t4s;`V@HKig*I$tTR>uiDbUmf#<)Mtf27vK52+b|d zK#PLfzo(+tviHEcp4Ow$vHT}^fb@paw*o7b6=&lh4F|inH;3i)_7xosv^cR(a|Km_ z8Gw6N8XMF++V|$vH7fA`tTi$_=>0IDpkGUNP2?QLyq>76F2D!vA)+`cozJVmE4?FpO8oGM`8ZV0sWa6hI#%8owstdvdmE*@v#;^8w(fWST?g1w+<+*vY1Ks zO{y!ugUu{fZ6K=>`y?54&^b-yq-8VxtfUr`grACf*be*Nz{|_V!n|4Thu*BR%~3}+ zwkd3rD2-mSBE#q4sHdd(U5C_Ax#(T!|8Oz5ja`mKhtK#mOivt@f_-1CzxCba zXVul#)bqbW-0;)~gtWdJy&eZ1s4b=HM8L0>0CW|Xi75b2#;>q1GBS}xn8FO8PVBu) zMe)LfL>$q(0O#+p9r-WYW|qQ^oatuo=l9w!MKk%h^8yIkk>7293Byr`Q)`hi7#8*7 zOHgfCgN5q#y*_HgA?8LFRz$_?@hiVu%|b`zssmMR^CH7)`E|=QB~e)%n^|T{VO1SP zOgN{p&4Gz3%~=lqW98a>9AF_OkhQ!R!L?3?cH4LMUPL=N-8j)9 zdN#f3GG92+fz00M#hy05yLGqg{^zKza)n_Uzr8e{2VR@!`p$3gEWeB0RcPOIX%4%~ zXUjoLuJsf_W2^jZLhC-)diY`qk*tuFldN>A*Rg5E`CY25H$n$V+)kK_eC^awo=;G^ z(g7UK-oW(`I(Vzk7of3QO7r&wUcFZ#po#@h)BHADFUmq&jv*wVBc-uuYlDiz=yby~ z{j?F0uR*rBQU^l%?K>GAlW5|aT~4h8UURL7lT;$i7li5Pic_y1|^%Ul+2l#yaPc{_0qEHft$nH^$|a`5o$TD6n1qs%;?+U6_Ci1Dgg> zWS8iQEbhGpnrxgYb6KRx7OKiZt1ffSX%tPRX)}ei*<}!X`@5vic71kgjdpFOKD!9| z>;n51C^IFBn?v{wSZE^ri2V)ST#16)FaV+1#>J;xE@3ivo)xO+`<7Z2+~iCJXWzZ+ zlME$ymZ{`+CDn;NL~pC6TLT>Czr5>sT)vsKWMwJVgwS`F=6B}z?&{z5nSFO$o|?Zi zUT~*M`VYFVve^Cx^&&JMrVvFa)3jb-(PGB1k?tE#x{um--i&Uc{sfH*5gI2lnJTb& z@gOR2A*nxD<#W_?KoiHpG%ZLhN9*xwP5)I8#pUn|+OpzEzpDfQw1G1L#~L*a5x(}!nS_2I65Xv9lM*PKHdag0Ubh*tx2;x^H^sS|g7 zCbZ%+cq&95l{CF*Z`U;=DNGW5s1#jI-ck&`$;Pv5H4=GyTSx;e6Uy<9bmce@ zWFLV%IuqJ-1?f*I$XzF(BHcno>JU!z1H#i*lK|&*^y5!3)|7s%H}vC7=(9B`{kSU$ z4SC0)=!(qNQ3Z856q>FfG+iMSWgZ&VM@fou*GZ^Kw@{Voqx?K|xh)h!Hu3dETjN3b zTf<}R4x0Hs_nNie#mzioGcizSP<_2J8S538-ZW_y9qsk7>F)gQjo7llH{DroPMmAu+`x)K+3|-8ou&& z(p`>5mV?vdoIo?yuOcf%U&iu!t$^8-01)ekCD!#!by|8=YX8_GzI%Ls1#LdGA~T3D+c#aivsyRgyg1a5Yng&J9bsm^7$ zBeM#d(Sr++ZHk9jD>Mg%Y+Ze(x41LDRi!pp;WP}Gj}tZ80*m1kz)$cizr zE{3xkv3ADH+54ZOWMG8{E6K~LLr@%;<>_NYo<~#f~*kCZ(%cgtm-LQH)>`}Vr-Gm`d zn7+qjzsJiayG7TSS+epEqr+I~Qzi^yf?+yfcoHv|{8a2efM8<=1cP-?>sO0EV=#Xs ze2pNf;AH+Dp#+}A`>_(GBq_+PvHXO`olX}GtzC)x9CMk(zllB8w{)WYc57y(FN42} z_1r=596OGCg}~uO`&iG!+2f*PVKpQz{LPt!$B}oj4Ror9R)5&NNE|+bPlee4MxIi% zF95F`dLJH`;aqkHh)y?Ec{* z789>Oh41kS;`L$!N7^B*1wfPFby5Jp&&Jewk+Hrh8Tip}sKYcBS-Wza6sc|=Uv#v| zxe`tU$S?>~EE4D7Rm3QK67MSzV(1pRvf%gy{P({_#-LX_rKVVHm7+s8c|#1~MJN-J zw?WL=3~B8uw4cq^IC{rp`^MV4@k?gMkrRo&*-A$|=m>0y-nsVPak%DB#x9Q)v|edq zlRPC&ax@#hn%)s5S43s?%e{8B#ldd%l;lUpQgJlX)jI+ns3f5nbyPdO{f5KUO0G#! z1p9f_$&TJAO0AlhrIo_(+mKlZ&{RjD!h!YC;ofng|0P=g>X$JMz}T;IsGtmv9%0iw zCASkWNFm8j==D{);@ch{}ah}K3nu}#S zh7(vRyVmyuFuEUmVk2Jkl5!jsI3E25o9S4)%7X*t+ivk7gRQI5Bk{c?6gV3c4G{{X zcQf0>*&b~8EqCBE@^$SKku_V}Y)?&BIjTG}3q#bZY^e0KmE+uE4^Fbt8s%+hu=j4! z&lpQT>!{KwvzxQ^cF)(k8%qtdn>_3!@<9WuWLIlBv~X{c_Lib{X770fuxKdN`7ph2 zFFI*!^suNK^T%a4S|`Q+aKg*vgpbd(us?kH4)W#K@s(c{^XDQ~?uBZ=vPP~_%e?@1 zkzk-85SR_<-ldbzsKP|OH?{EH{UGH&F9Q; z^Zjmso6k;ezC+}BJAv#zHnf`$@;N<~4}A*%-s75o?{R8$pnva&(4U$9y>-7M|6ci5 zgeoQfUUn@oSox9W-}|Ty4YBa2Kzd?Iq2}$I`4K{yi78iqM6pyLGQ;;r`h@&{&NTm@ z7@z6?W91)dfNJfhWm~4+QTy8bXxL9a2pMD}%$CS&TP~GY_Y<~ya%{FC&)d~1oFp^g zS#qH*ksTCxL$a zO&}}Sr^G`tE*d?H2FaUnQXnkNv8as_DT|ew#9awz)yq%!HIZHCss+}!& z5QLF7)O8ZnS0hr0eX;1+hcdG<3N}$Uj&S*Uli*q^7}ycLj5ZRABNX$3>=XVLT(t1r z;n3d^YOUNg*d# z`q)I3C8F*|{ZK~zu7*MC4-yaG^9V8OgIZ}~)VV=%j)T)i2YRj5o>L446C2#i{85xQ zf&5B(Czm!}NoZv4_i&T9o^peJ{tV+{TSwc%0w0&)w(Sbv7 z%}sg-R^BCqK-@wy)~T7i`$N>HLDBxS?qvQ{H+fk2H>c7`?91<|WsPq8KeRif7vmWW zMEGW|V>i2DU+>`c_d$W|TVA_i7DWNs3OB5bUnAl|7arqMY2A(jUwhW!Cka!%U{eVaTvqb#oV6)5S5! zZrG0q=g2O~c87tvRJI@E5B>o`4cMp6zOY)Er#2MuXDTR?Us%$R2hVY(1IgjF*e%9g zkE38hZ6Mpn+)gW2H*O=U3jGa`9!;eb40->Fkyt)uoCE36?XK2K$Q+thfS6w{g!)xv z%G1f9uGT)XhV0OatomH#Xb1fCZ_<-Zlu_^Gj}c7$dg>RyJVe=3PHb)b{zD?6i6SFf z0(QioonDWLce=*$zfN+{zTaVM3WKn7&`a+)7|loUS!aQT(5KLCG{a|Hq_r zAMeEYQgn_6iOzkX^JBj}Ejm9d^^Vl(tR;0=avnhNvvGhQ8UgX?7KK%fQ{y#)?I+x8(hXQ79vgm%)Y;xl@|DzKfxfs}=ux2Dk8`0s4m7^h&hCKAW}zzQn@|$}>hh_HdOtJaVR_vg;iWvJXMLyht;XL7eju+)(L(1 zeq&DB3p@?8Wlmbj)Wa1SIED}{Bu9pg5JG}n7j3!=9EK0Sw=d^k8I?v*}3rJ%}?haFuO^yQV&nu-?{N-Pk_uc54z}hH>*90JLYR+7b<`Dy zQa=JmZT<{54D62Mc4T0>V&4b7;?ezyiv8kT)<-oJkww}Ha82Uc68w*Hd%47IZAvowrf_nSlmGNQOcntwlZ4|ZKtEv9bK|t zVzOT>JdoD&I{y(G1I9s^bZb`FE8VI5m9%3)^z)bz6&CrpVZH?J8*KFx87l}A;}A}A zfKqe`+tsp;b~+;XbR6xJ=~GcF%Mz8PD4;E`od(S0e03V;3E4}Y)cP9dP8*wzagAx=R#hg9Cnt^-k1k|Ef62L#MywU9N&_!JJ-)=s+)T>v4vF2=_KdgSGF~Jkwl&E7536vGBb^)M`sSYrawxW%o`-3a9dfjh z1%2phHmgGFuYEWr=VlGv%~wS?@X*aB7ON%WPwNSm8+A3w=xS*-Efhn&H)vNwt@cj= zY-Iqo5UFgaPAo}DT*X>-xSgoFU8_Dt+Xj!V)BRYKk$90WquM|=wz}i6DBAyubwg}( zbtd_@QRo#hP~_tvKlcCVO@tLAj_XUHbKqfSp^?+#HeUISSH;?^*ut`tI>9X=4l}>3 zLCY_DIe*6>!62a^uL+#MjCId!D2nuCvnK6PK}OY2I^LgP{{&?VK&Cv*k2ofStYUQn z0B&#w8Yug$fa+5A8T`NqM)>%6JV5rD^D`P({*HJl%S=Q2myw2cxE^%}PeaotC;Sc7 z)hF!K6ebz+l)4dHT9F;7q_g~<(CWL9D(YpU;6s><3&H5^VtV^MdP{HYY!tMm45wr^ zUqcTk%YiMCYcMbcZjvraN+)T}%NA0-$u^4_=T>chv+AQ=M5Z`(kZHxHUgMxz`je`ca%=IQV zi3<}ZkL`)w&`~gq-;LQ_JOtwg zwns0fx=aa#oURy2lHSY@GMicEVP}grHbqAAYpD&?r*_cB6>PExmo~AGlNt*suGnz2 z#CFy+BLV0HugYv|HF_Ld5^^qYgqOz+FP0mwE)So7Wi}l#hOckgN#qHJ>!F|&;1WmUlLhl0p`c?Ihbg%%ccTN(d$aLo zxr;0rSN_hxODklcQ(@om0Boh>-7I@|bVP_x)jU(Z+5G-Gw17w!GJxX6e?S9LycD;* zy6x@u_PBdg{w6yTW3%GUR(fSW4mb1JA#9TaTH^AkApe?ZNF+uD_=+;vFC8aQni40Z zxVr>Mg|pAI9iVTc#u;4ie3~wwQj}f7U%`lz^%iA zyj=4<0UhKoRBY4TNO_&C%)=x}Vu|_j^W$?`%se!U^136kTBzMiN~EE2^F0@3OSomI ztL!SI?ReBOnf}tUKrM6NzI!SoW{u2P9uZuR_g8x0^ii;ugc1pXQ*iWl7hmf`#hIQE zU!!@CXsf?Rtu*g4O4X-X-s%+@;ykD|jtx^0{=2?2@+Hj7ZvFwfPEW~n`h37sUycu z3%@2N&xg}U#6LA}7TV0jS%&_D@|z%Jb-E{rTm4Aeyh$=*Re(7AhShrDrnc+p)x-Gm zkkDTfNwx!B(M!-#F&iBSLSanBfI_+w{7z<5LJ3li_DfKLS5YIR9MAz8xssG%nS)i4 zH@-M9+!do37kdef2`xA&voTEz2A#{RgW6`juBX{r@=n0sH&xyXkDOZNAryH6xfrDKXcW99vtQD9 zgm=Cm^9|L}RNk~xsXQoorl=wOp@1l&p72YAD3S;y%B;o{xJizVpwN~BF-KTeco`TT z9j;~>57bEx<15JnL;Mi!3}+qMH{^}dWAh*Qae8|E%M$)lbQ>6<2cX)IBxsS!4l?3? zKgc?T6e&P-4myE5krLVw<`RJq4Hoh1vz*Nqi3mky`$8{*e~G; zEOCH1O%&!`dv_iJ?=t(?)%q4NBRtBW$qZJ5NfKvkjBC3kukBXa<#?0aRh~z;MJ$zj z9zoH-U5=;&ju-xp5A`bLw%K_Mdrv}g*CZ6f9z$%ER@)6r}1zLfY1u~o#Guv4+#6PQFH?3*Zr9h3uE2w@LL2>T|7YQq)O z0B9{v2!Vogt-pZQqxBxFM+s8o-7pt02H#D!f3BhH;1Htp8sm^t(A%>AaewhgiNpJV=fD9@(h*d)?DFJ$ zt`RCU)pblPe)aiG+woZE#7=t{)^$iCt5a&iIB>6vQq3&u=~Q{d`%k}ootvDtTC=HY z*koDfNp<6aNu{^1l~)89pI^TH0K6AypOWx!X$xx6AgH!8)w*^qnbtnAyz_4sDW9EM zWd}{~un15z=>k8`eGCq;GKfLcfygOMyT0fJu4n4J)Uh@YbXl9~v!@<26J}@+^6`HA zgJcpr(E3qx2_H5M&&j~;=ii1d0L|v=IV-cVxT(T@V_qWU5>zM6pT~AYuH?m+(jpxi z4mE=)wmOTCZcZj&Ad3b+m)J@o{<5Vsw-tnXFX#Wx%P4N=Z{I$kIGrg~P{X&EYb)h@ zJg7dqHQC|_9A7TyAE(P9VV7Oh4oG7CWk|)Gp#Y^D=6R4LRD+@U_(=2vR--f`IK(If z;-8PCKebLlRSX7D%@s$ERiPp_fh(aJ44@#y{nt=Ms#GQi)e0ps8L?$t(=gA2dwt+= z2=S*bp+%gBS`dd{Rn_o|bU^9Kt0qH+5Z}SiAlCH%{xVn`>`HuO{L|zievFhds7 z3}-F5nQC#aDpV8vTHa9b#Zpq^SVQu6;5;Tw=QWpw_=zcm9$0u49(WzFqpLQ|E6DJv z_OFa>7Wd!L^><$%q<4d#PqY6rqyL50{_h#2|1Btx(f@yL7&!Vf=pWgPGrYmji&Hch zd}6;BT?SatjMMCoO-AF$721r6Y>FRCXW*cGAPisAVepz1IBonJ{Z|?Ne-#s;+5d_` z`tP6_GMxthD%Eh1(SQ58zNf)l1`BBSTu}&QhPxIv9Coi@hYc*Q($@BSM;$9yBp;5n z%HBxljUl{x(*HcDE!~^NUT4#k0~KD@agkIAXUPXe`-+k`P+?aqEzJ&OcW)o5?Adyt z=dFWBH&1b~2k~(4dwX`#&+_Pqy;~uv*V*$<&L4`jDf1-w6yy%FC~>Ykhf zdwacmx2`+Uh8Xp-5B7f&>m0s!>z>`BjeFiXuxIZ}d-l?g?7OduogBWp;6U~hsM?!_ zLZTyEv|(LRR1U}9L)BPf_@0+ga?L*u?1jB>opfMtBx~;6eYEn9b7;KcFd!rt=^?CE_LzwtOKKlzp3k@&6v1wZVF zR}Z_b4My_2pKQd$$0*dWE=rj$^|*z2WY2BPtdeFou)EqI`031p8Ib+B|T5j(V7G3 zd40*L=-D6Zt2TrclZZC$Kt+?ThEKDpTGJ7p=CUB4N8Q&!Gm(OJgVW#>42Jn5NVbM@ zXo7+U3xR{WCu%)fCkOD*#&%qrV_9-sov~kDOOuz8fgL+&$I?2d<9)b2q9gdfD3VAA z7RthUg#84=nTA%RMEPhzIh&QK@Swy9)bx@vda0d&S7q&-|5?R_KC57JEG1 z&ows0<)6;!gr#8pX-s9}6O*cT-tfQH!F0%>r31#7a${@pQre=Ai!@8tP{8yz7XgL} zcYXpXAX(%caL2YLv4!;I<+*XU2Ro^=`AsN-{e1V4(a&1k_7kz>NjQs(sHTXPju+8V zcuTztkUElF-V$5mQI=lL?vQ))&2Xu*6pnMbaUSJ_bWzx~5mtHXS8NM8S}2Pon}ua$ zGlXHhyTxG@_TK!Cx}g1~5Fd>h1hk|x6)8%J><*-rOq3euX)U5b>rbp7an+<4vw|%7 z!*Cc(Vl5t&iY4h<9;ihIC)?7?Ek9X<+x})?@A7f_0z|bp% zp*(@1JU=k>uIs*U=@|M*JShpDpk3U+pH0kG67g35{* zRHHzW7M%vT)}QQEphcXgU?AmFXg>>5ve@`8IgpBOTN#AvVIvAV()up;ABF`gJ|R?q zNm+NGXX#b3)K4Py@xW)x&!cBR1(4|u<#X(R$9biV0w16v@sc*$3okTA>tkU=PEpLM zjW!IwS1k?qxU#f>*?TX;aQ~|hS1^S>Tr_7HEj8X*Uxys6a|a!ve*3mHB@pq=s5`b2 z%$EzxvCUoBiG(ikLC@TH7IMAtQpnyFT0*M&M3JOm$FpEfxZ_91~7oBY8=rqmES@Wi5Yc53GF1ZC)yW ziTpu>P4hdItxDRYBuKaalQF09`Ak9m^eRryM`)(B;LV+D+o$9iQ{I?fC z#Azj)38i%@D{y>9@KT~5|M=oGcuUjZouUN2|ItNq&-tC^V5W7^3Y`V;!)|w{!;=cGj^{x9N(+p8}n4-RSX>sfm z^Cv_-?py_(KY<>Stiws4zo%x`iCV1jxAPw$7p#%4=O93lFR|l}rP#J63H{b11fB+y%8{WaA@N4ajObyDJqd$PB*lE`I&=Wm)U=xe zN8@UVF*MjK>8zB@8$)1GVlFOepowkU`2?Lizf;Qs0$8_Oz#7KtB*Ztc6AVWsI|xwy ziBmiwudf3;t=offIS`j8<-Z)XZ`A@P?ptd3Wkp)si9sN%u8=StHDaAh=kb!hWrx?% zb(@r7lsr#E*%tVokzrI9=9j{siuCMP#d+e5c(!wOfVNPX-x$1>>97I)x%%*&rq zx{)8Ks%6+>wOoliZw%Eo&pn_fm)3fEzs5k+o0W;%M| z$KemyH%{kAyo^l|m6QgF{b!k*sMU!voCMLBvUav@qpfi|NUrtYB{6MHuAq(M@>K#` zy}3vLdgEGQ3_8JgA;?QDf2>&G)B@+(1Sg>LspAmbXS9`jv<_>D25Tp#JSySO#}-~d zYd?XV<2W2cz&eIt9fytFMm9j!rzt~;++%!0=^Sd#7LT(D$#pB4?+Rkq(L6T0z<9bG`NTzxM7WfnJe9`~#y6sde9^oJU z3T@XtN{LuVm_mt)C)kW9DCRDrbLyH$co`gF@GpV6MS&Slpat>~)nJ=zki9`g{y?oD zBWk*mk?cU5X3=tdR+dezdjgvs&qwQ&$u!v+;ye< z%EK4=erum|X3pfnL+R(eC1>{8XYIY$UVH7e*IIk6bf7cEeZ?u>U7r?w(9gvE#>%_J zqBj#jP3pga0toHLba6e-RxACc&&HcYe~`PqzgxfSjH2IZ&#T)3$*3FBiS265BifC! zP>Rqv&GM(GqhwNxFV4ALZ7Zv{Kv~y>&AY(b39D>Rx^cUj@uw^h+^|BpVF4?B^K0pr z?J5c+V{hh0Mks^7NnXXkU9vl*Zo?u7v(SA`V%Rlm?;-5=!)o`hG`wNbsb&7A^s3jy zAL@A)h+_`K2dnl$oJV?%l{nOOigmG8<|(~Alx}(0Tu*ydcQf|?eCMnB-4#!(mNMEy z4<|Zy?yqW57LgS7;xv6-_o0GLtXqk*U>ro+!ir}c^nGW&l(l24GhCS>>~i|*?q6{R z`GXj##YoP}CT$p$qgHh{-XZg0H`Rx*S= zEV6k(cj;mayv<5&`R8cuNj=wvh9A+M6#6H|+&p{Ii~lyLJ?U0##mFZNCoblse~MbA zpE>CSF()+#Q|D4IbH-8FlIk(FL~L8qp9M30`PQU}wkAb7uZ~#Oq{v{_q|W__8DdR} z*w!SfS=OZ8!-iSbBw%4p8VD z>E;n9{;<0&@7RLcLLB8=K%ggmt?%L!n|3UcQsjj2se_Ryq&;J_x@xO@X zf9HXzaI{%7z)%dPrIi$iXMYd7^`+u|>~EZAe*|g7*-E(IrI6f5;eOhlnRlOidcHl~ zzRpcJ2Q2Ed8yinPA_qL}&3q2HQ0;8ZtqF%k{gzsj1IEK~>}HKowOx4N9thSpsf#(T zS|v_ME!BMR0$ycG;DbvDJ)0tE1joBljOr1L>bPI?t5uBZOFi1=9MoK*f)!?idlWBX;#l(UDm69w$oBN(XTtPJKamAn*7jJjbQQ(1@bz?vAgt5tqYHyuYlW)w(iVvHSsce7a#-%pgxjYt6c z?O1SJJ>8QSodUz#G1hBH|KOKH^{YGV^l#CA2p`qIg}YlGjuPUKI21gu_{$KmEbB0H zxhFvx5zMSIyl3o3@CpC>w$pem0YXe|c|Hd;z2M#(Cq$3>s^xv|Or#Qun+kaS7Z5C> zLYu(2$KWS;ZfyXBk%euhH`U~s)jP?|UvpI;+If{*{l^u3eVy}4JLjD<7!&j(1@4Zi zZ=jTsS$t{MEagYou=Jfgt`h|8_ZkgKK!?(zqx<7myf3PxFA^erA&nH+f z2T6|9MydR#)?*USmT0dBd}&hX>frUC(b}P~u~S_efLNx;{reGGqct6`V`G{7z#mWF zf8cp`-;%TTsxMIob=XMUCj5&F2DT(Lfd z?RT~|-D7`7e68s*dso<1>zY^=_lOVI#BsQ*$Tk-_hkm$>hr^;{@A5P){z4<4l(N^K z^9BAn*QGvNI^5-Z9M^5mHBAl1!A2R2x`I-Chc|h}(T|&$!&7ETFLv*xVnZ`FpmWtG z_PK3Ut9|XW-0S z*6Z)fYdje^Oq-RmUvoq#dlC>+)mfuxm#`b=C%Bf6!0%xmA7;voTf%n%tZZM5O!eyB zkpdU3lm2WsznIiJc`yGV8_fL;)cu9l6SU@-lpfvc$+auA1%C4tGsA^ku?*S2a9?-wyYXmz4?ZbWt;Ww`e26Jz-B~KK^)C{|!=J7@b>=TQcY&KK^S<}E?Yc>+?ni@VM zJ+n{uudzXWUw4nbJtiOMfpyCh-duj`6Fd!K4gVw5S*7k7#ybZdApLR+7jk9NO>g>k zFhLrJJMA`O>p-#ak8*Xb0LYF8DfJdT8a_2#VB74ZZmd#O>&A-S0D0$Fm@@z5P-!7j zmaw`X%{hxxM&Bz#Fnhu1bAykioBAZRX{1r`P^SL8*Lq`_FP9wg$i;W?V2StzkaBi%kd)+At< zycac;At$eY_cO@Gh>$p*LSwR|4Kwu}04&;yLR{CZcKd;(v?tO;2x6m6C(fJjPL?%!H=CL@0ZHn z-{U%)K)w4nl;HJHP&R4*29G?PHECAY8BJ~P&4{}@PtA<#DY$G>Pr*g}uhMvX&EF*f z+N3pyTue-2)Gxm>uX9Y#qypD98!7Uzs=Zy!1=+H~9rAzsceMSbr0sWevc;xw#J_Cj zQRimvxbIcfZ-1O^?T;dWAumJOVRpt6b=jBo&S;+y?>!S#?gTwL*{2|tokQFf%{?)M zg=f|Yu*_-BJ#m`bxG}dU2G2U6nyE8jPmFMy>ViF+Dm=U@&7JO36UW8Rnixr(+*MmJ zae3T5aSl1WVSl3f%8ZsLnN!s6;`KHIgFe)d+oLM=zI7`#^2%JRR*5ySSkylm59_Cr z(FXWD&{e<@F>dUI+fRqv*ANpNeT{JY4a+LZ_81$>dTOHSiRYn9opD}4OwBu;;erQ9 zsb{!rO51YS|F9Z?)+IZ@W8f#w`x0X*SE69!dtu{yGvd`2Cvw_;qsGC!({$5h-XCWa z;^Do#Yi@W6TtxP>67@ds;YXQ9&Gzxr6B0Bd^Wm5Hq$-DYG%xFv@oLt0i#!SIEBjNd z=uL8Y$}1L28-E%!*ogW$&v?tQkmwX>T+XKz`$3JsFBL8*EN})tXNQ-QW+DxrXpE`z zbZdfc3m&~%&dSqG*1$LeviPK-7-wB;>7n11A+X8ha?0L!YHmf%?zf_o%)_)?``U|c68=d5t*hn}m+$i0?M}E(xeqeYd z&cU#rsbNn+@{NMTqYS~5Iwf_b8}nG6$R3li`^D{>)kvoJ9Y#;~?v*Su{XQ`C`>sj) zT1j?2c1=2=ANM_8p0L%6hqM`i%PWt60_W z&&Y+jiy4;%K0LgS4}iDG$R7Z|M>_{Vd(6j&?f-wHeeU1?NhUsq$Vy;ih3o`+{+*cw zbbf*>{+b6eCcbylzYh!VJrck=x=8#O0)j+)i-R{~OI`<~$1)RB56A;93+g{K>-X*# z%IYm%iu;Vj?AbcjByXoDjY$$&c$EUL)rL3UhSxMGycI*jv+afBZxjpW$U@pR!?!$1 z_?C?YrjyA=$V!`=Uok_t+()^nA2xEm#0ueZTaAQp@qPXKROOYpnM90cHypvAIS&c` zZ&tvT6X5d%Y?){Din8h&qO{EG;S2pMeWh?@LWhe-&XwYk!}@9tls&JnRu(;9*3(e- zWYIIxqNm9!#E81^euak`PZKUCj{3q57bC`N9s9*<#SR5y{miZ{d0@W_=FWpTDe zXqcn zc@wcSJVt|?a2D5ZOm49LO6f34Ges0Nrzc*|WxtbrYquL4*8jynYQwX;_TG2WmPLE- zGc#qGWMb+!?#f-k7lroV`VEOFw$g(y%QM5*9MaZz35a;6F+aHOzI*Sz_rTwcr=H#Q z>_155FnXQ5E?Zx{^Ts0b(xzt?Sk_CTZH&gkx${JG`R~j`)P2Y*#!fl7wMdL{$P3{iJF0)X#NBwzDJDzxwF5v_}&Jz#e>BEq$g;7B>t!8Zy-S8e*)hT|C3*X#{cA=@v+4J)L_i` zpHIkHbCCF-RB^`t+(&n$))4VOY5ya{|0L#oWU%<3k)h&$@**S5As7GCvefDLpAnb( z#f$XUj{k}EO~?O?pg@=SpAjqmXT*&E86o~BpX}e2{iLfd(m4qVis<;CoLiq!a{wsu zKWT^fpHkFQ$4BesBP;$V&6x2&BgCa8+-M|0{7LAK5-P z#)96@K6evqI%}V6xrZI?aP~Q5f9}=d)kIubv@6`Kc}5*%H%W2Ayds2`T54v<(!VDv z2VVZf59kJM5SfGn0BZeFWL`8M7=<~0}Np9^d{H4bzmO}THJ*U)H$8&;HSC<+AmD|!+udB zi~WH(nqzQIz;K|Sn|Hk|Z!krm+b32to#w&rG?n*dtq@W{@}psh$g@LGDMO(^z_gJD zT%J`z#vw9e07oZo;?E!_R=nCgP<5S>zApbr#jU^ebp@$NCpl&|WRFx5Ck-&jh~|+h zP*6XugxMYdpw{dO=KrTvOi8s*}h^txsVx-=++E!8VQ2YgM zooP2TnR}Rzb$=Pg-S7Ugx&Q9j?%00`y+5eE22ZaRgECD&ADhp z`bMHgjsAdM;T5)9+pmf+=-6&pz9uACbt}EbmecIPe(;oPlV5eXJ|U&_7bY-VOR}kcZu1~_U zU4%@2E(ZxaBKXI}W+Gw2cciCzxOl*d^I#j`#;h1pw$D=05f);(y#B}dL*hT+aPUJO zxZ^Pg@(3YSKa+odCLf?T38=Z$FfNpz#_;N;-eqUXZf_xlqK;%s5;&0J3JL?U`W$~g&T3Ty9Ut?syX_$X25LQJit3-ulF zl9>7n&dQvD{l+t?3#GqmKkKMTU3q|>ZW8}%i8vnt!F{Ux9r`Ah*Gp~bP~u0GW|zdV z;A;l3a`;-#c)`~{`{V1A)Jk5W-{#{>iZs5;rB4^i&!OYvv?oOOmePEf7W4m1X@!h$8ei!*NE4r%>_-@D7Hdmx2TDggx+#Tq9wsqkFA9;k; z!*02;4Idn96za0R?c(7>w5ixN2&NGU3_vIaf}~(szz+!>U3PMTn1gqR32&hjo|I+b z739NP2|V_&A>k<#Ucd=Y%Chhtx;n3a{0@3Z;vUcr2Pxbb>T zcyT8@Da*nelMgRFC_IxN|Jr#T$^~D^x1V>t05eY4N``TX?ziI!xM|}3ww01!ycOG$ zzS?h0oxsLgkoHbkJq+V|h9K{?O6==o!Ldz#@wwa~=s1s0#wXOOD`AM!-Ca}1M~b!? zmz5f^@c0YjA2VW=<1bh>wr`|ynPeZmo@l2=;4`?8b}}WtaGp7Id<7`U319m^hg37I@ut{G5bZy!7DP>vudZ;;{{y%Ye zdX1RyHn|+|q$~^Xv-$8|kqae-U`YtQmRxwdL-` zIoqqgBd&fsd5o|JEs)t)+bC*X_{Gs&X^g6;xqD*kFS?xTH87O?gifZ`E1oX9p?F&# z@2P3ufpLU^D@U3Efr&#Dn+J;qK}E3rgcRJ!ri2KDA|vXt1i@-?KoU&}(< z^<)0gOWFdETiDIt>Ue3@3=wABX>V26Bo3{zpjm$SqsJ;`8D^KXtQDh04Z2)>9c{Fc ztl#ZUuH5Y+M3O`eF=S06-Ig@4{(4Tf19&q#G>imHgVlR6Q|GciXFChq)>? z$RHA+ll7!!h&veOV5{N^@UW|lDh%q*0bEK3b-FdEECUceHRy;EBV;tY*vYbg!k=aMg2qOlT= zE6~jOg&QH8H~^9f1-Vm_+@SW1dezsK>d$aYcPxL=j~(Ur-}#8&|MVk%|I3f~{f3YD z{fBA9&j zkWPK*L!1gNE{qw^a`5GlN5g>7Zq;+8^-4Yn_5Wa^;{yUX6R^ORujh;Nanz<68L#s^ zGTnI`v0S?mO&8FpwhjWxyKccXg?==`xTmRG=n7?m4T;_;iap5((@LIb-iOpyTx007 zcG+msBVJIb{%~bqA7h_WKuz%$_sEwr?0X9GhaGf`f_fU?@}UenBE#n~Qpm~1rTIaohT0|}DZT|U1K7dsGY6&%r z3+3lf=NH$mqdC8LIq%_l!u;i*_d;sI`^DMw9*O4O=I$Ou!Y$F%h05=;a-T*dFwUi#n4NUclobEPpDzLOF;sEaLvEn5Qxk-Va@a0q1>t%=$(Vi;(7kwrw zzY8SejOg5S+CrY$XTxqTd(C2>c}Df#jQ8JOB4HQpm;a+N+y;A~FpuOzJL>cOo&Rv2 zR~MS|{eJ)R>J8LNUZUUT&$krm^Xdv}7#GUVq2}BFe@8Rla=xE|qg?;_E>V|jtY^>n zg?LBU=T+&i8hfeC_g82I+|#Gr`TkXC;CP+ymjH_ykC^LYiHR@Qp?><1I-$Bt^xJ%V zNs-3a4C&K_@^dJBz52JK#aH>D_&NUJ%APISQM98$o#cR;8#l;RJP9krtgyJxyvCu*Ohz8xGRhg&vT;~8^Q>I7QR&L`q_()dq}TxSyk-`V%0 z2K+D+l?D9%-T{EE{xcstf1aHW=ichE+zaEH8=0aSv1=teM2TdFV3Qyyi)DNMq1gb2 zXMJ(4&J?ilgpxhL#x#hQ6qq?;v7zT`Fmb$G{mY zlYjjnh6EZ=e+QH#iVxs47m*0`a(_zQ@V1@>ofW_^9fNJuU_My0>29E9H}c&4EXc{1 zYj)pBojgBKvm+LQ?hkkKULz=2o$<8`V#c=+j_fBqEDox^w{jQ?fuVI2lg4uz7}~@m z7%EX$SD6@++Y926tT9xgF|_(ZPG+Wau8dqGtC<0ZR06z7JR|PES``G5Hex1PhzY5u zfnX!1%0x`KLAB5==*dQmU^a)C7BF)UB_?KsUXC9=-rRF!d|ZCh@XE44MknJ*EMiEap~QpKmX1y8}t00++CWU^s-34 zZq)@WtwdtgyJfX|^zKB1dV4~!7KrN0_%|~G?T?rIfSksv_Qhfe&;Ef#z8cT71U`9k z**Q9j2Yo#ARL(Q6->|GXy~>^ZpdfLnW{2k)!?pd`lewJ08-Lb;H%unk!{M$+obFI+ zXP>36(c9_Cg!I>LV>pJ?Ub*$-Z$!xc_|@7hDer)UO71f~?oUggCxK(*d-D$+_;wtQ zto$ShnjyJK=N1QN^4V!e$S<&0c{wwo$jPSH0&`gTgcQ>v!e4co_e!7LPiO z9S~omZn>H^#Utr&rUX*8@2dx2pq!++y=e06Bj*MVp-t-JuxH4~*leChaWo#$bxP-$ znUkhv_5woPz?V-fya6dezWrAI$AA8#^>M$?{OU9E*%JG+{IBk_zmogR`RxU4om$^c zI-J;T6nA+#ukflp^0Ud^RoFS@ga-={1TI&vQ1rwqxtB3;P?y;)0DhD;9HMXRlL7sl z?|P=l#!+*@L9+%g(ucpb$v`*%M zs_G2;br#KcP|H~PG8a&5U!_LZ7^yEB|IS7a_n(RTo32$+^q48K6kYx2V%H*U+-Q$* ziSw#!%pQoFZ0)OEg`yHoH@@7^Su3B`a?!qC#jH=y(4RJ{2MhGaO`|7l^tJzrMWn_8 zWSvYS8Knl`V$I7IE?y?q+Iu&QB|bu5^>$wjv}OCn-Z zzW;sJHA9UNZ?}B!d@T>E-(>ljXcHV9&5G}inBq}MvQ^pV0ONqE6IRb~j+R2{hSoli zCl(b)REw+n`cGEuM;H}DD*W!~+N&6>y?Mvn-qGuq-~J-#>775Qemc3k1VUnjZbD#k zS~<8bdUAmz1qmg02hny*%8g37lRZaN-Qwv)Fxy^KQHZP41M1?X8noos&2F3)gE0F? z)E!adNXXV$FDG>9{C}i7Jp)qm%K4b-h*vi@r@!Q8E9@;6?YvRc+<1vRBs_g5uj6lK z1a4BC%toa~lOIhqB)uL!^e48>Z^^&GVRI_;uepD$cap?V_nVD(j2GcqIVTv&PcA<3 zUzcHLFFIo>wSLxgp^brdWUwJaWB`#$HejS{7aBjsPso44U z$HL@Sde9M^hLH^asL{qGw|s%BIh#LEbKw(k)*i6%HsV~hQ|=UOD|=>;yiaNGlY;!R z&FON3CQd2)qbMTM-U_2fy^V8^sfozUlO#0eOq%%m_EF+1;o+>nR@?GE-07+uj<^i| zF*2E%F~wNli~ANKKtK+&5PZH$!&lNWF);)`Pi8UTWBlqjzF{u2TmRIoWGwyz1BacR zWK+K~4hhG0V~(ObVhB0?2y$YQW)OVJkNm9iJA55)sz zZzSIcr32@QGwBbnW*Z2vZ;#6Q^C=nYjVUq zXn$}OB(wU1XeN56j(kwy56mxr;dj^&R#o*DO9)JK0)8&@f8rd;Mg8Z$=(&-!*gt;` zVWRG!^mFR@Ix{#O&F`G(r~mMNc7GbQKM36Y@$V2eXG)HQ z*6e^17koV5qDM5oiTrN`8vRT#cVLMgtAQ3Bd{8)B_($X?{D zYVDN2>9mL-t>2Powf#>*?11gHA0D?Keq}%0uOB?=`n%H|(uR6zwH)^wyBlbyNd5LR zK)YLfuxh)by|vvTw2x{^pM82}J(Dl|!Ss!?;$t{t+AF&F8I3g*aAv;nn-Rd|lrk`1 zc<%f259Pk^c{>05>Y=`8{y$VcZ9RLrkhHZ()~IsJ?S$HAKh-BJe?Ug<-$rDD4wF%v z{!GvDuk5sI24<({c}G?V`2xs8rTIwEOqnU(Cgdr{;bgU35t3^p6MO4qk+|Sr#m(wl z|3%~C>*!dM7{6@RrS}xt58j(ypM&yGX+G4Xu9xPwz&rwGetEf%V@z{4KQr6>dTIVA zcJtXYvy*XJJDMp!83mH}!>B3YkE9;4^MUlsqeAR)`n%cb4D84}GMkuP4&m3%Ji-lQ z)RFqe?kze#gmIgWj3Uw>c`B1n_x-|EgTTYUaGeetJ-&9y=Ens(zdBE*?;tz}0T7w) zn|L*&BOz0w3WWRmo)E6Y%No()vYV8(S^Vo0Dc!rSGA z>U%%a2I-{*=sV|%T8}90QT286Bxv*^vf%Hn77(J`1f&vKAjSa!QKV)8A}@Q1WclE3 zcual90z-$m2vMVheUwMjw}sp2W<%P%y{x9p)`mA38_T%QP*T_TwG?%Pu*v^vp2adZ z(U%gc`FZ0~p--DAz#QKmZl^?)MxrHJA@)*&fW~OxHmOaM*YIhEB=R7Xkq*nBF$pCrK9WD|vZNTKGAe%hn&Dt4MBIxS@nI8}zi? zNl%XW0Tc7|#)PV|l*Uu>v4}%dx9E28=UxFRl~%kiS1yen=%^&M1kL%|<4is162VXv zMGG}{=%M;QBHDt0R*iTx-k`})*}Iq}YVTIj77TqCGsIoY1Ju!X8S#VFF?Y5Tcq=k4 zF_PBK7h>klKLIBo=>UhD022_5HuA1A)}WSh3T7VY@KSKw3OOe@t)XQpN{$jAiNJU$ zApQv^gZNpet$|OwTsNL*!Y@4V3TP}@lsX5VGpdlk^W(=k!byM-)7lPL(<@8KG<#Sucn5vowwKB-OYj+G#%asoJ8_ma!i|7|(^T$HjF zGStbR3wpQ&(q5?UY|bK2zyfhc;^RWh6TQA`a4tkWn8tT1u!S32sda70(cpLO+Lit})8ih3w2@4e#{Et{HQE zKwWv7Ae57tm>(g~iBXk;v;bHsRW-ZDAA~Bf)m%uJ2q9r=Q2QK?WtT&yQ>oJrtt$iR zgjXG4FSfWZ-HK=;Jiss;%|;S5^Lf?4b5EA@2SGNS zJojIR-@;EF5x;NZh0qVbi`mAG2EVVuD2{~R*Qhfne!oBKUxMFXp@!&>Uno~?%gWQq z-E(u4J13uVmt@6>6~--QWT!iA!8B~NYf)9mn7us5X8+&WAQ@wqEyl&tx9M;<4aRmT zrwUtgo3LE|Q*UeTfL5O6phb|F`aw^z>ji=tQB6d*ocJL}d@~S4xw>J~;V~@?_a^G} z!}MdiAL)m~ZPNJJ4Ni>bv)va=iVnSi2GEos!XQ9CLv)jV+01uIKJ%ReNl)G`%(pd1 z(ph?5=frwz4(ki@v2F)RgkRXqqJ+#y75hPTSWu09HJ~m+x(Cexaue4FFmjOBQSdvJ z*l*vWgX(*lQNToqdZal?Og+pA_LaG4jm?>}a9atvqd}Y4#MkBO^o<&|)jio*iqrDq zMhR-qpiV#3noMFx)QQqcEicPX7H}oJuOP3%BtoxbQCecUbla$OMDenNcpad_{i#>m zyYT0RijONk|1LuQVenZ;WLdqFi zNuNixpV{ZH#S=+m#hN2XSkE?!fL`n7~jgHU<3L>V|hvso?4Ep9LTHDD8AM18OO z@JN%L>Ic-xM;g>6$-yN5xc2SYt ztRz)num92`Ze^FtiKyRJrjHR&>KrF#^Z0GPLSU)Ia7`X*Jgk{5EJs{~=zJJu09SHN zR-Ak)Pb+{d;cI`FdT@zS6+~yIwF1laSby=qdgCiK6js0G>fMw0$w^=Rgg}2h%rKq? zEz7kA^VWxD-s0iP9uCZf>eJOY1&NzGKbIE}nRB651#nWn+0nU<{`M<4!gARhwG@*FeGfTc8d2Y^(m z)&w9{p~jXFmU9}^8;C-%MoSZ*8&~U31nAW83=W?mtqI`pX=wuf*k*1ousU`a*&|d1 zxT93YW0s1BM}3S^rci2d-FWPHQ`r%h^x}bzmsSQvWe`d}rqw~N_%10%nZVs+7>}(* z2y^-67QLI9$JwR1ZAc$yWgq%AVqxAsWS?oFM~{;pr{;E|ntXEXuTC)47EmBZCCIT< zHY9z>617xG7WF^;7<13B1q{(;m?*E(C~u@HX9P%jvYIwli<20%5p7e1qJaF-yh ze&;dG0~|qp^EV<fAo*6chQN4~ z#9jLLQgt1_8Eh*Pbs@Xi()dL(9Rdq>Q64`ZYJ>vLMF}SA2g%iqdZX~bpJc8UrK&Qr z`H{W*clIPc$>j1}s)JW78K{b&Es=_`x6`+%B|`km=PPsi5$DSz=>ZNqUw`@ak>~60 z)cLUUH6M9yzasGU*=eIRq=j-{pAaB0Lne+9@WMAKnpU9i6++00l&()Tro2yxx zj_kRTHO74He8wSPPt2{a{_#F@3XJ7ifiV|FhP}E1!pQaN3TIc=q|>rY?Xb)1Dy_!Q z?5tGSSyh8-ewg`@88j6cs5bhqxROVYJcD8C=o!q0(FTpJ=5kr6CSRndW2yOjiMoK_ zOvgf&&sj{zl6Y8h zvZ1Jnr!Wa9$zm~?g}9XIO=fm@I#E&U0|=dJj+WMSCTo5AnHp1{TL*e~@`c{YAu`!= z04$g0%x$NfZRhky4nGO{{6n37Y-}Ya0gvcOK2yOItYlN*S3sT5FHSko|2gC91Mzcd zRYE^hLH@z`+0Z*DqmNSjk;ZUJgpr zSp?4raoMuxzZ(CKoqS~c@8p_y(##}o+6rxyb`~eP_*YuRQhpc}OGuscKZlY#)x5+U0Pt|KBnBJ@P4AnHKQNJBZv5-}Qm8k0; zI{XZYfSjOCzZuGMs@u>{y|&)(&aZzl{(m71*k)3L;s4n8YnFfzziif`0eVSxY>Qom^sT9H`8Zm%x;z~F zu#0frUvJM^3GpjQGSGiN&fAN>`QL}fu=EQ4a&L#oU?r&wKj%9tF*= z@iT+u2iA8^B+4wVeA+Wjin(hdSz)IYlG)bbB+P!b)G4Vs{Z;z;7uXxti;R1PVKRHN z__Wck&;V0ks!rG-swb^g+NNqA)b4^>NCSZjP?z+ORmYV%AsZf!tK_G^qD#0PT59YA zL`Zd^FKX{joTtW=x=6D_EIEMpxXLmos=iNAGLA@~x@4TOuZD(0s)~wh{wi4;*1YFJ z)05CC2?QS)goByWDCI|DxK2Ei8GhiU(_c#dbtH5cH1^SJ7v-Ey+sEt7{ii4x+$4NJb~Pn@EmGX}tFpz0^o$OMVi?bA9m zd65}G_0y8?jf|g6G#=$Su=DipKffM?o9H&ZKd0lm_TS-?#>b}N;22Ri8K?DI5oo!m+ui*MqjBV zrVs(^;=?*?he;GB00X+#UC>oKjL9hHG#c_fzCG5^`XGLHoyF=upAeFi*pRK9_{Ng4 ztL@SVLtq+`-Di+Yc4Qs8-4LA`Tfjdj7myKfDz~iku?JaO`vKvue0jh zEYho}0kf|Uxr3Qm*4q}|LOM9SQ^nL0@-+dvI_PrO-0&%coLp(_Q-3?#<(jZDalKO^ zxqdF18AJz7TcFCs%Y_zR2z8_Ja*`QFtHdbawnvKSS%M>?@&veJ0FH{miz_qAfh1b{ zKQs;P-M;o)@bH7g!c6LUR)_BwVUWH);irS+>3OcxtBR&%yn-HXq3PG)IZBm>5468%$gZb=h?;7+7cQgg|h`X>F^>hjC9` z=I46u=v*ihfME&@;Z1IxGYcoG9)%N?C z4zzH_K1=H>J*Tn|=2!mLV0aC}xe6WPmAl?qD&p5KFBF&KkS{S%i{zw6_7apK|6Wwm^p!9|j8Fb$22Xdz113`@fIrMmSRD&EWG*#TW`5UkKfSN2b$^uY(q856u9jha z+b8TyT%*nvHL6aR+cgH4&w7_`ngM_GZHLiu`Ke`kEJF&N}tYQF1utLP&WJKW<7@ykCd zB7jos>-ZeqVTp!%ioO8V>0S4DP@FIq*hm&*Os-c!7joL0}1cR(|9~Ae>;-6nLN z#1ME!nlaIxD24@9X^B6?D3w`EPm3K?C}l@;=GuDhR8Q|6{2PBq8q!ccC&crD5zW1afw!fjQXt{Om)c#ruJbZ zenD(c(jD45O%tR!#H9i=4sKR4=3(ly{1m*LCpk0D>v-MQ{v4o^AB^<1KgEObX5wvWK_V^?6O`W2!NV{j72j4a{0s zW~3YpkCU!?gHse z;-c}R6Bo;*y$XY^UZRh2eQ2l$9KuRD!>*-H?XE}oS7vXE#`NS5(~SA=FTd^&Y}{Wx=(Lj}R1@ z#g8fq*Q}CdBjBthfIVGwQKuDHV?Almv96AZb-D0CifIk=Xh zUwR$=l38cRz&hxlO7rzgs7OG*L%&pM>X#(H@9Z$vt;s)^ITZbpURC^!YBHs9IS)&U z->G3XrPIuM{E$m?gKbKG_^CkBo07wx!Tz-8X@~#K(wyhPl01F3>0+LBxx9^Dpwku> zk52mz`ST)daVnckL|x0hck}}bwVtU)wf?)l=xRDCCO3M--ca5^?TP#^qW7POF!HIg z|5Qadm(EcC{R1$JYoY8vXlcb|j+bF!wENU>d}5ich{b3Ro+vTjbey-p(-Db?Cx4Nc zOTdMsfNiaic@D}pR?h!Qb2_M2oosiJ2-w*q@szQq8>9>-Cdy5c$@xf1@{@g5)QZBiaMskTomgwYVk z8O6x=M8v=XAP2x1S|d6`t8s7rICZA%`WXMpC~s;oa_|~5!u0gYZJxI?5`1X zf7K3}Rl+sO%RuZz{#T=7|1PAUch}OyX|yplO)TYo7!7z`qUHcPPX3p)}kpS zWnyyui0Ws3-xOg3Je7-TE@-RfYO`PciN+Sug~~VL4Y;hw-%gK_xd{iz?&RvoT2=+nl(-o_1@hOONt0>Qe(d)g_8Jq?VTwcBR5WDv45k zg{iIkkGjmyblcWCFh_a)WLDpd26eNR!`zvQ?8v6jVGx#E8y84H4-!6`@7(d8M2pai zEZB-Z`j4vfMEG5~)={B^*E*^af#&P@G;5IWs<-*tKPHcpO2$|D+V?Rz*eu3R@ZI_k zc?6HHUGfCwC4Q#+G3CQ-(Y3{SHlRfeuyRp#W3lfWA|PeQ_j!a$-&&#Mwe`ix?h)0S zecwEn3h0qnoD7j+zSBgj{&4~`_cvBV_R~^6HNlQ=EY|Af)3fiqyz8nhJ{Q1K+>y>H zeba0>KNUFtPuAQ}@)A8SO0CqED|ll>Z@!lrqpG*XFVHxPkJk9ormrIjUWKV@5xO+m z6C=l0``RA|wHXgjxl{Ee#}3-rM`6B<#VxF-Z#yzDyNm|Fj9eOtr~72Md-`d@oOQLIR4r{}n=4|2l$tAItvu=#Ay2@(UsKpeo3Jd+`Z`EG z)JF$qY7%F5F8wgGGoq&!ne8S>+M1wUUp`9mK7RO~3T~#h3IFl62iSH6O}-9E&S2s9 z7deizMjlQ4-XM<}zw!i($Br9*HLF={vzm`gn!dI0FWF*}8%9)b@O{%SJc@-7UO8WP z`6D;b)mVHkP3RqVL!{H6-C;rCaUhRT?0GhM^pVfyXt>|;Babtf+A|;zwpURlLnR#( zikW&us$CcI!0SIBhna_6Yr#$==b8pBF_((O92JQ<@&$Iu+59i6mVYxVfYtcgSFp5? z&m0N|?%(!w-F7YQ&d_bYe`~hwDqn|^l?qqtaf!-W)cC@r$8&TWKOs(L(8%~IhY{a=IexUS{oh#k=)o?9B0k5Xo`>ThZ|JGe zD!dvwLJ4N4<_N-^lrr^|bZ#P*xfv&N+#@{Xo2c{X68!jxn)#W{Jy z*D*@A5BbItV<(AglCOQM?AqE5$9HSDJnJ1soJ`&^s~|vF+!HA@^UJd^E29JmR9?kcd?L|tLz3IH3mj; z9QqquwbWl!%_zQcjq}y-tXHz<`PTm4+V-lblI-)WJUa{Gr&c{qh%!;^hYo&ADy`_}KD1S% zu3BqF%aFk!qr-W)c{=Nc^`HUWm{W#!)eUpP)Q~Q+ARVPo*l<8{v~vLEhoytk$(6lE zZGaoP_>V0sB>P@nfV{Y6o2#F?VR$+atlqwCn0j<2o~wj1eF*X)nRcM)y)}JcYc(hI zAMr{;llLw=Q$mwBH>u65P*nH%zMiCVawUN^FEkq6XpsDwijKa-|D{$1k_SE4`$;Z1 zzhXx+zkb5(3vl$x>9HNVA#uScx$H}Np|JIq!nQ{!@AQE;f?T|CIl z4t;o^p~hs#&G z)Xb;42{9oHPs+0JKAR8k6*S0)gSWzj7k9#wvMjtY`S8+5fcH-mUf2mw%Chj*zm_-N zOO61q(uDUMJ8^crQkI2xT|T_m|4Zn2=zO%DCcJhhJSoe<`$Rsx{|CIo;ZN%845B44ntIkm0M8+%1Z|CuWx5kF|>hXbh zz70eFHCZDPQL2*X3Vjw4bLzzd7#AajVR$@wf)rd#jc@dizqVi3yR1%N5 z@wo=oZJ4_+s>!^l@%6hao>pH=v1px9#2M^S=j(fUg%0k8BL`i(WT}~t%x&f)%jN5P zgj&|y{Cs5c0cSwJdW;(6XFp6nvglWjCLfv3*EfQ`49M5lg$QrwBO_nmWK_XOS2|yx z^j9@)KSVyV2WSO3g+58(5W@8lPPRn)CNWEg$k%r)_`3gQC%#%ue0log>+94?UZUUT z<4cM(zHXt0aiRPiDt}wa@}tGq{e$A`YG}rRuM_Xd;Y<3fKDkZswVGD?<7>}NN5oe_ zF5Yo+(EI>8ftUwZJvB0v+S4+@xqk8m3c~`jSa5Vv3lc<6*1L`Bt6WYv1F6(xSI_{goae-35#G z(gxivnK0bf{xb^2TS&CR*x5><|8g}N{zR*Ds_NW{DlLi~)isj3VR`Nba-U~*cwv`& z%!ImOiBU4n0^?odtxSvbBKh9x>xcbjHO*T6{;DW>^6z-iA&FsHk|`Zf`-*|J#jm3? zR9XwXuO~L7o02^0-LLJ>P%j_*zAg>g=Y8K=_sxs&&^X1n zc9huX7FDm0kD|Go3#U<>kmM2*q2~^yG_X`72H|pTf-G;F7;(kVw%&hX;CtWW-bm3q zyS^i;1g_N^&GdWDg=dM0Zd6DGln$B#@@fr8*_Srqn)FtKy3Xqas5_>$s{ARcDBzR3e#^NG!R zkjF#&w#W$Ftc`sg*Fo2MrDiJhDt#xrO3gm~Uc?5wPv(q4IwhT<2-O$VF>kEBLt^Wd zwTE8}ef^ir#q^_`3qiWmV+IE+=AyX&JXA9e6ZOEfi%NNe`tjFfIqJ(%5ZZKmQ<-lD z3yz?hnA;{bYBtJTY_d2?-H;sRFel(KJ*bjob!o2hbJYF4Ih9hjJWaXn;v%a4ChdT@ zV-L7q4RH=P4yY&jfp6Zt#F*q~T=6j#-4$D4?zgS)TE9^W-qc~ba%DC&eIM(%k*`tfn?CebsOP83;MT^`-N&3J8>yTTTs_m=1)>D?$n=p^K~LjBJ&l%R zW6mM_#c`XzhgKhX{=7Xy&fobP`_JF~GJj8g>DcG*20+_@Wn5#DOx3F_euS=@xlfU!(b%*~x zWqqIGd#S3whl3ogK445=fvFEz&^NR`Ah}x{=Os}`ARP#c#l(%E>QUh-Fn~>Ngq*X| zbsjcgui*{D0^K^o<~rBACdgv0@seuLlv~W_950Y3uA-BEihbQ1pE9d4JYtq!{o>THH+j$F&zA@ z{YPKB_fT2(PQAfdAE2UBDXJ61L~3u{>Vz-AIVVYdN%P@} z#?q5L>Ly)X1E*(4uD|#g>tB70^)Jt>KN$b5LMm~vl%-CVg1mR|afkAmWUtnaD#5~<5AyFKw^2R~}_TN#wPV*q?T)-3!p2j{m&vp?13Cs$Rf&Q@Dy*HDuDpQh$WbZTM7 z&QG~J?X{@997C`ysYn`xP$oghg6ib)wm4XcuC&xJWkEjmuz`?Yj~#?>{KE3t&EWZT zfYv1)ZjdE>LAUu=He*6PX_)3cc$xR+cX^k(}_xsG{Yh!@*I3kxEFS$FAw;oHZ^@w&& zTr4I0aWIR8pCCc95=)IM-9_TEe~PT&0Ad1*ptR6ZZOeHXO|sm~^cy<+Z6L}=g!`aY zxriYlv$%v0>9V#>lsFe>iJe+p(^M|r+VB(n3x6Wh5yezF%fUo~W~c2Ad$S$h17654 zD%Vixa=j;N4DZ{{Tdlo-oV@rpi$Nkrcpov5bq9UKz(0;F?>x#vbQ!bB#A&x{AA%XSSS1+nee4m^;1Cv@Xgk4hun6l&j*~=^%+5K061Rh{==BuU0P)794YT|zbA}5os&ZU z`s>66#ZgFo(FSPv#+a1zm5m?2)7}83I#@v{x9|w?2M?XADX)BS-z<1lw4dCt;Pyij z@v>a4)ubVJZNmi?A9JJ8fsctw!f&#PfXOC6<5WQ-l4eYW(e*Lsnq!3QB_#t{xANS; zm3NmcD*jXdz!yF#Sx%qD-$xdJ+Nn!C0H^}%vz2EQaTWDm!QG@id{dzQ_B(uAbY4?A zm(p@jXEyy}7rM8n6t|s8J#O4$b~DAr8kg&;`8r*A%9;U%*XefnAr~KT$aoB@J@bPh?(Lq zo8lE@^ju$&Ue#B9kS1126H{p7U{h4JfdbjWZZW^I`?+S*%K+KP@Mpx-RuA~wE%<8^ z{4H#Ck&0LFcaS>rpSt&p7XH4C|B%Mt9lAvD7XfQC)aDT;{=8A}r}(Bo{d`Lfe_p|# zU*qo_+#&Qb$^OH52T+1z$@HUy7meJYZ3-AEBhVC}M=%HlD5A7$3fP9nk{-eHx+F&d z#nuP{G6ItV{<=9g0tW?L+ga>V&0?<1pZ$60yI*DK4pyPZ2)#4JWx;;Lp52e1%=2%7 z_mf3eZs)+S_3XL(d6nQxV&?FTsWHRp1vz12tpVmNCf+WR_m|jyQE$x3`^!r+?{7yb zdzsGr3;kbf?Q5&%p>%AbYM+Xm~WNzGtK9+i_^>Yfu+I#&kp^D|3ew zMAbtb_?v_oDU4@|349K~wOnxS!oI$)VB40y2~SDz%tCd}Zw~eO9@%*0)*A0`P+O^N zHdT9nR9zXFZD zB+Uo*NP&Hcz>fTydaJ9SH%IY#|dHi-Vs&DG6S=bDp(nEF+c=9D;xZd23D=42>x za#ZKdA7Uu|=?a2k2L41>EV`0{sJcpEYsc7aD)Tu#l&gS^E1gSicus~wJPwBPj5(BT z>xLLgzvjfPZdtai+UKHb4>si1h&lIPGaH&kL)?CLsYjW6mRjW;Hz?Bj&CBi60oT@(vv8Br6yM4W}e&B?(YX4&RpRVs~|BiHP72gOK)719uRYZwk zLrkaTcZ{wFrOxFrO2cnl?k?JFO!9<_iL86z#nX2j*wOK9{8KPI>Qa?{^{H>JWZJ;i zKx%*q=a{B!Xbq|`H!3NJsuh^GTkkMuYqZr%32UM5xkh?v_DYRfO)p7eZniADH{pj| z$}K7vVlbi>D)1C-Zu<-U+#rUC1KT^+_wVQMA^SPn$xjY4w5YoJ5gYqyDTt}(#LP@q z=o|yZ+miD0vlVZbf(CUT70q2R_piBsEqFV-MJIQc54CxQYQ#~8CQDwR;iBzMuq^vc)NUw_G3Kd4=6JutO&{cEY(SJl)1ai~uVDkpJh zG2+3}qKy@O9s7G~pDPe&T0AV8JL|U^_2{wcUu{Y^?rtF1ze*=ItBq^q9_Ra+^G))< z%$)w@W_R+drLIH~4~q+;>XL^J$?Ve`*ShZS75FzwN`czl_Y@{hHtJRS+myE@-|f3` zID%7ZWM))yb0KcVnIaLKMloAOPjR>#Yh33Uwa0?{jC--GN&W3X4HvqApmu8VGo}_u zN>~r3aCKjdDHyn8a#%I-8#zk+3UVvQjAkKw;14f zS{+e2P#y7q9aaRfDM&ANa?56RcM zU#Ufls(J6+eicM4<(`vRM?I^9D?Dos3CS)StvyxLtupI9^EP&LuL!Q@9SB=}!)UR$ zyVUj8yNYggt@X$|4D3)2sV8 z6(ojhIGI8Kd=daJydfXaP4hc8iv630-Q-gf*h;{in*4*2uB$ex41eTjh5jk?@jy=A z&(F}}w+^njm5MW}QGCf(+&U5$8Z*Vj6qZvqyj|aFZ0GM{f|*zvk={wNN4gq&Cb^Nn z+7I<*7HM}0ZVK193FP1G(2$z`K8r)@g1JzQqw;bQi@8Jto~BJSz0*vdtF4 z{aAXhUNh}LleoaDHRdbZuLJx&^{Xs19_+lt$mZ~kv4B^-DP2fQ%%2=tbil8lS3!PKEX*><(L7=Wac zDQE}ny1?STPEJ*03}3WC{m0i1^JyyWISxdm9!U46iJd-ptfW(=5X)IHaYbnT~41@RG0>Y=Ml?3n2$tn*=^lmCZ@ z+FwbdQTuYmOHt!cs%5wOP5_SF@_tpzt7gzdW3=q8J?WK7edE3?^M4<)FT9v0o@j$?wgxIaWNTwv-;TDG&$)gh zr?f#(MTO ze|83pV!X^psk3!U(t^PiS5!7L-PO~j|6X~)t;B9?8Ma;OihnA(DkPk*&O`o#CX4fh zgiXMe_}A4_=W+EEYh4+}L_NMzV`uW_kjuCt*wmaj9j;MHe6mL4J@pbuH=Yz{VbNNX zb%qdd#`y&LlhJasLv_ug2U0jYJhA%u#QAJ3mFdY|<9QXmQU>m8|EA0lR){7OqV{)i zLR=PffU6d8Ca7v-R?uh=duwHKgI5(;;PjM>iQ|f(ahWH&7#Z(9RoTCrD6ga!e^9@h zsmbdL0IdSlMAYbFQw}f(K~;Y-H=pC-V7kd`^r|15RVNrTJ#Ak-pNq`z#m5TxXVm}7 zal+YWOje9W{kDHOJ*Th0nx$d++HVElcGL7&S~gD7eV~14poEf;sy)Xoxr;;O915t; zhl+HkAR0;aTA8l%D!19SDS}7Vb=&guUG(l$dEG!4Rb~H<*faQyI<@~RCWvDM#tZc$ z>6~Z2q#TR7=cO9SH)hYXwLh@(?^&1K5A&A2r9WhUl8k19?CP*Ky{iXTz%HkT!|5AC ztZ=>ITYA68;YZs3nB5cS$t;2 zaHTOhU|cQ>F(fl9nB}5EpCE{~gUMB_v{e#>$;(bO)6eEJ)6e~qkSxRMC)ur(@nrRz z>{h+W4WjzQ7FKAS2)c0#yX{aPtMJ6?HZcfMWQ`x+zKFR1i#k(UXy^#N;48A$1<5)se)Bq*@)F`m#rUE%hXd#KpGJ z-F8#Nm9BLg`+OaLGEo_GSC358!%XB=;?&NoBAr)9^f9t$Qbg1l*SmM!P1Wk_JP91O z-cq-PKyaPAb4~PZNzG|GPVT~OOR_2=O^G!HgsXG{)8bF~$ zN=5mn?WXhD_){FnnQ>%?=3w2CWf1FUoV z+CRZAE<`n1_mm9Oc;vL=BhAdu&1&goNzbv?6z2(}CWv3MUP-JJcjC)NEI7-!D$v+0 z%qjgv_pe2*N3Og8E2Ul{Dm=}~F?xyMfYq(~J=Vp>@l9b~Hpwz-@~dxrTQ87Nyc<#d zo?aO%hp`wk#ZZ9XxJWOGUqF}s`7PJjo@*w9f&Q+`omc3cgZL~4lh(%*?KP(@0|BB7 zpEiiY3-Oiy`$lB2;sRMz_UMzF0#1{GsSlXsY%=G}kZ%mq-U;f5RZQR>OVC2^f{rDX zcun*w+7U^#TiiqTr;3S@kwV%}&-BJpO&+ze#_j5A40bj}dg@?V0~N>{aJsGC9aXL? z^$xw*wb-Rn*o!U3YyC0hFPSyJ{IeASp+@|Eya)?y!QN!ITlaI1Z#_NnC{ZgrJyO80 z-#J)s9t*czV~n?0mL+^C?5I@Q*+dgT$O!H!-jgiz{*A$@f(@#EMWGx4WbNCQ@qhe` zIS_Eb%DVXU?VyFQ$eh9&MGWhUpPQcMCXk5qoV>B8h(c;x-}dyCp5*WTKi=L2FskZK z{GTL~WPpJgWPqq6#yZ;6L>o=4fr%P52~kOy1d^aapeRPHZKrKP&BsP=F^k=)+ zZMToLt!-`B?%HZKT51!b3BC}pTTxrZ)@@G=R($ainE&T{?wy%CNl>)y-SM z^F815eII!^m2}AYq;?hlSc`!vmmAq53M>u@A$E@lu>n>E!44fpPAto~!f8V1^BK?? z957|pQ&>~2T4)u1&=gnA{b=b*ms(e^r-R|1jY7?3TiEVA5J?W zxlIoPyg zPv=7bK@MFV+;a*G`BJLe5pS?zA#F%?yI2M|1sRvBzh0Uv4xq9`ZTT}ufjipT$$QiT z?f@wCpa?c*l+MOOE(RISBQ%5G%!rG|X0~;LC-$`(1I2@(X7n1=l1)t~P zDUB)$=g^&B3+l`bz7^Sv>%*f<%z8|E(I|(x)wEAKfYGvc2q<;^6I5YlMzL;sC0STw-p@ zWBNercY-6~(>xE%Xi|I7L&(9FgW1edbcjS4k-y3}nvYAb2qCso6U>xkEb@oA^9kc7 z-bP4Uw9pi4Y*84AnXm#TEUNv)t?r`VkolU=e7OMdQ~h$E_Vpe6JFk`SazBYRW zyH{WKimqLecZ!F09yAW3B5F}PUP~mzBvX}Iohg61XouU;fqqp8K18)@UkPvHgjnb-MZm-m}jw z4!C&dVh)FQc20DtCr3Tp!oy_S@@w)JJKnId)bDH0`GYn%`~Zg+ZE)CwJ?D0zC6g>; zj#4we#XwDCPVm=S;S{TRMLFWfu{P|+n6uk5=Ik))cZk|a8*{L_gyNAW)qb2x-rtzB z>fh5EruaRUwP70SC8K#ShMHZbhG}bthN;s0MsHj-e}K}%&sJxr3^mymEZK1lH5L#} z_}y`W@WWp72g_a)#bfMv;Cq%%S>P*4gRkHCu;6ge{o{qJBrJp zrJOUy0pGwU-UoaZ{_US>^LIKye;CU};m*s&e(dR5g*2A*hq+BZOZ&sDx%YkiVWcjb zKg>r#U(0Wy9Lxx*?_=Lj`ool&m8bk+PPuH9Kg`MBd>?<9WNYFNvxUNDQ{oRZTiUVw zVV<~58^%-qFxi*9k3WpAHti4dsZ`CDKg=I6#3cP;ZZIoP`NO<(@i_i4A<*zW{b7*=AcQf0)_7WH)*be;8eB+8^dWQWabNFg~f<@`w3xl?KvM za8UchoGW!_`or{q*5imX14*}tRCD6~5>mzK=Hx-6`Vsoyq(96>W^*Zjm|2y_8H(iy zq3aeuE7Kq5X}V(JmFW+2rPOWt!@O{*9!km|=9j;ap=9{O{Fc==?odWGC;l*>PPHZe zFndtDwp;!%H<}Hl{9%3yVkP}y{`JqYZI9;xVL6c`p(Xw>j#Lxk57Qw{SpG1cbQ9Vi z<{Q$46g$AZS z%;nNjx9K_ZyNmU>3RM$LoPa;fow~fIQ+t}+z&9y>n2ordjN=b85x8hgQqEX^n2*82 zWV*zxyOz>pl>r0dmZ(>SCYz>5%s$banQnxpN6bph;7N~|Bb72PPv0*Bqy(;uDiZ+b(f|38~stPc5IAKC%6ZPfQZ|;-*i`X{myi zPt3nla1{R(eMRg|1*fOBu;^afDej?^^-hPLv|A$eA!7&@UGkdwv`6W38q!e@tAwG} zE}#2Ml-RENgBm5ymJd|$zh%4OJHcAv>V2$Tt=vfL9PW}$P&-O(SBCz|(^-PduD@*L zO9BT((;4FXcC83q99T|Rz(N)H43@UVff5w@l6+`YmU{C|s`rY$T#k7`>5n*3s5Z${ z7t$zC%MmUD>T$E&TG6`r5eW*7?UW7_KdsM~;-eycJeve^sE4mXWqB+-tN5im-YDu?I->r2jy6SAKIr3#y2HFX@4*7O`?`5o_~7-cx$89V zPI}NU?^c_4&I?``$-Y-kFIjB5X4EyR%fLh00RW4&g{e9q?!ykoT;~|Z9ftf*vJkhc zt4X{r2s=3mzn3o*_?7Ki008Il{c+5=U*doxKuJO{TP=GF#0GerYL{zX z%1JPORmY8JX=jMsRM;de=Y%Fr9vg9AB2ZL)Ltx4*AVIYkGN9jzB8O({)V!C;McWsi z_i%v6JgHV!Q5%+*IS&^lpH!GniXL_*pPX$znelLG@`=xUVuO%N2Y~>g(?J{{R3<90 z#WF^IHH>7Obt6++)!h9;@X+UZZXe*KiHQiBj0E|=fJnHW0p2sZ_N3ZJLXg0_vM1Gl z3QL_5;o;eeA%_1O3ac%l3w= zkkQ8b_OR{S@xF5nQ7NfM1{w~$cpl*s5h8HUKtDHMI)#)6F0Z$v}VBlfe>q^k`OC zyiMHTgWGTgpC41;U3&pXqmHLhR(j(G=dOEupM_O-=7RyR>Xyl{0 zF!QeXF=vDt6VrRqlEE-V2VLDuj>IDF=#XpV*YOr7>)F+a3NAmE$2&@-Uw_Al>?O95 zT%j|u_lcK=l*c1U$~l7vA|s?TT%gXy5<+5OaPkKUROlxXD|5lRGxw-G3}6 zHs2eYFHS|*YbUeQ(bH_b%IOHcv1U@EdJZX&k&Wa-Rku{-I%0F(vAN#3b6;$(PYe?T z>EKj3`wBN-?S;`YZgQi_u74$Xlb0vY%ai84M$Ie6sZBZaNt50^`;u(-%<+|@dZ+V&wSO<5Ma=k_z7VTBvpVbNrO?nXF8*SK>(xs z-c)7- z+aq<0GVDF&)|lZ1q){1{C?MbFrdo&%oeN?4@muEk(|g#0#oT;0y=yhLu_mgr)dV3N zgTnIoX&D!`Zs3Qe^h*m$J7se z7koE0zl|BtP5M^?F(YTCqx}wQZ{LJfWF@Xwzxn(`2RLAiiKKM#inKlr8ng$WMM=`K8Y4pFK9JrGcibf6_x9)RXwfWX5@Tg zeBZMB1JsR5(wTG!xIS>bX0Hoi*!=t}#EWK?W~+!?Uv36jwTtZskT;fUkWW*WKA+`) zo%5?76VN{VZy=Az2#FoZxi2ycwyM8?Vjx}#Zgs|RuKornEYDW|%7=25MRTQWBuzGB zQ0;iepz~A4ppmn&jfrgF>HHaZd$HJFJe~i^rILgDbibxhJ?Uosk!F~9ov}5x1PUdb ziFS<*zQv(}e35R|(-r1^oR&RZ*U5{dDQdW0KBH=8v{J2R6Om!$Ku#*<6pH9Kk%(X9!xA0`lup#j1<2D9tC9VwC{{DZ5NxJ8pcoTVAniES!tdi? zM8&#QRcqc=$|%)rZsf6J_ztu6fceQ88J|p(JG1}g>V5zwg@i_mWw^}jOGUabNmHpe z*_ZNUUvkv8JMf>_z^AK_e5UGUl0ZL2C~HU^!MWI!dEw3*)!GJ(6M70js{-jR#r*14 zYA_xJcqu0b(?MMN`xz!AtWdGppQZ?)H<-Z;_`;8C1#%oGblSrv#7__1MP zo)*8%vO0Q6f~k)+{gaK9=@pJ}s!KMy@I=BColQy3;BzJRm?iOt9m>;HHXNtQUHcIM zw5#l`=V?9ydrI0v!sKV>*!da%@%Hm2ZWtP|(IcwPDKM_~mF*7>3j0_8%KAyc{?+-# z{jnN_<4Qz{)2XT&PO0c4?xC8!LWG8^fRSceJla$+$9q;EPof8_!q-Z^T@t-JR@cx- zowKKUc4^Mj#+5}zV}MMhVNN$G=Xd?I#6;uDfH5_GV^-|^?rai{jZ8A8@)Keof(<;F zhr|e|BWAr>l=vgOOKm`gHInAMDT*7XpMY;VC{5+C1V))TuO~i&>+?HGDH)nfM8pKE3+#$;tI*WQ8*B8$(LC zt<;W$D_(JfyZ7G$SAPA#aL&&D!%kyszdAiube%&#T|DaWzrnQPsg1-qZWk8 zud}L`*+rCPDU{W$*Q%6~2$krN>XuOA-5fQOtDY*Ofs4e$3~mPFw&|k$08cr3)fb*7 zUdUIt)vdU$i0)!5z0hvTrCQkojp&9PnXbwO;;Ot(WUI=Mih$b-w5zhe(HI)+40Q8l zmO94J@m5~s)Q4Ado@KjE(z~!p9X>~|MTmyhBk{Xjh746%DCbDeqa2=dA+;-2Zl0xX zsk6#eNV!t2bl?bppQXy_u2Nr#RnAYg`N&7rGw@l#HgO?-jH~z+;sU)Y&01J#ZSZP* zKE-Rw1(1G!ep*PMw5HAzuiU(l@|(RG!#s1a!&;YX^<=}rCW7Ls_gs=(X3TJOJu&FG zG8cx_vmetST2S`FP_5~8*jC!zR%i?J_?1}#(E>+j0S~!NuFI(I#QJZ_1N|3d$^)rU zeUoVQSZ%>zRZSM&+%a7F_zSPdrE93x^yJCl+_j)!`slo`zxBIdPKKxPXn*TdU|#teWjq7i{aCD_9f9q@YXW{YvtuK~9 z|CGP=$IYUqzjck>-};@=?%eZCf9pSvexCBT{xd3a8T^U)TVF^&U@%R8>w?a){??my zb>XzXHO!XX-+JNbj=&&jkNNFt_UKn>f9n^)$@liRHtCrT63`xh#Mv}LQoN*9P@+3C z8VVZKQ)layAf9Ihv08sx`={5Z&0pJ=$pc;{CGcv0?Xnk8UR&#g6=P)ry1s#}0d@1r zM7%-x`T|=ry(USfceNA{>`r-DNLddn ztUe&D9hPf+kPIvznpF zE;kb|wwTvsv|V_w>i8|%&SR@AqV|ne?J`b|t|$rnweH|?RNh(xSrBSf-xU<5ha*GA zrBZ3EVrd%=%i^IdRcib_QGfI^ul&06ef`nDgT9XSWAjJ97R$^y{^(P1Ljdu`A6QZ|v%JwC;+^S@PF;AT zkF6{1jsDf+)RXCrUh{#y(HY=qZ}e)W_kF$5b^g+nKYEQEO!JTMM?dhX_wz?*(I3|z zz4x~^`LKGF{$r6vM6VBoH*`?Typ^XC58*y;JcJ*a$Buu?)$??&-TyDPc!&y#hxjTc ze%8w>^&c`v^^Of+r1o5R>ycC8FE`xGozpl(KtMG(y4DpBxq^>I)^4~3@)~gxJ+MX+ zV742V7tC&#*nzdqkx8@9BXHmn!f z@I;SIq}vkHfYHjhvS9XSrB_6NPBH48vp+`1vgp`l60L!QdAz z9l3eK7inj@`AD~OiF`CA)yy=j-dSdIGo@l;l8j@f*_L2Z4YP=!! z6SG9DBM^%eHV@W#9cnX=n2_s@%lsG+f`hA_b+OC*G<&^9s|m~(^R|^Di_)Ti5a*CK zcEJDBX@ku5{1KD{@9+jBk3A{?l(I%sLGUVPWRg_lVzR|}pd)W4#TDHW<%;mkm3l_)$=4?9{$p?zi2@I6`Hu_{Y=L>^;Rx|M(Ti9& zgH_d8u<^F6VW$3Lququ7c=jB#sh}(i4#vZdkr5q&a`H@_`$VEcj1FHck1)Ov5h4;C zG6>#)U)^mr<5;95$P!zK`m5iZVKHp1!iFs1dQ!B*xoXB)%ww%nFIxgaNOf*rw+_v9`+Ywi1Z| z)Cj4JZu&!H)#**VYDcN4X^(6d`1`6`<3Gmya zc!#z1V>m!qe0F@U-^Oa|yw!UyAD`7uM|;Tr33?J~zqK_fp2pW^^|-1!AB!9+ z9?IE@%GQekS$x-h>UGd=De68JbW%S<|9AhNZNGD6STxcBE9EqVWvDQzNC4NGbflt=k_kQ}4M)r1P@{?EwVnDH-Ao@)9N zQvL9T7)MZfm%5C7tEcip{DvpsE_#}tN-cJz0$;?EMm>2;wbOjAc-^sXq6|Kn5$Uz7aPhCTjqu%}9}=cNf2^nq~_d)AUgjXr4UVhhrRv2T!C(Z#r8 zbFK4eWq^68IJe6Xzb$p-8&jl)R*iq3pawF5QVH0`fzWf^8r{4mx?Nxr1720Q^z%~l z`6(8Wkc7#ptixboAWa@czjSwcJ#F0k3WK$0Vd)GA3u7^no!Z|;mS)*&y?1s__QviG z9N~35lw88J`0{P9>p- zAvY({>=vG{%x*MximL|Z{kwHZaKsBEZL{t6)S*u;Es zoc>Vbe2bOMFpGf0EQ6E(h#q3QI?80Bxb27gz>(7lUcyB{&a+r-=}; zRm{DNP~B*ue;vT;=0Otum#KrI&}%IeHIy5z z6|t5IV{T=vwz6k_ReW>cHek}!-B6`+F*(3RQ?+2PEDIqF!2$cS7|_dNFVF3>@f}@K zzyTcU2+S>rEh>yH3d9x_#TJ#&`8|9PTT~ibRL*Kx))-q<5nEKLHk)f@6RpWw*`#Zs zz;bntjApY*dGvCT(VNRf9L~(;B9==TU8lJS7~v*!5irWl<|1IEotnTfTF?EP^eSMe z(Y-RtKk&V|u4J67t6qN8|A_YIpVTza-a;Gnpo#YP(7sbG1qgc4J!%0yPx*NPFpB`a zZSnn>!;n*p@AFe_ix0y)TF_Gdm8%wBP*D|C$P5aZk@YvuBnm0WoJ65c-6nq1d^I20 z7VSV-7VSLy7mHykwrKP>7hxTZ@)3)0vqc*oWlDsU+ZG`?ki|RMwjJSL!`^i|^kKTD z55%>~UPepWImd1C1-1`N{j=n=4{i<5GcGV(u~J0BQe4qo#>vJdv01U%@vGeNRqo6u z-uNnS<`ZAE&nFT+$zr_JG1W|(Z)-~PDD0Q*Y5u_${O>eLgpGIb!?=v*Fnz)!{5p$e z4k2YSU}H=UbK!M7!{}vh@qQ#EbBp(xTlxHH<{XP6+nIzQWs_oVntx&|0AsTF?21_4 zU0LCeVWbBrC>K!ok~IdwlSCpR4jjR8+#72skaOHxpz{MO9q|^IhI&)9AG4_Ja%196 z8=G5Gahjsr@y)JvugMM8dRI?Sr8D&yd?-}??92>aF)4Lekv`R0d?E@p#AI`VZp--6RVSay1ps2T$~Dy)E2DhnS*yYMP9uGq6qW8OWxp1y2B##Q87s}8W61(j2mzI{ge{uxZ z+I+?}PuL+->ZuYBXgLW!xwKwl@c`LENtjY1&;^ZQWCAQMZ~!(}m>M}UtrqDX-llS} zw#uPScIqWpWy(esK$l(V*yJ=pwJo_Qi8=}`P$ud9hh1-9IDEYIMjvIp(fft0IR>&Q z)=uT|n;cfZVJz%2i1gmzU_?|{et4f%oT#}3jiT2P zy@ga9Dsm$$60Ka}h*O&GS>iAbkWFEAwsBFs@&e=O;_Y3JtuN8`Ripn~#ankCtnin1 zOeX6|@s4=7G%M$E$;;98*ex%E@`W_wCHUctIkVQCR)gU+5cwIn?FaiN%F_@( zXeT50j+|sPR2u6mjGgRMKI0`|;*Tbdgr|`2B{#Uff@F%tQ#8@?1#2rKmqg!{cQ5d+ zP2PFr9fJxsR7O5R?~NNuBs++(L$FX%;x))p@PHAtQQ*1JC!uKK2p8em0_FzdXSUcteuL6QzLC8+gW%e^(PX@h%gzEFH{PU! zbH-yeM}*&zvsq4u;?;-P{D^cRQYQA9y=vCmK)q&_5ZL;#5ZC6lLRf3ov5oY^g@&Yf zoO&;n8LvN3r-(d!sF~8f!o8Ld8qB-ID-S$cfC1vR)dE8O)M5*}=rRP_eoAmr%B5|Kx zGLJIF@lLs5mT&Kt3nsd2lYUiV#D!xOrs4L@`c=81^GeF@85gEj_O9FS;3Bnmrt#sq zHw1}bl0YKio{VN#C6EX;P>E4rCABtJ%Z^-wh)`kFBOz4wG>1SEDqEn@r1rz1$+B_K zr2Re7JXG+UWL6_Qk%C*`m#OGS;oJxPga_`G>{&@SQP#`B=WWPWYPV-pSkmsB zq7R77!~o${*PVuj5|~s=L+a;eKqwam=83R9PmBGs+Hr7T-;wY|(He-PJw*;I74ftp zDRy8-s3e#N4l?E61&K6n*kNXZ^#P1c$2rMF45zi zv-6hxb-8t%bheK~rPF&PH{+F#o_dG*qK4$AZ*m6WJBTE{5f>XzK>X`TtsUr@(c_}f z%yp+2Pt^psho|(MEU&w#cF$r<^3{^W`w#ed6|O!n{-p%li!|j~H@z-6gulkj9#^-w z+jI4N;${kOd|5t}veHWAVqo48{9AYm`iO}=%?@3ZT(jGagEdvP!9$+T2-}|L{+Zni z1JgYBPwk%Rxu2`H3B*;ud?myJuR@ z6y5U~-IHpEaW0jl>vooh9W;qJS{gC^C2jj(hQnksp6fZLw?L*BtR*`l%4kz%Glo?( zt)3e3Kl=Ju#P6%qh+hZN%QpCi%;LI0k+}^Pnh1YCDiN950eYT_^wI`fa~}jhyEBNR z9X~B|EgK#^7Tvf*Gx@^R)7N?G<0RaI8Q&rITE-XY+mtCp>=vqp>Q=uM8GjE~sr_%0 z77i>KKRYSo|8XxhCN%_Nd(ky&8DH0^Wqe(u7VdS8TA6$|b@Sm}@?#46jmRl-i%OnW zATY+^iPF6Aq`=)a0@#^_qs+P(qGDZ!r=Sg>`IU05~cySx4w z_>uqGSp2wyZ2%NY;>Si)wUvn<-#C{0e)v&m#}AhsKP-es_ybn$Dg4+5(7=yH$}^(z zL&?3ykAJ4j*-I;eM>5mu_E-OzErVeqYJy;W^0Qh0;8|^npjqno?7!eyfnMQb@$9%F zXaOWfR7@u%g4!1}yWQ5iwEU^1Pp`2LNIvh;VU_gYLt%IL`>2_oWJ&rDtV0HtSi=kv9+;tIZ~ zzs~E)8}&Xb*|DeS*i`9Qp4HwPx&~>_>Uy%olIxZdjyk#@J^9vmhxl%0s-M4O96P$F zF73|a8;hPx(neSD>&Bz(n)t=+Jcfu?u%Ku0C5eU>A_kvU*SYoH*|qDA>2haW6B-6*nmyZzms`s7PB<#__MGP4Mwl_fpJN+$$lz@o^$+$32_-7J+xE1+5|DDSEmvTb;@Pq|cHysM5?DRMe;@AxFaI=!v6) zm7*5sw?aBh=^{sX6<`$*0!e|cRv$?N?dlp4+A+!`VZ1Lgb2d7b$kf@L8fhXf==yDZ zlVyF&cnV<)3uFRfCKkm^{EBVTl@I^gG=Avz_MvOnxtT`(=by7)-Tyasz5Ym&asVZZ zH9Xs8Td&TXao6i6R4u|OzVCY7_Gg7>JBLmX8YR>tZBEB1bf zKA|?9#$1-)Yjna<{7$^YTz(@gz1QTQUVcUDKctWI-A1dIF)>DIebTq*Ro&hDICXiX*{O~+~L-K5l_ z#BUgf5yQyVpyk2n>xjJJHp`$ThD|e+5+4WbRE6sL0`W;*fQKrCwOTDPZ<(9|W<)h` z%O_-;!(fc)Vy)aJjj+?ww}3^r=+j=SFx1TEekcX!9G z_Ql=*t8X8V`?_Nbys<0X!ygxT(9g)-M#r5Jfw-QET2uqIP=(eYJ&Sj5afjFJ%j-GM z3Q>5xfB5vA$APUUs`D5(-_;ba-=P{mtpmsL0isf`vA`Rz^WzJAST;3OtLALgTUBMm zf=ilwNAbRR^A0tSOF%7^M6dArjqAMB75~yJ@g+Od9%?e47+J#zW$-u4t43fK?enWg zT;k%uS&~fPne^GHxr>aL_o*#J<4_-RCTWtqE%EiQv~qIM3f(8B(VTs>C-t&a$#Khd?{)A9{%*Xpy`@5`&*Pq#egodJvcqaC~4WPYTNEeS@_?He&PxeOgU0I}r}X$-a~5VLIh{ex4#uk;yj%B|$i$xN^Ap|9+41!W z)O(hqFDTzQr_34XnAYv|V8oH<$95hJzHaPW_m^(J2QZ{&g!yF)HF_YC-1+=`#2puL8@Mb2ST6wgOkrZo4$`H%;tG*ITSd+rQ^Z`K(Y`{UYA(@pbeZH5&1nB6 zp`XWX{|)_iRQsdmb3FObc!TY@Q1~7{O*_<~p96zOoWiShNnh|L>Sl%ou;MXp9MQhw zg|SwfZ@lS*rDwV0d1hHWMf5D2o+2|O?}j*`){J{D4WFE(hzcLPC@=E3#48FVinv4{Kry^>N7vOGqjwR-! z_}BRZT_Zy}d7ulNnyUFDH4^1S8_mYNty9YF$8I%>sHc)`YJ4IRass(M&4d$p0mgiR z?iPu+o>bfqMsxlehwG;3d?S%=t@OMOm!LX=uf2^;Or$ojDr95af|h1r#8AdLsdAhe z^WqdM_jEW=iEwn|s5x0Vp-S>b9tenM6GReT8a*uKb`k!)gED($_vf9IE9N~LjZ{<& zA2mS@$V+gV<1)M)?NlenX^>Q=%9qoRbj6`*>ig#B?v_S4!Rr4$mS{7EGL-|s!<@fE zPufI|^7r89-Yk2;I24OK8H;Qis!`gtYRM~{nMpJqJVBO`Ab(_dSuFBMEYc^IGPL}s zGOO{L9Z7(vG8g=E@-dF>eOf+KE85xZ2mMsc_CNA#BeKotc#=7ue4Co|<;?k=;Y8uy zp(He{{&$V)MuamK6SkSmOo)0TFaI+zvd_Mb#|ux~u%1K3EY(8vQU?!i(GRp1qH|ZI zglMdy`250nZJ~OBNk$ZzfxAL*Zc${4xK_+BiRAS{4ICUM#Q*2)M9#J-JQ?PUL)2;P zlUl3N&ET;?yZS-0nbkCNBMu#SW*9B#8fpt0iP0d(V^Ijlb*{;ciw{PKX%66zq3)o? z=p#k+<`cNF+dL;q@tnAq<&9f=u%VpLg29UDP=(qDe@fvAx~rn6E9*1=&e^$?9&0)a z{d+@_5zQbY{c0zDFMhN5AW4WNrx<>yFd)K(Z~~3Q+eRNji4vZ$R9DF7OUukkZ1ezp z^|eF~9SKj9sLdeQOQwOD(l=yAYLZkIMa2YHNcX3)B=Uj~N6Nef!O>-isgMB|b3RSv zV~ihGnp^qfZ<5`o5Ch~44T%CelW+Egp_%&${w&f08C~f5o z)9A4y;fu-6ldCS2-nSJHRUdsfeGm^Dqj7^T=h>X$;Qy|fByTu>CAb3-Cf6LTFGnPxMgEYCjKhJojIfQ{3Nw@bu`m ztg>CCGv2&)Y0uU+fN8(8%`W55mx-Iq#5sd`pk1Z#%5$B?$(U32!(KZv@!OOaR(RRU z)7tk*Boq4`q*QxY@>|H1inLDD^EWwVl6i9KWS*t+T-_dE&s-PanAFM4fU8m6{Ia#~ zhw^+~BxD0Gk`gRSB*kutzu%c@`8#8Kw&hn5*5psfDEOa1+=pr_osr4niS5gZuP++P zE2o8_{3`idTUo~s2F@H(Foo2)S$Z$mrs0&mThy@bt!C6`qofXnLuU+M5G~wj`Ju73 zEP;_2&8SQ5ISbjQwg~W&N3|rjzBIPJe5h6n??ZWoy7i(GehB7E?KvWRWa<80R-`+4 zneMxiCS^rrd}vh;2?J$Ll2C4MVwWtUq1qDZ;!xhEnzVb@UJz;=MeZa-I***YQovi$VZPwHGUad6&9-!eOPJW98N{R$gMPGO$oDmdxq177IX2!RwiiBwL0fPro} zEqz*z3$3G9{hN5V@8)vekQoZZCl0lQry4noLE=*0)hLjhI{j;&UxphyL_P$sq0cWH z!*JC);kVA`bz<}pW%lpA@BRH7uTXuGjwU-Xn%+Jsh2}a*Moj{j+xvU^QY zrPFpYgfCMC5lESz$~W#6S1u;!PMI10Bc${`?Zkl5`7Z7UnXi9E@dGA`El9Y9La@#& zbj;meH-Xf^yNrW^nDI42R($-EY^o*M48Q|oRq{nes6}l%;=-qhuUi@i^Rv`XFQqPu zL9}BLM@*+@<@mGI>5;;Ji}O0|s2qpDtAh|zjtw^CYZ@{NNy&j2P z$k?JvEb!p7EFBQ2@GDVdGJ13Za`LAL6^kXKhj`U5$00ZKX*DmG>kPCRhmR7#S)?vu z&*SSVKCO<;AlC$;Uo9^9!B~SE(7L0xGc+?Ir(njC5YfOmm;sFUJR1}Umdojg^H9%x z&?7}l(lCsgnrYy7+j%zp8l_ZE0#NeY!wr(O0SX|=BPBPjU%dzi$k=hOFUSPsG7^*k znB}pMNN39dU`grT=4GqDenn?Jo+s&o7fP@|$f>SC zK_XXKU{h7}5%Hq^Ksdxf%6><90$&%XH3(jU2heq~tjzi9WUEU{jwM!PhQtB?y0m^#v@JG)j5 z1c*r72TZ()rm~fnlcrju_FEGgD-=1=eT-A8@qdpq$!m;LLm(GH_=9 zkHfD>>$3K!sW82|O3agXOX#*lDQ2uLwOop$*vm9A+4dfGxE=k$UcW?L=JWcuM*La5*4%+#Sagb)-3mLd=MxYGIf8*P(o z<;Nd~Y@0!!>=+R4ZvqD)+^>NCqRekmbLNO3=>{k|i9UE;fW@B?_ze=T3t5JYi>qZS zZ+{dO)n*Gr>CbZOU~$V36&T5kL46R8g|E9 zomzsF)XXf;a!FJk2)^?{POV)@!iC@IO;dyisU#c!$;phQ0CUL*=duyGN#0Ad`U{Mw z9@=yDM9%N|vA0;4%;Gr!51@ z3{oIp)+WD9&bEBnko+=rLT&~rKo@V5oGg9<7MjkxT0}D`dkynrW{(O$BI9c;9VK*9 z?Od28>IQG`ZEVFzl%OTZ%(Ze-*$eGEcq7vQfXoEI zM2Bm-{|OEe<%Q&Em-GQU_|mD)Z#$NFSoT=bF;;8Cb!n42=@~t<)KIOpU5f)%)KE&1 zB8o8IA@%w$T_nCqr?jxD%T`U&Kl53m#c~F|h@cVdV{AZ+zqt9wa$zqaTH5ysiLkr#q((j%pNt3BTB) zF0u<8`*!N#TMVPAPh9YA+Z2C?>QhrZDkMPmw|^-IAy9h>aSIZ5&PE^{Y5Z?G@9Qu5f6N0+%C=DtKO$_g~H^=YrP^8qVr3lZE`w9e$@8XleF4WA_d(_ z_HK^<=9MSebLTlR$jJIu8j7C^&&7PLwQ1t!xLK6Jx|)(AIg&FX`)Mif@h@oo$=y(bRGwydAxilYg{m? ztS{bB_Z3Nkkxx4RO;v1zwFPPil!om590<(<3MF<@+GMI%!xcF-PkO?;5Q{RU?__wX z9y2s0?u#k#?qp8V;FbNq_mtFlGK5{5KDI0oyCk+=x(T1=3y}~tw%)D0U&(P00(yL9 zD;R-ho`GBvZ}7tKXg=uz?$1N7(rR2RfB+_>Q%i(%LWyT}vX#_bi#p5fE3_g-PqcqB z_5*mu`US>mQbUVz5mkPI&Lst|bGSd7CTw*-lTr6GE$XqyH5{Tt&fw9=Z`!U~YWf5~ zl$>JQK&AaPzy{}%Nz!zteJENYHIwPSNhcdqo!WH` z52;IZSID~PZ5%Sw-w&CZT~v&MJ?b>GuVsB$7``G2X#mzUq*$bBp7lF3Fe|e^%CZWhdzP8fk&7a4Ohq(5Z#f}vWsoC3rVWZ*EHS3y>&o3qI7 z#RW9hRvl}r%hV@|#m44_An;}8zsbD)l%d_i-dZc3P#kmdtbpCv);~OHcL29m%)sMe)lLW&LN#=Vkprl^@UMfzB7g zrBt=S5q6)INZgW`On`u6 zm?@{s8QVsFytMO$>%y}R^y`WsGH$ci(`6`a1C8nOT{=-zq4 zfr!tF97H*NGo=}40chY~>Bx0#=s#!W#Em=8X!z7Igp*lh$m8Ivs>?k%?5cYPFr5#> z7nc*)9T4#;&?H(D#F`>C;DmVW^E@C~_)PKKcydK-s^@_nmq!n0cjT%+O>;O_L=Vc* zchAaYENg{P>s?XR=y{+|i}Rz(f0=EW^5RvxMlNGnz1IW36*;v&{mEKXeW_129{wV? zv@-8BhvOmdM=2NF%9j^&%a`=IP`v@1S%k)vm5yeNsV-GGfd{;y|8i7oAygQs6j9j6 z087*|Iox0fbsQ)&&q8DHH=5SR9gjYVz37+6w-=QNDbBBuzqOTB{G{wfM>#1=Q$sub z{IK?-dnUbyy{JI9UKHSGjJ-(r@3JD@!7=tC+lNU7{|VcRUU^g#Im=XGQ5DNxbQ4jK zAKqScJ2fBQUUW7)o6TON$5(5P&mr&!+L`*36ww-MFM6KU-`;7r7wPH{AvL@Z1f@px zReTHde#2I7Z*M$%(Nm9P?18Dxg^T0bix$w0l)Wgk0X-tiD5CdUyEyjA%(lj{{}iP0 zdwhMD-TpHH6oY)w8Bt1n7|V|hpE4=6smQV?#|0j&zw7LloeeZ>+eFMT4NE;><}X5y za;yJCz|+>9Iz(-;BglX1e|V~=Qmi|F)b`4h{pdEkm;F53E)}wBuW^OcoZst-Llb)W z%HsAtqJ{vI07#Km2C$KJ!*Qv<%DIbTmKKdu6R(%)=J(_tONjP&ah4KN4-$rwa(Bur zMNU&J#Kbg+9LhZv5a>>XI-`o;zj~+Ufy1CAnXxwNodX>HC#rC45#4caJzG^f% zi?^S;b#2})Cv`n`)06|xMRzz3?6!W;8OA(lW};*^qUt6mbkQe?(io-Tf>=t{6SsIy z_yDt?$8NP!Yz8iBmeyuoES-#a%N|22?aLE-sw-nOr(7(9iA>W%C~tp|ek+}JKPXxp z{dqX|L5Mq_s`cqI)*{jQNfND*sTIiVZnR zE#!E^ICq`wtO>%@huGdXL@tic%_%v4V~pUm`LP0Trd)HeJMXbm7nnENy+_;F$8NckpONd7OuE4)UPH?;yrvt z_$IYm#&xwYDgS$MHdT7MRsgE_x2YVUTK)Uv*#525-hHJ>oYZ!yk^wqhs1!;nZIu`0 zb)nT|*+?tY%?}?-XeYwa9~w`?N*(AICWstqmnHi5OiB&K*kL@O$1s&K-rn5XL*UTi!n4?JDWqQhRr69PP` zf|3!pRjTt>x>O=EO*a&A2j7jjg38nRU7pjgX(rCQrCE7=E05JorvRSt0 zOP37g2|-DHVYN*@B_c49X;|K(E%6)Ab@i=V+V$GHPjzZ!?iZ{+*>G;;l zN|?m!$khi%Ze=FCL~Z75qeWKJ%F1b5am>2deEX^~@GV&9ZJM*3_G)vZ3h*LlXxi_E z+q!1p!0xWsIcrn@5>)!WjYp3~kY+Jp&uxctk zclDutsm-b&0wlvX($r)V@guoX%_r66GzA*Y6bu=KhLSs9R>w)POH%j& z-pOMy*?dYPCN|2`vc8;mr)eC!MB|t|8;fDO+P(gve9+c0gexrn850(?py|7oEg;;? z4iXM=jt;xuE`VX~ewRiM3uMgQ?}F&z^zL^S2l1`+wL6wQd)i7zqw%JCntW0@gVUbj zIPO+55sB#MAE3S}*}&XFeT81=^SJc(#WtosC&bbln@OQIwm+TLPir!*`9I`bb7>+F z_f=+lg(T4ND!md1h8zGe!JSMQcQSS9J3YiyNxjmnl19QwT~7wHz0dP+KmQc}%+{WK zazU%-f%Vy*2ZkOb$tQ_VdjIQZKRf5Z@Xo_lRL%-xhUbC)6~#Lq>?4YGMb1vo0|fk3 z#jF4QD5BSAcYTYmqFb|j|7FFB6$f7Bv%_W#?&)14jR%JN59j9`HlFWI-sKYMXP(#i zQqES-11-+t-A4as`~H>Q=RBXYyMH))X}ojNGha?5lKE9U4~PM%|19>(4PVTyi*7qo z6$u#qE#G>0IV~SJ*2c_DA?ewJw^7G|L)@i3V`Yq<2iT6IeaE5)C#*T&bN_~A7iW7D zfv$!8K<=H5>f3-3i3rTh>phJs2YO|v9O#{;|DG;?iz!^kzXtv}va|S~{4pWOeqEa8 z7o&R@rj(f&ld1#Dt^NAB6`*~11x>D90hL<^I?PxBa_|TH&HLoW-JV>jY+2N zFr=mOTfyoXIcCi3Uj4f|jb7|>>R;dl+IP$3b zb2k4)T^;hMhF^7{T543sFhMgIty;FXXUU^?g4`*c?8W#0o$_dA1A0U@d9=db*3MsL zv^9=Ax+snB?=O!Y1?BQ&QL(uG9;wuZW$!7KLJCa(&1a4zTTZ&hY19E<-hD2$UN`RD z0B)Uty!xwg<<(n6UX`gfkXO&e@~r8>`}$KCwYyEiBu*9M_*2)dgE}z|JZmYSJ$;pP zKZF2w5ARwz&MfIxedc}EY?(j?Pe-{`Gu}mZ$+^g`;I*V9h^tFo0r3pcTqOW;sQ(2e zlJFWx&-aJaul-JFOa31DTU)94Nzu3OKJyQxZ+nD>ACJEE>DG&$m&)8nf($47SL4?)lT*W2ist`2&p;RQXD8r69_ z()7&U-gx@8fBi)Ujj_}86VtC{HlRmjqi1z?dX|;h*566bIt~g|Ir#U}GaFW&7(L5L zwLF@hJ@Fyv*`wpqv;QabOr~1s*%HjhCq~ac(!T6H>Dk&fW9eD>8{^Wm1^<(xX9DDZ z3O)O`znh+YM`%g@UGlfK@*aLt^z5na|3G@?h2|fZo^|Wii#GE!hMwvET~?$!IEJ3t zKK#J+?7p8LpPpU8)O~n*_8DqEVS1*=S8I;XA@Kje{MlwZf2OO0o@sbN&!k4xhHW{? zpV`|RkDh(^?!S|sWj3HkbUb=?er8*LCq4W5TSCwF{{8gKhE*p<&&pCQkEUne{>RcY znQEbD@yAY-o_(~v;yvlvT{n)UXUq4FOV6S|OVKj{@>qICq)lyxNYrS4F*bha&;Moh z|HSyYX&L<7kCOacBN2#eW}z@ySD)=I>l-ORJwGz7SCk_oZmkO&$?c_ZB9=$kVdS(% z(;V=Kv9obS43E;r2gS}Smpez!rmjd?qw$C?^N`5?yx{&Jw{`iD=cCBak052cd7~1q zBe6@4ccSXZo$8|tN9SdGv-q9NzdZh>>^-~BNqL<__XZZ&1#63K?Wx5HVa`DKBUJBK zfB7k4_Q>|IuzpMbE$6GF|NaT;`dJK9bW5TIg|+sHt_h{SpVHz|bBl6H>dvRt&;Oc8 zkoY1~wS8U6`lI*5?sUB50-Ly>^f!7gIQ-dru>t6yTpRDrY8K zduD#3lqZtb`q~e85c}bxL3{kqT^Y0|DUbR%wQ_f>&YiB-ij{_#s_)-*%qto;KkhHC z;DxtwM?~m3_dt2^+6e*2OqSQgsv(g7iPnSuWeM;mbQl6@|kIay>r1|z~ z^7$pq^ImzgKQ_^-h4Z94nHgPvvN2h{=Tzy-Tq9q=Lg#O!llqxFSt{pBPvThVD_qHA zrKvc5tn}4#tn>nXthD}S_BE+frLT6*J~@4=^woHPI^$O-&!DoMD((BVs8%bk^?AD9 z=0f*TA1(c7?uMA zv@g6EXH~hMD(6c31}~#@iCMa*#n;{F!_SC=cscxakxvbvxf{80!xyRCo38w*=<}xN zx~Ex{ogv3X`y!`Ebr$qe=SepRSv=S5#8j$Iwkr9Hj4A0xv&=UClgHgleNcH)c6HyW zu{e71-AssMb>7ELlM4>*7R;C|n4UfjdRY?B&E=EQF2YakEoc$XVYl{Qfqb}(3uT7I zb1ax^E#ZHGC*YMkI2iUDo?xB(#_4>*Fg)zIUqjl8gfVv@gwc~pJN4`mpG zRnxOfvQ*_Xe@%>uRk?<8HQ*@TE8hatvD84|w3=4tY^#=OjfV3ZOi9U z4OM*1gtBq7i&RI!8iyzPGy`cSsg8PHa3|d-+L}Gzz4}U&Fm5KrjcVJg2G6555_xmY z%bU(1!II!?bL3$jmCDFAkE+FLT1vO4X4tJ~PuEOMOtnPP`PAA9NOhP^P@Jv5bSzu9 zLuiZ39QREhWe_F$#BiGQbiNBaAlZNps?#$YZPq)4x)LZEuBDuAAHqZ<$Yz0C(8z+r zRUCNDdiIOm(q(*N_7~hY<#PHv=dnw_0m|BZDrG$<&qJpI+j;03jpaCW zeX6>gUOr$RhVHTsLmx;Ug`QH@N`LUwcUkA5AE&;FspHUfg&c;?6YDVaf#gx>$vVyb z$V4pNf5S_}8L7Us6)R+(hp1_3qgs83rU)zsLC_y+a*&zrMDQ6F==wlGi-}|SN(k-$ zMOLeEtQ$5Vawh8_U`!3-xPQ>|^?rHQ`54=TVNyl^#|Y*>B`79U9BEbYzd$eqrX%t z{wUiXvvDTk-D%@`7Mq;OM!hMpu1>%4>Xp;5R28k&u1dmYW#)^lT%marpFp@AwxeAg zehJ=WPdoZJo(OMJQGx`a{(DQVMc=}KaENTm*`Fo6UDHrQX(*Sy5Il%+xZP>dhjaAP zk&jeh{|b9zAJ@0Riij^(G~$hY-eumeb+PE$Aq~!WjnjCi;u`jEIpoUnr)7_6bOtA~ zQ#Z-h9KIp=1y>{=CiM!@Fx5H-t9+bf`v^8I!a} zY8Y~qciZC+((wxNT;dfR-?0k_7xW31rvDqts-)cTJKhQAQ*DouN9s>JN?D+O{cU?C z>CeS}MSR&WYy!z`8Aa`VmCsWA``VXmt7P0$K$2&GxK-ThnNZifRGur`~*cVr-Ba@9Z%l^@Ya&s zzmjjK8{49NE;9ne%hHuiT89`R*{4AOjU9D*82kCx`sf$bBqr0q@-)NJT*-j+sTs4a z;rE&J{L03YVbe;Uw<<2RK6EpiM8zAZ)IUY*^iRoV`C-@7vwv$R%|cmGLjYo*@o+cy zjp{58iZb*&d?i9^-8aqUQ@b`4`<{Fe`<|4GeQy(gRU2=O+EtXK8rYqXak(q8BVIc% zr0OAo(e-tbJ*~Dpq{_{DhHC4y1lv~K(%n{`gr(X*VLD+u9ukPzlZ)#0cRj(utpqW< z;$5pmyn#7qDht>MuVLCnH$W_DV1f9MN;)%tv@g&UGO`jojNN#c6*6NYFf_VCiCsha zFodLfm1BViI9Xr`(ZgJr0mMs9$2k3PXqy2X>y>;GDFLa1{wWv|83- zhNvzk=nhHjd|BV@+MT?}cmJRw$4|AJBzjj2T8LtvyTJ3$eB%w1^D zQk3#*-^iep3ykN6auyq4%oTyK{wcao|CBr_KhfI&;68ozO|D#mTG8)t1#~u`kIa6dsJaOIdweP006@mZQiF4%xI6Y_LtUb_;6l~=}!?!hls}v!; z6_`(!)B7Etw+b{7KH)44EE^e!B;??n!4Hx^0QjV=>`U8h%0b|5x@STV zMj{iJXdIIyaV;zTu_X?*VKWPTpRDt@!t2b5jkP&rZ4wzBYjefge6cqCNxQ$!BtZh5 ziCr=cK4b1~0v3hCjt=c^4>KdJaDv2-uFMhO5Sk1x-q@l_Zw6fsGK0i7nlvQ%ZpY~| z$^P^tFOmMVE$N-&$loBB#uQ^}bNdl?e4*(F`C^iU7MouX@ir?I#7a!B=Chh85ro$VN^ktph__vUPCi)&JG{Kp zo@J@?kp$9F9E=N6zy|2e@#_Qkpx|U&%ga+MYU5r-!=_w89`|`{Vx#i7w;Pc~M*a0h z^Qu@)37+Bbu=OrvvRF+ZR#U{Ojqw^49sI++SvZ-Hs#U!L?!-F+62Y(9Z*@9&W_0Xj znVl1#?@Wef&NA}BO5^Fot~jT;TG?wR7^Dw!@oHNK>m z?&hiqt;AfTp@`R)a-XN3n@vWEjvX$^IJ%`#IliU|RGcgV+tq1bqUI&bqkqn(XuhX& zI;b1%a5*AZ^Iq3xWZ_%eQ72zFmp7@cx9P9T`lQu(O~C5LP))T=y){1a-#HzLOu$)RJSe!T9$xA$$mfMa600VQWfMQ-A~yQ6KV^O z%ld}@f_6Pw@~2kGshK6e&g0&!D#wQ52gP1cQ{7(i|0a8XD}4pBDte)us_f}3cA76k zyp-pkvz|}m`Tm;aSw=^|)7b=AK?@EQsVU`L14&vKnHcR@OsK;}yo%Rs38^=)%Au7K zMl?CP*6mpRIi#SCv%d|LBFm&`WJp~YT%Gn&!#WaDWkr` z_y1J3f5 zQmd|o!6*&`AYR5+i$|?X)>5PBU%Yv5Q(~u8%Wognajp^nP)#BI(WAQ8D+_0)@pakF z0Z*fJOaMSnrp6-vc*L(h_R7(Ol&V)q#qpZGLOE)5M0X!sax-Y!7-~{~{#8B-6uMvU zkJl6q&jl3@)GT*Y$%ZNCD8vP~|NF`$3{SFP7;@mKly9(_1(yoJ zrQz3@OF9-_E}dGQUN7MVtaupJbCb*V%_A&q7WlRIXDsj+cx;lMY*0ixxz_BY-`>fS zTZTVJLo85t_);0#a@)|(6SOc_5z*!=zn#x${EX}rLF7*06-pM?Cswq#>!shT?r@-+ zs_6~If8~bM@WH9-TtC5>o5X`?d!srPow$$$Pv`fkB;LHGNgb_CBJ4z2%&frKW7o0z zk2DTWQirE$9Gqxh$FhjG3YF%B;G1&dHRUU!6`vISwbQs#v5ljts@unqzAgu|3$>AD z$TF)}tT$F2*Hj@d=ykrDOA{k2Wfne@i3z-Qk8Xy_Ax-tjMXFIv#_fGX<~Q26uSq3v zh&Sq8K##=aXeiXIUuq=G2MP6BFEksb+FX6Q^#@TJSesG}V&J(wdQ(d8u4Rv9?n~?} z<+9^uA11EMw&T7j;djXlQ>2%&Hg-?fbMhj&KQ_iX>R_4V0T+h?D)MC(T&n1E6Qst78IEo~<*+V}-Q(f$9<+`AtM!D`^X_Qkiix)=b|h862`QWw6oD}Pds8%8wiVHu*D|- zVwXGEya`!iBatm|C59}kCi)+uYH_xSr6_G;85T^c##MGO7$+EgB3A3as{V-x<}C#6O0=z*)!a`p)MlDx(OXRPL7Bn z#qpcx84J3t)I>(EnXS)C#}uqHo{6;+yN6s$9l||j|Gy9>#B8o^mg%g;*n8T>c8O>g zkKEN)^C0pnVyvj(HuYqP!rMZ|tH4QowG%!{mc7J^kG4Ok#o>GE)kB>baaigJ4yh-$ z-~n}WRvmfjjpH@(MxstvvDB^$I;7gaW%&yo7D%GQ+8K97|2)2 zMf{%gaLmpXm2K8sdn;T!O?fxLMn2tWLR=+^EAxK4y8Kc--$#-DEwJ1}c#I#e1CXhb z!L4SinZRwG+!+ODa^Pc{r`ov;M7D;%-uY5ws=AJ=vhKiA2!r|}zoV;sPGgn#hS6-a zBt{vziT&(U1dW>gk{)W~XGMSypUj(6)VW!2ewN=x`(xyDNObbf>qtqR6XBc6lU2x( zE|d-3n+C65tf6}q=w9U#=-eHD0O3-N9N1M`kxg#z6qV%#)6mR##So#nG*wCr9 z5MYuvycE;@j@>F9j@^2n{=8p*3PFzD`k?-Nn9sF8?2_N)3~U?SIvazr*!-|G4L#R5 zo}&*~1Pg;rSW0Kx)em_GE9!Lfyiid{y~89C$@htFsqKdnc_TJ8Ml57PEa+StyjSN4 zV(Id!vzckpO-}Aq=c##NxEH@1n9O{E4?dMyNP@#wWX;zo`A$;<0loqme2pA`ie307 zRW^=M!s4a_L;KnYj#~OL`!fxFRX%2qEp~-Bxb_N%dhe%*R&1!yg+jYpP7b!d+9k4* zVhfkX=dK9J{am%^0<;r>HofmQEIJkQ1v=vJuXXqhho8{oCsN1o@jv*_B9=VV8JuIAA8j zC-Zo^F`5E-(G7m?Z!z~?`pm=INPN9EJLSk*==Y%ys^5JMZy)*^YsV7kfE|oO!ZNn$ zJwLh4t{12%X4$3o^FCp`Nr{-AWfaG|!#t$T_%>w4Qyj7n;7KorA|saoA1moy>s5TT z*@EhgM@EaM@Jt6=Sn*ZFOa`POA)7&-PmmYA$QGHzg-b4&{4P4+v#Vu4M0y@FmS+5# zj44}-u)z1u=B)8@W;ttE2Y81JRCdHipN!UJv`Xt<_(9T)`F)~HQ=mP@rl!D@4#h|3 zh7xR(9)B_8VvGY|nuH9KpATD-q4v0JD>8>(G&J8zSb^*_#LSqiFrJycH7_&S*=!*6 zV3*#=)CiMcPpjKswuSwO3C9FlUd|%ftFf5I&d1lVM*I+u(a#a$LwYb^IMvVv!W5sQ>6p}*N*0zb}Hndxf9O?iJSeyH|8K*hd((_({0`w1{SWQe+jMd*{Gz|XypD41?{6_L=&@WE_cx`l)8&_C z%9r$?mws-(pFiZfxc}fEQ+tBx_H#4u`};pLqFeMZh{ccI#u()BLM$XYWhsV8&60ov#_PjR(A!ype@3-%$QpYyrH)KVt;6#UJ+X zr-9gg{+BJJwVOyQX~ zPVNyNOoSO(9F=r$+tkgcYL4n3l8PkbNCPX7L6i2SlE06!7H5Pf7^^>Re1U$X)?b&b zzq;@zTz@@3N~8GGuD{13pJ@Gc|1Ye+pMUTFF=)+#N8$tdE^g$NXe+7NGa_avoePDe5 zJT=RhiSJhy{kI$0p#vGZnmXeb!kD$F(KsVaRZTc~@L#flk6dPn*42{FlY6>0 z86+sh-E3N*wMWwh5uB$MmUS<A57d#U=JngBVB;6`hkDQNHm;@~iK@L&UB{^1E zseW?qM@h;5Yv#|5E%LI>y>^j98Q<3jVM|Pt1BU`uUuUjw$?H>^Lb!HyDWPA$+uD<6 zMi>XPr)Me|0}iIaM;;T}gGZQ}0;-^iI@{!QnI3AgoVsVGnr*s5%4N0LYheh^pK6)N zk;Pe)lJ*CCv)XqJa~Vo0>~ELt}+8$%4-{gdU~cZ<&@w0v(kVn{Lb3fNx3hHQjVw7LVg0<^WBb z)Q3Qi4;8={*-d<@M>l>b@>`MA#i0WSq|M7VtgL4yk{stKWj3*hKW%ceEI-@mCZFYl z2L00cEOFx%xVLiDi0F3LAT3vkxn&5*Y!#~m04!G96qyu%uX~~gu3;SS&i0_JGpRPt zUW=iG(7$(6^l!k3EH!GD;AdJ>sZlo9GY!IBQxSb_FnZYI?z|fL0FozSgVE%f*5umo zes1T^<#~!U#P}T(F1Ec|y}JP{u}wt?@M*QK4THI)*r3QbDKeM5a?W^Ux=IG%0dvG< zCpTmmBFn1>=IJdAIn*)1s4u}MGhR~-dZmmJk=Xv9X7aRG^o`Pv7^eM715`7EjtTIf z?^F4h<3uEW(=~NLb)+ptgN7N-7qdJ3L@N)Ux<*C;|H3)N+SNC?9jAxq)Z-ks;X4#> zw3%B%4{Tve_dYp&Q)3JE)z}J&4y(?IaiA{pfI16g=!fF{a3VKN|2=Cw%m2H_bMXzC z@$`3(IGz_uk@R?;b-_{N`Eq^sc>4d3j%Uf2KW04NY&rILzJb6uWISK)8(}=JW;a>J za}mf$kLMh2V*fS0?$R`k4e9)@T=vj=n#?C`Q%q^|G`D%0RO6C7MEK8LFJ^SFY`u=^ zvGTVc_f{4OJm&uR0z64xW{ceTAQn;TYErwhQ@*-=A0A-$%3>Z%l-=B(c>8|U^eD#8 zL6(bMeNc!Mbk2TGYgYZzoC16Cd>jkmqqGq|zBukW-n~AA`Ptc9^BnX2xxIz{rciEA zkaO)=h<{7w=G8OEQNaF{gH|l*Dsi^BGRY~c+|8WHjBa*BZz|?ICO^o{p#Fsj5?0Bs z`QMg(m<3L@ojEPlsB)hnuh1l38oM#`4v4v)cj9wi4)LB4Vl{yd;t@M^g|aAJpgsN1 zv>*LpAPaw)6q3X2qk_ME7XA*XQ%F#&@wb0C{*;>ZNE&~?JwfoNz@PmWA13!`uh5)f z_ycz!t+!^kO)!ZAf`z}`;O}O7Vd3wofSf>-Hh|J8&%goy|M(Is4N1+i~*9 z_#0yJHu3i#e+T~lP?Uwgf6AVJO6>v^YyRDQd5o5(yh8jp#&L%#-dHT$67=FIy(T^niU zfjJXj-}pQ5^&eA@jjx{qw1uzBrlj!ooqzju_zD5_r^nX^4`=X|^Sw`ouRh+%#@CnV z+Q;InJ{w=hqHisj`ZbAzz(H)7Q8v|n68Q^Eea<9w>$4}?e)UyG&O+RA?EaX9ZvM}> zsV7u)Ee=A)f+O&V#(Ucc`3*$a4p7C!xiZ2ON4>b`g9C!3Jx@lN)H+$CO4Bd`vq z&BWK+fBhu<0ylj4?MtXycrK{7aeu;nVa9@e?v9PfpB$8d-S!H*{R_=o=(=aV_^1fG z-N_cS_UMSaN{uQX^7Acuu>}Vbj=ETl&Wvb$-m~VlZfc4it_*+8IzKI5G7Gp@zTm*B zFVF;RdiFWRamP9C^+Brfm;1se8CBEEeXAxXp@DwG9-p5Rn_?_bEisRK{l)}4!}a>8 z5NUh(pOdoqw*)pvoWB+BLr0Qx4kYfzlNTwVzF7OBr<>8QY^Rkd48M?O_+I5rwX-58 zR{lvFk#77W?a>YQx8gFnv`gFU(qi}ed8MVfy=GTVFuU@1H6i`D>tltGq6afGY47)C zCgBpiKqU}mw1o(VkxE9ej}x{6;do&w+pxZ9*`#NPZ1ViSGr<~Pu1|4@2!3p6+{0y) z9 zvD(t|g~bs!iII@88aSq-DgnyqV-pumHcR=GL!OrQsr74LCcpEL%^qtz`?jn6MdCoUmUE-ulxEq&%qvhB(F=R%)y=<5$kde_Bg|QI}i3aEZbD*`RL?l{EF`>!hwNmudy#V71?6507qEFI{CR z6y_<&w79voDSrJCyZ{H^>HT>H$lgHIZpD+aHc@Dq6(; z|CME1)ob%9hZ2!GR7ZcJ`@7d1coB92st7TzhO!aL_hLB>gU%jImRx?I`Q^xrDOwmo0Emf3#FvHQ!X%Q7zR9c6 zzA?L>reymod-vd*QfAw`Cp>n~zQm}#yAyu}G$5)x4UASD+)xxA%~jPjt}Z#a!4r1$ z+D@(PwVlb|=lGkw<~8YIC0R7+UBvOLmc$f(bBo{qkQm2r552x~Lwxq=YuDmu&Vc}o zHZUD*_o6J-GfML$-_qi?CH1On0i!aSfmRXS+RKoWUG3AbsiOP7uuifmh1R5Rw`)COJavg(T zq4LmOjKS>ORNq_7ic8%QeHB3K*d8gxEOoKYgI;ayR-+*a_$+mH-#8l2<7M#vnGS-! z9eU-2gNJs3g343hQR66sU2F_2GRHiZi&4Fm1zb7jqonrbiQS`fV!}n{nW0 zyBsQTjkeZ@{fil{pd7#TM>jgfb+07YKm*0S9sYaiNsiz;C|L|jOEKrpTI^I2elQU;StyfZL46{EzYSZO-PlYa59z;tL00Ap=^%6?^)&muqCU@Z*h0bvoo6d z4iAwP-QT)|JIxYFYM!b@0LDA{1O`K@X)9$ou%CRuP~78xkUNPBXk`+Q<-&SAmd9l; z;q7b|Nxv%-sd(B`R54F|zmmNQT^sL@HhR=9B84ZWF}tLlY43&NwRUxbF4UlNPt8-; zaK-QonUH@t>@DeHhKrkqG%o+jJN&EpqIWzjXJlwG$Q7U37#&ov3Q`9&#+?a+oNm+V%nZ{lXLy4`MDWv}6_id!Pv+19wmL+es8pN#in zKoGFyU+fM&UdH=$ML@MsL#c|~4Y}56T)f(xd|>m9W2SA^>1T@)a^Sj1s$l6A z8JBoY(}L+>rMqJbH!rj?D&ZLn?Na?(lEtK3yx}i+S#HKLOut4mK+9l?=sI{@F59yWJg! zcs#W7X-|bJjX{ZcQ4*h(l-W~FcV~y{jo+#D0;#m~oV=#n*)6{?ZwdSwuDT#-lEq`Z zqs|`&7yYiVVADRs0KwMsI^Apc`T<^)J_lvV&Zw82ew%tX)uhI4x@%UGF5Tn|X|mgF za+5Bf`&X*|tc5%C3#fGwU4=9wOIziAK{&idh4|=OuuOXj6r`b%(TX=G1?d%nkGc@3 zcwh{rWz01y*v4Jw*Qnq)1{HdV6k>t|?q-BQMTs6{%IkiBuzCJE8a{Z5M_v_pvZnJR zE8y^vyhm2@1)2>O1{E^qAf|#}8`PZ9H1CvddjCc@t!`L7)6^i;Y}JD+5?y&s*Y)wE zs!=RZ(v^RZuFDow9c1zWxo1v8x|2e3B}v_w!Md-IpR$*lV_)#8VqSbghzBJJVs;J5 z8=w(E)l#p;tTa)-%D)&HAXxsee>H`5iiag3RcV&On|+;s9rrWx+kz_@qNNBqM=sB^ zt=ZJU!=C>Z`36y8BoXHqG`Kf!vq&>r_V$ZlQtdYG;^v+=O?jj$GIr0FUQ_Hz zXUj<9Pd?&LVOsEc`|lBa7FvQ&(=i2~oIU#h<&(%eLuDN&vd)PJOzZy>^3LXYP@lgc z@0=sC<&KhfPKITR{F;(?^!N^vHz_0MaKOhS!m`moS~%oou8R;BJRCgcKs!fKpRBV4 zXLV8;87^4_C2f`Usw@puG0Q2)GWQ3O?(3DDTVZCc%o3yjNmPj}FwzRr-vv)~3Z8GB zlLgOD8d69a2G9JX;TiLvgGVxBYWxJBtTbUMR5=f>4;OUEvnYo5jKfS!ZjFdJ z9!SO8pGj+(gb&Hgmb$e5rVpf~LM1Qo9-8T~Rnj>^?Qseqah<@AloZ;E)F=~#ZGGcr$)p|ZOs;YU4&UgQc39j!Stv%tx8@I8UqfiI2%V$yZvbrMybnz0j&DJ@$u`UAFS|Td;w?nLauw zB1bU?LRp`E>SSu=ScI+w;y%yM8vG)2N5Jf%nZ+5(E`+@f!hWi#6It4;w(l%{G(ECw z4hXr;9?=fJoFB5hWFOXoqBcAc;>g|cA3Q2Q$=&&He7AYjTbEJ$AkCx3c+ojTu*H@T zf^~`@!|3?b?C*XE#ULmSdWFbb_8^028fUKm_J_&ea-uAiDzI;qSL`x*GpN;UIX24~ zYjz3BEwMR=(y@!MFoh?8v+2=4ei%ZF@T%WX6&9$l7vz+R7tcI@VZEvaKA_W9DJY}v zSPYrdX1jto$!j*<$FKB8tTq3c`D?RhK8Gi)xvvSFi5NZ6eCnzS9c!vYYK&eOwof3k z*oljYwgpVC$QinnSDi;G>uJREqa_0#PvuYK^C$8Gz3`|CN*L$Lr7*_QXBDDKyD{eNbFpJSM36SP3o+2jW6EtGDsz&q^f%Z z6csC3+5t-Jbr~1pDDh^?-hfy!t&7T+;0$)_L!g5zLK-;55`qy1AEevdA_o=)Q3`zo zjTMuNCW`n#74uiBKD?NQX8WsQC4t|CYmF=XK09or z)BcK&*YxmNE$Hx{(ek(!#*2cc;2sd{i6yB*zu=O>Gv_3}$=#5d}>8$q~Nw1d&P>dqhfw!3;_6q>?Fp^FM%u}*+zve z)Paxb#zvf^G(DfbdIlB>9dkDO9ySVMW7&)s&2m@yr{9)~(^%Lzgi1e~2-f^YtG`5R z^*&RpKX=-|w2w&O9E?|-iL=(cGwn!KwZ!A?@Qakrxc82-t-e_l{h7DrqUS%VYXm>w zsn}RbC_D7^L+I;=5>9!P_zNtyGD}PU3DuZd`dPfPlHRP){0omA)?JvB`gk^LomCoS zW}t$toErB(7`t&+bZ zjF|?OklCf?zDxA*sXdgZa##g%F@@a|5#@v$P5MxhvXZt-KsBysz(`-bM4l7+^^?h~ zS@K~;NNK@GT0VS0Ix|#uUP#+%CQkb-xtz?A09;zc1zi9eLS$d}b4{6Cw|COrSxH(qu;A-cezvX{nxBWfaw?Drlv*}j<&?noz zUCuk%+qaYH+Q{3tvcFcB$sZCuP?@1m6+>N{v&mCkr783r+>jIbvJv!`A0NKjIL@f6 z2t2(k$9USP^cv*u-Ep{V=i?%rhD6j6E+!_;7ASV1dU!m$zgPL^bKLhjAKuMv?8wa` zr+F`S+7$`Y#o6ip#^bU&peFr4=f}Yfj>xq}T~Yaz@Iqs>!T#-WaU{f`$H@8k#%9r& z5K57WM{00Xs=*tA(paKOLybrB5=_t>2^Wwh4D5U%bi*nT*$tRCy{=&yF7 zRU@nzbHP-wV15QWk8Ya1aftH)JSx;I2Zj%e6zHTeo4QgMWM4XAEaUay>Ai_hy1d3qg$HrdAMCAF=RSOT~M2o!;*VspXicTdy(U zAFbgJFW174I%g>CxvGk|ihEcqh=F?wQL(Pyt?4%YH1q7v+|8^10PGtN?LMLV(Du#^ z?#|C08w^?hL%|qe8=-Zn3C1@rG|~87L8Dd#{`IvXXmqHb{u0@O7%HTTCX+rrjLca{Q z=u*IeRBj&%Wu6KOlsc?JQBXxc4qM?1EI5Av`xp-A6%0grmLkD%Vt@v{gfr}K6zFB* z9zE0()6l1edfin(zt)8QBn^G|BE3-V0?ySlY+a71SYNyD`4-mKXVrI~8n!?LON6bH zxX{F{dl5)m)j_@NwxeXQ>;k&Bf1p+on}=xm;?XISBDJzD78S&qNE0Xv7mJ1rQ`0*6}mL?zz%+A_`qJz?m+9i zCIq=A1YvVfONK(=RL?w+HK@PbMI+*xIPwxeVmQ|DgwrsjhUX1T@~t-L9CYlK3p7G4 zEZqOf5G;&V|9YObvJ{3|45zy7Gs|xUhrUs8*zclLB~aOhr;HCsR=`-%4Q>`$4@LrvWrB_u)oIP>aISfd&kl6bc`}XKIlg&eqv%P$11bHa8%^aQJ_` zQDY0#x>n{xHa&?6QvYNWh(bgnAGZjF4S^KBJ6r8eoz}_V%ljk2MuTyppaR^@ahf&& zjXTuaLUoB~u>%HY^Z=j-Y`s+pLLkHhke`cI@4mBJ4iSP3OO@AOT_Txe8L7aagDf|o z{Va*r#rc%Ej*z;FDHh%2DBIarYsxAlLgQakON;|#7n={o8%Nv!p2_wf$}(pOw7nz-simZRY z;6%?{K_Ii)eupu-*;wJdVX|n0IOM30FvpbbWCQn}jkj%F)PpFhZ~tZJ?NnXzjXe5f z#`$wZe=GE5qHbMSSVRth^BE4%CA;I=$l1BY-66_sSvPWIl{q$5dTd%S;)sFhE1VEY zv|cCzYS<_I5hpesjLbZKW(H+pOgheEOe|w-kyJ01Q>?A0j3lD=SVHP}sT}huhjRP! z1wd`e8|uO}bixszsEO%Hae;_v80vjtLL}TYu>wBSq_liKV!S2dCcZ@#E{-u4@$FOh zGxO25F~eKN^y(t*EbQ%~(3SeFgsUy=z0vJ<6dS5Ly zXF`Cc_*PNC1d(p26kg!LoiJb51eqnt<1qD|I%xjjQ) zj?%ZYPv_3FM)Q5>^IKXEn`G>kaQqF%X7%{lnrTiJ-$_rj&(R$16$>vMxnG1p+4)ND zXr28wQ+l(yjKanMN0PTOD`s2Ak?Ytmo)Q1D{Wg2m1w9-`{#{6pBUfmDAP{;L-chub zs=`SXPs*FdW_B~QBG3DU@$2okO{luy_q7S% z)&9wB(3ff*8HxU>bM&;yu8_yGc`S|^>Zj)8+jxtGFfXMiT4pEFqQ6)w6=Y`^GVMPT zvP~MtjJLN(n>STIu@&$t* zrEp$jW5ErxNoRKO=yYZv6bfFfb4qC%Md;eX-ARJ24dp$ECLLxY(Io1xiVDR-70g`x^NdeSxLv9A>L; z@)1gsJZA3B*JQGY^se)l%^`o;>aY83ktu7h@U8uVhz*xIdaEETl2NSxJ_<`_GtBaD zDJP}_B5bam?}JRS+ah$Ge(nxhBt|U8|u4g-CN2-SuX>1^w z>B&}qeTrl~Oy@{z_DO=Yk4sLbyIAXRcW~}J33{N40;xFTxk1?9$VvwNlI?56N7*`E zt_jJ5b{0l)@~_*Fka*}50B;>GktnH zL=p=*0tbL9 z+gX?SNU=$v3ITKa@JfjaDNsDC#^~3=*HVq-La6}DUW8{6wteac;`4-YRM^N1>ea&< z&ll+Qyux5U2v3sgx2fkvxyr@@JN@)VJ%0543SgzK@9Da%{T8cfAeNSmi5dplhv^k@ zr%>fN(Rjnqb7q#>93!L(K*1$t8cb(Cs%jIonOs+J)KnA)pqnDNAxT`Lnm!zm)Cg`< zQ-(icfP~dxT6$Bk=3&PS0d!HU#<9@M^eE$O2@J?PYqQTg!2MJH@!G$lBqj1NhboL$ zaC`g$iW5OU-as7qcf=AReB)pu$cCCb0!bFgUEC%Cr7t{QB!X?Kl{c8)vvCpy1+Yk+ ztU$fC1_ui{ML~9S4xG!B=c2NnHfm+k&oJgYC@j&=#R{P#&_jbcoDY>J1yr#*OBz}v z%H3)FiqDkXc_rCwEV{`r%H73@Jyv(OLYY?I1W7tBexDzjXfrlgcf#*!Ny6lBukB8| zD98qE3M0ezH!S`(nn)s_h`(9PEjKpH6<_X&&$NVGwR<%};NRwNhd!6#Z>u@spu5EQ z{g?8$b#D*nZk*Ag=Aa=_$Q_O-0{$Y+@UspPutV+_*n%I(Bx>=EZ|k)PTgv5$l8*~xXAgbbgP zmgZkX<|DtZY|HxL5fBm|IYc1ASp395#Rlm}*>PFg9!1(`A?`zS?6#jNyR?2;;69V5 z&C23w!Xsgoe=E;!YW@CAewG-{D2DU1_s_EU8I(4#4V($9@dQFHcU(5GEVg*x@M>UU z6E%)DhR3PjNF73{shm2_6d?hTC*+dK0v>mKjPS7SLb*ZQ{NZ)MyNt=@A=j!!7Nd|Y zW1kv8rA8~@C(qhvSZqMJlvh~5gyGd#JnHap`fmY7CGPkdp>Y$XdZtZQYbIOz8a`h_ zlQmm9I|^H(AZ%%D8Y%5F`H3qC!lmX&Cs1N~Ncy!|tsdU6W>#>`FAaYn%nF@_ZG;Lv z^ox*>kdhYaflo;udWaE1kw|gffy|4}4}Dvl&7b^3+0%53Jqi9v(G7@-+~sK9hV5>A zg5JK}sB+yM*mcX;m5xAPDrI-SLCS8eKL(6t8MgJ>8BF{)!za?iYQugvwz3+R@$}t+ zr`_LP4Hl_kVAn@DUbGfW%AV@N!ddxUr?}r?33z0bVu+D_f-!GC3gX{6uc4yYLK-&7fsZ z@V86khTc~Iy@c}B8>27W1i?m^AHn`eM6o==DEIbQDKvD9u>muM#?p&zDKRER9=4|J zvz`=vBxUqVm2rj9?&G|fm+^(M|TAY>G)sar@YTCUd`g5LYp(!|xCeH+1Lg6)k zH}}t$C#J{()z@+%t5ZUl=)&(|j_jdnxrq3%KcmqFoRRTVU~Fdw=|Tx^>It9M{~3&pxUi?ew_!*s(@ z6J%lim#W~e3UU2A6!35EIktdu^KqYCK)IZ<|HlLr#O0J!g8n^APe4mLIhDDTl1|*; z-5~Nv#};&NHcpuGdZzyI<3*E;i;p3i;8^juM3e6c_Z%*oEIUdxnf>>RCVJBU=jD?x zoX*4*q2(y~B>IWvlSxv?$H*tqPbQz-I8;6f3R_RfC(HgzEl}lJwhR{Q*>QQAL6hSaiT;85hVYQ3MlJqH5| zMH=`yzvDAS4oL^cv=}+T=*~-|Z;1*3I_!9|!ouu(Fy#wlrsr}*sn7EMX@*Ut6%suQix9KLOpk+Y1mM|2Hw&*^ zC;+wQRoYgoe>u-)yK-Td{Fa+$y73geayHrQf#mK6Bh=?Xu${IMzybryb1>&^`ejSVUBL+95HmJ@1+@6UCe$4m|3ph06jJEr7-JOpzct+1O^0#dPgO576JoE?m z?HjB;ibH$GZVsu=vF7GUt`=m)5xnJK6kgTh!(~XH(Ge9L>_+^um?;^e=rGUq#e6m3wzO^ zjPM~jNdFwI2|L&--)}_5n3Pu{srJj=E;TH@rsNK`VI)kpkm$M223C2K=wtb1FVW5&Jp_h02{Y5=$axq(0?iJLMnPww z*@*$F(iNEHikuWZY=x|gK0FG_gK*@-NsyRv{zEs|Dr30X?*2E-4N}I z1}|~9*qy#I1HwYh@uW;7{R_8?I9jp?le25cdFmbtcDS+6@m|3mcZFe2!o~q@M@uiMyrCcWOy?+zcYyVSZ5bT*OVtIgFM zD^)q4&6Dg)Np}4$4%$g}`PZqLCd;;zU+#;|QSNX3NNz;-8|3O9Ykb}-xypkLvItf# z@2kzg+PP(%>)@1SwAX{dq_~NbvUS|F)+AfbcF3+*L{DDi zaIKyZ4r83tJV{yr-S4vXX_t?RdEsJ_;5`5+2V!vHzqG3;N z7m6%l@-dwI)&1;1OE%QHx&r1+i4`jz?rXJZg=?>NeIi zgc>(H6DJuBdRGGz)M3oJHC|(dGY(JgF{k_LTi8ul<^ToDiN)(gH7}npo+~RHiLvD; z5q9dLL@pYQ-1kLJm(o>2A6`ufa`4z0GZ_p|I z+9*<4R5=q781n+oU?AIgX;5xm4UUbmF=t?=GlD~LVu}W8sRWimc+n6qeeu|?x$RDfp?*`s=EeKz&TCh#gshH0i= zVMuKeCnjpX@ypQPkpjbx8&AEsBq>sCSZ~}`>swppTf0y^J#g zFWX$~U$MVln$Dg)T3sxn4b%}QK0hb*#4mg~^9@nc5!j5Y&eY8Fl1Pngg@hcEHFGlC zeAE?V<9e3lOlLT4F|m%vD#gDHY64xs?VJO%9@7)ZxzTI-vva&ZA774QYTt02**dC^ zKd{7K5-x;37pc$viG42FSMmj$)i|-T0%4-hxL7KU%~-S$r!CpylPXjG>V|lQ>I@UX zP`#L_psKyfCj50SDObjg(P9P8A+^3(Z6RAsX@Lhy()z=+@gmzf*O}IRd=LPS^ih3F zYRnI+$3~ml1FA$ye!~OY1^EgE)z2uDaxWHr=2sbEbO@EQ{L?Whi4ThxdP!35B9K2~ zszplJ8J$lzi=c1V3zo}f+^0x8A<)o=By#I9pkb<{UEd{*sPx>F!Udn1{$>+p3!f=m zGMeJdSSW(i;lNyH_-xve#2V=hEoi{8n=cennJa^Nvm>yoh_@xH>*d*R9}AVb)m6d= zJkrZ!w~-#(Mbbl4^TEY_^$MRYJT}-%*xY2nb~s{sGJ%3FXrA!Blujbv6!GPbzEMgH zlc-5Hb%hMH81mdf^*+3krEO(4(zX_s{eJ5%nh*alN4V^LwOVoB4u3%Wo?s^iwT)?YB&=y<9lz)L(?N1t6Ir;5Q)6*BKESry@jhBbUow0?`m%fdq!w(dej*A*H{`TLFFHNqsbuSZ?4zfH zTJtV4c}}43hUe%{OU%Bor)($R6U-`QwSU)K?Is-AgH0bXs~O|l9F@V4`pFa-7qqlU z9=1`m_9kbW;}SNTYaR7L)tP!4{)0^UT4&rPLNGHS7Y3@Oq2t)vt##;2vB|R2o2+%3 z6DqBCoBCO0W{JrLQHrb#)6cL+lAqk&aV~SRe1XT^QNoX4Y{C9y!99#ryxN8=8LQd- zsE{6QuoS!Nf+MEA^7(@ZWBPzb`+>yRu9Myt#iRWIf@zHhZA9J)#@hE;b%mua^t((| zk(UX!jT)D0R(GpZx0~6^AeH5UuH#L0=u}#sM)Qf5y1{7 zI`c@Bp-|p%@NTMaYEX84XP4Z;8oQ}DUZY4M?#WPc}KrYxcW;FoM$M;_=a@fg#y9w0+Z;v7cobs~i^lzyXGB@TZAdBC__z z@cC@>lf4S+7n0*Ta;5zj0rZzl(D$zP2EeXg=|V5Jvu$zR#JYdMsS>BXlNki&Tw8o33Rp9AgDf% zoli?Akujzl#b-~_)gmiGo*vN?;x);yL=2xB$Fw#x7%HD4Iw!%6go#GYW6Af#n;fx8 zB&HimK#~RbGF3afSB*JMv_YaBjar>uBszFadtR49h1V^yv<|&yF4R<$n4=P-Q0u}o zQR`}*(A~VUoy2j+2SnCyof92$EzitawR5wpsqA3+a_6c-Ondtfs67XEIbz-FEGoABi-fD-!*dU zXzIy$&d3;FMz)u~Ro0ESzc{B3wQy4*qwJFNPKD;O6zc0IunfCFGSWvC-?~+1qLX0K zs!N+*MDca>f0Ia%)-V|P@!2!%fz4(V`@pmAZwb{3%yq1+(B~5&SQpaGi*LC;w>z*I z^tZnO-?qpAL-2(gWZaiGh^F2OmcidFF_Vn%+_Lf_UJh(-Ki}9sZAW1HEoU_t3!#da zX%lpEiu<6nji|k^#&C9QrY?CuSppvQh0{kv40{ z2{z2SFQUekis|SsCMgm7J8tK@xlhbNaCRY)x!s7Qeyv}yiaPwOc~XvrBQk*rC6h** zUiugC-fc`x6!mr+eh5>+q8J*AI1ezHzez3Squd>@L47%tG1czwe2024M;F;5^O;<& zb+=&#P)}=+wWXEUqDfMlFkvgJ$#Nu$N-5Bl0B;Fxo506%GhinqY@gYm z(YBnd{$M*uJrKKD)*E?xlZmyvBE=4@<5Y{Ww0J*o(3_>Kg*4Gb{)6k~Eb4KuceWtf zPHi&I73f<6&xA3*?=o*k1{Sg-M5r(Qm42BYqC7c;D7Zk01INtPskR)GP7&~!o@p=l zWPwvt<;YZ7$l-A;ZZ9`1NzLVtjqfwXGxHE&Rs#p~3Rx!h$b#rN{i937+LoVGbMp~r zrOoyzq26s>6Zq%@6B9i1I;b|Uj$c83wZz8F=4W4Ckk8rrM!`INV?LjCa^ojg@e3*N zLZRFQTyni9)nHhCftfzGHu{m{hQuP-HE1!s?@6=LSL8j9rYmVVG6nL;{Hu1d6>UoR z*I_xpa4h~M`$O!;MMlMI#!2cfPE-qFX=0p=_mEGUlE1HvyKK2{+9Lx%BWjVC z9h1hkQEUh@`)s^`4}{MA#b#UB3qf=SW8>9hHqCm)=kI{U6y58$#H+SP2hUqR$^Dz# z-~AxRll0%YpRah;mY#Uk&w9@3?)f8^d-&VS-)sDVZ0ldH`OmKZSr;RG<>-GJMUC+X z{DZGxn0B7bVm$M^`JAV2eK4CMTRV79#X21nK~^1_tg+L}UE^_&e7=q0KQ?D~yi?4$ zgu_6DY)4o;AkeAfMhUTUuM^%Pw*2@Hq?95sJ%?Z&O!_fhvZ(t1iRbDxEPSbI)NU3% z?j^nMb*p&hUSD${Iylk&Z8>J-?x^E4I_PwFxb=?-n0llE4FW`728#o$3l2y^kR^9d z+h`2#kW(h@`&jyjufi;lSMl&fz)7YBoYM+ywlztK8h+ymacsnx;&u`VA>r+6`B2Nz z`wUXya|+CC_C8s(yB7ale%q3 zf4p!)i?J@E@u1^-Y>U2T&)t%{#n|zPsE*T~-np;VnHz{4Sou3BqwF=X8DeV=wdJ<4 zn$4MoL9@nD4qfk%gHqDElh*ssl8d-h&EnQrn6p1V&z4hfOtz5IW^W2vv(wn!k8sAz z`+`kP)?4K0OBPf@dSt6&&i*z>yyif#&CwKNhh%c<#dt)KCE#?%u>T1vxKK!dyK|$| zl|2H{?i@Lk7C91+2)6C&TIh6Qbk{>4X=Eym!SGjFqK^x}Vx#@F{2*Y^g+lzAk}tT| zk8g<{zA91xyD5#hMU)sDjP~RtU%(7HnhSoT2BIL^BHN92B_iTP5GH8~XXb#sP(ArH zXq6+qHMT?^t}4Jd$062F!P#@~VzWOOcm;o=9(6j%PZVgq8Trs zDHL&86Xe{y^gV}d%~P_5#Q!<1?IE8ck3|QA%TICtX6^2ztmgP;zD!B`N&GcUf%@0- zOIU~cIlp?0iG_|p}lm4Bkiae_6Fk$hge)6)7vCi=>2fhqEOizYn~By z+Q4pnj5Cz{mGC#+Y+jT7fxvr_(~$3f7anCXRc;rp`J*&%42Z2Cq16|7Dm*^$JJabb z)E~F;?A$_nfK*sq-`FVWBT6K$b#;BC-n|e)l-x!CF5pS2>~r|c_#L|gdm|Frr&xq; zpS&q@2!*PHL*ESdG84VDI~KAbydJo{qFwOqQ@aEL;ayTflr1TNx5qlaYy*kJ!hp8C zEdweWkO(Zp%l0I8YJ4JbWd8>wg`C)w|D+?@nIl=?(SsF6vm<%<&VbiXjIG_KhH8v2 z>qa6e7$T8a!blJ5N%mZl2DPneoCUEdzobfQcvfFH0~x^}h2}75sJTA5y~oJM{i47}+2QRE*KCc9ygr#%gnF5l zs(>e)uctNX(z7Z-L&PIuP)$dUGRC{tljOZ6ust$*k!FSqujpyeuam)D%do^I;jz0@ z;>d-P&tv|{ZwWZV%Mznf=NI!+%|*b<^J(QFWMm%X@c^^dNe$$FXKy1$(AXV=@!7L- z)@+oe&jFXHWc#6O$KBpyjBSaz3Dhn0RoRiBCqYsJIgx*4qyTk7I3gr=lrbJ~7F-$2 zmo-af_>;>Z<2=3Tyy+3K=sv1AWRl^>XhDwS9C3l&JX*LjgBh)>)n7-%pU|?bO*mVfe@~Q*H=saG9Ikonz$jJbx*|hzKgk(eBQJLN7aXkA$*mG(oMfLvS`&5v|Lr>DThE zwDyqjc8%a4bF2S1Lhfmy)hk#vyCaZ6Lnljlo=sP`q~G}(@3dBCiXy0XicfsJ!+%wd z2EHL(_L5YSmFZh&aZ5O+yYn&HwMK#i&iF7`HL$5KbHOgOTa1Q;r+wDg1r+nuO^6-> zITy3}3%b|Ese~PVJ$bm%|2*BLQkhkef55F_diYAIn&e$Mwz4g#`ZIV>{wmbVC^NES zy-@JSgZLe~1BAIRaDiL=0!Bv%bKIR5@tkN=W4W)n0q+ZXqz;hzXUW~5k=aPO{x5?9 zW|TRTiqkVm^y_2HreE_$dP2S+vx2!}oGV-!mf#I)t+b(8qNNuncLjPPC(9_qH=oJy zO%7*>b(JFG#PAtYL%rFVIrFyzJ{CT zP%e`BJC8ZXkl`uvtlIu|s?fz0>c5!h)~L8mjfYm?zux**6GHJ^DK=#TdMM`zhxJgT z0d7hUAs}9QIhMfkGR#5(+K4nrLNVu0ABUfDdF;5*AtDV-AIz zfcM0}?;~^7A<>{!|7R%&{n9(3{bgbm4kPOPK3qv{`G z%Z6Otpja&hezqr|1TE1E+TES|fUaL0GI{?#-p6B1u=GxNoHc7n(qPftzz6P5u?p(N z@wj;YMAp;KBK&dYG3s(AvzoGX>VTX*B*d&-FeqPEzvV{45ObM&ke~eUsek2%=D&$H zd61aP=WO+z)Z?}C%3Niq*F2b!I77d519!2>CFEh5zOz{F^r<~^=VY~$FK$;GO3ji7 zh^`OeNK*X!giU$bdG7un7Ma5M}hA{ZF?Q1j@9L(#*N zmlwEy6Z5---^L613MOBOx`QfO^(0ek57t0AaS)(_~AX2VK3=TtGZs9=~TC}_K};ZuZ4p!zQ_(7GTV?^ z!i~lxa>rG3Tpc>k0#>7Beu`gpkU7EG={8#feZb0v%Zhs491IZ##UjkyU*|6@5~){& z-s}H@tgEBo$x9H65U;Gadb6@mtrSjVibU>CH*-Gmkd`x2ALf2vekR}KnggXU3)9N| z6mEn^8B~aW6k+2p7T+y?TR+$?p9_w}?%b>|H|fup`E1K+2#PM9EZ7WHWhp%V9CtY_ z;8NfGGe8aWi%YlBDb)mU;@%n>Ru{L zoNU}FEtq=?lK4c|5scp{m{Mm54IiMB_e)2zVV`8d{t`Q3iP0(PnYd@eH2gUV_5Le= zGG~EHtYe>Szb*)^^10Uw)b!XC>+sL!iao6d{EPWf z_7W;ND_&d*WdX{zdx`?`T?A>IYUD#zrl7qL9*k24_3C)S0<&Em?M2Ls{DpHNK`-;z z3q!*Tnd#8(kxNy!k7B+35t%dRW;Uv4Jp%6lNnMB%KFcvpmx`ch}(}xotj_{ zNJX!|$_)6r%mCpBEW_eQojLqi=dVNFRVUC6aGug&>SBR`@MP;zsP!s279c?Pe^(~Y zxx%@uhh309Tc`z$h(?;+rA=9J@I#$J%3Q$R)=8|akosl6Sk*;%H6e>Zp)_PcflQ1n z{okfCB%@MZs!#5EMCulU(Yk86(-OO*`W(KgT`q$rSRw*0`iwxW_Eyz4jqLvy^mRJE)X3D zwk?-g^7BhQ;^q}H{JTBZhK94tV>#8N~Jx+#P@B;d{zOb043Nu`x5(!UquAXOa?~1Y)kZj zC$NL_m$?uU$V?9#z2;#|xgZp7NT&qxBXN58GX;Ez2YBXaM^38^8rAyn4TwCP74s#x z13|V?2?CFB>lcwuA6263)1hRgvHWDg5@vJj?fB1Q2Q$6(e{{dTa+-I~l`GT9JLT7f zU7&l2Ul*%QYCt;IM{o@N4vowgr=ILB4i|Pa~~d#1~z`>8j(_tT0bkjb5_? z?;u-k*xBW=J60qAhV=fXQRgRa`!I2MD=Gz^Tl$2cVdrdg(80+T?ad_z1of{hX!Lod zI43&uy?2fyM9475Ks@)%gM{l|HP^+_Cyb*U{o?po#G^L-TfU7*UJzG@KBzNG&NVwp zhdVC%<~UNUGtnjNM{lLGKelvqvOqDK$eaUwX}h55To+=nPj6`AK{s=Nj4~)p&Ldh#~Qc9z6t?&x3}* ziO}4Errhnho9m&Z(`k7TwmST@P9zU~vY?b3(ZRg18~)@}^&&Sg=2w_=$<{jfJz0IJ zw=67%IFB}_Rn~%f3x!d$Abs^mt{R)#Y{`PhWHO&2l^X+X^P7^-w|zleTs+C=d2F!B zv|9?~3bu@M4^XW20RAgDob1A^*x=At^^M703rSeAU^oGm^JKLZOdB?CY+&s!sjJpJ zaG5!31!6MCDCBr<_9a7>eJKtcnZh?ZSRCmCZwnEIm zBdcSIF~%4Tmv9AJ-@OY0!T~%f!9z%(&wjAB+7X__x;oC7U|do}eqyT%s{qmhx;BsS zn9_9%d{8@4#nTrYr1avLNWBJE zpOc|Z2hD2otl>Qapgs%dmtmV*VN8(y@*Pbc;CE*EXEkPXsB}1Ijbk}{DooC%cJsmh*C=R<%NAb5eIZB! zf;qgCh_z}COV;qptSU+kuW@6Aah|M(p`+`PDu$1MiTqSw(j$PonlK9DnKscDXMjv5 zA!fBI-xDI$(%{5aF-n1Rmug`B2`e9f$a=t=>|i0Fv4Tqk*S+u^i9u@W`y3J+QmY(U zNLO0ZDltcOr5}kREquB2;L0;wgw~Ele20oNYEo@i9tyh-p$`$B<6>t3Zz~Uxf7+Ij z64uP|9lSej-;W+BNeN@@zGW?65eFZ9&c#N3sok8)vZ!o7J)!A|stu_67oi zY?bj>nOeu*%sS?_$RCyV)H6@0^c>pZ;3 zEZQKZHV@eWJ9@!M;CXk4#8rY88cw8!Di_OlrjwmI5oJid0JSJ=)XSY}C7d|tI;=Ta z7;NpZsxAMDD_pOANrhZg=J9SJ+mvT=!mCoWE?0f4ALyVBfv1=+u9aR^Z?mV~XmClR zUQILfs}7n@6AX$Laowhux}WH`l=bKXan0pl@np9s;?ki&x_{UAds^&9qVAOtEcooC-}2wR2PjIiUe=_r{S+5wcaiQ2e0q1HeE~*DMzu|1l zVGUO%x5F{~p(Yg*xvslQ6ql94f&CDtl7JZv5+UoJgFd1D;92XxykON^VEo%ZW@vSTFavJN~3=Xv;$l*(bAvC8in340)qO-Y6tk4Q5AaIyZ}( zRiK~+F{#4vgPce~tRVs4VR1WTf7zZLOBMg=CN;gMfe~8mRj10<9z(!$ zFMDt$kc8uKY^sOZ6+sKQtDl-ZKF;9mJc731N}kBwXYhfsH&DD#lMcOgY6{*6{+Jga)2&;88L~R{E4q^O8N3y!WXijwyWwS(0T1t@0r} z)S3fD?S%~tr&h8g(P9yQz7#T$Hq*ol@+@oKYpoNIpj8s)KvDat*{ebGy|g~ENcf(d z8y!+aR(JR$t%>hvUDI8ngre5L4NT3vBIXMu!grzCQK6gfF=Ag(NoO3$f#yO1U+Al22SS7?t3%yC0pG~o!`ZP0R41#h|kmg z&hS-WKwDE}I&cd^dU^(BA&o#Kke)j?pt+1OJvZM{tT@0C>Uqqmgsq~b`UA07obqv4 zGL>9pFFmOU=TpK;(|t_OL(_0b|4K9SgZwsG=}4>nvn?e@cM%`yEkXkK9Wtro|EKPK z;Nz;w{QpTZNr!gYOkoNG1PD4}q(Os;n394iP0|2OI!Q@Vq)qEuHCwA&A=4IVOUtx1 z)7wGBqNpt5iYxBoE-GSFg!B(dD+mQyw+Lu;Sv}np7ew14rTM-;=iZsQNn0$s``X`+ z7tP#1=bpdMdCv3yah(ev&5C8_i(ZAZSy zvG}4!nGJ#&debpGOXPL~jwGhZ^0Nf#S3dgE^p7pj4UO;+rb;l zT0`7Q#I?uin(h=XDPYV~w(ySb;;sv}Ssq>zo%;LEsaq4^;5qCGOt?p;JVz18Y{d@R z?#7z3mzGx1pEd||>3sT&;PAWUj$z{xTDObLm1WM)Aj0dWCF@cqh@v934P)crb^EIa zY*w)?+YZjeNtA(alV+y(a?$S#-}c(WBR5`CERlh&u=Ih#(g&tZ9ZF)Od|5&11J@UD zjrYN2Jifk=>+xI{l|FEJks=?SliFD@{FTg=@s8>jonK^#5%lELXPn?Em;_Et{kQGG zNbtJf4VOBn5;mkMNc4#xaVE>qjrgw(-w3d`dQU@ifKeuslb%y%7o^-4`i6+i-jj)b zHpw|?B09o`%s#$eu<#n$6*BzX%(xe+{nO_gw(XqwI$9cf~nsWESavg zmJxsVdx~|U&*$h^1lTS{FjvlfkE{%Mwv_wI6aoW?3uhcq5#~h&A(l|KQhj7P)x)BT zrm9Hy#;Zo2vT0V-%j~e6M8kn?!QN_eI}0Y^6qgi8{52&2osQ+`fo+Ao?;yZ4nDs3} zHjCZY;0D4zM=iePX=KR=jJURlpVw0xXfF=dHw2KIpjG~Otc$IcD05bp4};|5&dQ3^ znu>sqO*$S)o`U&I#QCK;O*S4nOC?IeKA|N%wJ|WYB?w#ARGDtAN_W(+G#8#f7c(+tx~{1Ra}m1&3AdDcPuU9Y zhnlRWPI$u^N_WQ09a1!+V~=!N{rVx)isL!qXrz+jR)R>#*H-dxQ$vGl93AJ}9sj!h zTbQw|=xV)9T0a*uA?W;a_!N7f0+9*HN~3@U*;k(JB@_!dg~vfXz6Z2o!8Rta{W^)g zM1;yGECPH|N_weE>|+4Sn81=>8^e^}av@znv=T05Bsn=-uWc@(<~GOGJFH`>2Ta=z zcsgG^4k5^f~WP@{R-OsO`oSA-E-7l~6j!5axnf>C-%7Wq2%=DA6;F-2g&Ao5M zg{UCf%{f1pghH~@a}^y_zW2_gOmGGdN4XRcOJS6*yJR9jQ|_7f~j321TPN}nGYU0$O`TzBt`1S zdN?_GlGZh(WlcS_g|8ylmO2~Pa*;4gAF=wOp^bWOgA?6(3s-%2>NTfjti;*4l1sKm zj=9j|VrOITF&+nqTsffo24w)H$|rJ{E)pWbT$h5{FP=}m#R#GxtkZA zoT_DJJf1GKcP`~Vv+*ka_Kr^w{Kk!Zp<_0CfMV~&%#X#eHvWUtRL&O5w3fTa_`1PE zKzYI}!i-N5X!Em=eh;F$v(4Gz5-?ogsI7xC^ND7&mYy7|yd(yp%(`2&9unOVPb*g| zJ0^yeQt5^Py``qqp;EG|f{Zes=r@nc0v9=6y1)}Efk{(`#wF_x%s3pRfS{Qn2T*C@ zt!v&VyC_ih@VM$-7KmuLEL{k?|B(OtP_mL8Qcj;$fkj>>_*=y3)FJdwbG8w%~yHrG%Z8IZ=uR#UouUziK5ZZ46JF6Tnl!sNto+xJ;9--W()7#4V``6H5$IQ zvw4KV^dLG4xU^3NPj39;BGDhLGwEiFSJsiMbbQZJe$4o9@##c8Nl$WrS)cKe;VJQj zX3!6DfQ0aQs9)9LpXp4LZk@ndQ~LEwoU(}z>VlL7QwHo4n~v5Qm>9H{gnLoFc}TL7j;WV znbTO_p2&W98XsoA$$Uzc*(u2lu>%gWeaQ&?Lxq+6F9$W}x>D|bVV*ixC8128SIe&I zfdexdLdlD18I{J8!$_(sY_!LUd~IG;-}6;PU)!M-?}sqRw)yf!MUjpCyM=%M$iH8B z_aET5k$>5>(yxFa4?iIVU=Sr3Y?i6X+m>?N`Aa|cSpMBg`|haq7JL+7s~`fCrA$yD zVlKkO-(A<^mKQlr5x_-3UGwmqh(ku#S3pKv&^Y>gtRp%z%fd;S@~@{)R=T0he-YS? z;Fk!E+c5v%?dIa}zW2?$b9vYbl0@_pFHs|-$%P9{#j1EfiiBqIq%wxFx{AcIKA|L|o7vjf|LmRm{=7}$QoNJ#qx0C5` zz0%?7Gxxp3Oq-u#kl1~V3vp2*A225KaQ0cQI_tk`CsQ8@pA~ES_nus=Z7bjoo2y?2 zxP`~v+bi5#uL`gKhmz6Oy#IS`k4wQwp@p~x`3|+T!4rQ z8>gp6w-xQ?Df+c=TV)o}d-YlT=gXSx-YYVl`=9#nq2Bwv1`mjpowg=AHqg4bubeJ} z!1ngEAGH`%NndjIPfASX9xh(Z1K8&3aERK&!OFJ0!y#7<-$(QKf#7g%6*1=)nL`w- zA|JkpvMTU(qn>0(mK)zF{5KRp*TGj=5Y)ygM*!j4yLB^Dz+bo^8K+?vq+orlw W z4sFcT-l8-Sb5zuoblQ!jTeS%PsVXa}GHkcF#8{%*R>6NH-%hP@hRC61cMV2rV`_Cv z`zv;zWJjgSm74VumcJaEnfFkei$t`~)@}7>dY3zjvJ|nZQA*5!3Un?nC%CEGakppc zvNylrC*y+KUx}Yw_{xK|SN|lpesjToYj0S+%e>XSa?9t%9;y9kNHxeBcw_9SL+b{; zjva7X7Xg_K47{FNr#l~So(mTzVMAQp9RDiV=dE-at!L|B#v z-BqJba$FlC`v`i5Ns#Ru5vUYRUy23~=Je2isBYR0V;drHivFf9iNIL|lH-Sp?FFrA zHs>bbZrgsi_hJ~3FF;c3@Sq-qB@niO9!hnVes2#YB~NK1HtF4%DC+cNK3CqKn@?G1 z`BhSJkAXu|u3eG2&m(pZz+XzNEIVHYTd6_2R*UUfW2=by%ulTa7qrJEGPMd%NWMqE z(LnM7x;DMd4E(}1%W9YHyld6P3#5`+53&^dGYs4BQS83MqqlI##Wp<> z%((j#qyzrY(wp~w$8HklassLMWN$bMzi5YK?o99{UNahW<{?RPa7q3984{?un1-Pa ztb!h*j7HA5Pgkhn)}`%4H_kLIbtNmB5R5}km5##0JkuJEk9qPZl{?YwZ`n&X1!;fa z&zVhke0$X1R}G!!4Cy1h6fU#Dq(e>3tL)FxTlBM0VxW8Nm86XO?bYpE1wW^^ny(6b zB_^TXUa2qh?3Dn0mA#Vh+g^JW;VLZ2$;K#GmG(-ow$xrp=y`{|lANdCUR7|lhbv@n zG9PyX4Z6ceev!*R^Z)J64{a2@@P9TrPN&(67=P4eVoad4VDSq~>Tz}y`fX58=2I$? z-BMCWP0q~O0+N+n20#KE54u}Q$TYv7Qd_sQ^@p~wrM7(0-BLOq`k@34GZ=7%cF0y|Y+rK^h?Xx0Kh@e`d zVn|7A3w|WgRezZ&RWuY!AR#f0WfBFOLiHCvntXNYwnUHKidZr?t;lAYY+c&M=kQJ-jU+sX>cZ#x6GsP#`LV2!*e-Q|FsF4zL@sv=ue%P8e6Uf#t z5pnuX$&b@_uH1A9UeiBBne!teWTT8jjQqpjcfrbEJmG6U^JWH zi_~7>CC%wIkuF%F&P?}g@_d=Il?`l45FWaJ4}s#+-P0kL(oGeL1HCidTAp4*vH2-9 zXloXw*DPL`?(A^}ukqu5;NzON1|N=4T=g>)`fZsw0|-d zJkt7%Ch;NtEssDn61GB(wNLA%+I6qp#Hfi_*IM4uWrKkJfzE*|YKJ?Vv&tk4Ijlg6 zoxzT-9u?))Y}5tPs;MO3sc_vyt+{MHg0_4ekd5}Yvz!O*dSb_%YAwU6pzNN4-gi|$ zH4Q^D_`%j-YVVOWDtmQaU~(DCR0w9~hfwl@ySQeRk=iHe)>!VL#n_ssC^4f_H$pc> z%sDIMqywj3y8a*Nturh7eTdbOB@?Ia^jvhj#5&eZr+KuS&WBO6t?10G2%(f-{9_iZ zmv|xvl9LWTLRIy>CC)+Q^kR&uABK5

          ^89#!~LIN@R@=nN=5jI?KZ3IGy@(Cn!c8 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≷zp#C>xyMokZABp)=(cm%LE3EH&^g0K2`Xc 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 z z{U*-8FvJF39}K*+ME_N8cm2L$(@K*8+zOF8=qSREo*vB%CRp&)7yK#YgYMZ7Y662k z$=N}qzoOoRDd&DB@Y9;`TQU+aJ;{%uINn${^JF-878?NmV z=m@0f7wEGb1n%ugl-w*bDT$Xp6GgP=owG*Tv-NlZYv*XAYHgl8-WJr1G;*7#lmN4x zS%z{@MP!m8%a^&HjH)Jk2>Z49K0_A{;#`lr(au1GpT0uT!P!ML8vZN!`w1y%z|<`Z zddP#bZXuuPAzy;o9t|AZ)0u#aLQeUT!>J`bmCrI}pBjqjyY-XW6P^lyFqZ!uN7bu5 zd5&dQ(fnCHqwpFz%={-_U_p)@5npI`^rmK1qHrGwkJV75xv-rNyQ#jwqGr#j`E{JpUxq{Dy#*d#; z)MI6p53%_@8Q3{r&BPufluLwAgnIUd&{~R;6leL!t^kq($xf4ktjf#dR;TKJCOuvfI zhM&dNo?wm^WjwRN5T+P+3o#XD{ij#+5G)MWDMxWWmjE5^D_C@;L9Cqm>=28y~g-w zGSw?HdDbp^!OFm+kT5zD{b$|Q49oSMpYtI)qk-AYqnH){6{Ev5!(h}UDj3N>3JRq6 zdwdME8LzQJR0w+ZH;jWlkh8~XeE6SdBKkN+=f{{2`RXaW)05#(5gZt{*M}k`2NoYxCc9{k-Jgm{xN*rb;^dKap;W77l_!%kB8ibAy&jLuK<~m1TX&Y>H{LIXf&`P&FS_KiN5) zFOsaEZd(%9GlZ~5=i7t4EvOzvO`C^BO|+wgzAmT#`8{`Oby)OzGU*kAd^A4!=uE`d zIJ}e2@S37`$bOg)RwEmb=`XxXL>tu3Y$+7ZY?*q6qHsA*g_a|~MzAt69UB`|rXJ~G zuX#kLCYq_;*vS_%-Qq9lsh<^gLD_`JHqSi4&dh zS2Zwm-b;}Mc?3$+@?287Cq*b$x?>q&Rq(r*ytfgBydU+vAaNIZ?hL1e+RT?S&z-J}i2C_ip3Fyi*G*WWfD&xJ>yxD73+69qI-~Ri zt9-aVJq}d*u(rzM#``#gBDyq9QyZ6>AY}_>s-;V8IZ$^T5Y=)Z3P==0hp}J;#77l~ z^Nn4z@QEQ^xA5IFXaLEhPx}&Cj&}a%j|@dN=lw^DyT+&gCYn`>v2pNBgcsG6^ob0! zPq+=sD?<_0&apOdg8^xSDr4s~lYI8mtkOKvtUPw|BYzE=*;r9jEpvk-L6y(=u9;Bp zAuC1O(eZCdoh-$K{#lC6y;PQB$9U<62kEoNEy$o=yEb!ibadIZ%Y0us^1hbu9j%X% z)C@A;A0PWZvu14knbjlj`pm^~rIG*4m1Ex5s=P;o*0xICaqly0Mqe1S6^Bsw6-4$k zcx1?GDo<8Zyd*0J()Dm8WnU2cTRXEl?rqnuwKErvd6)X4hiLHyyH*)D-#Qc-f!xet zYBPKtwTyoi zLy@&}Jvl_4zILI<(=l(MR=&8SzPbbNtL1)G-}?JyT%EU6t6$msuq+EypMG*ZPaRLT zsJl>T$CE-ky${RyYQ~Vx)$!z0-02{A5|2$XGNU?K9hmek?H}yA({OM9O!GzeE7bbr zZ6mXctY*i|w}sJ~f5armw8a>hA-+j43G!t7WI{Fm^XM6IEzO!qzrd%@%9d@xT5&~^ z1BWEVXY8D+`advcRS|1CR~}b^@$cq`wc-T6Fa~~fj&uM&ko~+V4l?JMCdrHe#ysaV z@vj<0_DC6wWbP9(&B?$f3z$UXjqkAud_(Z(mahdJ>F#AN{b50%&$!YA<^1>!z9H?R zVz;Q+r!G-7I)8fwSNk2yFyUD0GxnMBgt%jkElnL-4y}ZO{{5+adxlc7}{ak%_ zM|}zKWy_+&__zNBr7?fUkRxrIInu{(*}M>NT2BeBxE|?bP0aZY_a4Q`z9&@nmO9wj zbUeSAjjE;F^p(Gv1vJm1O4YqNN!^7GyEn@u-Mtx+0rymOPg8fNx{I|z_vUfxE}(XA zcB}h%b)TT_6V*LK-Q}o|?#-h3-o5!kbOQ9dzQMhpCAM;JKU$Ld$zh? zs_vJm`!sd;sQcyWeucVUsqQ)IewDgkt?s$%K3(0fQTH#X`?czxr|#FO`}OLcukHov zE(Zv7Z@y98zo_no>RzPoH>rEEx|gW?40ZpKy5FqsrRqLY-Dj!$Y;`YFcdxpatNR>v zuaNutB}Y=+Teu!SoZ`Nl-^*#oKl8hR_h0e*8?I-0{$E^Q%u@37^V!5!VXdo4JBq8rQeEzQ^?guBW;F zmFs6*_i(Kz{hR!L$o0Q@ew}L%*LdEq;<}dW2CibRnOt+YD!G15oTFUta{Zp`4_trZ zI>i;?N+eDi*M(eDxTbM^gKH<(EMT-)6KuEKa*I9jmRpjNZ@I;hlA7k^oxgOsjdQuj zPnei7>4FP0FS>Yg))Wc*EB`K;ntjVHmtHo_bNLll=3I4k?(}QEaBbdo*XI}9aN`#X zi*70|nenBYOJ~lSUFIzx&2dfz^O;`igymL+67+s?bBj>PpUN3+&K7lCxY-qBbGQ6% zww792qP&sOcNzK2KlA(OyG*wZY{S^KaALJyg}_5tEp9Be>SJNZUiQQAR1BBk>TFaX zHYZX_H-eI@7IAbLYe*zNrM{-p$fOqa0zWvAM9)rc>BbIh(wzhf^Oip~y)V*N$?zJ4 zI`ug@!IcQSC+UcV@kgQ0Dv9i6b&?nySBi9eTwXSDWbjRraY?^D3qj_*OjEvMN+q3I zImKsafL`WxD#AvAXL*_ zf>1$TGd{A$UFYSypd;M9 zi&=D*ox+`PZGI`0g#qh^jlTXVo@rLq$_fH$WfA7`7pr)bKA0a%isR--kMPyvw#p+@ zH~y;rz)mMKv|4x_6&&+hYV2{cy-nuiB>!b*bAGpt5<)Ub>wS^^uL?{ZcX}=?YRm{E zGJ{@d5xt%as-#$QGW#1J!P$gG!9L(Zi~pN?a&LK-YBz-J<8?DX*+5422UljgmnEX< z5VnOD+ZA0VzboB@X7@b^S+Wky zQtQ$(R-2hz;!JNYjaz0_P_UGB&u`3PmFUy0k-Z$WbH9wHx?>SvvgWHBtmivx=KJ)S zZixU(8g}iiASPs-TmMErTp)eK8 z;IbK;GE~nIU}Q9Lvr--z(rb*mO!ZYQj7vtF1)3@}M|P8*M)+k5;<2kB;#=jV4Ccm47c%#kAgl3?d2zE@<83hTRouRh}<4MduQ zNhyN~gQw4ES9Z&GGS6dYl4bm=V+hqD^wS^SM$!dFMPdxs*|M08KY3i80ze9Du9P+e0O}b zQ)8{I4zun}iXS4)^@3IpciFAgXK3}AT78yQpRLtaYMcOsJ$*SaCY-?k+G@fleEpo#1 zKpl$$75uG;kO}X6Su%6yXaSj|6pD>6P&g8=^Av854r>4W`Y1mmc)V1fVXe8UO ziiaNZ$0+}eN#ApB`oRYhjr~m8q|3x7k`yg`Xpi1kRpS#j zMBeMkdqb$aE{`pjd#-=AWTJ_U3GA_#BI1>pi$5-p+h#a9Tmgu+1;y~Ek zGAbC;T&hFiX=atj=O()XvQrBJ5kY6Gp_?uHX;VOXedoX@l*GtXGEf4|LrmEw1C%@! zhO#j!zDEwFvlx4iin3X=w}@}C;$AfKi55pu1yYT%MSh=LDN-9L@)4rwH-`Q(1I@P@ zGHy0APF58OKcjx6HUPj~PsSI6&!{&eT>z|E##akZi@>bVcrrK?xxO=8sCzA}pIH5R zg56mQ8Vgt>H(A&T$Q~wnhJnB>(4$gb6H9p)DG^FBX2f?^-b)!nUP}`!`eX`c{5TU& ze|L`3-{N!VFE%xq5;FZcPm5I4WVItZ-x)|%1B9~2(JsP8Q&BDIG`;j#>QZ1_|2-x1 zS*d$H`bv?-6aaCi@sHoO%3_Y;{X*uhm9i+>;wEF7Ax|{}BJyiY`K%HXg8bMxJJ-Ps zmM60r8DyE_3Iyg6q_He5q#PEx$j4#UcCa`mawC!NBJx7fV?aePF%&pm1D{)FI^n+< z*I-@1YPhp-+eC!EPJ!3j zRVcH|sjs;HsoPx4kJqa``mL&ld5QyF!omkqQPoDNq)aw`cmj`s^3bDz9oZ`tQixrM z3lK#J;!!+jB(wF8NwodZXkfr+{LGBD*=~;iakCO!esfy-T8bdOQSmfmW1IX!U)Riz zTOVe{i#I*d5seiZX6*jEgTvzj_b?n6#5QR4v_Ki8;xJBpSBWo$QN$`cM_QKc%QL)z zSlNEjt+E}|%)(pE)V`$Q0bJ$)oT;#OVbjl|am>8MPFY)>p{>r;R%Z!tp_*)2e`X~ampykz z1hkoIZYD7)r(>fXuQ2czcMXceJa&VC6chZv8VCQ_#b#`Mz^ckzA840o_2*XLoQXGn z_KpIdon%b<)u#fyxv+qLjGFP^u;Edl$E_+@RJfyy=#lmFuSdDet;hRmy!fh^!mcPa z)n%e2HpN`5tW#337zIT6))_)GWxie;xmb+U&CEG0dK=$nc`I^%F;7rm*8h_2HzwZY z9;7_EzUhcbPokQOYHi!sWmIFQ(wIT#MP*ZBuJ-6lBu?>?Jf_2LS*NYZ)*tZbXo<6& zD=ME(@N*LUKsGb79W~NK;|bo2@APE2+H7RWkx}i^OO1AdQCeKgj@)>VXZi4ue7HC6 z!&090+wA(pTdJxW^8lnurdoK~$v;MKmhs8h{fY>8=@5Tru_Wd--wO?&`JYG*8xL4-T*`z}sMsjINC990XNotG$q}xd?gC1=^%#UP z;>D5GAmN{-E~a$_$%kaZPRIdUr9#*$*h!#6Xhjb-*p(36n$WV&z^psDx#zTAPrSn7k4}Vh7GR}PtsJmn#>5ue}40_i``I4~! z#*g+aT zZ6H0rNc4i~BLdf0Lq&f_#>*|EyF#=b;|EK44$+bFBb3?AfuHfE?Nf#PBY)I=i;plO z$>P%Qg>?{eCWFGPqYUru+nbXPC+6*jk$b^!h@;P1Oe5`OG%-JS#y-Ej%9HVS`bHv3 zR?dS(oJFeZOK7233!+^M2)R}{G!zy1jwamzueY2aeY@xU%$ zFM~>zF#LF-Pnev)45=q;pzObqxfw^q!W?v-JAbYog*tfr{Q6q@M@@ysE~`SQOb|d{ zC=f#jX;=*SjBB4d6A=|odS_;pIQZ`ar6tB=KT|80LWNU48CQOU-_XMycX}qWBE5)i zhDuJE$KwkLJyoR*|niw2lZu?recUg>gf2h!;2$|JkoJOcp&UOD+`rfMY zBLr%KII15osd8kM`WO0ptirCg9|(xNs=-86mT=$>;%qCTJJGGpKKvYtmI4g)wNlrY}T8|&UCOpzk{ zTYH6y%}P_TsaE5p*|I(W7S#bN*7VV72F z{6Jp5o{2xr@9>1{Lt)4t`X?Cj4`h;N8d4_37{o+?&3=Y(9bG0f-T`MINxw1N^@25< z?XBAXhaP3^BPCLDxI@1^6M@-$EUBvBBz#V$R%++oJ10vZ)hzlNIhQ6=TjS_yQ8*$G z88Lm*la2AukcOeE%J|tCI&7I|G7F#c;U;c)l>OdC_l&emRs3uj8y`OcEsox#ESB4p zm7(_CXc$IU~(g3$wc8;eNT3IP|czh0nO07SMM~ zb~1b#4ZmRwjT;de5To`dz<0|id}D@%7<`}(tiVg-RyE&OV|2iqF$+?YWroiL-gxRD zg(5(J2r_Uc7y6b=*d0#_CgZe>=8Klm-5!~+$ABc9Q#NSv$m1FK?)_WgGv0y$eKhnf zK?M_NMpYC(3-FoXjG|6^Qc&6PWIy-w0d($!r+0m3J#@4%u6^TWnX%>2DgEQ3H#Sm$ z-^1p?F(Mg$Si+c0M#U5=R?(9(5fb+(U(z7h1zyBtZ5;$Zw7B$VXVaGe_`4lqtqH<(UVeOz}uA5IQLg@*WirPxQ$BC1qYCo$wFg)r&7hO z@bR@#Y!dnel-CxaDcsnIrtm^f<9wq6rZ%%1^6^O?RDIcVbrOpfw&>rIB3@ld_Ovvv zK_6j?l(kMM7XiCQ>i2C~Qlrgs~EK$o(RtSyBx$AZF0kZZp+(QsJD7Fj`Px z&#GEP76P6P;n#P?!Lg7lX6XRc>@6}#Z|gwBtGU^gDGiJ_=XeeoHWVIUE0 zHO8<1j9+Pr*O9m_S&ZWcM;@J(LI5oh{AX2Bc$O4ycFG=VMnVJiGbI98bagVBLL|5OE2NjwwW69rSf1_kZBfLR+S8!W4Yw8ht z492gw8pqahrAdjyn(2c6dxot<^%((o*9YK<`=k+vkheCOdLSX&NpPrT%O)El(b}6~eg6dPP(ZRTe5X zK;$TLcatC7jQeGChD?6G5%_Zq=IPN6B<&T2FG+8eZY<*5>59qJiFv+8*muEVVN7(Zc0hpugtP}jl)Stxs|)GApYHe-U7zm?`B zp$Mhf`?=aKW??jH0Ox9#BL-w6EnA~FlRj7bN6@&8p8tos^8t^lxElT@*(3`t?xImw zjk?y=MvZNhXoHC*Xacb&xEl$<%D=X#X-X9(QCbNG6NKfmiq^JTt)kV|wzjpEDpqQv zAc++bEwxx^ORH@s4Xs!e0nvQFbMD>UyGcOOx8L`?9}khyxTDIMnDo zanR5Amjm} z!dSgo-^-Njw7SiY?%C6?@4+NO|Ayw+0zwvDRAm(`U;;&=K0y|-jJu#n)F+`%x~on@ zQ3;!Cf1`^iCH6tTCr(OnTFK>}>91DoFxg%byoW)jkhz-xqNFcRh;EfKL*kiL3(2ko z1tX?xIW?d&K4?oJkQXB2Pc(X0OHG;hr$iG^W2M$&AqmY{QT5!RBy3J!hRz|6A%}@M zqV-%Vu*0cnAP)6cyY}^Wyx^5$FU69q>g{QI!e`Xl!?tp=^>6xEVoN3p%ebwm?ymMcvYXRWrc0Q9G1(AmI(APC zEcqSa4m`fJbi_z;KKJw0oO{U>=zbA_OEtm*svrs6>F@mkm78<8En9p0Hn=Lc zPusVzzgMzAHy_Szp(`1;Z;;z_xXnJ6+V{N6&*`b3KjJ6JW87~Q3PCe-&FJe@;+V@i znGBB*5i{FNyC%yMZQ!SjKF1t)y|S1&wv*OW^nY(Ei$TM`lnNp?%yFc=Cf3o^z)gRq z7_QS2Gk^b=R_%R>67Gc(Gli0unb&0RxP^h%IB)fu$LH+se=K+DJ=zItiVq(Ksrkw8 z2!oZ_$Pf;gJW*w8U)bF*-CIec`R3mH-V<@L(rGBqoH0|pPn?F#3H-`<&!KifnNvT@ zd@y5Qf8UwShh#wL3Yco7-})eM$FpXG_r3l;jr;^|p(qgk{Yu`cO!5d7_@1+tYv`&Q z59#rI?EdTeJ|GTDlv8NYt^W1Ck-_5pk-<@XI{4)C`yoCTaox=4D|}w%wd4G(7HviKsR(D za^fAqmc^s$#HM%d#6o0ybTQ|uuz<3NN?!?Uw&fF#zyhsNz#Z}48*TZxk3Zooc7y6q zn3y3bP${H1$Gm*Eg9l~u+iQN>tVkeK9|1oaQxqt^-$nrv`J-j2lof_tlxgGDCB>9P zXlHW18Sw&K4-=M`{1PMC-dgo|KaBK3(x&3SOcN@-W>|?KLB$M9J#~l2Bc)8VE22Wa2-zzjq(IKZxeE-m{nmG+~pvZ zY_sOdeRFBkZV{a3X4zXvMXXZu8=4T>B22QtMl9)mhVMDFBl1{|NK+vuti`<44K-Zn zO=vHqNw2x*kNZS`mB zrzfq@p0w}~lUDT@rxi>t!P+} z35|#j|82QEHg$N9rKSuI%ka_=aOs3;&KD2y# z=OSwSr}F96b0niF6FG!@dSBoFkMikt2Mb?`&`184JPkv@_rkRN-+s{WO^Ez2(xJV# z_%XT9_6OW&*)#orCj8s-&qg;w8Nz1MLfw&!LlkoUKC{`a4NH2kiBA~SzZBz zG3iRnvI`SR-pJPKjlTlR_DFmFFT;EzAbwIo8_1tVOa3c@-v9jTu2{5XAHRLaTc)g*GD=TrQC!Ymh6 zsm<7jVXkzhavI7h^Izom19=ksHt)U-Opeqfc^Do*lZ8N`56&J~eexhAFs_)JEiJ~0vVrSu5ac#*2r z_{qp7Lpk#Lem$m3gMz4gICYb%rhG}eMx+c53P%AE{QqJN=A|2u)Fm%%@8t*?%vGUT z@DzqSr_J6*Nd`xx`h{eOXcY&8G4lKHv(b*@3|^s*9TC+jJixJ78M@xHRJe~Nkf za*sHTX^upUiT&Hxf*(&UOpSz)F*mnO`aeUE8_l!LXc{z1sylzVSoQ7`-9!AomHJn< zcJcc}I*H#W3@Uz~vZnil*~IS?Hq$JA0JuV1+jL++M3zutzGT*dq5g(Z3!{xM5tt;N z=;E*3_nAH3_xlq|l!HhMBaCkoYN91VDJ3mNc%*p(f||Hh_(V(!4l&vz(O-+X>MAQ}+pgaR_@NUhXI>Cc`UKMEe=p%LuP6DTl0g_2`p*@O_TF}a4pVYQX6 zIDLD6Gkv=`)!7kdq!c_Y!%0jOkTAmcf|AfUadBixmUWz@;zkG|3HNUrO&il@ePaWa z>-&FW-Mo$q%B@>^xQO-tMjp?zvB<`q7k?(Wa~#=Bkci}NuJyD4U-yEIEUrk+_7lv(U$aIwK?#Jl8ojYYSLxII- zGo@qi6Wk1Rp2{_=ngEe+e*v8=A)iela6wGKh6-8ciY@)pa^ok`I5byT}WJ-xC>=CyJ zOBbT$iCxk}{1j++#69T1krlp<$7vZLQfgFSeh}C#&QFJ1%Wa@$TGD+USJfM-stNzL z(3Lc)a+@hr^A|{@=C5N%rF-(==+4ZYEj|YTQ0$;sw1izvqh(M3tLDMENI@KHy3<0{ z+5a+gIXS_5ucLZg{qSR>9M?3xzk0=h-z-H>XYLN3YCUd*emAW=54xPYiK10h zHXDDdNWNMM?BM*)+?`H+`EFXF^*3<2N$TJ0)RzL`kK@vwHDs1b8>0rMs&HcYWvEER zwPUtkatWX*j5c{#KCw$!x5Z5!@(alV##%3__eGW2i>XRtORC7+7j7QaolfR^C%v(g z`A+!uuKwO57^?LQIG#ZU5_7Yb1uM_}P3xZ1*CPP4%`hQqGq`MB5s7q8%p_2DB()%(Hw@>-I>(TtXjHaqtXEIZt68&r0R=^0dZs#!It ztkA3+RF-X)4=O7%^9PlE+{_+S<~PwnWrvuGL1l-TqCsULQ!uFPNc1R^)zCp#Sq5G?iS9*o@D52>e zebUI_xB0~RWJN{>-{f-ypXc~Jmd`)=yvFDAl>LUC6F<4jb&q? z9-TLO^l0zsynL^3v^ReQKSs)DM7bv2ah)JuNz zGcbB|aDPv8Fa2*+`f~8qA?W|EV~he58NZG*Cnqb%^)EZy>YsVCUFRjf1$F|*3ShFA z-!*)mKV@WaHQz;iA4>V%e80zMJD)Qt&*5_npK<*DGM_1Y=JES}KAl{T=JPW?C-dww z$^`bW^R4|k{`ljwviT$ba*p@f7xFh3CjrU$HtP68k9TEyJO21%jy=Bc_~TUC(f#Nx zZuw*A$Rv_uiEmzTS8hQTY2;fcc8t;sbmC>rqnbpJcyc#5)twvUzV1WL^K-TIxP6qG zzZ0F)Gz%%nJg`9#5h0^Yv<@I7no!ZD!u!g*Th6n3xK*qTU_eF42ze6MWGx##zVj6X zkd2y_rqFzo_L6#a@nJ2HzV+pW%M?ZR%K8JivKq2zfGg|HCh#tMEo7GZXjkuOdk?yUo$a*kOc*?p!Gl z$;eI^CrgmqhY@ez`f)P}(Lk3ko~`?TGFd~W3|YmOgP>o)lRUJcsq2i9L37ay3PD~m zP~LS~<&X_J6rn={D(wHQcE$c93VG-|G6*gBsQRh>)s!mN{wn0w`ZzWgv*@4i_a~bx zWP2E+hs7diAuXnMM51Ow==7WG7$Ue45>WE(FK%UPCTaIXpUFS-z^-?3f<~U+miC{E z4X`6PnzJNO@CNQ1;lRcA0;jdGv}TIni< z<6~(j(bgmJcg!YA2@g>+kC3;VMxy<{WkfE`nYg6|*Gh{m<5yTSg4P9IQvO+opv^u( zwBlZzX3DLjv>|-sr9FjiF$JZ zQqM4xgS$-0-#@TD-tG5$Kbu0fw2CqF?Kpx@F*A6h^LAbk^@_wTL9o?`lY}k(ird6$ z59|+HMW@Ecy}(&c>FLMK3aZnOGzt^Yy=?(&ac`(T`=gw1CLE zZ-Z=#byH#+#O8I13#pG85~=O;YM`3lj?A#-c|fyN6R@uJKMqbM%qs<-$Frv zmh<|L@Bp{d^Q=ie>pC3jPwzSQ-+`rg;&^WKaa#M$l0OZI?L@$y5;LA-h`!lr{aW8s zM56D+RUt+fv|dz4dGr?_<8un1)1=@NoX3D>7i)-^aSF`+e|x|G3hZZ#};-r&0Bg;WW(PDguZ@@>yO{Zr3F|+;* z)UoMxd{}VZ1dc)LKcW(dDx)YYf3M|Q>b3KX2|+fvjY+ja5*k+2PmvMzA5mb_gwIF_ zYP^Ma_l;{`qaiz<*0DC~Q&D2^XQOVIOs}RQ@l4BNfB9bjlRoK=96Gc{-}3fDzzn@l z;aH$UwPH`;>ubmCBE7>gG*A{zcKV0g>9o({+)jqVAvRO6u;yZQ`C-+@pQ;)-;V}1se!+9w^@6=!tO z8o#f5{O)N#1Fxb;6(jdO$fc_W>*=Q-EuUL&;jc2XDa^C0Nh!JIj29oN8S~r zUj=r*A~1jor%z?Tx5#WH4JCz@!gc6VrSz##$XAG?4LD(qTd3EedbLP1b0Rf_Dn%Rm zUy*WAKFT1KW1$orR&ZH{#_!@Td!{nd)6Nhyw^e#cRMKz8|CbDWO3FHVW?wQoV-K*a z6oxGaEmG|PH;zokzy$bZQ5SdBybhYdB2j0XxjDz#h5U(N8Fw4Gt5X!s`HJyWvcmuhqvjC1+q|nnBq?Ekf?hPM`Qe!CLgY<7-AF>% zOVi{8FqgR8fEi!e|6qLI{;e~|lF z61Q3En%~%%SK*Rb$)%ilPn3W{`A2=oNzK+deqxtkCjSV4jX6X_+Yt1i4 z`>EO1L|s=nOo0h5QfN{>m`5Mb1J}x#qDC2*90z5+?|#SdU8C7M7dVfn_Ef# zCRj(}-$vmdfN!#cmr-W2(#)4cr|Z02PlE)@eVb_v@4QCghm$kF9R=LL_v3E(4y`{^ z{+wErL-Xfn7rFSeu1x?@5GBvaSwLbokYLnlt<_y5XOmG6&8Aa4E2WPq`-%$-YBIU@ z)Fjtv&Kt9}$vmQ@V=xAU=^^B0)`2+szIL4=^63Z;@;vQwXh3xoGYd5*oe=8`OQz${pg41xT}2}X(&BX46?n{FZ*-;4OinIA2|BlB8+2~NY%Mr#2W3~xJVg#Y znOzYBQbF)Y0jYgfa)QCXg$L2UydTXzus%WZNbiT(61_dxxdI=FvZNf>yr{oB64wQ>h01)h^Z zz*|_J1lB`Kj%_DN9doK)&`Za={1BLBwe7gw=lSHlEGED8C(2|p}2EY zSNIP~!M`|BDL6S1X11p&_S=g?b?9yM33gEBz%;5#MsRkB@+^NjrbFwpr8RwIem^Ub3a^yOI7J>@q@UeEja2_Yhsl>AI&Kw&=UWJ@02Gz-jR z-Ymazd37O5GiQ5oa1?3rKRMg|e3}=ZX?fK-T+0|bx;b;Q_ac#yt37?M^Y(CzX_;>> z{|*jA44>sbC(UDI4>CKGr`!9**(?@kzc^Pe$L~XNE4#-#_~qI?a=t`b-l{|1+QR+r z%J3U}4M*$>cUKms<*u;ET`G%dKWte{`@v=*MnAH>(hrr)pih@gbKx)Yu6qNXxnB%6 zdu_3ODvtx4NSyR`AcMVGy#K4N&Egah6AH;#ElIr5c-5A8W9H49-jhkIl%qM*hazA7 zGsQ02Dg~EnL`D#Q7<;cX?bf7hP${}DknBH|4a(B<=8}0C|9!(4zq2ii4mtj>eB}5S z4LSaw9$@_b|I6dI@zu|G9DFU}(uJYG=VteQs4xRPijvfgbs@)=`^|>4vV^sku%()I4IGb!GV)-@^ZGE>qtB*C6?UqoOnNk$(Ew&!c{Ld^WuUHU#J#Y-Lgb8v@XDY7X1ES>zW$Jw)0+bM0zH4IYH? z)2v_Kl-?UWFDYx>$yUg;LcSFWN4rwiB=-g->ghok70{FC-p}SyjP^-?)Wid0( zuEJ|)u{xs3)ghXUs7sS!OW>*fRlR!`xF3JwJyU&D=X?fbQX>AKL581s5l&yORahw#Tkcrzq4T)rYhPW08%w zCXK=CtM_GDY>e#asJ_7J(poI7_FpPG_E&VoK|N#Ul|e>Yho{)@Kgn%^DoKeP11!RA zzIfXkiPlYyMcC~898y~ACQ1JECNQE)+37CX{wCA+^)BX?Rkz*gX}sDbs!cRe*Ap{4 z?_nRp`QX+2ym)N4Zt1SxA}YJ?>TNvYF>l=qLRat0lVl*53$<-6HLEZ`@^fndlmGawnT9->)uImLJiV5lfZ5tVBi%Q?`8u^~N{k&GLyCz)+9 zay>>PRE~x)*K82R&bs#XebUPBy-ao*p1$qUQ6ZzeGf3#2s5dW|t#-nw*a-_H8dN$Z z1MKX@vmkv~USRQS{Kg$+;DLF8#a(hEd1zkm&-f)^7yUohzpx!mR%k|Yt{Wt#GD$}V z(Tk2Zb|Yo@&%qcJ(zdu#Kp7gfvAIx zw_K)7a;~D{p%U-;AeXBD(r}T)M1L$Q$ZHB_G93**F*25*5=0=jWEu>uUk2NKewvoxK^6bes5~Lg#H!B)WLuzBH&aJ zth#ZA5I(e&fBb@iUsHtGI53+kg&m&$*2~5`pNM*wjO;rBBym-^AX(wuF|Tky!;;Zt zk+e2FNsrs%u&sj^OJ_xF-7XXLX_r5|ebIW!V(sUwkPOZD&EHA&(VE z&oyw8Agn@Yesl_ir^FOZ2h#YvfiERM@4_$h6S@K5OSmuE;V@J<8Fs!GmdlKnwS1L$ zp9@T%{M1;VKXYYWR3vX&DewFg6S@TsY5&5kTfU{m&Px5n^@>el-cs22AmKevJAHN5 zY6usyX^=OjqJX&yEWVf@&V2RCei+P@L((;TLQu4Ze$HYZH5v*C)Ot+L3kV_k40bBk z4Zfx&X8aqy$%u|*u7l=&;>Om{QFTJ7l4j;OhaA$Ic5cW&8k_4ekN=v+Xo_|g@I5VV zSIB5@y$$YcV4cEG=v)!)lG2YSBj#6^sq$%-KspSh-((V&7+{Uqi;cH1nuJfJ3*Ntv`72cDHuO*Z?_$o;eLJ9lq z6fCh<>Hx~PFaHu3%myHnl|#zp0N-gIvx^k63|T5=Sr?Fr(ofj^CaYV}6NV+HG?Y=h z)Z*Y95E0D@^yZrHgL&j%40L|Zs}prpmhi)yXv8#d55hB7V$d$+TB7|Bu?6sRJG$UG z<_o|c{F?)o&*e2$bh;*;U!jHeM@#!C!^qh{oCoBC19QoB6IlFldBfX?5WHckyy5R$ zJD4x)R^#VCAvL{H^LbazU#4q5?9>b_-pQ5J{sZ6UZddJF)3uZB20Fz(2%oEk^Vy^? zkG#PzV0eNYRQwT$zG!9_x028AIFlx;<6i(%`oT&@SRnec}#{ zsKoG^oD~x4y~CZL9+B0ispCtCbJ;E|jmlUS-#Lz5DE6 zCy4}bPTyjZB1g?nzNf+hWT!kTaJ-M-GEE&_e&IqzAdv(HA_gNJHaGp4wcZk$ZN7i4Vqz1m&K}d>_cQC*zKuYE1HaG_FXtg# zrOE^>nc0e7S~(vo5L=pnF~VntHL@K=tZH~UUHM>ni_cmPaD=v zG|>3~FBfdHq!VXwE6Jcwlxh=;ERQua$jGMA#;g_K${dr=o$`h9@(&)O&h)rAB^?%EpjGb2*Fg3lHkb$NU#bC z)}{lC319kEngok{CL3QNZ!F>p;%j25WtwkYP-V?4X6k#aS0RG9?7@o>T*a@?;l~xg zznNnhnAyreXB}k9>QsfXb&noh#S|*V5@u?~Q!zQ$XLAjR!?MzVMIrZNi8Z>)cqVL4 zoMc_yT{3z@_O|Ukv_d%P!?Y6%nQkdU+seb7JY2SfxwUgvW$kuvj z&hp4Qh634=91wQ4cBGF@Qno6x+5XzXSBhkfFym8?OWw)_4!uGo;fba86T%$$wSq4P zUk_oL3(MD&-HtMI9{G^n6Lp57mDCV%g@z9O2<|X-|bmKX$5)*^$^cI--_mu$Dni5oTfKd`n*7kkF^7PIY zaC!Q^1%v3JZAmab-z?)%?Q)TgTVLh3$W_*7bbfU40}bI>Jq)p)spF&bRU285T;U_k z?MqqVcPP{)ae*xReA6a{%%X|dLT@4c3HRQM`#t@zTuZ*p(=vxHmCBO;f+LD1YJ9d< z<7Jk-qt%#bYc(pZXKby;r^rE+xP~lSt*0RG{Q@zv2Mn-Y9@Dim@Y5r$oh;--h`bla zR%<^ZsXy8tDqKXJI+q0?Rb@9Jpy$}Hspdl z9#U}e+$G}qFTWCvwe@E9B~1FnV(~XB%rZyT%P;jlVzaV3rn|Hdv)|vHA9(;!T#UOt z`I*KKI-LS!4W@VQ9m!){Qc^49?M#n%zb9J}l!eFD3~zjfFEK$>GG!d%A^+!x$zk-@fq{uGZw_}Z3iszdpq^7uEl$G zDc&pKN?er1^JRI7r`8*oHYh|%w}fCSAXQI7Nzi`W5?VK z|9IQ++?MM(f?}2WQbQpMz(W~J)D$y!PPw&8S+8}KpDx;_@vB75_58P4u%8CUB!3z4 zMPp}(Uh6R_JxA%hoO}5oKg;_9ovrXNWWyQeYZSn(Fv{neB~rJ}V~y^ArD;ueFlhCd z>0kRmPR;!^bW!-(x+i3sWIK(~-xp4IAqEURxMlHx;rUOa2- zF1niC@+nAAWykDD!3V6zVI;D{mwh6jSSgb%%;6IYbh9H<&#LuUYZOY>AI;gvDPNZx zlF21v>$i(+{dRAy!`yOt$b9Rb^uTZ7TF!bVqes(T8za!D}dA|?vb0p*_!F_Q-Kq{p4&cwzq* zfXt4WsdmNQaR33<`MxmHalNNN6J(fjZnwFSjLb=#n8&r%;IXp%H#K!#prE<%HXAe| zU&u2r$}<;H&j!tSt{7w$pxO0RKw~G50YZWvSa=d_^`rDre&)-gbHPQ-1-PP=SsSAC z_EAcGl69p@_2`aH*Mz(<5mGUjpNv7HZVzgN12x87Xg+mpYOr#Sy|^AzKWw`nb2VGI zlu!!f{nG*5tHPkc3e)VBNNSLi)g$FK@1&ZCkP>FmMZ7ycI1x`lFRs6-ev-w zp9GKCkt{G5QX+D%ERXZJPPA?_U#}tEBKDMywr!r)>9mL@arzqbbRBr%Ls!ndEUS8Z zylyj0%p#p>mveMLFtGS5G7}Q5C!q>twRd6|1B++L4Nk0(gEuzy*2}M)z9sBL5_Q{R ziH3EcSlxp$6W^;Vj#uPZb=zbE^B@CDR6po!Sm^Y%<_`F~?H065IDNM-G5tZF@S2Ox z1xVC2MJsd&(oNQvq?X(+OGdkD8zTdYH%iIiGc*E=f39L`@{Ex0$**JkZsi4@_O?wP zQdU)OFn{KZGRK}`we~1sJoubB$j^0e@N}-s8DjKGz8$e_kf{vi=<0b_+JTJl@6nwu zQOCPN`Gq8c9%EsxEYM zpTAi)iG7v2^2}O!#(X_J`fXe%+GO-mGq+V4kkEW4MnGUQpbB9?@>3?peDyt>0qq1d z^RpSuSIjqQMCAYS3uHiX`IQ{dhEf^OMl+eVp{*tIP>wkV{|gazV&8%@0QNy0f{S(p5K^)#EmqWg2c09Fskne z6aF_FX=hzy)U5b`Tv;2Hh4C3PAxFFY@dolv8X!hkN=V|e?uaR+o%pUi}_PD>r z>t>kaUHw0dYYOYk2rg{Y>W4+A-hV#tw{|9~3mvm@{hx{YXhC=InwXBT8R!n#W+%Oi zh1299bRFBb%2~0@*W64t(*&DI>6^c_Bt-=l?GPnHip!{dL>6_@KEiS@O!1i&u9OG0S7xD^vUik=AB7g)+qB*$@;t_E-^iWxEf@K`~;p zocEByTr9`%6Aer_(D@AS5oEZHcbS(dPV$}SxCS^Srto~Iw%ws@g!U3o>($7f1+brc zRKaS>Cni~tT}xchOHuo1^5CmvvND*_G$|R18C@VZQq1UV`IXaqwR~}cvn&-rGaHVy zJkmvHW9IF*xm72r*(xPfTMN0h?oi#a$Rd@DE62=I#ucVqc)FB}c2>h{lA03kZIXNT z23$b#J${!bvsIA|+;AX~YkvM|CEijNGn3->8oo#0Np(`2$eZ3ux=0wEZ-js{8$DHEKnAx8GW4>ilT3tZ8V;0evAC>;1M7c!@=y~F+@Px z6g3}Sz|vf*poM-TI79VeN{nOG1)~NvV;ILcew; z=cmz}>envkO5_wrVF`LPi9+lS9PwalVx#E-?yM$1;%4n5U-8G-p9C;oIzH~WLqU3{ZCZlQy+G##KX*Gji|(H zna`-l{9XiJv_{U$4z+5ktog;((SW&(`J7v2RZ5Jw?H)57_AlzKdRL|QIJ=P=Q{jT8Zj zL~IoKtNfD2Y9tr-?W=gbu6V};A#CydnT&&X_T2(pzbxSO^xe+x>lYM?d8e?qghCfc zYi*Td&HqT{xZt}7t#Wken_wR^+yW?e5@tYZ0&)u+tvrSl@G(5{*302VLMiXA3QJlf@ zjV&L`2;w9rxsim-pRb1gcF*J}0Ux=M7`K+zx=N)7>`xxAOi3nqLuU9>5B3j#1PTrP zEs^o5e|W?Ru}=Gk&%8iEXn6&c@UGCsm5G+cGAKR!1Zt}5enqE#8^ zz+hDwR4QPVF(+eI&H9JaW0y)}x&$JRx=L;61MlVt!x6FCV}80wJI(}-qCfuTEOY!u zJE`@Q#w7gixgg!Lv|-PeJ)Udq=l`eUaU9^C@rVz+dHnqJThrrN=_*Z*hxz=`gw%Yd zll35Eq8W5anB>1+^IbdtwFv9|qsmD2(ebp9Z9Sq~sDIRat=(P=Th&iHuD9d&3awqL z%HfWM3xe0emRK82cGdX81?Z5M&SnTa<=IB_v~`aww2J6$4} z*~r1Fc9tkjsIyc84=;c9@;J$C^0Vy0}7064zHmaU3};R&Tw=1eRVBHG8Y}vfT?!5m05D1r`H!iLoN2#tKRFA<&~)yZ@TF>frjHbi}6rKTY?a{aFTmNakaBi&yyRxSrE0XJrud zg)&JUGLcnEp`IM}73dTn^A5Edcv=q?5?nMz>d9^NPl>17X+q+M3S#(FCnjeRwS5C2 z-VC)=b{FIb`(pYjB6lMg+W-S@y{fv+_D0P`5)w{Tc_znv`PzN<(~$OvN@NFpiWKXt zg2pqBdkCU8b05K+@|%~p3FW`Qt*>f5dk9@sYgk60XW8~0A@ArGY1z{~QE3psl5+-1 zg=0x#>*1bzn$CnmFl#ZB$o!4DB8`6;vzI*2{w>hA4BlTVGJI)$<`pwrBpno~J1iG; zU$m~3Q|l$S$tH?JQjA9*ml{MsV)5&yHkxZVCr$%kG7VhM+6P-W1dIM%c`*GerB@}= zzY^)6eZ~7C@@fgjDU=KCT8R~%Y^PnJct2fxb;ZzK3kkfIrTc@nJTre-*rA|%1jog@ z6xpDV2@88n_L*#{9AH@!ORb9w6W0?!CyUqWt#3$7tT5v$S-PYoE#YDl0~$VxJKpF@hmPGbod_QuJ&+iUTN%03pCw4>`ouDJfUPMYT%B>go4&j&D z0W-H)kHS#eLI?cz=F(^8+iy=%L{Ks0q9TnFWj zn0r5o=}_FhD~BM znqyF-SUbmT#aOvZww*LwAsPZAYNrbyuQl^OrS{tj2e2tm>y?KBRWU-k(yNF$p;!_{ zrt$eh_xSdAew$eIhCrfUVjHDX+M!5CccCc#Dg?F77fz?!`PS7TQAI&%Y&Vwk5IGoC zq};RwqT)PU6l*kF8sC?rICk-DX$mB`lGB^kcb#};it4b6+{!LiOHvM@!vz?pWr7_?-!*5rR?)&J z(KU$~6$Gf%H<~}6$yi@Njw|CLemzUU%LtR`AM(UYoD&Up`v+pbo=~6>G%0;tRc8NO zL0V1{OZtYoqS);We*&EY`S66VFmGSO$sXvV zDNz&q2_gk##ENO$fb2nnfjibRI|rE^aK^H=z}}aFy`W%feBVlsZ_$o*tPfWpT4!Vv z1<6TZPiOT!)0>mi1NRYKnr5FdhkbG{Y2C?!A5Bb}%}E+>@Q7)<_g&E&ZQ)ulE5l5G z<#mc3O)C&98DcbQZY)J(NqaFK*~TOM_n46rMShWNB;<(iF_)b!ui+)PvU*+H z0WV6n4st}z2)lKfs})w15nbjqFFi6pMD5hH@*%o#hkB0Hn>}MPdm$2*>70=41q`Lf z{Fa{bZW))?I+Cc*h)gRTNT-Ea+N#5&Sz&U*b82O42|m<7Ldx8I__(OPmfJvf_K3-V zh}8VNke(lQT?43Ki8D8^SvN$jiz@K@hQ5o^$9l^$Ac(j8EwnF{ZRi2s40MWOMf}k2 zl7XF0AzR%hIXLYEu5q?U*Tb{!NSTxj!zjvlN=#Z&ABj5oDNsa7Fbu&R-A$2sY(e_H z-{ac)ve>~x$O?tMpP@-y%C6KeOtWvB)_uglTtLnehLz%=bD_-A13?q(BLDgeLRp4` zs;M}YiV-3y^17w79@L6#7UfDrq{Kl7_`sx6#QY0)F-IBxBtv8;ajmD5uKH+tHricvm9aMyY!elc z2rnd*l(Vro4l-Y9cS>`RTsJQM`cQhL``O>JpTZkzrZ+y*hm6Jwg^%XTZr6+g#f11= zT%adSWtk1%7i*m!wUmv#wsdC5T==cM{qdQ_@tGy@nWgcWWr@ZLu{E(T4V(lenK)H9 zTe;?C+FCzxR@Q1I0}~g-XU<@hdKNJk+1mr6!I?G@eUnI@#6t54%Ot(h)*|UBX8TMfl2iRiRv{t#E1jI*tRt- zGn@09rU`Ye!{gx%9eLaKrPDW=FO;Fom59#jHO_XdHe13?D~Y&VSKnQ2WL5WXdP=Bo ze7e*4tVH#ODDRW@-^}6wE*ur!lw`o-%Cl>&n37w2I$r;PDk$xSaRfI_$on)rSu&E3 z9^3i`dWz~zQPXv`(((4TH$8#QiPUP&e@e!Y99De#8}YX7>cDZU7+N)QbPeN;Y4qqS zI{}MqHMfsrYf5CO-FDrkn3-+2&GQ6&c69q_OBxz`edyX;!gh!-o9K-;%?5s^{buQg zucK`h-H7x4=A5P$1?-*O)sIStx~o-VzP|b%kI9vQ{2dZQnr}^CMdwZI6lur|zDZ z`R-K;8E$1+t*eJeTE_?^h;Qv0-aH}MS?ifBAp>T`aeF!AE^PN=kXOap#A1;-qNbN# zClYeqG#`M)c=1THY7PKe=WB}ExM?<%4J}c3r~M2y4l%Fn))I3XspFVU^D+6>Cb>Pr zTtcw!>gSgZNI$)yAu%Vis$)kji)fL15y`6F-y+%*Z>vfymKeM-Tfy!c^C^04)lH5i zzAlAL74)&5HDLO`q@9kM$3HC-DCdpY{b%k&y0)elES>H(`DZiHxL|0T^ft@nG8jAd zzO_{FIvh1-j?P|pwe3wgy=3Y1@YvRn%q@v4er?}P)U8QE`z!%t!y1<68a-9)q|fT} zWiw|5I>j{!#i+dw&0RceZ?#&>czX_;tfItBZ=$Wjv>nSWMke^=ozh)hBdg9_c?V3Q zjr^G65Nh@OB6u^T>OGnhO`|y)KHxOHiw9cHv|1}^au|F(6E`}ZtA*e}NLT-L*}&;b z^T({4TqICPbZYk0{w~HVN9fv%@QT2h{ZE-c1Ya>>iA}9lEbsDzITVX&p?3P9^-1U^ zkqPxZ1MLP@UGNeOfEs%#$F^Sx4B^!h|2JQefJhv;^=#w8V2qF|UC2TSLhb@Pb7E1) zj*#jUs-o6QVr@;OO*9E{YS?Iw{0DwJ)qbHMooXM?*6atR<~X+SY>uU+b=>Nq=^T9K zF|>Aj#Kan(>NVddEnQ-{h8@Ms1{`oY)`>~Bi@IKGr*oBSp58=FRg%u0hmI2~T+&V--T$={*1hV=ik}k+! z#3jfEu{7gXn99{CGjoLl;x2w3YNE-XGK7E`FFyxByiy=u;evS3?Da_V_RI+?Nk+U< z+w--|fw;I!IFsTtdv_|hC)?nzB>zuS65JUXOWcbCp2_|sq{z)Q|xY$Rb z3+sYMoFMgy@ zXXT6ZgQ+3UDl31#HMClU5W&f`7EL89ktbCPAj;vFxGFP`dl3xziR>@hz_Ki}ZZzn? zWMDAJm(5ivu9a2TQ(rRw7=_qKoosGLlD9drSf7Ke6e(Fbc+bRYUt>IE-tg~5#D3$7 z5BkCI3ZYKS@$d)~%S1PS^h?si4`nCNxRrtM$e1DEAG9RcVWhR*^wTM8{aRbY)XgC= z0?_ptGloUMQN74MkY$KQe_~iQQ8d+biPbZOeuZWE@~wJD0OglcYcyUz^XQtO*@lXS z;DUSXghIjCm@ab{z3AB8Pdaz@^I<{b$q|3OS$(;p@r=%`m$inj=(sWa@M}lw_zF34 z?yFyro8h&$N0YmiE4&}1g2RG>fhTsWoOaM$=!$`x5P7$|#o;xlkfEmo z29pL6@Oe8EJ}ymL(g48(1D>m7U4Icc_{`&Y4$`TRA`H4{;BaIT4r-tvLNo;ojk5vc zOB>H-@r>F<#f4{kmKoxh-ebUM%}&XPKTA0WvJG@Xvi1kPac#OtWC z|wj-%df+Z;LKtV`@cF%8Td8rAp848>F;dq z?-UV1Gx2M*P7>>^NKgwqvs$*Cb@pFDE$uY$y)m=D?sSdAr5Cs0!8icjzC`a!guCuKbe%n8YbcRe?&Kc&jbHG_*`Wx+}z7?T5>st2Q0_`od5wI&;9q{F#~Pt0DMXD zmqHgw{r`%;nExJp*oF^;&zFnRo@g$QsD%Hd@ zb|BRhN`sQusw`kN1)h+d8~JG?O6*PWML7^k45kAbb64skIk$46%sNR5Pyb8P{ddz! zpCh#IQ5mE&w~+G?TgQyhZ}r^^l3+}ZU}rD?jdxYc`#^{~bjO#H=-FqjT{&c_(}C3f z;j|_f6w@JM>Q^-@wSPd286gtE;(GR;?6@_N-02*CB)i?y*R~vCiAXss^?v(2Hida- z?o=7U=SJwaoeu?jF3_B#7OU({@Ag0DWg-fY@S9A>OX`vtdAfq95Q&?}zqVM5?E7CM zsW@7Mh&h+%nxYk`92eUfo{sY-^GNXiO8(BvT`ga1hT~Z}3j@2>d7Sp@(h>Td?3HY( z=ZK7B=DdU!iQR_w>CKJg&jd|aA7rC>5kZWN zUxL7gh8?l`bHTi|fGJVEIU2uLcKhZs4|_7)^6`1~$LrpRw;Fbder#yEjAXBlDlgk= z+cG>KIrQBG$i)NL<%ei5Yj`_RWQ{?Y3=`FFa9)LUo;Ot+UM2$w#3za)#JCK@k4oHjSx$UdSVUrLabmwJcI^p^=I#sw2+v|2lYzy3(Q}mJH)RxrCi9IKghwD zev;rEk(ii0xTUCAT+Wu+6`M%MdawDjhEIvkKg+7y!1;XJ$Aj>;!n{lMS#4|9VYaT_+Q1E_(s1x`bv*nz?!!f0#ofH}KhvvWFX_%j_AR z&i=7H(qDG8b&1)a`jM!)dWx+Ns&;p3Y}@9*;zb~wcE5FtzT%*FsXW9;Hx2Kh)uLS< z4A|zN+0uZPdN=DL-nN6L^D%EAflNlxHbt8rc@QGJ_e(N&zSR{EfZ?lsLjo|JjMaJQIp?AGSIV*=TpG)h1zsL(EB%`fb=?EfVErS|tR(_Qti$wu}l@Z|UEjdVs}t!nrO^yq`>#va-vt zjbf?BqPkBp*H>WvE$K>Z7zLoa7>hHaxB=1LpE5vz)pHZj>_ad&x*cTz54XCgpF zRxo_PUQEAAP}r7IR-<4)(!#(^1$ZajkZkRhNzh}T7qe2@wNC*8{CAbR@Na*fZ88I7 z;C39LNmqpx0;W?O@f7|*Kvv9R+MEX;)^0znjjKL42yS3tBzoz9>cDaWj~7R zWjd5}h==GD6luQ3#FJ~JpW}QV^ve;XE++-Xe`1Ae{Qd!+ODWer0I=d=8tH!pW&DwP z$YnSUT5%c-trZ~2w7t^tqJ7>t({~zkCT^_-&N7tzFbXxPENF{wxGdH=sMIK#V;^EH zZxd^I`o8$6$T^JK37y?rMFvM$ENIS-T1(oYOi?*b%^!H8i$q0huUOorjpB?VUU>a@ z;a%*teyfIxW5rP66`z&FL@`|yVY(oeLC;1&ve4|U_OaB|Jy1z{Cp{4 zL3a|4?;&npF7O39B@>&BR)HniQUtQDF>?YhFac6w$~^d_?PioT9&a@27N zFHIDVUfgwkuDM8VP9o8K{BXMt_w>eD`jlT@*~1$lnW4qcUq8YeBjxyf~leO5~MM zbw1e%X(Ju?enyO&;(U3>;nq!x)F7gD4$p0}Zjs;MtiMs$sZZ8vuI^G;sw`1yR^ud) zs>M0zpruQoQBvOBG9qeLU8JHbeIo#es0Kb|d@9V{_6=RlgJ)SWdT_B|H1zQ=F8{O) zYfzFsJNe1BeMk9!2>kMx2hrp*piq|eM2`$xOc@6+AM&8by0y!O*N|z(UIO!Mt;}hs ztJ`sk>CeRYkqTGZz&!gTrpAZA*%Witscg0Lq@!b=kKZDansrqC8^RkT3GvNcT$Dc} z60Ck_#LkKk4WvQ$hY`gVTj+rij_&AEflAGRtN zWIli4d{87$F~o})X;sd3wWrvU7A~0|t8$L({vh))_nTbzAI-{mSf8Kmxx4iUR^`RE@;lJ>%_t1w2svIeNUCzh+=il07&WwAsd>FfDr8e`VyWr2!pDaDDC> zwCXW4eyJixIE&pMLOLm5z_G9_nu6hBSc*41@dhv9*@JXZXJxr4f5*Vn>vgCi6sIl z{7z+(%;h(#UWOj2En@u=nXD|P%5P6qmU-+cohqUkWutz+Pfuqq6p2t|<6%jJP1|W4 zPs3&cI3M|$P&oe()*E|R_)*VAyTR$O!CU3aAN-bl1$W*lUj>`KDPN(TcgR;^*Ei%V zyz=Yv6{*z1qROwyui_QA%U5aiZuu&kdz<5l6?h_eMSOJNiD>o}@mMxOR2&DNs4pJ# zfsXMQn}uLJ#@ST`aiSoip?Hiyz`}T}(29oRv9J}5#A6ZmXYp8(6)ld(iaA$19wWr7 zA|9(?KNpWxA{E7BRaUen9;>mUweeUj?y+&anAwKJCbP?k$EI4*Y4O-JD>^G4n`K33 z$78eE{>5WW$dB>Z94k6E9-C`LTjH@6D>^?On{P!I#A6Gr73}~rew+NYR&?sM{Iymr z)ob}{tyr$t^4D6iLa*howc-xFmcQ1DJM~)rS}X3+Yx!$ul8@iEQm$FJzS}S_=TK>xIpxk~?i{!5@(Zp|i*tvZesu`7sfmH2JH2PAiM&uA$8OqZnzA$JV635B>2A&KJ^(4~G zex3}?Om%0&C8X@nv6f262KCRf+C}bfk{;SZ1!FmGN@DIlNLrAw`HdVNxD1QM(n-g$ z^SKO`bXmGJ^(TVGKb%3LQzCq(zHiLdrI!|ptMhn?U%q(kRBy{?aApGW1jCF%UANYqrW`rVi!p(+s}Bc zwxBiL*M37G4i8U?P)srj1m+)e*+F8eK<9&6sDZwBr3!E5N?geC_ym_c=7kS%m8vuN zB?}15j$(y{oI;PbtRn4f4nT&-qR^3^Ue~kwYmp0Yf3G*^W@}Ct4o`>JLIj%iz7c5Jo&0>Q8?22(wTrC2W#0Hp5^ZbD zmM~|E%@2`}4-av?l28*iY_o3C_A5mk2*9SSx*Z)TAiZ~8(Dy^Gu~5n7$^kV;H*LOq zRFK-O8>nsdz}KEXy|u?`+hGsvUpcQP2bS|}+`mM$Z;PB4sqfmMO-37#r+4!7t^r^{ zL+NUuWr<@v*d8C7)|nsNA)Hoq504y!>Bwr^5HnxnC>E=sr{2t}RF&eGtwaLg{oE6u zz9CM0z=c}uW#2RqaoHl$h@CQHb>s=rDPqkbmga(jZjc9@`TOa6h#YAhPoPO|;s&oU zd(mH;ag>8axuVt_ZIzJNN45?L9A^FQle z54E-m?>P{Im4W8`9Y>FM`A#;k3yHgJU1#kLbiO3`G(p#d#M{|xLgZp%c4eXbBvtqj zSK^It{V};JT2FIGLS0XCK1B{4X-g%jMdkzU#zfsF^M06T8`eCQU2koKZkQjQs!xi3 zpJX}0h7t{%&>|{L>Cz>1&>N$UHWR#dA)4!$`PQd(XVf=0(eMawGFA3#yg<3S$7;7x zPDE{=-9=|-Cb4rjDPKexr!=nh(c$%hhuCg!7~VsVX7x>3J?Tk7o$2eq8}oCz3&xC1 z)UAqvG3E%n`*~K~!w15YRf0`sDkmA(tqsBy7Ve8?dO7=53FhRVjW5r;@n!OX@P&O; zU5_G6*`&fi=befk!SZJUoe3_-)_4P*omv)>vack|=5isl(fVV&Zl9T0`& zpF;`tA#W&E%;rak!NzQ*cd}Yo#j8vgWlj%e^}ok7K<1WJzr^HU^i+ECSMzpz@*mO3 z581uWx9V0NX!0Ln^7G7Pyu@y8=*gcoHa+>wzr$Z8ON3wc&asZJeMD+KgrkjU0`0Of zT@>9eMalYp__0*)U5+Q(nCJC!5toDRlm0k)pGe6~b z4ou_6Xs)f~v1}nab){|!c4(4<1v(|ird3@E%2t@O3x!VMa3MO}~ zw(zno!$WFvSQj_#6U46DY+n4a1p90zTkRwDw3lnv+=>4|6Nic=#B_P#RLO1X5tRLc z-Gw~G*W26aYoeNz0M+6=pQu(7su}kKK|nm=7h2VoQF9%r00KfIIc$n1!gdq+(8z|; zB>x|ZMq2d?5_LsvQBc|{owof84_@D+CgCED=_ACCUC)fxpA@ zO9qxqrk$VopgH%lwY}dFwo$!KIl`+UkLO8|Bq8pyjLct4g}?_EzeA6o6baG%#wq!W zln5U%&uB?&F=2Cp&Gjdy)+CboWUE_AJ@mUv&x7(Uo&HiE!H8YZa?h_csA}il;dIeNs1lSgm>a`?&p zT)O$ir>}M`vbm{6HYC4jZ4z&zGGP~s)__>?y3(?#$ScbQ$!db-F9bRlaXI!<}vjR7ZLtMvhZ=gfM+u-c{^`y)Y7%Djb42gq4=V+qM zW6oYi3dJY=azsR11u)DuZ?Dy`rC$Ygs`h!uwn=DX0~w;;1bVXF(bqYFle{%P9kS%* zomsSfgtR@0{BgbnxeD^VglsjGChEeEJ zGUFd42~TT@9r@)%v%n*|tIK38bkb{%r^?v2$#kraK&dHC$JP(nZqx}i43Wgdp@u$) zNFi7x+m~pf?h$ho2_*T3YxM}%@|nEb;aYMOrtBKJt9uF;uwIwPU|y}ACSI64K5=8r zTu)(=w#v7}uR8L=ga6y-|6JGnFC8@h&+K>p1(F{%|I&7P{s}r9YW@q|^B);B{||ih z{8Pm>|4zq-p8roCVE##RnK}O}hMND2o%uh;J^vKC=N~ySIM=oA3sTA*wKqo`&sDLE z2D@`A?opFeG5G9hzu`C!j+GZ65Vl+J!bUI5%6 z8GDN8bWwIpoGHwm0VHSLiBcRkKMm?JA7M$pEY-`r^^_Nx=LucJQbS23 z*F18ax~4?DcnE~lC3K?KIUvFn(@8*Q`fPYtOefKE8KWNHECr%6{tMHGiN|cNq^Rlm zcQ==rqd%bw9E-MBOge&`;N)@S!ysIatHbgBWUrO->h8dvsZO^UCHAVY_v??i{WWV+ zAkWm_;ZB~Wi}e12{#+FtGqQhufnR{W^GI~Y<}j?-kdr=d&EPJps_89Hra~im`y*|gUhq6 zhRu?*x^9c85vNPC+6jHX(u5Q*m`9FMnk74O0G_tV~XIb^`%)^UPm&ifyEv&i% zbdu6Qtls<>N+A6e1)C(0Ftp0+6Vs)G`R3MF$!j3{s5!-Yb_a6nc5V-EO%A0I40={a zUQppnw1DRC3=-ihL;pu=3p36hJlm5U2NJ?W>hzhL?m-CCRtE`TxOoMg3~n}loV+-- zBp2;y2dF7&Y4DZ=w_ryLxQ4As^=b~c*WHII0^i`$Rs{ZD3w3w>QmXJdt`c=!uHE&V zBSmx4qv_47H}GZ~{taEpJ&33UU7PB1LBHxQmHM~)2T1*IlHLck&gev44+nL|%qO3I zufO*nw5eMFQT)7^tkFP?l6o^rYKW03vA6}2Cerw4j&NaE{bZzZkYL#syMp3r(cLh{ zjqJP6PgJjrnxlC@yH!;z0 zXTAAd0WIWHZcAb(>_-?;cYj{`}$RoBn*iM6zV^+{8@8VD# z6AakiC8F8-)u~EOdcP^dY*-!b*kci%da5D;Th$(Ic!S+Ai*4Po8`d5F^&8Xsn&ph# z-tl+pj(^ADI@<`a%MY}qIvM*R=971^q_nj`OG*``rKccuX=;v?NFws+!yP-OLifL! zUSu6R%2F$A@*w?HTa#5i%X$q;9Ee{`PMuQg-|_0gcw1PBvifJ)MA^%7Qlk8Rnker~ z66L>h0YUDrj>@JlURS%ct|C!aY!l{p57S|1L%PP`5P%o`8gttSlAv%ZHzK*FJu&SU z+w{1jZL|2kH+0pTc^_9?N>p!&nz#O<#N8{zefGR@G$X{lK#6-H#QjX(E5v;Zu*)@X z|3n+ZR8*k28xrE)7Ph8K=8Fk^Bpkxu_yw~8W=wrYEp>;WEbmHGm+^_%h~TqYgTtlq z#qxAx%)EGty>qduN%c;qCgNVPnLyyBlOxQJi5;>Uw$vMonWTigKqbS*xsJA|h6+?f zO%=`XJXknmb?(cGg{4B^^8o)K0#7>s8TRN8k<$tepnnn?Invz!4X{yL9gK~W*>QdM zBwqg9)J&&dXa9UO@&BQa%2!LdgVC=2y4YCx>5rNx zWP2``w1@x^HQyb$U(cnk*!HL-4t_y#xe7{vVK8c5W8a=^p3^S0Lt|bs&r+P>ilRN> zIkCqdBYn5uuWcbr@W`#wlC&&$cW*;%W`40SJ=L zFSP5s=J&wx583r2X?PaMRJs4?OoWh`0B=%oav*FiQdf(vmc#7l)zw1l`_#M7T2yPd z@7$NBUGqgeNR@qmr2RaPrVmdLd|Om$-#^s8-<;(%o_fClPr-*#PX9A+Yc!86%pkt7 zvZ1gRN&R?% z{2c+GyWH|8WZDb)ZA8HQurF3#R}$zNV>w2e^b|@Yl=ZoXp?mV^yN_R)ZG5lP>>m5? zkK`rlzdw?fsQ>;*UZURnVP2v>wlm|O>jj(j-g9fo^@`2B$DiI=ot{EBi{<-MNbAFc z+Feg;P`JXlTv<5ufZEx8;QO|$_C{=Cv-355?-E9lv)Y@vMUJi3j(Tu@hE-c2)Ci~@ zrx=l3Y7OjrVzv%kh=p&*lh{=xM7nL*Bx2GM&oXOGX;KH)EK{>unb8MmT?&}{UO)k} zjbtae>|XkXgBPbab3J=TKDljuOC!_1zK(jk>pMFOX%L=9Nqu%q8T=pfU=9L-C+hZyj2-Y1S4A5!=KZG0?# zZA5%ru^FWd5o+q|=sU|eBUEBe z`_-W#E*c==vg*gfeeYAx+GFva$AaXZC^c6;iB42!zNBw!$TO{5$z-@o*ZCQ5#Bi@z z=LjB&-kELdl&Am(bIkoOayp>?WE~gdBn1Z*MrRV&XQHv#=stt^8mwY-8E1zS5&Ebd zOPp;3AA+u@zU_v7UKZ1Iv5LmZRsDNGRx>lAjFT2IbIfs|s+~h0*OoYAtA9&q>s^Gl zzTyKA%;H#O^&8>dAAuzjH=bkSJXC0FWxlH8I<;KEmMhF{&)Os(4F%w;0zNXuSrP)? zalkuRNS4N@tehS9S?>~xoa}NZGH}d^MOzd&zm}c$Pwr!w&~v)@>H^K9GN&s+mo;i; zQ9}FnY)S~4#z$#_R0J?xT8We2SB&d`uEh{*5II1Lbnc$Z_t81y`4Ep%vkjJNfu;=J zq(Fg0Wj4-!06YLFQCL~LSvviAp&1jAlHch!dw^dhZG+~_B$^+d|TchM&2V z$9+}SngPH1LH7Kt88$!T-u!$MYFR|sVvdFOPj^FCE)R0o<`gzq!!-)?;+_Lz!Z%(9 z`3=STZreRRLMIl=!+v3$9NJeu`S#F&HZwQ1hPb_mObi2OXkOdf4Z1yrTM{JmcK;)! zo(=15eUWobh-3FG2VlXChzPw?b#1`RdKK=-!KbDcnqO$n|F+FjSZVH9yMJh4Cv@FW zZmLhPdtxSp(AcKsfWt|%m=gL7CW{U27U+ZQwt~h!vY5pwKt+pMsD} zocSS=p)+(!DPx+x%Tszi)gDa;3{r{g+5{MF zV<`CcW5KRS&maC`8>KdLE-!^x+1`2aS6-A0x#s=6a2|)8aIl}imx0R`%-3)>Fr2rX z@#^@yfK}zOyN7NoqWjePX!+RLtAMvFX$orTI5sBwd*t&Trh!U2H=gmp;+2IrEC*t;v~t%yZucyVeCcHU0Tth?H>QIAmVl1bpBT0L&}D1Bu--$7^I9xqtZnUIsbEmHA z7q^kA3QvdPDqp3%6Sv!U7ULOc0h}>7T`4oVO{pa1F{;OZsV(FBY8Z$ zz1T%GvO#gP`KT?~{j#$<#Iof)EXgkQWBtXBvfX(Jb8=MD42xBaxYVVbzeD0ERBmZx zyj3NnFX@WK!o3hZFS@6h&+-TfuTv7 zmCU+)yZF;CG_f0~Q>(>zb;R8EDQ6%xPaBL1#wy0sfI0c6gc;UGqm1y&0V?PJoR`3% zj=bhY+{9D8HnFi1W5>8x!e9L=<5g_7qCA&ymv5fu6B+&8S|o}}12w8+hu*hiK-?$= zXQ$Whav>TBO!0P}Po6FP+#<;4LaDbElP7(`m}#d7HgupfZZ^r`uQ9eHv4MH3EY2ai zQ)s@g`rkuv3ypwssX zwbP-KC78|b2(&hLpvXvBHHy@0(cy>Ory)z)h{b3X3MbeZ?zLUmk7O?01iy{^XmeN- zp!{OWBNP&apvabo^ecr}EGRehQVveV9rH>DWTRVg{q$-aM+qAaB?@mD97jKk&88KQ z(k6>lDkUxie@h6u@JK+65ahMhg+MZi4v z6V0qg)EN+=y=txbqV|XFu}1Bc7HUhoP`)z@ZT2|klB9RzP(~98`TrlAMSS>=Od*KD z&L5iUJ5`*uyt~0IXk3W^oP0klJp?&+AMPc!kl=TtG~+yC zWtzXDq2Sq@2g=p%B_yH? zHe+&ra1XrmBAaZIzn_niX!7zBD84qHygX!%*-E~)Jkmq`d=s3*W{p?~6nV;vV7~P_ zEOc#bCCxOEE^3bX>%E!{ifq-^Y<528f4ZYL>(hMu=|A%+{a!ewG1h+AATLw<0;escTBuezvvRLDT2SADW%@~W0>-elP z<>J)5cwSy05uiWdTx+0475|ZCuzZxvKwsSKJq?T47aNzIp3gs0_ZsBMvVrJ^k6#^I%9gJYed9DcwG@*GEh-Z6_igL{fDN ztTrkdW2W&T4d45R14DyT&EV4gLvD=}5Iq!{UB9uYbm1mnV#q=~x0R0`I@2zf#a`Kb z6Q!N0FL#7&e&j57dbUMP zCtwlIR{`M1W84wzinW=d+d+_qr+|xT?u_v#%xbqB4r^;&4v}7YF6W83 z2$=(F3&24}>PApx>V!ydC?VUN2NATIcT!#^G(Uf2Cc+k+>e%bkoGQl`)C(UcxwO^n z`!Z@nST7ifd1|l1O3;_Io1&z(z$71*xS4#|YB=n!Df#d%_K74?l6mtt^)8cCFkNW(%vat71^l1=_qvyAyZ_{_p-NKlz~4xm??}E zk=tEvt-YlR3R4=o6U?m}4k)jtBrEigZsZP$ZW3)u*Sr&s@EhB`vLIrXf7fczVh?ZT zPAo<;OlgTS)v%K=^YwZTN$31GG5<}S-cXBQeQCgdbGlb$y0#+!O=Ng&oq%H7dHXwV zZI1+26(Ci5U@X&X>9k+cYX&A=rSU&}NN=(M+~uer{9 zTYD34KQX-KPVenXhqvXt-FRn!pu?=W88HI2Wx2IFLeKG)>G{}{Ga-k?bJFxn-DqbI zosI^fU-R38_%%MDDTV{4dFGsV*xsgQ#d6ZKo3?F4wLPcRoR)`^6<_8%4`^!oBJoix zb~I;+AEhZiI$2sD2Al`PCr0-nd64*&{qd0LxgLhZVwu4qa^qv-2iIlrXJxLYsg@OZ z{@ojCG|)Syow(24rQ_@`b;=AKFhAi$Y@$}dqMsZ(Bw58DsSzBzJrlRPKd03nXNOcC zIUbx@0N_|PrjxP8nPlTtM&J=lXqMY1GYM_Iv!aABdjuN-FTv`)Xf1xp^3LK>67Kyy zAbJWuP1CD?>{)sgv9Q6yzu-=4kZq?SPx)E5sZS2yvxg|Do-ZZGa@`T_;F5?o5fzGb zhCn#8C^;!7R8DPC@&YB|o+I(F9A=vllaEewB#`K=R_C%&4)I7KF`aV;s;DikPXgb6 z%;0;~9x2VTQjog)zOh-&HU-) z9Q0}l{WgY3n(w%eLQu~@wAj{?LOF_DSnF6j#CrMB(uXofiTzYV2mJ~ z6N@$@R;~xIxCf-HMaEnXkoHXTTKlreTy>Iv3J4`1nc1CdMZj|vG4f8n(79tMNFi}; z5Fs~)X8#Pk^W|YWPVR|UBB@0bX>z63|M0pk;rpM(VHygU(C+zJ{vG%p<#=%9-tDmQN#*VO zAwfpqkdYyic$U~PpZ7=q_wlywrE5RuJL?hDm#5QV8F z6NL%JQl96`D0gg_q|}1)>ZiLtLhvid*}CsppWqPN%VIZB(ge*f^MU(apM>PKIy_V! z=zG2E_!LvyV@TtjmVhFpK4qivy9cB=b!3^(Q6Fnwd3|M|E9T6Qw;L|Aiv03~Gq>D7 z3n5Fsulc{e4At@pL_L#4>`yJ%02y^p10D8M_y@laXYhN3e8O*n!bpGNzOUQUadu^Q z>Iq24v_4VMe(KA8--2a4@*wJY*xhXxIrVI|KY_jrPGq-PNaT!C@>^2It(o7|vtqIQ zqwCSw#oSWK6^oPe6Km$T^{lY2)AhJckMm!}lk*$b%&&oQMV%EDqdb!JG@K>blFJ}k0sv1UbjUE?Y99!sg7lVR7hkFf#g5sgwd6e24JkDANfR(8w z3Qd3RF9}WGA8&@URhjC|Xf9y9Vl$mQso<=+4P84&U@@s}#&xBMG{+yXI1{hf0IFIv zqq!kUw2jYT&tS+ie9K79MrzOfm2Fmflq$3J5sWu1pnz&4>9(hvw%S|0Qv0mz4R*Un z^S8d^Ha}BtTZ?Tg?EEhpdL6wHx=$pcPTeEz?|-NEnK0T7=M?!;L7Cq!6GY=K^ciFiDU0?Pd_OYsA`K5eApSnTy&QF&%&UFHYdwu zsx!|=`8JF4Iy3N)rKkj~dJbKw?K!|{pBMD?Tbj4kzk-82$-~bF8S~oer>~vNjq@nC z=(PACPAIRv*Nic5lDv(re+}EYO6NWEfqzGf0#rdQ2v(gD#dW^*N(@=$l0wSmY0)6> z34ZJN37Bs$Cvq_^eF}D43=6hioD?mQN)EG42-1=phN;n=^;O8i}sTaNm#-S(}}`5?b3%LT~uA`A*;4UXEsn$}$xqLtpr3JMwGX z&O$jkkW51bWoe|Y$&|PywfUI(a!-G-hm|`o-1iqGUWp2rYHBSW(_#fFMw!jiv>L5> z4S3;NVb{BGc1MAgOIc(x?;`FB-;vir(t&5C(}7P!#3z^p?Z}tHmz<7_`2qd0L)Hr! zvWhvbiZ{arY@~d95`gt%OCoFLA4y(WjFx*@tg>aU`D7a-iSTW8LgoEqwaO+Jlp(HM zS}r5tj0)D&90Q=0S31ZdTeWRQW!{Zz`B?F1wQ5_l!BZDKL#u zt3odyLz9H8@Qn>ew~M0As2Q*7uI+RlSA~V9+N&_cK$VWtO_yF<4r2u~7oNj9I?j{k zLXeu0Y^hbXRWizOk#Y$hE&(AOXNlf+QvYx7lMQhi3MS)X#T=Y&OUB#bJ!ysk+JjD0 zoO~)xbCh+3*sK?~CkY7KpyN8o=Y(>lNUL*I?Of-&M(5&&f_IZkLIqDRNOlI35sGDW zrK+@*y+z)X`a0*D+K-%_Bp`gcCHDe)e6K1^kKQsQO=QqxNO0=vrrPe~sxPbSo>+ZV zWB0h~>l(VTiVWu8lSg>j~in7mRc-L9vW{VY zx2pavCUP6}AAaPSDYK;6DC!kH5fA`VAXZ31$;Bl@J{+VmLrOMvU~KrtA-auwY6z1Wkvn<3xQhGETXCHJWU)FJ~xvVfS;_eAJzz!qdWqhR`UfFgWtQ2I*7E%`kG{Y zZL+>DS>KSXZ%o$5ll60w^=--e_T;RpWc@;N75MegpVgWEjHv%ltOPpKHGqU}eP+9e z(IpS*60%avXf^L@qYdZs+gB4SYLY8zlPl_yD;kn38j~yH$rW>wE83DP+LJ42on8&o zquXuQuxCQI^he-tZfeECcXpk$`L2bR=SR9uglaB~X|Ei2E-ck9PeB@+XTF0Q+wk>K zilS)Go`?=T@&!D3N-!oxfUTYNc=-FGDc~|wfcNpJO&ZjSAexgZ$kyOoP>Y0#T6A&% zj!gW^i)+K7{rIAfKhx`pgM?1saAoAhX{`^mbP z)SggY%&t;oA%Llrvr<*Cjgf`C3OQMO1N}!mmhZ=!lqd)-XLkpyuDcMKEw5`K`mf;& zk;z$zjMHn|J?}X9Liol7`rBK{-=58XIqwingl~L-*&V)rW#G7DB5>*5$HJvAtp$}; zV7I?O?1adA_fn|8;70f6`?`TmON{V#G9i)|`D?2MHQcwHQq;tHTceRFraEUvEuu|L zGh-LwmU=%)p+w+%IXn(c4)KgvMf?n$udiKXu}GT!kykb?k{$%(wXhFt71q+9{l^hL z(}L)Ic8rhXqNafqAJeZ=$z$H@BL8)1)8JL$(i^;@E{fPyTYCa`z~tRlG*~|-z;;Sb zIX5l?cVIM7d`u+#$hIwS@K?$*cg2H78Tb;Er|A{Xt0zzOSadSSH0t5rv#AMW>Fh{O zO&T06%15XvfAGGX;-K_z6)za<%PCIj!-|XRdvFE^X2Uykz8DFftS`n4ynpx?BY~9l zMd84oz-D$Et}p@?>9dddv4<1i#RwlPI&0lY>v>hop9dT0MECK=?+y*E+N$}?e&vnG zF_Gi>_fPzLD|}339KZj;zc29bL1sf>tp8u0f8qb;7x-8Ir@z7f)7t+=GxQ_Gdv3C38%I`gUijjd)+Tbu&jLM@#bZX+H!mF|-Mn#&M2e0Ck-bLnzysBO*L#5p4(cK2 zdhD9Ttn7*YD!v_hHdCmj zxVcrj;F%#YtRQSC{VuD6tQU7>)^C=cY|RwhBU>%iUwGg~ySFP7Y)*Y`#~~P8l$y`0 zfGyCI`YLBuZM@?U4H~Uo^|c@@;vp!@#O zlL?&rj&#y)_C8;#scxldUi(`vn?{YqeBOWbXGf+#nFWu9+v^JQRjcWv7B>ktbw!i) zRcq>N-0nG(66y@nkMk(~OSaa!eW489Vcer|w5aK=dS@tEVMUR&vE2$-S$lbb1UzqL z;29}?TZ6f5x78X^chKjk2zVy}SqafpY~rviF^(nwh|$}2?1-DwT)miw5tn{BTg-?- z#f&Zn$O9n^kUL%vTLWYlof=5-Qv`S0BM3wrAM44 zMNV62P*PO0kU>BdHlS=gQCBPpIc-Hy5gB2TP=aVCl5Li{mjunEy+cD+hVS3(ks+qS zB~scDO(h--Kk!6zlX->`Q2SY^Z`cU0dM~gNc6s||oNFhndT)qzHTe94gi5 zwscJk=97j*`d?ox^~pi_|6P{-Dw`mDe=%9FLj8q{`z&p{Hr|_sFOEv26SyE%ul5BQ z2B}z*wt4k6t3Xcsc|iba!7xLQv8%H58zc|O+WOa}X>tz4-xhCbH7^fhL{KWH#*Q(G zIl#nRAf~FIOMXib(0Yyy$&4c!CR(q?ypFMncJ~8qY;!Co=C$uz19_2*Oy!i0=bPUh zge0~GQL@KepI2h*JoZ~x{YvvZueIJuo=v9|n~uuyeUtfyTMi9xqSu5Y1?-9q5~f~VRJfWP~Q%FiV{^Sb>+?@2WiYCykdk) z(!56S`|CrIH1$_HEi4jOGLdy#oVu!9*Ab_1uB;-*@;VaN)%(okD{MsP%jlIt<41b- zl;|{v^Ge()Y|;sj9T=DDgHwloUi!lLh&(}(7x=wPpDCEzJlnJj1rvL=;_~<pb{>ZNp5+FObIja!Da`yi@Y(<|plp=xzZAw~eO&f(5mQTy zzjg63U%!NNxR;i96o8SaS^6Mz7=mJ*WZ&y7Ey6#h)%kqH!I%5hKk`o8u;G1V=qd?6 zu;lpg1DN5cjdh=GVX5}UE9PvBzmFAT5jwd;$<{V!r^^6mwG)vIjjXn7iDa8pxMpS{ z!}YYe<1BtIvAr!J5_e9fm!WUY=92hPi4nrp}EGY)$NODO$**Pak2Cs(p0c+5^ z)grreoX6fZ?NQcVX=)$qZ5g*@_X;0b zF*9qUJpfj2J~Yc^M4C`=er3~Cgl4-Q=yZ$?cw3%E`Dvd3<;+E`s_r0{v<{xaC5@h% zGv*cwZ_HgN?ACtdWRlFk;TZ^Q zv){fvi~j3|S@qjoK0Wp2s*}qR@WOqHqz7T)cW}}=&uJf)-TCwN)^Q(FC^PpyWIeJP zn~dQKnrYWKbj2DmrQX4c4^OJG`dsWH9L{f?M!XDOIlRJYL5Bcq5G0rBc7M2cCYbIB znlpD<{*08Qr4x++9v_?OU5wUk=4S1=?ePP6d}sd8-Gc-co(}*;^n0Z6{)Iz1+4~}!j4qV4NI`wscT^Oj|-xX!5lr&*V zzv3+hinAiDPtE4cmt3nF-HfxvtmI!6|7y%+UWlwHRsDGPN6e+PY{{jx8ZU`4=6vo+ z##*YAkWrc}o%-^?mt-Fd4E~1i8n%tmXy$>0iV zvso+Ja0x2wmF?2-`~JL5tE9K`|LYIr-g6RkFKj@q1k3^sD=P?5rnvPti<|oqdcZf0 zGc2He+dlukDc;KGG8+WUJsP@gtn^vmn}2`n9nRZy{0qdj`}KDYivZX}g|g}tNe9Qt zdnzlkmGuy$uxD$?#ze}BxJB_Iiic*y;Mq8tyBj1Vg)a9U(#W(3{B1118{rCAn;T2>a9slihc% z$7GAdWUu>%n5-9S3V4GyNa(69cf!I<`(O6ujFDI0bC|1FsX((|ZL5f!)jYDMHE2%b zt8|qIHt zszFk2vd(SD-%FC4?5Q<8ItY+-b|vz+v(j|Y=}sD3XkI#)Zfp$Xn~;)uj`jDMb5p=M zuLiP=Em*^nKJ-#Y-fYJVy~IBMZs?hx#TY&LsiaKn(BumDN7~hnQ_NpC!7Vq%R?=?p z>a#k6Q=gE025LG@aEA3UQU3~^oyvyO3;?U# zeMhXxe2`E^Fbck}^0pTEpV3GI4*AMI)GV9I|U!Y>pR5}}f<_|G1 zVqiq=GHc)Z#i60_{qz9e5?ZoA#Rre4P+6wXQxp;i{*zP8FZ5*g5%AsOstc z6^EFF-IL8}GGn0;aO1jAGO7&sB9Jp@+I?1UNHO_go88aYVji*OL!VLuGa1(N17%8) z2xYG1hp#&khmq$ft;wO2U3c;;A98mF@D5)c)xaxDwf2=rk5`Q5dakrt=JjSS-7mLt z#p|A}5zCo)r-_iWkT%A;&}|<3R9d%LYMmsQ?;En`du7JHVM8`#ZLS;K$<7S1XOY_> znmLGV0aJ$4Iy^X$JGD=uDU=T%hCC8Z_PmZZoBKbQnb)`_p8Yyh)EHZA#hUcAR(AA8 zvJ75yT$xbaV;KW zl?P-8Esup4e{>74>tHyYZguiOYsUmUIDj=5VrdG@!5vu;bG$YM6Z9eGw}xhQRv6S? zs8r)F)N_EEOajmbkJ3;xZQQ3_uECWNXc$JT70{}J+VyO$%{pAo3I!rq>zy~v?CSkP zxvn{O{c8Hop1(#S_7p;~v$Gkeo;PXNT2;QMH|End5UVzv{cd6%^PBhYA6j4+L#Y~> z4`2J&^!hiV{ne3ztEj)Qa+y_dS;pJ*@Mef3a&_2QeK!|z^W-lry82h^xkj~r^(L@Fg2~FgooCSmof9J=%GMxFhJ*C?g6sXZ;fPaF}H`XSKKe{qxdve^>1h=NY!n zYq|CGY6qSBEZ6BcW$MchsaJ``h$@V4l$n(|!P`&zAm&psfthZ%<;|E~uy^keuC^rR zhjwr=k_(H@3CXYB1~Qx(!Q^TkUX#|E(41+_jMEzvi*q8$udP=(-1Jrpdv3X4x?J+d zLU;08LiL(&X(V8@;+?+L&=du}Tr*O zc3`ae!}fG#g%F{f1m!|dVqFNh34?_ydj||jNVrn(93}KQTMTvWSpf-Pa1fbfo zfI9SqH+(smnqXoXpo&HY>L@YwX1@#6n8aousK7{=dhClCO#Q$IDhE?x^TlmxOvwd$ zgyB0%OtpJJ6(+X(KyCiO2$(uE3#em#pmH!Z$-Mh`8Ys!JBLH=jnCd5rpoVX3Vy6$( z%8`Kj`pp?kE#K}9Uk;{@GgoAQI(B5BjuKO6dq5Q?cKJZnjs#RN3#c+5s2og9Hap=- z-V~Sq@E^z2Hy?K~H9oQ12dZ-Td(!f}z9&fk7HND{NPi|9PuL z0ooULf0r!}tlBCW*|l_J$Kuyg_P@Q)QhnH!akTfX=8vzixED5dvy5%C=Z_!!d-8+S z{zd&`^+{?*o7QW(7cg5s#_8Q_i_8<3Al*NcUdB6K{#(m9^2&M3((5;yt+X=C9(peK z7VbAw^A*S|My*yBGL=^&a_@qIqFQ)ZC&;;erZno{&1`PTH2RXQKV+gBEiAA5RJAA2flhJ z@vzeYN13Y-C~h*xdT_|nn1!mIt>rEx^#A2-&Hl*tMeP{i0maRVSng7H&(rS?*#x!- z&!rGlnRrLBX@B`$EfSKb8P!t3sH4NDr;eH!Y((E&i((eifcJ# z`#1l$@V0i4-pkyIju5P1Yz#9FHVvz_|I0ez+#JbgEXT!hJje?Y_y|vXR7nIQ{A%V{ zv`f7FrT?dAPRjqy{md&H-2IFtkB8L=o0ITdbJy428=7klKI{@`W`EH{qD7z^$xAfd zyxMQew4Xz)zQ2HM2@HL_X|DM!#zQEkSRizi^^X-u<|emgtTLsLNO2xm8Ap_%=Wcz^ z1{zM@Xz`)Bopu~>1H^dyxxZ%oH?y=E-gykGFXqyg|yT8hKEVvp|k4N8U^*w&u zLzCCDBbU-y^P~xvR>nIp$(jkvgda2!7qEb6mYLHo=d`J-KoTnlokj7cM9mF^DCFz% z#HJlwnZPDjxH9kj!n=5b3$$1YSlGv_Q6S4r?JwrCy_x3Dvh+BiSuil{e-obwmNF<>1b)nkcCpeC~&7J}-HXrM?{V9^eLxUutl@!i1XJS5c z(d_b$6_S-SnzGJNbgq+@JBTShYv}^-NF6K8azhz9h=p=k_3Z z#a`#3T|9NeFiw4&@W#%iZrHPDlFMI960>#Fw=ogUu))vxd#!?>>5e4R&$D~(KGbnq zvitc~=VNoEm3h%oKDos|($X!aIj@&wj?J?>PU}!cs=T2WQG|^#Ul+=%3&MQ^a0h3m zNp%Oz6>owYB~~OR7SQP-48-NQ3;;0BO4eNCJS z3d~XxbmqikBM))%3S*92k9pRXZ%WNuW4f-ef!Le%}5QsBvrZidW1=;b`VuPT!H7zSI2aK^j~B8Us*2a0;Z+b0Dw#vg%i{HJ>Ulx;J4m4<-y#E;Vy~ zKM5KEDLMVVHPbhkAFmQ7*T-kKrc!Y}ZAwkwMC*m-XLoUumtOZQ-)K|4ZD=-YXofaY zeTylGmq)jUcZ!Ym?a(0S8{ZOgc1)SMJqJ08M_2G<&p{=lUc;L1Oefa~LF~S%+RTgp z3|>;pxSWz&!rz=v-SBGQ2E%mthVfc#j#NL?Hbs?_&2f6bl-~a?8sF}#-Nw1IONPN>6y7Z&pB1yPo>&vw8?oV`PGEL`Jej;NVL}}gwGN?1uOlFo2k^ko7Nia zKACuP-J8r+YYAYd5OoBw>$`uyni@;(XTLl+hM%A25i5BtsD69;?!2z!d#>31o`=lo z8{(#VqeW)#%i-Q>@H02^8xWohgn&2hh{(vsW38b2nedfrS>NnDqgZcIfRa5<5$ATk zx^Kt^U)B&!o3~Mcl4<*q2W;DJushnktK7CZ{_nI2Zl6I6$ZpX5*vYi^DO$^IsMTx8 z1{S2DTDKvx*&TsAXkxLN=-%#j$jr*BKcD(Dop|?tml}U&>8Eujblfe{4Vq7I?Q|Q4 zpnf2XL0ZmC#G55-^zz%9m`;CumiH~|n#}`LK`CaG12ai>uS<5{mh8UWeA}(M=OJ+= zsZdj5MNQ^LugMmSm}!oc{FykG$E|2T&y1f1Ezj#^%GrKf7L+O9Kb*sv(^pvZ7r|$p zaO$h#aLMVfG^hGRlW}Nr<}TBEZ<-*-R8LoekUAs*`ZR4;F#Of&f6Bo6Rl(Y9UjCUy z&+Na|@KPr9O?_i339#mx-&A`w9X z@p$s0(;0!8>!}AMgv}M0V7N68>9NbT@71M!J;D6W#%fim&oQl0p{UJ$8 z>=&Ct7)_jO4j{>gIG)%LY8`skJqpAM+B7@8@~_$>^bONDiwyj2EBk^9yf<%;2{5#m zHBSBW{K&0&k|UR$XmeuWHY}44K5aI5E*3Z230qDluHAAalmlK{jtX=*K*b6;rK1(P z#r%q3p=h_+%m-5L!GI=NjLhIUGE4>^3Gu@FC^&72Vl3Ax=JI9*dunHCC+Lm$x{xrA zw^RD+h_lWfYHv21erm~M>gFqx?m2fPv?v0biiu~@!Q1!&+H%_~T+QRoDyg~$&%xMP zfqd`mRTI^J?*4jWVqok_^XI2=d1G^>&=rlWpjqE-qAGi~N=JoD=`E*Ni5GPNN3_@_ ztkr3qsZUJfF{dQT!Z&}H`@ylP4KY3wj$=Qkx`6yDYbns+^=ceDvs(6TbvSY~N@jFU zM-C(fk#$b4NG=JIwHoK-oO@?xc{9%lGRF4TiSKki5p?F{?IZ$isxfaT-^;k>H87r& zc*_XtvdbK}g&8f~#A5H&F{ZoXogpcYo(D4NZ_DB-*RpB`IUa9A4b@ovgpT=EL4~>J z+TFpP!1%7Dg3;|SJs2j^|IUBt%P?Oq{D;1b@a2-xeF@eUNd;JCns1f_7WBZMoS)91>muVbbvMon7NwSvEI~nNu2A)n--p*H^UP%jZqO{<^a( zH*iUba@c~LHJ0jNgfwyB|B+=@>j>>VI4kYVC!)q#>_E`kPL?_r_xT2=?9wNw=EwUa%(YV=# z)!KT^$NX)n7oyAeKTGdNyR!GA3v;!o-j38E=ow5n>dbhaANc^gYfEu+V$=Qp+QN)= z-Z=U{+vZS}uLFpu-+Dq3W_Fl&xoeVqD7%vN% z!F*Drs|+*F^-U;sofwvBu9wq#hTj}@t}&oO5U|YVsAIXg==FKjQGezQkmXTyTe=iw zM+-T~4i|>37lU>HT6>Fg7?%`Kof#^#$7e!1h@4)%qYBE|!0y~#!O!Yv1?NDSI~emq z@!2UxByKK#;9conL?$^9u+4I}JJog%sla=QZ<<`5POmvQ9 zg8z@FlR_m(25s>pug)?ZASrRDhvf^yblfAIcdDJ4)xT&?|9pKvROVc_8wN-+?w<=7 ztFdAhb2)7Oc3))Yt`gc+C^}SAEsn4LjFm~iovfT4y74Y|vL0p<2ycn{Tvc!GENDlW)2q1Q;J3>}k;I;MDK-gi2&lEuyYW=@=G~Xmx)MM<>r@{VPm& zr|T?(6j$Z^r#bsZk9}0o)rJCd?`eo|ExgoyJZR3IM-z&|QkE9nBne1xOZ#)^OHF+@ z$=_%K6E`S|Zsq926SX#0R5iNKSj+4Q%b5AxYFFf;~dtuLveTirg^4iOfyZ0(@MazzlX-p-vr<1N3xK<+y2p zCy^41RW#`QlCWeKrGtx(bB^V{#+Neh>$RSPOO zF|kQ}cDw2Q!69q0V0_CcP?Ko8+R7=laZ`c$TS&1h3-iayMx#i73L;B0Ymb5?mONT4 z2T$0K6)_PZ63Pjb2s$Tsd4`3Kp%!ck1Ak>^|B5)Ldw;GWdFS`xTeiIO>toP=7Tjw4 z(&`+Tn_blDmkj0U_5W`Dgl-tI@;knkTe-^R)a7MLAT%?Dev=6%`B^Gms$Q3aqe9H<0y%)u2C+^ncb+O%4Zr*Fqn<9M1Z=urA)e*<- zX_Gnkdlua(cMHv9<$=yn3=fnE6tBy@>*XP=w|0cV|G63bW2y0x&pvYmqYd?}1CWi2 z_*1?8^ZCveo`{jS-qrV6HOJ@2(m_4s{3-UDjzw|PaR;$5aa>7sg5D-`&c6#<$z7#* zTT3-USJv5Yn$73FYrAsKgn`v8Q`8VjEa9uT3D~bfxnFs@95c=Ps&pW(uLu^GSjkt- z=1D6n4ExHB=YrPV`|8XArCbKWP@>mDxGw$Gadc)S5Sj~4*gtenXaGx#Tm4#F{ihEv zSfYaC2Bhb*(BERAzwq#ae>$FmCk=dC1=aLA+w_U)f)T&zZ7O)$;B~fJx7l|8Y^4Wv zD_v^6N|g;FW>VLB+vrn=m->QAeQ59u+v1(J#UHq(yw<34oSCCiA08ZQF5v>DVwTi7 zpPNNc(jDK@ICbS30HLRIvLm$~asO*qqjDC#20L$4%f|vxm8q%MlnwW-1t*D(kbYv5 zCP}`Ao}dytP?IfUDchX9t|a-d#T`Rea?ZDf4!4>7i}w$i9}(fdXKOT$&;NEQ)ecxs z?qN>c@!4||+o`qHJPN8?&82r+YD73|425qvbBtZLs+!Dyf7=q`KvYizXohPD)GtkU zL476{)VUfyfhs^d6y2?A>T?{4uoCLO7F%GiOg05gQv(1WB4C98PV5FC7w8sy-Qt|F zLp|8rI`jfuJaoN!(-D|E^nzpPR6~C18?+m^(uv4Fz3;j1{ZqC)dmui$g}ginREb(X zXf?lMWLwQ=?Zhdy9kg4;D&jx8owEschi{%Av%OtN4R%cKtg~#id3K_cM;>NBCg@rc zn|ad0$&i-BYu=S@#o22ezd+)5ER_UD+@!nhWO%HwT5TH(_i0jO5kQ_xqF|zAC72-2 zk;a$XTHWr&Kr=L15b>l_Pb{kJ6KAJI7lNol0hVMt$g@=t%9`i4T6DFTd+$6n)MC!J z6R?!6NTn&-j@npT-NU0@J_d3sNtXh7eyv4}J>2_vF3^oshk}2$g&9I9%f+1q{XolH z9U)8HZM)SGXt8%YxWgsDextVs()Z<9iMKnCX*Y$#Kl`T&JN|EX?`POcr##9ADN3gV z^X#VPc+1>GIR_3~%}WR;t!9x$W0~#RS^c(aI!}KX0obl-Q8T}o<91Ctu&nX8it3

          RxFsQc@Ho&Lj5LuFy}-c6+-zx3@i1 zr#XE9PUH1AZl2|ki>Yw|iYGF?b-byuOpw^Aq0YNk>a?!rqJPOMKuR`DsSu!ngMs{*gVtZ_0Y3hv&w4;v*P?hR?U|5gvw zCWhKQq;Io3mBU(f&J=JX?bvDehiR^Z1elaTKEpD6ue68BR%f1~dDzwPObj-s=Au#4{v}$#ly)61 zk6OKD$092Tf6vz9EN{7C_Pz~lmNNFf9lFEb*Mx@P?0v;(T%G!TPHj=DVJBO#y|!R+ zs$rwO@l1j2wWKujO@Z3I5w|ZZDj@h;I43=xJ$vR1+n**pj2*NwT%yjUyX^UVg~*=_ zIwWa%raewLFn^WPzEj!@%yMN=^)fj?)v*~^$+IqcU?wu0iB9dj=EUkaiiVY020_O# zcN@WKr?&3P;^wXQ`AXQ%VMZ*XyIktC@q9LV{YvLCd^Sq`idrk;v%1mEVAL{8 z)c%BR@wk!$!VS^VV9yUFX*O{Iar$@1XL04280?wwNs&&_la>8|b{!xzF0Un#`|HuoJ_#i0h+* zVHWXl-wHOnc7Bw3^^Uw??ws17g&fGR;Zpqc&%uRT0k2hbPU&5j7(c=o!{W;&bt&T@Ln#H)i_`BA) zt*2q|xCm5@*0`;2MGdaK>8P0^z|}CHt;xp4s$%|^THfHZ0l1NC+;$0b?Pp!%wvMoS z#%(n&BX*8)8zZ)!^Z0Nh_EuhGGnQ3b<^C~@x0H#ud>-d4m$y7{H!(iaHtsr>%y!Sl z-3Ci*Fk>&XHtrhPxYtvgY~11rh32on%GkK|rrBKclN=j2{OSuCe$}(5GKX2QN%q$B zTzi95GT0k7XY394@Z@jU8#u~bzftyvIcIIO-Xv#j1phb}JO}@c7o-=-AAL4!k;Le5 z#zf6CY@s$ELtNGfb61@=!~XU{8J9(2^b2KN7KPC-lyS?CMmIgwb*<*3Untw$h4Puj z{z3_UvlhzH+b`ld>!bh^_2w*;RuauQ_ua!`?-A@5=V#lmj%2?$===tVD{R=Z;{L)Y zt6Z+HM1Or%oqgCiho5AtJSS40txC3zcN z*LjwapeBRoaA8Go&*8!f;E2%07(lG}jRC}yz7Ht`wh7eVgd=6jUUBGGAq=tNvHsK7)qKFcU!MI&rqThU{QNi{eNkb z7(To^jC0(9q3=|sz{7+Z{heIP-|vMuQ1P8Qt~&CP6NUqzeU~ZZ134xOf;;qf5vCp4O?b@aaTIt z(cTU345ce_x2KtW6YnlhOJPJ+%sNQoXJsWI6k!JyX>bxNH7XBsXv)`tl{#~fT?MuR zQ<-3*Oo{o%IJ^K_ikf*?F6)o^U4NOfv|d1|+>rt1zEdHh`VL$BUsrLgb3CM*{^6O4Xm1;3+Tz#q#**c;wbVik1h z?Jn|bu>}cuzLtTfDcdCApYQSFf!4a)aXT7HN?Vzels45`)ND?5jdwN}s52{cq!0&L z2Yomqml=Bv8Sre%z>~B2_Tj;U2V*xz!4;uYy*v_%gTu?G z{gb}3AdCKLbN!Rz{-P?kB(^*yB>!zfPZni{mj=wPkF%W5iB+U#Su$%ES(pN>tgz%d zaZRU$4@>a@y;$e(bUIHbAD{3uQY0GE3Q^xS=ShNivNfMap@(ISe^;w=F6?K2g?7hVX&1+LFuW{|11iWo| zfWR^v?!AiHkU0hz?)xY1#pZ;go$xEqVv9?SUV!Y7kT-Cy?#>xlpr63tce1J+&1Mf~ zSs_88Jz$a_x3*dNXb-J~4+gNzGmT8%$(TSCUMB9(({%h?#-O6f{rZw4eEnF|vzr|L zwa0qw5A?h{d*mC3$x{o54Skdup3ne$B%mX6v4DAjs3%t6!R_KabAQ!A7OzsLwa6)h zDx^|nd5bx}A?S8tH7>vmd-E3=VVnWNy-!mep|(F^&gT(P4ig%%sa&U)YuL-pjr5U< z6VgXXLMkJSQfJo(_~w1)n5=JxZf1}_6Bw*=3I-qK-vE?W+%g;EeO*s~k-6tQUWc$# zvn`XvGyyc0>!oR>0p?ky8j)mzXddp>0h(0WCnVfgs}UcGK0d4$Y5F)(chDKt)H%DH zH^dSbG5b|_(2+-LkjRPjA7BX_`3c->K5nLSL(i9}=hM^+Z4fW@6>_N5QO{8DL=(*_ z7*WCV2Y=)g4nEGmKdPn5H5g6kl3E*MPFYDDPvR4C{=Lsu+A#IyX122n%}v~68bBOR z5R9v|>mopo_5_By&m{<0Jb2@HttyPmN@pkBdHg$DxUTI!c@;5;11ncdcDC;g|NJAT zTwP?U@7y=Uwq#AMRfg)gjofLwY&Nen^6+{%9C6*_(ntfwg&883_M*+x8bY5ZEzIIf ziin-HIQs6aZ%%!g!7Qe03jn;5gB8s|1$R;WTGbL@7MIAi zHKNh5v$@zzC5Ic2>>3P$LYiv=MxIHY;`_h2qs%Prfl~Hj7=UM&(49H?jO95U#fj&Cu_%sEPf4pY=saZ0|%9iouqz+9Y^t-AI`A-=UEfVmU>XP?z^5^7bs%nxe$v#DgkW z!A9HLNG*hVr49Uqr41o*7BN?3(F zF1R-dlIJT4jc7kMZGI6CU)IAFBu5mkt5-yLv|W$Rao(Uw7+?1Z<^di|-Q3e3s$LSg z_BbdtPVMl4_wJEI1aHHy>QF#B!(*%?8Z(?Wcs1h4SD+Bt39$5u8nys^lkh*`q}P zx6$iHC>uJwtOaT22xS$;JhxsjRuUInB?A4|pJwE|7I&okD{#$w%WZ!@;`Vp1dv}rx z*6-ar+xr)<^Lu|!UUu)TygL31S@aeiw!T+*>pP)RfTy+v_E2KRF10}j6sRK}pZfA# z_(h%hvV&SSJH*zE>#blfqU#?U{4sm0Nb*)2W{d5~jU$EGB53FrHFp{Inu6g;F5hCu zz>BKjnr~}vIk&FWU!uD`pb19+D6{*xtT~pPud~c{e%YOVMee*Ud(@`y)O>qsc~<`` zTXNP9KcN2rT}4dik0p<{r`f5d*eQ)P&ODDysV~}cpnxN*SD(XyTu!}yd9|HL%n~c3 zeDKP5hcp37B$v&}H-A2eX6Qv3ZsK`nbs-dvw`CV>$!If`?5Qcdu-dJ~V&%?3BD2B=DmWspj;cMy)jt@z zI_Q)Q<~yePk6oqiEpZ5(oz*W~J4v_s4uRr}Q^gI{e}q|l1Hl0Sqtx6`$tD*KS){e8 zSxzP8bK~aBI}RdMxO=&>^nhqRk9iwR;Gb2WH6G|&vf+=W$+6t+!_>|F(_Pn<7Mtt+ z%H(u)BIeA>bYcaah|r0#K;7@mFD`ft-WI8TRK3yj6L|ho^-lFhw_$FdDfo5uWAx^! zUIuYiiTmPIUc8EgdTLg6)sI~p(QUqSzB8-1;F;=Q^VO~T3QxI~=2kg7l@cVs@&|6u z9~W25>G??c2f#vIc2@F|T&c!)`z93{K5F6KK8C7iNifiLy(Lp~!XXqCY#?}yFjgAq zT9H~2)531%O|{|+p5K7M2I->+Cnye@+YwD}+U0D6z$yY}#vUv$kbvrtz-G?j!GLm! z@Kk~jWj;8(%&|PMj#!z2o$uxF02jr64tr_D!vwUJxfI(ea)b>ka#IEL=3FC~jwRhW zH}O_CrsPe#2J_E;*$0IwGD>aWO>$c}942p*1E%}3F+Fm87BAxBqHo(JqEy0!MSa)h z7VRQ${QuU!Ytvzu7O;t!Jajg2$ZXMbQk?|lNl=@&*)$acZN4f`X z!01%Np;l9>=mvgZXb+!heZjVdtXW)@@!A}gio(~&|Ju38lJXQrUN{Z+zMm_RTii6j zDpNCUfPBaxE~+-qcUoM>^Hwe`rSM9grIw1ui_LWvmc~&b!$d*LWiE|>c@1SCb4%p# z+)oX#h!K=up@-Oi#?7ru?0Tg(X~yQM=C_Kk#COXiuxraVWXkw*;0CqG9N`s}P393k z+FxGlKE(+K2kxBOr@6KJl|aX(Ber7Y{-YO3IU<-D&&%ntBA4FX4gYbo=cLD@@ZwR8 z2j_x*EiUN|OE^6&V>B!N|iUZ7X)lF`U zDNbd`Nxa~Dr5;o zDtwpaBlwTf_yX}owCnxx!67k&GR}J9D7LxlVqnQj*2lQTS+TmltgD)*cnD|EU|-qQ z?u66@o{lv_pcV42hM+}0L_TERK{tV++;XnM5mc$clo;*?8r_Cwi8 z2jGurklaH{a7hl@jG2}Qc1ImI`oh`I^^eu;OnxqC{%6hpp@Hw=LIU1P<7UZQh-YqG ze9cTKkK}m2diOoK==S|YPh7Ki&z=gD`3=r1WRr59=W=25!+XD07@0a`zJD&lHIp>U zJp>v{gk~!#QI(9&n_`FDnpX1Dv$bNbd6UQ6+-Ai?G*|7cmIPTS|CYTO*(BVz4k?;OY&}I7$ot&*@+)uWwwZKE zn)*I4-dB0%vENx4wA6>#+{*)J+rWG^e>jSJZ*+A`ht;!mcs(6F7&u zW>F`4PFwQ~Z3`cdQ0}+x1C?@alFNa!G^$#j=qhzZUiM8@v*j9H8lQ{sOFN&P=oPv0OVTS5UZG)6&l&C^)x63T<2Q0gWh#WDrTY;dz$(=eA=?qX+* zh}l_XSxFiumZ2*2(}IbQyuov42lbVor)knX0ludkDjT^OjHKoUNh8Q6K{LK0Io5-u zfWB2|&yQLa?X->Vs3}CJC6bui;ND(QkvONlbpXY4z&X0p-s}($&tBlAV`WiK%Tw=9 zrn!XY6_=$raD#UHrV(b#E%yjYnV)8L96$B##NF;7NLRPSy1t+ihn+3L-|8Go$Zhg{ zkt14D@;)0u!o0P^9|JePbF*2x)(!*0=F=wjhUF>S`9cT*9c0(I{%x11NI^ns(Vjh> z&MV0cc1&HCvcbliX?|q=KL;b`tajMOOl-&^^#q^f6aH+2Z9Hy@d8u!9@J_q40^Z0c zsL7dGWKK8-ZqyQ*x;c&=GHS~xI(m>Y5q>*{;(p4F3yPc9TtNPpukIUaolR8=kUX`DV@+woGBn#~MtezSsGpEhKJ@pj z3h-ckE16y*g={(>3&F(FE?42c4{<*t7c9~Xp9=!nW-7`S#F4&9?8+!GPa5Oq`>zwD zU^~}c<_qI&m(;R+Y~rI7_^ATp<++KiE(Nul-|QwYg={z}k1oK^PAVT~Hb3c8jO)|L z(SB_0PD8Xqfpyx<_vUeD1Njm2ov#Ga_^HpOI3o{TR%%-EYd1h<9WnTvmlU~Bqb?W0 zve|L7;?s8K+YiO9+^Jcmz5UE0=DXE7d}I*1db%lfk$Abj7N3N7nA+^GnZItni&E{; zrib`C&gZ3^*Pvy6E)ey(&e-eoyd!^3>e>}*-_>7-@H|7GjXKp?p}g3|T$WE;QFP5X z^SZ(i^Te45MwVfJhK35O2_(T0vuC|`)A*3EZLAnN`1L#xnEQFfSqAhM)o~>zyF*3U zS~I|P=IdkA13VFpYDdcS2;LYur0@kb8#_HdJsQkSu8H)9BX1`4&I zY4^GvaSEHATQmbGF$d`iG@%lAkroGO^cT^Y6mSyD+vBGHUwyH>hAPz9MDrQK#|lXA z!FbcogMrhSUQS>@wkKX@N}tb5;A`-`Mq(aGlu=h8sSKAj$<81IT!iH9i=2}HFJ?Bp z?`=(7wK@qTRCrT?2!Kl?bDPZce@zpPBF|?<>Y!kmvnmQi^oP-iI!W=Hly~|PoVSsI z$4z`$%w25Q3OFI84qS#o_yRp;y_`m);ofIOk3-?U86d};rdOiIxuV7rx1gx8#vC&yO^wF_ zTa8PN%|fZwm(-byPfb(faf~*u7vbImj2oUz9zCX)DcC`m#@=137JihOnM^0faoY* zjsE~Fg5e*SD@#sD&y~p|%#{h49EQ890q>Wh}VtZ-k>Hn%4%8Eb`*8flr>hivF+T3~J;P6rt7eHu7S92m{V z&Jjca^gmz8NQyms{y*7I-ueahllKIf!V)-?6Ht^H4r$L*@ z%zko7^TV5w{Mb*nl;ia0iEa|vl!eq46geS$L9r*k#gW~d-dKzRaq}sMCCZagGeP%e z+ij>Dc%-2S$MG@>oBDraA=yO084JrM!Lqe+uDSH`oE>So{0_7meIdOYb!GN&-(z}m z_~?cEeyA7z2oBuNoy*{UMjQTaH1R%58Cp7};nHq&Hr)_PP;z;@QP+3CdmQJG7`Q!r zS9->;?E0xgC8{o9qC8+%`XPaF_^$MgB}dqm{?~KE>Uo|A1HW~5r53Ow?@IT~hS?j) zJ8M@O%-tTkyV6Jp1?{f1%-fYdjSrh!GJ98gcWgaf=~-SJ2(SKcu8@+ZtSH(tRM4~B zM!RlN;EoohJ!WNgwM6Z#%th?!v>pM8HQ{`zM8o^(Xy0>PWp*bk3wG&Tg7;_v=TxcW zm0FHUY*cGoOW4~Cv)T~2Qb*Q?TzgT%#q?-H zJ}^_F5-53;7174$(pSa z`O^%``9*08URE}Y`(^cux1~87Yj;yUN&9FBxeO01yRj}-$eK%ouAMjZS+t^3DV_Dj@?(0X`Q+9V`_LEuBEYd!m){uL-Ysf7z>n1Z8?0IF#)nU|$=+#<6 z&dRkk#k{2Z^37TjFiXjMA!IO`7ADid13u~;wp%4t@4QgY(vnDOY0x)!N}$a*C7b+7py2ps!_ur1 zJ!yIvdsAB9qE$3U*|LUed}WJA5?V&C1v=N3_!*ZXVsUfm6}wj6!Wa4vM4%^``(IgW z<#a;GRzU=D=a6K%eZPo*C8%WZZC<{<)9+>ETS7puU3Q+O9~Qk5Xo%eK3PQWVM%_gd z>tO!r2zbQPe?hTYY~FT3kbK>}RO0quS~jb*F}0Y}pd?NAo~>2pKbq2@!fixtW$M*; zc%4m5;l3~G32Wdm$K>uWWC&`l1!>rjhg|1?Py5aRwa3{BF5F0K>)PU5l#gcRN}e^- zYnQa5fNU{nPTpauD~9Z(2ZGa#;~CwsgOZ%U)4*jO5p!gHrlRM@#D6N9B zp6j6$LbL~a`h$aG_~X2!ff-@3DN8Rlk}E`d&vl)Y=GEo1^Z9>~_x>f9 zQnL+4Iral_uc$p%E*{1y>@je!?hkov9Cd67s49tjW`qSnvwi{e(LeB0qy%6rm4W4q z-y9fv2uuW$cU!vAjBPeI{@$hM`*;DBt>-6;-=Uy`oEO2{GHfmWNaR)w3$Kf{C09Y4 zT8=DfC##YP68|RKLNYD9eiLJRxM|`3nK^=73})k*7X0<$XqB%6FVLH+`K94r(UVJ= zW#*1ZT7t8#{V=?pBFoe4Te~JLBjHMpDANf{_GfXtnxRT^~p-RvcVc zBx|Oa7gj9G8@FPD;XPegQQ{if$tkb3|FGv%Wjlcs6 z)BJr9H?>jO?{$iV*t{}kmk;dg*o%0SrcN(ihU#?`h6e0AW3k~ z)-tpD;sZl#>SD)1=hi_=*adB)l7(*Kd+IyfGpT9;)cI(KL7vn_BQZQ6;~hdCRt#CXcmnc zHEPtgjU}bgL=8=>QL~U@7B*jeC_&l+Zjow=SwSTjSb|wEThU@`D=Mw1sHn7}Mx_`& zB#5XHQG_y=`i0N zsiicmEgu{Huk!KbcBgz)?LM}AG+>SVUGg!04&`HgBq1NuM*jaPA5DY%mXETY^6_gN zh0}xPlkwm`%g2v<7rPJ-{$G=ie5%I(LOxdGdW7SWkI$X*k?ph>v87=di}u>#OAI%u zKTLcfk%D5|HYp#)N`K_ce$0dr#A6g40E#P0@5ju%t^`Y^UKpb>(lSfF;H?LG|aVi8&Y zO}t~S{j&}~HS=Y=#4qpwTNqdw_o|5f#biZaj4`hi>_PJ_6ALcp3d|xI6)>~(V%)3e zt1EK=HwXktSJo9=aCAUZ8>tGvTqkFNqbpPcTmNg1?{f`@y+6Ju|3XLcZ=3L$c z(EsmB{?)QS(EmFm|9*}|PIDVrNM}3uGdH52R~cD=>Ay@oei5&l`2;J(x?~Z( zygQz^6GBsq?W4)uK9Xq~O=F~IegqiU;|2m`WoFELCT}N@+Nxjio-ymv%Yq_`PT0RY zW}+8@oRCC`ecB=L!P+~ief8QYAdnB3*xnL{aCmLuc)jP{XGr>r)(B}^r!5#@Nyrge z03$G6r!Dx(8ukC;vrW;O!y@O4Z{jEfS@z;Eh-y(0T5`8Oum*vn^1dHHKvV*qfH|2k zosQ%8jX)=Wk_+Dq-!!~N)cq34-XC>+6R!;U&OlE1V&sHl*L2(6T;TD9jS)uJ!<(DF zci92nrIcj&i8XO~M9pEt&$if4U`F-4K1W7*s#=qv2#^t2jx(F%?>1RQPqGe<@9;EV z{3LGR0q6W4Y~GD`_k{|?&2tj>827pIg3lss&w2%-(->=>4+`RPQ5?55nMrVvq--p} zq%7f9&!T{oC8@x398wKi%8`phKGR=5x(9Qe>!%W*mC!c>##LxJ+Yo4)}bG*tkrjj?36MnXQlpKkR6@!{@4-8oPrBN@j@3$=HYD znQ5hHMMmM<$U~6cjp8}lwSiVJmz&vXnT1E{hQU*6#gm@bS19HQcG4%hu^-Ed7!t*R z#47{;7>i!>Gi;H*Q;z3c6U$s7@zZ5kUk7;IEKX@h%yF5g2@y|y56AW&2s@Ni$?QpT_RsUbpYl=m$+$4)$$fwSLLPWfF zim{lE9T~B0H_aj!B3E_f&3Szdr4#I-bS!cWn+$Tb@>rY%xz2b*=6#V?L1R9bkUGFy zl1lpTc9-@f6*zze3JjHWIZqqlscy6Smi5|z8fzZ%S4%U$#cxO z;+NN3ouJdT1oMtdR6i^`QJf4v9m1QTChM3NqQzXM zd>JQ(g&v+~p?h)}uaL`(H0T1VP|9Tr`kH=x$F{`g z@+{Dd!guQWxANQ?q?Wl`N4ohhMlRE5 zD(B-o+ zbn)Q^R`IQ%IdWLuyZV>6r3w3M21mhtF?E-L%?mm$rtZqyHa!k!9tmc-nO|#IHP|c9 zagKftedFJQQ>Dd;w?MlFwnyN?_=;bZW~m}SORDK*emcD2XRTj)$}V|?T&?aiKKH6V2@2y z01@NU(?SqS936ONCIWb9WZ^o*a-&O~T!ujAy(xwFTBE)_?~So?6OJJN-ICL%p6|1Z8ye z6vYmDrz`Ap)Y*xfJ^NzC20V=V_r!4eYoOB@606^Xjq|JWE3u%0*@TN+_cXT5*_#v= z9iK?kzO$$J*wk6Xn?wELC{}N1?)L(O1@}qM@GXyYPQ<*h+{yG(m6!B-)X%jxIODiO z+CK%S3i)$1_v?NMF4s+wDyy!B-^a%SNIQC41otX_SNkf2dyC}vB)Ql|kf~g1>m_!8 zxw}D+y}B+@avq>4nV4$?3c$f|?pShgdNS9<-APyr`g036 z%=t80lMfvIG*CW)7{i2D1%^LA7AO+!t*ovn7TylP{^G**ut;lic>VPNvFnGJh29p` zY*DyKoG=|Cyc2Iyj6i;Q{6o~y(SV=Hh97-PTkteYY-<5%K8zpDZ%Z-I*1W^texK9d za_s$8=4s}|3tQ6`?B;@cHn!Whv+C7lK9>P zJhz#W1rFS`@be&rB9FeL0Kr^`aWWC0K^LUCjl-qJjeF$0iZmUJ=_ z85YH;yhM~^V;qHXGbK*z;qE@SOx@zgORcfOom8>ux*l7m)JG5CS{LY}^hLH2HLsIe z^;q-J4lLrr6Pa_hDQ&?gw3%ulh9BUIadj4-y=gsLk1sJlE*^a06RPUNU^=#-tIEaH z*QI*8-KegkTuz-F4VT&G6t;kl+O?PaqfA}6aSDV`iSQfP8-w5Y51#XD> zZ@@@@lP72SOA}a<#0p>mVu^97!nlv(?61SjrFKC(wi@9&*aSiG^jcfcpe01v*H8%E zP%Y8=$v}`K-kgdFDIO1xFzV}G-i+JL#goJ3p&}QDGRfIMvzWb#`lz`)c0bP`QyOr} zA1$sn@?lVXJ^@OwesU}T$76Xk?1_d`)isldB=l!R{l2I_8o22}ur6?|HCTKL@VU;;gZ;>a2=bwHJS`is{KA7nTO&pgub; z#HhF#m<&%}Aky5!jCy4T=hJ$tZw+GUbL?9K`o@hs_HCeO`h(p!K7=b-_Kl1khpMqM zKO%2FH~c}(7PQ=U(Z#}9;_+SNkXIkaYw@bdayVlQ8gbT zDSbT2TD!?V8G<{xTn7Wpa*N+y!C-)%Gi2oT5a-1{_fxM*j4rGm?4h+Wh#{NU4?z;o z&K^z->;i}fg4TkTy8BkLkuLNfL*?gnV_!)9&8@ot3LjnTNl9)NrY>aI=iH z5d!^$s^pmxa-9O#7lwtr=b4!wDuF?I2z%{F^zaZWdo||lOr71CUhA#ITy-H80_Q3o z-9ROQ`Rf$xSt`E7{JU@;`cBLy^;m4}Di|3=1y=B*QtdJX7JuMsQ#g!VNSZaj5V)ef*Yi2LhK^hFs zz+v$m%9?W1K?Zxt4PYWyR_eWY+i^c;EuMKY=7EzrwA6u5%7%6uk-m{)< z!50jVjG!2VwqckBVdG?!i#2Pd9M)<%v||?j)1LIk8tzFCgK`I+5GC=XX;KnV2Zm%2 z$|WwYe_U^>_BhBu3S+_bJ}U@;&eJS${$~(Ko^=6ySy)r$$*6;%I1@P7a2x3$JdoSN zM6%-#n)(gibJkUGSePDrvBW|Kxw7n!noUKX@8tr6`g2hE!wg?q26qIIv4r#~gME z!_Io8gflQm`_XtRTa|PR=18U|Lb~YsMPKECq>hlTw}w-To7eXP_vy;Sf_Kn|(rl#P z5dZV~6)dM-z#Ydlq-FTZB5=X7r-MePT3by)zOKv;7tzCC$B~B#BRiT4yLvoh602#S zWaXl=H8SVYP)Sm-Q^tu2uv1{INk=8f!J`!z*U2^QaRs!XAHTe_*S8u2RE$2vyN*V z7RjjPa`DNYhz%!%*I$KPv&rx&2k~qQ z`HVv2@oXZ;4}Q8Dciwu3@zuKjbsHk(z|enpoZK-ew%o@zJfBx#H?H&!y^;r>4M!oI z^7$C1d+XItnctZabH58s;X^>CXdjQ{*HfeE!;BH`Xvr{Srh6b~xPoAq2PeQ5N2`XV zMn30`Jk;dOhY|W;WxOsPeeat%HindjZXSr*r$q-uXL*p*<1uguxf>}O*iV2jJemUc zZuAX zHiiHk?V;&a%YUYDXWjvh193PLHn!AH#<`jyC6~;afkbb|2Zs~Bw&8>Sp+znH6z?2> z)GqO@#`g*gEowtX7gK5niNF5FlG;V`O}Qu>4W_M>ugR)vG<=2_dIgMIr47g>#&1~K zz;2*k_RMd7vGQ$rUebmETPQ)KB{*6QH?*T=fQ@k4Y zj?I&7L@*?B{HvTf{&nEgB9xapaJ3AJ#*Br?{B!q%TR09m2t~6Q0L=8K$`_uP#i=Fo zMTNMxOlJC*Fw_5EZE}9-MhO7Z(Na<_?tf9u4;SOnF*5y`x1lrrM`mIourmE0KoOPc zzY!2Y@dLcHGW}QK9W(v+;El}m|KWZt1ss|Fcy}1@rjtMI0CxAz^e?K`nf|-*Hc346 zJuB0HIV+Qy{xk5VpNMRcA;cm4V5UE1n6k^41H?kuF8Cq)3_&Y6UiO0pEK8#YQ3J>@ zMV=_81!Vf0o|3Y*1V zctA~4Z{V*Af8+5t5r32MHwAwoBg~9{mF|B!dvZ1`u}r4>V@DQW)0ytyPaJ_Jk%`s$ z`k?WA$u z<$xo{!3=VM1_!<_zz6@EhRL-~oR872OPm1ODwUS!1GnvMp!QE@~Ju5XCDg2g%y#y$v4?@V4bY(&Wb?W|7zB(0Skkd8K zlh|1|uyCpT1yP%ex5(ztNn22=MeVl$6F2bj9Tc+~7JmmqRwOE3hmw}=;u%zgRI_Pf z_fu-gqbTALVk+ON+$o;Mm}8mg^)sMW(Z8I_ONA~Q38{UQ(>3|#nx;ZW)}huijFVj z)QYN5t-!-%XTBBlO0vq}qv>Ozj`6vM4H0SAL8GqrZNv}M z-wb4tjb&p+!9?jU@nMQ*M!l;^XW1`a0`N`dYlxFTDcZIW_c`Ta#p8|zHI4Zc;oq$l zhU_sE29>l&FRYjN8t|(^EL4k1wK~?T5H>>G@PJ&pOB)RXXgi*9zlV)+i&66v)+^ss zi1%=<4hU0#*T=Iub|b}AiBq4e0t_;2YF4aPy1W+Ix(_lc!( zzGG=zjERoNA4zuz3Kd}XF2e5&bcIXfTIbT(vsk0-y&k?FGq?5XsP*vXpC0FWI0x&@ z-y-Y6wx|Bj>tVU>Meq7FsN{N>6!M6(Q0sqQ4-=N_;XJgn1Bn`1b(Y!d;S#wX?xAC~ z4RC>8442u9VJvbmBsFYeC0uN+gO`F2;(u^}7}WR!lrLy7Y9LOMl)yn^^PQFiE|PDc z(0JLPq%T5g};Y(JceZ)kiv&Z|WKq2`N$g8xA|BBcBL z6-qgBt%2o)%9)<1bEdJAKSgH?9;(B{Ez_kNP+p}=zbsR#J@B|5PtNogBe1suQm$e< z#L2IKP?i_7KrF9-SNCBURdN@lMD5vUieG&o_w3p9|D4h+J19oo158!GMB_`Z%*E6{ zX%))tda8yLk=zbjd$nAk8{K%SO3x`(+bYGOeC4*Gg(NQhtrSl5P2H|65bMYtl`b_mLga>q{RebHs`1m{DPt5bD_{lKAYjN@F$=M0|oz?0o_!J&*` zIkb5({z}AnKlBY=!EhWb&={vFwLsE=-ESzQbb20{JE=PUf9IiopYP zmuwRceJ&F(t(6n<9Bo8N)=f_W$Mi7=K_GUC2XM|72b3O4q_fz)2>no|MKAkDZ{phH z`!9am3W{|0eI5qb=*4bc>MrcUYNQK# z3NnyU2s=28OLW6kVmBY5VBv@i+%)wLe?gWSZp(Gm6^?s(&eK@uV)-J*KFvD_IK>uVP1GihmgKsq`cF-++DQ=+hr-D$_u$c^#7XMo-!=Zihs>(SijPX1P&Fn&> zGqvJa516~5tmXYI^IEC>nnruXnbm+}M~5I7^QugQt@H<4d9(%klBq)EtrMe;KIX!? zH_i*w?KJU+zz7s^e8E5kZfXoVvnN0E8&ro-_F#s~{M&wvO@$7k$ zTi` z?v&L&Si#$!{O>y-4$MVjibwS$2;sv%d@7qf2aAb#xI)Bn?jRNu6S0^WPyYTJzZ>qz zb%hI|p(|b{msZV>NXdoUh*iB;pr_fWZ} zbgv3Q=>twmXZDDf&$iYXsH*@HohlanQKmoTl0r;>nokYR9Y;h%z^}&Dw-@DSoB^F<<^7VCj-=`_lp(BqBrV8mtXq1qsxh8o?h`BU(jt??+K0*-wV@% zHtwSojEngN9Le!*%=TlxoPqSWP;Ii;i^RJ9F#Z|SzyQQpSjD98Sc|~!S|l+<>-R*% zdy$}+3P)NqB*R7j2SN&xkr-B?_b~$-Tm8GF@4lwJsRr@NA7eoKQvsC%_vL+R4HVdj zom-H*ewTM9Vs$qM#i&yyv3rz7nIxGG`QIN&r(*MsYC*jg=wv7!Ki+5qtFu>vAZ~d=IxZ1cET#n623QOH{sx-oHLOnOX{qBrRvgw?+G- zd;!hMEOnFwwuiQ%o2avZlce*`%M+dgN?16FQ6!xOi4-*@zYwVte&Gbw!<;xto6}m4yanK0N zMnGN6U(o8$M?+n)-?JydXdpLQU9ibtvj02+Rjf3$@jvx>C9P<~)UXq%CgG4N@1ms-aj~1qTOBodp zo(XSyeM$IKBvEV@yB~FQ`^}3E$6;msOw0m|QC(6vmXpwQ{_y7-;T$7S5*!;@mn&|- zy#c7f)lgsLLgzR#;Z*Y%h!b&{$UaKoB??!YuOfIe^NSK0$Y$?qb52N|Eluks8V#;k4Qx>v#cpxqYQ9Bc~ z53*t}aQM=9LnO)KV-8`==P-7ROEIT2uiK5tD(rup4ldEljp3cPU?ZS`S~d>mQBFnd z1v#k?3nXOcYvF>JQFMMs=sMU>V_x|>9%;!m4k*h(_@20;XA+!`{Xt-d+C>S9 z{zIe=g?o#gMV|>MRq;}}^2duNJi+~>8Av?CcoUyL2KnIXSyI)pdd4FzRB^$_;u8(I)MNWM*ChCJKum_TATa8*N)#>-7dzXUg~AQ5 z-A{(p1&w>SLNb2O*;ZLz3Mm&8H2lPe_CWfL;}kwm@?t)L!Y-`|*o9m9h3w zz5x`qsK}XN=~U#?SUUBuL)lYIOwT@KjTg+aOYu~T3eHBnONz=pPEo1Ou88_E-<3&w z-ta{IrLh0|6$Z-cJmO?_!e43xg2PMQbwem2t1z=sLX4WCy3;GQ5-)UCc_FGq&nZ2d z(dX$dT$j$we`SU>)ECHkC|@l66Qrl76&9$)ER;8hvrwHQ2pe)U)hRbsJ=8x0(=pT; zLz#|hU5O#jJpL?~_}w}=Q9d{Rg4B2`MM*>2#=0ol0)Xl_z*2()2 zrt=`H$oQ?nHdVEFjBxM_6y8Ar`aOTu`DTxejmZ_aKX#DnDxGadZ)$n_v3-a6<;;cW zRhEu*Ag_a*4CQQ`*|8FJ`|vgke&7RQ6$FXm`zA0kw6m(3`lK3-xC}olLbBK77pvhl z-Lpl_mykWE6lVjH#0|K=)TAoME1yz4LGdY-7^rPb$}ldq2iMksA>GiSrd!c+?8b*>LotfCdIW^VvP%MFyDa&3zAH<-=>kj&7ArT?c)i zchdJ5`4$I3-}J;_=ZUSEF7f2wBz=q70Be3Ho#Zh}^6GGH?YPh)N#COrCbUdp{;wOw zp;9KNUQG5#xHJ!JJVg_qgN$6vm`s$ zDgvGY=LHf6E6Swf0t(Fie3HK9G)s>nuadh|afa2<49ixru2p3_?e*?KXZwyz-iE6N z7Rv_eWn!O_u^2gD$B;Mn=J#E|U_8S0p^bf@lq@ESOmWd$#kd@eB0u8U1m!MGz;==Zg=%!nCY- z>V5`pR11NhFn_UHDJ+%tFMiuRVIUa!at=U;iNE2M zV%+oi7TJ(m2^A|wcHyK7dWq(869Zp5nvDJ(&w^d=IoO4@$JL;9CfW64uq)`kYmm*Z zHn3}uX4hGoU8h*=N)=!G671^1D(U`mtXgb&|GASN-k$5rEQi8McRIk7havkV@T1-{ zF7`XF_$t7cT;aP4J;UM6?P653{1#c471@v_ituY(Y^_}VHx%McH{3zNO!{Nd^=z%o zGF;ICdeXY)cR&uUZYi@~8ycbQqfs6KXAff#*g1&%+ zggx_Gsh*6FF|cuKZ~P~)4!LvCF6v%7s1Ctn^g$-v9$71r!Wof0M+}~Sm@dyvz0&lmm}JwFwF$2i8RKIpkju!;_F_$De4vVe~F&S!Eu-!Y!BUWhw; z-q-nBIE_Ia*Fz82!a8W0AZpC)kDiI8u=ZmMrC~&CqMvvb^KoQt5J29UX~sgvzz4<3 z_#y7!#TJrptqb{9nmr54@QwckH%UkuK$$7x33M;Ekirn;gJf~(m3%-_$_Gi}eNu8^ zv-Q9wHWq;*Z=+cm6ajI`4RF}Qn6$V)DWVVcvibdoU)lP3UgruRN_fqd;g?f@RV=l& zaI#D!u7{9s`B!T_1k3l@v)}<^E{a}*gVkt1)>9)^!$FH1rB!e$JWDO8g8zv*`*G5X z`kkbWsI&!Z@#g3Ss4h*zm^<%?rGW+!4|1k!H*hzk^o4ja*ERK5N^AHv?z&rbsS2z| zvp_}ZvG|$gu88SqL@r|VcQO4I*bk~jdNkRqr}%vkDdpj_2+QHL$hQm)hOcY+p+ou} zXt?2>X}#c!Txg2FrDIsg1GkueMYmqEc(M|@2E?q=Pg2Bbzi}*C`eizn6AAm{GbjJ( z{YvnU-0aD}7Ch1X!&*6EEzOY~*j7jg8OY*U>JgnDQ%<@xaO~m;q z{$V_kH#inl_EA?uiHgkU55|$4M~~EW&ueUAh=&jWBp1rP6fh;Q5%R^p^{~NOg3YU* z>_-exuwveQ&}?G zP19m^3SUl8%*R1OAnEkfP}5U=G^<88YjL7kKj_gc_c5E5@_%Vo2e_e{^*~?E+5~?Q zskJQ8toQD9Qmg+lo7M0C(yS`otbU;tx>*C-Q?sxSIH-lFK!Li(th zfpQrt8Yn*M(SkwW-GYJQRX8*)iIG(YRn@?n$c+SJhDzR-FTXonmR+K<0h1Q-}frA63Vb-ql0lH&A9$Ak7R zg?3yhqc5z#NMJqrc(7h%H#WO3w5bWS>BociqkYzZ&+iNE3u|l|oN_#9BN}aTsHiWr zlM-l8Jsz|<8m)aBcNz5K6wE=BG1&#hfCSppdZJ|ps0{0wsAec^S?|HwK@fkV*J(|1 z2`|?Z7u;&k%;nB7h*WKX(Y*kx7*SexPCTNmc&KfX9}A2A%h7RB-NWF|ND@^g&Lu%c zvPdcA1Fk2yB*;h+KffFn6qil$*l!B(m`~kDovS2IO*!pM*m3rvC8MACUpRpD%7(@I zi>dJP;amEEWy6kmy_*)&dz{p?kQ#DzSHBv;8cI@Ul}!es2RO6nTnBnj40W4I{l zNs>&rBP&GSHZtf8Co!;s+X4GBL5$4)Vmx-)NtW**#?<|q7>N}Zc2&ICRq5rw0X?SO zZp#PKTYBwJO|+I-GAKdb3Xt%RDfi96$1%2$hY2pY3LaUFf29$hFTB|Kv7-^*rdt+K zHOh6XoyA9TKoC3Dr0sFFzq1~gVDtv1(;9cCr!82epU_LT4a)@HERYf8zIBoK*CHA= zJQ5@)_8eEB<*?ho27N-w;y1&9Ki3%V#?L89m^#ZiY#4kjp6pV?#?O0q5z9oMf0;Cq z_0|T86j&}i#6MtGM@(aO-Hq@A{X)FJpVEQ%G`<0#qt;fvpRX z8QPFe;;<3i{jxWquV{qL&E2nwmdIW|iMwA_-2J+=<6#oP*=1Nj?}%$-h~c2c#4e_w z-a42X*<&jZ?Up7SzP4%l8?#R=ouEXg-n1t-|`mDWjwkRdniFzUZ*=2)xKp;m(Ve%=Xk{|C2NIhpleD2lC@!&JvgN;@W_Thk z$fF;;(Hugcmu{xw+A~`O&!rJ*Ug- zF<+)S&pzT%MScISvFnR;dV9?e)_n}zD$a!HD zksFjLF8L$a9Fl{aNf@NXtWt8A)?bn4+^R) zgzpXX4e1S~?#M=Ycy9`10}rCbIN%|pbwnn|MUCaNk36WouIT&Rfj%{^+oJ|;Qhgsf>1@^Nv6-P7`((vhyEgZ_VS zYyUO#PoQm)=|=asR|b;iV{!0SJn4tow36{E#h5!0c^TQUk#6HHY%zJlXK`oCO$TCZ zjK_E%&v^fib;n6;L_W>;tYonPV=gi`hYEfKPNlp3pHf4$j>wTV(g;b@O(Qbo4gqhB zKAu`|KO@3tq-2byWOyMNXh=51LY?W4QJ3x*?66!B+AjYCeQr$9r-%9O)PFnG1u!(< z6`i7!Qlpc+y7{<`rD+nhRX)0!o*ZnNlq>46%O0In6`eFbI%#6-h{+spO_Qd?`;n48 z_2eX2XttiT<@3vs&9!-*Yf#$JHsz1Cm z54;((Z-bqqSz5zuM zP~^y&3MnDW6--Q@B~#+_X((FuJU@-NDe7V$@|ZMOIi4@UbKh;4Qg&~H+8B)kZ{70H zZLrTf7CBjystlDnX>n1;EI9KMF8rl~UM)apTYZ?!RK*U0l_5UsCfVz<&{CUVdr(X~ z^$$%jWyxr&Wk%;9W?J8tAzoZ5%jSY&WuO=doh1H(E`egDYDth^A%3^lqF7E3f2E`r z#=x!WJ;?9?5TF8HST9)uiV&xy)E2f=fsj(%nUIuv{#`2ADp;>1)`q$h3R|H~aWJ*q zGK|ix;=sghP#Bq@9SLvI&Y7uX%iHAto_+|gm=3G5GWc>C4VEVd?}PnPIrilce?5p_ z5T>$nF%Q1fv6RC-s2lTk74^g%_rzFuNsnOh0ig#Vd3e@Tf8qS}eh$lb`N`MJIxm zuhGSZ^La|8)s$Z@{{5+B6H43L19(lD#^y|gXj88(F4gtTB_BEqF(V^`PA;9$CXx5a z0qP*=pU|&u$z|krPZd2y3oVl7aM2d8$*O~p;H*2`ws|_f&EQqT>c-v~I5{tIk>)yR z@*Y_vvDze@A9J_2_{Z;s4-VagV@qHGiOwg{ZYcI3ewD;#<(EU3)`?s1#s*V?5prYL z&VWqkE1Ax!5bOW0`h%(d(%v<|mMB7|lN(nZ;ru5PD_Y#DRrmA4LpWG|JAUGv_nR3H zu^HbZuV+_dZ>vlgm&w&WuP^QZY9lZQrwSo7=b~sJ zD_WBq4d=wB_*}+q8OA^vi1P(Hc|@R-pQJ6w#gvIdlp60vCxnTIc`YgT@GE)nv`#f$oVI0+7cO0k@nr9t0TU!V_1YyDyGl?Q|5or5}#!>F{7-a3neH{uZ2izl0}gCl9a3QH+KkBX8>`lIytP zdO32zn_Cx z&BnSI5|WCG(&X|46Lm66`1eEuzG!`R;iluWo@5KcoyTW5#Tq>z3G#D75dRpzhrFN) z7tL6o?v^tEW6Xo%x>ZWo3{tvAP6q*3G@Q}ummbYcejL;MI9yh-K#Rf(93HX!m;2(c zN=;MKP9km$io39sgdU5Aak<8J#q5o);Weajz+Emv>UAtuh1RfBqK%EapFb;F8~Gvi z{;O|7@7Lr56T{;p8}h~G#;>u#?)Ql+?)jP}lN;k{3#f?__l>1Ba?_M%8BMiqv5_9@ zX02P~G{IS-BV_nL#E%qb3uVtjUyQoT79&Jrxk8 zO>TtnjIE5H(v067ry|7vRioI0kz5|D%%TN-O=k2&DDFsokal2oQH7YfTM|XD-6Qog zWWwY4pqQXu#KJk^fxp0$6v$#mS52;YJFXXsH8vqOIVjG)LApN%8G*feQ56go(ab@f zK;k8 z{s`1i@%}mn3-dFkh#B>cDIyVE-OHb~BU-c9xMgxPbpV`l^_}9#pHaELvlKKx(0*pi zfwm_nUzhBy`<}6>RQ0Vk7VQ4ptx_Rs>gSv&5g(kI1@gG47$S5ikkI?fvVG_0g**n?J!|U^HCw>N82nn!T-8Pe!L*SP%8g zqChXSp|3wUA1sb^)`F-%i`Yb+*SP?tZHuuNT@OaHTl#W!Jr7JS2(g<6Ii^!7T^T)R{t8Q6drH2h7p-Ry?>}yvJJDA#w1c$ ze|0Wgj@g*zmDll}`AT2tR^Y}L@#zjHzp~)~RB4#$u!4rye0W3$*Hf zNy*t9s31%~k=_2?q%8PTPg3?5mx3H>)~hci&GLidbkz}?0K@C2;0X5LQ7!to_{ zQ*v|{GgTLr=(YN%aOiIG-<*`U6Xw*V<^(84bOco;8(|-6xfBWOumLy~hkw8|gqvZ9 z4wu6zjKbvIHdgLZMtBSeTUFw6*C;72;{N zxx@Q_76HES=5&B3^#V^@>&^~}1`D)qDk87FBm9N42)v!MyQ3X@ETa^v>E}NPwU5g^;UC7qRbkvnT z0utp1k>+=j{j22}l5jzTsA4}3RRYplSo9erD%P|ls!RNkFSy5pH+53e6v3|tL~vm& zl4-P-&5ezwc^g-tOoF#$vc0~1>=s+wMmmpq9~A1s*!|~XgtjDMKLjhOWo!rjdu9A{ zaQtng`%%n7-Y=YU<%rcT71LkE4;+&p!41fBd?lcD2&M!5#Bj~08wcQ#D}l&xTh0qc z7Xx4<0pQ2Z<2}FqQHsa5UW|vhi`tvE;4!GU>2C4qcG*)bt+^SP8TIJHce!bqjX$o| zb7eC@u4QOq@+%V)ZG7+Luj7S>(i$UpAwJk8mjtyuad8X2k44LKMb@3z2SIQcwlRy0 zcZR;%{9E5o?>k_oyu0ojx3PYmI0s!ySsyNKQo$C5?R96PTiyyBI5PF$U@JV^;6zXi zQw^0N=b7~A=HO4BP%ci!EAtt!6ep`RM7opG8fh2i?FV5S@I_APJS!i^M)Sn+vI^r6 zI?QRSxn>R`)bKq?ItYza zJs|&NR1tIyU!$s>zYR5@{WF5%*9z2Z!IN17#Y)%V@o3G+)rJ=ss*8u#o3o|Oj z4mhIFdk3M=n>hfWhjNAsH`ubb=u}WVt3dPi>n5^iT*jPD1%k#Pe(Z(Mz%RJbfU!c% zRq%kyq%zCFUoQUg#Z)@KRQN;&AYqH2E*`|(kJY3UoqK2pY|1n*T35@`I4o68zD_Q6|2H>j)4S!CVzsBe+-Oyi(E7&nxTfkvp$*6$RLrmTS*(;NIp*z@j4Yk+(HZ;i`M63ZQWFp6|E0OYs#8x zit<{fMg3SP*G6k*H2EjS{B?}ZYXfYGcn*Av{*4nt^dYL6riUoa@<2=i^uw7;^pC8O zx%sGpy@Lm1w&;KGtN8SkP&$UEl-s-(;B3d+{^HeH-Ej<;3|`i;K;Tgj%WHM4ItIiH zapMT--3l6S=^_I}bN5$_>1O-;TPgimYwI+A@rZKyV2DpPz7;nv#C=;6edCQT;Zk7j6ij!g^1l zp90yJExZG#35N>i?VO&Bc>}uS-)}PH07JGJ7^QAoD(5lOv7EKzlS~`L`^mBq?m-oX z=CWntANwI9Nueq&BI3Q@ArF`0HLj;TTvwvxL6-wc%F$r)D9YRT^*Ij?p}6~PNyq6t zjoBexCs^1LY)lp7`$nY#pM&BGjVdXWksx<@UW@3eL)bw#I+wQK;hqgwVcz1At99E0 zymf-@K0$PR{hjUJ_LgpUY)q2XaE-0p!lo#wF`g*?&^Jb_`3)LlQfTV}TUyxsi`e}3 z$RRZUAv6tswaESWtOWg$i4oJa?z~D#KHOn2ymh5%!so0MyPe8m2{{^Kci@`d9as!h z^2PuPg;(6W1z}K@glG;@7tPEzthR65Dyh+ND#xA{^m4QWVKk5K`zmgX%fQB1p%79Vbx!Dz>__Z&Wk>kCHc=EApUdHFLL*AS0OPiZUs5+m@hn5vCg62TE060c*K zL!h*AdUIWNB=MpU`^d9S<^v+Z`;_&C?Y9nwFO)kv(}>G%jN8aXt+vz7WnQ4n;45i=-g&2{WRIT1CEhQGC#i4mQM2!FHE9E=0>O^i`k(_K{Utg&zv+;V`-)+hvMl#h4U&k!H*Qan&t zYW%=>RLa47iWmk2nmDp%pDH+fsjmU=EmP)1_0-^KKQJ`whwp{pwk?{hJdyOaIB>~N4ta}keQ+y8~*rG zGTr?e*BgJMvJSaaqDD4$!m?l}6azr+E{c&nUla0#>=?W&6(81OX2gb)Iu?71uK-g( zyfXUBjOc{)3Zt86VW)qA;rNcIx$f&YEPxX193(RJk8D=*+CQ}MuhJmM?or#0#d0x} zg~J!ocOIr{@92k2>tGICDewEs1V`UJBSfR0=5Zc-o)(EkxJ`gMBEtg0GR$~0{ zy51PEHB&CeYK((IyZXX-5iufn38`PiNG6HD-TZa@6}H&u78iZO*sr5{@6uQYghXFh zciz*Z_x*_V24KB-8&KZ#ac`8e>(40f6ZV+9`a;=6l!>m(yux$~<(WsJlzqQeqqIZY zd-CWKqD=Ii!B@B+6^cq;V6PC!e6w2>|Av~TNKLc^i zad}0#aYPLN6sysJp~HQ3?HOExsJfv$rwnnliG7}=P= zf$ZmV+--7++3gAvCPy4)!CRvP0yWApZpGiIma*zoTg?w7Cxj{33H zQn;?JB(ly^9%=Ce#e>LEoG=0Q+C?J@znZxtuLWlP8yf(sE@8%s};jXBEA4{b6D6z^aab_GxD~~|lG(55s3jN+NHUzp5a(7lV z+!^;D9$s^J=Dd!I{Ug#-!et;s5-z9R)KLQbsx`AN+J9wwao8KF?{fX1AtLWeZ9pDy?1mL|42uY5y;}AJl z-x;mn%d;T^yQ1}7oBZ*lXni-Vn}sKHU5*|Gb{YBehWhsv`nzt;JDMD4OK8}O4_K!sW z($g?_$HB=2wYCCQ>WIBX)D6^!(V%~+Q5 zg8B)#rqD0Km$B!5(J>Gh`-Rc$y>Wl{@S5(l`2)ZwS$cqCby}o;ud5C}_JHpQP?RD& zJtLIyJOT<%y#RsUVcazn#tx+j;Ma!8)Wa@bWef*}%nvU3PGJfightv13 zOTulzVFV}wV#0)u)5qe+xczW$4iF>J$c}!Z6vRLn5XMOchRryUipLXDTBH8G@MYp% zykiM38s0nHpHcT&Xy4nICj#x_zKw_Cq3kIP$|p!u|6~Sy3-}Hd$6geDY&LGY?d%gh2pWKtyxEuvKTwkTl1@N@A z>{GJdIl+t1&G_q{mUc^9{3=?uihpF5iF6D@^2i^nU$ ztrmQ>1vR%%OIyD#>GC+T;^v%t`NgR~y^3w{q77fBO+@4DYIb~%n%19Hj5kTs(#Fa! z06i;LHunRNL87-k+3HIrMm$+ExTQXQBd~~2a@{#NM>(=AwXgR@@ zSB_m9kGouBLgE1HMv%Odl-Le)KIl&@pptrFhW7)iH%2yZQw&Fu=Oq6MY^$0M6-y zr+YfC5Zx%WyQZ74QZfBi@4iS10p+AG8nRT9mI^*F^ar4?k z@d+EiSXH|Ka3O(P2;8E4*@=c_@m2Blc=Z@wZH@UmO%M0St>Sx7{P3%Q**X(2^H`U^ z%WRxz^>3dsstX`H2+~cENfN|uu0MCb!jf!^It+-H2;sX05JeJVkGaf(xN4U%svRIp z2ofa7=@Mj#Sr3p{;~c0Gb7tb}4T-N4`PIMJtV%rkY2xco5?}KYU$YZm&q{nfDe-kc z;_Klo-HWRljJw$mH1o4pVDGnhj8WbAu?Ihz>)7V0yAH+wwAnSpi&Hrs<)`9-?tU}j zJavG(9B>G2G5=(v?leY`OZO8bpCD&QkWO>14bp9l+6R!C1er{b13QVO)4a|G(VQ4V zkVOR9EXJ!=UXA}GT#*rq3djh}b+ z2K_BTml8BXW1VP&=;qfFWHUj&-k~I5xUTq5hFryBXzwvb?Lx(Vf*vO57JyRce0&Zp z9Fi`_Od(?GmI8CdkF=VpG9R+O)|&V6tK>kJF^U>z|4TquIt%FT(CEgrAjL_7Xu`cm zkUD~lXXC=BakwON>#A0dl*9 zcPmZuE5dIj{Fm(*a{Kg<?YtF0F)hfo3}F-(b?#;3FVs&s7ED~8@X|2 zRd1;77XcL{R6U^rZd{aX-ZTu$H4MTRF9b3DD41nF&96?fy~ct|Sg-^IWB%>tihpoB zf3sOUj=gO+vw=kw*=&s3h~6$@kv0|?!Xkk-v!ASJg&DB1Yr^~tpplkTrHiUq&V3uo z?f8&YdCaqHc+JF%2$D;X7Xf1UnM@Y%Mn;vH%@D*`BTpDIpW)Y7h+nS)tnB4{ z-U4adU5bB!bQzJZBGLC_{|@p5wwpt&0#|9WgaL|CuY@4Pa(h|svkxEy=}AiO z@^gdX-|pzv_9GDbyTzU2qeHEg<6tEOgS)M|97nl)`_O&`5a-tKXr#X(Vlz2@4X zHW9RbK9^-&cc9GUC_^Ir5ip7f8sy0H0LdXpgdqMs=4E$*tC%fb`yN%EFkixF54yd{ zA|VzD%9e+#?!D}@>mmuDHfTR%Qg{@Gb=4uOS{zj=+Ta;d{kho!*P_Oz~u!se> zyeCzbdDDd$c~0GT9zj9`c>*9Dbq`+1W;dIaRs~nBRHOgEUmT=+7_VYR3_c}(@UW|8-nS&@rJ>E6D-hmn3yp?6EblLIctgh1x;!}|Xaz@KwIYIO9 z1n7kXg?ycrZBb3PWFA2#6QsWc*<=1|JA96khuXfFM36-U`Nz8o%ZK0Zg{6=n%>-%D zAggTwaX^?wu5Z#uqp96@u0U)<)kehmgY$He!LBIx^=AiBc8 z5o9qzuF@cv_6GSQLDmrD9Du+H$ z62zrJN_vBgCrCyFAiLjI%{|u!(G^`nkP?EtqCt+F)2l}(5u}zNzt?8Cs?PIvbNZOwRiN8}qlA zAK|x>yEVqBW=Q|Op@XZb&|d^gK~Pqw+IJ!(LK zj2Z3;-W?%erqd;fknkd!zk`B($mdb z=W>+btIxa*DM#U$MI5e$z;XCZ)uClx%Rtw%Qbmv)g6trOzbhzy z4*pusAT4^s2sNHi&r3wY9A_iaeI87Z1q4~F>&mx5bY0>}fUF|OudKTEKb@#cL#-#& zE<%k2RLq}g-cd>$Fx|XGex{l?%1^iX3x2|GI1_n9u|TtVGCmD|gM+vYu#B6`Ls^yx z&z~*V5p`-EF&;J9i-T)eZNXirwrvZmO*h@Ty2B$`z1!T!PgJ)O=z2)E*NG>Ec;*mK z6Yx-oQs?wqJ?>cnkQD@(%BnCv-v|IyD(bCj1@Je5Y$wQ7vNfsZ!ZRs3Zu9dyv>bZO zTht?ZHL`z7=1D<4%levOo@9N^GzajjtUM zHN0wl%`jJ4Uo*|e_*K@Rb?3n+P{ShDFjv;F%3Oa22TXHN+&1!%CGOf(+)CgU0+(yx z`z_$IqktbF@IC@F=br>@e~;^9w^>_n(R!Ei57rShI||T)n+e)%J|jUFn|^?D@%j*d z2OcnAD8_0uu)=%>pQ;~=j8RR{5f>4~0-|`4D6ok6=5+RBv-zd`Y%~8QKU>UC<>wyr zBmI1v{1oPoZ?{^tM(M+k9|y`kMEMJ##Ih?WI#;NL-7bgt?m9v>vj|wQoWl!yIk)Ru zx{YqJU%0Jx-mXKGk!$4($qQ|V{fZUl-;D~tY(<5T%CQ&Ps_ntsv`A%|i>`7%gkT}1XiHpf}`bd79XCN;`t2TL}CC9BPYr%9IJh0T)9V99cG z4`0OmE6oq_#cuIZRM)ZGs_yUj*4(rR)lHMt?J}PNFc%kpmY;jgKkCo>^z*y*@A>kx z)4Uy@3b~%fe?ydeiSlHi?CqlAqT{lwIVHlV{`^dKX-!bv0X9O-)16~?q8XiNGtUHi z^}?2`=0lYCWWL}8fACbR0eT)ifek2)p#k^34iaLEEcLGd9t!#4J`ZRrr1C5!Wg-S|#4eycf&FG$R4SusY|eF-FXe>%~h?dHWc z5|1^2Iu8)Z=?ck4(~B=u3e7yh3sb`~B`i_2nY*W1tJVd^s0I{$_s=N$0E>=AQTkjz3Uffh%1$-!VMVmP)6IM! zkWcf?gG2P!@#al-OSIaZPjq{UZh%DRHVugmlS8UmEYZOcnQs2i>A)dJY`5Ad_$do! z-GhQ}Bf)}QSbwGZ{DIwMt-sDDXca*pC1@iZbLR4^__c&z{~*8eQUmih_-ZuLohL^T z!`vf}@h7}XNIAXdw+Fzk@GA4vx1oj`rC;#rSn-CeAE$2zi)j#l%dVt$pJd|=f_O;!s**A_YRP5`7xM}v?OGJthV}~pDtvyMx??w6ffcY#x8z-{bN9Ci% z=7aoHrHW6p*hgV9?j{q#zK0({tJCjAtIubvp^?7NnxLZ2k)NIBIEiboIYxf&GDphK zt>zW@L@Km{G8-jjzK`dcGFrxe%sRaHp^n#D$U7m+C{_zgL|iRWMDWfQ5n+kQ@|UED z;GHcZ!V;0}Paq-^Cp3@7c|eL!iMgxeh<=AeApP#&@?Fr(`b?ISB9(syyWDBc7^0=j zW1fpgO0=|99)1{|$Y&?Mc})@M$WQp$X6~1to#rr;6HlYrEZV}^XLS6qNs%0-1O5C#Jg=o4SOS$rEdQd#` zNMa$O`+nO)XrKGHXy1{w=yQx)vF1CM!n*S>`hN)f{vg@Z-#_l_cBOw6(!Wt1kjeJ3xI^86uYwd_y{kS0?}osrC-e5(-D`j?mzXk(AL|L=OQ@9d>Z z!NA_@M(2UkDx2PGt$yI{y*_mx0_Q|5MpZD&mV`!QQd7zhD-qR0sL?laoeJ}JbrrrhAs~@2Q z!3Bi3_^6$ayzWO_MQ!AxF?Zw933$X#+*tN4vauYLd^m@;F{?q$Ak!mZw^UAQhL-u% zQa~*~ylAw1iC%=(^3j;T(K2FymNC>)OD&I5OLn^YE`bFiMZKTF;c=$&YptWy`}`fl z<(u_=oZ75$9`%xzBh^Mo#{*m|d}9qUz*gYN-5FHPthHq z7FRKDL0Z(P0z8L5@W4s@7IX^(>TEt>xjh{hPOw}jK3@mR;+n%?yBO@-FCcDccQ=jG z9#Ug3MWs;OqBh{(kQ>Yj$9|+F)qrv@DX6DD-Ge38)PW{5ps_%LyoTSU#P*uK8(V9@ z%_VoHa3A~|Zp8rZT5?OtJ(OHziT&|@66^JuTF1cp`>cqLb~DFt5p}du$EVL59q;aK zbo}FQbnG%f$9~k|S;P2?jypuh2fNb`1MPSjzl$HljxG1l57aS@IQS8EW*N_u!Cj=b0yiOWG8`5Pq)uU@7eU=7NG}+pO&|bQb(MRZZ|J8)j_<}Wly@y zQ>derIy!^2pj#!uN{;jswG1ndj!pCuF~jN`?!-n$+PhMh=U(XYL6?)$!pL9YyYZ-i zkFL_egw;|U#bF@Q72Hfn6(N%}q)W|oAf09n`awd1gdE8LFqD6Mo{ZlURQJ{TCr;HD zZ{kp;OC9Ve5DRBh!A>gp`Z>f_pDLja_+>kqNcN6Z`<}MX71d=vinO%*KzjU&;d8s}?DzeXJdgXJ=jm*t}fJlux2jJK5)N%)UMxE!HkBxGiMr_qEa zn(*dne-=PD>$MP(O>vbCDhqvmR5z3PuEN$pnap&}}; ztRXc->LHpMRPSnNi@F#pqC&Zv(1f*sZr=!34^lnd6De4df~Sy^LC!1Suxfb^TWlDK z-*>a>r6;&Ip$iFJrJ-T7KS;+@D!bm5fYcDONJ9du+}W@r-HJB|X(i-5Ld;-dmJYMj z8@}#5y~m^;-|yv>j@~lv9jUC~wh^T4?c~SZ5B^>{h-P&hkp6NeygGn-CfBJSc4r33 z=TCXl`IML5u&12k7*iB7_3zA$-f&-;{=FaDu~nzuP~%gh_&nR^4Zmj|>S69MP2#0D z{G$FHndwJ<>zQ6y)(Hib6&?5wL%Z*Sp<`(1+$I*+KD7p4=9U5fOnz^iWB*ijIWM&n zcbJv2M@VcVF;x@eRe>g=R!dNaYa%XF)lv2`*BibC-wwq=KN!%?QJ1}hV0gJ$O*fZI zH|%6GzQztU^il^oC8~x#=50jZHs4f+^W_LxAhnbRtuu| z#|ltt9{^>UrgW*hu{DR|j3+@gkrM6i652uNbPcUh3kXG8o#|+m9P$XE@pX*9hGwWN zKylWJs~?b#b|O{fAQVh@<*2_r5z8uM-oF59Dkl}e%xP4(mUcJgL&-_lJPyqmcjQ>$+%zi+3u@sYd4Z@dE`<~@WE zPhp6t7b1J_`gE#ZJ;dpONG-9HoKkXj`y0+F12~h(X&{H&G1!m&+S!aFemaVf5Ft-# zNLan$QAC1egE zr%ISp9Eg~;l8|abk_3|KKqR*n5z63VvTS~TNB^FN zLX7i2&F^`{Kg*5vx-L)0ZDmCo{-gMfq;Ai8=w3tJs2e}|i_Jr~8alzIrDRuC1!yLr zR|C2(U$5W)@en1ds-Vha$QY{BLV-N}(?0D~C+eq->K3g&pss^7S*70eBr2%BhU)i* zde-K81KrD5!e)A&<=`c;E+)R6_|KkTW{y|ew_|TEyU3|3iDmuzvEPk_KpY2B?qgd9kSl&3( zRs>SS4k14A5#S#Z`~mBMcbDAXD*(wPgxfKo${QZ;kCcI(X6fmDq6&$+7$|9gj>dT~ zm3l_o)$p)!;jE+jC!!$TpQr|>f~sn%YHzASPQ2g`lM~N{G`2~ZnMG&^p*@c?x?$xT z0`n(_nci;?fs2a6%U_$JmOab##ji`$bNqF3ciFvW!F4<_Ku3!YI_6MEw$>3=&!1-N67lm| zLaGTlR72X;6*`z!b>5MjhUrwh#aV~7nl9OVQrb!R;Zeq}T^%o!gM{+lUv`_IP);Jn z^B5@2n$n^Aj-d9C3J^NT=)MEbqeu7KZ-b7B)KNkm;4TCgC*P?#lvqq{_zk%%yV2FM zHR_B$5zj?eli98F2zB|WE0wxTckK@xRr2?x<*z@jl4b1aS61Yi%r}FonyKpZ09Em4 z^&@xKV0P(EkYp+3ufrMPCiNVCGI=;^EBby=qeqjRKk`s#+~d&c*E+q_dB5nqPV3YQ zWsi%_%N?B)wP_qZK+UFqyL2|;CODBgPo_?k>YIO!Da|VgDI#Ql4e3@#Axx9AyUZ?# zs|l$kWcwq?{ANk29)a8VC2I)R&F8WFwHOQa0dH&z|5*yGxxO zhcqR7Q+*%RucCTXpT0sN1fWQ^{LH>iC;F!4?>ORLvGx0zC0$WWRY%C?71 zC|~U~p?pG#P!5++4*r`^emYD-X#gQAltd?#-55&l69}aep|Hllz$`Q06nr>$oV`p| z&;G*50Fa^{x0h+E4wtMfYP9T8)qJGuC}~dX%Me0j>hqtI&+|t z_4KGJoKuNO<2?U12t{ z+OKt$lej%2mpb~WV@o~rN1ocOq3Hi;8K*WHHLC>i|RcHE3KF`YkiW2)~OlDbl7#JCTfElRi>5!m9Ax-8a3KB zE)ql*gUDz^5St&O%8+^sVIze=eg)ZaGPBSU$Cu9d9`)CN-KOJ1NdgnZt ztW&zlG$NM~nz8}V|2>G<71ybcu@izj3eLoLuKmS6^%n2ZguaTi%-Au1QRFjPcB;oA zwaR5nbZICtrC~S~mr?N@P+V!&8*e36UoPJ?N-c8TWvI(tclqi<-s$&Nm$xiduTO*7 znzwY5o|QQfkGYNH7%iLB5h4%KvP11JaxeLPH<5pGViyhA&mzCq6TP~*`%-@TIPz0R zpNE-3p)NKMkMUxQ@9Lvu0PFjP&(SUZv(x z6?T5)E<%RDeV*KB%Kb#SPnG+0-e)&@!v~?o*BTDBzYMp(B=Q&N@`#KR*$)7J?-Lmo z*)1|8vO{E>$QF@7EgMxMapFPgEYF3pJlCoMARtNG)f6DuDZB?iFuR|j?@QINbCF5PDGg09Wp|olCUj5L1kBIye6;Kg9FU9T;uRK%n)ZVe6B#qiBd3*| z@3EHc&n{EvKgt#&4kuL`Q+cwcdYgR()PkG20Rnq6U!ufp>_+~+QFkXE!%wlpAwuo~ z1gTi3ZYLIUsmL2B{aXFiyhNw%;V$Q=OYoE9^IYTe=9>_$3g%cOz*D#hRy_;L(`h-X z<`k_ssFJm|MpgK|?I$&uh1n&fw2?AIQ$p$|98_jPk*?H5gzO;X(^_f`sdr-`ClZqU z93U?Wy5GBx*-0-bluc%1uLlJ;*vn+~XD^F3eoax^?PZz@<5Ktk_>-<1WEE-04bZ%p zns0z+zn_CJHJ>M=A^Kn3++pNHeJ?qzcKsgk~^f6 zdk%h=x=W@{ucwZB>e#u4%~H22_#NjxbJQ_Xtw)WjFGs0+?PZF(ll3eDIe>xagp`Sm zqp7Qpx*DO2rKKL0vs1V*o0I^)XE6^IUS)Qzwv3-qUp}{%Bl)S}NBM+((Uxzl+M3Eq zt5CE%uZP;)7ohecszu2Dg^Xs0S`8?7^!c?6sbVa3vERL?7g5lbVUWkQrWI7tP8Itz zmYivO;D!M+Z3~F%C#tW8_P41Xp2X%>ltW1Vi-5dM2+ZB|Bz&YHt4#0va6-xmc}zp_ zO_jBnnL^yKYhfj?^yZV8T?;Sl=gf-8kmZx>pr?g;E`uJ_-)jF!HYjOTUm&EHkTVED zaryEW)2QnyxDyW`FMenp{H(^xO+9Z$$xVPad&^A&Zzd?_ocN(lyg5PNz**OnnAR|U zs2;7a#S{)E0G7ViLeytvt+)ry5!If8;QER{`iGZ8o5@ZF1IX9a#OMg&Tl5rJFo zF%dXaB2Y&9#;`G_iZ=ndS;d?CaQA^*@I!3TtZnPuclN;^G*W^Y!^4I^- z_CDjtUb)fUn}xX@yf!J`Tlaw6Y42UIfZppf-n&k2jQ8@3V!ij`Vpu)$C0Ly$R`>j5 ztk&MUUINwLn=d!odzZ?M_Ff{qVVohkY7W)5P_0^xMTi;l5+S8{O=hM~C9s#k761nu zyD!Gj7Oj0q-S;gj0?3sjD@86Bd6UR%MJ^C|IixYJ%^YI!`n3o%|7C=ktHUgF)g)!6 zCOH;!W+-i|)D`=%I>1JagUv6fO7}HawQ7=n)}*dEiB(9any+P(`p*}vu{zZYT2`q; zfing~PU<<6HY}kHZL3fTm^sGbUqjL4dbQyjSX{3AKwpml*Yqzx#wGVfT%LuBu$-eo z)yALj>RG8K=o)`xgz%WY)M_5kT<%|HC0eTP$=q8U(s1T>R?FY z6x6Rg^kN*LSuKD*tD$)R2`99$ivH1_)G|RPjCUh+F`<=&mS@rz&57`ZUoWjMQb+*5 zo&>!DmnNbFRoadDt&5y8rosfV7fr|){tB^ zOhb~?6m4ppdi`|zH%`quArd>gXV=Rx^EV;P_wS-FTGfG?)vi8IKo1MP8LscK_oNYX zPso1t>HwD>eMG|^R1%_+YACU-pxFV4RuDb%iQSruEIZ$5L6$9$EA@IhUD~N$(XvS$ z05I?OhBT?MO6Grx5Kj7k5Kf9Vwp}gc*)VuVWn`F?Ry9MP71OEmAo1#qH@pI=Vv`?f z%GXscrIsFQ`C^4h{v$N2!5e-XGfs$Nr;6X3*}7dN=qEjD$6mZ|P@}Yot!f8OeQ`1h zH*k8WwCYtT^=qXqY6~E2!=EP=6YGoq2NQK~NIk0`)u|^b&2e21>7Q!UeOd<8avfl` zs?_(5>RNqYrf$N$4Y-0C1YuYG3r^RkYc0c7Ft-&}45Jm3Gt}>2(=n;)OzOb|;1KJ52Y6=meT8IfL*RFl8YJ}~O%178n%bkLi;BIW!um=d6m&T$DX)PNzLVO=s8kId zrN(HPp}O|M@0i7G{fcf&SECquai&^)FWratU-7%6lIflZm1dTGH*F7S^k<`?G0awi7F&QK#lo?;RRIlIQ>L5QR=r)yx|N3@~K<3vXRuV zSZnA|y&OrF>*4p*1mrU_Cw>HjGB1(*-a~+%9#7N;OeFn6s5hyhKSom#HpA>QuY!NN z7=^Yw=$~%2a}VZwytVoaCX--khx+X^S{PD4YFVS^(*pG2-X#(Tnp7Y_$3yJpe!mb( zdtZmrYoSzT`PgmQo86Z67zLV%_7zZo5PYgeG*@d`ssd{eBHpS?V^nZL{1O2o>~EK`IpdeJm$I z9pdCuQ?*Ie>Kv`NQEmI2*{4R09Xw8FQ-9{0(BEFkIE7WBR?w|HkR~p&qBx4sB0|>* z^s6pLzgv9*83o-o572r-uhYuX&)sUt!`d~N~y+R`3%ytcGX-3JOMRG%3_3rp3DctwKE&wCzZG8rJ-gDl5TTR*iu zsg=zV+X%9=rm}Tp+$40ZallMgpTyLp<^y}pkHt@LqVcSdzDLN{xnui+c*=vQP(&R zuVfHD^(lWcuRR{$1uM!!=)11H8MK{-tZE0!#)DOw1PP- z)X3WUXD&pItS6UM3CNt$EB%-zlc&mcgzD6Hf1$ZHar}{QFBtCGBT z+itL|oOP%=A_Az406G9LaU;I6A`$-)w?i1Wz&nWBL$^_b-XGl)VuW@e_TI1$(_62K z6`52APcLTsZan?QM>LyI^$wr<^+4fxZTTo#lc6o|BVaOZG@d>V8Y*>5?@Du)2%YA6 z@wT8WV?L;?=*E8-yJ#+qZKtt6|C`2g7q&V{8%u;51)e1PX#DCgE>pL!pizaiJ8VS_Tz>@0&f13{`T;48Quo*m$y^tJws`AE`MDD4aSFjQdz-V z0<%7v1G8%W3$tdyEa$Y~cATf%r}9BJ8DGY04MevRJuVvE-p--kb10SuFT?jG#3ytB zKO`3K$I(zpcOWfra$F*$;mKBxiR5LG_eQx`WuBwQ$#>DlXsh}BQTyCq>`}gpS@<#5 zIQ$CtSfhenE3m%599rYHfOV~9MIs!fzm>>*BG0kNsOR;3-pJ=;2Yp_~=bm@*eE6Wx z=kR#}pQ|#7AMFnWI4=tO=gxK8uaD~*M@kzh&uR+sB^G}|G`_@9?E%CtXd z@x{^jI^f3>-$DFq4&G<+*#q$-h|hQ*_`4l^zQyksjSoWq=d*#YBmN2ppJMS}T^<$R zM&LIP@A&}u6CHg2!xG<(QTU2{6gW_BA*G0vT{R_=*>Dw=pYn)oBXa99o8K|J(!b1> z3z=O>C2j|C8!XN$W%iz(gjieN$0~Q zeE7V6NdIwv*L~6{o*@27ATB`M3X8M;q5Xx^B)&tV?AK?+ZkYvY;#N?n4Gh1D4-5J5 zWUDvIzEynQ!siDL`g}2;Cw+wHzm~end+0*3r+Bv8{}r9)Ow7~CDkbYx%d)XC<)_B- zPl)Ds82+C#!4H$ad~kk7z2x7Y;5S$Lv%GF1+50ibXK6D1=dt+B(RkK3D~JygzrTYI zJtX>9N8_n~Hu1?_z<+(Ktq%egKQ|iB`eq#QKH{Hs@Ff<1LNuQGhY;UK{J$N1j>Qj+ z#6me<8)H0NqJRMB8kuZFI{5Y9*!h3OynAiWcf%5!5)p1^3gj3xRIX$x5(nGQl@Xt z1(F}Xn(2;j#TZk*pCo$;*~iDSO@8!P{`x`rSCijE{`Q-t6xh%WzwLYpe{M9Ny*{|` z81i$w!GC5TKgu8RMAj2|yG82wt&{W_8l~Tq|4Tqg_#BjJni8e2i4W)S;mM9ZY#z(l z$stOUN`o}`pxJj;MtlwN!z1{3<#BM59y5q*CGPVjF&^O@XXtn852y|;>s6bUjj9FG zgja9gx)@14o-d$hjn%^$q8g3I`3+ijDxa2Js#HsS4?@c}RV1Ch-H7sCZ({ z`@dO}1Ui<`K0=?gP#uInJ3;jyYgaF&AGz})fJc1^@X{zS7;G<-ieuW#cH(o0pBjtT z_1^=Me>Pv@E+6^~#}%YDk-ER865l^X^7HB_yxsjhQ(M;q%9l6Bq`s?scOd7d6SR!PDK?G_y#_-Z6qUCjjf*Afvq>o-a-iIeo5*fq;`|~Z=)Y`gC%#^@*(?;yQax*uAPX)e{mB`4ug>g2JOk<8@#&x z5PKR3!E7zYe}mcM$+7yyh$Y0A5nxxJNCH z^+nWMiOB!?_jB4p6MM~R7vEk8Vg`vtmMA_QjGq+YONH_{`Gw@C#q!~=wkw_f?Gx9> zq{kvM>&X21I!2BC;S|1wZ2H4D$KuBmA0qxWgE#r9yeLNRfy8;f0q%Z{vspyv?|Y@b z+Hbl$f9oCGpXY(Mn7k`APnU0t|7uzk-iO?=f%q=sPc-(x{*t?)-`M}sbuo4=B|h<6 z;CC~4WB=xVu{_}X6-bjZl2xV>pF{iy#q^K5>1UaBlkd=^5l}+FMgmyhdycaCO_C>p zm;f;=v=ZwKNESlh4%?VWpj{ULA0mGCVEB9oFNL;&cuz0z;|Aa{pHX?=UK-jkQt16h{~QJ)YEhQeRuF^Gj6z=fjPDx1?QBwh}CiH3x z)xoel=A3C0LF&6^f?Eh49|Z;j`qd07Xa0{@2fu;*Y^vgY>}94JW-s&A&NiFj#gGE( zPW%D7zq$sIrM`rSzPAZC`u<}tGu3nUGG8?~`o!0X)K@@#tF=DFr>4qLa`3e_c!}EQ zUchSzzk+aGANl_6;J06g^P^Q}d>*Mj~|G~_~}gON4j8~ z_T7~>Yl&$~Ni86i+cDVw#w*_#BsSV7^zEmHe}9^vQ};-@6V|z8)sWS3RkQ=RK_-WM z?Oz*z!rKU67X#PzX-bi8k8S+V1-_s7MX`A9q$up=c)L>-XxXLmwd_z{NE2>{IW(f4 zda{0kp0QSszqnh4&c=dLahK|VGIj`HTg_O_^CYKcoDZnVW&dl|oc$1Gd_5nn+3wgu72+m4tZUwEd5zif2p3n3m) zVl|0DAyR+Fq1Jx_OCYR;uobcTiT5~o$v<7^0N+Ra>;ZW6hcZs3vtz~;XjhZ*dvv~C zNku9BP?RK!SU-i{w*Ip5CoG?^ZS!N}&;G|Hc%y}l{up)D0!tNB$B|l1>a&{aq?aE5 z^I`I@c(}&uW%&6{_@bmY2RJWri!9Ej7s}*vm7_Mc*l@+<=Se9g<@6{D$LI5MZRbkB zRRlK@JR%B=Kxog&4qo#64C1?q|9oDoKcIiOgBSZ#iBJ3u_zeT_@So>a7;pUd&-peU zLfv*Ys5zuwr>ShuOO|6Wf-MJi==ZD(|B;x;4`5Pa|2*C#_zYgPz2FA(LeJyWQcW#s zF$Pdy&doMZ=^rd1yoK-~F>tgm=#MP3?S(X7{K!DCkN7QxG5*l=XD_hC$M#>ss_%KH z|I%y5xw}$P%I{F*6Gf7~>wmRXnIzfPvw+Mea%NPJPX1zj(L_)aK_^>~^PKg?Dn3ux ziRTB}=d?E;b{U++Zy|9R#BIBBkoYBi#qnyqtDTR>nz~2D;dd!-V)bEER76DqQN;XM z;>=eFY$rO@!8*d0#)ilKe$BbCkNKql=iAw&ll-!Y)DWp>X)5DW(qr34>EF~6bpE{cw)qPV!d5&t>HUwp^jcMJB6U^`mf3)V=f zcj5tezA5v|1aLFR<#r6~5a$2>Ul2Y|*+^2S(G*5GSDo)@lPEt+1tnB)YD58drKLE? zCeuHzA~HbahzQbz$nu%-n)Q#Q*9_uA#D9Ky#57HC>KE2O>BOZE0q%K=W4r^;+jxge zKPv&auYC>jPz1BZ^{>E+qPD7n=Pu-T#~0W0OFdgy)H`A^!9zJe#c)$F5E@UsFYJ8^I%@ zz;Fpa1(Dr~jEjY!6Z>^GJys z2Fmv{-BG6fIr!L-#P_OLd&ZHMLEf{P=g&@5{ZFxc4txhU@p5N;A{FEIOt6c{E|E}~ z9{B|bPnS;4x_8&Hw{nwH(hlKtaV!xdS*}l#lUx~<> z#8(sF=HTNibK<8~Ug$YL++rzwt?uO02IR4!WQWME5H|W7@K?#xG5+d01wha40M2%R z)?dKq08hV_Znb`sYO9{SEb_)$o_Sxx8-6TPo1?#_qB}PG=$A`oU<=2e^8Ven4R+ct z`t`!|sI`<@-@C+JG)(#-KLtTF`Bgf@qrh%B>DBz+a=tUrAYzNu0#()XV1!heRF zU^nq|fOqDlF0XT^hZKxwh)vuB*bFgE>dWHT@$&6NW)ZnpR3rp{_)9hlqWL1?i-`a9 zVt1sS{Pf-fZhNFZe;8SvWCeuf;2#Y+78G{tC z>HFp>|KIc-(a7|b9Do5$qLTyu@J}wC8vgtiC;jt~Eu6y!&SU6}4E?=}+^&%H?@_%+ z+xdnr(`gw+MmHJjVj0}@UxGz7e{qv4;^LYdO<_(1z|j;u5n%e0){+U5L*6_I8k6^g z#wpPn{lx(lILDr7*I=dtYKis|JvtiA^46+Cn2+F#1#wT=M3?q^4tUP@S*BBok4n1o zBhhx!^S!l$r9U~nzPRhE{WD#OteH2a)twH}Y@Z{JBhMbtAAdL+MZ{?G<3S!^CrbwqtXJrY~` zt5$`cfZaG%zxp!n)kpsa_uB4d3w1u>R(KeEgbp>)gnA(LbyMH{G5SKvXZaH(zx18} zaN^zoFNy*qhp|7C@8CmbJkd;i7V+a_@wPm?aMJ&`JPd(a(_M}}Dt;!lms0ze)7-8w z`5pN!W1)4PH(4pN#b@4t^-8&UtoO({fo8&r@t!$t_9@Ok<)i!bd>p_lN#WSUE=>t z!aE4x6a&Y2-lLNG?feY7eWiJ5uy zEA3^HnqeMq+%u!A-+Wtlh>@@x1B?JZu9O3|V>Y_fi{hjS=1}WcX zk~nG~5Zm&MpE&*~c}m7_*(XHWd_rq}{Pk5$HFX^^ak&v`62qR(%{$ljqfM>ocb$F7_ zdE|M?+j@ay3rVNV^K2JYf*4C^DWOkVs3|Xa=`UOl{gB;|PX6X*iXG!XN*)Q)4VL6Q z=lHvm&zJD|MfN%Mc!tt{-6{^!!Bby7@k#puKi1-5uk!t5^P?EMgt#2yhFF|+AnTiO zz?N4T@8%L;Lj0EVql*Xp-Jt?lzu;MQbzH}g113#-h65(qp569{t!XAmjqzI=GzO{h z)@Y6FKNmXTOXb{7beQO=(P&qGJ@cMH^6N?xbN2@^Nr+DV-ghwk<-|7-AD$}t8}E@N z{g*HMwt2(1;tQ-Y!O&!SZpV?(O~P}AU|#d}hF3j|DC<|aKf1|z^D64C++U6bHR%9Q zmq=Jl1HNLIkHu%~ul0uaj!^j)bY%r!vPC*KljLU-s(a8eHe+Ol0XayQP=Zjvro{RK_<)0#{5p#G0^--j;<y&`{@g33V*r;g#&tQ|e9k3YUF7|KzJ;lN%8^i(@wU>Q zcX0s-&cx7JWOtMO*11lk{2LoS0sq1bO!;o?=H(<@>QI-}M*4*wChN2^LSql4ea zLRHcsP*oaHCH8dx0VS&s;5)#4;Y!Valkd%T@p6{F&}(^y^VOM_Ip1{gp~+8=)Iq zP!k`dcOk<=JLAQBVI247h|J=9V!EEKH}8w|q=>uq_zyS1#Q%fR87`%4Pm;9#9V)Ai z@n}MQCHZMt)FBjiYi;m2wcSo_UTWLRrOosggY{BA%a0mRKBtn`Ox_3Q&y>SOZ~m`NZ^x_fnPch-=PYL&u+!KY0K2`0&I?t>_p&`s!r6Zoc8(nSRO0F^yDf zXu!ATNEUGPzlTZfD7&ctFcOxK5D)_2!w+p{|EV4C>!0BCpPEg7h@>7JL?C`59C;4DrnVWn)$;pR;yz^{#{_a%a zwI=*-NE3dIIgfFon|~7d`Q$f8@zMXf+VUh{CuknhjydtK!@={BR|X#UdE_{FDTiHv zIFbA>@j>GAG`>|OIrv7i-?KsEp`Y{D4-g+FevHQB`+8R~eVbIrRF*&NXBF8(iSpEj z=O&(#?lausPochy!=SJ8EZWgi^%`HN3LU(p!_G0Ta{dEu zf;Gf1)_BY>IC$}UyTvnpuMpox{6vj!Rvrg0_S9ND?YWcqe&R=JJm$Zg`3v#)LW`&V zS;VJ|0lp`j@oiNB2QU84)Oe}Ok0m~z_$H07RVBc)UaGr~68m9AR%_Xy@*RD(X5Op! zF!2Y&{|q<50QJp*K9ep;TJ~>S`6&KyJUR!Dq<+QzB1d1JnK!8=E{(X+7H6v@+7-ek zE?xg?dxEO}UYq`sJ~OmE62B=_Rzzi;6X6dWk>dFe%X3)8K|1zveUpdm2NRC~^ie>K zeb~1cUd{eRk4pT&;ycWK#T|zNpF{i&5qz^ZeB~2*@YJO4--M7*qNh0)N{YQerjN`s zEK};+Z19h?{F&sVhciv|>=mo$8tUnwo?p(?7IS}0aE0|prg z649X^|3VsmnG9(ps*b1=h;q_{`DGQK?c}oqtp?|L7oIQX^Sl&1|8;_-7w50?zjF1T z*>B1vu8FuU7H2&`e2N>-dAm`>j~om9x`BApPt`}#%*EG#xsIBk-XD*VD(C*2SF(?Z z39xvzXp^0`l4f&rGSuc%?IcGn&)6+_#pbI<+5b+UkHFCmPz+WF;hX8&3F5yZVuQr~ zG@ky${6pwM&SU8LxPQ_d_fT*=;eCX^MmYLII4|NJq$lQ&>T)eu^36zsQ;q_7jRwO8 z|Kud)6MT__51D!0p8o^BfcSY19tSV^4i~-4c+yQ}1rNW0m!BoNn&?w4n)+*$=SXXZ z)Gt*)!lS1Bxs|jQ(zqSNUp!IuKL`79zI)osEG_9OMN72Tcj5z*NEIAlTh1#d@6;jm z462!UG}OG5C3%M~*7KiVy7CY6Ljtk&#IA5-iRXTj;7d0Bc9=8syAA=qgZSC8c&Gny zLHQv4kB3N1PX#eWh@4L;`3dpbm;|q>t8i(fVULTt8YJVIIXYa@)fo~e{l1|?l6otX zxVV1;x5?rd7yb=8{$1@<4-&!O4~BvaDkzOnpx1+|k$(7ayxuprpiJT^XZe~#GrRPL ztUCdeRFNF?AQhKT@sURHzml z!{WLB?=IHIZOVI%kS5fb?--R4o-z*b;R3hz%;gtl7|Uq;FCZbGgwUx`_7Bap_^2lP zFyej02P~fbKlCTq@2YnC73j~g4&8B}t$Dt|RWRi^5dS4a$zc2-*_#BV*tmJeO*U_bj8 z>3lxscszgJKIizN5T6Qi#;=dx8k4V^LHs?*MtmEtf>l&;omRo}7wU>Bf9(YI5;WC@ zBks}b5B(FFubWgKq{-Lf-&Ia971ZEMhX!uPuw>>(?2qrq#sJ#g=)fEPOEw<2J6qORAnM}78<9neeju$+nusn{cm*)Pv{mhFC*N`rL# z$NqdC;hqx#-QfG5LTQX#4&k){N?T%li-hYPt4)QZBALT9O4%<8+AG9NwD#FrF0&K(p``r0?4slh) zsgrDcvzuJ$+oaRCrd$tCI@O)H;Mcl_!7$^vpxJ~Dq2Xm+p4 z0^XP{-I6(kmlCc{l=w4$wq@A#Za4K$CUK3#ZL&C<-mI@`faiR2_cKh#7MK58wEx=h zyL4M*!RgzPP}oO>MKKEbv7O+zVrTRzqtAlm%#u7x4ap}%!!c1Bc(!7A2FrJ~DzbVe zl$kFeE+#3Tq+d_4@x>9?LE^FRw`Gd0hpHbi*Kuj~ zt3OyNy_kjSdIMPc8urTLd-A|=T5u@=I{S5+Vdhu+LVcL(=Ueq$Z%|49Loqhvq?b;I zNgSGtQrEm=t=nmOuMd-+ati22J9Iss@tkARPmoK9%qMb41Zh%`;e{u~;B$%h5x*r} z{N$uJ*0Ta9*@(zMZ4~iA;@1tpBY%{fX!W<6kCgQ81ALhHMFa3?&%&(6(4J+*Tb^X^ zCi0R`1@C0bA1(V#RIo9-~hgzE*W@2WFoVFge&)ci<@9K z4Je8+z`wEMcZ^%sCviQXiHWIN1IBXW7ECK^drZR=Q$0$M=j4^T%dfr zaDM>CI+V!xKJblQ9j1QnO$0B8yhWDhl_UHt;b+A18_4e^f80QRj`C;+<5xuP~uyOf5hO`d2YN% z@X4|GCgN8Sf3h1NLjRxs>2vnkNPNqP-%0#%H$EWvmRNiq@pE#3-+HvmKP7^%j>V55 zzMc3--S`~A7sTRs3Yv^ASAGrvTp6XYhLndJ~9CKNq+a z7H6|`6t2euTorNiEROYKTf6PAN&C=DT#&f&7U$@*`&W<0jMRYj>E$Gj$_0_zG05Ti zXFv9*V;{aMaKfoK^D}vbdkNn<*6|1S9{|VhUUDpc4DmkVAC2JCRS4%XbDf}ChtsOs zc#n?)c=fr?vE!pQv8hCZ< zf!8bmW#H9iQsx>ePMQqGzoh6GvcDGUXM3NhIw;X!3*BPVQ-*7qWaX2!$*`>VIiFFW zYJ^`6$$o~9(ml@Jxf}TH+emGr!Tez-C3vZ;Txlnct9Z_fPSldr801($T)5zw+FFq_O zslwY#c`H5F<$ad7k>us&fw#u;h|dtbHx}Qs3-Hav&vW6u;YaW`8~VFpb%>k69?#Qc zjJXhulMI9J7ld$b3VX+WlVa>CBf5&{;Sv2I6%c$&EIyC;9mH=v%qjoK4+qd5$DdqD zKZ?k_X+S<@k){Oc{QSRH+<3N#zYPJtiTGQi@y`0rwS|MUU$2rjayn=^LeuAg9bw}s zwR$aKS%i&_){gZ_T@Uw~am-@kiirF5P$zzk%7^{hY~QLO4PNSriNptpf5YPKJfvCA z?=$Q9xoR_}7+=+MR`KfB601h4?LXq6rkiS(Sv9u0(fwOrttCi3(@sKSJ_u7|30&99 zcknj;#AgvddN6#7gBL$6B)*9FZKI<~gYIvm{J-o@Kc@F7WOS18N;E^Sf492I4@+AD z(dicfy&@WI(*xy@Ep{|o38VCXvmB+hgDd^*Pbe**(p#a_8V_mL&rN>P=jm~ONbxeJ0Qv&8 zix8lDuAq^cYN+W1YVw;8kZ#tWXKYX}L2CFiuZ|PHIRi)EL{bMyanZq}KZx*%> zL7$iK9g@JlufNkw_C8NSDG8@X5p?=T?70d?Ncu1Pj=Nl8T9!H+2RhsIkC?V?@t~$n zVMrl{)Om=c|8a;f6WycMek)2d)h?0v{_j#JzO{oZ{S8OX2UBK1>8()ePJj3_pZaO3 zN8LPD?4PI}{Fmd;+amfi2iJcu^_Nip{|(gNKhDuV8A>JpzWa^ipCj*c{4**N)Rt=p z_0O>ks)Io_9c=tl6Vd(nLci>n+{U%w<0|G`y%g!A=-aWffzN455XUjJ&7@r2BmJV9_8!N)~|!QlRt@ayca zdsOlo7S3K3!o8_O?EEhk6j8ypgKR{^=g1tY?Fb~Iu5+Y+ok@Hh@tb1tT=(kNA8GGY zeOk7wut@LQHe8vv-horkf??{p!RjGDDEvm@CB^cZ$xE39-gwKiSwxqAes6%~CskcV z6{b=?|6<4K!xjyio^z?Th-$z2hjjzzk5aT9A(aei{DAg~?OHksT_ikj2^^0G*O>Dv z`xYQ@j2psQcByVH+p+)DrH8X-z5UQLrvQ2uSv@vBx_|%3v#9-b|8Kk)K0z#an#^`G zPclr#Kk%FV`m>~06;b^}jfmB+^Z!4c`rs;ij^!A29IZ93JK!S6b?yHe)OANOgq+z3 z;i&_y>vR+b?H_s7`kQS3$fMr4#YRf9<0rpBSt*rW7Oe~#2i50M7ixX(cCm&^8mZ)9 zw-Us6`6iD#0r;pQFpuy)!oSBtwDtbqgop1r-e~PlP&d?AUDCfhn7UFfgRTdobWy8( zP;c{U6vgr!w8napLbvwod5aEYySnmfrnmVT-hI>IdvjSGxh#)d-pEVr-uUrQrWYG{ zb!Ft~jL7BG$mLm)%TptlX_3prBbWccrFPXaehRR%f}JDe*^Hlm!|Jogw8lr{CfLRp zHy+^jp6(ye-(M}UK9V&4^(QbqmxFOj6l2iz%~QoUxcnWkGs@!cC#Wlnx{iy|MSt7# zCCs)#eZGVWQ>TE58>I^O0)FY^1xv}a!~uUPyhYWrsS$R^$^}%zG_g?ttDf^%ja=*54`rG4*%B zN@N<$CuNMb=1Bj&fwYu4ppA<$2lYSR2j67tU8xV25T8%{kb(GKmBMgh_n%pqn)sR!lnw0 zNvr?-HwRSV4xYESN_AX~aJ6}>%)0g}^3vvlccA6Tw=KWA425QLo%&7bUiZY{!}8{yyR@W*IAzbgtW zLO+7sr$l!if zo4G%#f_V=9?VWPY$Oox%OUdjG3AU)sN?^`DgM(Zq*|=XMOEKTys2-Z84+ z734#v`CXo((3xa?5rrYswYi821626w2)9Gnze&0r^^cuze+xTD^*TfL!1?wc zaA1sNL>am7LbYM4z0IiQHj$DmZ6=byyMBcAD14tN2Y6Pe`aBv` z(>|U{16c}b%0CM8LQ{-ZfNk2S+o)$1^(44r#B;?naK1YGX+>|LAEfJ#4zn*KkCZl2 zwkC=bi1Rq-v5UQ_#Pt)m!QyNd9<)8nRqN61xAQ}{ud=~Pd-loqP?t6z>Mn~_hw=GD zm2(B-pRTHL4varLRrz=xOm>zlRkM()nX15#dVmf-00iq8{Z+M_5JKgoh4AhohSkKd ze%@P`SLhGVHTu&;f6CwJkF)xp10hQPL5}_r)Stcp`tLUS(Vq_CJQ=nV9nQHjQc8Nh z1Gtdjc^b_63GG)+71Ia(?-yBq2j*T6ewS<}33neA1*j<5Dv|_2zEwHU$MTv*snc7+ zpF>(VX=*P?Z@h<~k~ALgZwb%i@MOL%mAvGI;BBxxoBoVvsM3Zbwarc(Tp#ojzjPoT z`z?THKC2^dkYeS-?-E}z{BbI*royxsg?{}JY4y`3NKza{wWqUX2}NY2DI!;syp!bZ zd%BCdj>4e%*Q>t5Fu>$rk5YC>U_bYHFcqd<1%=#>VLf3a_urR%!g?9!e?i*)W#+t; zMsr@ubhM5V!AA2&)0^KyWf4_QiB`$-8=Q&UJV?H%!|&1gVmZ|WsKz5|oNU{R!Z3%A z~b_pW6bsNFy@3!3~SB%sksFA6TBq~j5Ox_K>uwluidIoWLRXk$dJemk!>Pd zLPdLPdL=qdk*&(t`WQ$0S2gz>~84y_~vPNXJNR9`IFBMrL zvPfj1$O4i1BE2GWL}rQ15Sb=2MP#zbB$0_CJtE^o_G46~<1aESvRh$QF@7k&Pk)BI`ufh^!Xr6Im*xgGt9rMtL0ALvhTzA%4( zXFmRk3u5{$n@BAs^(;*#J|%*`*}==y$_nCx#P6^1oX;ri;QR>2hgy!od9G%jB#w4s ze4m5gIZn#bGOPl4ZtR!wOD2^jRY2*cAu;y*voo+?1rt;lc#gu^ujonP{D~_V0#3qt zCxIi?M%PFcJ$}4E_Aq{zp1RDiZv6~F6f%gJQ9*Fupzjv=8^hWxJ2O3@-Mp7oPf{I8 zV=amETPeh2KB&8a;|;8TQR;D@IB6ky-Q;bHi-`~Y+cwe;&;_4Kd}1ZzAB*>A7hr!k z9EbUq9B=q-bCu=|ubiiSlAtQMXFa=Aeen*wT+S1l)Q9?#M;xk5*yhjnsU1A_ORv6Y zXPE^8zH1AAm8sY8)c9)|58tho5`|ZT|&s-jbOA~tx z0p%0X3&=~k1H8V!ev2Bh$$aJEJSr!`MV>B+TrP@S zUJ<#xBy#D+rHOac%E_Nyu9cH*xC!RpiKt!oCq3^kPiK0~{f&X^%Nud&q*t05Z@x%Y z++AR0X_gE&IUX^j!z27t2I1dCeqa^&aRd0Ae^#5Z(ab+NpgwVJIj`W0Ey!f2lRR=Y z$gg5+L?mc^#qoWihv|;dh9bOYq~yY zHSgoiAh?a-&v(YekgKpsLv4ykeV9soKk*v|;4xpGKaBq9RUJ3jc0ls=j*q}gyBoY4 zERXw*3$c%#{%gc{vpCP0glOt{;#t@eC()7`?`dkNriPP@2Kqm|n=L;HCh}E8?I3D| z4aX)M#>d|9FYi(>zBIBaO?~TZa+kt94k#`5={Xt*qDm-#K(lK;4r|$N1Ep zl;yhKEaPQynQEAZwfBv>`dP%mgy*yV4-)x*hZN?%= z%w^P)vIbg)87+)Y{}dCSG#w9oKStt{Ouf2XARqZq@+XqrK=vEIia!RA59jan&d;^x zszvooiiuDEhtL(KuA8kc9iPbws!-d5HglGq2SoZDv7U`fP~B0;m^Qd_2v&5_zjzqG zOGN9;Q5S2dKI2}fKg6vb{z_08dok4$Fjs2xCF0k^`9G3EBq{7?(D{+&F9o*y@jh)b zC05#fyHW;JDP?&)>&u@`f(ub!K7lRt{>f!(y=yCdMVzTOcY}7b6tVLIgwuE*!dYs= z(ShNgE{|9KH&PxiaWu*5z$+w&NuCHY>V=`+At;Z#Zb4+YnDpCdCOWq{EL6Abhnj72 z{L)RM2+2y8yA<9XdOCKAfL+9!xo@EW;ASyz`mZy3OL+4wZ>VAk@7{Jcq)Qbxj@IPY z!kTA)q06`q)1O0swW&VJ;u@8|i;-SR{NA=0{E(YCj@jA52Mu!&gnE_!aJSdCf*P31<_n80Uz%xzOC~Mk~~cv%`Nd%nyV7= zv%V}+hZn;VcbE4DD$S?TKYx;}u5AL|)bG!{!>Y1VeatQAsD!WOAuM>Gl}^nEGaAyVN%o2ea`)w`BubXC1ADYB#>4@6jx6Ocl(ctctOU)YqXR9!pMJReBRFI!=2}*{AE)WFB8;JMKNi39$9e@g7w~yZdYgzGv8+LH7E85 zv=X%9r@a^1M-ejX>BFfci%RZ@QsVdP?hDU@@|UNeq40+1VXY3Ml^JYTp1`NPWy{!u zyu@nPn`g2XtMZ1&8yv?}-f+6U$*xlOt>VjhooXc|R{RdiK_yvEkSgU*<=hCaE`+km z@_bzCI?xO+d8<2Iuj4=jSU_{sxg>2I!%OdEggm)Q1@KtD8MT&|26!ld+S|)Gf~d5k zg~Sd-Jn11seDyYXkLRxhcGARd)iHri4|~IVz8mqEA=&*ArY#@K_rNBNsZI{=)ioj?LM!8)Gr?ZN&fjgBay6PEc*lh>yu92VVth zIlIH^P=;1sfJ<+9Mu&E|9_DMGnXiel+x@3sXDhWmOOLs8Nc|tK{eDta*Dt8M{d(48 zX*T;xZR!S*izv;bD{yJ@(nOFdE3)t(<+t^1w(E)JoZshg6U<)^<1?-C@G9qfJg~nq zyULZARcPJoly@QbLtsMUY+T^m6lx0Ws?4tOhO3Y|$Ux*^B&kco+^Roh@G#cIM3>Wp z850~axgVo}rs$=Kj6s(Q-`;##%1_UKo`*|KuXMxSLe>OG` z7n_HO{Pj$09gVK6pp9_$bhmYrXkF>Uu)=?&{$8o-pHI80RGhYJ73x2+tKMZ- zJ?yGgpWtK|Yu6TiO3W(t#!s}XLoI?Gl=DQ+9^9^1-g0&Bp2kfu?h)8^lCeu>Z06D= zQ|rw~Fy^ag-f%tg3>+4z_)Nal6`#C0bE>iM|FQQza8h06{r`n5uptmGkwlEBHgR-+b1GCBO&UAMcb`xSZhFCP%ZZ);o(r?!k6)n}RrAlnn zRcV7Qja#LbD(co!T@-Z_QHi4b-k)>tnK?TdFtzpD@9))Kc=kN!InVQ)=luV3&po4h zcj8)E_zu$%&z6zzFs1tWrLyzjiO)ptlXAnL4}(^yw^Lk`&;A`I?~uvcPpT)Ma$@8Y zray8r>!g{D_O}*iqtSHYbCMmDY(26n2G#eOPa<#nfoSmFEw)jyT@kSrOHAX{oS#HJ zwf#NZtoVby@IT8zh9a-kf8c=Ce;s725ZuB%|0}RVz)250a*Le8G_kJqx2jjL(kb?^}uD*(*~~eq@N4ZGc`)jgi?BHq&!T|wNZM$eOtx! zEI;I=XEB}wqe{;wIUP}~Gpf&rP8H`FU)v<*X8ibOjoM*2e#{E(Ki~NAm#~uxGk$yk zJQ_cCKdW|V`n6iD)cA2z{7uU9-6x(M4fFgxw}y4-_agUgxM6Kk zG9G)oIu-icZ~v`h+*j}%sQxpI+vpfaE~~zDV;}REvi@S^L_S^YFQTR6yQC&AH8UeM z>Mt_I-vf%;XI5-^u|50kQdXEURebADhV$D|{XPQUFV`DC_pgx9u-}O$xwEBbP+@V;aAXpBOOmoR|44`A?o0TC99M=AdPh9qbQlzBT#_=^r`K zZT#FXD*f*KYqr!3O3eqY8p)sL_jn{f5Xp}iKk2{G%186D;|G!V{~Y<&qC9fl$Z6i! zU*wOnWxx3A#eY+YzxqV|vx@H+?*>#}+;3_8BPW`Q@=NmqW3$sg_y{COxp)A%`meS=MJ6#uEuA;0*;$oIJN`u!r6 zXKy6GBg(IS$-m${B<0autS?b{{*e^-NpWBm7wZe(`~5{&o`LjJo=1(J`}Ke&?Joymur;1OsJ3jU-q)-Zu?IB?Hbj{JtzK8r19P58b2hBgVK2I zSdH)98Qo7UH(JS^31=}|Br__RpMA5KF1;sSY+~X5A-P?#6T7}gdi49Jav9%diq5>H z{|(wAn{i^7T>b9CN7yT4z#cjAt&Osm`^Jnr>%^BM|1-vg^HIzBR1~s5;@lVc_eB2P z*1u4BIqSsEh`wDezY()!F@uZZUT8Jm7jZPpeRPrLvG-h|5$M2)X<}x+GD&V2v?K~T zWj3&noH&Ua_G!Ewt`0}0y9U{Uxnn(JR2|rXT^}XO4*hGGWg~Y!|J>P3U(Hm1WFqzC z^`Em9D{?db%>;dytPX=RarwVm@@IeH`y*R+ojRMzE95i9kWj(M&3uuV=~dAC%YqC; zWW1xEn$c9x`elGH&I>|pA*?%;W zmz(j8{1MQDlE2u>&qiL<3i5j-Kk>o|a@}C7e|Hov_dgUqa?R&YpUuRu=udZyo9>T1 z{Hd{(e&iyB2MXV=@MKwdCPC21okeOUF8|F%|BI-v7sG7ody4e`3ibV&Pe$^M=axTT z{rep&--LX5eSZ=4Zf-01UMlKUqJB7(TOj<2kfZ+R za5TO3%-PIpQFn&aoudAD2h`V#x+SC@5OverptgwGWT?en`tHZBAEC}Y`s2bi?^sdw z$mh?FPWw!C*Q*}8?6IX)k3DmC=pC!7ANe~Gr*}<$Y~o{y>c^gW)7fvnsaQvm-$uRq z&&VIgz+YMZky}zD(|o_<;`j1%v3_FYvwv+W)55{0Cn!K$d4Jjj@`Qr1`jK0DLByZM zO^m#=#IFFuzYXLG1;d{)ZnmaoohnTRu_DKLr^35+F|~7(I{NvKU1CvvCt6YfAhIF#L-^o=`CS88hB~`FCyp zIi{HWEca(pWaHUOk756#gIyEPUb&%es`S|B=?Utgchc{M#HS~y$1VBat6nZ~_R^p> z&u->6-%bgo07_^aS-drTD{nK*|4PhECuld30~QWGc?gc*9!DWg!p@x}+_mwN~R^z)SXxX1ka z#-07*=br4P7ddgk+2_uh{^Z1z5B>D)lj=iGj2Cv3uq!|IQ>x7p&>1VH`cDcuv6P~F zQa#CuUp#!~?33y}P7H4cQ;%_C6pX6#zt8_$InZ=)nwJ1NfbGCs;FZ9|KpfCB<#W@# z%K#4;{p>XFIB*#F6tExI3+x1T1Fsby&&7W;&6@?x0cwB^2c~%|fE$1Sm?zU##DNCjZXgA01Ktko0`>qO1r7njz;nPa zfLWiM=EZ;p;6C8ZKp(Ih*b5v04gp^Qz6G2DyiZN@eBd>}B48op$;4tt_;CF!afSyyxejPXz=@9K7 zZkp=<8}K|ZftB&gfd#;4@F%XB?Ds92O4fSb0PY|#1dIay^;7)-$O8&L*Apka>6h?G zwilj3@!c@hj{|vN02l>gH{u5dfFWQM@E4yy-gDV=K6>oepfmAn(Ao5B(3wZ)05A%~ zDEmCn2lN92fX%nXKc3{*6srBy?^gSt|4_A`ZMx9E@q3es;g;_QpT5w)w6A&$efVF{ zd70;b;PfQF>ffZ>^AmS_{{C;4@RWmh7CKtnHwT4WF39HEH+!w^Tawwr{oq3f%jpyR5fJ`-Blke`m+13{CYFB$H3;+V5}AZEX+I-7V?7Nv-E) z2>+ufd>i;@Bm9tqmsF457UH9~Eu^E>W8KhK`g@j6x5CqFX?M4Fb|tex-8I()b!!@H zf>pUfkZ#X)ZO#O3>9$-)4@DKUXU-;^VhT2Aa;I$16 z*=z>VITGwW$xy$<&y-VDs*OvKx5i|K@o1UwKF+f4%3Q z_uqE!h5yD%JnWVJjq_gIKUc$Bywbn%-i!NZ<%9ppMIWX8g{7MLzg+{yJzV@Z?nOSf z1m(VETfBxZ*4E)7M|8oCdeeB~0p8UjLKlRB^eR}XSpZ(myzxmsz4}Jdc{{HYk zJoAO2fBfQ?j{MV?|M}>@eC4ahzV`KR4FBsl|Lyp{f9u;LC%*IDli&OP4@RGT?uVy- z^y8nLe*ULFJM;5job~>*1IM`sh8Hz({CB7SzdQc_bpHRcf&1LyX5jwsPXG0{SNlg+ zgwV&X*$A+_y(O1QCvvUrg>(nK<(=MgZ;iK#zYX3(?>cY3w+xKQ6VI~rSl$)c&J`W$ zw1>MkUAQ}$?K1f74qlth=2|3Mm+M&G-C9U=-rAL`Zg;%ivekFhu3S~3thph!aM9Gswe3MN zpU<|oBsDJ%GRe-MEtyION$7<_x-DPO^fQ}d##G3pgSx=Roo#LINHSY(C2u-9(k+E- z&-}@WY&zM=tToqONVXt}grohc&Y-g^pU-s=l1{b-n{piiGu|{hK--K3^NsP?FZ&iw zojfn7Et%1U?z`5mY#;(m+|-e4BZ}6}AlccOZfnl=1gS2w*l9=A7MTH8Ydh;3Ry+?F z^^+UL-`bv1g40L_&0U-E2R*s24%gQC!OB7aYg?|f5M*2LPorJQ=}32WWeY)WlbM=p zWkpWOrg@sPw`S9+V9vEI*^aA&O$)IRdJCpgYmI8_AzX@EH&EA!4Z8vFG zy025Z+e-_B&U~_k^ukU>NoL1nn44b<%JQq2_H?=i(io&m3tnjY(WHV+`b4naRCY{WO)}rUS8_$!*t*wrrDYuf`4d;~WETqmO zcfI8DUDUQMtsMm|!HNY$mS#-^vWqrxj=bNPYfsZUuchMP1O+9rXxD<9Bv(pzE}w2! zJLt@j52^H)))t31%A<65o_0fxQO=ZFrpf08CV#q!G2&^X+O-xk9cfx3wc!48{&VL` zB$P@Pl9)R+EOMt=nnvG|{>`p*r;Jf8UlVmO6d*lbTPt;!N=JjBS7;}dU1kltHThrI z2^vj*WQ+HFOUZDnmnx7Mv@(yyTsUO%QR-%(NY9) zCHobVC)1&ettLQjj@RyWnST6gsqyBtcV)An?9onS(Zh`Jf{EV5@qX3v<;y4NxjyD4 z3}di3v3^pucVjGePl8Q`AYj|q^QxONO+230o$uzUhQpiWu}?w}|KxR^(ccO^qtUCL z;m992JO=G$H<7Sj_y%zYaYOpwJ-6~VfoGeRJ~0(|$LoK1`m?WUf8V&seYlWp_gZqD zUT15&*Op6dk`!5=)417^Zq@MRQ4`zcQn?qzl#9YeMzW7>o>zcJ+cX~g*hTyu;5I*g$H9Ns!TTKi_Zv0_=P21V`Xm`ch(+T*RTLxM=H+Tu|?O{Zk^Dvh!& z_cJ7INw#Lyw|L$P#uHPuio18zt#l_tRf{^6WXf~|$t}57sxLYS)8J&dX$3OFTb65M zXbF1@`ImO&?x$2s5*6k~sf$Z$PPb^NXF60YwAzl%n8`%MsRv`zqp5_oQ00~HDqNfED&SZpD>ZlR z=*p{$A2aer<*B@hOf%&xzp)L?PPTfhZONH>ji;@Z30g`rW;&{}sIRYSYpc-=*7H(4 zbA!8h0wFy--d%THn@U{^!js@-R4u@~nK_)9UZZPE5noLs5_v5ExmYSvx=B{K%O9ppEy1Ao^Nvgu`NVXf4c%SI9(sU6X5Rfwos$us+|8>P&iFB(@7%I=9lAWcSu| zsBcJk10IXsME=?)TSdD`eBTBsM+Prk6~NSeBCX~aWaCEpx9>1@!M%x+1hXycYI z-O@G2Pk~d|XlI#`?`mdMR*IJ)vXE2~9eZ1H*<4$5tD-6DR41dxVB=`cWm~tvV*MHy zSUs8o*HVm}On0W|v6y?HHQO4F%k8<2t?A8p=C${LcdCCZ(VBDjlQzX!q=8chBtFlU zXKRN_Pc;IU@XhoTPO$Z7ySi!B^q#6$5fACk6w)k{($uPmmZZTmjI?{3Iv8Lx#b~U5 zjGl;xj7+8+ndWp>i3;nftW!OVEChGxB-ql6?N2XeqV{LQ!nRgwUzV=6WAXc_VJbB1 zXM`%^)V9{<=CsLl8?L%#aSU#KfWowXGNFWrZAs0}OLY~LZe}gw-+&b@wahH0BjJwi1VB9;rea3x*_qcJ_dfmot z^s>gi-D@)LIFvc`*|^r*jk{{~8gEDB7L2>f+kl&BT1E?>LWTWs8=-W=mLcr%Q<+VhNC z=N;cDzGdDKUQs_ao2fABKI)vy0x|5LEPJyuJNA2 zt*c+EXwRhj? zEx~<5?Fui3dnfrCME)6(-@|QeTy5-?J)>_7?Hb0Fow8riZDdO4E9PS{Vo0BU1V)UhY7~C<5p;+5BOtEdO z+DJ3$Z?Zh4T`G3u!qBF4#+v<0O>%h8m&6z3hhvkI6Qu72`BvI9bQzoSSvCf>h9r49 zFL3W0gO+TrlgbjNuRPodZOXN^x0+4N&eqK;cdJ45f{EX~Z^VwUY`1JOdtGBnt{BZ& z9?E=8W8+G6G%c_9nz~X2rZQCCc19h-UXVLQHJ+1)Hoq$-+Tp91eNMQx-)xz?*+%_| zwg8!Nma?cVnI|7?-8!EUmZzctN_(+>RyLrilO~g7U8O?PmQ+bmR4>z;l3K~TDJW%C zQU5vRL*vJ2ZPNTng&_OJwArY!ie8|7=Qf2rTeK}onQdt{r7vPrR1<{1=@!r12D}DX zvg8);)?07!t^~gpmMdk%<3<+W+1AbNthF|7q}wFvEcd|kg^n8* z;j%-o)t*RDatF&N$(o z0*-#3^Jci~kvoaoh&zIN92f?U0Y`x&z|fxqxQBs5z(HUTcnUZG><0#beZXE|56}hzsd zGV$tgom}lL<9MAJz30*#n}&{Gn{+tdl5{rPn(u7wq~6YTJae_7%%dSRw{?zp^}Xl_ z)FxjTwc6jRbvmtu{%mVaO}@2VRa@=I_>&sUmzX#MXjdW7lq4}dZMm*avs=w_u*D1# zO@y-|)WSSWD*hKnInS%9K}WR39i&@2yU@vA1>0cQX?od!xHa9-dZnuk$7{)1ig5Gx zbd%m>5#(LX-*h(_*&e*Q?$v>JZy|&BHxi5XC$#o8+vV&}@kL75S!tDo`Dvj%go~u)4cVGK(}wUSJu(jSQ}>fvFss#-eWB zsykP$zGoHv6ZyU1I&GPI&AFWEySAz_ZY+dhrXLi~4WXauq>({l!+H%aRig1CJDRB8!)w*t*0q`lvbP0&U1z!@oRqFCz2MaZm#_vp-CEv{ZsE0h zzAJBNp+8jP-Nha$bH}B*?pkl%+U08&UN?W4YW&3B-naHX+{=rS3*OrM*0=P|m@t7i zC67M(=mgHG#(ERIJ9z6c=c>htdwO{f!po9GVh2$Mb9#65BIWVAB$LThS5NBB=eOqb zW8RZ&;tkL$gUupgX|HqRmiR*eC$864asgKo09BJ zvPH>GB^#FPTe5x0E~Yj!c^3S}>sHmSlDl%%3gch7YMF7@8hYL8Rjb!E&i4G*U;D8+ z>3^L5?&+R)`ju0s4&TynQ*Ox@r$79lH@Ldzfse1$9x-!+`_m~(WjR~*J!>1-cUBy3 zSXXCeOyK>r;&hf0N|_;5>|>taxFGZnhR%wIkKOzCpLy38rvGl>^=_Oyl$!7jzFOcJ zG=IGn$;+mE=_CIzH2v+jV%O)tY4$kW@XvhyJ3Y^T;+g3?-{O79yYqt=eX-0xCDc>Y zH(_|Jex3hh^w&a3Rnq)xHX-;U!69#(mp#2H8tVlN%Ix+ zHeq9NKV9~=&|s9TWi=b_$#vXsrmY(`v76MaP1wx51@mv{Xt{1fXGhD1g&nCxvZK(m z!RQVDURyl-d~GVtc5SvqkP-7Uc~xwlu*Z%p>ZFmUQ)XxxLoX`Z7%Ho&VRqV{HdCS? z?9FZsm}P0E6hyjSD6=_TKq9r#6vdKQ_jSoz=V+KTFGhE9&Ryk^h+N^`OFh2|e>^t9 z_hx$jfuqbTUKXB(&qR0v|FM5&UK8{DL%72?hT%KD%zW&Xp5Om+%JXv1?*;mReqdnw z6u;M>;t#)kia&JSMgAbryO1&^EO^TE^T_l8LzhnR^E0OS1BCYjec}W1z)bY#ucq9w zs|tLGcz6C2_C>UA@L(}@0+&gy-wTYwGkOI2YdOO&yTSXRHQ^2-Ct3se0JO!piMiMS zc<4FyC3G(!jdJnpdw~7m!wZpLk>c%HNdCb~1GE zu7MX5JgvD-Q$n1Ru3hzr+Uj&KywS#iY@65y*H}~c)ioX zJK?R0>s&nTyj3-)cpT<)@rEBUaN@`14cnA@vtmQawX4CTJgRC-h8HPq$?lcQu>rTh zey6wOj1tlM2l=*O0TWQ zl04;$Dg$f*4r3put#IwTVEgXXDOd%+;9HUKxF6>w2rIsCw!)ordF2`%a3P%YR(dm@ zGv8<=vl8*l8H$>qHagT1h^E~rCL8H)eA`B7Pj`6!+{iutZTjt9w3D6?Mz?wXF!(4C zJmC3pUkTwYPznL)cbXWOHkRAO4+80kXF!C+h9{v<=;txH4rrh_?zrO|kM?$&S z_802zhvvO?tnR^or{B74oY9>?cLu+Yt~1AR(XBWe^@oRPj<*lG(v`v;B0a;h5sGU>;GexMhi!ui9v zeYkO85Exj29~cJqB5&j006zQ;;`%yq0;50-=mmVjV#CA>J`5-<4sRcD@EepT-#7LD zHQ`SZ_Hpb7Mn8rNjQ$mN?Dzcch%a{4IDh!caem+IaenX{d>3`aIKL?v=lib$f5kXI zF>9PZbon^Hcjh>Mu9dlI9R2k;<^j+bQQix27vRQl=fgi2UDu#<&NzS1*U4L61&mV8 zi3sO#sek5cA>9Yx7vXvMn!uax4$HuI@WEr0$IHks!WzG-{R8r0)nqegiESk9fY(Gg z5G09@x}IM%*&hY(OHB6j&E#JTGOs5Oe|VAa;U?~Z_c`!qnd9JZ8fDDGjeU=C@B7f+ zK)z0x;`ihB9VhHN(C$V4`HTFf5&YnTKVc007W56^--L$i;|_k~B0rX%><_#Vo8E*@ zU~m#+EB2@z`q&g;zyGg{tto7QzYlllN6fv_=)fKN`bGZm*DfO82!j^sL)LZu07^6%V&iuXE zV+Y;SdWEG9Ge`PYj=;$6Xx*FT=XE!6ZnqnM;LQW>!uJ3nI=`F5zoLwbal*?W zm*dQ@8G<9Z+o9yV%}Ax8)RpnHp{v^~K+SQg%*OT6#NzhVZHL~LxjXO{((f(+t~YMX z(?9xIwA~Q7H%6`&iq=-%@)=t?(Yp!#fwvO<1*AG~(}uE~nDf{bo=(;*R(p7z283^A z|E{HG!=m|xZj(P8IZb8L9W_^`=5mfPo36RCbMBRlOKzGrdiP*kiu5WD;jF!k#pQf! z;An?a7P&I@*wcw@J=9g+GVE~TCF=6n8NbQHO+W{+>3NX+sw2*Y9`Ed!Xf3AvmXUw* z&x4YLvH(t> zAPwiQaT`tEc6eJ%3Q+&TvaV3#vQ&AKj9OZ2I;J{l{!7Q?sCK4wrXH?lQ@>Q#%1a<@ zM>io;(icQBo;UMExPH{SCC>UV28;sdT0h>*Ihx#7c1+mz$#sT%KP#5j)FiT9n_JuY zGJtMDYtHC;zj;o4M+dX87Gea zaT?al^EfEDjDt5l>~e=xEzGu>T^>&9Q3=DXnt<;big+Dg0BDNs#Yung$K%Wz?tJSl zyS7$7X}#5VIpe^~aRIyDDo|csl(HTfxj-(brPQ$${e-Jsh&ESwe<+N*5so}z4b;MB z!q!rb>eIGTw)(C@&sqk&wUpd)T1)6(PJ3F%Hy*s_CM=}Yn$Ww@WBcfOqa!s&SE=5r zS7|XZsJB-SZf%jiI_zk}GWFc*%hb!(A)z|I8LIlDFh#8S!6dIRJ*x;;57>sQ+OKDY zkx_hOL+(bW77t4S^@mE~TA+>`SxfpvtHq9dgr~N%2M-*5g!co$0I(bA19kufAO$3V zIB+xa&SCOvyXWOijn%rQrlyg9KnU z_P`?Yz27O#1E+xJXO1`Dzn`Ye`@py14!$&`Wxz)-8}B#bdeC|S51v&CmU-w3>#u4J zW8br+_44t4-_Iud@eRy7#xr*T_g{XIAO8jJPbd2c`~lGGG5^3ndKq&Kx#Qr6-apE` zboO|E5NHJNy@9z6p#7l4Rpb3?X#H0c$GayQS{}S5*TtbwEqlThGA>_uaBi?8DCip> zmS5`{>kRHKOZMo?lQs^~@^V_A66q5a4g-qXk!;_b4i?OxzfjG?dp+&Y2@OB`H#{}L zf<>{|{P_zwd=S$)M3k{g*B*HVZ40iW-nj8bi?mRoUX=6@6Fd}XN3KV`i#g_;>!?#n z=E6e>rF|VI(A)n5^5dp(KHKErQyl#C_q9JV-t;2_;NCUk{SCPJ>%uaw2k!$v`8~>d zK}b6a9)KUjjo}UeF?cfgz1oncQ9R(ICn=|RNIM4Jf7^Kf5bhvu9Qq)T75$EoXT8F} zPkk5ph&BwKSUKK5jN61e3^Wmz$3L_@l-mG43Vxb8n}}$~!F!jD_lI!%aDC`~z|J30 z7gteNI~X_Gm`~@Jhsy=}E@mDLB!C!@2S(p8-k*ZZ5bo(yp?e(HXWz1t4)wL=uq%>l zh+Hpn_x~`|H#c&RJs0{LBeyDY?Tl9Q3e9*lD-HN^AxqEAtrPTc+<)?8`iyhfG&+@a z!9>!c@D1bre(*;>`tHBj|B1`}kL_lkchM^*)tfKxUe7Ei?48%pW3QrDm47wZ3i`0y ziKoQ3jNY4fA@p*!@YRk9OCY@lnbrKgi?CH_S$+=Qb@Y|uR?q3`Z$P>Z*#_jKqmH;& zqG@>gYMN>9rDznTaVJV%=FqJo^bGWQFw#t<*l5k7GGoV z!J4Pu|DmrwGyRYMP5b8uUiU~@KEJihzrD;~)pz;>lbeU{{_uBBUi^;t{_bBk?fSv{ zgQth4zw1V?|MOG-?t@;{_%I&xmn`O)`3~N1ZNxquT!4R{5kC-N&9Z1y#g`t_+1zHRnUjG(Psd8 zp#PQ&{8-}!{!k0;bKM1g9OzHMn;Y*3_k>{ya0U#+J9>sRJcM3kdx1nVx{*BwJqCSL zI)PXMJFXZV9!f$5n*R1;PWHS>@-m0^a zy1e@yuaWsj0%!p0fjBS+m;qD)9(O9mU-^Ky<;xe|`;mXyTlm~JkAD4YU;X~WN9KR$ z-oJR=yWV-pWk0(#{)SAf_0zXCzU|&Ky?^*yzdx_xvYw0fE!e)X_qTsuz4W#{b-yf* zUlv|Z9V452m*7%gdtQO&?JN=sG$ZMkcu;`lMX3Yw+v@dKoYBj5BQX>+T8%&j z{%YO5+{}_S$7bJ#v{s_qxH#OA$))r?4JQvcCBP(9pI~{fM%I3F6P_rj2}Com3^uM@ z#vA@5r?8i6&*#;oYOVR8C;TSHoGFC)%nnobrhkL2`1JjZI!+%F{{iiu_c5^_(r=6c z_?HkC{NZ^2_)qDV-ZS3cg{wWx-an!b0EYI^hrA!z4}b%se}TJqyk8Gr6MJ8}8)^}_ z+fOLsozJ6pnD+T!v`;v?g|#jFgQGoF#eG6gwEy5fVH}zNoBM=KJISvCbNp`RSUhw8 zH($*DY2VvR`O^Or>fBfG1H*v-Ra_uA27Ckj>#TR+3BEs}xZa5~PF0uD27AZ*mz2#7 z#+CV-Rv*3b@0UI^{o(7wxyhf7t3UI>YrZi3iL3G7(z(X}-s`^bi{>v(|MXj#Yg|x& z!zG$5@C=&2-ijS%bCs8th0iGSzog86`0ilVsW-jcf9w$P-FoxYQ_I4yD)YZ{>2o#j zp7PA}{x87aH2FaJI1{lK?Hhbo#y{gU7+AL_9I@st6Cjt0P?Vv&W-&H9xcS zFdrTba{Tu^aQ!H)aLw(62p@eXbHNDL9PSJ>(KUy&INst@cnLG^_+vmG89U#KGk1J3^Tvb7=O4I$c^)<) zKe!4zR|C=uJq`rY&wQ~-b4F+0xEr1rG6V1oz|+s%Q1inb(EFhKKoemx(l!Vbpbv`% z^h1}eg822M3s7b^!PA7U0eCzh-$dRKHYgtQPve#5#RB0&&|^1}UyNS{HlZJX9_R;# zfnYJRK)-ZQyYu{}?hE`zX#G2?ihEq6J@Ebc z{CCb?^o8jk%hN|TeEDeapU>Ux`d_97&ogNLdMn;m)`x#4{<^js3eQaMU8Fwt!k=DT z#y|e4pZ(FZKe*iA{yoCkC+NRu*SZf~Pkg@_#`jp6zPGIZ(W@_-GclE+4VB=^v%>I_7mNG$X@x+u@5=O9;CYundg9>(v-@z zn42(!*CpGv$;jumsi3~`u7a$seA*;DiR>shZCebS5U6*XnK^zK!0*7mVm; z50M$TIX_$zjNJ|1x^?S3b_v_&b#<_Dz>T3;cV8b-@Gl!#CIo?Vo|~q6eP7XW9QHj`DV~ z2%0

          3s?tuxKCUseQRZ&YtpNZIViv#g5Ka>gcr$@8I&!E$Ojjb6HVw8PXD#U^5pR z@xq7CsyL4u?!uPN^mKMLhliHD#48vRzRZ3Gu4`A{H!koG%o`v)hFStsm!`TypN&RO`ME#-?jt7X0^(`$g}tt5@LGCi21@0U2`$6Y3^o%9;! z&7s~g@+Ktwq=3(U>Wc42+L9fdM>Q{p%#|kLaaq;TwVAF$_#IVvDC3vBi_ljc#dD^q z*Dx3QCS!D}%AA+cJW%f>&3rIAZ)MKQu&&j4nLMrqotGJUU+KJzzlZ(n_l{i$4?V!U zqCW}O!QKO`jad)(_p*<_8yaV1g5TmD(tE=5GJOxh`v=fDC)5AVa2=f3&inw|JV0k$ z@;k`$t=RHtl|S&?xQ|ycu5kX8bR?>({N7t9`iHM%{&6$=2=noS`%B=tf1_+SX`ta`-9UZ+lp$~j0il<6=+1b+rSB#x6B-T~=*)p290XxfRF=$7Ev9e9jc9hZj zpe-q*4MH1z)mYh4XnV?N!5gdm^<}gKG}SqsMa`PKAhPCcc1;kT+72{eMK9+{@Al}l z`FJATk>_hjz86Y%a(x&VF)(WBo*MTmplB?nYv=Vlj6K|Tz|B{Dw-erVvJ87X%0p!$ zJ7V|~)LG3RZN0Uw&I%eJTy?fm{goUGOmp7L&OzOMoFa{SYwK^3M*X$8&U;y0^;fv| zapcO*S=c%F|G1qtzjWq1psmVwx1Gs9^h)ykA@UR04jxmR0TzS1^WGTpCmDNPTJW|i z{|xPP=-t%QIjkT4fHJJ`jxY8{w52a!=#TDY4)Ouc@x7mU$3I=@=Z{?I_X2Ss2KYb# zG!Yg9M!`qFbfNFz4gtg9L%;wq2=qbgL+^lG{QW@F`{=)kX8=g-VIKLX%x{3m&Ed&dFZ(>alZ+{yntaGTIQd1JJzp5%ym=PfOfL-{{QK z8giRCJEP0*&6L+nFuDIqr)=t(KALfc`}w?xuO?6ec=+_k(j*%l%+U*abDf_Kzw3yL zdBUmk{EZt|EZtbg4eA@OTySM@OYw>&jd97IxxuEn0S%t>&YLu8y*hX>2!hs4!5oO; zWp(qJ9Wx0IZn-5`cr}4~!cV7l`o58)0KDg)V-G^ik%mq4HP!AhH^_zRuf92WXs*77 zP4<8WL7H>@M$<3Xb+0k(jgiX8+%ftdx>*SxlTiH8+>?(yvhI;`Z}xSxjrWIb$j-yn zek^z|VXu(+wfycpy#L{lHo&~Qd>(FPE#pr(=qy`OD6ccaQ%q39efyCUbG>`G++S#Z2TI(yjM&p zemimW+85GxMl|;ui#W9YXQ}Ui&V$5pPt70OR`SrApbbnU?#m|l4dDI6dvYFqPDDEj zJ__w1Zto<%gQ=e256M3lo558^TF`dmm#rEL6ki^m=t~?e$C8EctB4wV*I4uoXrRi? z{Q>ryB!;<-5kFHh8j}^^#wv5yYAe^NX0v9AXWB#*2Ok$~+?3wBQI)=2q$9nFPn#G9 zXVBz0olH|x3tQC-73v@Rbw%(d(I~-M~2v+@VFx<$zJ(^lPbCFM|g? z$H9Hv?YKci%Y!FoPVhJ2HsKBfy@dJr%j?*Zg<;$QHrn@8=5kwem1XJOo4q5^@`QIK zhI5SQHzw?{W^YcUQ{N38rLCIuqkl()H-RsX@Lq5xE42lRyt%7j*5h;)Pit>J zEH1Z+BjO<)=U{-RX%X{f^5?(mJ=*_Y&)d%+AKZP0(LbEvoBfOE1Q`89d-xMHoHL6m z$wBI%eMcD%f9&_5C;pLNJwMHO@@t;Y2J6@#D*Jw+?|#OsvhNpml;_F!Cirt$;M(?S z-W^9r4S7G9p@7| zNP2l+$ZEbxogrI{H@ddd z_&YmIy|cKz(X+r|@5GJFnSzPM`P<-G(&tU|hj6_pEQUW0xM2h2k>tE_oOuP@Fb=w! z!ZCMGVN=wVn|?n0GMh1i*#be{0CDuzvk$w1b;%v9Np5G20^YlFvcH?KLFqovczlN6 zx2i%}>Q^btUO!bHCholP~+Z-#yY^xDb3wPz+a2_FGk+u01(<~%e?m0LE$@iW9r z<0tpbxQ-)z0hqkB9GQ8iiGvyuu@@^>!nX-sa8hEBA5UU1WYO**Ear)lE( z^UUsbv~)4;YcDi1Ju`LCe7%t1HwUo2xvQD`EBL*GB=;vr_a7IhaoF3SYsNM_ShwK% z8yCiwUpH^TqU-DCEo!+wJ#T3&cKy7COY3gDe&LEm*Dbp7`iJJ}Zu@y$=E6rO*&5p5 zOTu~^M7ZX}hh_IGCYtZ24}g!pYNEdZ*NbTN;6C+s5pLp@)N{bYAI+1CXV;m@n#+mo z<-}DthxNTbpnhCUc{}Z7Kk=(A^bzJ?LH&I-t{1kUXs)5FQ}jh|Iyx@Zd2`^LEi$b? z`V9pp$ECRq`B^-#J0EfaIbBmf9N*)eQ@osZUgtW5-0nsG4KFf z`$WfYWqt#${ncIIP2k!mZ2<3$_&soU->7NlM1TJ+V`={HPxLcov^ca`WwboBp(SHw z`=M1EqYXei`)nfiSG&G2{jYUT$0wh;$k}`0 z?Et?9!oEGDmids9OG^2MzQ8w54C3aRAARp+E@R=^A9K9V`n&Sn>!ZP37n^DX!8Ioc zO@CtO&1n{`>5?Y#hBRG42TRG{CHXLnE7hI2BN`V1>skRD3 z`&PZ1w6u`J@ka@<;a$p772A z=;51MGtDr3@^|a}B-aB-4nN~gIA<_^(m>jRN-g7@bF4JyrNjRDZ$7!cUng{n{U!btrA&K^ST1m$gw8Y%}626dja@q zLHsy|@Gz4~VVP3hHQ`~#mBRJX*~&&~G<-%Z(y7m#Ezj0Wnh&BQKca@dg=oWak~&)k z<`+xC1h)`vyHNvwxFC#bVmP&7EQ7vj6Uh(LWpY9&^t?%|+_1fID3|Ng3gKsp3J?9A zsu6}?7fPu{8>0xf{?M?HCpz2fmZfPF@NnIjdA}}Qx^h+h1FpG=Iii6}xusjh_;XvM z5(sf_9yRf4(^+pj!@Uy|#^q1!L+k2%^n}>}t8g=6cX7@O6zO~;XU!|p!qL1WTe2tA zwUr-^QDsJVMz^kLNDtcymz0_MtINu4or-WOCRh85x2su5Xq)*-h|pR#1H)n$&sch7 zK(5{PaEjCH5IMH%^R}=t&i{%O)i5q%2JSeU$+zD`THMLya&67+Y;8upkmzc8(XZbY?R98TZ!w0im|kvb*QOQsfJN74qYqkCsl(rs zQ5>!MC59-B^{KkgF*53WEsyNv$9Ophl1ks#r5m|B`4&0d7M5<*4{~cO!KJDb>K3iU z7Sbp-el%9vtclQ>U2}7k2EZb&`v&>-*|2d#f&nDO7So zxzNwq`Q%udt!H_z2UkB6MjpD?bwzb>pT(qdyGe5N>7A%kQp)dD7X% zHwIDvqdHaW=82CB^O#RtjnuOw_o173?bKK0!*#cscYA47(Qsq#)k7FF|3{VjfSlz8+1>FY1pb=;??M(Z)-yvwzPJ(nyUh}-^7^(4hpxR|=?q7daEu7QSk1ASyH!&z&-%#|;_dXpt9|K~ z!mVI$GqpUg4P|(#BqsZlEzGH+`;$z!&5+%k&Lp?AhWE{qk7Fp9Zn6|N>M=~(i|Jsi zf{L8cxjS>~6J1tUp*g24(wQ$cX6}PBpUaY$8Y>OSE6t8P&(0u9vj;;ngQqEzXntXE zGkQm52Z!kvqe*b7tZeP49>}VVrXLRPD=F~ylj}Xi?sp+_W@XFH8PX{j@Z*f1eKTLAA7KHbd5#CdO|9gz@UW-L!rT1#2u#nQ!j( zRenZ%)LM1JrY#j|%*K**4%V+xk00P_4o@U;hqAs-s<{qsn8hTh_CEfyU zwv%^gER1se_=;K2Sl#9xny6eY%`M-k3FuxMGaCtKV|E|O?vGh&_|8S0how+Gm@D*H zug9+(wQ`0l*AY>etMVg^g`So|cQGv~dNQ-FaPms!X6E$Jtc*rg%~Mt`)Av^<)!fr) zYBKwr%+u*&Mp&okhbQ`LTQccX7ZXN)fl-HK%m%0V&}!`Auv&A;=z8Zt~7WVdpt9s^FF)x67~zHvnMnScLMG#_A*}z{j$maBJ`X0wG+cT zD0PN@r0#{Z-4$qw3bZO{?)w;T@+AMjQuZnyEPa<5gSP0@*fn|#o`I>{4|txvROQDM z;442GD|_X#xeNdPHAB<)Kf=A8|1$1n=KT+Os)NVL@THH<>0+_rWb(iGk@Jm0wy@}3Emv+?c z@0ON!RKp!s&)d74eH-lfW%>0ue80-Rar|AA{5+t2<0jl*^dxY#U#&E%90DK)EC%WU zJts-K^5STe7e{cl$9x(PeGpJSJz7@&mCDQ(*2xv5Rkoa`ZXAW@S4n5^IO&Y`$9-_6 z!A;wg(_`ye!|m+Vi|;(=r-pva`KV_(`}7meJN=r@PxU{?IjbLW?&=gScnlaK&KMAf z=Hq(UsZ7e(ilpHI%Dv!wPSQ(cMrz=IdR3 zkDG*7w`7T@8MB7~Q!q!UN?G(nM-#*khm|w|0`UfWYRk#Ck>uI-NBmMg( z`NMz4S(IZJ`UxNo*SU2Z<1fQ1Mj0=lUIZA4gf=PzegUPxX|AdFm)-&E+ll@=*t^7Esg5)frn79-ky~{q@qV;2uRV|Fof0jDmIFAi0^>-coq!&9V9YOdCEHF3vI`0r#7-)I#5M8_-b=3MT zQ~h{HG|1ZXXJ)jG?(zx8PSv%U7x}u}mEYDa%xB1#?k?JhZadR6pZdtXuOUmxHW~Q=Q{NXcNYcX7g!yh~y(QorO&db-Ag!kTF;u($$54_<)oZI;j z6aD~n7(U~E1`m(?Mqea58W)vYhvL&7IQ{YW{r-nE6a^dm$1i=$T~Bu;moAL>hHtB7 z&BX~VmRP#$o}UlUuPq1q(U?G62UkeTQqERKKh49{>YW8cR6y|=#eO}bw=Jv+G3$oD z(NBkNtS)rDUhAHn6k(BL$IG$Q7w4<~(lp<1xY++O7dLppbblOB;P>KBEf2r(E!W}? zP4ka@p%gYAhU550fiv8xDt_^div$^-%{(TK-<4DFUigBck}k=_@Gp*N3KyRqSC1>B zuwCDo=Fj~~Nsnmzp`GGBQsMSFguXr}KH1)ne;?pS^5UsvyDKMsBk&z_bSe8z;y+WS zPkf3;kDCTpR$+&~NE*0nUAP{}EWuw7Slh%?$u?I`vi0AZ=69Fr+JXOZ(Y_SMA)ZRQ zTsi3)gzsRPt|Rz|9bMw7q|23)uHJ7`*S=Uvqp5QE4*)SB6NNRwS4m$(6fRxLpABVl zG2|4c=H%w}c1KQnAIHBtqFEWqmCMN9N@eG!L2|p{8!3z9wER(CD_nef+&Ekrg~d-y z^J9^W{E9n{zd^K!E}lwx(SmC0$l7kRqPF-=D^r{IJ|+grqUF zh%|;Ky%QC1gm3172JW^$$i4S5+!?@O-678--4lfHxOrpa)0#+6?Bq1RfF9vCGhLeK zdR&@pP*=Gfxj~?wICm5G2%t7K7yq6}=P3P!bTV{NZ{*Sm7 zhaSo7#P7C$(ZyG(TwGc4#o;^b=#$Jb{I)N#JhEGlnWQW-2YwBVBXw+x8~1 zcq-{~<;17aZA$G&xE|?w3je`~X4{;?Ts^Lg!c=yq zoaEtA+NvniWq_T>*s@o+tIM6kDgGsnjI9&pGB&Q+3g8(zO}j=;xJ`^p6J3u>Q(PJ+ z_91r|Sj_$Nr;e4%)*UA#S7|ILkF)7{<~rz6T=sEkic@`M08gd(BqRPxZLwVMaoR*C zic5NBUpM|eq~USgqrgn?M!@!GhmfhHd%)2n`v&o!OUJ%*w8c}74#iPLyp?R&$|N6gegwcBO*%k9q-w|J!AtwZ@pR$>Enw3#lxs39#(%5D5RWf=8D3c>j z9J22?ez(3@zDj9xWyQCH`ZSy0K@hG-`WE3|2J`{8&4{m(K37)q_3#xOeUjN;rb|4^ z8$E75xN-`M|74m!=;)GdL->b*qpYp0ZQ`qBn=31Q`+rQEaMolhy8!

          EgF1T%F=o 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 Gf&T>=2xx

          xxx

          " ); + var doc = editor.document, + range = new baidu.editor.dom.Range( doc ), + p = doc.getElementsByTagName( 'p' )[1]; + range.setStart( p, 0 ).setEnd( p, 1 ).select(); + var r = editor.selection.getRange(); + var dom = $( '#'+document.getElementsByClassName("edui-for-insertimage")[0].id+'_body' )[0]; + ua.click( dom ); + setTimeout(function(){ + var dialog = editor.ui._dialogs['insertimageDialog']; + ok(dialog.title===editor.getLang("labelMap.insertimage"),"dialog的标题是否一致"); + ok(dialog.closeDialog === editor.getLang("closeDialog"),"关闭dialog的title是否一致"); + ok(dialog.buttons[0].label === editor.getLang("ok") && dialog.buttons[1].label === editor.getLang("cancel"),"确认取消按钮是否一致"); + setTimeout( function () { + var dialogDoc = document.getElementById(dialog.id + "_iframe").contentWindow.document; + var ids = editor.getLang("insertimage.static"); + for(var i in ids){ + if(i==="imgSearchTxt"){ + equal(dialogDoc.getElementById(i).value,ids[i].value,"图片搜索文字是否一致") + } + if(i==="imgSearchBtn"){ + equal(dialogDoc.getElementById(i).value,ids[i].value,"图片搜索按钮文字是否一致") + } + } + ua.click(document.getElementById(dialog.closeButton.id+"_body")); + var newRange = editor.selection.getRange(); + ok( r.startContainer === newRange.startContainer, "dialog开闭前后选区是否一致" ); + start(); + }, 1500 ) + },100); + + } ) +} ); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/ui/colorbutton.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/ui/colorbutton.js new file mode 100644 index 000000000..27d9bee91 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/ui/colorbutton.js @@ -0,0 +1,79 @@ +/** + * Created by JetBrains PhpStorm. + * User: dongyancen + * Date: 12-4-12 + * Time: 下午4:47 + * To change this template use File | Settings | File Templates. + */ +module( 'ui.colorbutton' ); +test( 'colorpicker的功能', function () { + var testButton = document.body.appendChild( document.createElement( 'div' ) ); + var editor = new te.obj[0].Editor(); + editor.render("editor"); + editor.ready(function(){ + var colorButton = new te.obj[0].ColorButton({editor:editor}); + testButton.innerHTML = colorButton.renderHtml(); + colorButton.postRender(); + //_onTableClick + colorButton.showPopup(); + var pick = document.getElementById(colorButton.popup.content.id).getElementsByTagName( 'table' )[0].firstChild.childNodes[2].childNodes[1].firstChild; + equal( document.getElementById(colorButton.id+'_colorlump').style.backgroundColor, '', 'edui-colorlump 默认颜色' ); + ua.click( pick ); + var bgcolor = $('#'+colorButton.id+'_colorlump').css( 'backgroundColor' ); + ok( bgcolor == 'rgb(127,127,127)' || bgcolor == '#7f7f7f'||bgcolor== 'rgb(127, 127, 127)' , '检查_onTableClick选择的颜色edui-colorlump' ); + equal( $('#'+colorButton.id+'_colorlump').length, 1, '检查edui-colorlump个数' ); + equal( colorButton.popup._hidden, true, '点击按钮后,关闭窗口' ); +//_onTableOver&_onTableClick + pick = document.getElementById(colorButton.popup.content.id).getElementsByTagName( 'table' )[0].firstChild.childNodes[2].childNodes[2].firstChild; + equal( document.getElementById(colorButton.popup.content.id+'_preview').style.backgroundColor, '', 'edui-colorpicker-preview 默认颜色' ); + ua.mouseover( pick ); +//colorButton.popup.content.id + bgcolor = $( '#'+colorButton.popup.content.id+'_preview' ).css( 'backgroundColor' ); + ok( bgcolor == 'rgb(221, 217, 195)' || bgcolor == '#ddd9c3'||bgcolor=='rgb(221,217,195)', '检查_onTableClick选择的颜色edui-colorlump' ); + equal($('#'+colorButton.popup.content.id+'_preview' ).length, 1, '检查edui-colorlump个数' ); + equal( colorButton.popup._hidden, true, '点击按钮后,关闭窗口' ); + ua.click( pick ); + bgcolor = $('#'+colorButton.id+'_colorlump').css( 'backgroundColor' ); + ok( bgcolor == 'rgb(221, 217, 195)' || bgcolor == '#ddd9c3'||bgcolor == 'rgb(221,217,195)' , '再次选择颜色' ); + ua.mouseout( pick ); + equal( document.getElementById(colorButton.popup.content.id+'_preview').style.backgroundColor, '', '鼠标移开,edui-colorpicker-preview 恢复默认颜色' ); + //_onPickNoColor + colorButton.showPopup(); + pick = document.getElementsByClassName( 'edui-colorpicker-nocolor' )[0]; + ua.click( pick ); + equal( colorButton.popup._hidden, true, '点击PickNoColor按钮后,关闭窗口' ); +// editor.destroy(); + var ed = document.getElementById('editor'); + ed.parentNode.removeChild(ed); + start(); + }); + stop(); +} ); + +test( 'colorbutton', function () { + //检查colorButton的属性 + var editor = new baidu.editor.ui.Editor(); + stop(); + setTimeout(function(){ + var colorButton = new te.obj[0].ColorButton({editor:editor}); + equal( colorButton.popup.content.noColorText, editor.getLang("clearColor"), '检查colorButton的文本 ' ); + start(); + },50); +} ); + +test( 'colorpicker', function () { + //检查colorPicker的属性 + var editor = new baidu.editor.ui.Editor(); + stop(); + setTimeout(function(){ + var colorPicker = new te.obj[0].ColorPicker({editor:editor}); + equal( colorPicker.noColorText, editor.getLang("clearColor")); + //检查colorPicker生成的html代码的内容 + colorPicker.render(te.dom[0]); + var testPicker = te.dom[0]; + equal( testPicker.getElementsByTagName( 'table' )[0].className, 'edui-box edui-'+editor.options.theme,'' ); + start(); + },50); +} ); + + diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/ui/combox.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/ui/combox.js new file mode 100644 index 000000000..728f637de --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/ui/combox.js @@ -0,0 +1,73 @@ +/** + * Created by JetBrains PhpStorm. + * User: dongyancen + * Date: 12-4-12 + * Time: 下午4:44 + * To change this template use File | Settings | File Templates. + */ +module( 'ui.combox' ); +test( 'combox', function() { + var editor = new baidu.editor.ui.Editor(); + editor.render("editor"); +//设置菜单内容 + var list = [ + ['1',[1]], + ['0',[0]], + ['宋体',['宋体', 'SimSun']], + ['楷体',['楷体', '楷体_GB2312', 'SimKai']], + ['黑体',['黑体', 'SimHei']], + ['隶书',['隶书', 'SimLi']], + ['andale mono',['andale mono']], + ['arial',['arial', 'helvetica', 'sans-serif']], + ['arial black',['arial black', 'avant garde']], + ['comic sans ms',['comic sans ms']], + ['impact',['impact', 'chicago']], + ['times new roman',['times new roman']] + ]; + var title = list ; + + for(var i=0,ci,items=[];ci=list[i++];){ + + (function(key,val){ + items.push({ + label: key, + value: val, + renderLabelHtml: function (){ + return '
          ' + (this.label || '') + '
          '; + } + }); + })(ci[0],ci[1]) + } + editor.ready(function(){ + var combox = new te.obj[0].Combox({editor:editor,items :items,title: title, initValue:'字体',className: 'edui-for-fontfamily'}); + + te.dom[0].innerHTML = combox.renderHtml(); + combox.postRender(); + combox.showPopup(); + //////// getItem + equal(combox.getItem(0).label,'1','检查item内容'); + equal(combox.getItem(0).value[0],1,''); +///////getValue setValue + combox.setValue(list[4][1]); + equal(combox.getValue(),list[4][1],'设置内容'); + equal(combox.label,'黑体',''); + equal(combox.getDom('button_body').innerHTML,"黑体",''); + ////////getLabelForUnknowValue + combox.setValue(['黑体', 'chicago']); + equal(combox.getValue()[0],"黑体",'设置一个不在原来列表的内容'); + equal(combox.getValue()[1],'chicago',''); + equal(combox.getValue(),combox.label,''); + equal(combox.getDom('button_body').innerHTML,"黑体,chicago",''); + /////selectByIndex + combox.popup.items[2].onclick(); + equal(combox.getValue()[0],'宋体','检查onclick,设定选中内容'); + equal(combox.getValue()[1],'SimSun',''); + equal(items[2].label,combox.label,''); + equal(combox.selectedIndex,2,''); + combox.popup.hide(); + start(); + + }); +stop(); +} ); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/ui/css/DEFAULT.css b/nezha-fronted/static/ueditor-1.4.3.3/_test/ui/css/DEFAULT.css new file mode 100644 index 000000000..ba689b4dc --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/ui/css/DEFAULT.css @@ -0,0 +1,12 @@ +/* common layer */ +.cssloaded { + width: 20px; +} +/* for IE6 fixed */ +body { + background: url('about:blank') fixed; +} + +.edui-editor { + width: 843px; +} diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/ui/editor.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/ui/editor.js new file mode 100644 index 000000000..648e2c080 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/ui/editor.js @@ -0,0 +1,188 @@ + +module( 'ui.editor' ); +//test('图片浮层',function(){ +// var ue1 = new baidu.editor.ui.Editor({theme:'default'}); +// var div = document.createElement("div"); +// document.body.appendChild(div); +// ue1.render(div); +// stop(); +// ue1.ready(function(){ +// editor.execCommand( 'insertimage', {src:'http://img.baidu.com/hi/jx2/j_0001.gif', width:50, height:51} ); +// }); +//}); + +test('拖拽', function(){ + var sc = document.createElement("script"); + sc.id="sc"; + sc.type = "text/plain"; + document.body.appendChild(sc); + var ue = new UE.ui.Editor({'autoHeightEnabled':false,'autoFloatEnabled':false,'scaleEnabled':true}); + ue.render('sc'); + stop(); + ue.ready(function(){ + var me =this; + var offset = 100; + setTimeout(function(){ + //保存现有的编辑器宽,高 + var editorWidth = $(this.document.getElementById(me.ui.id)).css('width'); + var editorHeight = $(this.document.getElementById(me.ui.id)).css('height'); + //取得拖拽的元素 + var scaleDiv = this.document.getElementById(me.ui.id+'_scale'); + + //从拖拽元素的右下角开始,拖拽到向下,向右20px + var mouseX = $(scaleDiv).offset().left + parseInt($(scaleDiv).css('width'));//+editorBorderHeight; + var mouseY = $(scaleDiv).offset().top + parseInt($(scaleDiv).css('height'));//+editorBorderWidth; + ua.dragto(scaleDiv,{startX:mouseX,startY:mouseY,endX:mouseX+offset,endY:mouseY+offset}); + setTimeout(function(){ + //取编辑器的边框 + var editorBorderWidth = parseInt($(this.document.getElementById(me.ui.id)).css('border-left-width'))+parseInt($(this.document.getElementById(me.ui.id)).css('border-right-width')); + var editorBorderHeight = parseInt($(this.document.getElementById(me.ui.id)).css('border-top-width'))+parseInt($(this.document.getElementById(me.ui.id)).css('border-bottom-width')); + var border = me.options.theme=='default'?1:0; + var bd = parseInt(editorHeight) + offset - 2 -editorBorderWidth + border; + var height = parseInt($(this.document.getElementById(me.ui.id)).css('height')); + equal(parseInt($(this.document.getElementById(me.ui.id)).css('width')),parseInt(editorWidth) + offset - 2 -editorBorderHeight + border,'宽'); + ok(height==bd||height==bd-1,'高'+height); + setTimeout(function () { + UE.delEditor('sc'); + sc = document.getElementById('sc'); + sc && sc.parentNode.removeChild(sc); + start(); + }, 100); + },1800); + },100); + }); +}); + +test('编辑器皮肤',function(){ + if(ua.browser.ie<8 && ua.browser.ie>0) return 0; + var ue1 = new baidu.editor.ui.Editor({theme:'default'}); + var sc1 = document.createElement("script"); + sc1.id="sc1"; + document.body.appendChild(sc1); + ue1.render(sc1); + stop(); + ue1.ready(function(){ + var id = document.getElementById('sc1').firstChild.id; + equal(document.getElementById('sc1').firstChild.className,'edui-editor edui-default','第一个editor的classname'); + equal(document.getElementById(id+'_toolbarbox').className,'edui-editor-toolbarbox edui-default','第一个editor toolbar的classname'); + equal(document.getElementById(id+'_iframeholder').className,'edui-editor-iframeholder edui-default','第一个editor iframeholder的classname'); + equal(document.getElementById(id+'_bottombar').className,'edui-editor-bottomContainer edui-default','第一个editor bottombar的classname'); + equal(document.getElementById(id+'_scalelayer').className,'edui-default','第一个editor scalelayer的classname'); + sc1 = document.getElementById('sc1'); + sc1.parentNode.removeChild(sc1); + var ue2 = new baidu.editor.ui.Editor({theme:'modern'}); + var sc2 = document.createElement("script"); + sc2.id="sc2"; + document.body.appendChild(sc2); + ue2.render('sc2'); + ue2.ready(function(){ + id = document.getElementById('sc2').firstChild.id; + equal(document.getElementById('sc2').firstChild.className,'edui-editor edui-modern','第二个editor的classname'); + equal(document.getElementById(id+'_toolbarbox').className,'edui-editor-toolbarbox edui-modern','第二个editor toolbar的classname'); + equal(document.getElementById(id+'_iframeholder').className,'edui-editor-iframeholder edui-modern','第二个editor iframeholder的classname'); + equal(document.getElementById(id+'_bottombar').className,'edui-editor-bottomContainer edui-modern','第二个editor bottombar的classname'); + equal(document.getElementById(id+'_scalelayer').className,'edui-modern','第二个editor scalelayer的classname'); + sc2 = document.getElementById('sc2'); + sc2.parentNode.removeChild(sc2); + start(); + }); + }); +}); + +test( '判断render有内容时,显示render内容(script)', function() { + var ue3 = new baidu.editor.ui.Editor(); + var sc3 = document.createElement("script"); + sc3.id="sc3"; + sc3.type="text/plain"; +// if(sc3.text) + sc3.text= 'renderinnerhtml'; +// else +// sc3.textContent='renderinnerhtml'; + document.body.appendChild(sc3); + ue3.render('sc3'); + stop(); + ue3.ready(function(){ + equal(ue3.body.firstChild.innerHTML.toLowerCase(),"renderinnerhtml",'标签有内容,显示标签内容'); + sc3 = document.getElementById('sc3'); + sc3.parentNode.removeChild(sc3); + start(); + }); +} ); + +test( 'render没有内容时,显示initialContent', function() { + var ue4 = new baidu.editor.ui.Editor({initialContent:'
          '}); + var sc4 = document.createElement("script"); + sc4.id="sc4"; + document.body.appendChild(sc4); + ue4.render(sc4); + stop(); + ue4.ready(function(){ + equal(ue4.body.firstChild.innerHTML.toLowerCase(),ue4.options.initialContent.toLowerCase(),'标签没有内容,显示initialContent'); + sc4 = document.getElementById('sc4'); + sc4.parentNode.removeChild(sc4); + start(); + }); +} ); + +test('判断dialogs对象名包含"Dialog"字符', function(){ + var ue5 = new baidu.editor.ui.Editor(); + var sc5 = document.createElement("script"); + sc5.id="sc5"; + document.body.appendChild(sc5); + ue5.render(sc5); + stop(); + ue5.ready(function(){ + var array=ue5.ui._dialogs; + for(var p in array){ + ok(p.indexOf('Dialog')!=-1, p); + } + sc5 = document.getElementById('sc5'); + sc5.parentNode.removeChild(sc5); + start(); + }); +}); + +test('getEditor--delEditor',function(){ + var ue7 = UE.ui.Editor(); + var div = document.createElement('div'); + div.id='editor2'; + document.body.appendChild(div); + ue7.render('editor2'); + ue7.ready(function(){ + var ue8=UE.getEditor('editor2'); + equal(ue8.uid,ue7.uid); +// UE.delEditor('editor2'); +// equal(document.getElementById('editor1').tagName.toLowerCase(),'textarea'); + }); +}) + +//test('多层div 全屏',function(){ +// var div1 = document.createElement('div'); +// document.body.appendChild(div1); +// div1.id = 'div1'; +// div1.innerHTML = '
          '; +// div1.firstChild.innerHTML='
          '; +// var div2 = div1.firstChild.firstChild; +// var ue6 = new baidu.editor.ui.Editor({autoFloatEnabled:false}); +// ue6.render(div2); +// stop(); +// ue6.ready(function(){ +// var me = document.getElementById(ue6.ui.id); +// var left = $(me).offset().left; +// var top = $(me).offset().top; +// ue6.ui.setFullScreen( true ); +// setTimeout(function(){ +// ue6.ui.setFullScreen( false ); +// setTimeout(function(){ +// me = document.getElementById(ue6.ui.id); +// ok(left==$(me).offset().left,'left不变'+$(me).offset().left); +// ok(top==$(me).offset().top,'top不变'+$(me).offset().top); +// ue6.focus(); +// ua.checkResult(ue6.selection.getRange(), ue6.body.firstChild.firstChild, ue6.body.firstChild.firstChild, 0, 0, 1); +// me = document.getElementById(ue6.ui.id); +// me.parentNode.removeChild(me); +// start(); +// },50); +// },50); +// }); +//}) \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/ui/editorui.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/ui/editorui.js new file mode 100644 index 000000000..ff49f4935 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/ui/editorui.js @@ -0,0 +1,11 @@ +/** + * Created by JetBrains PhpStorm. + * User: dongyancen + * Date: 12-4-12 + * Time: 下午4:45 + * To change this template use File | Settings | File Templates. + */ +module( 'ui.editorui' ); +test( '', function() { + equal('','',''); +} ); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/ui/mask.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/ui/mask.js new file mode 100644 index 000000000..eccbd0264 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/ui/mask.js @@ -0,0 +1,11 @@ +/** + * Created by JetBrains PhpStorm. + * User: dongyancen + * Date: 12-4-12 + * Time: 下午4:45 + * To change this template use File | Settings | File Templates. + */ +module( 'ui.mask' ); +test( '', function() { + equal('','',''); +} ); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/ui/menu.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/ui/menu.js new file mode 100644 index 000000000..a2fcdfe3f --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/ui/menu.js @@ -0,0 +1,327 @@ +/** + * Created by JetBrains PhpStorm. + * User: dongyancen + * Date: 12-4-12 + * Time: 下午4:45 + * To change this template use File | Settings | File Templates. + */ +module( 'ui.menu' ); +test( 'menu,submenu的显示', function() { +//设置菜单内容\ + var editor = new te.obj[0].Editor(); + var items=[ + { + label:'删除', + cmdName:'delete' + }, + { + label:'全选', + cmdName:'selectall' + }, + { + label:'删除代码', + cmdName:'highlightcode', + icon:'deletehighlightcode' + }, + { + label:'清空文档', + cmdName:'cleardoc', + exec:function () { + + if ( confirm( '确定清空文档吗?' ) ) { + + this.execCommand( 'cleardoc' ); + } + } + }, + '-', + { + label:'取消链接', + cmdName:'unlink' + }, + '-', + { + label:'段落格式', + icon:'justifyjustify', + subMenu:{ + items: [{ + label:'居左对齐', + cmdName:'justify', + value:'left', + editor:editor + }, + { + label:'居右对齐', + cmdName:'justify', + value:'right', + editor:editor + }, + { + label:'居中对齐', + cmdName:'justify', + value:'center', + editor:editor + }, + { + label:'两端对齐', + cmdName:'justify', + value:'justify', + editor:editor + }], + editor:editor + } + } + ]; + var menu = new te.obj[0].Menu({className : 'edui-for-lineheight',items :items,editor:te.obj[0].Editor()}); + menu.render(te.dom[0]); + menu.postRender(); + menu.show(); + var menuBody = document.getElementsByClassName("edui-menu-body")[0]; + equal(menuBody.childNodes[0].className,"edui-menuitem edui-"+editor.options.theme,'menu窗口显示'); + equal(menuBody.childNodes[0].firstChild.lastChild.innerHTML,"删除",'menu窗口显示'); +//edui-menuitem edui-menuseparator + equal(menuBody.childNodes[4].className,"edui-menuitem edui-menuseparator edui-"+editor.options.theme,'menu窗口显示'); + equal(menuBody.childNodes[4].firstChild.className,"edui-menuseparator-inner edui-"+editor.options.theme,'menu窗口显示');//edui-menuitem edui-hassubmenu + equal(menuBody.childNodes[7].className,"edui-menuitem edui-"+editor.options.theme + " edui-hassubmenu edui-hassubmenu",'第7个menu有子menu'); + //submenu + var menuid1 = menu.items[7].id; + var submenu1 = menu.items[7].subMenu.id; + equal(document.getElementById(submenu1).style.display,'none','submenu初始的display值:"none"'); + if(ua.browser.ie){ + ua.mouseenter(menuBody.childNodes[7]); + } + else{ + ua.mouseover(menuBody.childNodes[7]); } + setTimeout(function (){ + equal(document.getElementById(submenu1).style.display,'','显示submenu,检查submenu的display值:""'); + equal(getElementsByClassName_2(document.getElementById(submenu1),'div','edui-menu-body')[0].childNodes.length,4,'检查submenu的menuitems数量'); + equal(getElementsByClassName_2(document.getElementById(submenu1),'div','edui-menu-body')[0].firstChild.className,'edui-menuitem edui-'+editor.options.theme,'检查submenu的内容'); + equal(getElementsByClassName_2(document.getElementById(submenu1),'div','edui-menuitem')[0].firstChild.lastChild.innerHTML,'居左对齐','检查menuitem的内容'); + var menuClass = document.getElementById(menuid1).className; + equal(menuClass,"edui-menuitem edui-"+editor.options.theme+" edui-hassubmenu edui-hassubmenu edui-state-hover edui-state-opened",''); + if(ua.browser.ie){ + ua.mouseleave(document.getElementById(menuid1)); + } + else{ + ua.mouseout(document.getElementById(menuid1)); + } + setTimeout(function (){ + equal(document.getElementById(submenu1).style.display,'none','显示submenu,检查submenu的display值:""'); + menuClass = document.getElementById(menuid1).className; + ok(menuClass.indexOf('edui-state-hover')==-1&&menuClass.indexOf('edui-state-opened')==-1,''); + document.getElementById(submenu1).parentNode.removeChild(document.getElementById(submenu1)); + start(); + }, 450); + }, 300); + stop(); + function getElementsByClassName_2(oElm, strTagName, strClassName){ + var arrElements = (strTagName == "*" && oElm.all)? oElm.all : + oElm.getElementsByTagName(strTagName); + var arrReturnElements = new Array(); + strClassName = strClassName.replace(/\-/g, "\\-"); + var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)"); + var oElement; + for(var i=0; i < arrElements.length; i++){ + oElement = arrElements[i]; + if(oRegExp.test(oElement.className)){ + arrReturnElements.push(oElement); + } + } + return (arrReturnElements); + } +} ); +test( '先打开一个submenu,再打开另一个submenu', function() { +var editor = new te.obj[0].Editor(); +//设置菜单内容 + var items=[ + { + label:'删除', + cmdName:'delete' + }, + { + label:'段落格式', + icon:'justifyjustify', + subMenu:{ + items: [{ + label:'居左对齐', + cmdName:'justify', + value:'left' + + }, + { + label:'居右对齐', + cmdName:'justify', + value:'right' + }, + { + label:'居中对齐', + cmdName:'justify', + value:'center' + }, + { + label:'两端对齐', + cmdName:'justify', + value:'justify' + }], + editor:editor + } + }, + { + label:'表格', + subMenu:{ + items: [{ + label:'居左对齐', + cmdName:'justify', + value:'left' + }, + { + label:'居右对齐', + cmdName:'justify', + value:'right' + }], + editor:editor + } + } + ]; + var menu = new te.obj[0].Menu({className : 'edui-for-lineheight',items :items,editor:editor}); + menu.render(te.dom[0]); + menu.postRender(); + menu.show(); + var menuBody = document.getElementsByClassName("edui-menu-body")[0]; + //submenu + var menuid1 = menu.items[1].id; + var menuid2 = menu.items[2].id; + var submenu1 = menu.items[1].subMenu.id; + var submenu2 = menu.items[2].subMenu.id; + equal(document.getElementById(submenu1).style.display,'none','submenu初始的display值:"none"'); + //打开一个submenu + if(ua.browser.ie){ + ua.mouseenter(document.getElementById(menuid1)); + } + else{ + ua.mouseover(document.getElementById(menuid1)); + } + setTimeout(function (){ + //检查第一个submenu的内容显示 + equal(document.getElementById(submenu1).style.display,'','显示第一个submenu,检查submenu的display值:""'); + var menuClass = document.getElementById(menuid1).className; + equal(menuClass,"edui-menuitem edui-"+editor.options.theme+" edui-hassubmenu edui-hassubmenu edui-state-hover edui-state-opened",'检查第一个submenu的打开状态'); + //打开第二个submenu + if(ua.browser.ie){ + ua.mouseenter(document.getElementById(menuid2)); + } + else{ + ua.mouseover(document.getElementById(menuid2)); + } + setTimeout(function (){ + equal(document.getElementById(submenu1).style.display,'none','第一个submenu关闭,display值:"none"'); + menuClass = document.getElementById(menuid1).className; + ok(menuClass.indexOf('edui-state-opened')==-1,'检查第一个submenu的关闭状态'); + equal(document.getElementById(submenu2).style.display,'','第二个submenu显示,检查submenu的display值:""'); + var menuClass = document.getElementById(menuid2).className; + equal(menuClass,"edui-menuitem edui-"+editor.options.theme+" edui-hassubmenu edui-hassubmenu edui-state-hover edui-state-opened",'检查第二个submenu的打开状态'); + document.getElementById(submenu1).parentNode.removeChild(document.getElementById(submenu2)); + start(); + }, 450); + }, 300); + stop(); +} ); +test( 'dispose', function() { + var editor = new te.obj[0].Editor(); +//设置菜单内容 + var items=[ + { + label:'删除', + cmdName:'delete' + }, + { + label:'全选', + cmdName:'selectall' + }, + { + label:'删除代码', + cmdName:'highlightcode', + icon:'deletehighlightcode' + }, + { + label:'清空文档', + cmdName:'cleardoc', + exec:function () { + if ( confirm( '确定清空文档吗?' ) ) { + this.execCommand( 'cleardoc' ); + } + } + }, + '-', + { + label:'取消链接', + cmdName:'unlink' + }, + { + label:'表格', + subMenu:{ + items: [{ + label:'居左对齐', + cmdName:'justify', + value:'left' + }, + { + label:'居右对齐', + cmdName:'justify', + value:'right' + }], + editor:editor + } + } + ]; + var menu = new te.obj[0].Menu({className : 'edui-for-lineheight',items :items,editor:editor}); + te.dom[0].innerHTML = menu.renderHtml(); + menu.postRender(); + menu.show(); + equal(menu.items.length,7,'检查menu里的items'); + equal(document.getElementById(menu.id).style.display,'','显示menu,检查menu的display值:""'); + menu.dispose(); + equal(menu.items.length,0,'dispose后,检查menu里的items'); + equal(document.getElementById(menu.id),null,'menu不在页面中'); +} ); +test( '_onClick', function() { + var editor = new te.obj[0].Editor(); +//设置菜单内容 + var items=[ + { + label:'取消链接', + cmdName:'unlink' + }, + { + label:'表格', + subMenu:{ + items: [{ + label:'居左对齐', + cmdName:'justify', + value:'left' + }, + { + label:'居右对齐', + cmdName:'justify', + value:'right' + }], + editor:editor + + } + } + ]; + var menu = new te.obj[0].Menu({className : 'edui-for-lineheight',items :items,editor:editor}); + menu.render(te.dom[0]); + menu.postRender(); + menu.show(); + var menuid1 = menu.items[1].id; + var submenu1 = menu.items[1].subMenu.id; + equal(document.getElementById(submenu1).style.display,'none','submenu初始的display值:"none"'); + ua.click(document.getElementById(menuid1)); + setTimeout(function (){ + equal(document.getElementById(submenu1).style.display,'','显示submenu,检查submenu的display值:""'); + document.getElementById(submenu1).parentNode.removeChild(document.getElementById(submenu1)); + start(); + }, 300); + stop(); +} ); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/ui/menubutton.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/ui/menubutton.js new file mode 100644 index 000000000..e325114da --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/ui/menubutton.js @@ -0,0 +1,73 @@ +/** + * Created by JetBrains PhpStorm. + * User: dongyancen + * Date: 12-4-27 + * Time: 下午5:46 + * To change this template use File | Settings | File Templates. + */ +module( 'ui.menubutton' ); +test( 'menubutton', function() { + var editor = new baidu.editor.ui.Editor(); + editor.render("editor"); +//设置菜单内容 + var val=['1', '1.5','1.75','2', '3', '4', '5']; + for(var i=0,ci,items=[];ci = val[i++];){ + items.push({ + label : ci, + value: ci, + onclick:function(){ + } + }) + } + editor.ready(function(){ + var menuButton = new te.obj[0].MenuButton({editor:editor,className : 'edui-for-lineheight',items :items}); + var value = val[1]; + menuButton.setValue(value); + te.dom[0].innerHTML = menuButton.renderHtml(); + menuButton.postRender(); + menuButton.showPopup(); + equal(menuButton.popup.getDom().style.display,"",'窗口显示'); + equal(document.getElementsByClassName("edui-popup edui-menu")[0].style.display,"",'menu窗口显示'); +//检查初始化的显示 + equal(document.getElementsByClassName("edui-menuitem edui-"+editor.options.theme+" edui-state-checked").length,1,'设定已经选中一个value'); + equal(document.getElementsByClassName('edui-menuitem edui-'+editor.options.theme+' edui-state-checked')[0].firstChild.lastChild.innerHTML,value,'检查选中的value'); +//click + ua.click(document.getElementsByClassName("edui-menu-body")[0].childNodes[2]); + equal(menuButton.popup.getDom().style.display,"none",'窗口关闭'); + equal(document.getElementsByClassName("edui-popup edui-menu")[0].style.display,"none",'menu窗口关闭'); + menuButton.showPopup(); + if(ua.browser.ie){ + ua.mouseenter(document.getElementsByClassName("edui-menu-body")[0].childNodes[2],{relatedTarget:document.getElementsByClassName('edui-popup edui-menu')[0]}); + ok(document.getElementsByClassName("edui-menu-body")[0].childNodes[2].className.match('edui-state-hover')&&!document.getElementsByClassName("edui-menu-body")[0].childNodes[2].className.match('edui-state-active'),'mouseover加上hover样式'); + ua.mousedown(document.getElementsByClassName("edui-menu-body")[0].childNodes[2],{relatedTarget:document.getElementsByClassName('edui-popup edui-menu')[0]}); + ok(document.getElementsByClassName("edui-menu-body")[0].childNodes[2].className.match('edui-state-hover')&&document.getElementsByClassName("edui-menu-body")[0].childNodes[2].className.match('edui-state-active'),'mousedown加上active样式');//edui-state-active + ua.mouseleave(document.getElementsByClassName("edui-menu-body")[0].childNodes[2],{relatedTarget:document.getElementsByClassName('edui-popup edui-menu')[0]}); + ok(!document.getElementsByClassName("edui-menu-body")[0].childNodes[2].className.match('edui-state-hover')&&!document.getElementsByClassName("edui-menu-body")[0].childNodes[2].className.match('edui-state-active'),' mouseout去掉hover和active样式'); +////////mouseover->mouseout + ua.mouseenter(document.getElementsByClassName("edui-menu-body")[0].childNodes[2],{relatedTarget:document.getElementsByClassName('edui-popup edui-menu')[0]}); + ua.mouseleave(document.getElementsByClassName("edui-menu-body")[0].childNodes[2],{relatedTarget:document.getElementsByClassName('edui-popup edui-menu')[0]}); + ok(!document.getElementsByClassName("edui-menu-body")[0].childNodes[2].className.match('edui-state-hover')&&!document.getElementsByClassName("edui-menu-body")[0].childNodes[2].className.match('edui-state-active'),'mouseout去掉hover和active样式'); + } + else{ +//mouseover->mousedown->mouseout + ua.mouseover(document.getElementsByClassName("edui-menu-body")[0].childNodes[2],{relatedTarget:document.getElementsByClassName('edui-popup edui-menu')[0]}); + ok(document.getElementsByClassName("edui-menu-body")[0].childNodes[2].className.match('edui-state-hover')&&!document.getElementsByClassName("edui-menu-body")[0].childNodes[2].className.match('edui-state-active'),'mouseover加上hover样式'); + ua.mousedown(document.getElementsByClassName("edui-menu-body")[0].childNodes[2],{relatedTarget:document.getElementsByClassName('edui-popup edui-menu')[0]}); + ok(document.getElementsByClassName("edui-menu-body")[0].childNodes[2].className.match('edui-state-hover')&&document.getElementsByClassName("edui-menu-body")[0].childNodes[2].className.match('edui-state-active'),'mousedown加上active样式');//edui-state-active + ua.mouseout(document.getElementsByClassName("edui-menu-body")[0].childNodes[2],{relatedTarget:document.getElementsByClassName('edui-popup edui-menu')[0]}); + ok(!document.getElementsByClassName("edui-menu-body")[0].childNodes[2].className.match('edui-state-hover')&&!document.getElementsByClassName("edui-menu-body")[0].childNodes[2].className.match('edui-state-active'),' mouseout去掉hover和active样式'); +////////mouseover->mouseout + ua.mouseover(document.getElementsByClassName("edui-menu-body")[0].childNodes[2],{relatedTarget:document.getElementsByClassName('edui-popup edui-menu')[0]}); + ua.mouseout(document.getElementsByClassName("edui-menu-body")[0].childNodes[2],{relatedTarget:document.getElementsByClassName('edui-popup edui-menu')[0]}); + ok(!document.getElementsByClassName("edui-menu-body")[0].childNodes[2].className.match('edui-state-hover')&&!document.getElementsByClassName("edui-menu-body")[0].childNodes[2].className.match('edui-state-active'),'mouseout去掉hover和active样式'); + } + /////mousedown->mouseup + ua.mousedown(document.getElementsByClassName("edui-menu-body")[0].childNodes[2],{relatedTarget:document.getElementsByClassName('edui-popup edui-menu')[0]}); + ok(!document.getElementsByClassName("edui-menu-body")[0].childNodes[2].className.match('edui-state-hover')&&document.getElementsByClassName("edui-menu-body")[0].childNodes[2].className.match('edui-state-active'),'mousedown加上active样式'); + ua.mouseup(document.getElementsByClassName("edui-menu-body")[0].childNodes[2],{relatedTarget:document.getElementsByClassName('edui-popup edui-menu')[0]}); + ok(!document.getElementsByClassName("edui-menu-body")[0].childNodes[2].className.match('edui-state-hover')&&!document.getElementsByClassName("edui-menu-body")[0].childNodes[2].className.match('edui-state-active'),'mouseup去掉active样式'); + menuButton.popup.hide(); + start(); + }); + stop(); +} ); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/ui/popup.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/ui/popup.js new file mode 100644 index 000000000..fcb1d3796 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/ui/popup.js @@ -0,0 +1,84 @@ +/** + * Created by JetBrains PhpStorm. + * User: dongyancen + * Date: 12-4-12 + * Time: 下午4:47 + * To change this template use File | Settings | File Templates. + */ +module( 'ui.popup' ); +test( '检查显示内容和隐藏方法:getContentHtmlTpl,show(),hide(),isHidden()', function() { + var editor = new baidu.editor.ui.Editor(); + stop(); + setTimeout(function(){ + var autoTypeSetPicker = new baidu.editor.ui.AutoTypeSetPicker({editor:editor}); + + var popup = new te.obj[0].Popup({content: autoTypeSetPicker,'editor':editor}); + var content = autoTypeSetPicker.getHtmlTpl().replace(/##/g, autoTypeSetPicker.id) + .replace(/%%/g, (autoTypeSetPicker.uiName ? 'edui-'+autoTypeSetPicker.uiName : '') + ' ' + autoTypeSetPicker.className); + equal(popup.getContentHtmlTpl(),content, '检查popup的内容'); + equal(popup.getDom(),null,'popup初始不显示'); + + popup.show(); + equal(popup.getDom().style.display,'','popup显示成功'); + var popupContent = document.getElementById(popup.id+'_content'); + equal(popupContent.firstChild.id,autoTypeSetPicker.id,'popup内容autoTypeSetPicker显示'); + equal(popup.isHidden(),false,'isHidden==false'); + + popup.hide(); + equal(popup.getDom().style.display,'none','popup隐藏成功'); + equal(popup.isHidden(),true,'isHidden==true'); + + autoTypeSetPicker.dispose(); + popup.dispose(); + start(); + },50); + + +} ); +test( '定位显示popup;mousedown时隐藏popup', function() { + var editor = new baidu.editor.ui.Editor(); + editor.render('editor'); + editor.ready(function(){ + var autoTypeSetPicker = new baidu.editor.ui.AutoTypeSetPicker({editor:editor}); + var popup = new te.obj[0].Popup({content: autoTypeSetPicker,'editor':editor}); + var uiUtils = baidu.editor.ui.uiUtils; + var leftLocation = 20; + var topLocation = 100; + popup.showAt({left:leftLocation,top:topLocation}); + equal($(popup.getDom()).css('top'),topLocation+'px','popup位置:top'); + equal($(popup.getDom()).css('left'),leftLocation+'px','popup位置:left'); + equal($(popup.getDom()).css('width'),uiUtils.getClientRect(popup.getDom('content')).width+'px','popup位置:width'); + ok(uiUtils.getClientRect(popup.getDom('content')).width>uiUtils.getClientRect(autoTypeSetPicker.getDom()).width,'popup的width大于其内容的width'); + equal($(popup.getDom()).css('height'),uiUtils.getClientRect(popup.getDom('content')).height+'px','popup位置:height'); + ok(uiUtils.getClientRect(popup.getDom('content')).height>uiUtils.getClientRect(autoTypeSetPicker.getDom()).height,'popup的height大于其内容的height'); + + var popup2 = new te.obj[0].Popup({content: autoTypeSetPicker,'editor':editor}); +// var flag = 0; +// popup2.addListener('postRenderAfter',function(){ +// flag = 1; +// }); +// popup2.postRender(); + popup2.show(); + ua.mousedown(document.getElementById(popup.id+'_content')); + equal(popup.isHidden(),false,'在popup上mousedown,popup不隐藏'); + equal(popup2.isHidden(),true,'在popup上mousedown,popup2隐藏'); + popup.show(); + popup2.show(); + ua.mousedown(document.getElementById('editor')); + equal(popup.isHidden(),true,'在其他位置mousedown,popup隐藏'); + equal(popup2.isHidden(),true,'在其他位置mousedown,popup隐藏'); + popup.show(); + popup2.show(); +// $('#editor').scroll(); +//// window.scrollTo( 0, document.body.scrollHeight ); +// equal(popup.isHidden(),true); +// equal(popup2.isHidden(),true); + autoTypeSetPicker.dispose(); + popup.dispose(); + popup2.dispose(); + start(); + }); + stop(); + + +} ); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/ui/separator.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/ui/separator.js new file mode 100644 index 000000000..b6ccb282d --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/ui/separator.js @@ -0,0 +1,11 @@ +/** + * Created by JetBrains PhpStorm. + * User: dongyancen + * Date: 12-4-12 + * Time: 下午4:46 + * To change this template use File | Settings | File Templates. + */ +module( 'ui.separator' ); +test( '', function() { + equal('','',''); +} ); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/_test/ui/splitbutton.js b/nezha-fronted/static/ueditor-1.4.3.3/_test/ui/splitbutton.js new file mode 100644 index 000000000..bec52c2a5 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/_test/ui/splitbutton.js @@ -0,0 +1,68 @@ +/** + * Created by JetBrains PhpStorm. + * User: dongyancen + * Date: 12-5-2 + * Time: 下午2:36 + * To change this template use File | Settings | File Templates. + */ +module( 'ui.splitbutton' ); +test( 'splitbutton', function() { + //打开一个对话框 + + var editor = new baidu.editor.ui.Editor(); + editor.render("editor"); + editor.ready(function(){ + var splitButton = new te.obj[0].SplitButton({popup:new baidu.editor.ui.Popup({ + //传入配置参数 + content: new te.obj[0].SplitButton({editor:editor}), + 'editor':editor + }), editor:editor}); + te.dom[0].innerHTML = splitButton.renderHtml(); + splitButton.postRender(); + splitButton.showPopup(); + equal(splitButton.popup.getDom('body').lastChild,splitButton.popup.getDom('bordereraser'),'检查:addListener:postrender'); + ok(contains(splitButton.getStateDom().className,"edui-state-opened"),'_onPopupShow'); + splitButton.popup.hide(); + equal(splitButton.getStateDom().className,"",'_onPopupHide'); + splitButton.popup.show(); + ok(contains(splitButton.getStateDom().className,"edui-state-opened"),'_onPopupShow'); + var flag = 0; + //有两个baidu.editor.ui.SplitButton,通过popup操作的是第一个 + splitButton.addListener('buttonclick', function(){ + flag = 1; + }); + + ua.click(document.getElementsByClassName('edui-box edui-button-body')[0]); + equal(flag, 1,'_onButtonClick'); + ua.click(document.getElementsByClassName('edui-box edui-arrow')[0]); + ok(contains(splitButton.getStateDom().className,"edui-state-opened"),'_onArrowClick'); + splitButton.popup.hide(); + equal(splitButton.getStateDom().className,"",'_onArrowClick'); + ua.click(document.getElementsByClassName('edui-box edui-arrow')[0]); + ok(contains(splitButton.getStateDom().className,"edui-state-opened"),'_onArrowClick'); + splitButton.popup.hide(); + start(); + }); + stop(); + function contains(string,substr,isIgnoreCase) + { + if(isIgnoreCase) + { + string=string.toLowerCase(); + substr=substr.toLowerCase(); + } + var startChar=substr.substring(0,1); + var strLen=substr.length; + for(var j=0;j 0 Then + aj_in_string = False + aj_in_escape = False + aj_colonfound = False + For aj_i_tmp = 1 To Len(aj_line) + If aj_in_escape Then + aj_in_escape = False + Else + Select Case Mid(aj_line, aj_i_tmp, 1) + Case """" + aj_in_string = Not aj_in_string + Case ":" + If Not aj_in_escape And Not aj_in_string Then + aj_currentkey = Left(aj_line, aj_i_tmp - 1) + aj_currentvalue = Mid(aj_line, aj_i_tmp + 1) + aj_colonfound = True + Exit For + End If + Case "\" + aj_in_escape = True + End Select + End If + Next + if aj_colonfound then + aj_currentkey = aj_Strip(aj_JSONDecode(aj_currentkey), """") + If Not level(aj_currentlevel).exists(aj_currentkey) Then level(aj_currentlevel).Add aj_currentkey, "" + end if + End If + If right(aj_line,1) = "{" Or right(aj_line,1) = "[" Then + If Len(aj_currentkey) = 0 Then aj_currentkey = level(aj_currentlevel).Count + Set level(aj_currentlevel).Item(aj_currentkey) = Collection() + Set level(aj_currentlevel + 1) = level(aj_currentlevel).Item(aj_currentkey) + aj_currentlevel = aj_currentlevel + 1 + aj_currentkey = "" + ElseIf right(aj_line,1) = "}" Or right(aj_line,1) = "]" or right(aj_line,2) = "}," Or right(aj_line,2) = "]," Then + aj_currentlevel = aj_currentlevel - 1 + ElseIf Len(Trim(aj_line)) > 0 Then + if Len(aj_currentvalue) = 0 Then aj_currentvalue = aj_line + aj_currentvalue = getJSONValue(aj_currentvalue) + + If Len(aj_currentkey) = 0 Then aj_currentkey = level(aj_currentlevel).Count + level(aj_currentlevel).Item(aj_currentkey) = aj_currentvalue + End If + Next + End Sub + + Public Function Collection() + set Collection = Server.CreateObject("Scripting.Dictionary") + End Function + + Public Function AddToCollection(dictobj) + if TypeName(dictobj) <> "Dictionary" then Err.Raise 1, "AddToCollection Error", "Not a collection." + aj_newlabel = dictobj.Count + dictobj.Add aj_newlabel, Collection() + set AddToCollection = dictobj.item(aj_newlabel) + end function + + Private Function CleanUpJSONstring(aj_originalstring) + aj_originalstring = Replace(aj_originalstring, Chr(13) & Chr(10), "") + aj_originalstring = Mid(aj_originalstring, 2, Len(aj_originalstring) - 2) + aj_in_string = False : aj_in_escape = False : aj_s_tmp = "" + For aj_i_tmp = 1 To Len(aj_originalstring) + aj_char_tmp = Mid(aj_originalstring, aj_i_tmp, 1) + If aj_in_escape Then + aj_in_escape = False + aj_s_tmp = aj_s_tmp & aj_char_tmp + Else + Select Case aj_char_tmp + Case "\" : aj_s_tmp = aj_s_tmp & aj_char_tmp : aj_in_escape = True + Case """" : aj_s_tmp = aj_s_tmp & aj_char_tmp : aj_in_string = Not aj_in_string + Case "{", "[" + aj_s_tmp = aj_s_tmp & aj_char_tmp & aj_InlineIf(aj_in_string, "", Chr(13) & Chr(10)) + Case "}", "]" + aj_s_tmp = aj_s_tmp & aj_InlineIf(aj_in_string, "", Chr(13) & Chr(10)) & aj_char_tmp + Case "," : aj_s_tmp = aj_s_tmp & aj_char_tmp & aj_InlineIf(aj_in_string, "", Chr(13) & Chr(10)) + Case Else : aj_s_tmp = aj_s_tmp & aj_char_tmp + End Select + End If + Next + + CleanUpJSONstring = "" + aj_s_tmp = split(aj_s_tmp, Chr(13) & Chr(10)) + For Each aj_line_tmp In aj_s_tmp + aj_line_tmp = replace(replace(aj_line_tmp, chr(10), ""), chr(13), "") + CleanUpJSONstring = CleanUpJSONstring & aj_Trim(aj_line_tmp) & Chr(13) & Chr(10) + Next + End Function + + Private Function getJSONValue(ByVal val) + val = Trim(val) + If Left(val,1) = ":" Then val = Mid(val, 2) + If Right(val,1) = "," Then val = Left(val, Len(val) - 1) + val = Trim(val) + + Select Case val + Case "true" : getJSONValue = True + Case "false" : getJSONValue = False + Case "null" : getJSONValue = Null + Case Else + If (Instr(val, """") = 0) Then + If IsNumeric(val) Then + getJSONValue = CDbl(val) + Else + getJSONValue = val + End If + Else + If Left(val,1) = """" Then val = Mid(val, 2) + If Right(val,1) = """" Then val = Left(val, Len(val) - 1) + getJSONValue = aj_JSONDecode(Trim(val)) + End If + End Select + End Function + + Private JSONoutput_level + Public Function JSONoutput() + dim wrap_dicttype, aj_label + JSONoutput_level = 1 + wrap_dicttype = "[]" + For Each aj_label In data + If Not aj_IsInt(aj_label) Then wrap_dicttype = "{}" + Next + JSONoutput = Left(wrap_dicttype, 1) & Chr(13) & Chr(10) & GetDict(data) & Right(wrap_dicttype, 1) + End Function + + Public Function PrintJson + Response.AddHeader "Content-Type", "text/plain" + If IsEmpty(Request.QueryString("callback")) Then + Response.Write JSONoutput() + Else + Response.Write Request.QueryString("callback") & "(" & JSONoutput() & ")" + End If + End Function + + Private Function GetDict(objDict) + dim aj_item, aj_keyvals, aj_label, aj_dicttype + For Each aj_item In objDict + Select Case TypeName(objDict.Item(aj_item)) + Case "Dictionary" + GetDict = GetDict & Space(JSONoutput_level * 4) + + aj_dicttype = "[]" + For Each aj_label In objDict.Item(aj_item).Keys + If Not aj_IsInt(aj_label) Then aj_dicttype = "{}" + Next + If aj_IsInt(aj_item) Then + GetDict = GetDict & (Left(aj_dicttype,1) & Chr(13) & Chr(10)) + Else + GetDict = GetDict & ("""" & aj_JSONEncode(aj_item) & """" & ": " & Left(aj_dicttype,1) & Chr(13) & Chr(10)) + End If + JSONoutput_level = JSONoutput_level + 1 + + aj_keyvals = objDict.Keys + GetDict = GetDict & (GetSubDict(objDict.Item(aj_item)) & Space(JSONoutput_level * 4) & Right(aj_dicttype,1) & aj_InlineIf(aj_item = aj_keyvals(objDict.Count - 1),"" , ",") & Chr(13) & Chr(10)) + Case Else + aj_keyvals = objDict.Keys + GetDict = GetDict & (Space(JSONoutput_level * 4) & aj_InlineIf(aj_IsInt(aj_item), "", """" & aj_JSONEncode(aj_item) & """: ") & WriteValue(objDict.Item(aj_item)) & aj_InlineIf(aj_item = aj_keyvals(objDict.Count - 1),"" , ",") & Chr(13) & Chr(10)) + End Select + Next + End Function + + Private Function aj_IsInt(val) + aj_IsInt = (TypeName(val) = "Integer" Or TypeName(val) = "Long") + End Function + + Private Function GetSubDict(objSubDict) + GetSubDict = GetDict(objSubDict) + JSONoutput_level= JSONoutput_level -1 + End Function + + Private Function WriteValue(ByVal val) + Select Case TypeName(val) + Case "Double", "Integer", "Long": WriteValue = val + Case "Null" : WriteValue = "null" + Case "Boolean" : WriteValue = aj_InlineIf(val, "true", "false") + Case Else : WriteValue = """" & aj_JSONEncode(val) & """" + End Select + End Function + + Private Function aj_JSONEncode(ByVal val) + val = Replace(val, "\", "\\") + val = Replace(val, """", "\""") + 'val = Replace(val, "/", "\/") + val = Replace(val, Chr(8), "\b") + val = Replace(val, Chr(12), "\f") + val = Replace(val, Chr(10), "\n") + val = Replace(val, Chr(13), "\r") + val = Replace(val, Chr(9), "\t") + aj_JSONEncode = Trim(val) + End Function + + Private Function aj_JSONDecode(ByVal val) + val = Replace(val, "\""", """") + val = Replace(val, "\\", "\") + val = Replace(val, "\/", "/") + val = Replace(val, "\b", Chr(8)) + val = Replace(val, "\f", Chr(12)) + val = Replace(val, "\n", Chr(10)) + val = Replace(val, "\r", Chr(13)) + val = Replace(val, "\t", Chr(9)) + aj_JSONDecode = Trim(val) + End Function + + Private Function aj_InlineIf(condition, returntrue, returnfalse) + If condition Then aj_InlineIf = returntrue Else aj_InlineIf = returnfalse + End Function + + Private Function aj_Strip(ByVal val, stripper) + If Left(val, 1) = stripper Then val = Mid(val, 2) + If Right(val, 1) = stripper Then val = Left(val, Len(val) - 1) + aj_Strip = val + End Function + + Private Function aj_MultilineTrim(TextData) + aj_MultilineTrim = aj_RegExp.Replace(TextData, "$1") + End Function + + private function aj_Trim(val) + aj_Trim = Trim(val) + Do While Left(aj_Trim, 1) = Chr(9) : aj_Trim = Mid(aj_Trim, 2) : Loop + Do While Right(aj_Trim, 1) = Chr(9) : aj_Trim = Left(aj_Trim, Len(aj_Trim) - 1) : Loop + aj_Trim = Trim(aj_Trim) + end function +End Class +%> \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/asp/MultiformProcessor.class.asp b/nezha-fronted/static/ueditor-1.4.3.3/asp/MultiformProcessor.class.asp new file mode 100644 index 000000000..ec2b4e1e7 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/asp/MultiformProcessor.class.asp @@ -0,0 +1,138 @@ +<% +' Power by Techird +' Processor Usage: +' Set p = new MultiformProcessor +' Set formValues = p.Process() +' filename = formValues.Item("filename") +' Set stream = formValues.Item("file1") // the name of the file input +' stream.SaveToFile "upload/" & filename +' stream.Close +Class MultiformProcessor + Private adTypeBinary + Private adTypeText + Private adModeReadWrite + Private binCtLf + Private binCtLf2 + + + private Sub Class_Initialize() + adTypeBinary = 1 + adTypeText = 2 + adModeReadWrite = 3 + binCtLf = ChrB(13) & ChrB(10) + binCtLf2 = binCtLf & binCtLf + End Sub + + Private Function OpenStream( optype ) + Set stream = Server.CreateObject("ADODB.Stream") + stream.Type = optype + stream.Mode = adModeReadWrite + stream.Open + Set OpenStream = stream + End Function + + Private Function CopyStreamPart( stream, pBgn, pEnd ) + Dim iStream, oStream + Set iStream = stream + Set oStream = OpenStream( adTypeBinary ) + iStream.Position = pBgn + iStream.CopyTo oStream, pEnd - pBgn + Set CopyStreamPart = oStream + End Function + + Private Function GetString( stream, pBgn, pEnd ) + Dim iStream, oStream + Set iStream = stream + Set oStream = OpenStream( adTypeBinary ) + iStream.Position = pBgn + iStream.CopyTo oStream, pEnd - pBgn + oStream.Position = 0 + oStream.Type = adTypeText + oStream.Charset = GetCharset + GetString = oStream.ReadText + oStream.Close + End Function + + Private Function GetCharset() + If Charset = "" Then + GetCharset = "utf-8" + Else + GetCharset = Charset + End If + End Function + + 'See RFC 2388 + 'http://www.ietf.org/rfc/rfc2388.txt + public Function Process() + Dim formBytes, bLen, pBgn, pEnd, header, stream + Dim varPtn, filePtn, formValues, key, field + + formBytes = Request.BinaryRead( Request.TotalBytes ) + + Set stream = OpenStream( adTypeBinary ) + stream.Write formBytes + + Set varPtn = new RegExp + varPtn.Pattern = "(\w+?)=""(.+?)""" + varPtn.Global = True + + Set filePtn = new RegExp + filePtn.Pattern = "filename=" + + Set formValues = Server.CreateObject("Scripting.Dictionary") + + 'Find boundary + bLen = InStrB( 1, formBytes, binCtLf ) - 1 + boundary = LeftB( formBytes, bLen ) + + 'Init begin pointer to byte start + pBgn = 1 + + Do + 'Find begin pointer and end pointer for block header + pBgn = pBgn + bLen + LenB( binCtLf ) - 1 + pEnd = InStrB( pBgn, formBytes, binCtLf2 ) + + 'If next block not found, means all blocks processed + If pEnd = 0 Then + Exit Do 'Load Finished + End If + + 'Decode the headerf + header = GetString( stream, pBgn, pEnd ) + + 'Test if the block is a file block + isFileBlock = filePtn.Test( header ) + + 'Find begin pointer and end pointer for block content + pBgn = pEnd + LenB(binCtLf2) - 1 + pEnd = InStrB(pBgn, formBytes, boundary) - LenB( binCtLf ) - 1 + + 'Extract field values from header, which like key = "filed" + Set matches = varPtn.Execute( header ) + For Each match In matches + key = match.SubMatches(0) + field = match.SubMatches(1) + 'filename as a field + If key = "filename" Then + formValues.Add key, field + 'name specified fields + ElseIf key = "name" Then + If isFileBlock Then + 'Resolve content as stream for fileblock + formValues.Add field, CopyStreamPart(stream, pBgn, pEnd) + Else + 'Resolve content as string for non-fileblock + formValues.Add field, GetString(stream, pBgn, pEnd) + End If + End If + Next + + 'Move over the begin pointer to next block + pBgn = pEnd + LenB( binCtLf ) + 1 + Loop + stream.Close + Set Process = formValues + End Function +End Class +%> \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/asp/PathFormatter.class.asp b/nezha-fronted/static/ueditor-1.4.3.3/asp/PathFormatter.class.asp new file mode 100644 index 000000000..b0196a0cd --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/asp/PathFormatter.class.asp @@ -0,0 +1,81 @@ +<% + +Class PathFormatter + Public Function Format( ByVal pathFormat, ByVal filename ) + Dim ext, name + If IsEmpty( format ) Then + format = "{yyyy}{mm}{dd}{hh}{ii}{ss}{rand:6}" + End If + + Set invalidPattern = new RegExp + invalidPattern.Pattern = "[\\\/\:\*\?\<\>\|""]" + invalidPattern.Global = true + filename = invalidPattern.Replace( filename, "" ) + + ext = GetExt( filename ) + name = GetNameWithoutExt( filename ) + + pathFormat = Replace( pathFormat, "{filename}", name ) + pathFormat = Replace( pathFormat, "{time}", TimeStamp() ) + pathFormat = Replace( pathFormat, "{yyyy}", Year(Now) ) + pathFormat = Replace( pathFormat, "{yy}", Year(Now) Mod 100 ) + pathFormat = Replace( pathFormat, "{mm}", LeadZero( Month(Now) ) ) + pathFormat = Replace( pathFormat, "{dd}", LeadZero( Day(Now) ) ) + pathFormat = Replace( pathFormat, "{hh}", LeadZero( Hour(Now) ) ) + pathFormat = Replace( pathFormat, "{ii}", LeadZero( Minute(Now) ) ) + pathFormat = Replace( pathFormat, "{ss}", LeadZero( Second(Now) ) ) + + Set randPattern = new RegExp + randPattern.Pattern = "{rand(\:?)(\d+)}" + Set matches = randPattern.Execute(pathFormat) + If matches.Count Then + Set match = matches(0) + digit = 6 + If match.SubMatches.Count > 1 Then + digit = 0 + match.SubMatches(1) + End If + min = 1 + Do While digit > 0 + min = min * 10 + digit = digit - 1 + Loop + max = min * 10 + pathFormat = randPattern.Replace( pathFormat, Rand( min, max ) ) + End If + Format = pathFormat + ext + End Function + + Private Function GetExt( file ) + GetExt = Right( file, Len(file) - InStrRev(file, ".") + 1 ) + End Function + + Private Function GetNameWithoutExt( file ) + GetNameWithoutExt = Left( file, InStrRev(file, ".") - 1 ) + End Function + + Private Function TimeStamp() + TimeStamp = DateDiff("s", "1970-1-1 8:00:00", Now()) + End Function + + Private Function Rand( min, max ) + Randomize + Rand = Int( (max - min + 1) * Rnd + min ) + End Function + + Private Function GetFormatedDate() + Dim yyyy, mm, dd + yyyy = Year(Date) + mm = LeadZero(Month(Date)) + dd = LeadZero(Day(Date)) + GetFormatedDate = yyyy & mm & dd + End Function + + Private Function LeadZero( number ) + If number < 10 Then + LeadZero = "0" & number + Else + LeadZero = number + End If + End Function +End Class +%> \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/asp/README.md b/nezha-fronted/static/ueditor-1.4.3.3/asp/README.md new file mode 100644 index 000000000..bf3a2215f --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/asp/README.md @@ -0,0 +1,115 @@ +# UEditor ASP 支持说明 + +应广大用户要求,UEditor 团队在原本支持的 PHP、Java 和 .Net 的后台的基础上,推出了 ASP 后台的支持。 + +## 支持版本 ## +支持 UEditor 1.2.6+ 的版本 + +## 支持功能 ## +支持所有其他后台已支持的功能,包括: + +1. 图片上传 +2. 远程图片转存 +3. 图片管理 +4. 涂鸦上传(包括背景) +5. Word 图片转存 +6. 截图上传 +7. 文件上传 + +## 部署指南 ## +Classic ASP 一般在 IIS 上运行。其它 ASP 服务器不介绍部署方式,请自行研究。 + +### 配置 ### + +对于 v1.4.0 之前的版本,需要修改 `ueditor.config.js`。最简单的方法,就是把文件中的 php 都替换成 asp。要修改的配置包括: + +```javascript +{ + imageUrl:URL+"asp/imageUp.asp" + ,imagePath:URL + "asp/" + ,scrawlUrl:URL+"asp/scrawlUp.asp" + ,scrawlPath:URL+"asp/" + ,fileUrl:URL+"asp/fileUp.asp" + ,filePath:URL + "asp/" + ,catcherUrl:URL +"asp/getRemoteImage.asp" + ,catcherPath:URL + "asp/" + ,imageManagerUrl:URL + "asp/imageManager.asp" + ,imageManagerPath:URL + "asp/" + ,snapscreenServerUrl: URL +"asp/imageUp.asp" + ,snapscreenPath: URL + "asp/" + ,wordImageUrl:URL + "asp/imageUp.asp" + ,wordImagePath:URL + "asp/" + ,getMovieUrl:URL+"asp/getMovie.asp" +} +``` + +UEditor v1.4.0 后进行了后端的统一配置,后端相关的配置文件是 `config.json`,在具体的后台目录下。需要注意以下两个类型的配置: + + +```javascript +{ + "{tpl}UrlPrefix": "/ueditor/asp/", + "{tpl}PathFormat": "upload/{tpl}/{yyyy}{mm}{dd}/{time}{rand:6}" +} +``` + +`{tpl}PathFormat` 是资源(图片、涂鸦、文件等)保存的位置以及文件名格式,这个路径在 ASP 中是相对运行目录的。 + +`{tpl}UrlPrefix` 是资源定位的基本路径,在 ASP 后台中一般设置成 ASP 的目录。 + +比如,IIS 中运行的 UEditor ASP 的目录为 C:\iis_pub\wwwroot\mysite\ueditor\asp,而网站的访问地址为 http://localhost/mysite/,那么你可以这样修改这两类配置项: + +```javascript +{ + "{tpl}UrlPrefix": "/mysite/ueditor/asp/", + "{tpl}PathFormat": "upload/{tpl}/{yyyy}{mm}{dd}/{time}{rand:6}" +} +``` + + +### 在 IIS 6.X 中部署 +IIS 的安装在这里不介绍,请自行查阅相关资料。 + +1. 启用 ASP 拓展 + * 打开 IIS 管理器 + * 展开本地计算机 + * 选中 Web 服务拓展 + * 允许 Active Server Pages 拓展 + +2. 配置网站脚本执行权限(如果使用虚拟路径,请跳过本步骤) + * 在网站上右击,点属性 + * 切换到主目录选项卡,勾选*读取*、*写入*两个权限,并且*执行权限*选择*纯脚本* + * 点确定 + +3. 使用虚拟路径 + * 在网站上右击,点*新建* - *虚拟路径* + * 按照向导填写名称和路径 + * 勾选*读取*、*执行脚本*和*写入*三个权限 + * 完成虚拟目录的创建 + +4. 配置脚本执行身份 + * 在网站或虚拟路径上右击,点属性 + * 选择*目录安全性*选项卡 + * 在*身份验证和访问控制*中点击*编辑* + * 勾选*启用匿名访问*,点击用户名后面的*浏览* + * 输入*administrator*点确定 + * 输入*administrator*账号的密码 + * 点击确定,再确认一次密码 + +5. 设置最大 HTTP 请求大小限制 + * 找到位于 C:\Windows\System32\Inetsrv 中的 metabase.XML,打开,查找ASPMaxRequestEntityAllowed,修改为需要的值(如10240000 即 10M) + > ASP 文件中也有上传文件大小的限制,不过先验证的限制是 IIS 中设置的,所以如果 IIS 中设置最大 256K,那么就算 ASP 中设置了最大 10M,那么超过 256K 的文件也无法上传,而且 ASP 没法给出错误信息。 + +### 在 IIS 7.X 中部署 +IIS7 默认不安装 ASP,需要手动添加进去。添加方法请读者自行查阅。 + +1. 配置脚本执行身份 + * 选中网站或者应用程序 + * 双击 IIS 中的*身份验证* + * 双击匿名身份验证 + * 填写*administrator*的用户名和密码,确定 + +2. 设置最大 HTTP 请求大小限制 + * 打开 IIS 控制台 + * 双击 ASP,展开*限制属性*,修改*醉倒请求实体主体限制*为需要的值(如10240000 即 10M) + > ASP 文件中也有上传文件大小的限制,不过先验证的限制是 IIS 中设置的,所以如果 IIS 中设置最大 256K,那么就算 ASP 中设置了最大 10M,那么超过 256K 的文件也无法上传,而且 ASP 没法给出错误信息。 diff --git a/nezha-fronted/static/ueditor-1.4.3.3/asp/Uploader.Class.asp b/nezha-fronted/static/ueditor-1.4.3.3/asp/Uploader.Class.asp new file mode 100644 index 000000000..5d65ce102 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/asp/Uploader.Class.asp @@ -0,0 +1,264 @@ + + + +<% +' ASP 文件上传类 +' Author: techird +' Email: techird@qq.com + +'配置 +'MAX_SIZE 在这里设定了之后如果出现大上传失败,请执行以下步骤 +'IIS 6 + '找到位于 C:\Windows\System32\Inetsrv 中的 metabase.XML 打开,找到ASPMaxRequestEntityAllowed 把他修改为需要的值(如10240000即10M) +'IIS 7 + '打开IIS控制台,选择 ASP,在限制属性里有一个“最大请求实体主题限制”,设置需要的值 + +CURRENT_ENCODING = "gb2312" + +Class Uploader + + '上传配置 + Private cfgMaxSize + Private cfgAllowType + Private cfgPathFormat + Private cfgFileField + + '上传返回信息 + Private stateString + Private rsOriginalFileName + Private rsFilePath + + Private rsFileName + Private rsFileSize + Private rsState + Private rsFormValues + + Private Sub Class_Initialize + Set stateString = Server.CreateObject("Scripting.Dictionary") + stateString.Add "SIZE_LIMIT_EXCCEED", "File size exceeded!" + stateString.Add "TYPE_NOW_ALLOW", "File type not allowed!" + End Sub + + Public Property Let MaxSize(ByVal size) + cfgMaxSize = size + End Property + + Public Property Let AllowType(ByVal types) + Set cfgAllowType = types + End Property + + Public Property Let PathFormat(ByVal format) + cfgPathFormat = format + End Property + + Public Property Let FileField(ByVal field) + cfgFileField = field + End Property + + Public Property Get OriginalFileName + OriginalFileName = rsOriginalFileName + End Property + + Public Property Get FileName + FileName = rsFileName + End Property + + Public Property Get FilePath + FilePath = rsFilePath + End Property + + Public Property Get FileSize + FileSize = rsFileSize + End Property + + Public Property Get State + State = rsState + End Property + + Public Property Get FormValues + Set FormValues = rsFormValues + End Property + + Public Function UploadForm() + ProcessForm() + SaveFile() + End Function + + Public Function ProcessForm() + Set processor = new MultiformProcessor + Set rsFormValues = processor.Process() + End Function + + Public Function SaveFile() + Dim stream, filename + Set stream = rsFormValues.Item( cfgFileField ) + filename = rsFormValues.Item( "filename" ) + DoUpload stream, filename + End Function + + Public Function UploadBase64( filename ) + Dim stream, content + content = Request.Item ( cfgFileField ) + Set stream = Base64Decode( content ) + + DoUpload stream, filename + End Function + + Private Function RegExpTest(patrn, str) + Dim regEx, Match, Matches + Set regEx = New RegExp + regEx.Pattern = patrn + regEx.IgnoreCase = False + regEx.Global = True + Set Matches = regEx.Execute(str) + For Each Match in Matches + RetStr = RetStr & Match.value &" " + RetStr = RetStr & vbCRLF + Next + RegExpTest = RetStr + End Function + + Private Function IpToNumber( ip ) + arr=split(ip,".") + IpToNumber=256*256*256*clng(arr(0))+256*256*clng(arr(1))+256*clng(arr(2))+clng(arr(3)) + End Function + + Private Function IsPrivateIp( url ) + Dim ip + ip = RegExpTest("\d+\.\d+\.\d+\.\d*", url) + + If ip = "" Then + If RegExpTest("([\w-]+\.)+[\w-]+", url) <> "" Then + IsPrivateIp = False:Exit Function + End If + IsPrivateIp = True:Exit Function + End If + + If instr(ip,"127.")=1 Then + IsPrivateIp = true:Exit Function + End If + ABegin = IpToNumber("10.0.0.0"):AEnd = IpToNumber("10.255.255.255") + BBegin = IpToNumber("172.16.0.0"):BEnd = IpToNumber("172.31.255.255") + CBegin = IpToNumber("192.168.0.0"):CEnd = IpToNumber("192.168.255.255") + IpNum = IpToNumber(ip) + IsPrivateIp = (ABegin <= IpNum and IpNum <= AEnd) or (BBegin <= IpNum and IpNum <= BEnd) or (CBegin <= IpNum and IpNum <= CEnd) + End Function + + Public Function UploadRemote( url ) + Dim stream, filename + + If IsPrivateIp(url) Then + rsState = "Failed":Exit Function + End If + + filename = Right( url, Len(url) - InStrRev(url, "/") ) + + Set stream = CrawlImage( url ) + + If Not IsNull(stream) Then + DoUpload stream, filename + Else + rsState = "Failed" + End If + Set stream = Nothing + End Function + + Private Function DoUpload( stream, filename ) + + rsFileSize = stream.Size + If rsFileSize > cfgMaxSize Then + rsState = stateString.Item( "SIZE_LIMIT_EXCCEED" ) + Exit Function + End If + + rsOriginalFileName = filename + fileType = GetExt(filename) + If CheckExt(fileType) = False Then + rsState = stateString.Item( "TYPE_NOW_ALLOW" ) + Exit Function + End If + + Set formatter = new PathFormatter + rsFilePath = formatter.format( cfgPathFormat, filename ) + + savePath = Server.MapPath(rsFilePath) + CheckOrCreatePath( GetDirectoryName(savePath) ) + + stream.SaveToFile savePath + stream.Close + rsState = "SUCCESS" + End Function + + Private Function GetDirectoryName(path) + GetDirectoryName = Left( path, InStrRev(path, "\") ) + End Function + + Private Function Base64Decode( content ) + dim xml, stream, node + Set xml = Server.CreateObject("MSXML2.DOMDocument") + Set stream = Server.CreateObject("ADODB.Stream") + Set node = xml.CreateElement("tmpNode") + node.dataType = "bin.base64" + node.Text = content + stream.Charset = CURRENT_ENCODING + stream.Type = 1 + stream.Open() + stream.Write( node.nodeTypedValue ) + Set Base64Decode = stream + Set node = Nothing + Set stream = Nothing + Set xml = Nothing + End Function + + Private Function CrawlImage( url ) + Dim http, stream + Set http = Server.CreateObject("Microsoft.XMLHTTP") + http.Open "GET", url, false + http.Send + If http.Status = 200 Then + Set stream = Server.CreateObject("ADODB.Stream") + stream.Type = 1 + stream.Open() + stream.Write http.ResponseBody + Set CrawlImage = stream + Else + Set CrawlImage = null + End If + Set http = Nothing + End Function + + Private Function CheckExt( fileType ) + If IsEmpty (cfgAllowType) Then + CheckExt = true + Exit Function + End If + For Each ext In cfgAllowType + If UCase(fileType) = UCase(cfgAllowType.Item(ext)) Then + CheckExt = true + Exit Function + End If + Next + CheckExt = false + End Function + + Private Function GetExt( file ) + GetExt = Right( file, Len(file) - InStrRev(file, ".") + 1 ) + End Function + + Private Function CheckOrCreatePath( ByVal path ) + Set fs = Server.CreateObject("Scripting.FileSystemObject") + Dim parts + parts = Split( path, "\" ) + path = "" + For Each part in parts + path = path + part + "\" + If fs.FolderExists( path ) = False Then + fs.CreateFolder( path ) + End If + Next + End Function +End Class + + + +%> \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/asp/action_config.asp b/nezha-fronted/static/ueditor-1.4.3.3/asp/action_config.asp new file mode 100644 index 000000000..d3726a4ff --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/asp/action_config.asp @@ -0,0 +1,9 @@ + + + +<% + Set json = new ASPJson + Set json.data = config + + json.PrintJson() +%> \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/asp/action_crawler.asp b/nezha-fronted/static/ueditor-1.4.3.3/asp/action_crawler.asp new file mode 100644 index 000000000..1235916d5 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/asp/action_crawler.asp @@ -0,0 +1,32 @@ + + + +<% + + Set up = new Uploader + up.MaxSize = config.Item("catcherMaxSize") + up.AllowType = config.Item("catcherAllowFiles") + up.PathFormat = config.Item("catcherPathFormat") + + urls = Split(Request.Item("source[]"), ", ") + Set list = new ASPJson.Collection + + For i = 0 To UBound(urls) + up.UploadRemote( urls(i) ) + Dim instance + Set instance = new ASPJson.Collection + instance.Add "state", up.State + instance.Add "url", up.FilePath + instance.Add "source", urls(i) + list.Add i, instance + Next + + Set json = new ASPJson + + With json.data + .Add "state", "SUCCESS" + .Add "list", list + End With + + json.PrintJson() +%> \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/asp/action_list.asp b/nezha-fronted/static/ueditor-1.4.3.3/asp/action_list.asp new file mode 100644 index 000000000..74bf8097c --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/asp/action_list.asp @@ -0,0 +1,81 @@ + + + +<% + listTemplateName = Session.Value("ueditor_asp_listTemplateName") + + start = CInt(Request.Item("start")) + size = CInt(Request.Item("size")) + total = 0 + + If size < 0 Then + size = CInt(config.Item( listTemplateName + "ManagerListSize" )) + End If + + path = config.Item( listTemplateName + "ManagerListPath" ) + Set extensions = config.Item( listTemplateName + "ManagerAllowFiles") + + Set list = new ASPJson.Collection + + Set fso = Server.CreateObject("Scripting.FileSystemObject") + If fso.FolderExists(Server.MapPath(path)) = False Then + state = "找不到目录:" + path + Else + Set all = ListAllFilesInFolder( fso, path ) + total = all.Count + index = 0 + For Each file in all + If index >= start And index < start + size Then + Dim fileObject + Set fileObject = new ASPJson.Collection + fileObject.Add "url", file + list.Add index - start, fileObject + End If + index = index + 1 + Next + state = "SUCCESS" + End If + + Set json = new ASPJson + With json.data + .Add "state", state + .Add "list", list + .Add "start", start + .Add "size", size + .Add "total", total + End With + + json.PrintJson() + + Function ListAllFilesInFolder( fso, path ) + Dim list + Set list = Server.CreateObject("Scripting.Dictionary") + Set folder = fso.GetFolder(Server.MapPath(path)) + For Each file In folder.Files + If CheckExt(file.Name) Then + list.Add path & "/" & file.Name, true + End If + Next + For Each subFolder In folder.SubFolders + Set subList = ListAllFilesInFolder( fso, path & "/" & subFolder.Name ) + For Each subListFile In subList + list.Add subListFile, true + Next + Next + Set ListAllFilesInFolder = list + End Function + + Function CheckExt( filename ) + For Each ext In extensions + If UCase(GetExt(filename)) = UCase(extensions.Item(ext)) Then + CheckExt = true + Exit Function + End If + Next + CheckExt = false + End Function + + Function GetExt( file ) + GetExt = Right( file, Len(file) - InStrRev(file, ".") + 1 ) + End Function +%> \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/asp/action_upload.asp b/nezha-fronted/static/ueditor-1.4.3.3/asp/action_upload.asp new file mode 100644 index 000000000..19300c122 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/asp/action_upload.asp @@ -0,0 +1,29 @@ + + + +<% + uploadTemplateName = Session.Value("ueditor_asp_uploadTemplateName") + + Set up = new Uploader + up.MaxSize = config.Item( uploadTemplateName & "MaxSize" ) + up.FileField = config.Item( uploadTemplateName & "FieldName" ) + up.PathFormat = config.Item( uploadTemplateName & "PathFormat" ) + + If Not IsEmpty( Session.Value("base64Upload") ) Then + up.UploadBase64( Session.Value("base64Upload") ) + Else + up.AllowType = config.Item( uploadTemplateName & "AllowFiles" ) + up.UploadForm() + End If + + Set json = new ASPJson + + With json.data + .Add "url", up.FilePath + .Add "original", up.OriginalFileName + .Add "state", up.State + .Add "title", up.OriginalFileName + End With + + json.PrintJson() +%> \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/asp/config.json b/nezha-fronted/static/ueditor-1.4.3.3/asp/config.json new file mode 100644 index 000000000..9a20cc7c6 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/asp/config.json @@ -0,0 +1,94 @@ +/* 前后端通信相关的配置,注释只允许使用多行方式 */ +{ + /* 上传图片配置项 */ + "imageActionName": "uploadimage", /* 执行上传图片的action名称 */ + "imageFieldName": "upfile", /* 提交的图片表单名称 */ + "imageMaxSize": 2048000, /* 上传大小限制,单位B */ + "imageAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 上传图片格式显示 */ + "imageCompressEnable": true, /* 是否压缩图片,默认是true */ + "imageCompressBorder": 1600, /* 图片压缩最长边限制 */ + "imageInsertAlign": "none", /* 插入的图片浮动方式 */ + "imageUrlPrefix": "/ueditor/asp/", /* 图片访问路径前缀 */ + "imagePathFormat": "upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + /* {filename} 会替换成原文件名,配置这项需要注意中文乱码问题 */ + /* {rand:6} 会替换成随机数,后面的数字是随机数的位数 */ + /* {time} 会替换成时间戳 */ + /* {yyyy} 会替换成四位年份 */ + /* {yy} 会替换成两位年份 */ + /* {mm} 会替换成两位月份 */ + /* {dd} 会替换成两位日期 */ + /* {hh} 会替换成两位小时 */ + /* {ii} 会替换成两位分钟 */ + /* {ss} 会替换成两位秒 */ + /* 非法字符 \ : * ? " < > | */ + /* 具请体看线上文档: fex.baidu.com/ueditor/#use-format_upload_filename */ + + /* 涂鸦图片上传配置项 */ + "scrawlActionName": "uploadscrawl", /* 执行上传涂鸦的action名称 */ + "scrawlFieldName": "upfile", /* 提交的图片表单名称 */ + "scrawlPathFormat": "upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "scrawlMaxSize": 2048000, /* 上传大小限制,单位B */ + "scrawlUrlPrefix": "/ueditor/asp/", /* 图片访问路径前缀 */ + "scrawlInsertAlign": "none", + + /* 截图工具上传 */ + "snapscreenActionName": "uploadimage", /* 执行上传截图的action名称 */ + "snapscreenPathFormat": "upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "snapscreenUrlPrefix": "/ueditor/asp/", /* 图片访问路径前缀 */ + "snapscreenInsertAlign": "none", /* 插入的图片浮动方式 */ + + /* 抓取远程图片配置 */ + "catcherLocalDomain": ["127.0.0.1", "localhost", "img.baidu.com"], + "catcherActionName": "catchimage", /* 执行抓取远程图片的action名称 */ + "catcherFieldName": "source", /* 提交的图片列表表单名称 */ + "catcherPathFormat": "upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "catcherUrlPrefix": "/ueditor/asp/", /* 图片访问路径前缀 */ + "catcherMaxSize": 2048000, /* 上传大小限制,单位B */ + "catcherAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 抓取图片格式显示 */ + + /* 上传视频配置 */ + "videoActionName": "uploadvideo", /* 执行上传视频的action名称 */ + "videoFieldName": "upfile", /* 提交的视频表单名称 */ + "videoPathFormat": "upload/video/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "videoUrlPrefix": "/ueditor/asp/", /* 视频访问路径前缀 */ + "videoMaxSize": 102400000, /* 上传大小限制,单位B,默认100MB */ + "videoAllowFiles": [ + ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg", + ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid"], /* 上传视频格式显示 */ + + /* 上传文件配置 */ + "fileActionName": "uploadfile", /* controller里,执行上传视频的action名称 */ + "fileFieldName": "upfile", /* 提交的文件表单名称 */ + "filePathFormat": "upload/file/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "fileUrlPrefix": "/ueditor/asp/", /* 文件访问路径前缀 */ + "fileMaxSize": 51200000, /* 上传大小限制,单位B,默认50MB */ + "fileAllowFiles": [ + ".png", ".jpg", ".jpeg", ".gif", ".bmp", + ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg", + ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid", + ".rar", ".zip", ".tar", ".gz", ".7z", ".bz2", ".cab", ".iso", + ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf", ".txt", ".md", ".xml" + ], /* 上传文件格式显示 */ + + /* 列出指定目录下的图片 */ + "imageManagerActionName": "listimage", /* 执行图片管理的action名称 */ + "imageManagerListPath": "upload/image", /* 指定要列出图片的目录 */ + "imageManagerListSize": 20, /* 每次列出文件数量 */ + "imageManagerUrlPrefix": "/ueditor/asp/", /* 图片访问路径前缀 */ + "imageManagerInsertAlign": "none", /* 插入的图片浮动方式 */ + "imageManagerAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 列出的文件类型 */ + + /* 列出指定目录下的文件 */ + "fileManagerActionName": "listfile", /* 执行文件管理的action名称 */ + "fileManagerListPath": "upload/file", /* 指定要列出文件的目录 */ + "fileManagerUrlPrefix": "/ueditor/asp/", /* 文件访问路径前缀 */ + "fileManagerListSize": 20, /* 每次列出文件数量 */ + "fileManagerAllowFiles": [ + ".png", ".jpg", ".jpeg", ".gif", ".bmp", + ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg", + ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid", + ".rar", ".zip", ".tar", ".gz", ".7z", ".bz2", ".cab", ".iso", + ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf", ".txt", ".md", ".xml" + ] /* 列出的文件类型 */ + +} \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/asp/config_loader.asp b/nezha-fronted/static/ueditor-1.4.3.3/asp/config_loader.asp new file mode 100644 index 000000000..085f79c15 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/asp/config_loader.asp @@ -0,0 +1,21 @@ +<% + Set json = new ASPJson + Set fso = Server.CreateObject("Scripting.FileSystemObject") + + Set stream = Server.CreateObject("ADODB.Stream") + + stream.Open() + stream.Charset = "UTF-8" + stream.LoadFromFile Server.MapPath( "config.json" ) + + content = stream.ReadText() + + Set commentPattern = new RegExp + commentPattern.Multiline = true + commentPattern.Pattern = "/\*[\s\S]+?\*/" + commentPattern.Global = true + content = commentPattern.Replace(content, "") + json.loadJSON( content ) + + Set config = json.data +%> \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/asp/controller.asp b/nezha-fronted/static/ueditor-1.4.3.3/asp/controller.asp new file mode 100644 index 000000000..5dd2ff73e --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/asp/controller.asp @@ -0,0 +1,44 @@ +<%@ LANGUAGE="VBSCRIPT" CODEPAGE="65001" %> +<% + action = Request.Item("action") + + Session.Contents.Remove("ueditor_asp_uploadTemplateName") + Session.Contents.Remove("ueditor_asp_base64Upload") + Session.Contents.Remove("ueditor_asp_listTemplateName") + + + Select Case action + + Case "config" + Server.Execute("action_config.asp") + + Case "uploadimage" + Session.Value("ueditor_asp_uploadTemplateName") = "image" + Server.Execute("action_upload.asp") + + Case "uploadscrawl" + Session.Value("ueditor_asp_uploadTemplateName") = "scrawl" + Session.Value("base64Upload") = "scrawl.png" + Server.Execute("action_upload.asp") + + Case "uploadvideo" + Session.Value("ueditor_asp_uploadTemplateName") = "video" + Server.Execute("action_upload.asp") + + Case "uploadfile" + Session.Value("ueditor_asp_uploadTemplateName") = "file" + Server.Execute("action_upload.asp") + + Case "listimage" + Session.Value("ueditor_asp_listTemplateName") = "image" + Server.Execute("action_list.asp") + + Case "listfile" + Session.Value("ueditor_asp_listTemplateName") = "file" + Server.Execute("action_list.asp") + + Case "catchimage" + Server.Execute("action_crawler.asp") + End Select + +%> \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/changelog.md b/nezha-fronted/static/ueditor-1.4.3.3/changelog.md new file mode 100644 index 000000000..562eb20d3 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/changelog.md @@ -0,0 +1,432 @@ +#UEditor Change List + +##1.4.3 +###bug修复&优化改进 +1. 修复hasContents接口在非ie下只有空格时判断还为真的问题 +2. 修复在粘贴word内容时,会误命中cm,pt这样的文本内容变成px的问题 +3. 优化删除编辑器再创建编辑器时,编辑器的容器id发生变化的问题 +4. 修复提交jsonp请求时,callback参数的xss漏洞 +5. 新增jsp后台多种服务器配置下的路径定位 +6. 修复ZeroClipboard的flash地址参数名称错误 +7. 修复getActionUrl的bug +8. 整理配置参数,把遗漏在代码中的配置项整理到ueditor.config.js里 +9. 修复图片拉伸工具和编辑拉伸长高器的样式冲突 +10. 修复文字的unicode编码会被错误再次解析问题 +11. 添加消息提示功能,冒泡提示信息 +12. 优化上传功能提示,当后端配置项没正常加载,禁用上传功能 +13. 修复单图上传按钮和jqueryValidate不兼容的问题 +14. 简化了与jqueryValidate的结合操作,具体看_examples/jqueryValidateDemo.html +15. 修复在删除编辑器后,再次创建时丢失原有id的问题 +16. 修复查找替换在一些块节点中会导致替换错误 + +##1.4.2 +###重构前后端交互功能 +1. 前端上传模块统一改用webuploader +2. 整体重构了文件上传的配置方式,改为统一在后端配置,前后端自动打通,[详细文档]() +3. 统一各上传模块的提交地址,各模块通过action参数区分类型,[详细文档]() +4. 提供serverparam命令,可在提交时追加任意参数,[详细文档]() +5. 统一了前端各上传模块的布局样式 +6. 支持了在线附件预览和插入 +7. 统一了后端返回数据格式,[详细文档]() +8. 各在线预览列表模块支持分组加载 +9. 增加点击直接选择文件上传图片插件 +10. 优化了粘贴图片的功能,上传时有loading和出错的提示 +11. 添加jsonp的跨域请求支持 + +###bug修复&优化改进 +1. 修复内容过多时,回到顶部,顶部内容被工具栏遮挡问题 +2. 修复htmlparser解析标签的bug +3. 修复锚点是#开头时还添加http://的bug +4. 修复全屏后,退出全屏高度没有缩回来的问题 +5. 文字选中后按delete删除,无法触发contentchange事件 +6. 修复选择图片时点击8个控制点不拖动,contentchange会误触发的问题 +7. 修复执行命令会触发多次contentchange事件 +8. 修复输入文字,设置高度300,没有滚动条 +9. 修复在不可编辑模式下,链接认可修改的问题 +10. 修复全局css对于ueditor有时展现会出现按钮独占一行的问题 +11. 修复在ie11下上传图片失败的问题 +12. 修复chrome 34版本下报错问题 +13. 修复ie8下插入多张远程图片之后,对话框假死问题 +14. 修复uparse,在页面中多次调用某些模块无效果问题 +15. 修复容器宽度100%时,改变窗口大小,宽度不自适应的问题 +16. 将桥接ui和编辑器的业务代码放到了新建的adapter目录,方便维护 +17. 修复拖拽改变图片大小功能和bootstrap不兼容的问题 +18. 修复在表格水平边框上拖拽,不能改变大小的问题 +19. 修复在表格标题上可以向左向下合并单元格的问题 +20. 修复grunt打包出错的问题 +21. 优化ie11下的兼容问题,主要修复了表格下的诸多问题 +22. 优化插入图片,添加原文件名作为alt属性 + +###新功能添加 +1. 添加了enableContextMenu配置开关,开关右键菜单,默认为true +2. 添加disablePInList配置,指定产出的列表中是否嵌套P标签,默认是false +3. 添加retainOnlyLabelPasted配置,指定粘贴时是否是只保留标签模式,默认是false +4. 优化了添加toolbar上各类ui的方式,方便二次开发 +6. 优化有时产出数据会带有 bookmark标签的脏数据问题 +7. 添加LocalStorage本地存储工具 +8. 优化自动排版功能,选项保存到localStorage或UserData +9. 添加右键菜单的复制粘贴的支持,非ie不提供粘贴功能 + +##1.3.6 + +###bug修复 +1. script/style标签内容,在ie下的编辑状态显示内容问题 +2. 修复预览窗口没有滚动条问题 [出自](http://www.ueditorbbs.com/forum.php?mod=viewthread&tid=28231&extra=page%3D1) +3. 修复在ie67下自动寻址的问题 +4. 修复ff下图片拖拽大小不触发contentchange问题 +5. 修复注释被删除的问题,包括在script中的[出自](http://www.ueditorbbs.com/forum.php?mod=viewthread&tid=12509&extra=page%3D1) +6. 修复在源码模式下不能使用setContent的问题,[出自](http://www.ueditorbbs.com/forum.php?mod=viewthread&tid=26910&extra=page%3D1) +7. 修复在给定宽度为100%时,ie11在拖动窗口大小时,编辑区域不随着变化的问题 +8. 修复在ie67下destroy方法调用报错 +9. 修复在插入代码模式下,ie9+以上的浏览器键盘操作(enter/tab等)错误或者失效的问题 +10. 修复不规则源码在ie下解析成文本的问题 +11. 修复p标签在ie下嵌套的问题 +12. 修复目录大纲更新事件导致失焦点的问题 +13. 针对word粘贴列表到编辑器中自动转换为list标签,由于有误命中情况,所以默认关闭该功能。提供**autoTransWordToList**配置项(默认为false),开发者可酌情配置。 +14. 添加禁止表格嵌套的开关,解决excel中粘贴到编辑器中会有冗余的嵌套表格问题,配置项**disabledTableInTable**(默认是true)。 +15. 过滤掉excel的表格粘贴到ie中时,会有bitmap的冗余占位图片问题 + +###功能更新 +1. 支持视频上传插入,多浏览器自适配播放器 + +#1.3.5 + +###新增功能 +1. asp后台的支持 +2. 添加本地自动保存功能 +3. 增加数据可视化展示功能 +4. 编辑器实例上添加isFocus,blur方法 +5. 新增在chrome下针对图片的拖拽宽高功能 +6. 新增在高端浏览器下,qq截图粘贴上传,拖拽图片到编辑上传 +7. 添加表格插入列标题功能 +8. 添加设置表格可排序功能,支持表格在预览页排序 +9. 添加生成目录功能 + +###已有功能优化 +1. ie8以上版本使用w3cRange +2. 使用grunt作为打包工具 +3. 修复了过滤规则对于script/style的内容的转码 +5. 自动寻址功能重构 +6. 修复下拉菜单高度问题 +7. 针对ie默认带有的autolink功能,添加开启禁用选项,创建时传入autolink:false就可禁用ie的autolink功能 +8. 支持插入动态地图 +9. **API文档更新** +10. 图片上传路径可配置,增加前后端路径验证 +11. 对uparse进行了拆分重构 +12. 随下载包提供各种功能说明文档 +13. 背景颜色功能重构,可以在预览页显示背景 +14. 重写了查找替换插件,解决ff下window.find方法失效的问题 + + +##1.2.6.1 +1. 查找替换支持正则表达式 +2. 修复了ie67下初始化宽高给定百分比 +3. 增加类似word中的快捷菜单,默认关闭 +4. 针对默认过滤回转换div为p标签,提供了配置开关allowDivTransToP,默认为true +5. 修复了在ie下删除分割线后光标定位的问题 +6. 提供了手动加载语言文件,避免ie下有时会因语言文件加载失败导致编辑器加载失败,提示"not import language file"的错误 +7. 优化了编辑器初始化时获得contentWindow可能不存在的情况 +8. 优化了编辑器加载自定义样式的问题,默认initialStyle传入的css样式优先级最高,其次是指定的外部css文件 +9. 工具栏支持指定位置折行,'|'表示分割符,'||'表示折行 +10. 表格操作功能升级,优化了对表格的拖拉及双击操作,并且支持IE6+浏览器。 +11. 修复编辑器在禁用状态下仍然可以拖动表格边框的bug。 +12. 修复了分割线不能删除的问题 +13. 修复了初始化内容过多时,编辑器不自动长高,要点击编辑器才会长高的问题 +14. 优化了添加字符边框的展示效果,避免出现重叠的问题 +15. 修复下拉菜单超出屏幕的bug +16. 修复table属性初始化时table布局错误的bug +17. 优化了选择工具栏上下拉菜单类型的操作命令时,选区会有闪动的问题 +18. 优化了关于swfupload的一个xss漏洞 +19. 优化了对于ie9,10的支持 + + +##1.2.6 +1. 优化了编辑器路径的设置,可以不用手动设置路径,自动识别相关路径,解决路径设置繁琐的问题 +2. 重写了过滤粘贴机制,采用黑白名单,可以书写符合自己需求的过滤规则,可以完全定义标签的属性,甚至是style上的某个属性及其数值 +3. 优化了拖拽机制,处理浮动图片拖拽不能跟指定的某行对齐 +4. 数据同步改为失去焦点就执行,可以不再使用sync方法手动同步数据 +5. 添加了字体边框 +6. 优化了backspace/del键的操作 +7. 重写了插入代码功能,插入代码编写支持tab和回车键 +8. 表格支持排序和隔行显示 +9. 改使用closure的压缩工具 +10. 优化了undo/redo操作 +11. 优化了ui界面 + + +##1.2.5 +###新增功能 +1. table整体重构 +2. table支持插入表头和标题 +3. table支持拷贝 +4. table支持任意调整宽高 +5. table支持任意前插后插行列 +6. table键盘操作仿word用户体验 +7. 添加table平均分布行、列 +8. 添加table单元格对齐方式 +9. 添加table对齐方式 +10. 添加选中部分表格,点击backspace或delete删除功能 +11. 重写表格属性、单元格属性dialog +12. 粘贴支持纯文本,源码,纯标签3个模式选择 +13. 添加计算字数的getContentLength接口 +14. 添加计算字数事件wordcount +15. 图片上传支持参数动态绑定 +16. 重写了list功能,支持一,一),(一),1),(1),——等新的列表标签 +17. 调整了list中tab键的逻辑 +18. 添加了可以限制列表的层级 +19. 全屏快捷键 ALT+Z +20. 添加了uparseplugin.js展示页加载器 + +###优化修复 +1. 优化了插入代码功能 +2. ie下默认禁用源码模式下的代码高亮 +3. 截图功能支持非ie浏览器 +4. 修正了非ie下中文输入时回退不准确的问题 +5. 改进了键盘输入时做回退的操作 + +##1.2.4 +###新增功能 +1. 官网新增API文档 +2. CSS按照UI结构进行了模块化拆分 +3. 新增皮肤切换功能,并提供一套新皮肤(可通过配置项theme来设置) +4. 新增编辑器容器拖动缩放功能,配置项为:scaleEnabled、minFrameWidth、minFrameHeight +5. 新增音乐插件 +6. 增加了源码模式下,全屏按钮可以使用 +7. 添加了UE.getEditor工厂方法 +8. 添加了针对jquery配合使用的demo +9. 添加了针对jqueryValidation配合使用的demo +10. 添加了初始化编辑器宽高配置,配置为项:initialFrameWidth、initialFrameHeight + +###优化修复 +1. 修复涂鸦路径在配置时,添加参数时请求报错 +2. 修复涂鸦opera下缩放不能使用 +3. 修复编辑器全屏功能失效问题 +4. codemirror版本升级到最新版 +5. 对opera/safari的支持进行了进一步的优化 +6. 优化了部分demo页的代码 +7. 修改原来的minFrameHeight为拖动时的最小高度 + +##1.2.3 +###新增功能 +1. 新增国际化支持 +2. 新增涂鸦功能 +3. 新增大小写功能 +4. 新增getAllHtml方法,可以将整个页面的内容打出来,可以在ueditor.configplugin.js里通过配置allHtmlEnabled,来配置在提交时是否使用getAllHtml来得到内容 +5. 新增插入模板的功能 +6. 新增背景功能 +7. 新增UE.instants全局对象,下边挂接了所有实例化的编辑器对象 +8. Editor下新增ready方法,当编辑器ready后执行传入的fn,如果编辑器已经ready好了,就马上执行fn +9. 新增topOffset配置参数,用于设置AutoFloat时工具栏距离顶部的高度 +10. 新增sourceEditorFirst配置参数,用于控制编辑器初始化时是否显示成源码模式,默认为否 +11. 新增在表格内实例化编辑器的demo +12. 新增getDialog(dialogName)接口,可以获取dialog对象。 + +###优化修复 +1. chrome下会出现alt+tab切换时,导致选区位置不对 +2. focus方法添加参数可以指向到内容末尾 +3. 完全支持opera浏览器 +4. 修复了表格中实例化编辑器时工具栏浮动错位问题 +5. 优化了后台处理文件代码,文件夹按照日期自动生成 + + +##1.2.2 +1. 编辑器不可编辑时,可以配置哪些功能可以使用,例如全屏 +2. table的边框为0时,采用虚线显示 +3. 修复firefox下插入大量代码时,代码格式显示不正确的问题 +4. 附件上传成功后显示初始文件名 +5. 自定制下载优化 +6. 当图片上传超时时,增加提示信息 +7. 修复自动排版对H1不生效的问题 +8. 修复插入超链接,超链接地址包含script标签,预览时会执行script语句的问题 + + +##1.2.1 +1. 插入表情时,按住CTRL键可连续插入多个表情 +2. 按住CTRL+Enter提交表单 +3. 增加readonly属性在ueditor.configplugin.js,编辑器实例上增加setEnabled,setDisabled方法,设置编辑区域是否可以编辑 +4. Editor上添加了getPlainTxt方法,得到编辑器的纯文本内容,但会保留段落格式 +5. 修正了initialContent赋值失效的问题,赋值顺序以标签内容为先,如果没有再看initialContent内容。 +6. 为insertHtml命令添加了过滤机制 +7. getContent将“ ”转成空格,连续2个空格则以“  ”表示 +8. 当选区在一个超链接中,就可以在弹出层中直接修改这个超链接中的文本 +9. 与后台交互的路径整体进行了调整 +10. 超链接窗口可以修改超链接显示的文字 +11. 增加插入百度应用的功能 +12. 为每个plugin的在代码中添加了配置项的容错代码,若配置项不存在,不会报错 +13. 提供后台的jsp版本 +14. 重写了ui和和编辑器的交互层,dialog改为显示时创建,整体代码减少22k +15. 修正了代码高亮跟jquery冲突的问题 +16. 改进了多个编辑器实例,使用一个name做为form提交,后台都可以取到 +17. 添加是否删除空的inlineElement节点(包括嵌套的情况)的配置项:autoClearEmptyNode +18. 修正了chrome下粘贴文本带有white-space样式, 导致编辑器内容不能折行的问题 +19. 在配置项中增加isShow设置初始化时是否显示编辑器,在编辑器实例上增加setShow,setHide方法设置编辑器的显示/隐藏 +20. 修正在jquery中实例化编辑器时与UE自带的domready冲突的问题 +21. 修正代码高亮中的行号与代码内容不能对齐的问题 +22. 新增了图片上传对话框中可自定义配置默认Tab的功能 +23. 修正.net源码包中gbk版本的乱码以及demo中使用了php路径的问题 + +##1.2.0 +1. 远程图片抓取 +2. 源码模式下css进行了简写 +3. 增强了表格的编辑功能 +4. 增加了baidu图片搜索功能,搜索图片然后直接插入到编辑器中 +5. 重写了浮动工具栏,支持混乱模式下的工具栏滚动 +6. 服务器图片在线管理 +7. word的本地图片取得寛高 +8. 附件上传 +9. 自动排版 +10. 优化了状态反射的方式,改为编辑器获得焦点才会触发,失去焦点不在触发状态查询 +11. 添加了上来就可以全屏的配置项哦去焦点之前的选区 +13. 优化了查询状态反射的性能 +14. 添加了contentchagne事件 +15. 重写了autoheight插件,去掉setInterval的方式,并且长高时不在跳动 +16. 插入视频,可以预览,并且界面加入了视屏搜索功能,并且可以插入视屏预览图到编辑器中 +17. 单元格属性编辑 +18. ie下的截屏功能 +19. 加强了table的dialog功能 +20. 改进了autolink的效果,例如: dddhttp://www.baidu.com 回车,http://www.baidu.com也可以被匹配到了 +21. 文件上传提供flash源码 +22. 修改了行间距的展示方式 +23. 段间距变为段前距和段后距 +24. 提供了.net的事例代码 +25. 首页提供了功能选择生成下载的新功能 +26. 首页文档进行了改进 +27. 分页符可以删除 + +##1.1.8 +1. 避免了重复加载源码高亮的核心代码 +2. 修复了word粘贴table过滤出错问题 +3. 修复插入地图会出现style="undefined"的问题 +4. 优化了list,多个相邻的属性一直的list会合并 +5. 可以在列表中的一行里产生多行的效果(通过回车再回退操作),类似office的效果 +6. 添加自定义样式功能 +7. 修了在chrome下右键删除td里的图片会把整个td删除的问题 +8. 改进了不同的页面调用一个editor,URL问题 +9. 增加了颜色选择器的颜色 +10. 改进了提供的后台程序的安全性 +11. 代码高亮支持折行 +12. 改进了源码编辑模式下的性能(ie下),并且支持自动换行 +13. 修改了在destroy之后会在ie下报错的问题 +14. 给初始化容器name值,那么在后台取值的键值就是name给定的值,方便多实例在一个form下提交 +15. 支持插入script/style这样的标签 +16. 修复了列表里插入浮动图片,图片不占位问题 +17. 源码模式下,去掉了pre中的  +18. 完善了_example下的demo例子 +19. base64的图片被过滤掉了 + +##1.1.7.3 +1. 支持图片相对路径模式 +2. word粘贴首行缩进问题 +3. 添加了图片边距 +4. 提供了图片等比压缩时基准边选择配置的功能 +5. dialog在某些页面不显示问题 +6. 添加了行内间距的调整 +7. 在editor实例下添加了destroy方法 +8. 全屏按钮位置不对的问题 +9. iframe.css支持相对和绝对路径 +10. 修正了focus方法在ff下失效的问题 +11. 提供了对FF3.6的支持 +12. 添加了Shift+Enter软回车功能 +10. 统一了颜色rgb转成# + +##1.1.7.2 +1. 去掉了iframe.css 改为在ueditor.configplugin.js中配置,避免css文件找不到的问题 +2. 给下拉菜单添加了默认的文字说明 +3. Ueditor.css去掉了对外部页面css的影响 +4. 修正了ie9下,编辑器的高度不随着内容缩短的问题 +5. 修正了粘贴有时会出现粘贴失败的情况 +6. 修正了在ie下点击图片会出现js错误的问题 +7. 修正了在ie下选全部替换,回退,再替换会出现替换失败的问题 +8. 增加表情本地化模式,可在config中配置是否开启本地化 +9. flash的多图片上传 +10. 支持了源码模式的下的代码高亮 +11. 增加插入代码支持的语言,改进了插入代码的展示效果 +12. 增加了字数统计 +13. 增加了对图片的排版操作 +14. 解决ie6和ie7下工具栏浮动时cpu占用过高的bug +15. 优化了文本模式粘贴的效果 +16. 优化了word粘贴的效果 +17. 在word粘贴本地图片时添加引导上传功能 +18. 更好的ie9支持 +19. 优化首行缩进效果 +20. 使用script标签代替textarea标签作为编辑器容器,简化前后端转码的配置。 +21. 优化了路径配置,修正了1.1.7.1中需要修改多处路径的问题 +22. 增加了图片操作浮层的开关配置 +23. 同时支持网络图片和本地图片的等比缩放 +24. 优化了源码模式下的代码格式 + +##1.1.6.1 +1. 去掉了iframe.css 改为在ueditor.configplugin.js中配置,避免css文件找不到的问题 +2. 给下拉菜单添加了默认的文字说明 +3. Ueditor.css去掉了对外部页面css的影响 +4. 修正了ie9下,编辑器的高度不随着内容缩短的问题 +5. 修正了粘贴有时会出现粘贴失败的情况 +6. 修正了在ie下点击图片会出现js错误的问题 +7. 修正了在ie下选全部替换,回退,再替换会出现替换失败的问题 + +##1.1.6 +1. 插入日期按钮现在使用tangram日历控件 +2. table可再编辑 +3. 粘贴excel表格的问题 +4. ff下最大化和切换源码出现光标不能跟着键盘改变和不能切出输入法的问题 +5. tab按键功能 +6. 支持多级列表 +7. 超链接可以在非ie下去除下划线 +8. 字体,字号,在editor-configplugin.js中可配置 + + + +##1.1.5 +1. 右键的策略,只显示选区内可操作的条目 +2. 禁止elementpath还会留下边框问题 +3. 字体改为了px +4. 插入分页符 +5. 整合浮动toolbar为autofloat插件 +6. 初始化的值会在第一次操作前清除,而且不在有延迟感 +7. 配置项都放到了editor-configplugin.js中 +8. 修正了多实例的问题 +9. 插入iframe功能 +10. 粘贴过滤掉内容会有提示,没过滤任何内容不会出现提示 +11. 修正代码高亮的显示效果 +12. list放弃原生改为手动实现,修正一系列原生的bug +13. 初始给个textarea会把内容取出作为初始值 +14. 去掉了源码状态下冗余的table/td/pre的style属性 +15. fixed剪切出去会带start/end +16. fixex源码模式下getContent内容不是新的 +17. table加入了设置背景颜色和边框颜色 + + + +##1.1.4 +1. 锚点 +2. 首行缩进 +3. 行间距 +4. 右键菜单 +5. 插入代码 +6. 文件上传(php版本) +7. 修复一些bug + +##1.1.3 +1. 修复chrome下粘贴的bug +2. 自动转换office粘入的有序列表和无序列表 +3. 插入图片不再等比缩放,显示原始大小 + +##1.1.2 +1. 修正IE9下autoHeight插件会一直长高的问题 +2. 增加对IE6下大写style属性的转换处理(现统一转换成小写) +3. 格式刷 +4. 上下标互斥 +5. form提交的支持 +6. 增加了focus属性,可以初始化时,设置是否编辑器获得焦点 +7. 增加了下滑线,删除线按钮,去掉了原来的下拉框 +8. autolink支持,使非ie在输入链接时能自动加上a标签 +9. google地图支持 +10. 修正了一些bug + +##1.1 +1. 修改了删除链接的机制,允许一次性删除多个超链接 +2. 改变了目录结构,方便部署(大大减少了开发代码过程中需要引入的js数量) +3. 修正部分bug + +##1.0 (2011-7-8) +1. 完成功能的开发 diff --git a/nezha-fronted/static/ueditor-1.4.3.3/dialogs/anchor/anchor.html b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/anchor/anchor.html new file mode 100644 index 000000000..f277847a4 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/anchor/anchor.html @@ -0,0 +1,40 @@ + + + + + + + + +
          + +
          + + + + \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/attachment.css b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/attachment.css new file mode 100644 index 000000000..548b4284d --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/attachment.css @@ -0,0 +1,681 @@ +@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; + *border: 0px dashed #e6e6e6; + height: 172px; + padding-top: 150px; + text-align: center; + background: url(./images/image.png) center 70px no-repeat; + color: #cccccc; + font-size: 18px; + position: relative; + top:0; + *top: 10px; +} + +#upload .placeholder .webuploader-pick { + font-size: 18px; + background: #00b7ee; + border-radius: 3px; + line-height: 44px; + padding: 0 30px; + *width: 120px; + color: #fff; + display: inline-block; + margin: 0 auto 20px auto; + cursor: pointer; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); +} + +#upload .placeholder .webuploader-pick-hover { + background: #00a2d4; +} + + +#filePickerContainer { + text-align: center; +} + +#upload .placeholder .flashTip { + color: #666666; + font-size: 12px; + position: absolute; + width: 100%; + text-align: center; + bottom: 20px; +} + +#upload .placeholder .flashTip a { + color: #0785d1; + text-decoration: none; +} + +#upload .placeholder .flashTip a:hover { + text-decoration: underline; +} + +#upload .placeholder.webuploader-dnd-over { + border-color: #999999; +} + +#upload .filelist { + list-style: none; + margin: 0; + padding: 0; + overflow-x: hidden; + overflow-y: auto; + position: relative; + height: 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(./images/image.png) no-repeat center 12px; + border: 1px solid #eeeeee; + border-radius: 0; +} +#upload .filelist li.filePickerBlock div.webuploader-pick { + width: 100%; + height: 100%; + margin: 0; + padding: 0; + opacity: 0; + background: none; + font-size: 0; +} + +#upload .filelist div.file-panel { + position: absolute; + height: 0; + filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#80000000', endColorstr='#80000000') \0; + background: rgba(0, 0, 0, 0.5); + width: 100%; + top: 0; + left: 0; + overflow: hidden; + z-index: 300; +} + +#upload .filelist div.file-panel span { + width: 24px; + height: 24px; + display: inline; + float: right; + text-indent: -9999px; + overflow: hidden; + background: url(./images/icons.png) no-repeat; + background: url(./images/icons.gif) no-repeat \9; + margin: 5px 1px 1px; + cursor: pointer; + -webkit-tap-highlight-color: rgba(0,0,0,0); + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +#upload .filelist div.file-panel span.rotateLeft { + display:none; + background-position: 0 -24px; +} + +#upload .filelist div.file-panel span.rotateLeft:hover { + background-position: 0 0; +} + +#upload .filelist div.file-panel span.rotateRight { + display:none; + background-position: -24px -24px; +} + +#upload .filelist div.file-panel span.rotateRight:hover { + background-position: -24px 0; +} + +#upload .filelist div.file-panel span.cancel { + background-position: -48px -24px; +} + +#upload .filelist div.file-panel span.cancel:hover { + background-position: -48px 0; +} + +#upload .statusBar { + height: 45px; + border-bottom: 1px solid #dadada; + margin: 0 10px; + padding: 0; + line-height: 45px; + vertical-align: middle; + position: relative; +} + +#upload .statusBar .progress { + border: 1px solid #1483d8; + width: 198px; + background: #fff; + height: 18px; + position: absolute; + top: 12px; + display: none; + text-align: center; + line-height: 18px; + color: #6dbfff; + margin: 0 10px 0 0; +} +#upload .statusBar .progress span.percentage { + width: 0; + height: 100%; + left: 0; + top: 0; + background: #1483d8; + position: absolute; +} +#upload .statusBar .progress span.text { + position: relative; + z-index: 10; +} + +#upload .statusBar .info { + display: inline-block; + font-size: 14px; + color: #666666; +} + +#upload .statusBar .btns { + position: absolute; + top: 7px; + right: 0; + line-height: 30px; +} + +#filePickerBtn { + display: inline-block; + float: left; +} +#upload .statusBar .btns .webuploader-pick, +#upload .statusBar .btns .uploadBtn, +#upload .statusBar .btns .uploadBtn.state-uploading, +#upload .statusBar .btns .uploadBtn.state-paused { + background: #ffffff; + border: 1px solid #cfcfcf; + color: #565656; + padding: 0 18px; + display: inline-block; + border-radius: 3px; + margin-left: 10px; + cursor: pointer; + font-size: 14px; + float: left; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +#upload .statusBar .btns .webuploader-pick-hover, +#upload .statusBar .btns .uploadBtn:hover, +#upload .statusBar .btns .uploadBtn.state-uploading:hover, +#upload .statusBar .btns .uploadBtn.state-paused:hover { + background: #f0f0f0; +} + +#upload .statusBar .btns .uploadBtn, +#upload .statusBar .btns .uploadBtn.state-paused{ + background: #00b7ee; + color: #fff; + border-color: transparent; +} +#upload .statusBar .btns .uploadBtn:hover, +#upload .statusBar .btns .uploadBtn.state-paused:hover{ + background: #00a2d4; +} + +#upload .statusBar .btns .uploadBtn.disabled { + pointer-events: none; + filter:alpha(opacity=60); + -moz-opacity:0.6; + -khtml-opacity: 0.6; + opacity: 0.6; +} + + + +/* 图片管理样式 */ +#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: 13px; + 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; +} \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/attachment.html b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/attachment.html new file mode 100644 index 000000000..2ae928202 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/attachment.html @@ -0,0 +1,60 @@ + + + + + ueditor图片对话框 + + + + + + + + + + + + + + +
          +
          + + +
          +
          + +
          +
          +
          +
          + 0% + +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
            +
          • +
          +
          +
          + + +
          +
          +
          + +
          +
          + + + + \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/attachment.js b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/attachment.js new file mode 100644 index 000000000..ce3be633d --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/attachment.js @@ -0,0 +1,754 @@ +/** + * 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') || []).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 = $('
        1. ' + + '

          ' + file.name + '

          ' + + '

          ' + + '

          ' + + '
        2. '), + + $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) { + 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') { + _this.fileList.push(json); + $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; + }, + getInsertList: function () { + var i, link, data, list = [], + prefix = editor.getOpt('fileUrlPrefix'); + for (i = 0; i < this.fileList.length; i++) { + data = this.fileList[i]; + link = data.url; + 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; + } + }; + + +})(); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/fileTypeImages/icon_chm.gif b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/fileTypeImages/icon_default.png b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/fileTypeImages/icon_doc.gif b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/fileTypeImages/icon_mp3.gif b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/fileTypeImages/icon_mv.gif b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/fileTypeImages/icon_pdf.gif b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/fileTypeImages/icon_ppt.gif b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/fileTypeImages/icon_psd.gif b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/fileTypeImages/icon_xls.gif b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/images/alignicon.gif b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/images/file-icons.png b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/images/icons.gif b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/images/icons.png b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/images/progress.png b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/images/success.gif b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/attachment/images/success.png b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/background/background.js b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/background/background.js new file mode 100644 index 000000000..9a4a1315d --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/background/images/bg.png b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/background/images/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..580be0a01dff4c70c72f78a3f40186660ee8eee0 GIT binary patch literal 2810 zcmVKLZ*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 z04GUAK~#9!Vtn`R9RmY{pr9ZF0|OHS5@7uQ|33o*!~6H|(PaPw01s0L&KTc-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#'+ this.point.name +'
          : '+ ( Math.round( this.point.percentage*100 ) / 100 ) +' %'; + } + } + } + } + } +]; diff --git a/nezha-fronted/static/ueditor-1.4.3.3/dialogs/charts/charts.css b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/charts/charts.css new file mode 100644 index 000000000..ac3c76458 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/charts/charts.html b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/charts/charts.html new file mode 100644 index 000000000..70e23149f --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/charts/charts.html @@ -0,0 +1,89 @@ + + + + chart + + + + + +
          + + + + + + \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/dialogs/charts/charts.js b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/charts/charts.js new file mode 100644 index 000000000..37344fd12 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/charts/images/charts0.png b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/charts/images/charts0.png new file mode 100644 index 0000000000000000000000000000000000000000..9485e5ed8f83888e782eafae6f7505c79671a985 GIT binary patch literal 25306 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 literal 0 HcmV?d00001 diff --git a/nezha-fronted/static/ueditor-1.4.3.3/dialogs/charts/images/charts2.png b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/charts/images/charts4.png b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/charts/images/charts4.png new file mode 100644 index 0000000000000000000000000000000000000000..742006adc9cee3c07b1a390da6991a84d1da99d6 GIT binary patch literal 8344 zcmb_?cQ~9|*Z#xk1Sf(ZN=^vTTZob|5+O)%h!Qo0;4p;I%jj_=kwouI^g5zP@1l-w zbkV!X=zV^Vyx)7y`~BYYe%JTM_qbeh&DwiEyR5bDwbs2SL`y^E5)~^I005U%A1Y}B z0E7qth)@*7pu{`%lneYId!eqP1Q0I%P_0%Upl!MMCyElFWdi^%KvhZc ziCg04lvzHvWgO@CEs15fH_u;TzW29rT$QJhDjK8scqy)(ZE)@Dm&*3!cP*Y_wQ5&rij}x+gy`~l->5$O@}lAC%a669cf=q& z0C>f-oSv^+pc2 zy62(bw$NC~k-O(!aXutH>8|+V&V8eo+FmQ@!9D3jdG}&3U~SK18IvUEzP+FV-3|*%=})xE zHWAL>%?y0ME8*yMwxL(aIB=HU#cL<-5WHxUP^pVYzN#xV&KWe_IGm;$FlaWcbO`Y)oDv`E{SLp@$TV;=HUBLrgo3HAVJb0}kH3QFc-96peB| z8+d!Z*#{eC^E^4-_G(kFy6xSLskt<ov6KKhbJ9d^2`;*)C?R=DSN{Q(U3L zD<0ULT|X3QrgMOrol(ubspk88W%r9clMe+Y%nWr4y}=H?=3G|61udvJPqbIc_4Z4& z8pc_9h3tIIiB>D|$H%gj*YtD+yD(om811Pfv^XzzAVsp!^sO{#u&&{@L-S?hHbaOmpQ^PfrgHdQws^ zd$fHdUG9CtdzRVtoK_mgS!Z#$hU1vVPv7@+-5f7NEMtas>x}`$9ZT6O&9gs>21UFV zeUb^x1am@}5AH3peg^kW5x!k-TJse@gFMyrIT}~+=$+8h({tIH%wZ#;7iZzS5+h=E zKCZ(Y0hD^5?1K~8Nt;#U%%r$mdvN2<__@}yvfH>Duy%8lR?Yr6+p@?3*t@tm zm2yZqn6993>nt=Y1$q2qwmBgoL7e_)zx@2&I>bIfB?Vb;e>Ec%+&ST}f5nw#Qa~0hDWy{a(RM$9@zQ(#0k~3lJ}PJTHjZ4Ss760c4J0o1ZR8R?dF0R#X9q zeTk1@1<#*Q1N_{OGUf8Z8+1esOdT*GQD_M-3#~d+Gz&8Xa5P6T#m3qe4}zXS45W95 z{9IvK0+J38RQ{V#^JhrAvHZ|BG=Z?-^HJm!lX80IzemksQtTh`RAgW4=nT@JB(7zX z?sqf$wa&ny#ofyt;k*4Cx{6dB{Phe#tTI`uDo?YTqj#zGtn!>6Y|;rQQOT2qtF8-E zL(#Bg-xvrh#xwmkF5P+iQ*jq!qP%GMi8A_^D5bnzmm_Cj1wf=$bA6c@il47ROy=0jkf9WaxTXctV&MtIUp$q$X2ooEU8nfN-; z_j_AYm7w(|2}b}`vAWB1hs*q&z5v%}x*>=YFOV zR4bm(0~)z1i;9ZG@SnH4h=8|$Iev+&x-dBqdn>Z&i}m%J3HDM_QUj*_rHcSy5eViW zK=egRq+bE?I_^lT5L^AD!Y9HcytaB2ityyC@7=axN^EiW+mWljLk1Wz>yhQ&0+Q}H zq;7lbZAIyuuI^2r9j_PGA1x(-yI4Os865H28`h`Z!mMXxahUk@2Ag`U^)GA3WV6;3w{Ax8a6D-byV0>Z7yR}>Z#ySOP-gvDNAvF9c9#flqQV{w^pEwg zfmI_;c|h4JA; zeTTEz^mcTG?b%p~T%1ktqQ1t6yz|;n*bNoC`m_D?cM{WGx2B($TR-WbE*yD%XJgMp zdfF|`#)3ZQ+cvh-3Y;XBvC|7>O_bd&Z`EuWvUlLccN8<-1C_+P{Mw;gTU1mqNjnHf zP+M-*zZY*dS`-mai82w#$^uSC2HvP$7pcK?2VQ2UOd(tiUQY{$o$n%!2y8o$fd@-0 z(=jUSxwZ4L$T7u2B6kx9E=5dK-i>@p?yEt?17Tc_wf@)^jnp1|(bwYKMyPJh!rWc$ zW`BifYf*_{v)EQa$LM@<-2ZHy7X=PMgF}j(jcBB)6|6h1MoydB)>wPdX;TA6zjS(W zEk$X}Sx*{AEzG^UbqA1qz?pr+QIXra+dM&Xhc?i{^$sF$1M@9~C&tn7hSu2C^f5@o zz;1*@eBW2_M5p$HN;I!2Xq`^E-IKaTtMFsYQo(2UJ+6%*D`Bh0NBVr%8!N4?T2wxy zI_1?z{I@CXzXhza4rb13sRolCi_^KQD&kDjlt8yS*$elZWHBIo^*AfitdjexwZjBe zdBz?9#3+7r+_=YT_DGh`dhlwvCSimwVsW);dKX_9?)i{OSkK&pXs94CHe8OSUTOXC z_R}uVnJZQyWk%uZ;XY%3LfC9Pb1u~%6hg& zdzQnom?4fC!?Nfa{#bo5Tqh1h5B`_WhlJTgn6@Z&iy452tB}_09FaE2MUG&2lg(@? zzA(ZFF}^vMh4%8z_kBeNl&yVKPRq2paCFeUohFzuP>0io@$vC;I2dM1SH>;xTtj{@ z=|!He#N7|3-JGfSIoO(dtWTouJXqVi5S>_uJ67huH4-hGlR#$()&y-$zHg6GY*CE6 z|6VKnb+GNO^Aii|aSXiYjj!)u-*gf#HKQJIe7f%IUozmPajm zd8C{6?V?_`XL^44hB$(^@(SomIZmo*!jl?WU`kJ&tZM!6{#dnHEn!PGnMZ@PDD(S% zsmbC^%3)^TPFGj{NbUqliO1J$1WIUuq$dt!of#<`_f)elGh|8mSPwi{vLuVQz+CE- zdRBb>2Ag6h-;8P}TIbb=ut^Ag0>6Y7tFNO2?^7feAKZe<(N zD5)f;mFQJ&X%Lcc3Um5My7N^)frdxU7AR5-RgzMi@mvQqQsOGjz~dG!;F<7kQ|Y>q zBiPtvNm0>tG9mzB{Vn8>ETFOFoE~U+v36`~5ag-OCO>7jZ)-uN)_J%OITni*G5-3c+j2pl6}hf%qn;G$yfIotTAu5m;k0j8 zvP^Ec(I+@2;&arck9ONvkl*(qe8-ps(``oj87}W4mIr)bA*0mGcgTiWLtJ4;#&#uz8{nR|CwB zkUj@>gO;K1$~wqtcU@`C&XRn-IN~!TaJBe0b~%@Pba_q(75!&l44vd-7bz#Hb#Ae2 zY}5{Wtj$Ai91R7TVy#vyJUg>FKYa30U?fZ%$N5oBT30 zE4!=}48A7vDxDyhX*u;g2|vT1Ai!hd*Y)3^h~WgV4e1I92!NsP;5rrHY}4q) z1^9N7N^?@gwzU}eQkCt2)c{~L%Pk3peZ$waqF}4;7&-sBY^=yTB49TAD_tZ>k}>DQ zV>>gIU*O2}D#&(t6h=MQq5&v$guGEs zT!Nm=0N1s>eZO>0fa{U&zTbNkTYg=$W>>~okQ|F*s zmjkwB&p*ju_*fgR4FZtZsA3;Qy#;(xhd-yNI)G8s#m#s;6jR73!}n9702%Z zFs-#(u!~mZU97ig#ll>PrlhuN-f*~|llKak4E*Ka;g}sP{WBt>y^Bi9@g?}o-CvA> z*ajI;ic#=Eczy#>GY2fappl_+gV7MBdwKx{+2W9lnD(m#?a`*Rmt$U_zlw<+n8!eX z$ltK8^PsNuEI9e#`>_m{01`Wv9Y5Ck_otv^vU=_RVUkqM`Gd^?v4zaeh`yWt7(4UB zsJ^ZaIolL;Spf5!r4g;Q(VDHH(OTkta?>WgYjQ5Oeg)A^JwvaAT&zZOzirQi((Q*H z?%>S2g(yph27*gxk0-WAdUgJ5qyacm1su5@gzOnIuR}O`dU5O?IvPIjb>{3ov#I(O zNY$CYtwUXRQz}MsYr!9Lkts@$Iw4UlEieh8#fJ(PSknVj?4cs|WpZf!Ts17t$;U#x zqw5ZE8T?ayjXmW4uZ?{s6uN}mm)Hmyp!H-MUs--g0z`}a=sMO*^b1$*8*6!KC<$92 zCU9{Z>S97P<~6q7+ys>r|Mmp7s`|^|Rc?R?Aj-v8A4pZ~}(EtCp4?+LMEG`39BL5@rwmszr#LiOtoNY~p`|Ny7 zu}QzopZ+(F2NE{)VdN)gli{AqY0CV5ZD57WzTo*tG=hdiEBcw@_tQTxtspLNDTCW& z6zwH5RQXB$Q6Iy=oZr*+<;xofS}v3Tj76v&R(tD~B^Xh<2HAjy?Wun$mzD-bioV!x zjg5}B@4W?pw`FN`=H1k}7Q`ZcKTPachx}%YbHSrlpydQJ#S@Ep$a}otJvVqf0ifo1idiW`?!)XWfrSentkZ7n+PimH8=a zRMW>9r%$j3mKkf_>v@CGvYw1}do#83A11e(KPo_XRzI@KNg?t!?a`pPn!y)RDTqF`0t)4_EKYmSAw0`i^V--s?7k&gZh4XM000 zh-K1Ox2-Q0=AnB$g3T6k-XGt&alAer?^k^HGugNHdsd4?0JW7OStoK?Ai;T{Fd&W_ zxq@BuW| zXuH>ECq$W_=$Y700&Eqc7|82MNBoO!-pNU#kQ2{7# z!^DekZ5Pj*t0X{oUI7aqC9DH3Mghd?8%cnPh+g}JH(q2`tE^06?9^=a3C?rXB7%8* z0E*=sEoY)@#IWodMGx^eiz5xMgCM=3F&oXCwR}BL<7HV-ob~c9G^lf707Bz9t91hd z7Y-*y1`6O=D${}Az)w)v`Q3qRO%+6<)Nxr}kGLjIo311dYs0e8`cL>ellG*VPd4hM z>u&qRhm?u>4vnGpi48MbO2^n+KV)_MnC0;m&<1UFB>!#nlsA`l<9Q%aKh@5BC9M4W z2qS0wj{w8MT14t+J#@=G(E0R)4`fWdY}w>D;9i3P1y9N1d%x=!s}C&p4Bu{a%W3V3 zNjs$W_T!wk74y3ygT;48VZUEzSMaE9m|jl|AtkpO_v3f35 zgxxXH;^dIbW>cW-!A#m?iEK?8B}h-+`U}0c8zhhC&xT#v9Ii6U7-2LP3_Pa_RK0-8 zFa-DivN-K`zz|bW@2uaisMI5yl4K3lNR~g^Ngft>gDK~w|7c1QXAPB-mhK_)@7$cKJ^93VoY7JMAd+#z`=no#4A~A8fdNvnMRo zdoEAdJ-w%Ew43&g(`R?9S|mwE0?{*t^S}mkdaN|CyAGK$C@FLPVQ`9%@c}8bJ&)Rw zWs#Ya9~;?4<|*>$Sr)_~1?7qVCUSPpdH!^2Pf(`=7y`@by8Zc!*_^RDAu0;^5OJbx z?7E38VyV9xhpxN^UU?}AA|0QXoOaGzuYwm`ECl^8!E-9iKU^&dn&4GWW(GdK!gS$~ zqZ3zh8qWjKYV2gJW7pkW8<3w@V;I!#;A{Cz7JBob#XPe(00jnI%0Z>{G)vA zT`pQoI2_;ZS@K6BlwOHDL=ZeudJ+~2el1aMG5F;5YA?Up_nnKK?IRMKF2DBZR_e7J zuB++ic|EifL+IYY!};rj4dG|)(%Mpz7=x>}y5KF>zMadc)oI&d`R$HS(;hF%cbkZD z+IJ})aj*35;P0-TdD!t)1{<0^z+r<+J2{W=CPD?a6oE7(&XoHl=7u!!UonS16^BEW zyq7lV;kC&Yb*XcaQu?}|Yk&DdB2GV)5#IMjGIVGReg8`SLj5c;B9AB$v9n-|)U+YY+@l8wF^r9+AN$U$q<;r^x9vjG?9tEftqzvlUoFt~Ka=Z(5YFd#olv&QACJdWOl^xO9EN7*WsmyFZGEkt zEED&QkEJ6~x3DGVq8F#Xa2;BWI2j__{>A|E$0;avb1vD88C+pOL6U+`-ReD*4d~4E z<>e!|g9Kp`{u`i^dLC?f<6D^%(8N_s-Ek7&6{5wUE-cENt7>V)$liOaaykB@>1a8n zes9DG?3TMwjd$uxu&+CcD)d?$w<)~q_T&3>t!IKTST~;@?O0+G-OrDf6^{EqqVo@D zUdcWnOD#$E+U@}FH^9P{?M>S=F>*Q%Vek{a$VlO$F~w{T?@ z=p!0SejG@Y&DHy86LN8FKEb#UmxD+>@oqK;VDA{EonDb7E&O)rI)Hl6NpiJ^Xj}_n!IxKhNE{iU0rr literal 0 HcmV?d00001 diff --git a/nezha-fronted/static/ueditor-1.4.3.3/dialogs/charts/images/charts5.png b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/emotion/emotion.js b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/emotion/emotion.js new file mode 100644 index 000000000..6e158a913 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/emotion/emotion.js @@ -0,0 +1,186 @@ +window.onload = function () { + editor.setOpt({ + emotionLocalization:false + }); + + emotion.SmileyPath = editor.options.emotionLocalization === true ? 'images/' : "http://img.baidu.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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/emotion/images/0.gif b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/emotion/images/bface.gif b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/emotion/images/cface.gif b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/emotion/images/fface.gif b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/emotion/images/jxface2.gif b/nezha-fronted/static/ueditor-1.4.3.3/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≶_= zo;hU?k%3kkNFX9 z!sAcn`@Ki$PK5#%18`SPj^N-+8AYJl5%96qVIkU)F>+_>3II#73FjZu@DI|6U#El_ z?T&fJou?;-u1gJIA?fIFyj38NnuRDUpr$zB^1&1Q&_}ShKQR4YMV|9F1GIFYHY{dD z7QjI3>%PJ%8 zvs7b~iEA5v`3%>&XDiC;<4~9PaOGpTtCHRZMa#7j$0_qzsh{D6tA8eVjY7-Of^%k6 zIcsg_56$kgKrwM-}*f zM{&x6PK^dS{?vHiVD|96q}M8e)lQj=5UdAV{x^w9-9_P&1ejN3@Er`xrccxKQg_!I>Yx;b5x1LA>SzXuEJezk zPCU0wi4ObCkmf9Xzi$o*RJ$^vVZ5R2`(^~ipXun|@7vJ6n+yDDM9#a&D!uE)v_uVA zuCP~JeScSCQ@$&;@sv)$xx*IC&x%=amd=}7K?qtDp;3CykA58!UO?(=eeRDAvOTfu zN%y9ts;9lMsf;yChu(K*eD7G*??1sgHP>B4cd(AFut?0`|K%nxEJO`-L1Kb4>;1d6Y%!lwKP*%L;Ozh-gZs-Mf8NC1R~^0jt}hl z&iXh5r{!0z)rD;g$vsAjlY|CmRW1oP@&!8^bqkaR)M=02x+4y}N?OFewC=H0AjI%1 zt0Nu@adfss<6}YuJf;7PdEhUEl~R9+fOdwg1RSM8nl?}T*cK~KGwY20&ykHsht>!t z=&YD^=LHQa)aif6G`OTrP{jW0%YP)dvNW-kCbW#Lcq?*p*mxsKC?DIR@Da}!6EY|u zck{Qvg#P3F$>8~d=c{rS>T`%^g6FWsw%EeGy%D=k9Y{y!QUoXtVQy3%&7=gJY+9?T(-IK)Am? zckZe}LXT?oN@t-$VL=db&+~fvj+xhq*B;O+E#A>jjarXe+j;2on9#Fgm|2t4e0|a* z$bI!*%!bPF`-z(hNM*C53_s^2SkmrcQv*v$<|~sf=V)_uk$b|Cntpf|e{}8B^Ah0EDn8yYwdQJt_`2GV?(|AW_T8O4ub&y@G!GNL(ay( zrp3$)s;PzR6KCGlwu~(*M!UImy@`t_w?pKcGS_o%kN`Em1J3-B1d7B2X=v?2taZ{u zi3*8ilw!9k!Y)Ap4MWL7?gd{&uO+?@muZ75{~3#M0wDkHQ{F8A&C7Y;ho{8CRlk0V z)0_i7FHaoX11EYSx0pbSLPO@N|2|x`vN0)f6}YFB{&m((#v8500xlNwD`r{Z?UbY5 zpXdtoa3TokZt8a^;~JHfTbJ_$bTV@8zk4A$R~wy>AWp z7-v7ckdWXCgOE`q8_a8g2yUW^ALtm=K-!vy=|aQ07x}lyCqjbw$2fbCMDQ`Q*_iT< zOQ-4sn>;TSfs9KHgwK{A7wOPNXopoVdeuJ>$np{tu<$ChtH)EgiqK?L<$ywr+aL?EmS%peMK%?mFC11Mo7@d@A}d!e|Dyyr%+4!MKx z{5K6Ub<6nu^hG0FTnn}FeEhJ*JzXbC`T#I3sTNo9{&KmNXPTbp1E{oFEI}wzBC3qn zx+0&hUG2L#oZxFY&Ric%#U15CmNgYdP&aBBn2G4xgK zQmdaz&pWjGmo7vS)0!>$dG90b#Z)XSPU+(!T5S_ywZ8vmgZz%{2eZmFv@yty5cA!* zbDg4LYkYm~$QR*J5r)FO#c{UZQJ42n&*0a@v`{M>KFnEQD*EyaQ#3Z%b-3kSnbxNkWXs>CZOoRolvc-BW-FJihXhjxA zdosLSuE7-w^C88hpo9{-z{B_)NE}o(u?p-GPv?M-J$i7~c1ZUQ-gNxc3ufTOr9Tlsu!Qv7kgi;-~>+sUdrSBp~ZW<;`QV39=AX zVnrBVZn?C!KhgyWVM$m671w?UxfO-YWtV#>K>R-i=H0*LQ*J{2l=^v&q;?uzc!aUh z)jWm{EejRl(bKqDlK6Q}BxSTRdJdwvA-@tD^rpG={66FsQJRR8*9z3UtrO6jRj%C> z2qE8aUcJtUbU9czyl07)^wNUhQ4%^gOo@=?y1=0^xH(z>L7X5u4!YUwcpI1CkAs-a zLLf}w-Jl@hpFu@&f?rv{AbiZv!#Gn;oG}_=Yqbhqiib+jZ(BSN2zvoJQHy?}ty9{s zV_B=74^LOHgYbMq@er|hTm)D2kI8pkEzVUv87DdqRu`x!3!@)exJDVb22hQ9_U-Re(Ba5CBcQF{`C0^Y)>RM8+kX*}lsc?Ux&zzkSNU29l zM|7~09;Oc9l{mG^D-6S3P@%83P{zs@3GGA{J- zfT;BMD=Ds0)mg%J;|=Z~?*Go?j}4~XFwjhcDpuPoE@2de{fs|9&q_0pLF)w^r?=7v z8lJ|x%T!4qDkY=_(Lxe>!=KS!HRn}Oia1d{3xJ}OT&|h~EXY+nfWks{;DhRLHwA9K z-2(1h3PsoA7AA%)9hz=LDO6h;OV)`i#S6}5V8S}iF*0;Q549oan1{8PuvrKu2otM= zlx{NB3Z!pYnmv*;%}G&zE-HUYEaRO{y%M|3*M;A^p8xCmL(Mu1rNhiJn&g`^Pf#l8 z&~+bijstor{)Dsxf2#PSH)}qEh%+9+cQ2e*iT|d9NxqThfT`1}|7a)tSm05*)^SPJ z)g5+ifxZQ7Ly?kcx_Cy7j~ZXEW}B{55b~J`%_)EAKA<0>Sl)@wYA)XYjFI1Ow|#N^ zNUS11L{|Q#&s#sWvNKJiE>8Hc5@~VDZST=`hNAW|IiOR~x6Bv1#)e7cf0N$W=;AADj5ml|Ib!Hbfpzlzra` z{GF+BZ1IALw(i)F?@O46NY9ktmfpYLI%{5Xj^+5&*A-68)L+L)#FR@i|Cy0MJ=S{@ zUpVhWTyePuYZnKio9s6l2a6K?S-@!-BNWWTXB=+#jg zio^?4;D>LEd|I)UJIf|2wl8}6ATGj?!Vy)V)v+c1RP+Sj<>%?apoedyQsiFrq5{l{ zs&;~|-D@hwfHiTECX*lZ-2~Q!I#mVNz_uS;_3NjJ%~}h7xRJD65qlZU07ZQfJ(=@W zl3?ZjOI7yA^fIbsJHQvqj19kYDQ7L=RXdJ5Sh_3yTJ4Q%+7ZnhG$spaY+NupTahZb zRF8{#qHdrP`(Z~ZXfecqJ(Ozb+xeNE!JVi-Q| z?VYmvdV;l!1@NK3_LHo9*?wjrGwZc}42~!;G1VY38F*HsUn^%}2}xWR?rh`Rh;?iJ=}qQ zX4Ce03kWW>Sk*;Oz{+mV)0dRsd!5*?;vC|Wgnz6pUzm_h8+`gRPV+U+4M3njz>%~W zR*8S&i%PXmUYcnn%B6rxqwk0euD@k_KSIkN^J)ob zA3SN|0vdZMjWI1heFj~!-RH4J_Y13L zkBZ?;uBw*@XDTDqAAn4~GYinXGp%QPUSIrpS5!jjH<~d@*9e8+sPwMWZ1FKFfI}VWb&|OIllL3Z%&O}2-<<>OU3~M7 zU6nm!X1O3NoQvqEkXcaaRy%`wS~$+!W(uE$N9}%k88o{1&n{y2*>J(YP@z{+*oDgF zk$0vko>TarL96c_akzwB;=_*MrKh(NgsnEY*?)3^L?98r*yic&k?YEDJAVWOxrsqu2+Wd&9Scz;vX@tQm{{~c#LGiSK7h6<0)4j`MUb&fp^FA zN=#&Y8_qdr{9D7+`rv;~&Qz+Hj9=9$m*E_=YbVAgz|(yTYm11r1M2`U^m%KTSbs}` zdR%Pa6RDIx&$HZ|u|21sxA_7Z_+9@hLm6?QNsiCe_=XxvPlWW)-OvsJLPl{1eHPy7 z+XjT$O?2?f)^dpvMz&(_pUqd5?b)^0@Rup`wa?r~5AXO~U!nr`E+4c!ZDal&HxtPi z-l&w`9`AUg6}JC5OLY5^#nU*X_2wzQ>-aN|V5$jTIM1Q+IDNA}uN%!FA`2JF6|`?m zz-f4*J}%EZ^rEUvFj}xPW6JK+TSKm+qneDMAl`oIq20Eb#_PM(`SKfOKbNmmreyKe z{bUYHkpj0U1-wSh+?boAhfm%pR>yJ<>}3p+VzQ*GYdrtcd;v`Q{BbPvYJ_l9ju+J4P{#rE1K&O}-w%xt);evGHQsPou>QdOXFo;WJ z`9*`-_`USpA%kX1~>bM&Z8D9KvHX zOB2@ZfCe)7MIDdU#23hP-Fb@enOOFI^DN4#I~Xa_OcnEDLfjZ}$Aa8#dAeQb$jJ8~ zhCv3uMa5wF=31Vk-7u8YaV4fgrl6=wPVPZ14~aYQie_xJf?&&4_55|*Gq&c(a{iKZy-;WZZ)r<4;ZKfDjbw()No>x zLRCN&69!Pl0$Z>Xr}@3aCp60t-@+5V{;hIwWCKEr1zHn`+%YEANODKUDHyTx9ZJ#g zm?6+wN#`aR4f(cWkFZd(0DL@nf1Ky^Z2YRuEzAensiG|8eXHFyA z9#LRt?1S!R)^pKfHV3Z5~5;vliPTyi1ObV)VAlPVdZvpu!4X(tiW zksg%q?wn3Q#*i5bO{k98t zjrohsLo+DCe%U8Yqj3~L21|GX+wP<1=V!hx`v9{Ubr2cLZLLP+zE6&}vrbuA(I1AY z9$K2NWV?#23SH8~gM>K1N9!&`xRJrIHnZIHn}c)UQ($=hxBChta1g@5~}y@ zn)tOfZeGv5q;|secF;OpPdA&~%|!D_G+1d~JC$?00m@fVgOZ9IcwOx&D?>zM_OPWPba$*(+*-ZfEC^3h#ysHCd3zjM(4lD zkJcVJSy$1JWILN5Xm1nsDhg5{?X)}i(boO?gL?@{RJF}mkmxZ@p$L44^BT7&5Dnsf zI%{EyFu$;|MG$J;{7-d1$93r(?w0W_3UZSGb@&ZD9G@Ed?8s4dqX-NEY7md?{xUN$ zR;G{_T^TB9Ro^>f2mQJ)gH#5y7dF>~@6Q}>kBL&r(?N&}xmHw@wp3n+&faJ0nzjNV zKwDs;baKSf6GFV-;(sU1A85>;-nJnZA;jeEdVV1StLFXG}!CnJN1QSw{Aa_0iGk;6q4EqZa_m`F-Nx+NP zQ3$;>#1P{c2_S7i{P~ORI}W>OM~PxF!qDB(b`%I6cFjT5I_>#w0iDtr~oa1BzfDr0vUkgj)N&K29>qQU_$XA;!{~;IDHa zUjUT6D|f*gbmg={L~gImTwk3-raIzLdJV`Umgnr=HbP5Nc(0Wv&~ zvK&%1&W74t`8DP*@Z=;((RXDqNJiPICgbdZO|h)uO$=pnQstAfa$215Mbe1CIs zGuOD95~a&08tPjEErX~se>YasCPK5NWRrmRljU<5cQUG!2WX%yQZ)!X`RLo7S1FUJ z+z($lv|DnIrW<7Fcz4C8w&bd`1|ER@@Q;>hAn@+P>EG}`&^Wq~=7ztsW!(CrP8m#A zPhD@@aDl{lkB3s)%BvhUg3bM6fqr(>7$fK>!%=lgS9k@?4>8q3YC{)7_0*&;B5W!L z6)aGA_O$x56?53MRE=YGSR~BtOlH>xVV>ml(%)$z+G#P>X)})cg7kF2@hLi2`hCtl zBm-KB&V7|nkVVvR0Nl9RKs>J+SQ-x`%~Dam_mH}vb1g)v+U(=4SpDmyi?fjI5t;qf z|BW17eim}4>apIYvPTWw%m{8r%i!$6)e)eW8tAavEge9HIz`D|u2BzRuHsFN072am zPCIcxr&a5i*d7;0I@XSQV@~Sg|KK3r6zJ9%L$Kaexn;ZE9B(x1Pm_!Brro^L@+Pm^ zmQ;t`t&b0sHy>^sbcX}+lqen{0!sZ!Cr3F62~Sq%L%SGDj4XRKx;iEpsd`66^Vo{rl{Vm zYT=AQEPlpOqYyR|*VQNvkI`76zueR`!rjo#snCi$=p~SJ*{!h#RnwU9m1H21Fo4(q zIWeIZn@xyGz>5ZQS91xb1{vCEQoCS$e_b{4W%Z8~r`L2RH&YL{3n$z?oK*0zknwxF zToCVg9{>Y~n@9Sa;5ugVfo$O55KLHgW5hc|%jo)_!&YGuS`2^r88Yowfg zf#QYYM#gaQqgxMZ2BqtupOvjIcmvgUvvrn0Zr*i|FHx=hLB74Djau;Sx(rU5o0Sfz z-Xq`Co*P6aLwk~|;a8N592)(N>kD&qf!Ih$HkJeXZ?(Dcp3VzKpNd zJCciWsE;UZ2z)P(bD|bJY;i}})cM(5L@mcoyCiTckeeR}_1gHl4}{J4pQ~$#fc($+ zP+HffxYcAFCKEIa=(JGf_6xUjQH^LP7?=VgFEQ7th8ir_%Ov@SF|WyWt&h5)r#%L; zhh7ivSUnPQ4HQtmVIf!Xdf*mlf;`#(O2e05$O%<$>B1TS&VB05U z)aF}Nm$`vJ=G11TvM)0OQlt8xb~}4g!vm0!P**LeoLC6Md`z2|O zGRvYD;*`-V_qU3WcjRj+#He?$*P zsNkv96&)E$boC=LN#gOlE7gsCAihn&hr3x}t6=HojA_Gcj#@jABxvfhy850!*T*i) zM^vG)mzJ=~r90Ws*{X0(ax9}4B<-DPF22b1J|o#1cwSs-h%Qe}mEw9$RrRLZ8PStP zyOIe|6YZ5clMF8-y-&4NX@`*#Xr?~$3B#S?~*ZRQvReyPK;K^Vu9Vrk88d@Uc1?Mz zPTXn@(}S@ZqjO>Qr3-yaHvvCU)8vyTNe)rh7;owtT4Z0U*bTZ?-rmXxR$}Hmd5Ajn ziZ?fv1{84v$N0H)IC|5)bSxFm@Rr5EF>Rf<80pgj?pBQpQQ8xU(|0 zK3cWSUpDzY(|0MhR8QN!v$lII?z&qjfn1$k(G+HFx!+enJVDZ~Ln;xz_a#r20Ijgx z?SBc@*jyB!1DW{N(QkG!p4RCFu5NU^Mt;(iT%~zB(&d|V_-2jW$Rp~J>*=v@joFRL zG=&>4>%+xub#kk9$PIRXK6t+VAHwAB#mIZt1-@USReNM%F33epho8pW5zJQSSF}E# z5>X=L>opKwb(6Amnk+7=zl+*6cyM|o%^iKp7SE6e5y}P#heoI-ku zNTQo3F`Sb!P9~!GfT4~IVBcENRq02ob3eshmg^CNy;s>pI}K5ByhgkiyP<5bO9P@H$N_Bhpb z{D_|d8xVm%dGbf10$%v_&od4a}x}$&0j>Q)!BY6e;ZQ{2!@>*Jn;1O4HM<8Zz1lwnzWe{y2U8c>I^`pE{ef`pS74(OCfCTw~0$Wg=wZb0?Fr zn-g<<%=kv@iJQtXG?rRH>-U?O8rh==?}76d8{##dLV;vLR8E_`^`2YPcX_`yOKw5n z`ro5Ue2`d#S^mViqKTbJ8TeHjUHc2G`{mnm3L^SCHnhS=bNPqGF z?tr~}q*H6|u2h_pmnAurRUHH&2d(EUSDdfU zo$cAg;qGI-uJN{zldRRvXFH!>F=$Py$@@J^7L&a9XVqD(XEqjCY=6D@{ncF3s)dg) zYM8?<`QP)7QA3~86Ca@5>kkU}f4?f_1q%L~%?J3l_l4e&6zJr`@gyJQN?MV&3iuSd zi|eZWzO}3-G4S4!wughRQ@og8tCpsqjph%~T+t*T?FU=&tyyA%dx5a-uX=iuc(@V( zS6r+@pmqPM9XG^m&K3zL_AXBwcAl1Pk>1-0sZIltn9k?}7vCt;$`gqHnqjBkt6iE< zQQd-&tv=N_-Pr-^`Y87DXr}XW#Fj8mZHRT7&C<4S{Kwdt*n#TuE4|N#zt1;H7=#PL4B( zTf}qb;q*dsd>VN~k#NKG5qTy|mw9K~>`n493&gXze!hzGfTHR9Q;{9{DhSzBhtj8a zI||e$mcC7fwN-(*aS7hWYkcOVK{7n|v8aQvrwz?y;fy z0aQq5UgY6CCfkY15*1e)69qnyoC+fyQl5sISi}(AVrWQ$^ ze?NYGy78)L^0V=h*?@UPMdYvW)At_gD^v`I7-v*0m2iKpgnk`1{<;*xr(g#8I>Tq? zzegAD2ni?M!JOQi)-h($xYTCy?+x(1Qo1U}lT3CQ<2w}HzbfpWPv%oFXMs3*%Tsr2 z?RC^V#Y{JArB0{3-7m$1O&-!+@u*|L@?XinkO`7gG!3 zIWt@BwBDU5KOG2>^&Zo_)bZ9X zrgB}?1q=Dvq2*-l?d`7?GM=@Tt6h)FbowWYPLAAAB>GJH%oTGONSP&w_NO93EVT#_ zvM6h5KNTor2bkEke3-DsZ*=5J1g3m6?5>wAke}jvbICzRRLn73ITG1K_W$&Uton^W z6b`!t6p19}#aKl1L^LlLe~yEJ1+P?3psjq+nYmHFYQ>(CN6&hDJiIsvh{BOQAIu&J z5&`bqRBkFTbd9FNJye6M$OLZYbk~K|YhygDwWAYtPTj0&NQ`9AtRVJ*XtPISWbQq^SD8SMe%{B%ZrpYmu(T^t7qOe%?Bx=4>WwN`GW51s7Y~;(B%6&150V)*%ZAhl4r|6{X?M`Zf zHA0e{dumN)|uS3ONg9%A(Sj$dD&APCQ$=u|JpA^pfz>l#UHB%pOq=MjNh zNVD}N{xjN+s(p0mlo9ahbmi4{n6NKCvo-W=Nf<p3uUiae7X7eXdpGY;Dyh~R*5riD5`D+f(Bbh+(HFzo); z&1y9g{S_3XvMOEO@-C;t{>vrD)Fq3BI0k<=2z1{uQ>`W!fx65@S^T7G+pmgOu!U>5 z2F4xgimHEPi#2YvSZVE_A6rjYaV7JtGy>tvxs#RFBuqt{2A>fpviBAmjgo-haLNJx? zA>oGqtyP`~o*;1Bb}?D@ReVVh}CXU6~B4`S!9|R)p3Nw6tIx90FRLq=H{45Jep;@*L3y2~( zmGVK$VVTi2pC@vhRo1;gADaagLQf-tmxq+Qhs+OnlwyJYu-hPBh0tHO^jA4gBywH| zAB^3L91@!yk`2oPT@Sm;L|p!xBP~iv?5+_X6F8Ij5!AY*j(ediS8PiTR8>N>gywZH z!)XwQhpTRFQ6Q1%l7bHkXM{0R^GN(Zx?d}91hUo)K@}8YzP@5$dxvApP%Q+^!1j$l zMD}OX41R=#>L0l~F`phou$NFZ0SKD9ZY}042|YjgSU2#&YH*M)RlJRVG87~s82>NFt$7%R=7lpR}MX+UQxw;`*Jt zZ2h}H{mceV4M^lJF>Din-ePMfv0g>81pt=ZYQvw&Gs?RzMqyI6vux5FNLrn0JWDw+ zy;G_@L=ls}u@=TXNN{>9C!!Rb3320L`ZSxm@~m*OSD>PpvQfXpJKopB0oFP_!pTHDqf0U`hBd`}yUl3cUYi5=0|CoV4wC=J>AKFcd|`&%R} zdr2VfwB!A09+cCw76k&C*z9zgHh1=gcw`n*?GAhzw3-W%9t2CXKn_K4Tt$GX(vnf* zYveAm&X;c$)Xp_+0S~3~k=eRRw+u~3ksF-0v5L=pyHq~N7qui7hGhX?VhgDa>k3|3 z++9_k9a0{ABHRm*PGDg|!O|5JNx+u~7vdKM)|!pG&k_-I_k(g3NqfE=p1PpM{Gw*% zd7wa1-^_pGu=zIJb+~U>ZI}Jd;#}Mo0Tk)=aN9j>iGBILQi?0};PQgdQTw6H3o{A9 z`^gOH(tB!X3xzjz*icIlX;}AYeoHy3Q<)ZqK;T5976(fg$tz0YsC)%NgA*kz-y5Ce zl>endR=iYwlhUe8lU`a|=k@kk(X^c}8;?>(K42mr<57NN#=55>C1AGx)YJ1Iel(SD zQ-*(j2)|2IFU*Jk0U{^_RBF1g~CTNte># zgn|eYq80hEbRRx8NQIUT@j>_^cGB= zKY(I#k;8^5bsD|XF-wm_jq8~2vtO^pn}uYa+3Pal8#V`b8^xc;pbr$Kbu9+EZ0Co} zFbOwJ4ooA)gkk}Jaaq6!#rjkNDy!SBK-a#!+y0hr_z??lx9|59#48b}ymC5Pf*>?N zMKufy>U=ZIvVo6Nj$`9&H^IEC|4WJ>9mfBMYKGdg9cLMsTnGpp6VjE1qXBReAU}gB zsvCkKg{T`Gx)p%Kb!E-JT6{@l0VP-%6HAeOHogJOOF0bNrG`&*q4UdcR!}@|5DpJ0 zsBuad%K|e!gclqR%-TO}*7216tg~quHf@2Krkxncu>C!Zmta}&_1X^7 zssHO5=@J|_c&EAora_nXh9% zzuph$cRt+nJNG=#eV!w(j*bvEsw!+?=PC4$*=)4G!q$fkEx-t`XW~= z&=J}IR?pcPb7Ar}%|xrgvK^B^Hd=0!6tFDu9>&v{|EeQ>-~ybWxuLVOOFuYEGhh60 zs0*Ly3*G?+cRt!;8AJ#S_bMGte-C0;13E4^7$rPv_a44|*nNz&A?T<@pQnCb>NX=0 zL_9LQDlR=xGyXD1g>w)5iZd=qFh^IUBT1dvu_o$GT`gVTL^8Y0Hq%UO`8khB)ibH*N-535hh@5l zz&5b6(WzuKp7=A$X<*thN+m+5=M(xh9uV;N zNZdY08Yqq6^6Ckjl9mQx48L_zKhp_C!dicEOVs57|A1O-$MW)ZINBSQBVjkW*rEAq zu{mNyi5pPwA8&eT7+7M4jwe0=Be%zN>p!Rby>{<-nAe^7O*=sc+9BPHe~4y!>)^Y; z@EyOP2p_KTx@SthFKQJ!yu!5aolp4nh|eP|ulvxk_pMk4HQ>(WuVJgY`_gsS1E!Bv zy%qV6zw&(qL`VIS&g2dFqjKuM3FEGl|$by=|%{{P4A_s=NIuR ze3u?Q?~i?EVspUT5q=Tzx=Co+VDgKo%->5_$#H?0{?;e8+32oT+8hfh-QK$dcTC-9 zqtK2F2W8_#uEt8dBgeL>*CUUsM9Gdu!qXl1nNo$2?SOJ$6FbzQ%rlzuH+6I^n`-SC z&L(Gx7)@LS^YkiIWq5VZ*oF~ zMIWCV5GSxeSaM)WL+KllR5}kF^SCIWLNaUeCRbg=z} z=ei;NJC~^z^(6n|yPS+EHLrNXn4h<N45xgrzu;E>BeP0YXtz@552ADYoTf(x;~ zJR{Sm-k2DGt`3{I5jxEtI8mU{^(iO7M|VtlECX3)TkLGJ-d}A9MSrTfxLEb6_VQoR zu*EDAPpD`xfR^>0#2Mzfki5@Z7*vuz=O;>DDF6^0n1+J8T|vL<{An23jIIIYOPfth z7*B^L!sqHS>A8~8Ot~+D6OOM^DkF!C6MA3QdDP-=IqD{`qlMOq+RRKTiG<(Tl3{8g zawCC>V|BbFpI|H@zHKevT0Ie*>C3x8=X5(ZW%+TbuLFe$i5t36CW;)-5h= zD#ywC=-tCZ!hM8}3dF}=rRw$*CR(Yc1XV^K45>Cy-dj2YMWjn+z z3R*S;D9tZYcp|)V%-!vt>=oX1V)@Gc$TM)s*D8gJ7;M^Syj!mCuSV`@cFt(ATUlUD zSjYg2;FzbEH+#w|70z#=svJ|Ori=zS*}d1rEK?y}1?ZO!NZ&vfr8kibCP#}%o0eCI zFw$({ljGfE(=tZz?wFK-P-0R-?7d{C)sGX`dF*EZAoA4TN3=j zr>B*Q%?l7%78xDUN1jDU^1*XQElSMEA(Vj`RJmcFmxway7O6xL& zM|l9Vp`s8wio!a?r~9+$0?mgEbE8ut71AVzzWwoFuY)wq+lYeLTn3ZBKLK+QnGQB( zTlymG3V$=53NGm)6vKP3l`<@pIXWXb9yF{^>yRf#+gx}$n!jpvLMj1Ubb^L23Nnp# z(%7}XBC_w8#{m{eu+h&W+)AP{v{ddP)+}QzODLz9@Qy?f)&QS(@${I5zQrtmS5gfg z1E|~Gkb#?UXo`ueqLKZf{BB7?vU2G{aQzD}HrY6v%+1Z)-OkDi6dyE;U`QB%51tT!c@pf}6G}EgQNo)uRr;AQKtM zNBcm(_$i2V91hl}{nD5=>4v7Y(0S}@tYoKO-<;@&c#}u`q(LPaGn7_7&&@#5d7tNg zw$iP#)d>y(JvWjNwpo6 zxcxQcK$b>WIF_o|lO2KR|3re%L1aV{x;$l;G#w{_vXk!CQtOOnlb+lsJw2*!^}%b? z(NiK}!;omf6;0kH>Q(D9x$Z<*(z(W_-cvG?9d^&Nm)xHGT-;GNAM(F(@SNhi#TK=q zzt9{z#B-ffu(q2KT%#si(f(c}+x^9Ij1A}l=ib_Ba@&t;PMdf7apN^%_brVS*RFPV zIop{c!G8!1Iv)q=SJ-b~Xub(AT0H_eBGJf$CGAk9;^=i&1`PL`9&TAH`@x{jGe-dI z{-QVNC%m8gfj6s4{e6ho0a@gj-UJpf2uRTRV!nQ0TbxI{EyK9IT`BAulGiE>__@Jv zpw=I9^yG?W*x%=;5yXj(Q%Tsq+r_d!YV6IlL@_UKPitky+_e_lxpHL^eqGn1&0;6r zMvz%(9T#|4kPrF>;G$;m=QqTKYLs);^T$o!58-u>gD%tQeuw+!GDJZsh(EmHLwA6GB3 z^Fd1yWZ0;h?tmzr1DL13hD84wXaFU_^);4C9u01Y2KMjsFKTlo#hWPn=pVlxzywN+ zO(^xtyoI^BV|Zukxu5Tj`ZQR7N`k z*lEr={P$LG;YH@I5|{kraEfDqV(`WK3v0`~U?({2?O2IFpI>r@ohbP&q#AMf2QGA8 zFU*m%>KHVr_a)g$6t$Z`Tz^U_ute6d$i_;fJxo1tnStEMQpN7{UIg zW2t&PZ|TYV$+w%rNq1kI`jGto+3AK+4KqI z<)BQ&u;16HZui{Vf0&846DtJ?>b^S_ZAZ)h7cS6b0Ydd!s-`in5x-)nSMo zf_DiHAYF&#KSz+kj!LoeYwCbaR0suJ&4|R^zE*n^oY${VtTK!1KYkd_{G+HSxH(A0 zXO}Fjx4VHh5CrYsaE3^eLIyK^I!XpJpmh7o$v&bXAOL$4=&28f^AZq}A>fq$^^8EQ zoo)O-?*=dEPf5>E|l_qXw+E2*dyaat{5nY;`QuXgCTa(*hPGWaaW^ zaQXY+P+{&MJ~U`!j7OHxbONL#C=}vU*}qxZFs|>Y?Blpzd)p!E!l#`2lH16t6jkoQ z)!>4*3wXA=5gi$}a)ps8baW-S9pJuq*XCuvaKh@RK}g1)oMjCwv7NC+W2EEV5Vu#3 zdISsM$E0hB@kCZ>S0MFepa_j1;YSv7Vo4I~;X>?!EIO1(u+sqx4-h1F*`hbiRjhA_ z?O7l!3O)Li73R_a7|l{4HhO)MM`lTfo{m_g2zjHjF<4om`S&HfrbK7JuDbnx+C^TX z`juv^kWF7oPf!X@)`gzt-y2fbaP~b(`JJfqF=E6 z6*w#p_=^tTdkzQP`rOZg9o9vGaqGo@S?I8dRnWP|$#gMef;^2ZDGpNWdnp|p8y^B6 zw>TF^d*c$m64Z(TWD#&C^nU<_12vAT`3=7iGY#*&IYBblmI3s=5!p4D&NFvpz7gpY zKtMr0k2x`$6k!lfBn^ngu$|a?fF%Jeh;hPkfXn)8{DOz`r#R>0P7m;Jitf_`gw!7wFHx6)X$2C6#^}fW+uXm(0D@n> z<|`^8nWVr=h#N*4{McvKUn+;R45PD_qLl^O5bjRgV_mU}IN8-U;+i}6Y`+FDN zAMLu0lZ7X?0gf!Y3>mLGW$yV*qI-jrV7V|P4gHs;YS|{RD|005ZSduO4=_VSq6>Vp z-j1qgXKbs#Ss!RyE|&-}h4c$vd>583fN@k(Ds~qdJ-$r%6qc_)wOFFmlKn*)Bv=-s z;$0qV!{d~omkR)-owAP(XMz_gDw^SDAu9GSIxKHB9sd6JD@J>9krNKx{%ShRb&X8r z+;=#1K6m27_=V#^T6??WgEYRcGKy$Vk9(leU`0~HBxyV_Lc2dm{ngYv>v192OZ)@> zG(mt1_4Bs6&(*haC*J?CvF~^~@G}{AK<*as_<}CK_bcxOPcZA^-2thKdovN}Uwp`D>o4M4b4l5ago-mx{v3Ai|`8?f)BvdBE)R=-ku zn|oir6GjCbWLl4)hK-t$c!$w2@GdTB5YN0d$kb}>7D647R7Rfl!>N>lbr1~5CSA)SAZ`d;*Acrea>} zzjnmFY8G>l*_}|=xt#81`JR`Tm?NyH86Mz)pYnXortN7Tm9o}qc2t8z2DH;v|5J#4 zA2&{T8~a}e(hdE&C&ul`CaFwB-sq@LO26DM5v7%Vy_ALuI`V0nAkJIhqPTC~l2Ebt zAX2ufSWOhRWFf3a$Ea47cn?a&QIInXDLVpKk6v;z5o=49=u86QI-*#0rIkl zkSH8iDM5HWsp7aOaIdPuLlmg^3$|`3Hh~l4?W+w+ZZV`tI{N`PnSu}_O(LKfOGJ73 zw&Yez<`{|1Ft}%MVxq;6<8C6?`hv*e?7G04s=GQ?Mqc{ zcQsFCU(;O%wu#*=H!I~hkLsgHR+9M&#Y&6%YRdqy8rHp6RW-BbVsVdJ-um5*^b;;+ zp=NNDM5AJG@@#*7>lC?`f4=*gSeM-FT~{ly8N&4k2M@~#NDPC|S(I-{pWl>KRpN*A zAb?BhJTBGM3PfvDV(XEIx4o-+Tzx@!3Xg$|1f>7wk*cZzCbB$|ZUzMYJy~**Qmyj1 zqJiD!{SYI?s*9eLsw6j6(Q6f0a67`_Vg9u$Z6^0q2KTA@CR;#KJMM9QRUcXwUPHg* zO1pOA7cG9_`4x!~>Zy^;nvvXvk*gA;C8tI!em{vJLL4aFql_DEhJ9sZJ{uxL3NUV4 zQ#~M48d;4T!J!C`TYt<~4zM3|R@Z7=x~C%Z{IVf`4B$@a9Cr*ITItvFVxiLW+RJ+f zU9;807X#YfRzIvTYWX2iv0B4@-$-l(cQ;aO%JmoA<59;^zZUz0u8Zs!Cz6ERWF%r3 z+_&ihFd`ZT5O%&U#$i1?zE+A(6YL@a_<+KWmjU6D!ZGGjdjNqH0L@m^50jOa~lm!mR zN1W1F7=T{qe)-`;H~CIvbyX}G8AA|+uoopMnwObofI0<3vGvRI0l)5FCkn0` zI^`q_`VpUBCxCbZh2H!c|06Sf`8N&scjP#E)Od0E@~q%CPV*)X9g^~VhYnSyqm*&0 z7m}>;J*b=XVAEq!XLJD~oqL2JEs_iwAfnkuO@DN2YsRq36#zfQfxJ3|!LxlI%lg_bNjI5SSBOjsHqZrRO^apE-Rkap z71XyDU3Xzq1`fNjZrO04E5pB5GwFS;&HZpGmR$cMB|)iQO7qfP?4w$hhXa3rTLWwq zK-RAf8!};)8v=WYpiRZlxIT^54Q30dl*$-A+&Oh|lAGV3ufOef;_8Ye(pO&R&D)0b;u^$@ncV%7h9@NaraiII%0e0` z6)U7y3C^&(w^s}#^!CE+@w!b~bG)|5UwUS3pbx#FrIf03sq?7QuUR=$*?(fTiU ziiaHEIe7GIK4;Y}IaKX#o!tu5@s(duRu1SI({Yat9(7YazNGFGo5inY6fUY4CcobI z#AW-#jO$m?;2rHPMEv9N)4y2qnK7BUGDRBgeEe^->&u8J9)E?|53`Rh9rBt!-rrgo zzh-u|Hbp=uxZzaNl~uz;g@_pmtC6Z5f{y9R&LV|hspgF^&p)k7hK*3L9gYc~y!;NN zq#T0oYPib=Q#0S; zTf@S{y1wSwnDx|$Q0EQ4C5z0<<1&4!O!|1ND}MCNb$H~diepEe1Uj>1tCN-9oP9Xm zpqUumcPr13cMT%$`D;KW`KN1^H428&-=?nBEZeHfT8hiRy_QIQ#_d z{PV6b>l)BfvD8PDw~wz9+>cqSe2q}RHJ8sJ3a>I~d`D^Sbxy+GyA;D`WX6BHxZm63 zJhE=GR1=-w+sBT+d6tg1c6Heq|Nh2B?#~ZPz2X^+PRhq8+;4W;e^`~c1VInqumYea zfWj+Y`~HU<&a)qP(C8APuk`^2Y9en=zCa*?6h_Qq5u7WDtvFB#KD*1qh4M^|4QgW> z|9HYgd9~67V_1YTy?#_};i6LFb7SBVQ^Jx1`_cNG$;%tU_wy0~`C{wYQ5GkQE12jX zUkK)!cA&`l$O2xldE}!Cxv2qg&>hxQAs;p(pFq`|BpUFz4e)2TY zJL-|V8pIu!$Z7(t;MOVISP$-hLUM@n2!|rES(NsM#;?|M+5b1)q4Aj zRt+Q=RO#Oas)75gUCgVOn%e)ib740v6TZ%7i6f$TojU$=yW8}AT+-n|XA4FTCc z{iBmJg`Z2`{LAdfufh^}rZioB-BJfgb#+(~k%5kN*&X&dohV)v@rYjWUC|#q-a~Fu zdpM{+x?8Ba?%{i(!NEEJFm{4Ts5?1+&icFTcu?F9U&F(GWnI}sp6?HJ-pBLjkxNEdFwv4ZXod)0$9KDA5_B`O{w{6Y~0%q zUgH2fef9Od>1f3>T=O%->ad>XNRfUFcsq_L{HQfDQrCXof1lWU?<+a+6qXvd+0Pq4 z6KNDkT(~?P-#b9ijLh7+?&vrv&AdlNZ%&>(T-B*~ILWq>++$Hzcpre@1a1c-l#keATQOQ+ErU5q44M2OFXgHcw&C)!%Q%zf~{4 zi19ah&-)h_6@%pC@h1k}TZ(bxPBv!yn;eBH6br|R?FgpO>XACNom$+1_EYmigeFArS^4k3y04+LYMLt z*nX1S2tnBcfh^VFNq3)+EwH!A1)WRST2bXr5gToD&@28>{}652jNS}O?VK3VO~RWx zN2oz))9cU;d*N2DR=k2fp%ib|b9@WygWVyF2GpJ+zc=_f|Wj$qj> z*?~lbY2f#?zIwI+H+9gJKGt@A9;-oxyrUZKg?&yeB~!cq8jIT2D7YTDy%oM$2-XSy z_r|sFi4W%DkhvtzZd;u&6{`Mc8O8j#%w9=ArPeMuSxH3T++U`hyY}1q#TmCCFuy}R zx=)Tn)&jl+>$d?ip7zN?$C-;(V^BlbQefT1q;j0>Zx5e5e@ zKUG5HYhR6HtL1ajgPSmdtGJhklhNsNbPo+$9>M%^OuAyOd$Z6rb7a44aYs}M70~PTX5R>TSgoH= zCvS;g*oI5k+dAWVB@-##aUu{Fgcf!D%fFt;2tsM+WSS6!r4tK|v2@a0^Tvy7#i1Kh zlmge=H^l1_8OkG*S-9s)vfdb5-WFnpYutb@f3%f6w|35T6FTAs za0yfG9Q8ptu~=mqw<#O#?RdyvH$paZz@r352*MlEl>GHhFFj2oF%>y-S>6RP3Ah4mr8HuAL^%KwM-bL25~Yn=c#h@Y z2dqybL;XMNNZck4(9PoTW9V*z{)UnS!{$0P!86K5_d&4vm_^jRZh#w zs`Ou&-4ZA$M5vfGNTH%UV_US8fbnisypP};jWxKFg}K{<$GI9^gXtL#i?_S*=C*QW#0rdd z$6qK0d*d%wGB9!^jd{d*?w|aI9AM%a+Icd3(nkVaFZ8bsgQq|eau>v~%7Xe*!Sx9P zX}Vbzk_WOT0mVW=-cqzr=#xy|*>%b9I{NZ^vYU39Sd}7v`y#<}MH-Fv*Z9w`nisH{ z&VM;Yca>$2G5L}@obo_LaW=SM7pMS6#zr5fVkn}Tz`sEPsT2ao=_>c8I^ zaJBHM?_iQipbd_kBOTS@R$24U24SkiEL!438^2Gdz!a`@j9fJ@aON+)e1onKC#$l7 z0Y;Fj;wvRTc$EiMnv@iRyC)IoDG(oA@>o4rFdn&xtJ&mWE?|Wgwe9y97KxK^g=I+c zlH{6~eIgMJ0%2>-O>MmGHRzh$)BMRlaKWE2r-qD7i>jzt?OUAd?}KX%z3sbM2yP3- z_L$mom|mG)JZVImx2aNCrHG9`Ww!+O1kp_abm##F=5VM83#XqCMT5y)SU;X#lGuMg z0lqkjE*_lTQ7?u<&HwWUFapzwDgqR)OC4~f9Ijs#S8#|lP%ALKgGbk)5qI-MN({7( zfEBRRHg*9S1DcG<$VyyOTL-uh-&DyW=@vqDIRM=bKkl<=iH#-~KOr{Z{9{*;1BX`< zAbK`BZkCx5jI|s}()u4kSJ1naTbr%dHr3?*Je?2iC(>3|5Esu`l!^Bi@i=X=IY$F;EOt#fX=;@ zIxVhlZMAOQ2-X-ufnj3=c;>~8 z`!Tt8${IxeG?=6rF*LtZC8Ch;m8|R?H@;i4ag|;2ytRknw1Bsr-nzN!#`z$y;rBUYUhgyEYGpz^2XXWC1X9IOV?VS z6M1Y&hsX+-G1YpHW0O#SIy#TwGpp@TI|)80ME}BoA94c#q?1>UYE`&Q065$lg>Y@s zggin#cOUr1q%u2c;Sx$JC;fQBD|RA29%JHz1%Nfk&tj*tvwF+CvJdt zA)2&2Y+rb55eR3iyMGXqGg%$uFGAOHxU~Urdq%cJnq;lfWSH*1TE)nOD9FQd-TxDp z>BLU&feSFM2{q{45nj2DEUN~^f=<6iE8u8jw@ipkb%=DzCLhi-=XYT6yD;f!BhfSB zp{*s)MBjm~^=k=Rw~SoI)bETZ#0 z@c>%NPzvDyDSxbjwkB0}(D`3yuJX(lY0Q>5&6Y*ZR^-oC-I=}iV)pvi**c!NdX2e8 zr@8z;U{e72+Xm$0S#(n*8ad5#+nw^;taegDQDZgA5ys zL`;6Aq9$dlBGIupo@oX|6~nWB`NOm8K|~6Q zpcPY>kd;d)e9|;&wiFMoBO+h&te~EC68T zMIsofV(q>z?Mv3RG!zR0(&S0ULrXFNF3u~bPeamiJeB0xN;&}O11WhAbH`Iu+X1mp z*HD0^%1HDy=94-imCJ6O%LlSP$zHxQyGKO&FRn`Rel9$Xh$Jjl>ACD51h}n|A0tBa?K*o;ITRBe%SQnAFl!69Qoxz!Iy{aUmm^u^5ol> zXS|!t)Gu5=X8saEZLB%Ci{OcRmw%o;fAMn@k;ozp^2%A{Q8KI@H;13($-t~Ao5H^@ z%`WM{RT+? zo&pwbxUQ4}zNVi3I88+Mi12)h`hFq`$-Bs&(`2oE;9#yUS}gh=USH=rGm9sI7p2fV zSHLQD+tV22X2GZ0r^~NG5nZS4O0K2et^KSq^QlaO=TM2~_$W-WfLAkW_Lv!ztHoZy z2z!*gUP_vso`glxJ-vy*S|V`A4jVx}T(|lcw*Y{uJK=Q!$gx3Y6>OD#MU^tvRHLD_ zWU);_InZe>F=e$VkA)YA2-BOP8appSg=XOMeuFU(Hrd^4Lc0@BzWe&vvfm zBhRAQo?lRohwOU)Uz?%GA79Dk4A{NDv(gqwJpmUrD8LFPjQ4g36@IuP4T7G zd0x@{BhaHV*m}6>s@n4=+!2B@HH=h!ar%8$`w1koZER0k0V-3`@Si|p zDK}UA^_y?Sr)qni%7mtNb&T}SwnV;D^qT1H47wnsu9upXwDev-%r@Eby^EOl6u-Y~ z7wsjn)1x0e|&-sY;UMeKUJsfx<(%u3Fuzplq$Y97xW~YxIY#q_eRI-Y?dTqMC-?(ZUN+RxR^tBL5qM50bsBS=v!!rb zUwMj)|6CWx8tF##k`1zy;wa==*qBqZ)KRs{)+qo0piZ6m(jq%i-Q0*PC5y3w(tG+f zhex~%XY_?fpYbUeppQ$Y#w|uCJ+4=-M{VBj9=82@Z!4QNadRFI`Eu{seP;2aXHlww zB{h{OO8ve2kd{OE!XmM>h4FQ4)ncv}UU=uSHcAt!3WGq73S>dn>5^SrcX}N>82Ohr zxBqJz`YraMv*@%|Q|tu(;gt5grD{V~i&&t9uFugDx2>nOAl?!?M{$K;Yz=#VTcxFP zjh`**^-T%v!4FPiixb25FMWRoH%r-iu4LACbk+0aYSaQ_ux_uYJCo;l6lp0V%F*+E zS$dPXwCT@hU$5&e5N^-U48Xs)e!Q;E&VY9eAS;RGPyM4(9=-hrta|?}SZFC@p}A0_vICOqx6Y-f*Dows^Ka<~K7-dr z!OgIA7?FB7BFhJo&9dBtHS{$+i*jic&j$>0HB*L8Bo5?SN(5pf`(a022J#5iudjX! zun8webF04|=UE^^jT)wGKlreYEg*&l5hM!OgC%`J*$UrRf0fJJQdaPxowa_Tgk_Ia zp!^S{x5snoC61@U2daIvNeuV29k)2Z-JTFIjjVpWqHye-D< zaI@&R@4}T25WA=lUc?->#&YBTJmejV1Dbo_Fp4920xn&J;rQ_4p$TA! zC`Xt-wUR>CZsx)KnYRw{%2UTQ;hriFBTgB$tl7&eu(qsWe#I2jOQvai$;pa2B2?c7 zq*6{?_GlU$yEZeH=hcfS<%ADUhc(~ECY98+;LB+HLE^1qRi!$bZA@ec$_`sQAVpwDI~fsd?kj=fq> zS?NLsbC6*sp!we_Q#XBdBJ^9%u@!M{S`M&VAkDJw6kv zUX>s5d`6{j3RvA6X5)GW_0_1yq~ICfFVuxgkBnt=6{iP}@SI-r6mUd;>FH}8EX=(3 zacKqCH>P?w-t$Sg*MqsYcWblIV;r=vQYhS%k-1k;p0jLVj}vK!1@CnDrKIq;-B1ATfEFqAa|Ogo#hM64kMaK8p>y~$^jY|p~C z|7d0Wpm(I%$q^kUff>vXWpV=sqhg{XJTrwk9(iBxq`UNANt!C-SM!0Z%M9^I98p$! z;|xSrXb%WJ<~!Gec1x+s<|A%KLDkqw!Y>4F)=Xze_RK4$SscDSu^^}Vg7k8=EC=HG zSN`T$e^o_5RoZjiA=nK-McdKp{=v-C3qf^Ou920AT|GympAsYutSW}@PFkodIkF%0 zwXWSB1z18rKWEMha|G-Emu{!W<}7gkLZ`rcpfn>Pxxatkkr5w;hL zwVvD3c7Aq1_o>M~r>W0b>N`svhDcsu=!g=1c+eh#fx zO27tX#}<70`+UfhQW5OG`RxBTl<62D=)PG=t63$X1k{7^*UnQZ$;t^*p8z4jJMefC zVkI^`3X^N5+pWBmi?!5O@+q~@)q@h@SCj=-auGtCCGULs<2nkihCjJN%ALm|kN48u zyUL!GWPQ}m7ZfNxip-y1C%h(s9a!a21o)3@!b+rmB2p+2Xc0WFw8*-l*7Hbn*TP$u zp3sqhjDNuGHT*J%ywOphYoa;D0sIi7eD45$>!1nYc=cQPvj*;7^%2$d$osP|EdF2C z%(;Pjz#w50SyBCT&a@@EOB%sAfhbwo>J!p4b(pxlphpAdFmAA94u8 zkDLwQk_td>F7pcFIvN8|amrRhh}((8qQvz=C9bX)qWs7RF5o6iar_zX7WTANCZq}R zAgd&*;}-rLcz4Gz`*ZhqAN8hQREtP zfcMUpy7|3XWrKwB=(aq45zR+oRPjkE;XxjgHl?Tl zA-65-`;$EKzjDMm16nJiwY#HrhgJojiiGx&NvUUOx~bXA0b10R}?O)D#% zQ)&JOmzWF|b!lUB$8022ljp~{Zrj^kdw%zJX9ZqYI1epYuU(EhUSv=>%q~jnebVTv zcK@Kh28%>lVvW0je1Hi?%2VTqf;TFQAAZgNvI~F#)F?d7Fbp^(K>?nloM;_wsH9f$ zm;NDSxg-fFJ$7ttwG?5{qPLDii0v1O>bhG;2dm|bR3*6L5NaIRqrIx}eH4ohh*1|P zUr$eKI|CSFVoeb~>8n>%S+8;K*mw?;ud2s6Tjltqxy_^8c>x}YC5@%zniF7?r#^;h z618?D`)g#1-{&XNhFoihbM^}(O8@)#;u8PPk-QT1q0SX}w}+aKMg1;mU^- zMLH0^eHlUbW0mA8xC@|}2F$WV2o|cI=^d;Ho2uBB@Ft-48eOZ|$~SJ(pQu}1B4qus zbSo#S{otEc_d%`m=d|`xR5;p}m1%ZiGI}Fzh9W?X7ocF3{Gd&g!@7%`U6uvoAGMVg zC<8jffc!n5lf8>NwOM#enFee_XQGbu6f#8or;r2cD{q=x0PR5E=xX;YOi9`| zWgY#I{Z&qH`jBGNcrx#u@AI#h?pTmK7}vn_qR9D9NHn8lBgJLlmf*=wuJj_O5;QtHVpF3<9hHp+6fUtp0X$SI{iNhOuTm1W7qPSw_bNKy)oM+mrjZ)k=|c4 ze0#-CD1N`0#CJ745WK}vjCLru)iu5#s}vJX6C(4Z4S6&9GsQ{F?TPm>vL-WOz@#!C zny1}Ed7pl96Po1P3rjOLiP*Rqmq6bc=6TxpLrG^hrDJ%Pm4(H`7m)$ZXzxZQZQdgNh7hD3kM|%jmZLEfAxucgo>QviIdp+14 zA@Rso&Kcs8TT{YSC~-V~we+n$^O28Le6cgMRiRV7b}R0f$*(&XXK(mD%yn8Y879D^ z?H-@l>Y?RaTNIz`yjANqZlPhNeD>_ZrUk{Bd`iHjz?;0_-Lc?Jhc8X0nY)0GtkcZH z3@^<9H3}D4S?S)ybdWMRbv@Huneyyynm3@}^}PiTW#AEf#w!hA+DX6>Oop=ySYr}2 zk(HjDnEw7=rVsg404C$@5bXbS7a(n|Im?FwlFlV#?AR`x8 z@F51Qot2*D0>c47VsvT==TzDyXb9lrX~r1@1E%c*u;YAmR0at6oKbCszzV@JBBygW zAB-`S?}8ss69F-;@L)0x-NDk@2WamvT%m)(r-2E|AF|gW5n15hLmv%rnZ^dd;0_j= z0Mp1ye=V3{?n4dAJI!S z$7h)Lf;D=n7N>!Rtu$i;q!FE>vIerN4b~Q+dADYo6a95lp{jOJ4P55MLTU&Gcx{s6 zet+3xk>*59H+T79z7A1r0iB(pInqHeB0vncTC#rDFbiO83JxQ{mL+LA-&Q=b(mh;Y zXG!VkNuWRrf}NiZ?FEa4r5oK}7JQdxDg^dQO!s@b=tO`yPJ-ld@PJB03<;j#lVOYj zi?4y422tzUEgl1<^Wm+f&1>k>9)rNLqVf!FQA2Rgc zHir9fuJ}OgI{a1Hhb%HtGYSgxffqhydzezR4oOfupEZ*xwl{`qY!EW80m#O|VFake zaDb+MuqHhXO@g9c(uDq!9WgLf{Ab0}0LjG6EFXY22@VTO_o@uk4B0>!C~z%8&e9ih zyr_JfOkX-k!!F$kaJu6uI3z411ox#&^L$YT%zHo0iJs=n33{YS<->>gy%QRFv5=Jo zO=|%sxTKGtrh1XX4=<;m#ly4-pl4tFwOcdQI^Yf&rwq!o%!x3W5P%;6>X8K~UW8~9 zGnBslyXRELeIf6tz_+zo-mNrS7O1D-AJarUO9&ci4o%w$o_?Cv`tMF8LRwB!JnnC7 zzDsk)WF*h9TQL;(_;BNp0ItJ#LUwjgRa_*i02L4h^TR-0@hdx#>`@^Kj}T9CBGd?% z`SgB(BqKzlH50TB*&F6gW(6B1LJ|z9#x57UYPh+z_2jvHVl?s;97wVmPlL3q7 z1demZ!b?fWi?iuIVGkt<6oN9@xEJh2OlMDmyk<^&yF@#lCQC9P(sU4;b4tuB!+1UO zBnB8T5-g7a9|7=U$)_WF(@&BCT8Z1r6^p6sw0Sxe#~aAM2l_2}W-A>Kf&rgpaEAaQ z{18h9y-*nG3=Ri35(yW+n>pwcY`M0CFaXN&hNRT4*n52&6rs6?glm0^rQhGsBETdW zq@2X`kd9cxLj$023(MqXP~C9o^4nZvJga*z@HjfeZav(H2vePbjKAfQdVO zA*3Iqca-23YH)4r{dMA(y(ND9nX_3JRq3l91dzNBS>$^T)BxNawc)9B&gy$Cm(Bkg zy7zx3^gj;ZyV}KV#uyo6bHC1Y=C+$lZmklMH1|uY5t1YA<}Q?!iU^@xl8_^vcA+Gd zq|3KdWU=m&Bq?8i!{_n&<^6uYp09ixE`)*t+UXa2{Wn9~Gn3G=w68$urZ>aXE2dS) zM7(*w&-swwEpSRbPw#q>_pN2t@>^B%A-~f}A-JyeTg!YBg z$QC%M6%x))zJGg``zAA1&Q@s6sH_+GiQ>#v-lrvGBA4Hk{d@!G#N)aU@vXw`)6v0U z1tH@r>f=1a^RWqaGIjW`%C2R{kx!V`q`>u&gOtR4{W5_)6%;r9X8*(JG%CN6rI6`; z`2HOKY-W6SX0lF}aObn-K-Blly4etT^tH_7p7;;(zBAcA=_;N@p_~HyTS?dc#%-nM zoz0KeY+iz*QqL7ax5oplsnBz`-nSfGwXX+hDrCehWRT!9mHh%APQ1tiOkuA@hUP=z zi$-4{=7mvx^4E?}Kc)EO2Nu3E(o5Db{q{5qn&T;OYXRYW-?(PwdEHUc@O?G7f9m<^ zBX^f)v$@}1w#ALazPt6v#FowDRXE7D7S+vsR8g_#9!JpGz6%LB~rT z-xPp2X@^jPQ$K%j@-srUc)!a&wXSDPJ;;dvo&nMdQE)8$!S0LA;vW5_vtC&UC7~4X z^?73j%QrQFT+;>Q#A%yL+n|gllDL&pc0)Q2zhmE;ftnF7^_{g?UcV&BR?R_r2o)}Bf*4@O`15nm%huXe3SFRxqSBP z$<2Y|(Dbv8|11?++fR&rNm-vb7xP2yppV;`S*I;`YO`tYgUyrEt-so<)gRf~e4y~- zm%AjwqpN^u_XeL`Nzv4xp9B}Rv7AR&DTluimJ3R$hVdvS>Aq~_Dqpv%o#Af*7)ZDc zyPO(RcO+|?gmC6erNYpt_f+u4q>S!wqhM$X(~3{&4lwhfCh9w)f<|;PrccxhU8|PR zKK@q6`tN2|Qpt$o5SD$Eif?*88gpnI2tl!5wIYffYT!}AN|sBMMlkvMlLT4M(1m}- zso;w)!6y#CapP4eJhQmh|JZLUJQ);NG^IU1t#(oL4T4K9ZE42J#;H=CMa0j%qV`ll ziwCT_9vZRhlEH1eb>6^rgx%$;232jB!C84@UGldC`vlYN+jTPTCjhBr8ekuCxzs<9j|^RxiXR zcS(@Q#}n5C{jTg@ZvR!{y}g#daZ7$1xjWhmydtNs4Qoi{-nY6=orXgGWX}vo^W?>J zU8R~63uZU79+gOejM8J+D^r&h!22h8pZHV=llOYUM#W**s!}HijWDU z`Tcf5F{ObyE&Q%ui~19CwI7TJf9#3g`V-=E>vVn97{9t6cRm`g72Nc0FgU?&TM?}H zIN^u|)$7lcKz;tA7p#P*=#psA5YpOUs@7T*yu{aR?fR-19OnJ5?`>Hmyd0=T4F2oU zjaYX%GGrW%$ANLp$Q|usQ}v|?niCCbZc4Dr-pR!#=ACc_%&>zGsuJr@cz*SY171Wk zfI1+pKkx%Alacz!iN2z2+pBt4sM>8G#HH~OrH2D%budG0Zw)0$(RCf+(X**A+gIX! zoZ09r(PCs&hGFjQ7XMJ1<#Np;#0p6en&kaJiS_0 z*C_z5{PPO7#4o*cs!TyQ?wuKy!$;?;s3)_+tqF9n(7=>$GJ*&W>_`0biQ2KyufyV_ z6=}8f1XRvY#KlGE*SG?0DtX92A+@lsx~XFn(0&eYS|F+(HeNRxkVa~kz_VL+8G=nJ@DT5&&f~C1M#V`%AW(LMQ zA>^&nK`RVSUSYlG5g0MXfgMsXDqq!F49C@4$1)7J%{6c_YmI&o?My%DO9w>U4D$eFdXt8 zj~XL0Y$jUXp^;Vi)V)>T3{kwuoOff%n@iMM8lbqIVr|e#KF@(v)#~PG?$v>?Pgc@$ z-xZ6qNx2>I#PIw`*Jna;Tz0_+q%f-&>a2f|d%*)X&?M)a%?O;tg#R7yK9s4&^Lk)#-Y#klxako#0T2S|%R zMLwMx?%!KguO2*tK$o(Z>Muc!J!`PJXK`M^0h`BY07*` zf6q+j^*4vgGnwLkYi*5e;msYB0eSsv7odHv_fBL!dt&sx?#NPsnH! zKj(7clNH7KW4CY1x;|K3(C*5KlD@vaTD?&Ak`$J!2jZEE?xtW$W_nYy%E{7~rKQ5o zs$_XP9rz*qZS2sTI@-CXN+&UOolxE2m{$>Ya8$RD@a}J!&0(L-56YsCt08_Q=-;74 zAn~FS;f>;dw!ZXfMa{ei0$+kAnBN_4{P=7K)4q4bAwpp*;>SIMp#Qn^RJsmIuBYPu z?1Q4&i~)=nhYDIxQjkxvUIx@Lrf9lNTMEYcr*>-KB7!|q?~imLaXE!vv18g?1P-tL z`{a1nw@{eTjx)SzN|*kxCr?;LcrRJFA_8UJ&bZ@vEPkKXLq}DI3b2!JxpMb}jvOEK zoOS$(*4X_g#!C-T3d0tKJ9OFSk{$t#Tl3&k71II3${AIgi}d__4Zy9seafonrqi|~ zrBQi4-#0pU5ykLFeCp>->$n`CgG0^EE@fKYoyHZPRgT7L52%F((xdRyjsW(A6+aUh ze5mK&mQ8ES7=*i^F?d?j*s1hdUdF$OOTKw_w$iZ;iE{F^X05(o`@JmO$lu2}^z$84crG;~4=qA&Yuf1QtR8`2!N#1yDpW^jK7V z7Qlo=y~%)*YkW)j0GkCLmfyA_GV$fzv>f(!&Bsdq)dN0}&E0?t0xwoVw^p z=HuLG{yOn`Jr}{cg7Cj!LhEeg-*@Z~9zhpCSQ1-?NnM2kqOUGAeKtf-Kwp)425$u4 zfT4?Ve%(aN!uW*0RQ)xs=LkVDLPGZ@ddk4eY9o`L=3Nrw-IN&puzTyh!9c|YsZo}M z>DOc;nq^eXat1ECL`og2XM2}oJhJGq8&-_lJoAGZ6UA^IFeb6*Q~jn?gK6lT1P`i- z=OEBCWjJ|`mvMGB)Gz_D1SHtbGoL0L`5Vt-abx-}X6MEsSaJG^CQ!0T`hPUEC@*Hf zD6}tD|D-s7TilMnfP)G~icQ9Tt+RQrWub;fM=7QzWD`XjEs2UMKPEqqn>Z_4mUS>PV5|PVS2}UbyGvmH`^B` zJ8vKX?n90;fo~sGu{t*7%e%n%MDhy22EwqdzRYMcPY)rsH?;aw_^Q>y%@D7Tt?>tf zWF)4M>ncM#f~UG5+BuQj(ZK9EKjf*)@IBuY7%6q-e2j?Xg)MGqh*k~|xP(a+Eh=dY{2XXpBe*YqUcBzV?OYg87>Qe0n5 z{V#dSV-(ZV{CdtLe6;oHm-f9cW*f7T+{5QjqZ4xV1bGcsFFi)@Qm9pE&wDU17a87s_HwJ>zuDvA3GW_Q?LFV>|KZq`p!s?JzUQOz^0dTbe!5Kxc{{^9 z`Q{dfoGv*;H_l7)-uBI{XTG&Q?;X>*uzzn~Q)LL@+Xugl^F~nL12xeH0vZ5@&)YlK z2udk@^&UXMu;y%ygpqvRuYLqM52|y;57;-Z`eoyMsvE{*$ujco2q=)7-Ruk%2aSe++cxbhGSlkhRRPDWoq} zJ135uAEUj;W?hN;-oa4L_N&=|UtMEc9Cf*lx`~Vz#V7a26)lS~y4*pD#C4KSIB8^3 zeHGkBgmU5xTm}2GMXFZR`GJdbB$vRu+R^4-lspkJ$Y>ZBr>2s|3&-5y2ODov{u+*J-pHyiKKa*B&sIOLHcR)u%=+Q8bvTSYzzF z#^kk4u{@;_09^iEIYnYS!uHY+YIZ|>q z&LsHGrDD@bAiN$3tfqFZaPcCVf}6-Rm})JfJBl1M*}&b;e(0Y}XcN)FfK1nEi8CrQ zYE}}ZzYOS+0;fi8WuQn^k=`eoA-rB zv}bg1L@@=+0FhIae_x6TKl(J?RmAJ~#NVq5z;dMeqNS+q%g##Fbw?(TYze~4w;IbC z2M-KePdi4Q18*9mTP*?bY;n|VpXw)oQW$lkNP{5OTu(O0bwuDc4P5I3z-yfFCwHs% zJF(|MD)r7P%tMLi7>ZrMP18KL8YgSZezzQ{UJk>04XB$)j&$Zm?nyVE=I%{!F0vtG zQOmwRm!rM{t=Zy|$K;B6kglAeI+&F{OD})sga^hYbI6#dMyUXkc8 zaXo}FW?3$~5A>fkp{GkT8|Ht-&Pt*ig$Mv>_bm13V{(!JxZ8x1;>=An`M0rA2&?8I z#w5TVa`pDZRjQ(dgluaiYE@mPS;aOoC)2r^m~Y0ditpJ(z8tKYOtQ~ZzAi)*`o~C zL1|;D^Mx4Nb^U*=N4R@gQnel_p!y$IrnoU3P$BrYw}q@3%n&6UPI)%aa$p!!0lcwk z^{nc^mB+oc>%fqs#ke)zl}e`o&%X7W(&Z*84-xxM+aS0^n(ipNodF{UfI+&t0M~UX zeu{2_1s6q0`Xlb)MN)h^-F!vLTmRBa&f88M!V4qEXVkhQPINU%Eb2w7^1z2bU-i~Q zjI>{O57tg-QO(DtFL!Q#Xkp=3Nb^*ZJS@5Cz5!Q^@n27#c=@Wi`?BpM%-snteO%)H zU=QuhF~x`aVV3eE^t;%+i)!vobjua4@gui~Uvo_4_x>}@Wi1JIS%xJ=oX{C}bNvF? z0+(KE6~83qdKS7HXZ=-~&cS><=B`AaeKu+_2(Yg%saR#0ObTWU`aN~|rBz=UmH-r0 zWW~8{gkX5C`OjVt^PB>$KYuw2vX$N%!QO(D5{I#i`Z26Y!TlKxzt4ZIhPPS>+d~~TmNgIPZbkg8=+Pr2h)W%}lVU2`WRF?=t)&)M~u5ltoZmHNbd(SxK zi{4H8YVqxWvyOxmetN>j5cGh*@(kc}NughrUQ+6>4{Bh3M|f()g`~%)O;Zcjwyo{e ztF@tE0lDd0@2zW#I-bUA_8wP!6<4HXVf{`;+aU!q8!?%BCPX(pEhOd38c#t!eyh8d zvkj4HQ(B(b2jW{TAX`l8kFio7M94iU9u+Yn0Q~ldMIu`Oa9u{aj9gPDoz7ZYF-Z5Y zE!qD5ffwce>TNlnqmh1n1n!u8J3iI?xyLE(RHw;<%NPKCSw-T|eVf$EEm|1AB3V;(g=&>`aaT+JvK=)Un1hd?CsksE2w54F zxzK>t0SzZ=>%etJN;A&9H<@<*(yFN)x6mxWsO<-qs+^{zw(Q#xPMQ@!tJS;s`nziGR^1#~kXX#?@x%%?w&l z{&szKTEahyRd&I$ZyS;lZG(#MJMz3+Erx&Rog42-S2_WYBox%lNULHp9crm_U|)|L z`>q;P|B7xsgI&2{h)bMlt=isSAXAL3{uQIP|GfTDI0=7szU<7~@quE?bt!JbB`>fB z?>RT~^{@|zePRWMi0hYP&vcJiRMS+RjnLFz{T9JaiH{N7Oz94OXx!zCN~Ev{M$akg zKgSMTgzx0(7!5I&wvp9vwFY(}cKW9hnH#n6a`@&6Ubxc*sm3dwLWl49Urw|FwbBaj zEGk-Wgw-BMJRTIyxucB~l&TjRsK-vWtp(hZQ^zHSwZWrDQZz9m|HIn0STwLICJ_KNK>)GbpMlaBE~K zxNSeMZP(P>9bGyY)MWjb#?2N?Pgp@)NZb~illCYm{$l;v5w+lyDCGqF9ql0zdGHcs ze-Wk9G@{3=%JQo~-}cQW=*7}_Vj@(na7OF$j*iMsrcHGAu&-iTK0JM?$)r~kW7*HV zH8P`?Uh#ere-$zKD$qQbb$hd%Sx`FxM5O!Pd!^^x2i5oiF>g}0uQq~FQa)TdQx9^O zJTcK3yf-iUgo^i>R5*z#LhM-qY#E#1dVLXsHh#1oX7f}H+hh4K$E@R2#0^7GW+YSj zX4bKiAogRZJSmkj!c#f9^;x#1S|TF6BEle*AGe{`*M7EyogzJ<%1;<7v>}e9Jj2)x z4)Z#!yqvx)0IPO(8ydn-AF``Fh5Z0fF-)&NstYezB!S_wkuWc^=BD6wp5}m~zVh_A zzBx!sg~yR-CyD@vcMHk4k4trezZI&(q3ADI;Ia707le)50Kz_~!TVIj@Dy*AKTS~O zGB`q~=6Z2f;*c6X7V>!ft;WkhKO-fJg8L~Ddz0rw+UaUhh>v{SCp=g?h*OX&UsSoj zkPx|dqBx$6m9$lJgrQN#mW9(Q*Zy9Nj2)IZf*=Ti}&WEz>e=x848B#`Sp@5)o^t9>9hf4H=ZB zon&ZvHY?$##DF$0fcEmrwB3VyD!Y9F2hbI^4ncU{j-_gx4NXEwq=F?&OzpCp9F;VV zKBCFxzGY^b^T2UKk_d(v<<{uf0>MsQ7ocYOK&ASbc@5P8Npv)HNU7I?`la}O3P;j9 qe05{bTuel%x0v1&mu=o2{>&^yL%|CV+WM5BuHM&kdAlwO;QD`YxUgUV literal 0 HcmV?d00001 diff --git a/nezha-fronted/static/ueditor-1.4.3.3/dialogs/emotion/images/neweditor-tab-bg.png b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/emotion/images/tface.gif b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/emotion/images/tface.gif new file mode 100644 index 0000000000000000000000000000000000000000..1354f54b961211fb0253ccbd27a81da5dab5a639 GIT binary patch literal 19805 zcmdS9`CF3P`~H11%B0;OD2@T5;ux4?S{qOjO$$xUIW#MCC~Ppb2@njY0*7*{)GX07 z(bTl8jZ@jMOKsAot!^tTD>EzGwcmdGJpaY>I@Yn)uj{yub*^HVvZA3uKh@L}oI z?3?%R-oAZ1Gc)t%&70S+U%z_w>eJ-Qsi~>glW*R>`1?06U%q_t;>Gjl&nLzwpFVy1 z`pNV0@$n~5o;-g1_|cO^b()yrL-ot+&W9etNB{?ky|-rj!c(xsM5ZBOg#T3T8zUcA`c+}zaE zbmQFV`iAqr(bSzkckWzWUESHUXKQO~t835HojLorGWTO)(&^KutE#Hbo-F^(i4!ME zOG~fhDN0I8ii?YnA3t7LSXfX{@OgJiet!PTeev>KMPAO)oSYoFTrQKzZl@(@XJ_~9 zIV_eQIh&q#SbRu)_{hP72M-)Lkd>9yni#rw@7_Io_UzuhJ1s43@6P`tH8nLQB_%mI zIVmaW;MUFCwrzXC<38qieqW6#3J#8qjXf9mM_f#7baZr7R8(YSWJE;76Hihv7YGjz z4+{&62#(meabs|B@W!CvprD`<9uN=^ux{Nte}8{JKR-U7@9pi){XhIU9L@zQ)yvDv z)6;X+s#P<(fQN@ivkAP+OxMZXdF9HLj!cIk1Z1xn(bmzS9*45Gx3{yiv$eIgv9Vz= z7}nO-78Vv~0f0uMQK?i4g|dA4a#K@N6B83-V`C#DBQlw6XlSUfuTLNl@OV53g3FdI z)6>(_)z!t}a2N~*jYgwTC>voEx>shuIfT+E9HQz@$8U>mR*qSE*gTe z?{Z6RBeHyiIzW+;gOV~dlU9B2DDEXCk!p!OR>!ebM@O_z7?VurQ3y8e4#j38+I%ZN z9z;t`j1pSUO1Fdpw)5>@$Kr6q{{1@u90Tsf%qC zZI*Zrv8(vdU?e`9zV5UaTs6Bh0D5%v9)IAj5QL+%B@S!1EnQ@)6W%-t9vHJUO|K`> z-?;qGhrL`veA2dI!}eU*ny2^h-(}Q z$9-%Bm9#81q<7z{29O*HYo?k*Ig9C_>`xm_?@eq;y`EALhlq5MT1K+k!#4|nYrqlYDAlc$Sj-nfE?TRFB~ZFG+CGl!ZN+? z>kV4IW^N?SyZqekGE*O?M1Eo@yKg_Lz$nazW4{CyK2K(5-9N@Ts{li0de7UK3%HE>@5s+2hlapW5Bflj&R$L)Ey|bg}mud;7Imd zzneQ@B3WDLcq2EsLd_MOL+rrjXYi^3FtsQ34K37CvKi*y~k5w{NPZDj$Zk?(g4QiOWCNxB%K8mjDcsz%bOTW|2%z( zD`Gzqad3vc3bJwQigfvulpFywv4xx`!E zAm3pAdy^EqcQ^?p=ILBcB&PRrgI86BS&qi%AJT25;51Y1z|EQ+&BNqI_q%Lc;o9`n zJ_-Y8aW%nOW!VGh>vjqn za4ZW%_^JV5nY`J;zKCMG_z#OV>B}=dOW3w&BN#S>EupZF-edzFp6)n$4j<9O+~yxS zvE+~7?AdI)=h^dMr~8SAi((w6|Jo<*YRMqTun(@p-su`XA?TVvd8P>JlDV;p@_e}F zT({mXx*wO96AxR3KXzIw^hpnmr&1o>P0(b@DjeZD(LfFPgbV1Ikrr@MJ%D%JU1sp` z;dyPj1jA=TOPJcyOyy*INL;aZT&pc7uiRES|riyLB|4pj?jJbTqSma zeZy`J!Z}&0#E}5bM6`-t4XlCQUS_gIe|v-WK#(Dx)YNOZXS%Y$x(8h{D^w>_1}Z=b z%w2I4bA7Ir6|br~f2<*sGqVmmFFG;t@1{GHuoqURznHq4mM=Mk#2hm-pssaTzMH~f z8}3iFuaP?R>G?7n4d_i<7BOF7|8I3~B01BVHtBk_+sI+Br=g&bzvwB5Y=^udS8ZA9!ZysZ946 zM;tW^Sk?YBwS##2%cazxQ?(1vH!%#TIf_{})~%O${hEWX!;tL?Sgy>ri-!tHmJGn$ z*3#Ffg#E3XfdBG!FZOg#uHsTMxn*Te^l-;yzZ@F*dMW4o;X`pdNs2ffTX8lg1eEnb z!~=5inoJ|t_Jh`w`U{0IKu)fZ0s4@{W4vw8=| zRy$O`_wW_OzP0U@SZ?TQ+xhq|ZS;kdpVCZm(DdsaY(=?k`t~v7jA8qAee`IYNO$LB zE=;E_mp>)}b@$xuS$1aU_*l)~7i|5@55~EVi|*<*wWUlMSt47uoR5vHG4}bNHS(@0 zGP?G19)`$)!l!$oz3cyD*D+C8#*}WnK#o8{c&jZf31#JcuugN}W&U+$=}G>_=Dk%e zJ^xW{6(>*Mj+a~x2ZnBPxFNUJ{_Jgmtl7Cmy!3*YHF+aZ@}uF>GOHjsK7XupPrCZ> zmK*nj9O%nwY1Bvdc!pUJFG-DaR8f$A76+p7XgUc06ZF2)C!2t{4)p=neA#MuyUaO} zZQJ2m9f!zjRHYbRN)d~m4IU?Qt2DH!6xhPT(UBUor398QK(DK} zwgb^bFf_ai8bUGrWC^nsphK#y-2ojZ5jIkTxjeD?rw%(=gF$#pgPFK})(Cet^o$jP zD281Ik>y?b*;?!c5D9?D=h8ojTG9m#^n=@xIMMQTwT3my!k$(XL>~H(Ve**FwiSuW zC5IAV01-?L#UI)^Z}D-_pk3+~2O`&BqU?X|ikgUs93yDA8`}g$lyAh-h2qdO_(GXc zD|v+vG@9lOjhH#m(S@lL7(M56?$udGDpPqmcG>K;J)a8`f_4x=O!j4b$lO81XaA2+ z7`^*IrzHxkUxT5jj`yf6j4q)vCla?)LkioVKirj0Y?iwQ?ev5(wH=ITMO6aW<+m8P z;i3y%$P3=`)-hW|1knk==4&veTAQk(KUBgKuS=H)D~}OccNhj!^(_kCDoT1lq@55a zo!7?CMr-rY@&zvH&~o@6q$xG{{TPR25WLFY~0Sm%T`Duzf6^V zW}FF4qc`@4RDCN5DXO||ak#n@T`DMjzsDb7uS}vKITKLZYTIw!`c5L+^H7K*1?Dqv zCQftu*^h{`B81}Mc^c(HZ;Y$d(>(4deQcxptYschj;TX2$_?}8&QgmU1HT#Y1!v*^ zf=Nn&!x#II?{!;zS5b>(UFC$}VJz3*KC>D%KM&%d*dLi?*EFJ}VKe@)S+usSQGBXg zVn0}I?zjpSCOV)#TB;J9vEi^XY1G%_3=3%hu13PwB1rsAhnC76B5TwI1bDOn%}c5r z+gCPReBj|Z$6a96E-KQT0qam^kObJIYE)xFCdLhQ)@eoTDpVCOzY_FLa5|k1DpVCV z32o?!TCkuNp*yr@LIQWIMyNncD~QFqp}w6oiaqI<4c5kM(5;%id1@m;kxrwy4kv+s z$p-G;W|?Emc4-{S7m#ig1Wp92)Mg(Jg4Bo%BgMu$Z<0!@p_NS3?;`4Q(i!fJYzGap zW_XtySl`)Mldt5oiUVxtR(tAS{OS+RUO`8SVA!D3E|*qjGGR5+%{@;VP#RRE_<(6O zCOct891ldg8CpNMsGDpT2{xa%v@7V499jB|%-6@4P8`ez_a>Z&j<=$ppT#)+FytOk z9O*anfnD%BsgtT-jU2rgm;pQa7)vv8tDG})*@VuXaMoUXJ>7QR`(oWZP^Gf^dmcD|
          >ucVxd|^`nwXB9}Gd)h+ylVk-g8-#0Nk(cKS+`J2k4UqcUzol8$Xq(MjyJz=D+>NvDz-()Jyx7NMi|pqM!w#&$eLy(iA zu>Z{rw)weZS-ZYv!1qzINUcnpG<0S)_M`^g0<1_hLQYtjWU>n#*w~rw9j4*}Hi-Q3 zZ$B>xas_|`OA|ooNW{Kj_CA3Q|Ca%`^Uy9lQbRnxpPS38fvUAbS#38%scqjE!8zl8 zRO1;!MfdDc;O8xyCmA%h2)%f2WeeMIjfdDt5Y|&=sz=ekCBfVxscx$7APF~Wx8H@Q zp_OGuCk4bfvGtc9^cszRG80$bWWDnjm^tjA-D65p-ZuVhiXZuFbA{tc@hOz141q_g zt5+{&*zd-`dy~PfX}iy#Td615%slI!FC0Q?(8M(Tw0_8!baZDXgAW82X&ouXfb97pMooeKoi77Ut`_YH}jMzgG&rWTI1- zB*00~+$0NadFc0Ji{xE!?lr;hn~Q~8k{2TjML!H2CXStvJGeTKBQ-a|CNAPyVO2O_ zp=W5-e|{Em2$Grm{w)toH4hOrE2Ht*$`L{#&HL0r_>!;9!6J(P%C5apcwdo|-XYMb z)jBJ+t<>AQ1dO&_O{PNo=8{b3ABLQLi%;(h-=4Plm3_urAFIFd4EZ2%yuZoY0Byha z4`bHjUAw`llP!jiE97mjHNP1A_;hDT zq4#asiznZ8RBdc*_RsX)tmnv}a9{7$r#3;J78CErfR#+w5-(@k5ZR`LiCQ|j>P(q< zOOWB%Gmmp7PcQ8zkTSOaQ%Kpj&VD0gWJb5;&0WwI96J~Ts$Da%#5JT5ylvcXAzUd8 z3b*hi8*Q;L>qa-cvzia7wXD~l@JAn_BL4Z#s9-riHd+3UDcYdYZ~URTfg+$tk@m9h z`7^>57gd`{7W@>6-zb7XRvVg85obr!v2o$MR2MTBS6I9S=@je*&oG;~9n5ZzZX~w$=BT6MnCBqJTzHRS4Vg57K#7($|P=xJCYJD*n<8m_4=Cje4 z$dv&p#ED3PDH|I}fw?J16LU}OqKKuJ2*(`ofGvek)7z7Vi`V+@S$aHCyB}A>rquM> zBoE&$Ps45cDx2b>54>cs&OOQNK$j@9+y(5X!RHz_5+C^IO}i`eRH{N6(&_sdOLoS% z`*w*wt!6G0`l1+CgGoGPMAV>pfMF&0J{!=7o(Ez>y4Q#_4qQ*uf?CY0 zqNCvC?(Gq9UFYN0<77*b)7KY1!m*+6{~FwDwsrz%_%)ca2qF>uG_MEn=KjL5b{!51 zXTVl$cendQLf3V<%zos)s)uep2es5fKEHI&tYzi=1eco1k3j8^S$kX8yI4)(&H7Jo zD&)U%G~rc`S`MG6Y0|=5QTDMUQ;iQV2x|Ygw!yn$*V0Htk>k@+;k?dd&~=j&cn)OQ z_Xo>9uikSa1I324AGPn8bhZSsVaE9d>!hyX`sD>I1Id>UJC|E;+^r*N$*y;pxD7FO z|2)VX(+Pq*-Hb=E=UozUhJTYC!}Zl&sMO8h3htP^aYW`%VCz^UOF{h~neW@~^b88W z;zrUJL!rYzLEN!Ym+$jz{nqZb_@U4q!rqr<=^C@qC)&LRCNG=wN+y9D%1awm^H$voOop&G9dV&x-Z z1atx(_p_6Y;;`+~htUqN97$m9GU{Zo1`E_6Ab_;A03u}G9WyZvLlS)Wb5!vb5Iv;{ zh16o;^mLYc{M|8TxUnVDBVHxsDNrf5#@y!%`4#;+=4z%XbXk zfrr3;SHjml;zfo!iuAhm)t_mn5h4jIFD5kGb;e&t)U@`G(=WgZ`RstkylGC+B|34S$k zeIs)Znd$)d8=C@?#+GO!QTrnYAj$F>*$t6>mbVB&l{sgB=@=5Kn*RdALc&$P`HAr4 zd8L?l>FZ3P<}tfzZf?INH@)fp;Y+pp_CqRkqvl*+tyxrdJR8H#MLA&cq4@`ATA2@DdA20UlgLb7QQSFH5PQBARo6law*WD18u+LGk0q&Vcn zu@S5RVYSr%>7@^3n^^(1B&0L4uGu9_aSUwsuNyi>X%Dw3XKOt;#`;V@GjRERuMXouQoyRvAcP`?Ht_0cu14A&tj)>TZ2}Gi4UQ!x5 zp2mj^`yl-cZ&?sxJ`8h<`H@M;)17!mnem49OqR z+C`NnFs+VLuGi_)91JoaxH=%w8!cI52qna3AiV$fo(JdjB^2je0^1Wg!p#r#m~g#$ zA{=sp>)E8_=lMU*kVn_^NiH^ew77z5%wyErg1r&kYJw4&QiHIwM^F@;S8s4HFlLRNR;m)jI?=Z*+AFNHgdq{-GhR{fw=}e4w0VP4S z=C5JS*FCjW*AODS=FSV-lFusBx{TDz@uc&5oy zQ*a>wL$QH*!oF^d3b4Qn00uVp~V!%-#N3!A2GSQ%c z7Ya{Q)}j$`w$a*N^lDI>4M&Of){G#?-)g{vOx~aG7L>5|Uj6kbF@RyheaZ35C=1n) zU=dQ6Tn%h;<`NC6Pk6inmN6*`2$7=0au>=01)DCSV03W85JRVI-PL1~KokY^VGmn{ zXyDFOEZ7M^i=P$%2z4Li4}QOqu2QjV3;+QUn~s~4TM9(9%|a>KmD3_1it)~h=v*XI zOcwWHftg-H-7pMWTB}n7S3>7C=n_jFLWPn+t5McEg80M4EN?n-m_5m=-M=Z)o06Ve zXBn>Rr-vHE3jM&zu z-=ZNSw39`z2qkH<;2T`m#}F1Dx&{jn4rrRZ+BALx&T9Z~3j_g5p?+b64=B~*k$IE4 zOOI4=sI4e}lWYpi9O|dJ;!ms!r4T1GdFHWcDASobXmAv4kwM=?Sl}MlmiWvmeIk@k zU!zp=Vv;Ss$1N40WxDGX9n+v65qy|OXAGgSDkdgXd~ru88m$*(aokVQvT zJGa6b6{fH?&$O77unts)gSbu{T`Kc!vmCW}VW1)?n3QGX2<7&CtoZYl*KrAh47tLj zqXE6a@~AsQ&Yg_vU33ln`^5_2moeVs+T=-hMr!a&QGiEBwPD9C?-kBJ&r>Lad-f{_ z_DicT+53c9qcSd59kfFmg;TK+?(oGrag_VH9C)clnw?Z$;=-@JD4JTTIBH3idkXlN zN_QEtf+y7#j=4H%)kJO@T>s`eOfox$!Cm)vGrupG#7tq-ZUl# z@jP*XPXCOwW88CXoEdzXb<-8D=EmX{KN`DI(3nSGP)87>w5*Y76AMZw@NZznnww&8 z{)J(aj0fJXg52w=G!(8H8~HgT7iInGW=pt_Wf`_kk+jVI-MT#bwnLY;EIfVkCo)|l zH=C_ecZ@|fu(2i0vnM;mu=GRs@qJ)!An}#Gvt*EROgl#C&{Ed6e(Pwt7KLeGKYz2v z?d0e=Xl(Vf7uzS#@U9;^QE`!q%g(sW=U*eGed(ix4PE9h`6w?Yf0;V?K`-Nfl-(q` zjAJ=`X@T-bC~Jor48Zj#vJ4mV#eM-KlN@*1jptt7f(`t z5Onv?TY1C=BU^uYq)kxTa!@NowNkH#W)e5ZYL2mr@KeuXS;zVZR=X&QW??RLQ|M2`wp(l*A@S%WmGI_P#6K8 zG>!OsO8RpZkvU^ps_5!8L8iY|aVXY?xRN@JH>t$Qs!1L>A>X8dA`@k;Dg_(Y6aZzij(1lF;4E5ia(1ap2W+8S-grwxFf)m39s(A;K9fGlApmn7cacych$RJ z4osBojetbTc+#?}6ZzL%=!)2qwOcX}?KFuHu38Jg)^rn@Y&W^cijX01g=PQtmw!jc z*$71tt=+I30FcnN3CxXD!`YM4EL-K_rd%T*u`a`I z|ADfQ>h7h;jBHCEudK7j%*Iq9DESd;RY22a4tRpyYw*e`Ckkiy&%ai?Fi^S%N>~0K zk~WRv_m7JdFSoNbV$v9}{kNeKZr0Vf!bp=Xl&#*oPVQBGYg<||g9Bhh2FHla$-k?1 zd@U&$vO20bhKN;nuKi4h-vDquf~qO#O5ARNx1D6-k&p{oQW8&NTaP?X^ThL04? zxm?n4Tis%C>rN+BoGlbzwYP~S<~*2WzGrLK4`KVibb4^a>(#I!XU7n}(Wh__5I{NV z;)b!y25dzCgRXZF2v8;+voHiC2of8^8ADudFD#5exvL-{Y`I%?;rM&}5=Yr!FubxH zDiHv82$`@2n9_ifUi7C8RnK z_^)M^&7C0?1b#}N1q2$`fVah+M%`EGaPUi0aTe6@E?n85xiBy#^=AhFDp`yVLDgX0 z-Cmegp-&P5*H9bs)#8Wr4e$!mmiIv&|Bh&8)&JuZ85?17U#xO#l*TqjMnJ`GWZNhygpCF~AS4W?vePDPs&Njqv$-Q7MRE}=k7-I4Wp zk{$@(qITs7?pk_M47MG;8$ctWI<-b9#j^4JhU`nD!F>~Tx)dtll@h0SD2#y*!QI3?wEFy4!6!MW zaD_+8wJ=lCivgFI*k2o>rsPW#PZiHx#=<$>F9P#c4Z&syo*hhu;QA#L=6Fxp3m0^U zI}VD&j*_m#=9jJH&8?=T7F&2i)xvCU#OOMKY@HH<5y0UZm@A6x>MnhZ3&vEd4VV>z zVW{4ayg1Wv!;hl(q_SgO2%Q>W@PRZ$jE?9g*fH%it$ta~%YW|JpmAS+4%97EP1t#| z6^y}kd^C@JVK#O7GY!>c1KQT7{OPCmoL9*2wsCoT2F>6(m-^5h@%DNMQPW9`=1#W^DsT|_8 zQn3!qE{9|cFV0iYG(OhyX^x(!u!Nk2fjVch3 z4*jm$?Govd<8g7L23csA*)#VwN6MFv zBtjZ;d`N0wQ}+ekduP?p>U#Lb?vg05|8+4-O@GaF1FEKW3`~r^N^%}hQ+cFpqd6EHJpYF?^d}IfahBB)zUp&nj zlNkwet!};Dc?T8+q)N5_k9&6QZ}`0!G)>EGvh-Tx6cda#khv+vaK2ggi@DDi~3 zqPoPltb5t>d1|*G>UAR*>fEPVZjBE?q~ZLQ{IqekO{oj&{78=Hm7;BIeA2Uw^Pvde!2b^bHuHPYZS^o{OY zvEy0FFIFW-4gd9DZuj}><6MOW8*O!~lmZDC-iB4(zJF|3`oJh`>0tTn&J!pW8$rBW zXg3o^r*^_fiG+f z#`avALzh$xneHrwhO6PnBl7eXPl>E0S^mxbi+l35&+GuqtMc(aV}o}g5oqGP<&OpN&HLt+O1m@4nyT%v-RS48(sA@&R+!{XpQ)&Z|#4 z`!(6#4cILpDjb7Wp%Au|`258m$*{4bimoU{thA?-dG}9~?liqFdH0d`s&G-#cnfA2 zQ6WIg;&Tt3zqV&Bq4TQ8Y=E+}LWzRj4M5PQTZIiiE5fb{)Q#T-I>F-&p|fIiI3e!DC1 zPXMF{U_Ym_N~pJkTHr|sm(_KpPzND@9YG;c{{-ov0H_WDcP@v*l|<@Ur6>e*bU5lX7JfLzRU9-)9w974KbQIzJsJfZVLb&^+u37W!0wz+pC#V4<8gv85sM zau<+C^XeS<6M{>OA_FAQt_GO=fYUWlJAUiRnfH{?EA#3hKg;*3mSEm%dYNzG1}V;# zN@-^^i9u+G^|WJKA6^egw=aTh7d-kv3snbq@T&{_f7lgLHVhx+ zTFd*yU@1;^3b)UTwwc#43$Pg-A;Guo^uyHt2lXK8k!>A{&zKe2s2Zq_Q#&P_oIOX# z!(H(Ll9)<2)pUr3nkNvJ=Li?kyXtvw{l!E>S_+t`D29=ccad)F~qb=-G{o?cV&oj z$2AYAg`q$5&2Q57%2@HkgDF_IQ}jWLxy&ezW4-vQAwk8Nv07?yx=9fCBIb@P_79_c0p}D3YXao21`pRY~2uJfAbUw`w_Jc70Hm2kXGeh(NnvQjP|`HGK?fzn#Ez7!nows zm4~dH{mV^YzF6yy~y%N@qllp|D<4$ZJKl3SV{{1R{4CxmI_E2>7RyW_yETHNVgO>dakAy_$ zMaOYJ_ZJG2!IP9_AKHZl%m3AZa3%(sC2#2A>dA0Z1|(-@(+x~?ALeC*%yvqgZBW8S zT(rCUALfT!37<+-F>5eWbAF+7Qv~iaT}+6q!$vzw$=6W ze`WFd*Lo7Tj+}Z!3|tl6qy=mU-uKbddeQW4FOYbQ15N{XAM$3T(7Ip4hpCo|eoNQZ z+)ogF>a|wN+*pXGEB66)!H=jjHvU&$HJwMw-JaQa_Wq$@9oHI)(fVTm(-RD$ocKp; z_j;{l({me=(gK$cC=qTCcZOsNt>R8Rg5G#E6KWE2&X`XJ~MjZ17^eZ8V#JHfYQRlJo^&~x?J_F)dDEgPMfREe5 zNM_`i@fVq~^!wDq?(Z5xl$gN8dWQ%UVhNELZmsV+eSDcE?jEWFM2>MA=%%QygWJh= z&-YoV=DfKX)SeRUUw%D_`M5+3U_?BtzCDGAaG)W@9$^u3){RrhDV^@3`WEPj?2U6; zeP@QNbssG{bevXn01wBL9T8xZ>-3W zV{|T%YPZ$EovIymnkd;<<=o3AXs%^frILcPChq?5aaU+H`kkH+f)Wft9RB(D6K-y}! z@Mc7j=pt`D4Oz^OcPP@dRIis4^5Bx{Om}Inbbow6XPRA7HTHctA&)X4)F%N>(B0TG ze|%ot$#Pa4{2DCbrA(EW*ht9hG#84A8wu%x&jSD9*AGjp37e|-D4WYb(}D}@(ic}A zJti-z7}no^)#hyNzF_pewh*_^(suqrvD)C5yPx~w-eAYAf0(a`!1Ddk?|rItJTnl% zQQgpW;qf|c%yKF(ieQBo4RtW9;SP%(xd|eDo4uv1L351%F;NOUdUA|okV`)8G4VR+ z{L_?4mVW;0j-~Y;`yU?)QS2D7BADW82Z$qqA-BWv$hva_X^k?I=c|>cLbxyC4Pp}< zcSnixfc{a>(g*Eqx|^DV+0-R9Mz-c|RKy)h_%=& z3;}WjK+x1fO{dp0jCBBl{W(?D0F$uei#^&=@@BA_zW3YCXb&?2y!!t1ND)nf`F5fB zfZ0+<3rYz+A>c|~#vpoz2tY?Eg}GPdVbbe&8~Fi8Pg~0{RC5eEVLh2Xu+?E}sKVFJ z-Dri|D!-+uwpfEd+w-(^@6%?VzmF~U31}cuq!`Z_wJ$Dzl-w0gs}T8m71tx>^ej0YaCRl(lMH#eDtX*Fqs_xU)rFt zfRiVvh#iw$B(62ra()h*lg6IYh}on^JURtJN`#yu8}gL!x0$|JpT0w5&#%uQ(KxBu zVva!u@t6^j&;%jy2Oo8tru5#85mNlsz+FmpMd;s~1`x-MCPsP+<_~hQxNWi%lH;lX)j610GGwVb* z@ri|?PhX*#!~w-YXnJFC{Y=xBtY~<-TzZ@WnBZWQnM*R3!?UHy8_qKi*MJOg!J7@ z=>1f)xy&64(%1%K%*L&7|4|F?*PIoCN*+_r=1W*9+J#W)%2wHqm5Uq(; z`Xp!|hu^!%m)K7CQWm6|)U73ROW}yc+O@MA+zM$rVl1g@y!+H6<`~rZn8DUxA)V84 zbWN{ACrU4ISdx*jg4}TZ1SPPr{E+Ygix!xMlPH2Vc8uV<2cN1xhk`Yz6Mvc{tGMds)*sR_~>{^EV}cClAN zl%6amTC#hmfAFHI9=vy@gVgfcTJxQ9E0mfa&B5{|I_JVIAD-3UA-Qlj=Lqqr!EB(V zmznUkK?A+gtSa2HKHQ10qg0V37)Vj;1p@3D zdO!%+XF@+62A6CQ>EvRnvNZV*$go;Hd2QqRpp5mGAX?+HzZ;r*h0kluhJM>KWZlph z$?KfMGZt}kx}XPKFr_t_*vbnLn}JY&ay$a;!_<;1r{U<;NI$(q*$gPQyR+_-J3&qd6DiEQA_BmUI2?)#rttkCPrr4eq7~Mc>jO157cbBdr>S!mAha+3{Ac55oNS*yoH)N`ft-UW~_Ij zgr;U=z24^fe0b0Z0KT62DeXm^6&_VXYIpN+CxhEAcF^{@u08GC%r}oV)!2NXl)aZQq^#L0%LcxssJv^8yERAW@xM)& zhmgGpgZ0PG=PeGSP&=n%7)7?+47y{OyG&Hzrx=d0WJpce5y5mhF1$DHDKsSGgDC8V z)fo5dhj>P~TzZ|UeRwaPvLjz0X9tM) zypqrYc7a+)Lyu+liI98i0l!snJtFKeIh$sWT$IG^#D8c26Lj=_z^)|-w18dA@BQa= zo?Fu$a{Q_Nq`uq z6SzkyY;wLemCFe=Ai^}&<@SF%Z`geo)fBnGKSaFQzAaQF#(;?j&JR$SytHc&9hBt#%Ve%kWy$>J0QLO! z9{cqI$!7Mf3422jf7bNgJL}a%7_pc39HKP0*AYMN>NrY!6ql2Pus%6ycK&x*HWhg> z>^5nYZPvh8TlI+Ez&%m5?q*A8l{c^!E0Fwrfjk)L<2$`1am)GeYEpg4oF99T=9kZ<6_55I)4;?|jKa(xxO_lO+M_qTj;)oThMG`O*IZ_|^6 zL5y+bd3SiKBDPo!3$qPrswuz zpG(xlm6U(;F~Gii5*=V6PjS(igOXSeZruszt#kOY7UcjtIB4=*5@u(y;5Bc5#%_I= z%GUrgt>PC3Nx(5@ORSIE$JZ9)w-}!A3;!G3zNmA^pMwur`O&AkYoxx&3eNeqdl`bH zvnY>QcY|UN9>4W2vVRy?`pAUuY-iyUwCNtbWyv}(WB_LNO^|TLTRdqDWuxn)D`aU8 zB)+x@5|U!xIG$(Q4)qUq;J@I22`+#Zk@fKmS@G_abY)zL)~rPAi%PB75sfyL82j{@ zEh6+xOYgQJcKgb(;?DgEU(F7_X@K`y`fv@()^WRl%0MUnF6d@UTZbKkCghsfCzHhn z`@Pw+{g;Rt*EsP@n;4XPhO46e18!J$HSwakb?&;YBm2#}#Kn*INAaZCX%@`>^5F*U zNtZ~paw}IYSv-GnKVzKMb(u%GfBR5JSae_1_}jX4Uq+Ysh#FERqWHtpyu&3{B;r@m z6WIkS|Lga)_FRMgzB`(}pBd6x9$e}=SR59o?zQyVU#R>ZDANnjg$J14Q&1PTyXD@} zO-((scW0ND0(e*E`k=@9I8D5bi+%51WPZyAtsf0g=$9>QR{qO+wC6Gxp&>8+7Gvom zyQlYN0M{B=!3t|f9&oD0 z4MGqc!N^Yqmf%>3rbR-yeuV#DzmrkbXcKI)z|W63vcr}N@U{48x*Q?^BtXJ_}y;9@87|5KQpP3(5kVHL(8{93K_dsElql1on2QJ$res)>ra=yy8X~B`foRc_ zLK##r*^{7*MGZ+T+Ej`EYNbsr5J(LrrcwooGBh@15VIfx24@*mYI%?ZP@O$-dX-p7 z1^}iYe;%Y+Qs+T2kk+iJ+i=mFn|c{+lA2`^BoYi6go4?3(3()H-pCNsYOuiyRv&|G zu_@0TRjOL4%Cp8TLn@mF9ci)FE&~#fRP7jK><9-jn_BU{_*oSsNOB{tv1Ln)P}FaZ zNT~p+wZuC|05G75VE3Rmp<28#w#XI$-F7by>Wtt>g_BwCaIiJ9g4aQneA(Q%X#E@2 zEmSb3lCTKcArDo?+DJY0BC6mwRg5tvh@O;Uswe&i3Stm3EUMs$JSqugkdFougTRX* zQDLA8q_|@f5v2(Kjm1`|80e~$7HQ!i4y3?u6G-w9V-byH2t}s_8CpXO22?l#zJ(T% z0zCzHxT}&H4I)96yN>D0vr1lh?2SAINsyo}y^Ki=A+#XjLjcM&2u;0i+Jpm$Dq+u# zgXZ+oiag$U!-_R37$hQ^`b?>XMHb=ULpu3+uwsA%n(T=6OpqcPqyiFfP_czU?8rk!2A)Fn zNXX<8w9}N1z-~&8){t^qkQji@AO@`1f4`vH3RfuE(kOE(f3lai{NJyY+je(8@U=3uQ#X$=#goxzMi3|E^ z(^0jE$POU@;J^x10qBxhDSEL2fk=)hGa@S%5keI^LW!h>3aoIItcMrD;UqY1%Y%bF z?D%sLF)k+4FiOh>zzS^vs5s_Zta!tYsMZzeu2N$LJmy8bvO|kCB5Att#Tl2P>6#hwC)>#!w-^pH)CG0Vq+@`5@TqnZ6{$3 zGYR7VfCLq0lOYl@DiA`5BZR2r-+&8hArFURLO=>*gfWJ+N^Z@l1v{*@-L9wvI!Fd9 zRNw%IUWBP+jfS7vwxIiO!r_Qk$Hb+E04gYpAd?utf&dQW3wg5|$Qo!zg8H0gUyIn+ z8-%BdMOXo54{Hbqv~Zt6j8G~B8%QMl1pu)DFHNXx;Y?y81r;FgEgYef0U;Cwb4f%6 zgHQ$cZU%sQErMfF!+{lswk|RJ%~w&2M1-`k2~=r84MN;kB{UbPBdCA`95_n_RDc7u z9U(%*KmZQ%M*?E#&}a-8L=dDv!{Hz(M*!#w0>oep6{Id+eMy}fq(!z!L_#e9z#E4D zQi8yUEP@!uctf6K@PMmNVo@^-^vp<$Js&-;8L9Xf}yD1P);#av77~|BS@5z zN{IvkBCH~nqNM1@D3$XFs(4I2S0th)9wZO3h(#4!CI9A4@rBzOG6*YZgqHP;gbIdsguU_YH*ctbk#wT}mN&%c zL>L3HGT7=1;Tl)D&Xulpwd-B++CmAmfUkTV!CM>RfhS}l6jb3wgo+`FC+HI-9#8}= zlw}YP@PG=BO#&$!%Zu2}WR`RA5(84P(^n2e0=(b>u(GL$tv-PkZ{Y=F8v={dnyUru z^wJtUOA>Z&6`8;)ZJLfL35|vV3j>kC8YI9sgSh zybM`#)d=$Bfeb@CgQ((?Z)}h!3wg*<9taYiVvJ#Q*~wkzGLZ)oiV`T$ykjQwLAD&_ zH@^X*RF2S?Q?a&~h?&S|zA+EXn-wiAd6eFb^FX9LWgYRL5=*W`C&qkFC7W5!Xa;}^ zLJ?0ylbHcfh{Q0|FqT748qGW~MjZ;0=z%am4V7TPsGnQ{UO++r%Wp1733k`#N>dpY zwM+G#8`1(d``6E8SaGc*v^ZD~xz}a3^g)IVPUE*v7HQd?1WXMUrvrG^MAfeqr=mZ(+K;}Bk8svJ> z!eNcUi&P-t7$iNRrDed2P^e)c>wW_-j5cN<2=N#umcf_{!hkx!f)|TeHyJE~W*Ho# z6SJkRG2#@pQ3mMXQ3fgyjsb;GXeSjB$^$RzPzPEB6W<*Fpml`Cl7}u0!p%tMfEu(= z7Yn2t-#{?N#*LARO3=d3Nw$jx77+?wkUHc5;HA@tYym$TBNUxzbRCdjSs`1bI*8$XD*A3VmWKL{*Tv~CMD+4V_Vyypu7h5U^g$PTn?p8#vFIjJBp zWLN_kke__zFQ56zhrTiEeG5`>O#Gn50 zbKkh%SO5D}K>nt_=@@lQ2*GE z|J1Jl?e75tu=<#Y`lPP~8qfjDkN&>L7-UEV$bc9BDq;FGZ~~*x11kXzh++CRfeU0o zSs2g&DG>cmKnC(G6#O7$e!vP+0samU162Tvc7PXD01o`%)fi9$weJDF&-(lTmw2HO z$bc9&AQg(>{en;hii8*hLI%j75nQbj$lwGv@c$^#{lri^4&n!RAq!D({#1Yq8Ub^P z;0>84`~Z-zXaTkW;0}M_46pA1rJy<_!VYdq51mkZc8k6MU;}vJ1ha4dyw48&fM<@6 zf#8e=JFpRA2Mi&o5>#Xp;J^y%LXQ+N`gnmDUhBoUzz$r^7?{xdD3J>y#kRMusTr7=m6ev2 zbsBIgGb=SK>vRfjva-UmvQ8)deSgFEci;De`+xP|e%8LYV6%9C*4pc}-mJa(z#=3x z*vp$^4lzc4f&6PjZ8@5A(`ucq&MV~^*L{%Fm%3bCU3ZQ|t}n@I>S{DEL-v;&nQX;m zT{dZaZku(+fUp5vasI9JuE=L6Ee;F$`1zmcCQ9j#8=gj4TU&e8>gLI_@s)R$ z?@Ty(hN^mV72*mx_n__G^ZV^xM*~_O*B{?48d&)L%llJO@?}+JT3T9AGiflX$tBnF z_z%j~vK{NLf85S;zw~8A!pV@Ld!~E;TGTY{m2{Rk{pH1y5@uUT%H4du8iknJ^0xf0 z&+zc@y}{PokH@Qm*5?jV=+#%gw4KR08+_==_V*ub_SWy-H=H&_Kpwu_6c!fdmE*eh zKp&&Qtm?_vqPrgA{tz2sJ9U+=O%bW$&XSwYuC~lAxch0a>(#ER$2PZ4q(A?D!@33; zy31$ZKG&|A!qaJG5xYpGXUj>8b$JK3C3Jh7{hN0CYv-=Gg*l!J*wUqm=WP7_{XL3E z>jxGu>7Z;bEd17c>Ec|;nJ-k`oi_}!acTR~lFT%U+x?U)V%2JO;gRIQu2$ZF)lrpG z*=VYD4sq*ko0qR%)}%(ZOxs?#-+ktG$H|wu=NgOej{jAEWp~yU>jf2eTltw0E0%>G zGRQvdbm*-^`PGzTDt7B#$@<2GdG(jcIi+2#=HeRL?h3<0H(GO@O?Ex9N$g%QzxP4; zVNt}n4`05lXgYD~$>i>}XCHW#kYo1y!nMJ@Pn?e_qa1UqPh35*ee6@5l==1hdk@(Y z4FBxlshXUmSb8h9;rcVo;dk%8PoRUqpB-sE)*9PRb=gOH^5lv1-q!x>eL0cj!rRWn z>U}jYsiM0!=je`mFIPW%JW{Erbw*8||9ms1&8GFOU39g}B}Mh+Lt8nzKto z-99$EP|CX}*B!A9JFdU3-|l)xIitj{L75tn5CJ&9Y_s@20kVN%rC_(&Exkdw#x`RKbipUYX3m6}IRPFj_NVxF$D)o0qX+ zJ^5eta*{V}%JVZb`&UE%-u|m|9PYmxTEEfpKRW8TX2UwCd=A&i*^%b-@0x!G`u;5R z3CK<5C}Iy&Rlr4zAA2Xzu@l>f-%h;s1;1zruZ; z{srQH0rMZ!|JA4eqx}C5Sjw7z^WtvG&Hj&JNm=8Rnw`2Xb$#B(pUj;9cV;PTe9|`L zuH)n_%2>x)o9eVSBhA<8e+vJv$M>H{{nHjdZRzxHU;g)@|9dF^pX~e(_x~r=|7WGY z8~G);zj6J>^-BbPN&MSgzj6H%fnO5;cGquQzeM1d#J}D38`m!p_$Bdgcm2loO9XyN z{M%i>as3j3UlRXz*Kb_EMBtaizuom4*Dn$HCGl@}{l@i61b#{U+g-nL{Stv+690DB zZ(P4b;FrX|-Sr#SFA?}9@o#ti#`Q}Ceo6e>UB7Yt5`kY5|901JT)#x%m&Cu_^&8hO z5%?wXZ+HF1^-BbPN&MSgzj6H%fnO5;cGquQzeM1d#Q#@!Vg6^ON9y{Y%R9FGT*m=b z|M=(o-`~E@fBF1r?&F79)%$mEXWqPiHU09%^Jh<|CY4Vf|Mlq4hYu$1-@7}0XKZxj z_N|-4H-@ecUb{Nb-`CrtxN`Z@#Xl~b?>=|-OxNjCogF7n9B)5%^hn#`)i0?OYHO;i_Et*v?A}#TUREkDDJ~KT1$^Gl9ox5UEiB02vUyY9#@rn4hV|>R zvobT%*QTYWtV!muS0}AXT$!*UetBH%vZXQ6tR+#A5#eE>%#h%qzyO9neeohcUx<&l zm#2rjo2!d6&B@Wh-pFeq0XloG(ns}TB7K2715pWO& zKp_yyR}hMXs3G?MS{C-N1!54C8lpxUGbQ9E8eH2pagZxRJ6airHO@Pk1(g=MtiLeW zIkngFcy^azo1z%!XM(Mlm1t_&#Zm3<<*yKihw*!BM-C#7Sld-DS}}Q0|MZ$&mh%bU z9`zqxd%MNGEGav7jWDJz1ecS6iS-|{G$LD?+*pROIuZIwdA>Vz39dGDz;V(n)jDxo zL)`gLIV zG+8$<_tJ_xh;Vn^mi)0)@Veumh2{=o{k0ShLSNgft)QyE(tKGobs$Q|i1f~4gXzW6 zw3NFKMUMG-F~Yz*Mqy@w<7%S=ZN3LoW~OaBmFqp7i^jWPTLZpB3uiw`pYEi;+GQ1a zUv|2Lh`GMyy8Wo->;g*-j|nC0@g?~#5BWux+nZqMgMT^2B?2ZQb;cCgl9JgwY56eT zxtRE#n6kv$ZrG(<>va3_X0b)>e7H^O#hg+%>$zZpHboj;?2(%Ip?sHT?R>CJ9kpPW z+Zfp`1vOfo8%gzbJpZ`v%|9;K>UW7TLqM!vzsP8|jacS09k>zLo)@g2=4O|;ahF|J z_f$YVXi4*LC_KRmbK7JU_C!9~wvie=4pgyvM6txWS0 zw>5176C`E2;92Fve6`OFQRgkKFzOzL?KRRxYM{ok>BNJ$vaT_oH=>ZFk8O6tyDN)N z_D{HK`j}{~oDoGQF|ZDc0!I`;Zj#uhcr+L#WgVJsk;whul$2> z>lz(K9_6XkLLuN|FAs=0u2Ag(vg~Ka5LvD~L$3-tqge}svO7TBIK?0U# zZp@4OfFP+t?T)3N9x^oNn6#RvI}OBO7GNHj}HZ0N$# zG7VCXsm2O{VaI53l$+SMR1s`k&lhXp2_)MJAy!99K(-##7PCfn4lQl+a5Kk$Z$k>z zZp1wv{r<%tM;hoJqloOhX3f8;>)JQ2{ML|yyN(guFmzY&kO~1!8jGCQ`wcXgJ zY80~N!$hh1ho^fem=-T;w8*oJ>4%tsx%W;AwCxo-D8*j4Hln7dai^vN5?%UOY7T^1 zqxaM4S|%${?rpEZB^@QiJrg0Hz9V;R7bC^@0v13;3|)8bJ@gbsvO2o2BqR`&5*{D| z2@+mjeGvpx$#*Bomz(~LG*4GR11;c2vy#z5uZdz0>PP4)TbM(0v|8xi2COg9wsf!W z1Ov&FOXns->|Psaej5xk>Y@eNQ4gQl+0~27lp)-^azw&HjM0M5!-pkwIiY(BB%{s! z6Z~OY$q?v3p|HZIbC0Fs&eBwZ!qkg*bPqF#{OOs({ZX|2k^z{}_GwYbC!I3CHUa4( zD`)|`PO{yXV@m11duBIHZf?v!!dLOJAFOP6S{8c2(rczu&+$+ceF^tcv1?AO*t;zm z_ad)o1sV``6`LC`N=IGy>qi8pp3vGjU%9V0*Cm!!3W9BNbu*?jh%4cVjM+*oNeXJduT0ZOhmo#Og~SR7 zsyKpeY%C7Jr&WSlvjpL?2+_{nH0;tAU6=t2<$HCqSoeGMuKKnRf`Hr*=!-faLX{9B zIAuF0c-rcT5Y&&OMN#JbMHItPLV(3mD0NK|3Ki&;+@Q#jnhob&{UpeHYmxH}a&$Qk zY5Rk}R>OEDmMIpT+IZGmlx8r zG$K=Ldl!XA?`GiX@nWJC4GIQw7-ccl72p1`&WKN@^mmU}66(1nw|Y&AI;3t&dxG!x z*N38QkG6AP@7^qpFkG!>Gchb8zz}^;un>D6e?;7{KQzDq2L+v9a4=iCVR82v_bdT< z#m)n^N^Fk^zj-})_QKuc4=#W=;l-zR9zHz+_wE59If8=kpQ2k){U-6-1^z9QOM(~2 z!o~_qa;U<3=3&2>7K&|Uf zRT)>+5%ngns~6EY7n;6XS+1D>zPNBD;2;A??ZRS8iwd+z@0sto&7fAZfLN~*a8eE_ z_1AQ#1DXV2>j=@9fWNQMT*U)@s!=Nx&~OP@V4*4MlC|L6B3id3(+0a?nhgWi3mn(*q{35b5(+1l6SULt>yl zH0&xtCd14sBT{+foy)A9x7ZD-pe97bEDsbBFk7T%&LO}R$Oid{Lw|{2R?UM)vTqrfE{==P4=iyCj>RiLQ`nOb{);O4#aZ4;WmZA=1wS20<)7LD6$wd5qpLR>|D0i zk_Eg{AfKpkot5~!efVk>Bt(`udWzsE2}xC9yC=z9gF2E9bBhf=l!u?D3o*|41aex_ z3$nqo%;6s7lmsWWiJGRRW1<1E3~om-hxd~^Dfn7+#vudd1_FFqmYFiInbU#XO2} zK#gV56v;ZfY0LVStk-IPYhVO_LWRMRag!Ygm_M$Dg^uQK7|O67E~tBI5Otc4wR*{o z4Im7b7I*HYj&TlTcW-$3!FotlFMHVpu{F1gw|;V7fYh}tAGA-dA@s}OH8Mo1GB$*~ z)a3($Xej@F&-w&AcPXEqMHpD)UMn$A z6}vJS8mG=%%IS7aB@U{q4h;j?I4OZnOW&!B|I-W-9U|W@Sh<5y1^R0g9oE>}62FMt zuvN9(5ayW6bH>t$3sg{HtH#2mE_t>%oWyxp3p!0B(g_v)ymImVFA(K zG-XP_k*)bzu?-`KzsoWcHLgu&;q(FD|( z3UkSp80w5`q2Wj>P%cEbNc_5c77%2PV;#tTdi$KMo|L{5UJad-!3NYcTmuh7`2ex8 zvzex83P%XB{+h>?DBpR|jSV$YCD^AQco>7>%cO4AghG~48V|&28SU&Rx4u}vh=F34 z=fP*;N9n<@JA+>k>spKbqs%CgXOKe3ae#c_{bl~PY4SM7j8?rrtY(>KK2%|Kkk0OyKN5h~dU*o?bPHWBC&U%_oB`w;JBC1c4levC&YO*BrJ+X2kauiM zdAFPW8b|+y1PVEAl#Nc1LDM1N2U>qR4l?Gd0GT3grMTukSZl`vQEp2=k2D{#qhj@ zvzjOy_F*CHZ#EFF(rJ}y@jh+~>#UT2tg`VYdXRMtzUnMGuPue>|6xyrKhRn>qGOby zZ`Y~a)u`3T(^*q_!tBpm4p5Xa>n4T|doqAl*`ILi7_Jne+h`}|5(&mi#5h~?I8W1v zu9-!Ef0DpH%W90+X~_nf!SrLe9%!nL=C{*`2S?CPWawzw;$>`2Z-~YwJpj^9aHQkf zc;FRzqTZ*&i%jrY3%DcCDppjbnpv4my|s9G%8T(4j$%k6-P-c3pRchCj@j0Nuzf54*#>V1#?iE5ANq|C;<4 zj)>qBphCnE%hON7?m&pNd~LagNa5nSW+mbT9!HxT>Oh`gJ;KOW?LUWloSe{Dq7;?c z;uMu8v!EB`SR)x^$dGShR~yTbH09JA(y%_o1Ji@P!}Ct!z`i%?SX?G_vVa4=1jh_X z{AW$VD;*!QZqG7;B@JOIIV%6Cb4R(_r&GI~UJZ*r0Y(E`xzK$cg!_+l%z3(|M<7ug zU!VudYB;W@!!B{5>u;f>Mqx1uc6*1mAJ<#bkqXG+iF=Rs#9&SkUaV&8N2#NqlV0gW zuQ>Xr%gGrwe8XMr=aH09H2P_prjM#>j;(1-bNgygVyTS1LcpZ)0zPwJF67izLr{5- zUq0|YpKS_oq6kaa@CPi!+hxIaJiMg}q|nh%2;h_izeIs9GpJV$K|k6OsLi0)IQmEj zFhw_>BGl!4g{0EZysshh>rmq_n)+Pmx@1ICEqJi_t}gZU{4`C@RT3G?la4+meUI57yy2sR-=W8EphPVI%2W_+MNQPrKlyTgy1 ziqo_|jCisSH)4aQYVP-0j6InTe87MF@Th&Pk(F~Nq)5* z$qTeLK6Gde53%|iX`jF>L;_2v!FXKg4B=(fZLI5v`9LqXmff*LHlHf%tzv(DDg&z) zf4ww}Av+SUkBCsI5}p#&Bvp&B)c z4NmJEm$|GBp6|G}{}{>}osfH%_^PCSO}pXqX=jGe8JAL+=ko!5xN*shf&ZIc(_Mz< z-ZngayP3obu=2YmrO0LN@v_U?MzQ8aSih**7DWST_R4@cv5#rI;={Ab)xn9IeFVAj z@Xp%lHvU=*ySN5Xw$=P0=?RB!y1jhr{DivJ;bxhC@TDWtEW%Cls}UR;bbKNUTxuG< z=9AvG0kVGrkny?pW%wLh)^6=%aewZjoqp6m=bG}b&AuKTdyc(yZ)Mr&%2Q3ICmhIS z(W9~=!*>@PyZW~Zn*O3ItQVm&WhL(0$UO%|x<9X=oip23KweRpL}_mZ{PlwaAK36lzfml(>YEgwzwUZLd;_^cIjgdqW?i znnR7A@OXh?r>?)y>f%w$5#%s>AkN}({!?g9V^`TBnjA=`}7t77Y5TZ(Amlz$4` zy{*M!N!Uns%o684-J)9UC~}&Gxw?5W2p0CdoqN@`c`Q z{z1E_hTG{8p%jNR(OZ0c{P*i6kV;9cp#6vL#YEQ3#nBFOWfFMxzJuTlYHy8UbSPOK zP1}%qc9eP|Bg8P``A{hdueS?Wkzy2E6_$GDd`j%{793V{ML>73(Wb2ZK`T-#FJ0Zw zNHnOcJ5N>0_GW!vRkv#AgS%D-H&6RBQUtykOZrtj--Qo=KnXhjcoQ};&sh};@~C`!V&F^4NqL#*PX zokr=9_++u1FV$Qm71m{?^L3pxSaR|ppT44qgb{N@#5btd<*>}?jb$}=$a}I&uiIQJ z#|$Hfc%`Nh6OAV{5M%cCe!`4TPGu^Y+zp#ZxhB50mB$eE=)J`jX5isZY_md`}NcWlb%3i>vRlQ4Bn+aQu zoWHs!0%_7h>jB@txX#fPv`*;pd(VczW|a_3UoTpt zjbgf61zOd1fHwKP=#Yv@g7;)8sb6VIks=}JQ&tfyuNNeTgUf3>+i zn=?q)2s7l<6^ol>W!_vmuK7ZU#%ARZy>M*zmTa?Y&&azFiAumnS#6lhLS%ZVbC7)& zFP!%j+_ZXZu2Uo>IVGyV^dAA5>*rJPUHo=-eYEtQ+Zr7}&mlu6d5ifd47qIuLd%#B zMt6rSoP5>KGo`TgNp)`TytQKI$2dP`)&~Bw0z25k27-c;;9hdKn43AM9CB}n~#-V52x&@0l93UZy zShZPUp|?(P40s_ybYJJ&l*)O;BxmQ0x#5nJ`Ec`ixzK|ohpOjdkWs3=?$MW%6O9J! zFL?}MlW49$!k}f+>+?1KE8-3s{x#iy72$qJ$IKar8nBbygCuEePOkrp8krDVykW|+ zYRWit=}TIoc{ka*L5W2&&OJJ>L$kJLDW22nF6^Z8&gXUZY&v6S@W$uRAJWrME4^dF zD;oWXaB`$kw*UF>@-MCr{$bd~^OH>4b6jK6CpYT#i{l!dwoN|m*QXwYMCkMtVNVr( zZ#^so95|P%hyoy<3_7BEdJ~ll%|adro;Q!h?i$vwRlsL2NQf~KL7rZJ{MLy8m(R+6 zLp_V$7xo-oH}-&F>`PI>M1Uf{6S=sHy~ktFY3CA!8e(}$f&OQz&vZq+zpt4{KQ`UJ zhNN(^^2*U%q=KSJ@qJod*%%88D3k)}TuLHpy0??j8=@Fy7lum$2fyN&)Qwt?>40P= z$MGyH$a-9bh)fsYvI+dgKN4RCig~zg%wAX^9mNpwjwMfC!#s+ZX6Vr29T=Z*kHbq=8a@)@Web(i{F z%1+B_js_qvN%_$;{0QZQoWVG5csDyun4ve)Gy#BhMVm=II_hZH;;MnyF#|rar$>Ur zt?xk?@i$G2y!_2$E7z~9EL(Bp!)JT-2_ml4=BfGU{5AcE93VV`9ZgwP_s64HyLBjq ziRk7R-xn&)m2A510(y`yK~`My^;qJ#n@KCQO4ZA{F!#Ly|5n{XmZ_j zNQOw7wl^el(KjA-A_aH)bu$Lr?NHH(o?RA(f0sd=qR4K`18c2LZ*O;d=+lKrG$)K( zp$OYpV!w<3fNQ!PZqgQhJ?BZrjZ#HEy{F3Hv>lqu3Vfd(axNHKcs$eLOkjLEq-OKH z;^Zb44aN3 zeyIdjD!}v+XC}c3MnIOb1mV%eeklI6XvM1n&B75FY##SshJ3<;gh`9S=UX=`=*juC z!#qTxHgIWr34@6Y!=V8{$ zinS+TnLyMA8aQDH>L&m6>wg`%1_>BMoBk`}#7QvJebII`4 zOh~#4zIq-BBf}q*nv8iZh*7~G%)xIPLrrLqSM?fkkOMCjBK7zjoT3oDjJHpx<6cfj zGTVyp&Ecm~;5X$OR^hjvD4>rcqT(hrjHOY`HfTB`czzqY+<(<}TTj zVCkuiv=|g*wiVkC@;4}9o73Tx{N1s%BHgwwP=<|)FCy?xd3w1m;_>qGc^i1qixfPK zL5Q(ffFz7+vjO7?d8`uYU+$KZ-$mv{4dIo&np?3k5(5Gz!P2J4Jd0gO4Rt+pq^RSvuV7)C?7$#x1j# zLOiOh*C}F4m+IwXi}S$H*mAn?JWA*rr&0i=>j}^N?_oPAcvAkx0+YG3qzFUT|8}YzacCMZ?bULL)G| zyWu$G>gtx#KcI0|BoW^r+ypuPZoqZ+<>v_i>t}M81f6babQ*z~nuz-%7Wt8* zpTp#5j#oH*1G<86Hmcq8@#g7mh_N=ryu9Ll3vx_3>cl>vayA`jpE9o6tvV9*&y?wn z35{nFQBja3hL{C5N6X5-DQjOTbM{oBPTdK%L^Pn1YfGHMv zh&8s-K_j;gH9SN3r%BKIb_7m_*h+ZR2!ZcVmShqLujNSBHl%C3V0b&;myWx-v^t4YU8Lergb z%#uPvi3=TRKEh+7%9&)XJSxn#=d_F6nAw1<*NtKq6nHo{?(j6YLyTN_NXu-OlCY?X zoX;z4Qvx2qGjmkb{Aj+y)o*e&@kenX3ZQX>=H10W6OwO?x*8~o9Xk_4sX|#*g+$+_ zqe{3;A(Ld1NfK(aEIn@wAjy-yf5kXHAKiYIaTP)gdJ@wJtC@?9)cz@vzF5iomYy&(mOliGY>0{jdn(iPat6=Gz?<$ z;+sH2FX+Y4fex~hpS1Yq15v*f%4S43oFvSk-+tAOg-wVc<(K(NQ2l3#({%Q2d^zoJ z7=?+@bcgs#i7r7u}ZX~AW5>sFy5hEu%2#T{IV zQsg2nN$~=gkW`3LBugoJfhVf2mpVbf>J^56O93Q{}0jQ&-iUq zJkG8XEd|UbUKk$_^?54Hqw<|bh*|{@3)auE5xSG!Hgch!v}efmqh?nEBgKH<*3%2k z!NW&Q4l6}!4e^L)Jb#5(Q1Bg*_fr_Ltt9S_$f6ruN(QasVeYVzd}$HmAm}lu?fRq3 zXXRN>X%P#Bo|pvjT$ujlr<*^zvxH|D=agJ&N!4|%=czmEp1QAYm}9`Su|Mi}8KLRv zbCECeB2{y%-*mC``}{hlw@Za+)m|4x?D{nxey(}kgAXbpMayNIEIKxA>Dk0u9t)LO zmpg(g4;yE6(kVu8aH>xLgUpYK7W{z944lXEK0w(Vki|D`bp@@K)8c8L6$ zC3Q{@2aWWXE3Wh7VFwx>RIDpas~BW;!@|2^rSeNHYs%nE1)l)9Uw)%aDVC-m2}g%t z`7p8M`$K-WkUk+qF@=7l`=Sf>Wl6l28?RT(d(T6F)St6ps8E}1&(`@WU*V9Eeo=Dh z147kvWh=buQepk|*Y&89%?jI#q>TbDl&*wd&g6MRL`XQCKDcq5#nTc0`63+RPnx-* zE&(S*HmgsZC7~SWe_m6cyh-ec?FrB8slmJ}O0c(Rkrxw4d z)p*uq`g(-~6#J`l4}h{C=ko=IGUty^AX!w_!wsep)6lGu@CzMq&wRmSIBMIxJv(M( zunKPizzsWEZx37%Ygzv&KXfSOqLz`zSXRx+rZd6!GP@p*gsnapY-wvLW6p*iCfLRK zmRdd!FD)$nP&9rm2wGQtZ$xf4JCGU(kZXYev#3PBoNX;1-EwcO%JkD;HY6+;!2&c$q z8`rG94UZ*c=pQ|HVl~8IwAu1;`wC{+{3ny|D(;lU3EeWT;QnI$;QEDon%{2QJJ;uV zdhOziUg&l5YIiRpb(>s|@~Gc+=Z_u?^WtdJ)&~PylE`C$<$H$6>u_%=gIr>jj3lrs~U#GdG4(9WDxV$d27|1W-3EZZ6Zi(0y>> znqe;@`65BfAMJ%9L&_X|3LfvSv!F)8M6^z3AiaXmQ@fP+AH3?$aWt^n$GP17)LqUD zI7G}OQFaBEi?mu@ypq-gk&EV8OzOL5uY^9Y6QAy0`1Q<)VqGw#M-;f4sa
          Q#B)e zGCmu$E)2)e+cfzVqYP|D%dDl74NC`0_++EqV;4;LX4_tHA~Y48Cgi5auMdur*MB%&`6mi2!w!ATa-wn+$_Yi|Hp-M4ovZ;P9Pj#Y zM?u`)gYjF&`vBFZDLO)(2UtDK0ku7aptcAf?m(Hh(;1q66~ioNeThs1t>4hmiy6Yu zniY!G3SYNjBSPeDM98OOJb?Cejq4&GR_Ev)z;6~D`C9;#-NEJnLs}koVCgQ|^o=0< z{j7kXaezb6)N+i#h1#ti*3m>JD#IhK_xG0usC7(P_V67!CA+^ zxpU1q#Ri%Eeb+pV;}68uXkTFG#Z#-*^LD2~uEWk+Gq!&#S?5s>VQb@)XcRrQLg9rX0-54>jHe4L zP$TyjPj*}Byk*t;pk~Xghs|}mP*5a;C(_+@(vLqH_~YTy9;|HuUPKic(tlgPXe< z218tbdoTV4F^zBN(J$9|qT+Kqa){;?QT4zi#vEU2mfAJxzMBi;f;hyt*b+-O3rIp& z0De`wc~CEb!H~Q{71;NAO^|jkYlRT1zg=&QGH&uVkeDm9y)BJ zL=5QxgUQ)ujp87?@E0fJ+BvwNzwrxAA3@ZNb+vk|O1QV)mbg;YRpX&#godZVv^$c~ zn2`WnrlKnzawvr(1eeKeHH_LRM5z-$ZZ#U*rx1w@6zk|k9DX|t>;Y7$8ON-uiWJ# zVrzbs4Z1%ZEnl>)F0X+TpjAIwGWX)F>8s}<39R_yte-iBn|qmV&1xdx;Fj+i3JG4o zMlAeMrU16Hml(V_jSTPlyuh9J9JrKBVRu2-%+W=taXVl~ya(DMUqO6vP$PV}52w9? zjT+)zwdm?OwP%$e!3XNvae^Q;7BSdRpecg|4kN4kp0?K!{ zdD^FqhPg8cKj-8OICr@pIbA(~8jl`TJ4at~o1xW?3gXK3No0r8%8g?(Z4AsMoYq^{l* z?bAh?WNf?m?b21}hljd@v$I^?xJO1F)Cd;4Q7b}o@si#yzFX14=}?_i14)?#e3!3)5B%B;XJyg2~(b&4S%DR$>yDpT4VUbg@3cX zOmpippQG-oIvr5m#ndp=+VuXul?EGP6QLF!ucWW@|C}VOpUKj;k`|*iMueu@0IlHo zzG+=HBqC9l*rpI(R`HP96}+=nvJiVM4hBX)_~qx@)sIKibci2MT0#fSMojO~duV?t;C|~(oA9|41*bRQ<@OE4@Bv|X`33H~zQmbt~#+OGddZmA2 zW7Dx4I>*_VXZ2>_z+tAv{LOR=f17x|u5r)KS?JDEq1Ge5O*Qo0OpmcIKfJ&9^QPX2 zYM@QpYuQo<6h;-62G~>s4(V(vvG;tC$bro8?T1kwK^+qN&{Vz`2z}Xjzn}=v%4bok z8I(rI-;pBX9PUvyUyG{lagylooL$aN6lf*(8g&QQH1e*72HN{ZV_UCjr}gE_?`t7` zW*GUpiM{rOUQ#1uCKNQSAU)D3(bWhsYah@*F<_6X+-(f))L~defaWsBi#C6)bYWIX z0K1|t(>U1!Y}VE31?ClMXW)(KmQ#9wM<9}tJ4wkbCInrx90AOIrUC;2R1a=XAW|z{ z;Of;!PE`D;jM7RGCRh8*=jqt$UUiUwI3Y2tp0b}C)%ZT8(b8=D1F(NsuX8Jm^$(0N zJ#{d4&?y3-c=b6s_G-j4bOMp`c5RdMpl|#FX*GX$dLL2IZ1cU@J*xM|D>1UB*LWAy zeS7&QzIx0;^wg=*jHcCV_c~fy&9>bIt?dR0vR+>TgE}L21DT%KnDn=OC;VJ=3 z7TyAJ7SaDEq!`3A-0=)r%u@|%FZL_%Ca%%g;%T6Y0VDNzi~^Jye=4`dvKnxT2dvP4 zj@}$ySUh0da>w^#FKJ#ulE{L`o}n)a=%Ly*gZ{c^@S`(TE)_k-k>#$WzkGwVYqs6N zuYcr2DOqAw-_{L;h6#u(Ey*~nH0SY+ji4rc${wA4#|3mwe{lJ%s_41n{=r3_2@q9YzP7ba-;iv zmmMB|>#z4{xlTkcF}-&s`2jH^TB|!i&sci-5!6g2wClBgJF|!LJ&Hn_xa{^2Q*nD` zVz3|is#9Ws-r(}fY`R_>fA0Isl@Ssvw>BFRv@ojQRwY~?QOSv?^6(`d-2vMs%dwB{ z+beH#M(|nP!SzfbaRz6G5{r{Uk^@U1RKD>%Z`agxp)bASwOW#u9zYp{COpR4iuRE4 z8C$!q+H-@b77zD6EGM%1P#jbp9=SZC*TRD7{a3itqjbZZS5Ds;Gu>PrXLwk2ojFySY8jIi1-f1wUi14iX@=S zC0#+m49QTqJrkt$TmkI+JhJ=t0+&gEAq{FMf@)9m`_km^?ioeNB~7x z>-8r4$XB{SiK`;f{+gm9^u_kDBiZpN{)J}yTS-Svl{^BgpM!?pJTcBt_GwMm;HdqK z?@umMA-CzeoL3OMDvp5?=~O7jx_TLnx{Ea8Hu@aLgX=CUA%8B5RDP;i{fch)C_Db= z5`k#Y$7lVZy8Z3w?sbfAI-^42RzcTP!tlO)#Itbw2!%EZ zX65TJ`jBTZLT89|t-90#Yy<>3eLOq@V%83^W%1$F>+K-PX0+w6reId-bOT-#szoPe zq7US))=KC3rSNEh0#rWUh|H%k`Lu}ugK3Ed<5>7afOW?$r)NvpB>Y>QJ(FUHzL`H+ z+UrYxADF&i$3Frq3#er~{H@r@XlBWdRein?N=&!nGklQOQC!r!o0EOjNr4Ku`R;S+ zp1F(ExBa)iFQWg05V#P8Gr{1O*G`p&!87(9>XswbiQ36OV90)$ZN=_?rqe4g`$ICS zK8JNINKo0kZ2(RO^Ql+O45N`t6dxWF@T&m*AGeJ1-|MUxv>bP8&Zs&R10wSP+YXgw zJl}&30jt%!^JANJzXM>!q$p?TBHynwhZG0m*Zz^rVO zS=aW1TA7)lSy{J%T4u{@+onH$=Ww3GU%)whpYi>?U!T{<&SMydgghL6%Zxz~w=$ej zFB3!~Y@?8dbkm7sPWAO}oFJY)BSR-(TahwzB&V6s(~F2J%%SZ!U33fCqV4z;$p+y z#gOU02H8>E#Fy@D)6Z85rKEQRC!K^V;aL9~1HZ-iWA~C8tq4G>b>r%*>ieg*!R~c| zZj2XR>p$P_e>z|fIH@`KRw#Tn1$AVa|QYC4SE z)@9o9nE-XqDMzrx_ZOuC?$UK!3EY(dlBySy2whfBgc~x#gFka}0w(jbjK~ZC-r?-f zw7bBVyGS65D>$i#y+MM&i@T_WOJ+ zg#1s*YQ)y`lr>_eQ@fqlbXQ25Yebv4l2`U89&VbrarLF}mJb|!(Hz&2$N1Ka+}5Lo zPX8bb`vQ;tbESHOar3Pe$S5phA+KgL+`oapQ?KNvlH`Eb=dRdz8jbhJAsMooY;v%# z3Z4PdM{c_fDjbr5;nb)?-x5GtLYBp&32O4&+&5SAmn`oWhHZu+VASDbD#uy0UC?|UhW6_Y0q(uF8F-8 z=en$R_umpn4~{+z&HFdTfE(@t70=yP7tDAH?=%eQ1Pzjl{lL5{tQq)>@{_aN zVID;9P?CdHOF#F2wZ6TOOFRKHm7Kgr500?s_Hnw+6N;a4-Nwn`OP(xS(mM>K z{TJh(1-xa$9Sb@0Cn3LjYx_bOkusM!z2j;EA{0cJiZ2q4y3ISf{L;5xjJ*`<{$Tzi z15*iyNSO5q(@H`+fwxho4B9mK9)z=dnn1^<7sH3Kax*^1NCJO==eoVKnG^$tpQTqu z!s(kJ^DHj0heIpeVJ7K{JOQ&F{_2H&xaGlZ(`n2EU~ABeS7}woTeuxWY6JxH?-*xFFqeorOoWkQ+HJZThF{GErORqJVysi1oltf(OFpQ zqsO$GffWs17NTCpVBC{A%O;!3Dw1FxkUF5AQ|OeJ%P^lTL!;6)lNL#4u^iH&*Y@CE zlM>F(09&u7tz14ZS_bBS<87WP2N-+R7i7{!J^Gl&wfr&tz)gEl@@y5NOp)D!>T@%i z8(|N)tBPH!y{%JcX}e|i>*Ab-THKI$+e=8NeuQh2#HF9+Q5)q9LQPok_?c_L6ibjl zGe;rRL~NRHc3Xmn%lVWO@}2bZh8mMM!?y-I+ZM5FX0N*AvpIYGGD`R+c%wFj9zRX? zkW`$}+^nfK`QY>M&Hesrb7^KWV|`p(P(bLwr!(biZyoS>A^i3F*sP`{v~Ggw&=$Gf z$N%dDUofm>_oLRDdbEJ!HinB$`P&A6++7*6az5rFz?FKfiu{Tn%NE^5bzD#eD&fg2 z6Xy^mn2|PjcTU>v-QH^-T;8*3?cD?HGLw^AZcWzQZ{xFn-$lA5HgXmZj_x(y^>;Ai z=&2_suIe6me6wj-U*n$26r5<>nApUK%O<*fyf%O3<%F-}3%<{by?VssOvzn& zF7G`0hi2uLeWn|qmy8~szi3Iwl9-&u*=H-F&rH2L(^zWU+a^e$Vn=wP$`*rU{@1)iG_GRv_FjE4M(H`^Lcz8+;;Myc-2 zYR1&&gO-$QxS?)F`-S=2^XZycW3D29T#Atx#am`S~Y|qI< zyA4|^{Pv1%iB3%`P0EdYBgb&BWQNYW65**(HBj#tiYs+~_Ol4x8C0`L7%^O&wTp zLvqB|u3Qy6dgsaX!;YH33xe_OK@%s+5CxNh7czOABo#GHiKIvF{5*1armz@k6B!8h ztU&!*k*UH*>`}S=E=-zml_|~bX#ePTwL*(ILDTH*vI0}GLH1g^l0!u ziMCrLWTB*@pd{b@d_|Rc`f?6-PwLcOmTAZbG}{pSVzbv| zAK4!|Q88n8;F8Ij*NqF>RJ)l+eqFb+=@R|2vuG^k((`>7H3psuqB0umJLMG?gB%Ip z9@+xyI(QPcyUS>?{EPcz1xvs|;3B*)%=PF+fbHiW(VqYe*~srT)) z_spKZ4=kK4+0Dc6eX`DzOA$rB9sl*=7N%qHutP@AxAOI|nK}+#c)0pr!Pn~_uFmPb zYv0!v#Wn&FA}rfj^!9nppKmIcP#w|uGM6b#0c!w`@mGBdo+iLb=^+XnI>jVLa-ty#(ZilTM|Nf<7RD zBp0GSgpV1Y5oqicx~&e&{$GIT{yRiOu`Dk$?-O2kUzu$(KTsCn*+y9Z=r}`PMsXWx z+wRkETf}KX+5BvqA4Y3|g{4bkXA@}HkHj9M(}3*csoERhLZ2di|GGb#3Om+hPni=b$JUmSIV4TZ)8dZ;$ECsYOZWV<*_y#V0<}u6#b^Wu-$bjkbg5 zV0#>PDv21QaXVJ$%aCd{ZPCSWpgB2;A<+>UJ8j`%tP+ItC~0Njl-*@4+spkW&8EYy zZa{n_Dt2cn)+i;~s!SAworT z>b{Tej$S68yz(W3D~UiVvctcoI>(V_@v_bBv2-UY`JJ(oM))|=u{|X#g{aa<;h%-) zq>cT4>ja2J3sPqh=RKsx^AKC|s!Y*=NA_vhZpq;_|A8C~uCeJs zpj~y_jehhk0CE(wg4S%ffx0(oZf~R@uzQ!l0;d;vAImgbG7_C}A!7%zQ&MAY570iv z0ep{QY*A~M^+{#f##YvW1^pr-0$wucj=*!@sWt^^0k;Xm$0_|%+EI|>8a!AL%`kCE z(!%E@vMM%LvteCQE>V6)_Gg)k@dqp{Em>I-eFDHmQRWA@!^+Kd4^V5c@v}wQ=kI4m zAbyq4-&e%Oz1bFSSuBt$WcE&OFNN0Q*a!39#o^u_W8%bknhi3*kr~Ceyw)hERx4rq zX8Vh6lE5x}6Sv~s8ZTaluDh^!x^-20DtYF*JNvV;WMR4pl{QmSC&#ReDIdR*7B4o# zisV~#FKw7@4eQ3GNc-3nnmt3K2PCW5;u(uacW!Lo1eS~G>;ttpc3`rqgpvTqr3tgE zRy4g}5LyV&l|6_FZpEBfnaTYmU_2r2S$0ATjpxdtJB1yHcgg(jZF% zb;5$#QQ5+#54Y_D+Z&_6imX^$+}f~vHW}Xkdbu{d?zXYb)J8jwey_Xx-{N#vp z!XtZo>)r-eRjDN}-XiaT!u6e`B;1l?qq@;W7CLPA7W}aBYwI!Fq@7PWJ2`vq7x1Nx z99LpfebHnS>lS@rIR(t!LY4>8=25);RUe8mo7+$(YJN$QWsAu<5J6x6jp{d&YW;~{ zobnXPdKl?pO;>l5wZDrqXCdQMeQh(#wkD|mAT3F~$7GE9Z&bY$`CVHUHoU@M#Vo_j zEg5O9Xpu&bbYt~ZU=J)CyZ(jlx%N~*2U&{R#v4cc*Q_}I;qA0on?nAf_3wzgx-N4T zv_3Th^<;gNW<#!KOVo%{zNGiA_T!Jv%}5#GkL-QQQG|KhcQSYXru4IxSl+BOOrpke z64p@m1a2A1-j14UU)c{XTs@tazKcq@{smx73QJ?%Plfwcj&2zc%M7&?_&b%RTo8K@ zbM-&ihCCYs9&0`(SQp`mUP^cpqS~@Yqc2MxLll%ta0;lWuyU}fGzpCfq+^Nd!HUPr zg~U9Hp`p9t=gJcx@i>F`#XuI<@6%%F#>03uDowcz>I`V;F2&VLh#e}UM9r^1OzQ&n zG&+SCJxbf5Lq1_xJ$8%iX+>P;8nOs*k5ThktQ0o}ISw%iQxbDE+ajKAC{zI7CFCIt z+MkJA!^91#jMAm1(|7H1G{j(7g-~r>t+wXs$xO}l&N1TxjgMMt{)B7uf{AvyVQyMul749vtA~hobhIQ9q)l7`Qy(mXwxP^^-2JJqjdTT3Oo0Ved zE^JjbtS$T>oT2m$aLK)5}K0_}jE zAL)vCqv}zU4I*q0|lCsXQKvmDD6kjG7`2YhF zfArdb*V2%nPbQn$zAtlJ?Kb&fIE2Krb1%dbfErw?fN6t@hyYkU(*V#EoX}p_@ z38hj(wZ^aZbM&1$*D`jH?K5!_@>L({H~jdB`#z_jMYrntt007D9pCIepM1`z2jbfp z$9o$usA0#~jQS9a*#ci2~Rk9m$5t#s26NT&2`_(pirpbNOSyKUShRf6&j9ea zoJ~wn8H*3neS}k=@zl0aoDT!hFAP^egak)}t3>LJ|9qMOYVRFFzi?rXJ+5E5z|Y>8 z!bEr?$Zc$5qR=F38vB;n*QwZg3WlIWxCN-fPKi*L^#I3t>kvM2M2Ef&S+$L}Ij0&^ zU{(rcmcM9Ws|l`-Z#a7bu$lr5;3}VX5Ya9q`!Tm6mm+s4Xm1|i6B!h(3iVmy)4{MD zhVVNjncKApL(RHcrQtWo$`ia6W{Y46E$cy?R`nh&qRdRg6Y~CAGRJa;PwY6ldxC`E zFeqPz6p9XR|8j5s9E$x*ByWf(~qsR|CA0z;HDEd>q<+_dv!ukRduC+7zR3)Ac3p4wC->qPxl{nVqp-hLZ?M?$Y{vjda## zMq08Ip_RIp!zjZHgZB3}38RfjC2B~Q)ufVkv&pZ%!Sgj{0S__o(m!oXWKTK;&JNF6 zN<76zIMRvvQqvgBJEYKAmZv zJ{H{}BtNcYBr8#H80;&fI!W)65a!-KVO0o{tX<(#`D9N>+0kO$)r_Bmi3uBY$o2V(ej*YgQJ52!^EThX1Z5K__&(d;?U*y6V*E z(p14lT+uN`pO;_1lUS}YFDNxO0*?lyuFI;j#`gpXG%>T?ndXr~^HvDmAVD_(hFL=7 zG11Do2i1keVUsHJ&c3~`RlbqX+5nY7{C_92!hM^Sh7^$@C&qZ;Tb#AqoCb!4S1NI3 z%vxh1QBTl!7$DLa9Vr@=z{DjPsvd*U*RZf_C|hSFw0_8FhkSqDgY0tvED@l$uT#w) z`MbAt|FX?%4}ftW-xDP&toaYsUiH+6aYbeOZgJyeG^dCyHM034J zbShQKNY~*eREE#s&xd%|dtmfnX;39wjhZ`0Ppx#oa5)SLR*J-Nj4w(M0K5J5piwblzc+IYVWJRd!Zg3Sub@oRtyNN&n1)V}hlK z85Q}k%3N+?g9S((TQ8kmZkjtv%7F;j(c^Xlj>*T>KS2yjWM0X$yu>v}C4&3`tX&wOLPhIM~vJW^s`ZGm?r6^%z8l!?s(%r$}18mN2+A}_<8G{{Sb`V|Q2}>CRcQMsOoGoa; z7wyUctr>}(scVogm{xrZqxxXDRu$0^JaF-~IYn|KPD+7(nEN$SBPG;E&^pK6=rP-> z{MMRbK>sW4*7#K3XTqx)mD@rvofl2t{4`fs_S-QwE^xWCzUyG_w}Znjl*gL9?*i9e z+sa!_xReWw1SzFe1#4yAnRjfEY1JQ!uWn@)Xwt3ss{Yw7q@5BCeR_Cn-kXEw5Vp5# z@IJF(-hM`-(7HoN^x3vcWaXl`VYk`mfx)8QMP-ag2*?HTosciqX%3bHd)D`}ewptq z14CQ5wmEH$_^`-#%yAAuAIdqc*=*-~9#4w}a;MpN0z-fFO{vQuK)#$0`Y(!4aVot#^QL`qR%Xn-Uc zkCIMqEP7M(Y~rt#l!fsVbDN*NvRcj4P!fw?EpC3j=g%91u4i@4s9AyXH5tT8iry{> z`|rxisoIvY1uL;~@a4ni*GvAq3Hmc$3nvsxUyvb60pnHPpSKRr$Cm*vo#2EC`=vU$aRQ@x^iL1{v zlCLj+e_Lb&nAm)-`2%EiP1`*G_VTGk2kUE!5iBx=N43#mvK(iSkJDHHKNs0 z?RHw$dE}0^FmG1{AmfsQ?xpx_3kt%Yd33L3d*TT}c1}j|Jz7EI>Ir#kar1B@K9jra zSoe$A#P~}?XH^K=)iX0$>A%y9jl-<&4UdiYxMnW5@;6c^DD6%tGZl>NHwG?dVLbnV zq!(hCaRhVAnbH*z_3mLI$DLC^W0#axlktS89`N9TCvCa4+{|;TbvO@C$APU&D(=nW zTRyq4*r#T9!_(sl=lT>R!4>=03FqRLz;9LNU)kVRQ3_~!{H7j99G3%8A@+xDOWI8B zYiDw6wMhYEgOcWU8A6-8Z+iwxqc@gbFxTt7jQ(NRZ`UQv`vXL+YAt-P`N{Q1| zDPU+OQkI(YF4rzl_&!JU@E;Z2M3e zFeiSQN)lPR<&K+c(hHf%hvb$8q#$KCX|Cy$Ew8K!o{8`ckGXcV$k>jy1!krM*(77@ zGw&VE6%*oH4w5xJa+6*4aitEUSp}RU%^S=YdNsUI93ls=?1?&*Bn-l~ox1w?ww28+I$fGt z;V{)X#6dVE_$(?k8dbT#i^USif0B^Xb>`I9t||woPWY5t5<_vL(t|-^n`1|Ayk|7< zL8(J=^}QXzZ@3I1e3Y+@L%x{-vX4wQiElE}m4nB~Buw?fPKz&NmBFXE6gHwi^KEx~ zh98u3D$H*>I?}T`RZfL`n0MTc#R5Dp$z{`8Keolw*MW8@)RzdyYAAZxe+Av+WqW_fxY~3DCSC)pg#uLP%WfKNt`_vAR30(N8Kh` zZiu1>7S_Y;P6JnYPj}k<*^Cqwu9o}cWKD%@PtO*Te!MENX@<|Qc0RbJzoXIT218Xm zU~s3;y}j0;CMK2Z4FBbG%j5Eo<-b+3tm!(Y)A?8&WcgQ(0 z2GRoswbavkT&L;UBCpE_;8>97!d_KW3y?lU9OV}A{Caa|^s_lk=A*!Mb&5&DoUI!epKd>d@u?f*U7f$tL zI0yq_~sbLmM) zOx5yzTqE7>bJ?@D2kk2&=$($W$Vrin$;ooAN2WyK$bcE&;l()lz!8KFXBP(?FT z;mP#k55i)6K9t2aCF}{N_k*UUxUFJa6R&eT`wqnpWtWj*vF0Z2Mhhl1VTtvLIfcu#KCY9)2#k^?3>EUHqF?Z&lDav$I1cR- zVaD>Spw$a$Q4|=fnFVjp0t^=%>J4lW%4u@t{EdoQN0zNW3)kotS-p;byHt^9|bHI>(CP1_M460E7IbEOmW8j+=|k=$r| z4)Pb3y~nSXXy4)OYXp;2!E{w~)#KgYYgtl6!eJwe^6Q3MK2&YDC}RqkU0anLMn^Os)+_A~mX zgU&Kz*14u7N~vwA_yYkw8p5#@nKbUT-h5Ar23}~4&dx-H*p8;u^I9=K_G{kX(2zpb z9UK(k7aO(Ll2%oZn?GbB_HK*2x9n0NIYR)N4+$%lLN55aX~Tv-VF^3A3!kU_czF4V zRcqT)VYki8d^V)x{E)WzgUzV9a4I%NYX;c0@yw?r6KutDQgJ%$^7?yc<~H&HR10+3 zBL(;B_l4*C{%vwgM{Qi}o`ROLIM$Pd)m1Dev5)tUSJN5ypunt6ZR<2{CZokm!97+% z$IGct&H%$#Qu@GV4Pgj)Q+j*U*mv4{ZnSrK<%uq%^UHc{XJ65{~2tGr2$ z_CLm@{K#vLG@PSfCZ$TxvYN!n{?-N$4mfXpwCYJNKjz?0_u4O99|deHUDcX<`e(%M zwa;qob+};XNbd&4x4(7D|E`ZZ(XFx_@k)AR|$vtiSsC_i5|wwgi2b0-Pr{q@-;{+7NpqBlMwOuLfd& zP9vpi%m!9*z4JVNO8NKN*^0e0Y?Zb`K8i)gJ5OPn)UsGp-=O}PBDl*6zXOw zwSf;00kQv#Y=1wp11=`MXY5!+r?NnphXS2MA?BI5OpR=>&B1BPy-u-6;{cKhLyk(2 zsnf6@bnHVw@q1*47+y1|WBK00F)7$RY(fT@b&68jz#_d0-|2wk)Y9+|S=D+A8&grc zgHBzf)!WdB4GQ!w3YMxRk)yIGW-dLE2Jb1X3>}`Tw$giGuYQI#C?ct>s!^@ad$3ML znN>Vgm$}>R7@CIlNdUcr(DDni>>i0Y4YMo@9#R7a;y|J<>#hmRMh$EQcG>6>q!GT+ zpI|nu`XQF$ls0SQBVb5L7*f`46&KXx6Dev;1_hRJboZ`L0mb2j257f|woygFUlHc* z+hcfLjJ?Ru6R3&Lbj0RqWSNQoDm8w)7Q07>J@I-oe;oHrhx%7(a7>Lq&Oojb`fpc~ z_bACnDP%KUUJS)w@hxwinz%5M-Ec%~ZD2JN#E!9OMt z?lX+99YL()!w*s5?jKOwyoqRl_!+|81Bd~9;%`69pfcLx3{t6^ZMrUm2dI℞!!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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/gmap/gmap.html b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/gmap/gmap.html new file mode 100644 index 000000000..c4cbfe69c --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/gmap/gmap.html @@ -0,0 +1,89 @@ + + + + + + + + + + +
          + + + + + + +
          +
          +
          + + + \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/dialogs/help/help.css b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/help/help.css new file mode 100644 index 000000000..4478475fd --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/help/help.html b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/help/help.html new file mode 100644 index 000000000..9e50060e7 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/help/help.js b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/help/help.js new file mode 100644 index 000000000..9a2272e38 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/image/image.css b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/image/image.css new file mode 100644 index 000000000..52c2295ef --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/image/image.css @@ -0,0 +1,894 @@ +@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; +} + +/* 图片对齐方式 */ +.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: 25px; +} +#remote .left{ + display: block; + float: left; + width: 300px; + height:10px; +} +#remote .right{ + display: block; + float: right; + width: 300px; + height:10px; +} +#remote .row{ + margin-left: 20px; + clear: both; + height: 40px; +} + +#remote .row label{ + text-align: center; + width: 50px; + zoom:1; + _display: inline; + display:inline-block; + vertical-align: middle; +} +#remote .row label.algnLabel{ + float: left; + +} + +#remote 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; +} +#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 #url{ + width: 500px; + margin-bottom: 2px; +} +#remote #width, +#remote #height{ + width: 20px; + margin-left: 2px; + margin-right: 2px; +} +#remote #border, +#remote #vhSpace, +#remote #title{ + width: 180px; + margin-right: 5px; +} +#remote #lock{ +} +#remote #lockicon{ + zoom: 1; + _display:inline; + display: inline-block; + width: 20px; + height: 20px; + background: url("../../themes/default/images/lock.gif") -13px -13px no-repeat; + vertical-align: middle; +} +#remote #preview{ + clear: both; + width: 260px; + height: 240px; + z-index: 9999; + margin-top: 10px; + background-color: #eee; + 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: 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; + *border: 0px dashed #e6e6e6; + height: 172px; + padding-top: 150px; + text-align: center; + background: url(./images/image.png) center 70px no-repeat; + color: #cccccc; + font-size: 18px; + position: relative; + top:0; + *top: 10px; +} + +#upload .placeholder .webuploader-pick { + font-size: 18px; + background: #00b7ee; + border-radius: 3px; + line-height: 44px; + padding: 0 30px; + *width: 120px; + color: #fff; + display: inline-block; + margin: 0 auto 20px auto; + cursor: pointer; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); +} + +#upload .placeholder .webuploader-pick-hover { + background: #00a2d4; +} + + +#filePickerContainer { + text-align: center; +} + +#upload .placeholder .flashTip { + color: #666666; + font-size: 12px; + position: absolute; + width: 100%; + text-align: center; + bottom: 20px; +} + +#upload .placeholder .flashTip a { + color: #0785d1; + text-decoration: none; +} + +#upload .placeholder .flashTip a:hover { + text-decoration: underline; +} + +#upload .placeholder.webuploader-dnd-over { + border-color: #999999; +} + +#upload .filelist { + list-style: none; + margin: 0; + padding: 0; + overflow-x: hidden; + overflow-y: auto; + position: relative; + height: 300px; +} + +#upload .filelist:after { + content: ''; + display: block; + width: 0; + height: 0; + overflow: hidden; + clear: both; + position: relative; +} + +#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 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: url(./images/success.gif) no-repeat right bottom \9; +} + +#upload .filelist li.filePickerBlock { + width: 113px; + height: 113px; + background: url(./images/image.png) no-repeat center 12px; + border: 1px solid #eeeeee; + border-radius: 0; +} +#upload .filelist li.filePickerBlock div.webuploader-pick { + width: 100%; + height: 100%; + margin: 0; + padding: 0; + opacity: 0; + background: none; + font-size: 0; +} + +#upload .filelist div.file-panel { + position: absolute; + height: 0; + filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#80000000', endColorstr='#80000000') \0; + background: rgba(0, 0, 0, 0.5); + width: 100%; + top: 0; + left: 0; + overflow: hidden; + z-index: 300; +} + +#upload .filelist div.file-panel span { + width: 24px; + height: 24px; + display: inline; + float: right; + text-indent: -9999px; + overflow: hidden; + background: url(./images/icons.png) no-repeat; + background: url(./images/icons.gif) no-repeat \9; + margin: 5px 1px 1px; + cursor: pointer; + -webkit-tap-highlight-color: rgba(0,0,0,0); + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +#upload .filelist div.file-panel span.rotateLeft { + display:none; + background-position: 0 -24px; +} + +#upload .filelist div.file-panel span.rotateLeft:hover { + background-position: 0 0; +} + +#upload .filelist div.file-panel span.rotateRight { + display:none; + background-position: -24px -24px; +} + +#upload .filelist div.file-panel span.rotateRight:hover { + background-position: -24px 0; +} + +#upload .filelist div.file-panel span.cancel { + background-position: -48px -24px; +} + +#upload .filelist div.file-panel span.cancel:hover { + background-position: -48px 0; +} + +#upload .statusBar { + height: 45px; + border-bottom: 1px solid #dadada; + margin: 0 10px; + padding: 0; + line-height: 45px; + vertical-align: middle; + position: relative; +} + +#upload .statusBar .progress { + border: 1px solid #1483d8; + width: 198px; + background: #fff; + height: 18px; + position: absolute; + top: 12px; + display: none; + text-align: center; + line-height: 18px; + color: #6dbfff; + margin: 0 10px 0 0; +} +#upload .statusBar .progress span.percentage { + width: 0; + height: 100%; + left: 0; + top: 0; + background: #1483d8; + position: absolute; +} +#upload .statusBar .progress span.text { + position: relative; + z-index: 10; +} + +#upload .statusBar .info { + display: inline-block; + font-size: 14px; + color: #666666; +} + +#upload .statusBar .btns { + position: absolute; + top: 7px; + right: 0; + line-height: 30px; +} + +#filePickerBtn { + display: inline-block; + float: left; +} +#upload .statusBar .btns .webuploader-pick, +#upload .statusBar .btns .uploadBtn, +#upload .statusBar .btns .uploadBtn.state-uploading, +#upload .statusBar .btns .uploadBtn.state-paused { + background: #ffffff; + border: 1px solid #cfcfcf; + color: #565656; + padding: 0 18px; + display: inline-block; + border-radius: 3px; + margin-left: 10px; + cursor: pointer; + font-size: 14px; + float: left; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +#upload .statusBar .btns .webuploader-pick-hover, +#upload .statusBar .btns .uploadBtn:hover, +#upload .statusBar .btns .uploadBtn.state-uploading:hover, +#upload .statusBar .btns .uploadBtn.state-paused:hover { + background: #f0f0f0; +} + +#upload .statusBar .btns .uploadBtn, +#upload .statusBar .btns .uploadBtn.state-paused{ + background: #00b7ee; + color: #fff; + border-color: transparent; +} +#upload .statusBar .btns .uploadBtn:hover, +#upload .statusBar .btns .uploadBtn.state-paused:hover{ + background: #00a2d4; +} + +#upload .statusBar .btns .uploadBtn.disabled { + pointer-events: none; + filter:alpha(opacity=60); + -moz-opacity:0.6; + -khtml-opacity: 0.6; + opacity: 0.6; +} + + + +/* 图片管理样式 */ +#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: 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 .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; +} + + +/* 图片搜索样式 */ +#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 .searchType { + width: 65px; + 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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/image/image.html b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/image/image.html new file mode 100644 index 000000000..08ca022dd --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/image/image.html @@ -0,0 +1,120 @@ + + + + + ueditor图片对话框 + + + + + + + + + + + + + + +
          +
          + + + + +
          +
          + + + + + + + + +
          +
          + + +
          +
          +
          + + +
          +
          +
          +
          + +   px +   px + +
          +
          + + px +
          +
          + + px +
          +
          + + +
          +
          +
          +
          + + +
          +
          +
          +
          + 0% + +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
            +
          • +
          +
          +
          + + +
          +
          +
          + + + + +
          +
          + + + + \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/dialogs/image/image.js b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/image/image.js new file mode 100644 index 000000000..dee16bb80 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/image/image.js @@ -0,0 +1,1142 @@ +/** + * 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(){ + updatePreview(); + if(locker.checked) { + var proportion =locker.getAttribute('data-proportion'); + $G('height').value = Math.round(this.value / proportion); + } else { + _this.updateLocker(); + } + }); + domUtils.on($G("height"), 'keyup', function(){ + updatePreview(); + if(locker.checked) { + var proportion =locker.getAttribute('data-proportion'); + $G('width').value = Math.round(this.value * proportion); + } else { + _this.updateLocker(); + } + }); + 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 = parseInt($G('width').value, 10) || 0, + oh = parseInt($G('height').value, 10) || 0, + border = parseInt($G('border').value, 10) || 0, + title = $G('title').value, + preview = $G('preview'), + width, + height; + + url = utils.unhtmlForUrl(url); + title = utils.unhtml(title); + + 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'] || '', + title: data['title'] || '', + 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') || []).join('').replace(/\./g, ',').replace(/^[,]/, ''), + imageMaxSize = editor.getOpt('imageMaxSize'), + imageCompressBorder = editor.getOpt('imageCompressBorder'); + + if (!WebUploader.Uploader.support()) { + $('#filePickerReady').after($('
          ').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/*' + }, + swf: '../../third-party/webuploader/Uploader.swf', + server: actionUrl, + fileVal: editor.getOpt('imageFieldName'), + duplicate: true, + fileSingleSizeLimit: imageMaxSize, // 默认 2 M + compress: editor.getOpt('imageCompressEnable') ? { + width: imageCompressBorder, + height: imageCompressBorder, + // 图片质量,只有type为`image/jpeg`的时候才有效。 + quality: 90, + // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false. + allowMagnify: false, + // 是否允许裁剪。 + crop: false, + // 是否保留头部meta信息。 + preserveHeaders: true + }:false + }); + uploader.addButton({ + id: '#filePickerBlock' + }); + uploader.addButton({ + id: '#filePickerBtn', + label: lang.uploadAddFile + }); + + setState('pedding'); + + // 当有文件添加进来时执行,负责view的创建 + function addFile(file) { + var $li = $('
        3. ' + + '

          ' + file.name + '

          ' + + '

          ' + + '

          ' + + '
        4. '), + + $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) { + 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') { + _this.imageList.push(json); + $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; + }, + destroy: function () { + this.$wrap.remove(); + }, + getInsertList: function () { + var i, data, list = [], + align = getAlign(), + prefix = editor.getOpt('imageUrlPrefix'); + for (i = 0; i < this.imageList.length; i++) { + data = this.imageList[i]; + list.push({ + src: prefix + data.url, + _src: prefix + data.url, + title: data.title, + 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'); + } + } + }); + }, + encodeToGb2312:function (str){ + if(!str) return ''; + var strOut = "", + z = 'D2BBB6A18140C6DF814181428143CDF2D5C9C8FDC9CFCFC2D8A2B2BBD3EB8144D8A4B3F38145D7A8C7D2D8A7CAC08146C7F0B1FBD2B5B4D4B6ABCBBFD8A9814781488149B6AA814AC1BDD1CF814BC9A5D8AD814CB8F6D1BEE3DCD6D0814D814EB7E1814FB4AE8150C1D98151D8BC8152CDE8B5A4CEAAD6F78153C0F6BED9D8AF815481558156C4CB8157BEC38158D8B1C3B4D2E58159D6AECEDAD5A7BAF5B7A6C0D6815AC6B9C5D2C7C7815BB9D4815CB3CBD2D2815D815ED8BFBEC5C6F2D2B2CFB0CFE7815F816081618162CAE981638164D8C081658166816781688169816AC2F2C2D2816BC8E9816C816D816E816F817081718172817381748175C7AC8176817781788179817A817B817CC1CB817DD3E8D5F9817ECAC2B6FED8A1D3DABFF78180D4C6BBA5D8C1CEE5BEAE81818182D8A88183D1C7D0A9818481858186D8BDD9EFCDF6BFBA8187BDBBBAA5D2E0B2FABAE0C4B68188CFEDBEA9CDA4C1C18189818A818BC7D7D9F1818CD9F4818D818E818F8190C8CBD8E9819181928193D2DACAB2C8CAD8ECD8EAD8C6BDF6C6CDB3F08194D8EBBDF1BDE98195C8D4B4D381968197C2D88198B2D6D7D0CACBCBFBD5CCB8B6CFC98199819A819BD9DAD8F0C7AA819CD8EE819DB4FAC1EED2D4819E819FD8ED81A0D2C7D8EFC3C781A181A281A3D1F681A4D6D9D8F281A5D8F5BCFEBCDB81A681A781A8C8CE81A9B7DD81AAB7C281ABC6F381AC81AD81AE81AF81B081B181B2D8F8D2C181B381B4CEE9BCBFB7FCB7A5D0DD81B581B681B781B881B9D6DAD3C5BBEFBBE1D8F181BA81BBC9A1CEB0B4AB81BCD8F381BDC9CBD8F6C2D7D8F781BE81BFCEB1D8F981C081C181C2B2AEB9C081C3D9A381C4B0E981C5C1E681C6C9EC81C7CBC581C8CBC6D9A481C981CA81CB81CC81CDB5E881CE81CFB5AB81D081D181D281D381D481D5CEBBB5CDD7A1D7F4D3D381D6CCE581D7BACE81D8D9A2D9DCD3E0D8FDB7F0D7F7D8FED8FAD9A1C4E381D981DAD3B6D8F4D9DD81DBD8FB81DCC5E581DD81DEC0D081DF81E0D1F0B0DB81E181E2BCD1D9A681E3D9A581E481E581E681E7D9ACD9AE81E8D9ABCAB981E981EA81EBD9A9D6B681EC81ED81EEB3DED9A881EFC0FD81F0CACC81F1D9AA81F2D9A781F381F4D9B081F581F6B6B181F781F881F9B9A981FAD2C081FB81FCCFC081FD81FEC2C28240BDC4D5ECB2E0C7C8BFEBD9AD8241D9AF8242CEEABAEE82438244824582468247C7D682488249824A824B824C824D824E824F8250B1E3825182528253B4D9B6EDD9B48254825582568257BFA182588259825AD9DEC7CEC0FED9B8825B825C825D825E825FCBD7B7FD8260D9B58261D9B7B1A3D3E1D9B98262D0C58263D9B682648265D9B18266D9B2C1A9D9B382678268BCF3D0DEB8A98269BEE3826AD9BD826B826C826D826ED9BA826FB0B3827082718272D9C28273827482758276827782788279827A827B827C827D827E8280D9C4B1B68281D9BF82828283B5B98284BEF3828582868287CCC8BAF2D2D08288D9C38289828ABDE8828BB3AB828C828D828ED9C5BEEB828FD9C6D9BBC4DF8290D9BED9C1D9C0829182928293829482958296829782988299829A829BD5AE829CD6B5829DC7E3829E829F82A082A1D9C882A282A382A4BCD9D9CA82A582A682A7D9BC82A8D9CBC6AB82A982AA82AB82AC82ADD9C982AE82AF82B082B1D7F682B2CDA382B382B482B582B682B782B882B982BABDA182BB82BC82BD82BE82BF82C0D9CC82C182C282C382C482C582C682C782C882C9C5BCCDB582CA82CB82CCD9CD82CD82CED9C7B3A5BFFE82CF82D082D182D2B8B582D382D4C0FC82D582D682D782D8B0F882D982DA82DB82DC82DD82DE82DF82E082E182E282E382E482E582E682E782E882E982EA82EB82EC82EDB4F682EED9CE82EFD9CFB4A2D9D082F082F1B4DF82F282F382F482F582F6B0C182F782F882F982FA82FB82FC82FDD9D1C9B582FE8340834183428343834483458346834783488349834A834B834C834D834E834F83508351CFF1835283538354835583568357D9D283588359835AC1C5835B835C835D835E835F836083618362836383648365D9D6C9AE8366836783688369D9D5D9D4D9D7836A836B836C836DCBDB836EBDA9836F8370837183728373C6A7837483758376837783788379837A837B837C837DD9D3D9D8837E83808381D9D9838283838384838583868387C8E583888389838A838B838C838D838E838F839083918392839383948395C0DC8396839783988399839A839B839C839D839E839F83A083A183A283A383A483A583A683A783A883A983AA83AB83AC83AD83AE83AF83B083B183B2B6F9D8A3D4CA83B3D4AAD0D6B3E4D5D783B4CFC8B9E283B5BFCB83B6C3E283B783B883B9B6D283BA83BBCDC3D9EED9F083BC83BD83BEB5B383BFB6B583C083C183C283C383C4BEA483C583C6C8EB83C783C8C8AB83C983CAB0CBB9ABC1F9D9E283CBC0BCB9B283CCB9D8D0CBB1F8C6E4BEDFB5E4D7C883CDD1F8BCE6CADE83CE83CFBCBDD9E6D8E783D083D1C4DA83D283D3B8D4C8BD83D483D5B2E1D4D983D683D783D883D9C3B083DA83DBC3E1DAA2C8DF83DCD0B483DDBEFCC5A983DE83DF83E0B9DA83E1DAA383E2D4A9DAA483E383E483E583E683E7D9FBB6AC83E883E9B7EBB1F9D9FCB3E5BEF683EABFF6D2B1C0E483EB83EC83EDB6B3D9FED9FD83EE83EFBEBB83F083F183F2C6E083F3D7BCDAA183F4C1B983F5B5F2C1E883F683F7BCF583F8B4D583F983FA83FB83FC83FD83FE844084418442C1DD8443C4FD84448445BCB8B7B284468447B7EF84488449844A844B844C844DD9EC844EC6BE844FBFADBBCB84508451B5CA8452DBC9D0D78453CDB9B0BCB3F6BBF7DBCABAAF8454D4E4B5B6B5F3D8D6C8D084558456B7D6C7D0D8D78457BFAF84588459DBBBD8D8845A845BD0CCBBAE845C845D845EEBBEC1D0C1F5D4F2B8D5B4B4845FB3F584608461C9BE846284638464C5D0846584668467C5D9C0FB8468B1F08469D8D9B9CE846AB5BD846B846CD8DA846D846ED6C6CBA2C8AFC9B2B4CCBFCC846FB9F48470D8DBD8DCB6E7BCC1CCEA847184728473847484758476CFF78477D8DDC7B084788479B9D0BDA3847A847BCCDE847CC6CA847D847E848084818482D8E08483D8DE84848485D8DF848684878488B0FE8489BEE7848ACAA3BCF4848B848C848D848EB8B1848F8490B8EE849184928493849484958496849784988499849AD8E2849BBDCB849CD8E4D8E3849D849E849F84A084A1C5FC84A284A384A484A584A684A784A8D8E584A984AAD8E684AB84AC84AD84AE84AF84B084B1C1A684B2C8B0B0ECB9A6BCD3CEF1DBBDC1D384B384B484B584B6B6AFD6FAC5ACBDD9DBBEDBBF84B784B884B9C0F8BEA2C0CD84BA84BB84BC84BD84BE84BF84C084C184C284C3DBC0CAC684C484C584C6B2AA84C784C884C9D3C284CAC3E384CBD1AB84CC84CD84CE84CFDBC284D0C0D584D184D284D3DBC384D4BFB184D584D684D784D884D984DAC4BC84DB84DC84DD84DEC7DA84DF84E084E184E284E384E484E584E684E784E884E9DBC484EA84EB84EC84ED84EE84EF84F084F1D9E8C9D784F284F384F4B9B4CEF0D4C884F584F684F784F8B0FCB4D284F9D0D984FA84FB84FC84FDD9E984FEDECBD9EB8540854185428543D8B0BBAFB1B18544B3D7D8CE85458546D4D185478548BDB3BFEF8549CFBB854A854BD8D0854C854D854EB7CB854F85508551D8D185528553855485558556855785588559855A855BC6A5C7F8D2BD855C855DD8D2C4E4855ECAAE855FC7A78560D8A68561C9FDCEE7BBDCB0EB856285638564BBAAD0AD8565B1B0D7E4D7BF8566B5A5C2F4C4CF85678568B2A98569B2B7856AB1E5DFB2D5BCBFA8C2ACD8D5C2B1856BD8D4CED4856CDAE0856DCEC0856E856FD8B4C3AED3A1CEA38570BCB4C8B4C2D18571BEEDD0B68572DAE18573857485758576C7E485778578B3A78579B6F2CCFCC0FA857A857BC0F7857CD1B9D1E1D8C7857D857E85808581858285838584B2DE85858586C0E58587BAF185888589D8C8858AD4AD858B858CCFE1D8C9858DD8CACFC3858EB3F8BEC7858F859085918592D8CB8593859485958596859785988599DBCC859A859B859C859DC8A5859E859F85A0CFD885A1C8FEB2CE85A285A385A485A585A6D3D6B2E6BCB0D3D1CBABB7B485A785A885A9B7A285AA85ABCAE585ACC8A1CADCB1E4D0F085ADC5D185AE85AF85B0DBC5B5FE85B185B2BFDAB9C5BEE4C1ED85B3DFB6DFB5D6BBBDD0D5D9B0C8B6A3BFC9CCA8DFB3CAB7D3D285B4D8CFD2B6BAC5CBBECCBE85B5DFB7B5F0DFB485B685B785B8D3F585B9B3D4B8F785BADFBA85BBBACFBCAAB5F585BCCDACC3FBBAF3C0F4CDC2CFF2DFB8CFC585BDC2C0DFB9C2F085BE85BF85C0BEFD85C1C1DFCDCCD2F7B7CDDFC185C2DFC485C385C4B7F1B0C9B6D6B7D485C5BAACCCFDBFD4CBB1C6F485C6D6A8DFC585C7CEE2B3B385C885C9CEFCB4B585CACEC7BAF085CBCEE185CCD1BD85CD85CEDFC085CF85D0B4F485D1B3CA85D2B8E6DFBB85D385D485D585D6C4C585D7DFBCDFBDDFBEC5BBDFBFDFC2D4B1DFC385D8C7BACED885D985DA85DB85DC85DDC4D885DEDFCA85DFDFCF85E0D6DC85E185E285E385E485E585E685E785E8DFC9DFDACEB685E9BAC7DFCEDFC8C5DE85EA85EBC9EBBAF4C3FC85EC85EDBED785EEDFC685EFDFCD85F0C5D885F185F285F385F4D5A6BACD85F5BECCD3BDB8C085F6D6E485F7DFC7B9BEBFA785F885F9C1FCDFCBDFCC85FADFD085FB85FC85FD85FE8640DFDBDFE58641DFD7DFD6D7C9DFE3DFE4E5EBD2A7DFD28642BFA98643D4DB8644BFC8DFD4864586468647CFCC86488649DFDD864AD1CA864BDFDEB0A7C6B7DFD3864CBAE5864DB6DFCDDBB9FED4D5864E864FDFDFCFECB0A5DFE7DFD1D1C6DFD5DFD8DFD9DFDC8650BBA98651DFE0DFE18652DFE2DFE6DFE8D3B486538654865586568657B8E7C5B6DFEAC9DAC1A8C4C486588659BFDECFF8865A865B865CD5DCDFEE865D865E865F866086618662B2B88663BADFDFEC8664DBC18665D1E48666866786688669CBF4B4BD866AB0A6866B866C866D866E866FDFF1CCC6DFF286708671DFED867286738674867586768677DFE986788679867A867BDFEB867CDFEFDFF0BBBD867D867EDFF386808681DFF48682BBA38683CADBCEA8E0A7B3AA8684E0A6868586868687E0A186888689868A868BDFFE868CCDD9DFFC868DDFFA868EBFD0D7C4868FC9CC86908691DFF8B0A186928693869486958696DFFD869786988699869ADFFBE0A2869B869C869D869E869FE0A886A086A186A286A3B7C886A486A5C6A1C9B6C0B2DFF586A686A7C5BE86A8D8C4DFF9C4F686A986AA86AB86AC86AD86AEE0A3E0A4E0A5D0A586AF86B0E0B4CCE486B1E0B186B2BFA6E0AFCEB9E0ABC9C686B386B4C0AEE0AEBAEDBAB0E0A986B586B686B7DFF686B8E0B386B986BAE0B886BB86BC86BDB4ADE0B986BE86BFCFB2BAC886C0E0B086C186C286C386C486C586C686C7D0FA86C886C986CA86CB86CC86CD86CE86CF86D0E0AC86D1D4FB86D2DFF786D3C5E786D4E0AD86D5D3F786D6E0B6E0B786D786D886D986DA86DBE0C4D0E186DC86DD86DEE0BC86DF86E0E0C9E0CA86E186E286E3E0BEE0AAC9A4E0C186E4E0B286E586E686E786E886E9CAC8E0C386EAE0B586EBCECB86ECCBC3E0CDE0C6E0C286EDE0CB86EEE0BAE0BFE0C086EF86F0E0C586F186F2E0C7E0C886F3E0CC86F4E0BB86F586F686F786F886F9CBD4E0D586FAE0D6E0D286FB86FC86FD86FE87408741E0D0BCCE87428743E0D18744B8C2D8C587458746874787488749874A874B874CD0EA874D874EC2EF874F8750E0CFE0BD875187528753E0D4E0D387548755E0D78756875787588759E0DCE0D8875A875B875CD6F6B3B0875DD7EC875ECBBB875F8760E0DA8761CEFB876287638764BAD987658766876787688769876A876B876C876D876E876F8770E0E1E0DDD2AD87718772877387748775E0E287768777E0DBE0D9E0DF87788779E0E0877A877B877C877D877EE0DE8780E0E4878187828783C6F7D8ACD4EBE0E6CAC98784878587868787E0E587888789878A878BB8C1878C878D878E878FE0E7E0E887908791879287938794879587968797E0E9E0E387988799879A879B879C879D879EBABFCCE7879F87A087A1E0EA87A287A387A487A587A687A787A887A987AA87AB87AC87AD87AE87AF87B0CFF987B187B287B387B487B587B687B787B887B987BA87BBE0EB87BC87BD87BE87BF87C087C187C2C8C287C387C487C587C6BDC087C787C887C987CA87CB87CC87CD87CE87CF87D087D187D287D3C4D287D487D587D687D787D887D987DA87DB87DCE0EC87DD87DEE0ED87DF87E0C7F4CBC487E1E0EEBBD8D8B6D2F2E0EFCDC587E2B6DA87E387E487E587E687E787E8E0F187E9D4B087EA87EBC0A7B4D187EC87EDCEA7E0F087EE87EF87F0E0F2B9CC87F187F2B9FACDBCE0F387F387F487F5C6D4E0F487F6D4B287F7C8A6E0F6E0F587F887F987FA87FB87FC87FD87FE8840884188428843884488458846884788488849E0F7884A884BCDC1884C884D884ECAA5884F885088518852D4DADBD7DBD98853DBD8B9E7DBDCDBDDB5D888548855DBDA8856885788588859885ADBDBB3A1DBDF885B885CBBF8885DD6B7885EDBE0885F886088618862BEF988638864B7BB8865DBD0CCAEBFB2BBB5D7F8BFD38866886788688869886ABFE9886B886CBCE1CCB3DBDEB0D3CEEBB7D8D7B9C6C2886D886EC0A4886FCCB98870DBE7DBE1C6BADBE38871DBE88872C5F7887388748875DBEA88768877DBE9BFC088788879887ADBE6DBE5887B887C887D887E8880B4B9C0ACC2A2DBE2DBE48881888288838884D0CDDBED88858886888788888889C0DDDBF2888A888B888C888D888E888F8890B6E28891889288938894DBF3DBD2B9B8D4ABDBEC8895BFD1DBF08896DBD18897B5E68898DBEBBFE58899889A889BDBEE889CDBF1889D889E889FDBF988A088A188A288A388A488A588A688A788A8B9A1B0A388A988AA88AB88AC88AD88AE88AFC2F188B088B1B3C7DBEF88B288B3DBF888B4C6D2DBF488B588B6DBF5DBF7DBF688B788B8DBFE88B9D3F2B2BA88BA88BB88BCDBFD88BD88BE88BF88C088C188C288C388C4DCA488C5DBFB88C688C788C888C9DBFA88CA88CB88CCDBFCC5E0BBF988CD88CEDCA388CF88D0DCA588D1CCC388D288D388D4B6D1DDC088D588D688D7DCA188D8DCA288D988DA88DBC7B588DC88DD88DEB6E988DF88E088E1DCA788E288E388E488E5DCA688E6DCA9B1A488E788E8B5CC88E988EA88EB88EC88EDBFB088EE88EF88F088F188F2D1DF88F388F488F588F6B6C288F788F888F988FA88FB88FC88FD88FE894089418942894389448945DCA88946894789488949894A894B894CCBFAEBF3894D894E894FCBDC89508951CBFE895289538954CCC189558956895789588959C8FB895A895B895C895D895E895FDCAA89608961896289638964CCEEDCAB89658966896789688969896A896B896C896D896E896F897089718972897389748975DBD38976DCAFDCAC8977BEB38978CAFB8979897A897BDCAD897C897D897E89808981898289838984C9CAC4B989858986898789888989C7BDDCAE898A898B898CD4F6D0E6898D898E898F89908991899289938994C4ABB6D589958996899789988999899A899B899C899D899E899F89A089A189A289A389A489A589A6DBD489A789A889A989AAB1DA89AB89AC89ADDBD589AE89AF89B089B189B289B389B489B589B689B789B8DBD689B989BA89BBBABE89BC89BD89BE89BF89C089C189C289C389C489C589C689C789C889C9C8C089CA89CB89CC89CD89CE89CFCABFC8C989D0D7B389D1C9F989D289D3BFC789D489D5BAF889D689D7D2BC89D889D989DA89DB89DC89DD89DE89DFE2BA89E0B4A689E189E2B1B889E389E489E589E689E7B8B489E8CFC489E989EA89EB89ECD9E7CFA6CDE289ED89EED9EDB6E089EFD2B989F089F1B9BB89F289F389F489F5E2B9E2B789F6B4F389F7CCECCCABB7F289F8D8B2D1EBBABB89F9CAA789FA89FBCDB789FC89FDD2C4BFE4BCD0B6E189FEDEC58A408A418A428A43DEC6DBBC8A44D1D98A458A46C6E6C4CEB7EE8A47B7DC8A488A49BFFCD7E08A4AC6F58A4B8A4CB1BCDEC8BDB1CCD7DECA8A4DDEC98A4E8A4F8A508A518A52B5EC8A53C9DD8A548A55B0C28A568A578A588A598A5A8A5B8A5C8A5D8A5E8A5F8A608A618A62C5AEC5AB8A63C4CC8A64BCE9CBFD8A658A668A67BAC38A688A698A6AE5F9C8E7E5FACDFD8A6BD7B1B8BEC2E88A6CC8D18A6D8A6EE5FB8A6F8A708A718A72B6CABCCB8A738A74D1FDE6A18A75C3EE8A768A778A788A79E6A48A7A8A7B8A7C8A7DE5FEE6A5CDD78A7E8A80B7C1E5FCE5FDE6A38A818A82C4DDE6A88A838A84E6A78A858A868A878A888A898A8AC3C38A8BC6DE8A8C8A8DE6AA8A8E8A8F8A908A918A928A938A94C4B78A958A968A97E6A2CABC8A988A998A9A8A9BBDE3B9C3E6A6D0D5CEAF8A9C8A9DE6A9E6B08A9ED2A68A9FBDAAE6AD8AA08AA18AA28AA38AA4E6AF8AA5C0D18AA68AA7D2CC8AA88AA98AAABCA78AAB8AAC8AAD8AAE8AAF8AB08AB18AB28AB38AB48AB58AB6E6B18AB7D2F68AB88AB98ABAD7CB8ABBCDFE8ABCCDDEC2A6E6ABE6ACBDBFE6AEE6B38ABD8ABEE6B28ABF8AC08AC18AC2E6B68AC3E6B88AC48AC58AC68AC7C4EF8AC88AC98ACAC4C88ACB8ACCBEEAC9EF8ACD8ACEE6B78ACFB6F08AD08AD18AD2C3E48AD38AD48AD58AD68AD78AD88AD9D3E9E6B48ADAE6B58ADBC8A28ADC8ADD8ADE8ADF8AE0E6BD8AE18AE28AE3E6B98AE48AE58AE68AE78AE8C6C58AE98AEACDF1E6BB8AEB8AEC8AED8AEE8AEF8AF08AF18AF28AF38AF4E6BC8AF58AF68AF78AF8BBE98AF98AFA8AFB8AFC8AFD8AFE8B40E6BE8B418B428B438B44E6BA8B458B46C0B78B478B488B498B4A8B4B8B4C8B4D8B4E8B4FD3A4E6BFC9F4E6C38B508B51E6C48B528B538B548B55D0F68B568B578B588B598B5A8B5B8B5C8B5D8B5E8B5F8B608B618B628B638B648B658B668B67C3BD8B688B698B6A8B6B8B6C8B6D8B6EC3C4E6C28B6F8B708B718B728B738B748B758B768B778B788B798B7A8B7B8B7CE6C18B7D8B7E8B808B818B828B838B84E6C7CFB18B85EBF48B868B87E6CA8B888B898B8A8B8B8B8CE6C58B8D8B8EBCDEC9A98B8F8B908B918B928B938B94BCB58B958B96CFD38B978B988B998B9A8B9BE6C88B9CE6C98B9DE6CE8B9EE6D08B9F8BA08BA1E6D18BA28BA38BA4E6CBB5D58BA5E6CC8BA68BA7E6CF8BA88BA9C4DB8BAAE6C68BAB8BAC8BAD8BAE8BAFE6CD8BB08BB18BB28BB38BB48BB58BB68BB78BB88BB98BBA8BBB8BBC8BBD8BBE8BBF8BC08BC18BC28BC38BC48BC58BC6E6D28BC78BC88BC98BCA8BCB8BCC8BCD8BCE8BCF8BD08BD18BD2E6D4E6D38BD38BD48BD58BD68BD78BD88BD98BDA8BDB8BDC8BDD8BDE8BDF8BE08BE18BE28BE38BE48BE58BE68BE78BE88BE98BEA8BEB8BECE6D58BEDD9F88BEE8BEFE6D68BF08BF18BF28BF38BF48BF58BF68BF7E6D78BF88BF98BFA8BFB8BFC8BFD8BFE8C408C418C428C438C448C458C468C47D7D3E6DD8C48E6DEBFD7D4D08C49D7D6B4E6CBEFE6DAD8C3D7CED0A28C4AC3CF8C4B8C4CE6DFBCBEB9C2E6DBD1A78C4D8C4EBAA2C2CF8C4FD8AB8C508C518C52CAEBE5EE8C53E6DC8C54B7F58C558C568C578C58C8E68C598C5AC4F58C5B8C5CE5B2C4FE8C5DCBFCE5B3D5AC8C5ED3EECAD8B0B28C5FCBCECDEA8C608C61BAEA8C628C638C64E5B58C65E5B48C66D7DAB9D9D6E6B6A8CDF0D2CBB1A6CAB58C67B3E8C9F3BFCDD0FBCAD2E5B6BBC28C688C698C6ACFDCB9AC8C6B8C6C8C6D8C6ED4D78C6F8C70BAA6D1E7CFFCBCD28C71E5B7C8DD8C728C738C74BFEDB1F6CBDE8C758C76BCC58C77BCC4D2FAC3DCBFDC8C788C798C7A8C7BB8BB8C7C8C7D8C7EC3C28C80BAAED4A28C818C828C838C848C858C868C878C888C89C7DEC4AFB2EC8C8AB9D18C8B8C8CE5BBC1C88C8D8C8ED5AF8C8F8C908C918C928C93E5BC8C94E5BE8C958C968C978C988C998C9A8C9BB4E7B6D4CBC2D1B0B5BC8C9C8C9DCAD98C9EB7E28C9F8CA0C9E48CA1BDAB8CA28CA3CEBED7F08CA48CA58CA68CA7D0A18CA8C9D98CA98CAAB6FBE6D8BCE28CABB3BE8CACC9D08CADE6D9B3A28CAE8CAF8CB08CB1DECC8CB2D3C8DECD8CB3D2A28CB48CB58CB68CB7DECE8CB88CB98CBA8CBBBECD8CBC8CBDDECF8CBE8CBF8CC0CAACD2FCB3DFE5EAC4E1BEA1CEB2C4F2BED6C6A8B2E38CC18CC2BED38CC38CC4C7FCCCEBBDECCEDD8CC58CC6CABAC6C1E5ECD0BC8CC78CC88CC9D5B98CCA8CCB8CCCE5ED8CCD8CCE8CCF8CD0CAF48CD1CDC0C2C58CD2E5EF8CD3C2C4E5F08CD48CD58CD68CD78CD88CD98CDAE5F8CDCD8CDBC9BD8CDC8CDD8CDE8CDF8CE08CE18CE2D2D9E1A88CE38CE48CE58CE6D3EC8CE7CBEAC6F18CE88CE98CEA8CEB8CECE1AC8CED8CEE8CEFE1A7E1A98CF08CF1E1AAE1AF8CF28CF3B2ED8CF4E1ABB8DAE1ADE1AEE1B0B5BAE1B18CF58CF68CF78CF88CF9E1B3E1B88CFA8CFB8CFC8CFD8CFED1D28D40E1B6E1B5C1EB8D418D428D43E1B78D44D4C08D45E1B28D46E1BAB0B68D478D488D498D4AE1B48D4BBFF98D4CE1B98D4D8D4EE1BB8D4F8D508D518D528D538D54E1BE8D558D568D578D588D598D5AE1BC8D5B8D5C8D5D8D5E8D5F8D60D6C58D618D628D638D648D658D668D67CFBF8D688D69E1BDE1BFC2CD8D6AB6EB8D6BD3F88D6C8D6DC7CD8D6E8D6FB7E58D708D718D728D738D748D758D768D778D788D79BEFE8D7A8D7B8D7C8D7D8D7E8D80E1C0E1C18D818D82E1C7B3E78D838D848D858D868D878D88C6E98D898D8A8D8B8D8C8D8DB4DE8D8ED1C28D8F8D908D918D92E1C88D938D94E1C68D958D968D978D988D99E1C58D9AE1C3E1C28D9BB1C08D9C8D9D8D9ED5B8E1C48D9F8DA08DA18DA28DA3E1CB8DA48DA58DA68DA78DA88DA98DAA8DABE1CCE1CA8DAC8DAD8DAE8DAF8DB08DB18DB28DB3EFFA8DB48DB5E1D3E1D2C7B68DB68DB78DB88DB98DBA8DBB8DBC8DBD8DBE8DBF8DC0E1C98DC18DC2E1CE8DC3E1D08DC48DC58DC68DC78DC88DC98DCA8DCB8DCC8DCD8DCEE1D48DCFE1D1E1CD8DD08DD1E1CF8DD28DD38DD48DD5E1D58DD68DD78DD88DD98DDA8DDB8DDC8DDD8DDE8DDF8DE08DE18DE2E1D68DE38DE48DE58DE68DE78DE88DE98DEA8DEB8DEC8DED8DEE8DEF8DF08DF18DF28DF38DF48DF58DF68DF78DF8E1D78DF98DFA8DFBE1D88DFC8DFD8DFE8E408E418E428E438E448E458E468E478E488E498E4A8E4B8E4C8E4D8E4E8E4F8E508E518E528E538E548E55E1DA8E568E578E588E598E5A8E5B8E5C8E5D8E5E8E5F8E608E618E62E1DB8E638E648E658E668E678E688E69CEA18E6A8E6B8E6C8E6D8E6E8E6F8E708E718E728E738E748E758E76E7DD8E77B4A8D6DD8E788E79D1B2B3B28E7A8E7BB9A4D7F3C7C9BEDEB9AE8E7CCED78E7D8E7EB2EEDBCF8E80BCBAD2D1CBC8B0CD8E818E82CFEF8E838E848E858E868E87D9E3BDED8E888E89B1D2CAD0B2BC8E8ACBA7B7AB8E8BCAA68E8C8E8D8E8ECFA38E8F8E90E0F8D5CAE0FB8E918E92E0FAC5C1CCFB8E93C1B1E0F9D6E3B2AFD6C4B5DB8E948E958E968E978E988E998E9A8E9BB4F8D6A18E9C8E9D8E9E8E9F8EA0CFAFB0EF8EA18EA2E0FC8EA38EA48EA58EA68EA7E1A1B3A38EA88EA9E0FDE0FEC3B18EAA8EAB8EAC8EADC3DD8EAEE1A2B7F98EAF8EB08EB18EB28EB38EB4BBCF8EB58EB68EB78EB88EB98EBA8EBBE1A3C4BB8EBC8EBD8EBE8EBF8EC0E1A48EC18EC2E1A58EC38EC4E1A6B4B18EC58EC68EC78EC88EC98ECA8ECB8ECC8ECD8ECE8ECF8ED08ED18ED28ED3B8C9C6BDC4EA8ED4B2A28ED5D0D28ED6E7DBBBC3D3D7D3C48ED7B9E3E2CF8ED88ED98EDAD7AF8EDBC7ECB1D38EDC8EDDB4B2E2D18EDE8EDF8EE0D0F2C2AEE2D08EE1BFE2D3A6B5D7E2D2B5EA8EE2C3EDB8FD8EE3B8AE8EE4C5D3B7CFE2D48EE58EE68EE78EE8E2D3B6C8D7F98EE98EEA8EEB8EEC8EEDCDA58EEE8EEF8EF08EF18EF2E2D88EF3E2D6CAFCBFB5D3B9E2D58EF48EF58EF68EF7E2D78EF88EF98EFA8EFB8EFC8EFD8EFE8F408F418F42C1AEC0C88F438F448F458F468F478F48E2DBE2DAC0AA8F498F4AC1CE8F4B8F4C8F4D8F4EE2DC8F4F8F508F518F528F538F548F558F568F578F588F598F5AE2DD8F5BE2DE8F5C8F5D8F5E8F5F8F608F618F628F638F64DBC88F65D1D3CDA28F668F67BDA88F688F698F6ADEC3D8A5BFAADBCDD2ECC6FAC5AA8F6B8F6C8F6DDEC48F6EB1D7DFAE8F6F8F708F71CABD8F72DFB18F73B9AD8F74D2FD8F75B8A5BAEB8F768F77B3DA8F788F798F7AB5DCD5C58F7B8F7C8F7D8F7EC3D6CFD2BBA18F80E5F3E5F28F818F82E5F48F83CDE48F84C8F58F858F868F878F888F898F8A8F8BB5AFC7BF8F8CE5F68F8D8F8E8F8FECB08F908F918F928F938F948F958F968F978F988F998F9A8F9B8F9C8F9D8F9EE5E68F9FB9E9B5B18FA0C2BCE5E8E5E7E5E98FA18FA28FA38FA4D2CD8FA58FA68FA7E1EAD0CE8FA8CDAE8FA9D1E58FAA8FABB2CAB1EB8FACB1F2C5ED8FAD8FAED5C3D3B08FAFE1DC8FB08FB18FB2E1DD8FB3D2DB8FB4B3B9B1CB8FB58FB68FB7CDF9D5F7E1DE8FB8BEB6B4FD8FB9E1DFBADCE1E0BBB2C2C9E1E18FBA8FBB8FBCD0EC8FBDCDBD8FBE8FBFE1E28FC0B5C3C5C7E1E38FC18FC2E1E48FC38FC48FC58FC6D3F98FC78FC88FC98FCA8FCB8FCCE1E58FCDD1AD8FCE8FCFE1E6CEA28FD08FD18FD28FD38FD48FD5E1E78FD6B5C28FD78FD88FD98FDAE1E8BBD58FDB8FDC8FDD8FDE8FDFD0C4E2E0B1D8D2E48FE08FE1E2E18FE28FE3BCC9C8CC8FE4E2E3ECFEECFDDFAF8FE58FE68FE7E2E2D6BECDFCC3A68FE88FE98FEAE3C38FEB8FECD6D2E2E78FED8FEEE2E88FEF8FF0D3C78FF18FF2E2ECBFEC8FF3E2EDE2E58FF48FF5B3C08FF68FF78FF8C4EE8FF98FFAE2EE8FFB8FFCD0C38FFDBAF6E2E9B7DEBBB3CCACCBCBE2E4E2E6E2EAE2EB8FFE90409041E2F790429043E2F4D4F5E2F390449045C5AD9046D5FAC5C2B2C090479048E2EF9049E2F2C1AFCBBC904A904BB5A1E2F9904C904D904EBCB1E2F1D0D4D4B9E2F5B9D6E2F6904F90509051C7D390529053905490559056E2F0905790589059905A905BD7DCEDA1905C905DE2F8905EEDA5E2FECAD1905F906090619062906390649065C1B59066BBD090679068BFD69069BAE3906A906BCBA1906C906D906EEDA6EDA3906F9070EDA29071907290739074BBD6EDA7D0F490759076EDA4BADEB6F7E3A1B6B2CCF1B9A79077CFA2C7A190789079BFD2907A907BB6F1907CE2FAE2FBE2FDE2FCC4D5E3A2907DD3C1907E90809081E3A7C7C49082908390849085CFA490869087E3A9BAB790889089908A908BE3A8908CBBDA908DE3A3908E908F9090E3A4E3AA9091E3A69092CEF2D3C690939094BBBC90959096D4C39097C4FA90989099EDA8D0FCE3A5909AC3F5909BE3ADB1AF909CE3B2909D909E909FBCC290A090A1E3ACB5BF90A290A390A490A590A690A790A890A9C7E9E3B090AA90AB90ACBEAACDEF90AD90AE90AF90B090B1BBF390B290B390B4CCE890B590B6E3AF90B7E3B190B8CFA7E3AE90B9CEA9BBDD90BA90BB90BC90BD90BEB5EBBEE5B2D2B3CD90BFB1B9E3ABB2D1B5ACB9DFB6E890C090C1CFEBE3B790C2BBCC90C390C4C8C7D0CA90C590C690C790C890C9E3B8B3EE90CA90CB90CC90CDEDA990CED3FAD3E490CF90D090D1EDAAE3B9D2E290D290D390D490D590D6E3B590D790D890D990DAD3DE90DB90DC90DD90DEB8D0E3B390DF90E0E3B6B7DF90E1E3B4C0A290E290E390E4E3BA90E590E690E790E890E990EA90EB90EC90ED90EE90EF90F090F190F290F390F490F590F690F7D4B890F890F990FA90FB90FC90FD90FE9140B4C89141E3BB9142BBC59143C9F791449145C9E5914691479148C4BD9149914A914B914C914D914E914FEDAB9150915191529153C2FD9154915591569157BBDBBFAE91589159915A915B915C915D915ECEBF915F916091619162E3BC9163BFB6916491659166916791689169916A916B916C916D916E916F9170917191729173917491759176B1EF91779178D4F79179917A917B917C917DE3BE917E9180918191829183918491859186EDAD918791889189918A918B918C918D918E918FE3BFBAA9EDAC91909191E3BD91929193919491959196919791989199919A919BE3C0919C919D919E919F91A091A1BAB691A291A391A4B6AE91A591A691A791A891A9D0B891AAB0C3EDAE91AB91AC91AD91AE91AFEDAFC0C191B0E3C191B191B291B391B491B591B691B791B891B991BA91BB91BC91BD91BE91BF91C091C1C5B391C291C391C491C591C691C791C891C991CA91CB91CC91CD91CE91CFE3C291D091D191D291D391D491D591D691D791D8DCB291D991DA91DB91DC91DD91DEEDB091DFB8EA91E0CEECEAA7D0E7CAF9C8D6CFB7B3C9CED2BDE491E191E2E3DEBBF2EAA8D5BD91E3C6DDEAA991E491E591E6EAAA91E7EAACEAAB91E8EAAEEAAD91E991EA91EB91ECBDD891EDEAAF91EEC2BE91EF91F091F191F2B4C1B4F791F391F4BBA791F591F691F791F891F9ECE6ECE5B7BFCBF9B1E291FAECE791FB91FC91FDC9C8ECE8ECE991FECAD6DED0B2C5D4FA92409241C6CBB0C7B4F2C8D3924292439244CDD092459246BFB8924792489249924A924B924C924DBFDB924E924FC7A4D6B49250C0A9DED1C9A8D1EFC5A4B0E7B3B6C8C592519252B0E292539254B7F692559256C5FA92579258B6F39259D5D2B3D0BCBC925A925B925CB3AD925D925E925F9260BEF1B0D1926192629263926492659266D2D6CAE3D7A59267CDB6B6B6BFB9D5DB9268B8A7C5D79269926A926BDED2BFD9C2D5C7C0926CBBA4B1A8926D926EC5EA926F9270C5FBCCA79271927292739274B1A7927592769277B5D692789279927AC4A8927BDED3D1BAB3E9927CC3F2927D927EB7F79280D6F4B5A3B2F0C4B4C4E9C0ADDED49281B0E8C5C4C1E09282B9D59283BEDCCDD8B0CE9284CDCFDED6BED0D7BEDED5D5D0B0DD92859286C4E292879288C2A3BCF09289D3B5C0B9C5A1B2A6D4F1928A928BC0A8CAC3DED7D5FC928CB9B0928DC8ADCBA9928EDED9BFBD928F929092919292C6B4D7A7CAB0C4C39293B3D6B9D29294929592969297D6B8EAFCB0B492989299929A929BBFE6929C929DCCF4929E929F92A092A1CDDA92A292A392A4D6BFC2CE92A5CECECCA2D0AEC4D3B5B2DED8D5F5BCB7BBD392A692A7B0A492A8C5B2B4EC92A992AA92ABD5F192AC92ADEAFD92AE92AF92B092B192B292B3DEDACDA692B492B5CDEC92B692B792B892B9CEE6DEDC92BACDB1C0A692BB92BCD7BD92BDDEDBB0C6BAB4C9D3C4F3BEE892BE92BF92C092C1B2B692C292C392C492C592C692C792C892C9C0CCCBF092CABCF1BBBBB5B792CB92CC92CDC5F592CEDEE692CF92D092D1DEE3BEDD92D292D3DEDF92D492D592D692D7B4B7BDDD92D892D9DEE0C4ED92DA92DB92DC92DDCFC692DEB5E092DF92E092E192E2B6DECADAB5F4DEE592E3D5C692E4DEE1CCCDC6FE92E5C5C592E692E792E8D2B492E9BEF292EA92EB92EC92ED92EE92EF92F0C2D392F1CCBDB3B892F2BDD392F3BFD8CDC6D1DAB4EB92F4DEE4DEDDDEE792F5EAFE92F692F7C2B0DEE292F892F9D6C0B5A792FAB2F492FBDEE892FCDEF292FD92FE934093419342DEED9343DEF193449345C8E0934693479348D7E1DEEFC3E8CCE19349B2E5934A934B934CD2BE934D934E934F9350935193529353DEEE9354DEEBCED59355B4A79356935793589359935ABFABBEBE935B935CBDD2935D935E935F9360DEE99361D4AE9362DEDE9363DEEA9364936593669367C0BF9368DEECB2F3B8E9C2A79369936ABDC1936B936C936D936E936FDEF5DEF893709371B2ABB4A493729373B4EAC9A6937493759376937793789379DEF6CBD1937AB8E3937BDEF7DEFA937C937D937E9380DEF9938193829383CCC29384B0E1B4EE93859386938793889389938AE5BA938B938C938D938E938FD0AF93909391B2EB9392EBA19393DEF493949395C9E3DEF3B0DAD2A1B1F79396CCAF939793989399939A939B939C939DDEF0939ECBA4939F93A093A1D5AA93A293A393A493A593A6DEFB93A793A893A993AA93AB93AC93AD93AEB4DD93AFC4A693B093B193B2DEFD93B393B493B593B693B793B893B993BA93BB93BCC3FEC4A1DFA193BD93BE93BF93C093C193C293C3C1CC93C4DEFCBEEF93C5C6B293C693C793C893C993CA93CB93CC93CD93CEB3C5C8F693CF93D0CBBADEFE93D193D2DFA493D393D493D593D6D7B293D793D893D993DA93DBB3B793DC93DD93DE93DFC1C393E093E1C7CBB2A5B4E993E2D7AB93E393E493E593E6C4EC93E7DFA2DFA393E8DFA593E9BAB393EA93EB93ECDFA693EDC0DE93EE93EFC9C393F093F193F293F393F493F593F6B2D9C7E693F7DFA793F8C7DC93F993FA93FB93FCDFA8EBA293FD93FE944094419442CBD3944394449445DFAA9446DFA99447B2C194489449944A944B944C944D944E944F9450945194529453945494559456945794589459945A945B945C945D945E945F9460C5CA94619462946394649465946694679468DFAB9469946A946B946C946D946E946F9470D4DC94719472947394749475C8C19476947794789479947A947B947C947D947E948094819482DFAC94839484948594869487BEF094889489DFADD6A7948A948B948C948DEAB7EBB6CAD5948ED8FCB8C4948FB9A594909491B7C5D5FE94929493949494959496B9CA94979498D0A7F4CD9499949AB5D0949B949CC3F4949DBEC8949E949F94A0EBB7B0BD94A194A2BDCC94A3C1B294A4B1D6B3A894A594A694A7B8D2C9A294A894A9B6D894AA94AB94AC94ADEBB8BEB494AE94AF94B0CAFD94B1C7C394B2D5FB94B394B4B7F394B594B694B794B894B994BA94BB94BC94BD94BE94BF94C094C194C294C3CEC494C494C594C6D5ABB1F394C794C894C9ECB3B0DF94CAECB594CB94CC94CDB6B794CEC1CF94CFF5FAD0B194D094D1D5E594D2CED394D394D4BDEFB3E294D5B8AB94D6D5B694D7EDBD94D8B6CF94D9CBB9D0C294DA94DB94DC94DD94DE94DF94E094E1B7BD94E294E3ECB6CAA994E494E594E6C5D494E7ECB9ECB8C2C3ECB794E894E994EA94EBD0FDECBA94ECECBBD7E594ED94EEECBC94EF94F094F1ECBDC6EC94F294F394F494F594F694F794F894F9CEDE94FABCC894FB94FCC8D5B5A9BEC9D6BCD4E794FD94FED1AED0F1EAB8EAB9EABABAB59540954195429543CAB1BFF595449545CDFA9546954795489549954AEAC0954BB0BAEABE954C954DC0A5954E954F9550EABB9551B2FD9552C3F7BBE8955395549555D2D7CEF4EABF955695579558EABC9559955A955BEAC3955CD0C7D3B3955D955E955F9560B4BA9561C3C1D7F29562956395649565D5D19566CAC79567EAC595689569EAC4EAC7EAC6956A956B956C956D956ED6E7956FCFD495709571EACB9572BBCE9573957495759576957795789579BDFAC9CE957A957BEACC957C957DC9B9CFFEEACAD4CEEACDEACF957E9580CDED9581958295839584EAC99585EACE95869587CEEE9588BBDE9589B3BF958A958B958C958D958EC6D5BEB0CEFA958F95909591C7E79592BEA7EAD095939594D6C7959595969597C1C095989599959AD4DD959BEAD1959C959DCFBE959E959F95A095A1EAD295A295A395A495A5CAEE95A695A795A895A9C5AFB0B595AA95AB95AC95AD95AEEAD495AF95B095B195B295B395B495B595B695B7EAD3F4DF95B895B995BA95BB95BCC4BA95BD95BE95BF95C095C1B1A995C295C395C495C5E5DF95C695C795C895C9EAD595CA95CB95CC95CD95CE95CF95D095D195D295D395D495D595D695D795D895D995DA95DB95DC95DD95DE95DF95E095E195E295E3CAEF95E4EAD6EAD7C6D895E595E695E795E895E995EA95EB95ECEAD895ED95EEEAD995EF95F095F195F295F395F4D4BB95F5C7FAD2B7B8FC95F695F7EAC295F8B2DC95F995FAC2FC95FBD4F8CCE6D7EE95FC95FD95FE9640964196429643D4C2D3D0EBC3C5F39644B7FE96459646EBD4964796489649CBB7EBDE964AC0CA964B964C964DCDFB964EB3AF964FC6DA965096519652965396549655EBFC9656C4BE9657CEB4C4A9B1BED4FD9658CAF59659D6EC965A965BC6D3B6E4965C965D965E965FBBFA96609661D0E096629663C9B19664D4D3C8A896659666B8CB9667E8BEC9BC96689669E8BB966AC0EED0D3B2C4B4E5966BE8BC966C966DD5C8966E966F967096719672B6C59673E8BDCAF8B8DCCCF5967496759676C0B496779678D1EEE8BFE8C29679967ABABC967BB1ADBDDC967CEABDE8C3967DE8C6967EE8CB9680968196829683E8CC9684CBC9B0E59685BCAB96869687B9B996889689E8C1968ACDF7968BE8CA968C968D968E968FCEF69690969196929693D5ED9694C1D6E8C49695C3B69696B9FBD6A6E8C8969796989699CAE0D4E6969AE8C0969BE8C5E8C7969CC7B9B7E3969DE8C9969EBFDDE8D2969F96A0E8D796A1E8D5BCDCBCCFE8DB96A296A396A496A596A696A796A896A9E8DE96AAE8DAB1FA96AB96AC96AD96AE96AF96B096B196B296B396B4B0D8C4B3B8CCC6E2C8BEC8E196B596B696B7E8CFE8D4E8D696B8B9F1E8D8D7F596B9C4FB96BAE8DC96BB96BCB2E996BD96BE96BFE8D196C096C1BCED96C296C3BFC2E8CDD6F996C4C1F8B2F196C596C696C796C896C996CA96CB96CCE8DF96CDCAC1E8D996CE96CF96D096D1D5A496D2B1EAD5BBE8CEE8D0B6B0E8D396D3E8DDC0B896D4CAF796D5CBA896D696D7C6DCC0F596D896D996DA96DB96DCE8E996DD96DE96DFD0A396E096E196E296E396E496E596E6E8F2D6EA96E796E896E996EA96EB96EC96EDE8E0E8E196EE96EF96F0D1F9BACBB8F996F196F2B8F1D4D4E8EF96F3E8EEE8ECB9F0CCD2E8E6CEA6BFF296F4B0B8E8F1E8F096F5D7C096F6E8E496F7CDA9C9A396F8BBB8BDDBE8EA96F996FA96FB96FC96FD96FE9740974197429743E8E2E8E3E8E5B5B5E8E7C7C5E8EBE8EDBDB0D7AE9744E8F897459746974797489749974A974B974CE8F5974DCDB0E8F6974E974F9750975197529753975497559756C1BA9757E8E89758C3B7B0F09759975A975B975C975D975E975F9760E8F4976197629763E8F7976497659766B9A3976797689769976A976B976C976D976E976F9770C9D2977197729773C3CECEE0C0E69774977597769777CBF39778CCDDD0B59779977ACAE1977BE8F3977C977D977E9780978197829783978497859786BCEC9787E8F997889789978A978B978C978DC3DE978EC6E5978FB9F79790979197929793B0F497949795D7D897969797BCAC9798C5EF9799979A979B979C979DCCC4979E979FE9A697A097A197A297A397A497A597A697A797A897A9C9AD97AAE9A2C0E297AB97AC97ADBFC397AE97AF97B0E8FEB9D797B1E8FB97B297B397B497B5E9A497B697B797B8D2CE97B997BA97BB97BC97BDE9A397BED6B2D7B597BFE9A797C0BDB797C197C297C397C497C597C697C797C897C997CA97CB97CCE8FCE8FD97CD97CE97CFE9A197D097D197D297D397D497D597D697D7CDD697D897D9D2AC97DA97DB97DCE9B297DD97DE97DF97E0E9A997E197E297E3B4AA97E4B4BB97E597E6E9AB97E797E897E997EA97EB97EC97ED97EE97EF97F097F197F297F397F497F597F697F7D0A897F897F9E9A597FA97FBB3FE97FC97FDE9ACC0E397FEE9AA98409841E9B998429843E9B89844984598469847E9AE98489849E8FA984A984BE9A8984C984D984E984F9850BFACE9B1E9BA98519852C2A5985398549855E9AF9856B8C59857E9AD9858D3DCE9B4E9B5E9B79859985A985BE9C7985C985D985E985F98609861C0C6E9C598629863E9B098649865E9BBB0F19866986798689869986A986B986C986D986E986FE9BCD5A598709871E9BE9872E9BF987398749875E9C198769877C1F198789879C8B6987A987B987CE9BD987D987E988098819882E9C29883988498859886988798889889988AE9C3988BE9B3988CE9B6988DBBB1988E988F9890E9C0989198929893989498959896BCF7989798989899E9C4E9C6989A989B989C989D989E989F98A098A198A298A398A498A5E9CA98A698A798A898A9E9CE98AA98AB98AC98AD98AE98AF98B098B198B298B3B2DB98B4E9C898B598B698B798B898B998BA98BB98BC98BD98BEB7AE98BF98C098C198C298C398C498C598C698C798C898C998CAE9CBE9CC98CB98CC98CD98CE98CF98D0D5C198D1C4A398D298D398D498D598D698D7E9D898D8BAE198D998DA98DB98DCE9C998DDD3A398DE98DF98E0E9D498E198E298E398E498E598E698E7E9D7E9D098E898E998EA98EB98ECE9CF98ED98EEC7C198EF98F098F198F298F398F498F598F6E9D298F798F898F998FA98FB98FC98FDE9D9B3C898FEE9D399409941994299439944CFF0994599469947E9CD99489949994A994B994C994D994E994F995099519952B3F79953995499559956995799589959E9D6995A995BE9DA995C995D995ECCB4995F99609961CFAD99629963996499659966996799689969996AE9D5996BE9DCE9DB996C996D996E996F9970E9DE99719972997399749975997699779978E9D19979997A997B997C997D997E99809981E9DD9982E9DFC3CA9983998499859986998799889989998A998B998C998D998E998F9990999199929993999499959996999799989999999A999B999C999D999E999F99A099A199A299A399A499A599A699A799A899A999AA99AB99AC99AD99AE99AF99B099B199B299B399B499B599B699B799B899B999BA99BB99BC99BD99BE99BF99C099C199C299C399C499C599C699C799C899C999CA99CB99CC99CD99CE99CF99D099D199D299D399D499D599D699D799D899D999DA99DB99DC99DD99DE99DF99E099E199E299E399E499E599E699E799E899E999EA99EB99EC99ED99EE99EF99F099F199F299F399F499F5C7B7B4CEBBB6D0C0ECA399F699F7C5B799F899F999FA99FB99FC99FD99FE9A409A419A42D3FB9A439A449A459A46ECA49A47ECA5C6DB9A489A499A4ABFEE9A4B9A4C9A4D9A4EECA69A4F9A50ECA7D0AA9A51C7B89A529A53B8E89A549A559A569A579A589A599A5A9A5B9A5C9A5D9A5E9A5FECA89A609A619A629A639A649A659A669A67D6B9D5FDB4CBB2BDCEE4C6E79A689A69CDE19A6A9A6B9A6C9A6D9A6E9A6F9A709A719A729A739A749A759A769A77B4F59A78CBC0BCDF9A799A7A9A7B9A7CE9E2E9E3D1EAE9E59A7DB4F9E9E49A7ED1B3CAE2B2D09A80E9E89A819A829A839A84E9E6E9E79A859A86D6B39A879A889A89E9E9E9EA9A8A9A8B9A8C9A8D9A8EE9EB9A8F9A909A919A929A939A949A959A96E9EC9A979A989A999A9A9A9B9A9C9A9D9A9EECAFC5B9B6CE9A9FD2F39AA09AA19AA29AA39AA49AA59AA6B5EE9AA7BBD9ECB19AA89AA9D2E39AAA9AAB9AAC9AAD9AAECEE39AAFC4B89AB0C3BF9AB19AB2B6BED8B9B1C8B1CFB1D1C5FE9AB3B1D09AB4C3AB9AB59AB69AB79AB89AB9D5B19ABA9ABB9ABC9ABD9ABE9ABF9AC09AC1EBA4BAC19AC29AC39AC4CCBA9AC59AC69AC7EBA59AC8EBA79AC99ACA9ACBEBA89ACC9ACD9ACEEBA69ACF9AD09AD19AD29AD39AD49AD5EBA9EBABEBAA9AD69AD79AD89AD99ADAEBAC9ADBCACFD8B5C3F19ADCC3A5C6F8EBADC4CA9ADDEBAEEBAFEBB0B7D59ADE9ADF9AE0B7FA9AE1EBB1C7E29AE2EBB39AE3BAA4D1F5B0B1EBB2EBB49AE49AE59AE6B5AAC2C8C7E89AE7EBB59AE8CBAEE3DF9AE99AEAD3C09AEB9AEC9AED9AEED9DB9AEF9AF0CDA1D6ADC7F39AF19AF29AF3D9E0BBE39AF4BABAE3E29AF59AF69AF79AF89AF9CFAB9AFA9AFB9AFCE3E0C9C79AFDBAB99AFE9B409B41D1B4E3E1C8EAB9AFBDADB3D8CEDB9B429B43CCC09B449B459B46E3E8E3E9CDF49B479B489B499B4A9B4BCCAD9B4CBCB39B4DE3EA9B4EE3EB9B4F9B50D0DA9B519B529B53C6FBB7DA9B549B55C7DFD2CACED69B56E3E4E3EC9B57C9F2B3C19B589B59E3E79B5A9B5BC6E3E3E59B5C9B5DEDB3E3E69B5E9B5F9B609B61C9B39B62C5E69B639B649B65B9B59B66C3BB9B67E3E3C5BDC1A4C2D9B2D79B68E3EDBBA6C4AD9B69E3F0BEDA9B6A9B6BE3FBE3F5BAD39B6C9B6D9B6E9B6FB7D0D3CD9B70D6CED5D3B9C1D5B4D1D89B719B729B739B74D0B9C7F69B759B769B77C8AAB2B49B78C3DA9B799B7A9B7BE3EE9B7C9B7DE3FCE3EFB7A8E3F7E3F49B7E9B809B81B7BA9B829B83C5A29B84E3F6C5DDB2A8C6FC9B85C4E09B869B87D7A29B88C0E1E3F99B899B8AE3FAE3FDCCA9E3F39B8BD3BE9B8CB1C3EDB4E3F1E3F29B8DE3F8D0BAC6C3D4F3E3FE9B8E9B8FBDE09B909B91E4A79B929B93E4A69B949B959B96D1F3E4A39B97E4A99B989B999B9AC8F79B9B9B9C9B9D9B9ECFB49B9FE4A8E4AEC2E59BA09BA1B6B49BA29BA39BA49BA59BA69BA7BDF29BA8E4A29BA99BAABAE9E4AA9BAB9BACE4AC9BAD9BAEB6FDD6DEE4B29BAFE4AD9BB09BB19BB2E4A19BB3BBEECDDDC7A2C5C99BB49BB5C1F79BB6E4A49BB7C7B3BDACBDBDE4A59BB8D7C7B2E29BB9E4ABBCC3E4AF9BBABBEBE4B0C5A8E4B19BBB9BBC9BBD9BBED5E3BFA39BBFE4BA9BC0E4B79BC1E4BB9BC29BC3E4BD9BC49BC5C6D69BC69BC7BAC6C0CB9BC89BC99BCAB8A1E4B49BCB9BCC9BCD9BCED4A19BCF9BD0BAA3BDFE9BD19BD29BD3E4BC9BD49BD59BD69BD79BD8CDBF9BD99BDAC4F99BDB9BDCCFFBC9E69BDD9BDED3BF9BDFCFD19BE09BE1E4B39BE2E4B8E4B9CCE99BE39BE49BE59BE69BE7CCCE9BE8C0D4E4B5C1B0E4B6CED09BE9BBC1B5D39BEAC8F3BDA7D5C7C9ACB8A2E4CA9BEB9BECE4CCD1C49BED9BEED2BA9BEF9BF0BAAD9BF19BF2BAD49BF39BF49BF59BF69BF79BF8E4C3B5ED9BF99BFA9BFBD7CDE4C0CFFDE4BF9BFC9BFD9BFEC1DCCCCA9C409C419C429C43CAE79C449C459C469C47C4D79C48CCD4E4C89C499C4A9C4BE4C7E4C19C4CE4C4B5AD9C4D9C4ED3D99C4FE4C69C509C519C529C53D2F9B4E39C54BBB49C559C56C9EE9C57B4BE9C589C599C5ABBEC9C5BD1CD9C5CCCEDEDB59C5D9C5E9C5F9C609C619C629C639C64C7E59C659C669C679C68D4A89C69E4CBD7D5E4C29C6ABDA5E4C59C6B9C6CD3E69C6DE4C9C9F89C6E9C6FE4BE9C709C71D3E59C729C73C7FEB6C99C74D4FCB2B3E4D79C759C769C77CEC29C78E4CD9C79CEBC9C7AB8DB9C7B9C7CE4D69C7DBFCA9C7E9C809C81D3CE9C82C3EC9C839C849C859C869C879C889C899C8AC5C8E4D89C8B9C8C9C8D9C8E9C8F9C909C919C92CDC4E4CF9C939C949C959C96E4D4E4D59C97BAFE9C98CFE69C999C9AD5BF9C9B9C9C9C9DE4D29C9E9C9F9CA09CA19CA29CA39CA49CA59CA69CA79CA8E4D09CA99CAAE4CE9CAB9CAC9CAD9CAE9CAF9CB09CB19CB29CB39CB49CB59CB69CB79CB89CB9CDE5CAAA9CBA9CBB9CBCC0A39CBDBDA6E4D39CBE9CBFB8C89CC09CC19CC29CC39CC4E4E7D4B49CC59CC69CC79CC89CC99CCA9CCBE4DB9CCC9CCD9CCEC1EF9CCF9CD0E4E99CD19CD2D2E79CD39CD4E4DF9CD5E4E09CD69CD7CFAA9CD89CD99CDA9CDBCBDD9CDCE4DAE4D19CDDE4E59CDEC8DCE4E39CDF9CE0C4E7E4E29CE1E4E19CE29CE39CE4B3FCE4E89CE59CE69CE79CE8B5E19CE99CEA9CEBD7CC9CEC9CED9CEEE4E69CEFBBAC9CF0D7D2CCCFEBF89CF1E4E49CF29CF3B9F69CF49CF59CF6D6CDE4D9E4DCC2FAE4DE9CF7C2CBC0C4C2D09CF8B1F5CCB29CF99CFA9CFB9CFC9CFD9CFE9D409D419D429D43B5CE9D449D459D469D47E4EF9D489D499D4A9D4B9D4C9D4D9D4E9D4FC6AF9D509D519D52C6E19D539D54E4F59D559D569D579D589D59C2A99D5A9D5B9D5CC0ECD1DDE4EE9D5D9D5E9D5F9D609D619D629D639D649D659D66C4AE9D679D689D69E4ED9D6A9D6B9D6C9D6DE4F6E4F4C2FE9D6EE4DD9D6FE4F09D70CAFE9D71D5C49D729D73E4F19D749D759D769D779D789D799D7AD1FA9D7B9D7C9D7D9D7E9D809D819D82E4EBE4EC9D839D849D85E4F29D86CEAB9D879D889D899D8A9D8B9D8C9D8D9D8E9D8F9D90C5CB9D919D929D93C7B19D94C2BA9D959D969D97E4EA9D989D999D9AC1CA9D9B9D9C9D9D9D9E9D9F9DA0CCB6B3B19DA19DA29DA3E4FB9DA4E4F39DA59DA69DA7E4FA9DA8E4FD9DA9E4FC9DAA9DAB9DAC9DAD9DAE9DAF9DB0B3CE9DB19DB29DB3B3BAE4F79DB49DB5E4F9E4F8C5EC9DB69DB79DB89DB99DBA9DBB9DBC9DBD9DBE9DBF9DC09DC19DC2C0BD9DC39DC49DC59DC6D4E89DC79DC89DC99DCA9DCBE5A29DCC9DCD9DCE9DCF9DD09DD19DD29DD39DD49DD59DD6B0C49DD79DD8E5A49DD99DDAE5A39DDB9DDC9DDD9DDE9DDF9DE0BCA49DE1E5A59DE29DE39DE49DE59DE69DE7E5A19DE89DE99DEA9DEB9DEC9DED9DEEE4FEB1F49DEF9DF09DF19DF29DF39DF49DF59DF69DF79DF89DF9E5A89DFAE5A9E5A69DFB9DFC9DFD9DFE9E409E419E429E439E449E459E469E47E5A7E5AA9E489E499E4A9E4B9E4C9E4D9E4E9E4F9E509E519E529E539E549E559E569E579E589E599E5A9E5B9E5C9E5D9E5E9E5F9E609E619E629E639E649E659E669E679E68C6D99E699E6A9E6B9E6C9E6D9E6E9E6F9E70E5ABE5AD9E719E729E739E749E759E769E77E5AC9E789E799E7A9E7B9E7C9E7D9E7E9E809E819E829E839E849E859E869E879E889E89E5AF9E8A9E8B9E8CE5AE9E8D9E8E9E8F9E909E919E929E939E949E959E969E979E989E999E9A9E9B9E9C9E9D9E9EB9E09E9F9EA0E5B09EA19EA29EA39EA49EA59EA69EA79EA89EA99EAA9EAB9EAC9EAD9EAEE5B19EAF9EB09EB19EB29EB39EB49EB59EB69EB79EB89EB99EBABBF0ECE1C3F09EBBB5C6BBD29EBC9EBD9EBE9EBFC1E9D4EE9EC0BEC49EC19EC29EC3D7C69EC4D4D6B2D3ECBE9EC59EC69EC79EC8EAC19EC99ECA9ECBC2AFB4B69ECC9ECD9ECED1D79ECF9ED09ED1B3B49ED2C8B2BFBBECC09ED39ED4D6CB9ED59ED6ECBFECC19ED79ED89ED99EDA9EDB9EDC9EDD9EDE9EDF9EE09EE19EE29EE3ECC5BEE6CCBFC5DABEBC9EE4ECC69EE5B1FE9EE69EE79EE8ECC4D5A8B5E39EE9ECC2C1B6B3E39EEA9EEBECC3CBB8C0C3CCFE9EEC9EED9EEE9EEFC1D29EF0ECC89EF19EF29EF39EF49EF59EF69EF79EF89EF99EFA9EFB9EFC9EFDBAE6C0D39EFED6F29F409F419F42D1CC9F439F449F459F46BFBE9F47B7B3C9D5ECC7BBE29F48CCCCBDFDC8C89F49CFA99F4A9F4B9F4C9F4D9F4E9F4F9F50CDE99F51C5EB9F529F539F54B7E99F559F569F579F589F599F5A9F5B9F5C9F5D9F5E9F5FD1C9BAB89F609F619F629F639F64ECC99F659F66ECCA9F67BBC0ECCB9F68ECE2B1BAB7D99F699F6A9F6B9F6C9F6D9F6E9F6F9F709F719F729F73BDB99F749F759F769F779F789F799F7A9F7BECCCD1E6ECCD9F7C9F7D9F7E9F80C8BB9F819F829F839F849F859F869F879F889F899F8A9F8B9F8C9F8D9F8EECD19F8F9F909F919F92ECD39F93BBCD9F94BCE59F959F969F979F989F999F9A9F9B9F9C9F9D9F9E9F9F9FA09FA1ECCF9FA2C9B79FA39FA49FA59FA69FA7C3BA9FA8ECE3D5D5ECD09FA99FAA9FAB9FAC9FADD6F39FAE9FAF9FB0ECD2ECCE9FB19FB29FB39FB4ECD49FB5ECD59FB69FB7C9BF9FB89FB99FBA9FBB9FBC9FBDCFA89FBE9FBF9FC09FC19FC2D0DC9FC39FC49FC59FC6D1AC9FC79FC89FC99FCAC8DB9FCB9FCC9FCDECD6CEF59FCE9FCF9FD09FD19FD2CAECECDA9FD39FD49FD59FD69FD79FD89FD9ECD99FDA9FDB9FDCB0BE9FDD9FDE9FDF9FE09FE19FE2ECD79FE3ECD89FE49FE59FE6ECE49FE79FE89FE99FEA9FEB9FEC9FED9FEE9FEFC8BC9FF09FF19FF29FF39FF49FF59FF69FF79FF89FF9C1C79FFA9FFB9FFC9FFD9FFEECDCD1E0A040A041A042A043A044A045A046A047A048A049ECDBA04AA04BA04CA04DD4EFA04EECDDA04FA050A051A052A053A054DBC6A055A056A057A058A059A05AA05BA05CA05DA05EECDEA05FA060A061A062A063A064A065A066A067A068A069A06AB1ACA06BA06CA06DA06EA06FA070A071A072A073A074A075A076A077A078A079A07AA07BA07CA07DA07EA080A081ECDFA082A083A084A085A086A087A088A089A08AA08BECE0A08CD7A6A08DC5C0A08EA08FA090EBBCB0AEA091A092A093BEF4B8B8D2AFB0D6B5F9A094D8B3A095CBACA096E3DDA097A098A099A09AA09BA09CA09DC6ACB0E6A09EA09FA0A0C5C6EBB9A0A1A0A2A0A3A0A4EBBAA0A5A0A6A0A7EBBBA0A8A0A9D1C0A0AAC5A3A0ABEAF2A0ACC4B2A0ADC4B5C0CEA0AEA0AFA0B0EAF3C4C1A0B1CEEFA0B2A0B3A0B4A0B5EAF0EAF4A0B6A0B7C9FCA0B8A0B9C7A3A0BAA0BBA0BCCCD8CEFEA0BDA0BEA0BFEAF5EAF6CFACC0E7A0C0A0C1EAF7A0C2A0C3A0C4A0C5A0C6B6BFEAF8A0C7EAF9A0C8EAFAA0C9A0CAEAFBA0CBA0CCA0CDA0CEA0CFA0D0A0D1A0D2A0D3A0D4A0D5A0D6EAF1A0D7A0D8A0D9A0DAA0DBA0DCA0DDA0DEA0DFA0E0A0E1A0E2C8AEE1EBA0E3B7B8E1ECA0E4A0E5A0E6E1EDA0E7D7B4E1EEE1EFD3CCA0E8A0E9A0EAA0EBA0ECA0EDA0EEE1F1BFF1E1F0B5D2A0EFA0F0A0F1B1B7A0F2A0F3A0F4A0F5E1F3E1F2A0F6BAFCA0F7E1F4A0F8A0F9A0FAA0FBB9B7A0FCBED1A0FDA0FEAA40AA41C4FCAA42BADDBDC6AA43AA44AA45AA46AA47AA48E1F5E1F7AA49AA4AB6C0CFC1CAA8E1F6D5F8D3FCE1F8E1FCE1F9AA4BAA4CE1FAC0EAAA4DE1FEE2A1C0C7AA4EAA4FAA50AA51E1FBAA52E1FDAA53AA54AA55AA56AA57AA58E2A5AA59AA5AAA5BC1D4AA5CAA5DAA5EAA5FE2A3AA60E2A8B2FEE2A2AA61AA62AA63C3CDB2C2E2A7E2A6AA64AA65E2A4E2A9AA66AA67E2ABAA68AA69AA6AD0C9D6EDC3A8E2ACAA6BCFD7AA6CAA6DE2AEAA6EAA6FBAEFAA70AA71E9E0E2ADE2AAAA72AA73AA74AA75BBABD4B3AA76AA77AA78AA79AA7AAA7BAA7CAA7DAA7EAA80AA81AA82AA83E2B0AA84AA85E2AFAA86E9E1AA87AA88AA89AA8AE2B1AA8BAA8CAA8DAA8EAA8FAA90AA91AA92E2B2AA93AA94AA95AA96AA97AA98AA99AA9AAA9BAA9CAA9DE2B3CCA1AA9EE2B4AA9FAAA0AB40AB41AB42AB43AB44AB45AB46AB47AB48AB49AB4AAB4BE2B5AB4CAB4DAB4EAB4FAB50D0FEAB51AB52C2CAAB53D3F1AB54CDF5AB55AB56E7E0AB57AB58E7E1AB59AB5AAB5BAB5CBEC1AB5DAB5EAB5FAB60C2EAAB61AB62AB63E7E4AB64AB65E7E3AB66AB67AB68AB69AB6AAB6BCDE6AB6CC3B5AB6DAB6EE7E2BBB7CFD6AB6FC1E1E7E9AB70AB71AB72E7E8AB73AB74E7F4B2A3AB75AB76AB77AB78E7EAAB79E7E6AB7AAB7BAB7CAB7DAB7EE7ECE7EBC9BAAB80AB81D5E4AB82E7E5B7A9E7E7AB83AB84AB85AB86AB87AB88AB89E7EEAB8AAB8BAB8CAB8DE7F3AB8ED6E9AB8FAB90AB91AB92E7EDAB93E7F2AB94E7F1AB95AB96AB97B0E0AB98AB99AB9AAB9BE7F5AB9CAB9DAB9EAB9FABA0AC40AC41AC42AC43AC44AC45AC46AC47AC48AC49AC4AC7F2AC4BC0C5C0EDAC4CAC4DC1F0E7F0AC4EAC4FAC50AC51E7F6CBF6AC52AC53AC54AC55AC56AC57AC58AC59AC5AE8A2E8A1AC5BAC5CAC5DAC5EAC5FAC60D7C1AC61AC62E7FAE7F9AC63E7FBAC64E7F7AC65E7FEAC66E7FDAC67E7FCAC68AC69C1D5C7D9C5FDC5C3AC6AAC6BAC6CAC6DAC6EC7EDAC6FAC70AC71AC72E8A3AC73AC74AC75AC76AC77AC78AC79AC7AAC7BAC7CAC7DAC7EAC80AC81AC82AC83AC84AC85AC86E8A6AC87E8A5AC88E8A7BAF7E7F8E8A4AC89C8F0C9AAAC8AAC8BAC8CAC8DAC8EAC8FAC90AC91AC92AC93AC94AC95AC96E8A9AC97AC98B9E5AC99AC9AAC9BAC9CAC9DD1FEE8A8AC9EAC9FACA0AD40AD41AD42E8AAAD43E8ADE8AEAD44C1A7AD45AD46AD47E8AFAD48AD49AD4AE8B0AD4BAD4CE8ACAD4DE8B4AD4EAD4FAD50AD51AD52AD53AD54AD55AD56AD57AD58E8ABAD59E8B1AD5AAD5BAD5CAD5DAD5EAD5FAD60AD61E8B5E8B2E8B3AD62AD63AD64AD65AD66AD67AD68AD69AD6AAD6BAD6CAD6DAD6EAD6FAD70AD71E8B7AD72AD73AD74AD75AD76AD77AD78AD79AD7AAD7BAD7CAD7DAD7EAD80AD81AD82AD83AD84AD85AD86AD87AD88AD89E8B6AD8AAD8BAD8CAD8DAD8EAD8FAD90AD91AD92B9CFAD93F0ACAD94F0ADAD95C6B0B0EAC8BFAD96CDDFAD97AD98AD99AD9AAD9BAD9CAD9DCECDEAB1AD9EAD9FADA0AE40EAB2AE41C6BFB4C9AE42AE43AE44AE45AE46AE47AE48EAB3AE49AE4AAE4BAE4CD5E7AE4DAE4EAE4FAE50AE51AE52AE53AE54DDF9AE55EAB4AE56EAB5AE57EAB6AE58AE59AE5AAE5BB8CADFB0C9F5AE5CCCF0AE5DAE5EC9FAAE5FAE60AE61AE62AE63C9FBAE64AE65D3C3CBA6AE66B8A6F0AEB1C2AE67E5B8CCEFD3C9BCD7C9EAAE68B5E7AE69C4D0B5E9AE6AEEAEBBADAE6BAE6CE7DEAE6DEEAFAE6EAE6FAE70AE71B3A9AE72AE73EEB2AE74AE75EEB1BDE7AE76EEB0CEB7AE77AE78AE79AE7AC5CFAE7BAE7CAE7DAE7EC1F4DBCEEEB3D0F3AE80AE81AE82AE83AE84AE85AE86AE87C2D4C6E8AE88AE89AE8AB7ACAE8BAE8CAE8DAE8EAE8FAE90AE91EEB4AE92B3EBAE93AE94AE95BBFBEEB5AE96AE97AE98AE99AE9AE7DCAE9BAE9CAE9DEEB6AE9EAE9FBDAEAEA0AF40AF41AF42F1E2AF43AF44AF45CAE8AF46D2C9F0DAAF47F0DBAF48F0DCC1C6AF49B8EDBECEAF4AAF4BF0DEAF4CC5B1F0DDD1F1AF4DF0E0B0CCBDEAAF4EAF4FAF50AF51AF52D2DFF0DFAF53B4AFB7E8F0E6F0E5C6A3F0E1F0E2B4C3AF54AF55F0E3D5EEAF56AF57CCDBBED2BCB2AF58AF59AF5AF0E8F0E7F0E4B2A1AF5BD6A2D3B8BEB7C8ACAF5CAF5DF0EAAF5EAF5FAF60AF61D1F7AF62D6CCBADBF0E9AF63B6BBAF64AF65CDB4AF66AF67C6A6AF68AF69AF6AC1A1F0EBF0EEAF6BF0EDF0F0F0ECAF6CBBBEF0EFAF6DAF6EAF6FAF70CCB5F0F2AF71AF72B3D5AF73AF74AF75AF76B1D4AF77AF78F0F3AF79AF7AF0F4F0F6B4E1AF7BF0F1AF7CF0F7AF7DAF7EAF80AF81F0FAAF82F0F8AF83AF84AF85F0F5AF86AF87AF88AF89F0FDAF8AF0F9F0FCF0FEAF8BF1A1AF8CAF8DAF8ECEC1F1A4AF8FF1A3AF90C1F6F0FBCADDAF91AF92B4F1B1F1CCB1AF93F1A6AF94AF95F1A7AF96AF97F1ACD5CEF1A9AF98AF99C8B3AF9AAF9BAF9CF1A2AF9DF1ABF1A8F1A5AF9EAF9FF1AAAFA0B040B041B042B043B044B045B046B0A9F1ADB047B048B049B04AB04BB04CF1AFB04DF1B1B04EB04FB050B051B052F1B0B053F1AEB054B055B056B057D1A2B058B059B05AB05BB05CB05DB05EF1B2B05FB060B061F1B3B062B063B064B065B066B067B068B069B9EFB06AB06BB5C7B06CB0D7B0D9B06DB06EB06FD4EDB070B5C4B071BDD4BBCAF0A7B072B073B8DEB074B075F0A8B076B077B0A8B078F0A9B079B07ACDEEB07BB07CF0AAB07DB07EB080B081B082B083B084B085B086B087F0ABB088B089B08AB08BB08CB08DB08EB08FB090C6A4B091B092D6E5F1E4B093F1E5B094B095B096B097B098B099B09AB09BB09CB09DC3F3B09EB09FD3DBB0A0B140D6D1C5E8B141D3AFB142D2E6B143B144EEC1B0BBD5B5D1CEBCE0BAD0B145BFF8B146B8C7B5C1C5CCB147B148CAA2B149B14AB14BC3CBB14CB14DB14EB14FB150EEC2B151B152B153B154B155B156B157B158C4BFB6A2B159EDECC3A4B15AD6B1B15BB15CB15DCFE0EDEFB15EB15FC5CEB160B6DCB161B162CAA1B163B164EDEDB165B166EDF0EDF1C3BCB167BFB4B168EDEEB169B16AB16BB16CB16DB16EB16FB170B171B172B173EDF4EDF2B174B175B176B177D5E6C3DFB178EDF3B179B17AB17BEDF6B17CD5A3D1A3B17DB17EB180EDF5B181C3D0B182B183B184B185B186EDF7BFF4BEECEDF8B187CCF7B188D1DBB189B18AB18BD7C5D5F6B18CEDFCB18DB18EB18FEDFBB190B191B192B193B194B195B196B197EDF9EDFAB198B199B19AB19BB19CB19DB19EB19FEDFDBEA6B1A0B240B241B242B243CBAFEEA1B6BDB244EEA2C4C0B245EDFEB246B247BDDEB2C7B248B249B24AB24BB24CB24DB24EB24FB250B251B252B253B6C3B254B255B256EEA5D8BAEEA3EEA6B257B258B259C3E9B3F2B25AB25BB25CB25DB25EB25FEEA7EEA4CFB9B260B261EEA8C2F7B262B263B264B265B266B267B268B269B26AB26BB26CB26DEEA9EEAAB26EDEABB26FB270C6B3B271C7C6B272D6F5B5C9B273CBB2B274B275B276EEABB277B278CDABB279EEACB27AB27BB27CB27DB27ED5B0B280EEADB281F6C4B282B283B284B285B286B287B288B289B28AB28BB28CB28DB28EDBC7B28FB290B291B292B293B294B295B296B297B4A3B298B299B29AC3ACF1E6B29BB29CB29DB29EB29FCAB8D2D3B2A0D6AAB340EFF2B341BED8B342BDC3EFF3B6CCB0ABB343B344B345B346CAAFB347B348EDB6B349EDB7B34AB34BB34CB34DCEF9B7AFBFF3EDB8C2EBC9B0B34EB34FB350B351B352B353EDB9B354B355C6F6BFB3B356B357B358EDBCC5F8B359D1D0B35AD7A9EDBAEDBBB35BD1E2B35CEDBFEDC0B35DEDC4B35EB35FB360EDC8B361EDC6EDCED5E8B362EDC9B363B364EDC7EDBEB365B366C5E9B367B368B369C6C6B36AB36BC9E9D4D2EDC1EDC2EDC3EDC5B36CC0F9B36DB4A1B36EB36FB370B371B9E8B372EDD0B373B374B375B376EDD1B377EDCAB378EDCFB379CEF8B37AB37BCBB6EDCCEDCDB37CB37DB37EB380B381CFF5B382B383B384B385B386B387B388B389B38AB38BB38CB38DEDD2C1F2D3B2EDCBC8B7B38EB38FB390B391B392B393B394B395BCEFB396B397B398B399C5F0B39AB39BB39CB39DB39EB39FB3A0B440B441B442EDD6B443B5EFB444B445C2B5B0ADCBE9B446B447B1AEB448EDD4B449B44AB44BCDEBB5E2B44CEDD5EDD3EDD7B44DB44EB5FAB44FEDD8B450EDD9B451EDDCB452B1CCB453B454B455B456B457B458B459B45AC5F6BCEEEDDACCBCB2EAB45BB45CB45DB45EEDDBB45FB460B461B462C4EBB463B464B4C5B465B466B467B0F5B468B469B46AEDDFC0DAB4E8B46BB46CB46DB46EC5CDB46FB470B471EDDDBFC4B472B473B474EDDEB475B476B477B478B479B47AB47BB47CB47DB47EB480B481B482B483C4A5B484B485B486EDE0B487B488B489B48AB48BEDE1B48CEDE3B48DB48EC1D7B48FB490BBC7B491B492B493B494B495B496BDB8B497B498B499EDE2B49AB49BB49CB49DB49EB49FB4A0B540B541B542B543B544B545EDE4B546B547B548B549B54AB54BB54CB54DB54EB54FEDE6B550B551B552B553B554EDE5B555B556B557B558B559B55AB55BB55CB55DB55EB55FB560B561B562B563EDE7B564B565B566B567B568CABEECEAC0F1B569C9E7B56AECEBC6EEB56BB56CB56DB56EECECB56FC6EDECEDB570B571B572B573B574B575B576B577B578ECF0B579B57AD7E6ECF3B57BB57CECF1ECEEECEFD7A3C9F1CBEEECF4B57DECF2B57EB580CFE9B581ECF6C6B1B582B583B584B585BCC0B586ECF5B587B588B589B58AB58BB58CB58DB5BBBBF6B58EECF7B58FB590B591B592B593D9F7BDFBB594B595C2BBECF8B596B597B598B599ECF9B59AB59BB59CB59DB8A3B59EB59FB5A0B640B641B642B643B644B645B646ECFAB647B648B649B64AB64BB64CB64DB64EB64FB650B651B652ECFBB653B654B655B656B657B658B659B65AB65BB65CB65DECFCB65EB65FB660B661B662D3EDD8AEC0EBB663C7DDBACCB664D0E3CBBDB665CDBAB666B667B8D1B668B669B1FCB66AC7EFB66BD6D6B66CB66DB66EBFC6C3EBB66FB670EFF5B671B672C3D8B673B674B675B676B677B678D7E2B679B67AB67BEFF7B3D3B67CC7D8D1EDB67DD6C8B67EEFF8B680EFF6B681BBFDB3C6B682B683B684B685B686B687B688BDD5B689B68AD2C6B68BBBE0B68CB68DCFA1B68EEFFCEFFBB68FB690EFF9B691B692B693B694B3CCB695C9D4CBB0B696B697B698B699B69AEFFEB69BB69CB0DEB69DB69ED6C9B69FB6A0B740EFFDB741B3EDB742B743F6D5B744B745B746B747B748B749B74AB74BB74CB74DB74EB74FB750B751B752CEC8B753B754B755F0A2B756F0A1B757B5BEBCDABBFCB758B8E5B759B75AB75BB75CB75DB75EC4C2B75FB760B761B762B763B764B765B766B767B768F0A3B769B76AB76BB76CB76DCBEBB76EB76FB770B771B772B773B774B775B776B777B778B779B77AB77BB77CB77DB77EB780B781B782B783B784B785B786F0A6B787B788B789D1A8B78ABEBFC7EEF1B6F1B7BFD5B78BB78CB78DB78EB4A9F1B8CDBBB78FC7D4D5ADB790F1B9B791F1BAB792B793B794B795C7CFB796B797B798D2A4D6CFB799B79AF1BBBDD1B4B0BEBDB79BB79CB79DB4DCCED1B79EBFDFF1BDB79FB7A0B840B841BFFAF1BCB842F1BFB843B844B845F1BEF1C0B846B847B848B849B84AF1C1B84BB84CB84DB84EB84FB850B851B852B853B854B855C1FEB856B857B858B859B85AB85BB85CB85DB85EB85FB860C1A2B861B862B863B864B865B866B867B868B869B86ACAFAB86BB86CD5BEB86DB86EB86FB870BEBABEB9D5C2B871B872BFA2B873CDAFF1B5B874B875B876B877B878B879BDDFB87AB6CBB87BB87CB87DB87EB880B881B882B883B884D6F1F3C3B885B886F3C4B887B8CDB888B889B88AF3C6F3C7B88BB0CAB88CF3C5B88DF3C9CBF1B88EB88FB890F3CBB891D0A6B892B893B1CAF3C8B894B895B896F3CFB897B5D1B898B899F3D7B89AF3D2B89BB89CB89DF3D4F3D3B7FBB89EB1BFB89FF3CEF3CAB5DAB8A0F3D0B940B941F3D1B942F3D5B943B944B945B946F3CDB947BCE3B948C1FDB949F3D6B94AB94BB94CB94DB94EB94FF3DAB950F3CCB951B5C8B952BDEEF3DCB953B954B7A4BFF0D6FECDB2B955B4F0B956B2DFB957F3D8B958F3D9C9B8B959F3DDB95AB95BF3DEB95CF3E1B95DB95EB95FB960B961B962B963B964B965B966B967F3DFB968B969F3E3F3E2B96AB96BF3DBB96CBFEAB96DB3EFB96EF3E0B96FB970C7A9B971BCF2B972B973B974B975F3EBB976B977B978B979B97AB97BB97CB9BFB97DB97EF3E4B980B981B982B2ADBBFEB983CBE3B984B985B986B987F3EDF3E9B988B989B98AB9DCF3EEB98BB98CB98DF3E5F3E6F3EAC2E1F3ECF3EFF3E8BCFDB98EB98FB990CFE4B991B992F3F0B993B994B995F3E7B996B997B998B999B99AB99BB99CB99DF3F2B99EB99FB9A0BA40D7ADC6AABA41BA42BA43BA44F3F3BA45BA46BA47BA48F3F1BA49C2A8BA4ABA4BBA4CBA4DBA4EB8DDF3F5BA4FBA50F3F4BA51BA52BA53B4DBBA54BA55BA56F3F6F3F7BA57BA58BA59F3F8BA5ABA5BBA5CC0BABA5DBA5EC0E9BA5FBA60BA61BA62BA63C5F1BA64BA65BA66BA67F3FBBA68F3FABA69BA6ABA6BBA6CBA6DBA6EBA6FBA70B4D8BA71BA72BA73F3FEF3F9BA74BA75F3FCBA76BA77BA78BA79BA7ABA7BF3FDBA7CBA7DBA7EBA80BA81BA82BA83BA84F4A1BA85BA86BA87BA88BA89BA8AF4A3BBC9BA8BBA8CF4A2BA8DBA8EBA8FBA90BA91BA92BA93BA94BA95BA96BA97BA98BA99F4A4BA9ABA9BBA9CBA9DBA9EBA9FB2BEF4A6F4A5BAA0BB40BB41BB42BB43BB44BB45BB46BB47BB48BB49BCAEBB4ABB4BBB4CBB4DBB4EBB4FBB50BB51BB52BB53BB54BB55BB56BB57BB58BB59BB5ABB5BBB5CBB5DBB5EBB5FBB60BB61BB62BB63BB64BB65BB66BB67BB68BB69BB6ABB6BBB6CBB6DBB6EC3D7D9E1BB6FBB70BB71BB72BB73BB74C0E0F4CCD7D1BB75BB76BB77BB78BB79BB7ABB7BBB7CBB7DBB7EBB80B7DBBB81BB82BB83BB84BB85BB86BB87F4CEC1A3BB88BB89C6C9BB8AB4D6D5B3BB8BBB8CBB8DF4D0F4CFF4D1CBDABB8EBB8FF4D2BB90D4C1D6E0BB91BB92BB93BB94B7E0BB95BB96BB97C1B8BB98BB99C1BBF4D3BEACBB9ABB9BBB9CBB9DBB9EB4E2BB9FBBA0F4D4F4D5BEABBC40BC41F4D6BC42BC43BC44F4DBBC45F4D7F4DABC46BAFDBC47F4D8F4D9BC48BC49BC4ABC4BBC4CBC4DBC4EB8E2CCC7F4DCBC4FB2DABC50BC51C3D3BC52BC53D4E3BFB7BC54BC55BC56BC57BC58BC59BC5AF4DDBC5BBC5CBC5DBC5EBC5FBC60C5B4BC61BC62BC63BC64BC65BC66BC67BC68F4E9BC69BC6ACFB5BC6BBC6CBC6DBC6EBC6FBC70BC71BC72BC73BC74BC75BC76BC77BC78CEC9BC79BC7ABC7BBC7CBC7DBC7EBC80BC81BC82BC83BC84BC85BC86BC87BC88BC89BC8ABC8BBC8CBC8DBC8ECBD8BC8FCBF7BC90BC91BC92BC93BDF4BC94BC95BC96D7CFBC97BC98BC99C0DBBC9ABC9BBC9CBC9DBC9EBC9FBCA0BD40BD41BD42BD43BD44BD45BD46BD47BD48BD49BD4ABD4BBD4CBD4DBD4EBD4FBD50BD51BD52BD53BD54BD55BD56BD57BD58BD59BD5ABD5BBD5CBD5DBD5EBD5FBD60BD61BD62BD63BD64BD65BD66BD67BD68BD69BD6ABD6BBD6CBD6DBD6EBD6FBD70BD71BD72BD73BD74BD75BD76D0F5BD77BD78BD79BD7ABD7BBD7CBD7DBD7EF4EABD80BD81BD82BD83BD84BD85BD86BD87BD88BD89BD8ABD8BBD8CBD8DBD8EBD8FBD90BD91BD92BD93BD94BD95BD96BD97BD98BD99BD9ABD9BBD9CBD9DBD9EBD9FBDA0BE40BE41BE42BE43BE44BE45BE46BE47BE48BE49BE4ABE4BBE4CF4EBBE4DBE4EBE4FBE50BE51BE52BE53F4ECBE54BE55BE56BE57BE58BE59BE5ABE5BBE5CBE5DBE5EBE5FBE60BE61BE62BE63BE64BE65BE66BE67BE68BE69BE6ABE6BBE6CBE6DBE6EBE6FBE70BE71BE72BE73BE74BE75BE76BE77BE78BE79BE7ABE7BBE7CBE7DBE7EBE80BE81BE82BE83BE84BE85BE86BE87BE88BE89BE8ABE8BBE8CBE8DBE8EBE8FBE90BE91BE92BE93BE94BE95BE96BE97BE98BE99BE9ABE9BBE9CBE9DBE9EBE9FBEA0BF40BF41BF42BF43BF44BF45BF46BF47BF48BF49BF4ABF4BBF4CBF4DBF4EBF4FBF50BF51BF52BF53BF54BF55BF56BF57BF58BF59BF5ABF5BBF5CBF5DBF5EBF5FBF60BF61BF62BF63BF64BF65BF66BF67BF68BF69BF6ABF6BBF6CBF6DBF6EBF6FBF70BF71BF72BF73BF74BF75BF76BF77BF78BF79BF7ABF7BBF7CBF7DBF7EBF80F7E3BF81BF82BF83BF84BF85B7B1BF86BF87BF88BF89BF8AF4EDBF8BBF8CBF8DBF8EBF8FBF90BF91BF92BF93BF94BF95BF96BF97BF98BF99BF9ABF9BBF9CBF9DBF9EBF9FBFA0C040C041C042C043C044C045C046C047C048C049C04AC04BC04CC04DC04EC04FC050C051C052C053C054C055C056C057C058C059C05AC05BC05CC05DC05EC05FC060C061C062C063D7EBC064C065C066C067C068C069C06AC06BC06CC06DC06EC06FC070C071C072C073C074C075C076C077C078C079C07AC07BF4EEC07CC07DC07EE6F9BEC0E6FABAECE6FBCFCBE6FCD4BCBCB6E6FDE6FEBCCDC8D2CEB3E7A1C080B4BFE7A2C9B4B8D9C4C9C081D7DDC2DAB7D7D6BDCEC6B7C4C082C083C5A6E7A3CFDFE7A4E7A5E7A6C1B7D7E9C9F0CFB8D6AFD6D5E7A7B0EDE7A8E7A9C9DCD2EFBEADE7AAB0F3C8DEBDE1E7ABC8C6C084E7ACBBE6B8F8D1A4E7ADC2E7BEF8BDCACDB3E7AEE7AFBEEED0E5C085CBE7CCD0BCCCE7B0BCA8D0F7E7B1C086D0F8E7B2E7B3B4C2E7B4E7B5C9FECEACC3E0E7B7B1C1B3F1C087E7B8E7B9D7DBD5C0E7BAC2CCD7BAE7BBE7BCE7BDBCEAC3E5C0C2E7BEE7BFBCA9C088E7C0E7C1E7B6B6D0E7C2C089E7C3E7C4BBBAB5DEC2C6B1E0E7C5D4B5E7C6B8BFE7C8E7C7B7ECC08AE7C9B2F8E7CAE7CBE7CCE7CDE7CEE7CFE7D0D3A7CBF5E7D1E7D2E7D3E7D4C9C9E7D5E7D6E7D7E7D8E7D9BDC9E7DAF3BEC08BB8D7C08CC8B1C08DC08EC08FC090C091C092C093F3BFC094F3C0F3C1C095C096C097C098C099C09AC09BC09CC09DC09EB9DECDF8C09FC0A0D8E8BAB1C140C2DEEEB7C141B7A3C142C143C144C145EEB9C146EEB8B0D5C147C148C149C14AC14BEEBBD5D6D7EFC14CC14DC14ED6C3C14FC150EEBDCAF0C151EEBCC152C153C154C155EEBEC156C157C158C159EEC0C15AC15BEEBFC15CC15DC15EC15FC160C161C162C163D1F2C164C7BCC165C3C0C166C167C168C169C16AB8E1C16BC16CC16DC16EC16FC1E7C170C171F4C6D0DFF4C7C172CFDBC173C174C8BAC175C176F4C8C177C178C179C17AC17BC17CC17DF4C9F4CAC17EF4CBC180C181C182C183C184D9FAB8FEC185C186E5F1D3F0C187F4E0C188CECCC189C18AC18BB3E1C18CC18DC18EC18FF1B4C190D2EEC191F4E1C192C193C194C195C196CFE8F4E2C197C198C7CCC199C19AC19BC19CC19DC19EB5D4B4E4F4E4C19FC1A0C240F4E3F4E5C241C242F4E6C243C244C245C246F4E7C247BAB2B0BFC248F4E8C249C24AC24BC24CC24DC24EC24FB7ADD2EDC250C251C252D2ABC0CFC253BFBCEBA3D5DFEAC8C254C255C256C257F1F3B6F8CBA3C258C259C4CDC25AF1E7C25BF1E8B8FBF1E9BAC4D4C5B0D2C25CC25DF1EAC25EC25FC260F1EBC261F1ECC262C263F1EDF1EEF1EFF1F1F1F0C5D5C264C265C266C267C268C269F1F2C26AB6FAC26BF1F4D2AEDEC7CBCAC26CC26DB3DCC26EB5A2C26FB9A2C270C271C4F4F1F5C272C273F1F6C274C275C276C1C4C1FBD6B0F1F7C277C278C279C27AF1F8C27BC1AAC27CC27DC27EC6B8C280BEDBC281C282C283C284C285C286C287C288C289C28AC28BC28CC28DC28EF1F9B4CFC28FC290C291C292C293C294F1FAC295C296C297C298C299C29AC29BC29CC29DC29EC29FC2A0C340EDB2EDB1C341C342CBE0D2DEC343CBC1D5D8C344C8E2C345C0DFBCA1C346C347C348C349C34AC34BEBC1C34CC34DD0A4C34ED6E2C34FB6C7B8D8EBC0B8CEC350EBBFB3A6B9C9D6ABC351B7F4B7CAC352C353C354BCE7B7BEEBC6C355EBC7B0B9BFCFC356EBC5D3FDC357EBC8C358C359EBC9C35AC35BB7CEC35CEBC2EBC4C9F6D6D7D5CDD0B2EBCFCEB8EBD0C35DB5A8C35EC35FC360C361C362B1B3EBD2CCA5C363C364C365C366C367C368C369C5D6EBD3C36AEBD1C5DFEBCECAA4EBD5B0FBC36BC36CBAFAC36DC36ED8B7F1E3C36FEBCAEBCBEBCCEBCDEBD6E6C0EBD9C370BFE8D2C8EBD7EBDCB8ECEBD8C371BDBAC372D0D8C373B0B7C374EBDDC4DCC375C376C377C378D6ACC379C37AC37BB4E0C37CC37DC2F6BCB9C37EC380EBDAEBDBD4E0C6EAC4D4EBDFC5A7D9F5C381B2B1C382EBE4C383BDC5C384C385C386EBE2C387C388C389C38AC38BC38CC38DC38EC38FC390C391C392C393EBE3C394C395B8ACC396CDD1EBE5C397C398C399EBE1C39AC1B3C39BC39CC39DC39EC39FC6A2C3A0C440C441C442C443C444C445CCF3C446EBE6C447C0B0D2B8EBE7C448C449C44AB8AFB8ADC44BEBE8C7BBCDF3C44CC44DC44EEBEAEBEBC44FC450C451C452C453EBEDC454C455C456C457D0C8C458EBF2C459EBEEC45AC45BC45CEBF1C8F9C45DD1FCEBECC45EC45FEBE9C460C461C462C463B8B9CFD9C4E5EBEFEBF0CCDACDC8B0F2C464EBF6C465C466C467C468C469EBF5C46AB2B2C46BC46CC46DC46EB8E0C46FEBF7C470C471C472C473C474C475B1ECC476C477CCC5C4A4CFA5C478C479C47AC47BC47CEBF9C47DC47EECA2C480C5F2C481EBFAC482C483C484C485C486C487C488C489C9C5C48AC48BC48CC48DC48EC48FE2DFEBFEC490C491C492C493CDCEECA1B1DBD3B7C494C495D2DCC496C497C498EBFDC499EBFBC49AC49BC49CC49DC49EC49FC4A0C540C541C542C543C544C545C546C547C548C549C54AC54BC54CC54DC54EB3BCC54FC550C551EAB0C552C553D7D4C554F4ABB3F4C555C556C557C558C559D6C1D6C2C55AC55BC55CC55DC55EC55FD5E9BECAC560F4A7C561D2A8F4A8F4A9C562F4AABECBD3DFC563C564C565C566C567C9E0C9E1C568C569F3C2C56ACAE6C56BCCF2C56CC56DC56EC56FC570C571E2B6CBB4C572CEE8D6DBC573F4ADF4AEF4AFC574C575C576C577F4B2C578BABDF4B3B0E3F4B0C579F4B1BDA2B2D5C57AF4B6F4B7B6E6B2B0CFCFF4B4B4ACC57BF4B5C57CC57DF4B8C57EC580C581C582C583F4B9C584C585CDA7C586F4BAC587F4BBC588C589C58AF4BCC58BC58CC58DC58EC58FC590C591C592CBD2C593F4BDC594C595C596C597F4BEC598C599C59AC59BC59CC59DC59EC59FF4BFC5A0C640C641C642C643F4DEC1BCBCE8C644C9ABD1DEE5F5C645C646C647C648DCB3D2D5C649C64ADCB4B0ACDCB5C64BC64CBDDAC64DDCB9C64EC64FC650D8C2C651DCB7D3F3C652C9D6DCBADCB6C653DCBBC3A2C654C655C656C657DCBCDCC5DCBDC658C659CEDFD6A5C65ADCCFC65BDCCDC65CC65DDCD2BDE6C2ABC65EDCB8DCCBDCCEDCBEB7D2B0C5DCC7D0BEDCC1BBA8C65FB7BCDCCCC660C661DCC6DCBFC7DBC662C663C664D1BFDCC0C665C666DCCAC667C668DCD0C669C66ACEADDCC2C66BDCC3DCC8DCC9B2D4DCD1CBD5C66CD4B7DCDBDCDFCCA6DCE6C66DC3E7DCDCC66EC66FBFC1DCD9C670B0FAB9B6DCE5DCD3C671DCC4DCD6C8F4BFE0C672C673C674C675C9BBC676C677C678B1BDC679D3A2C67AC67BDCDAC67CC67DDCD5C67EC6BBC680DCDEC681C682C683C684C685D7C2C3AFB7B6C7D1C3A9DCE2DCD8DCEBDCD4C686C687DCDDC688BEA5DCD7C689DCE0C68AC68BDCE3DCE4C68CDCF8C68DC68EDCE1DDA2DCE7C68FC690C691C692C693C694C695C696C697C698BCEBB4C4C699C69AC3A3B2E7DCFAC69BDCF2C69CDCEFC69DDCFCDCEED2F0B2E8C69EC8D7C8E3DCFBC69FDCEDC6A0C740C741DCF7C742C743DCF5C744C745BEA3DCF4C746B2DDC747C748C749C74AC74BDCF3BCF6DCE8BBC4C74CC0F3C74DC74EC74FC750C751BCD4DCE9DCEAC752DCF1DCF6DCF9B5B4C753C8D9BBE7DCFEDCFDD3ABDDA1DDA3DDA5D2F1DDA4DDA6DDA7D2A9C754C755C756C757C758C759C75ABAC9DDA9C75BC75CDDB6DDB1DDB4C75DC75EC75FC760C761C762C763DDB0C6CEC764C765C0F2C766C767C768C769C9AFC76AC76BC76CDCECDDAEC76DC76EC76FC770DDB7C771C772DCF0DDAFC773DDB8C774DDACC775C776C777C778C779C77AC77BDDB9DDB3DDADC4AAC77CC77DC77EC780DDA8C0B3C1ABDDAADDABC781DDB2BBF1DDB5D3A8DDBAC782DDBBC3A7C783C784DDD2DDBCC785C786C787DDD1C788B9BDC789C78ABED5C78BBEFAC78CC78DBACAC78EC78FC790C791DDCAC792DDC5C793DDBFC794C795C796B2CBDDC3C797DDCBB2A4DDD5C798C799C79ADDBEC79BC79CC79DC6D0DDD0C79EC79FC7A0C840C841DDD4C1E2B7C6C842C843C844C845C846DDCEDDCFC847C848C849DDC4C84AC84BC84CDDBDC84DDDCDCCD1C84EDDC9C84FC850C851C852DDC2C3C8C6BCCEAEDDCCC853DDC8C854C855C856C857C858C859DDC1C85AC85BC85CDDC6C2DCC85DC85EC85FC860C861C862D3A9D3AADDD3CFF4C8F8C863C864C865C866C867C868C869C86ADDE6C86BC86CC86DC86EC86FC870DDC7C871C872C873DDE0C2E4C874C875C876C877C878C879C87AC87BDDE1C87CC87DC87EC880C881C882C883C884C885C886DDD7C887C888C889C88AC88BD6F8C88CDDD9DDD8B8F0DDD6C88DC88EC88FC890C6CFC891B6ADC892C893C894C895C896DDE2C897BAF9D4E1DDE7C898C899C89AB4D0C89BDDDAC89CBFFBDDE3C89DDDDFC89EDDDDC89FC8A0C940C941C942C943C944B5D9C945C946C947C948DDDBDDDCDDDEC949BDAFDDE4C94ADDE5C94BC94CC94DC94EC94FC950C951C952DDF5C953C3C9C954C955CBE2C956C957C958C959DDF2C95AC95BC95CC95DC95EC95FC960C961C962C963C964C965C966D8E1C967C968C6D1C969DDF4C96AC96BC96CD5F4DDF3DDF0C96DC96EDDECC96FDDEFC970DDE8C971C972D0EEC973C974C975C976C8D8DDEEC977C978DDE9C979C97ADDEACBF2C97BDDEDC97CC97DB1CDC97EC980C981C982C983C984C0B6C985BCBBDDF1C986C987DDF7C988DDF6DDEBC989C98AC98BC98CC98DC5EEC98EC98FC990DDFBC991C992C993C994C995C996C997C998C999C99AC99BDEA4C99CC99DDEA3C99EC99FC9A0CA40CA41CA42CA43CA44CA45CA46CA47CA48DDF8CA49CA4ACA4BCA4CC3EFCA4DC2FBCA4ECA4FCA50D5E1CA51CA52CEB5CA53CA54CA55CA56DDFDCA57B2CCCA58CA59CA5ACA5BCA5CCA5DCA5ECA5FCA60C4E8CADFCA61CA62CA63CA64CA65CA66CA67CA68CA69CA6AC7BEDDFADDFCDDFEDEA2B0AAB1CECA6BCA6CCA6DCA6ECA6FDEACCA70CA71CA72CA73DEA6BDB6C8EFCA74CA75CA76CA77CA78CA79CA7ACA7BCA7CCA7DCA7EDEA1CA80CA81DEA5CA82CA83CA84CA85DEA9CA86CA87CA88CA89CA8ADEA8CA8BCA8CCA8DDEA7CA8ECA8FCA90CA91CA92CA93CA94CA95CA96DEADCA97D4CCCA98CA99CA9ACA9BDEB3DEAADEAECA9CCA9DC0D9CA9ECA9FCAA0CB40CB41B1A1DEB6CB42DEB1CB43CB44CB45CB46CB47CB48CB49DEB2CB4ACB4BCB4CCB4DCB4ECB4FCB50CB51CB52CB53CB54D1A6DEB5CB55CB56CB57CB58CB59CB5ACB5BDEAFCB5CCB5DCB5EDEB0CB5FD0BDCB60CB61CB62DEB4CAEDDEB9CB63CB64CB65CB66CB67CB68DEB8CB69DEB7CB6ACB6BCB6CCB6DCB6ECB6FCB70DEBBCB71CB72CB73CB74CB75CB76CB77BDE5CB78CB79CB7ACB7BCB7CB2D8C3EACB7DCB7EDEBACB80C5BACB81CB82CB83CB84CB85CB86DEBCCB87CB88CB89CB8ACB8BCB8CCB8DCCD9CB8ECB8FCB90CB91B7AACB92CB93CB94CB95CB96CB97CB98CB99CB9ACB9BCB9CCB9DCB9ECB9FCBA0CC40CC41D4E5CC42CC43CC44DEBDCC45CC46CC47CC48CC49DEBFCC4ACC4BCC4CCC4DCC4ECC4FCC50CC51CC52CC53CC54C4A2CC55CC56CC57CC58DEC1CC59CC5ACC5BCC5CCC5DCC5ECC5FCC60CC61CC62CC63CC64CC65CC66CC67CC68DEBECC69DEC0CC6ACC6BCC6CCC6DCC6ECC6FCC70CC71CC72CC73CC74CC75CC76CC77D5BACC78CC79CC7ADEC2CC7BCC7CCC7DCC7ECC80CC81CC82CC83CC84CC85CC86CC87CC88CC89CC8ACC8BF2AEBBA2C2B2C5B0C2C7CC8CCC8DF2AFCC8ECC8FCC90CC91CC92D0E9CC93CC94CC95D3DDCC96CC97CC98EBBDCC99CC9ACC9BCC9CCC9DCC9ECC9FCCA0B3E6F2B0CD40F2B1CD41CD42CAADCD43CD44CD45CD46CD47CD48CD49BAE7F2B3F2B5F2B4CBE4CFBAF2B2CAB4D2CFC2ECCD4ACD4BCD4CCD4DCD4ECD4FCD50CEC3F2B8B0F6F2B7CD51CD52CD53CD54CD55F2BECD56B2CFCD57CD58CD59CD5ACD5BCD5CD1C1F2BACD5DCD5ECD5FCD60CD61F2BCD4E9CD62CD63F2BBF2B6F2BFF2BDCD64F2B9CD65CD66F2C7F2C4F2C6CD67CD68F2CAF2C2F2C0CD69CD6ACD6BF2C5CD6CCD6DCD6ECD6FCD70D6FBCD71CD72CD73F2C1CD74C7F9C9DFCD75F2C8B9C6B5B0CD76CD77F2C3F2C9F2D0F2D6CD78CD79BBD7CD7ACD7BCD7CF2D5CDDCCD7DD6EBCD7ECD80F2D2F2D4CD81CD82CD83CD84B8F2CD85CD86CD87CD88F2CBCD89CD8ACD8BF2CEC2F9CD8CD5DDF2CCF2CDF2CFF2D3CD8DCD8ECD8FF2D9D3BCCD90CD91CD92CD93B6EACD94CAF1CD95B7E4F2D7CD96CD97CD98F2D8F2DAF2DDF2DBCD99CD9AF2DCCD9BCD9CCD9DCD9ED1D1F2D1CD9FCDC9CDA0CECFD6A9CE40F2E3CE41C3DBCE42F2E0CE43CE44C0AFF2ECF2DECE45F2E1CE46CE47CE48F2E8CE49CE4ACE4BCE4CF2E2CE4DCE4EF2E7CE4FCE50F2E6CE51CE52F2E9CE53CE54CE55F2DFCE56CE57F2E4F2EACE58CE59CE5ACE5BCE5CCE5DCE5ED3ACF2E5B2F5CE5FCE60F2F2CE61D0ABCE62CE63CE64CE65F2F5CE66CE67CE68BBC8CE69F2F9CE6ACE6BCE6CCE6DCE6ECE6FF2F0CE70CE71F2F6F2F8F2FACE72CE73CE74CE75CE76CE77CE78CE79F2F3CE7AF2F1CE7BCE7CCE7DBAFBCE7EB5FBCE80CE81CE82CE83F2EFF2F7F2EDF2EECE84CE85CE86F2EBF3A6CE87F3A3CE88CE89F3A2CE8ACE8BF2F4CE8CC8DACE8DCE8ECE8FCE90CE91F2FBCE92CE93CE94F3A5CE95CE96CE97CE98CE99CE9ACE9BC3F8CE9CCE9DCE9ECE9FCEA0CF40CF41CF42F2FDCF43CF44F3A7F3A9F3A4CF45F2FCCF46CF47CF48F3ABCF49F3AACF4ACF4BCF4CCF4DC2DDCF4ECF4FF3AECF50CF51F3B0CF52CF53CF54CF55CF56F3A1CF57CF58CF59F3B1F3ACCF5ACF5BCF5CCF5DCF5EF3AFF2FEF3ADCF5FCF60CF61CF62CF63CF64CF65F3B2CF66CF67CF68CF69F3B4CF6ACF6BCF6CCF6DF3A8CF6ECF6FCF70CF71F3B3CF72CF73CF74F3B5CF75CF76CF77CF78CF79CF7ACF7BCF7CCF7DCF7ED0B7CF80CF81CF82CF83F3B8CF84CF85CF86CF87D9F9CF88CF89CF8ACF8BCF8CCF8DF3B9CF8ECF8FCF90CF91CF92CF93CF94CF95F3B7CF96C8E4F3B6CF97CF98CF99CF9AF3BACF9BCF9CCF9DCF9ECF9FF3BBB4C0CFA0D040D041D042D043D044D045D046D047D048D049D04AD04BD04CD04DEEC3D04ED04FD050D051D052D053F3BCD054D055F3BDD056D057D058D1AAD059D05AD05BF4ACD0C6D05CD05DD05ED05FD060D061D0D0D1DCD062D063D064D065D066D067CFCED068D069BDD6D06AD1C3D06BD06CD06DD06ED06FD070D071BAE2E1E9D2C2F1C2B2B9D072D073B1EDF1C3D074C9C0B3C4D075D9F2D076CBA5D077F1C4D078D079D07AD07BD6D4D07CD07DD07ED080D081F1C5F4C0F1C6D082D4ACF1C7D083B0C0F4C1D084D085F4C2D086D087B4FCD088C5DBD089D08AD08BD08CCCBBD08DD08ED08FD0E4D090D091D092D093D094CDE0D095D096D097D098D099F1C8D09AD9F3D09BD09CD09DD09ED09FD0A0B1BBD140CFAED141D142D143B8A4D144D145D146D147D148F1CAD149D14AD14BD14CF1CBD14DD14ED14FD150B2C3C1D1D151D152D7B0F1C9D153D154F1CCD155D156D157D158F1CED159D15AD15BD9F6D15CD2E1D4A3D15DD15EF4C3C8B9D15FD160D161D162D163F4C4D164D165F1CDF1CFBFE3F1D0D166D167F1D4D168D169D16AD16BD16CD16DD16EF1D6F1D1D16FC9D1C5E1D170D171D172C2E3B9FCD173D174F1D3D175F1D5D176D177D178B9D3D179D17AD17BD17CD17DD17ED180F1DBD181D182D183D184D185BAD6D186B0FDF1D9D187D188D189D18AD18BF1D8F1D2F1DAD18CD18DD18ED18FD190F1D7D191D192D193C8ECD194D195D196D197CDCAF1DDD198D199D19AD19BE5BDD19CD19DD19EF1DCD19FF1DED1A0D240D241D242D243D244D245D246D247D248F1DFD249D24ACFE5D24BD24CD24DD24ED24FD250D251D252D253D254D255D256D257D258D259D25AD25BD25CD25DD25ED25FD260D261D262D263F4C5BDF3D264D265D266D267D268D269F1E0D26AD26BD26CD26DD26ED26FD270D271D272D273D274D275D276D277D278D279D27AD27BD27CD27DF1E1D27ED280D281CEF7D282D2AAD283F1FBD284D285B8B2D286D287D288D289D28AD28BD28CD28DD28ED28FD290D291D292D293D294D295D296D297D298D299D29AD29BD29CD29DD29ED29FD2A0D340D341D342D343D344D345D346D347D348D349D34AD34BD34CD34DD34ED34FD350D351D352D353D354D355D356D357D358D359D35AD35BD35CD35DD35EBCFBB9DBD35FB9E6C3D9CAD3EAE8C0C0BEF5EAE9EAEAEAEBD360EAECEAEDEAEEEAEFBDC7D361D362D363F5FBD364D365D366F5FDD367F5FED368F5FCD369D36AD36BD36CBDE2D36DF6A1B4A5D36ED36FD370D371F6A2D372D373D374F6A3D375D376D377ECB2D378D379D37AD37BD37CD37DD37ED380D381D382D383D384D1D4D385D386D387D388D389D38AD9EAD38BD38CD38DD38ED38FD390D391D392D393D394D395D396D397D398D399D39AD39BD39CD39DD39ED39FD3A0D440D441D442D443D444D445D446D447D448D449D44AD44BD44CD44DD44ED44FD450D451D452D453D454D455D456D457D458D459D45AD45BD45CD45DD45ED45FF6A4D460D461D462D463D464D465D466D467D468EEBAD469D46AD46BD46CD46DD46ED46FD470D471D472D473D474D475D476D477D478D479D47AD47BD47CD47DD47ED480D481D482D483D484D485D486D487D488D489D48AD48BD48CD48DD48ED48FD490D491D492D493D494D495D496D497D498D499D5B2D49AD49BD49CD49DD49ED49FD4A0D540D541D542D543D544D545D546D547D3FECCDCD548D549D54AD54BD54CD54DD54ED54FCAC4D550D551D552D553D554D555D556D557D558D559D55AD55BD55CD55DD55ED55FD560D561D562D563D564D565D566D567D568D569D56AD56BD56CD56DD56ED56FD570D571D572D573D574D575D576D577D578D579D57AD57BD57CD57DD57ED580D581D582D583D584D585D586D587D588D589D58AD58BD58CD58DD58ED58FD590D591D592D593D594D595D596D597D598D599D59AD59BD59CD59DD59ED59FD5A0D640D641D642D643D644D645D646D647D648D649D64AD64BD64CD64DD64ED64FD650D651D652D653D654D655D656D657D658D659D65AD65BD65CD65DD65ED65FD660D661D662E5C0D663D664D665D666D667D668D669D66AD66BD66CD66DD66ED66FD670D671D672D673D674D675D676D677D678D679D67AD67BD67CD67DD67ED680D681F6A5D682D683D684D685D686D687D688D689D68AD68BD68CD68DD68ED68FD690D691D692D693D694D695D696D697D698D699D69AD69BD69CD69DD69ED69FD6A0D740D741D742D743D744D745D746D747D748D749D74AD74BD74CD74DD74ED74FD750D751D752D753D754D755D756D757D758D759D75AD75BD75CD75DD75ED75FBEAFD760D761D762D763D764C6A9D765D766D767D768D769D76AD76BD76CD76DD76ED76FD770D771D772D773D774D775D776D777D778D779D77AD77BD77CD77DD77ED780D781D782D783D784D785D786D787D788D789D78AD78BD78CD78DD78ED78FD790D791D792D793D794D795D796D797D798DAA5BCC6B6A9B8BCC8CFBCA5DAA6DAA7CCD6C8C3DAA8C6FDD799D1B5D2E9D1B6BCC7D79ABDB2BBE4DAA9DAAAD1C8DAABD0EDB6EFC2DBD79BCBCFB7EDC9E8B7C3BEF7D6A4DAACDAADC6C0D7E7CAB6D79CD5A9CBDFD5EFDAAED6DFB4CADAB0DAAFD79DD2EBDAB1DAB2DAB3CAD4DAB4CAABDAB5DAB6B3CFD6EFDAB7BBB0B5AEDAB8DAB9B9EED1AFD2E8DABAB8C3CFEAB2EFDABBDABCD79EBDEBCEDCD3EFDABDCEF3DABED3D5BBE5DABFCBB5CBD0DAC0C7EBD6EEDAC1C5B5B6C1DAC2B7CCBFCEDAC3DAC4CBADDAC5B5F7DAC6C1C2D7BBDAC7CCB8D79FD2EAC4B1DAC8B5FDBBD1DAC9D0B3DACADACBCEBDDACCDACDDACEB2F7DAD1DACFD1E8DAD0C3D5DAD2D7A0DAD3DAD4DAD5D0BBD2A5B0F9DAD6C7ABDAD7BDF7C3A1DAD8DAD9C3FDCCB7DADADADBC0BEC6D7DADCDADDC7B4DADEDADFB9C8D840D841D842D843D844D845D846D847D848BBEDD849D84AD84BD84CB6B9F4F8D84DF4F9D84ED84FCDE3D850D851D852D853D854D855D856D857F5B9D858D859D85AD85BEBE0D85CD85DD85ED85FD860D861CFF3BBBFD862D863D864D865D866D867D868BAC0D4A5D869D86AD86BD86CD86DD86ED86FE1D9D870D871D872D873F5F4B1AAB2F2D874D875D876D877D878D879D87AF5F5D87BD87CF5F7D87DD87ED880BAD1F5F6D881C3B2D882D883D884D885D886D887D888F5F9D889D88AD88BF5F8D88CD88DD88ED88FD890D891D892D893D894D895D896D897D898D899D89AD89BD89CD89DD89ED89FD8A0D940D941D942D943D944D945D946D947D948D949D94AD94BD94CD94DD94ED94FD950D951D952D953D954D955D956D957D958D959D95AD95BD95CD95DD95ED95FD960D961D962D963D964D965D966D967D968D969D96AD96BD96CD96DD96ED96FD970D971D972D973D974D975D976D977D978D979D97AD97BD97CD97DD97ED980D981D982D983D984D985D986D987D988D989D98AD98BD98CD98DD98ED98FD990D991D992D993D994D995D996D997D998D999D99AD99BD99CD99DD99ED99FD9A0DA40DA41DA42DA43DA44DA45DA46DA47DA48DA49DA4ADA4BDA4CDA4DDA4EB1B4D5EAB8BADA4FB9B1B2C6D4F0CFCDB0DCD5CBBBF5D6CAB7B7CCB0C6B6B1E1B9BAD6FCB9E1B7A1BCFAEADAEADBCCF9B9F3EADCB4FBC3B3B7D1BAD8EADDD4F4EADEBCD6BBDFEADFC1DEC2B8D4DFD7CAEAE0EAE1EAE4EAE2EAE3C9DEB8B3B6C4EAE5CAEAC9CDB4CDDA50DA51E2D9C5E2EAE6C0B5DA52D7B8EAE7D7ACC8FCD8D3D8CDD4DEDA53D4F9C9C4D3AEB8D3B3E0DA54C9E2F4F6DA55DA56DA57BAD5DA58F4F7DA59DA5AD7DFDA5BDA5CF4F1B8B0D5D4B8CFC6F0DA5DDA5EDA5FDA60DA61DA62DA63DA64DA65B3C3DA66DA67F4F2B3ACDA68DA69DA6ADA6BD4BDC7F7DA6CDA6DDA6EDA6FDA70F4F4DA71DA72F4F3DA73DA74DA75DA76DA77DA78DA79DA7ADA7BDA7CCCCBDA7DDA7EDA80C8A4DA81DA82DA83DA84DA85DA86DA87DA88DA89DA8ADA8BDA8CDA8DF4F5DA8ED7E3C5BFF5C0DA8FDA90F5BBDA91F5C3DA92F5C2DA93D6BAF5C1DA94DA95DA96D4BEF5C4DA97F5CCDA98DA99DA9ADA9BB0CFB5F8DA9CF5C9F5CADA9DC5DCDA9EDA9FDAA0DB40F5C5F5C6DB41DB42F5C7F5CBDB43BEE0F5C8B8FADB44DB45DB46F5D0F5D3DB47DB48DB49BFE7DB4AB9F2F5BCF5CDDB4BDB4CC2B7DB4DDB4EDB4FCCF8DB50BCF9DB51F5CEF5CFF5D1B6E5F5D2DB52F5D5DB53DB54DB55DB56DB57DB58DB59F5BDDB5ADB5BDB5CF5D4D3BBDB5DB3ECDB5EDB5FCCA4DB60DB61DB62DB63F5D6DB64DB65DB66DB67DB68DB69DB6ADB6BF5D7BEE1F5D8DB6CDB6DCCDFF5DBDB6EDB6FDB70DB71DB72B2C8D7D9DB73F5D9DB74F5DAF5DCDB75F5E2DB76DB77DB78F5E0DB79DB7ADB7BF5DFF5DDDB7CDB7DF5E1DB7EDB80F5DEF5E4F5E5DB81CCE3DB82DB83E5BFB5B8F5E3F5E8CCA3DB84DB85DB86DB87DB88F5E6F5E7DB89DB8ADB8BDB8CDB8DDB8EF5BEDB8FDB90DB91DB92DB93DB94DB95DB96DB97DB98DB99DB9AB1C4DB9BDB9CF5BFDB9DDB9EB5C5B2E4DB9FF5ECF5E9DBA0B6D7DC40F5EDDC41F5EADC42DC43DC44DC45DC46F5EBDC47DC48B4DADC49D4EADC4ADC4BDC4CF5EEDC4DB3F9DC4EDC4FDC50DC51DC52DC53DC54F5EFF5F1DC55DC56DC57F5F0DC58DC59DC5ADC5BDC5CDC5DDC5EF5F2DC5FF5F3DC60DC61DC62DC63DC64DC65DC66DC67DC68DC69DC6ADC6BC9EDB9AADC6CDC6DC7FBDC6EDC6FB6E3DC70DC71DC72DC73DC74DC75DC76CCC9DC77DC78DC79DC7ADC7BDC7CDC7DDC7EDC80DC81DC82DC83DC84DC85DC86DC87DC88DC89DC8AEAA6DC8BDC8CDC8DDC8EDC8FDC90DC91DC92DC93DC94DC95DC96DC97DC98DC99DC9ADC9BDC9CDC9DDC9EDC9FDCA0DD40DD41DD42DD43DD44DD45DD46DD47DD48DD49DD4ADD4BDD4CDD4DDD4EDD4FDD50DD51DD52DD53DD54DD55DD56DD57DD58DD59DD5ADD5BDD5CDD5DDD5EDD5FDD60DD61DD62DD63DD64DD65DD66DD67DD68DD69DD6ADD6BDD6CDD6DDD6EDD6FDD70DD71DD72DD73DD74DD75DD76DD77DD78DD79DD7ADD7BDD7CDD7DDD7EDD80DD81DD82DD83DD84DD85DD86DD87DD88DD89DD8ADD8BDD8CDD8DDD8EDD8FDD90DD91DD92DD93DD94DD95DD96DD97DD98DD99DD9ADD9BDD9CDD9DDD9EDD9FDDA0DE40DE41DE42DE43DE44DE45DE46DE47DE48DE49DE4ADE4BDE4CDE4DDE4EDE4FDE50DE51DE52DE53DE54DE55DE56DE57DE58DE59DE5ADE5BDE5CDE5DDE5EDE5FDE60B3B5D4FEB9ECD0F9DE61E9EDD7AAE9EEC2D6C8EDBAE4E9EFE9F0E9F1D6E1E9F2E9F3E9F5E9F4E9F6E9F7C7E1E9F8D4D8E9F9BDCEDE62E9FAE9FBBDCFE9FCB8A8C1BEE9FDB1B2BBD4B9F5E9FEDE63EAA1EAA2EAA3B7F8BCADDE64CAE4E0CED4AFCFBDD5B7EAA4D5DEEAA5D0C1B9BCDE65B4C7B1D9DE66DE67DE68C0B1DE69DE6ADE6BDE6CB1E6B1E7DE6DB1E8DE6EDE6FDE70DE71B3BDC8E8DE72DE73DE74DE75E5C1DE76DE77B1DFDE78DE79DE7AC1C9B4EFDE7BDE7CC7A8D3D8DE7DC6F9D1B8DE7EB9FDC2F5DE80DE81DE82DE83DE84D3ADDE85D4CBBDFCDE86E5C2B7B5E5C3DE87DE88BBB9D5E2DE89BDF8D4B6CEA5C1ACB3D9DE8ADE8BCCF6DE8CE5C6E5C4E5C8DE8DE5CAE5C7B5CFC6C8DE8EB5FCE5C5DE8FCAF6DE90DE91E5C9DE92DE93DE94C3D4B1C5BCA3DE95DE96DE97D7B7DE98DE99CDCBCBCDCACACCD3E5CCE5CBC4E6DE9ADE9BD1A1D1B7E5CDDE9CE5D0DE9DCDB8D6F0E5CFB5DDDE9ECDBEDE9FE5D1B6BADEA0DF40CDA8B9E4DF41CAC5B3D1CBD9D4ECE5D2B7EADF42DF43DF44E5CEDF45DF46DF47DF48DF49DF4AE5D5B4FEE5D6DF4BDF4CDF4DDF4EDF4FE5D3E5D4DF50D2DDDF51DF52C2DFB1C6DF53D3E2DF54DF55B6DDCBECDF56E5D7DF57DF58D3F6DF59DF5ADF5BDF5CDF5DB1E9DF5EB6F4E5DAE5D8E5D9B5C0DF5FDF60DF61D2C5E5DCDF62DF63E5DEDF64DF65DF66DF67DF68DF69E5DDC7B2DF6AD2A3DF6BDF6CE5DBDF6DDF6EDF6FDF70D4E2D5DADF71DF72DF73DF74DF75E5E0D7F1DF76DF77DF78DF79DF7ADF7BDF7CE5E1DF7DB1DCD1FBDF7EE5E2E5E4DF80DF81DF82DF83E5E3DF84DF85E5E5DF86DF87DF88DF89DF8AD2D8DF8BB5CBDF8CE7DFDF8DDAF5DF8EDAF8DF8FDAF6DF90DAF7DF91DF92DF93DAFAD0CFC4C7DF94DF95B0EEDF96DF97DF98D0B0DF99DAF9DF9AD3CABAAADBA2C7F1DF9BDAFCDAFBC9DBDAFDDF9CDBA1D7DEDAFEC1DADF9DDF9EDBA5DF9FDFA0D3F4E040E041DBA7DBA4E042DBA8E043E044BDBCE045E046E047C0C9DBA3DBA6D6A3E048DBA9E049E04AE04BDBADE04CE04DE04EDBAEDBACBAC2E04FE050E051BFA4DBABE052E053E054DBAAD4C7B2BFE055E056DBAFE057B9F9E058DBB0E059E05AE05BE05CB3BBE05DE05EE05FB5A6E060E061E062E063B6BCDBB1E064E065E066B6F5E067DBB2E068E069E06AE06BE06CE06DE06EE06FE070E071E072E073E074E075E076E077E078E079E07AE07BB1C9E07CE07DE07EE080DBB4E081E082E083DBB3DBB5E084E085E086E087E088E089E08AE08BE08CE08DE08EDBB7E08FDBB6E090E091E092E093E094E095E096DBB8E097E098E099E09AE09BE09CE09DE09EE09FDBB9E0A0E140DBBAE141E142D3CFF4FAC7F5D7C3C5E4F4FCF4FDF4FBE143BEC6E144E145E146E147D0EFE148E149B7D3E14AE14BD4CDCCAAE14CE14DF5A2F5A1BAA8F4FECBD6E14EE14FE150F5A4C0D2E151B3EAE152CDAAF5A5F5A3BDB4F5A8E153F5A9BDCDC3B8BFE1CBE1F5AAE154E155E156F5A6F5A7C4F0E157E158E159E15AE15BF5ACE15CB4BCE15DD7EDE15EB4D7F5ABF5AEE15FE160F5ADF5AFD0D1E161E162E163E164E165E166E167C3D1C8A9E168E169E16AE16BE16CE16DF5B0F5B1E16EE16FE170E171E172E173F5B2E174E175F5B3F5B4F5B5E176E177E178E179F5B7F5B6E17AE17BE17CE17DF5B8E17EE180E181E182E183E184E185E186E187E188E189E18AB2C9E18BD3D4CACDE18CC0EFD6D8D2B0C1BFE18DBDF0E18EE18FE190E191E192E193E194E195E196E197B8AAE198E199E19AE19BE19CE19DE19EE19FE1A0E240E241E242E243E244E245E246E247E248E249E24AE24BE24CE24DE24EE24FE250E251E252E253E254E255E256E257E258E259E25AE25BE25CE25DE25EE25FE260E261E262E263E264E265E266E267E268E269E26AE26BE26CE26DE26EE26FE270E271E272E273E274E275E276E277E278E279E27AE27BE27CE27DE27EE280E281E282E283E284E285E286E287E288E289E28AE28BE28CE28DE28EE28FE290E291E292E293E294E295E296E297E298E299E29AE29BE29CE29DE29EE29FE2A0E340E341E342E343E344E345E346E347E348E349E34AE34BE34CE34DE34EE34FE350E351E352E353E354E355E356E357E358E359E35AE35BE35CE35DE35EE35FE360E361E362E363E364E365E366E367E368E369E36AE36BE36CE36DBCF8E36EE36FE370E371E372E373E374E375E376E377E378E379E37AE37BE37CE37DE37EE380E381E382E383E384E385E386E387F6C6E388E389E38AE38BE38CE38DE38EE38FE390E391E392E393E394E395E396E397E398E399E39AE39BE39CE39DE39EE39FE3A0E440E441E442E443E444E445F6C7E446E447E448E449E44AE44BE44CE44DE44EE44FE450E451E452E453E454E455E456E457E458E459E45AE45BE45CE45DE45EF6C8E45FE460E461E462E463E464E465E466E467E468E469E46AE46BE46CE46DE46EE46FE470E471E472E473E474E475E476E477E478E479E47AE47BE47CE47DE47EE480E481E482E483E484E485E486E487E488E489E48AE48BE48CE48DE48EE48FE490E491E492E493E494E495E496E497E498E499E49AE49BE49CE49DE49EE49FE4A0E540E541E542E543E544E545E546E547E548E549E54AE54BE54CE54DE54EE54FE550E551E552E553E554E555E556E557E558E559E55AE55BE55CE55DE55EE55FE560E561E562E563E564E565E566E567E568E569E56AE56BE56CE56DE56EE56FE570E571E572E573F6C9E574E575E576E577E578E579E57AE57BE57CE57DE57EE580E581E582E583E584E585E586E587E588E589E58AE58BE58CE58DE58EE58FE590E591E592E593E594E595E596E597E598E599E59AE59BE59CE59DE59EE59FF6CAE5A0E640E641E642E643E644E645E646E647E648E649E64AE64BE64CE64DE64EE64FE650E651E652E653E654E655E656E657E658E659E65AE65BE65CE65DE65EE65FE660E661E662F6CCE663E664E665E666E667E668E669E66AE66BE66CE66DE66EE66FE670E671E672E673E674E675E676E677E678E679E67AE67BE67CE67DE67EE680E681E682E683E684E685E686E687E688E689E68AE68BE68CE68DE68EE68FE690E691E692E693E694E695E696E697E698E699E69AE69BE69CE69DF6CBE69EE69FE6A0E740E741E742E743E744E745E746E747F7E9E748E749E74AE74BE74CE74DE74EE74FE750E751E752E753E754E755E756E757E758E759E75AE75BE75CE75DE75EE75FE760E761E762E763E764E765E766E767E768E769E76AE76BE76CE76DE76EE76FE770E771E772E773E774E775E776E777E778E779E77AE77BE77CE77DE77EE780E781E782E783E784E785E786E787E788E789E78AE78BE78CE78DE78EE78FE790E791E792E793E794E795E796E797E798E799E79AE79BE79CE79DE79EE79FE7A0E840E841E842E843E844E845E846E847E848E849E84AE84BE84CE84DE84EF6CDE84FE850E851E852E853E854E855E856E857E858E859E85AE85BE85CE85DE85EE85FE860E861E862E863E864E865E866E867E868E869E86AE86BE86CE86DE86EE86FE870E871E872E873E874E875E876E877E878E879E87AF6CEE87BE87CE87DE87EE880E881E882E883E884E885E886E887E888E889E88AE88BE88CE88DE88EE88FE890E891E892E893E894EEC4EEC5EEC6D5EBB6A4EEC8EEC7EEC9EECAC7A5EECBEECCE895B7B0B5F6EECDEECFE896EECEE897B8C6EED0EED1EED2B6DBB3AED6D3C4C6B1B5B8D6EED3EED4D4BFC7D5BEFBCED9B9B3EED6EED5EED8EED7C5A5EED9EEDAC7AEEEDBC7AFEEDCB2A7EEDDEEDEEEDFEEE0EEE1D7EAEEE2EEE3BCD8EEE4D3CBCCFAB2ACC1E5EEE5C7A6C3ADE898EEE6EEE7EEE8EEE9EEEAEEEBEEECE899EEEDEEEEEEEFE89AE89BEEF0EEF1EEF2EEF4EEF3E89CEEF5CDADC2C1EEF6EEF7EEF8D5A1EEF9CFB3EEFAEEFBE89DEEFCEEFDEFA1EEFEEFA2B8F5C3FAEFA3EFA4BDC2D2BFB2F9EFA5EFA6EFA7D2F8EFA8D6FDEFA9C6CCE89EEFAAEFABC1B4EFACCFFACBF8EFAEEFADB3FAB9F8EFAFEFB0D0E2EFB1EFB2B7E6D0BFEFB3EFB4EFB5C8F1CCE0EFB6EFB7EFB8EFB9EFBAD5E0EFBBB4EDC3AAEFBCE89FEFBDEFBEEFBFE8A0CEFDEFC0C2E0B4B8D7B6BDF5E940CFC7EFC3EFC1EFC2EFC4B6A7BCFCBEE2C3CCEFC5EFC6E941EFC7EFCFEFC8EFC9EFCAC7C2EFF1B6CDEFCBE942EFCCEFCDB6C6C3BEEFCEE943EFD0EFD1EFD2D5F2E944EFD3C4F7E945EFD4C4F8EFD5EFD6B8E4B0F7EFD7EFD8EFD9E946EFDAEFDBEFDCEFDDE947EFDEBEB5EFE1EFDFEFE0E948EFE2EFE3C1CDEFE4EFE5EFE6EFE7EFE8EFE9EFEAEFEBEFECC0D8E949EFEDC1ADEFEEEFEFEFF0E94AE94BCFE2E94CE94DE94EE94FE950E951E952E953B3A4E954E955E956E957E958E959E95AE95BE95CE95DE95EE95FE960E961E962E963E964E965E966E967E968E969E96AE96BE96CE96DE96EE96FE970E971E972E973E974E975E976E977E978E979E97AE97BE97CE97DE97EE980E981E982E983E984E985E986E987E988E989E98AE98BE98CE98DE98EE98FE990E991E992E993E994E995E996E997E998E999E99AE99BE99CE99DE99EE99FE9A0EA40EA41EA42EA43EA44EA45EA46EA47EA48EA49EA4AEA4BEA4CEA4DEA4EEA4FEA50EA51EA52EA53EA54EA55EA56EA57EA58EA59EA5AEA5BC3C5E3C5C9C1E3C6EA5CB1D5CECAB4B3C8F2E3C7CFD0E3C8BCE4E3C9E3CAC3C6D5A2C4D6B9EBCEC5E3CBC3F6E3CCEA5DB7A7B8F3BAD2E3CDE3CED4C4E3CFEA5EE3D0D1CBE3D1E3D2E3D3E3D4D1D6E3D5B2FBC0BBE3D6EA5FC0ABE3D7E3D8E3D9EA60E3DAE3DBEA61B8B7DAE2EA62B6D3EA63DAE4DAE3EA64EA65EA66EA67EA68EA69EA6ADAE6EA6BEA6CEA6DC8EEEA6EEA6FDAE5B7C0D1F4D2F5D5F3BDD7EA70EA71EA72EA73D7E8DAE8DAE7EA74B0A2CDD3EA75DAE9EA76B8BDBCCAC2BDC2A4B3C2DAEAEA77C2AAC4B0BDB5EA78EA79CFDEEA7AEA7BEA7CDAEBC9C2EA7DEA7EEA80EA81EA82B1DDEA83EA84EA85DAECEA86B6B8D4BAEA87B3FDEA88EA89DAEDD4C9CFD5C5E3EA8ADAEEEA8BEA8CEA8DEA8EEA8FDAEFEA90DAF0C1EACCD5CFDDEA91EA92EA93EA94EA95EA96EA97EA98EA99EA9AEA9BEA9CEA9DD3E7C2A1EA9EDAF1EA9FEAA0CBE5EB40DAF2EB41CBE6D2FEEB42EB43EB44B8F4EB45EB46DAF3B0AFCFB6EB47EB48D5CFEB49EB4AEB4BEB4CEB4DEB4EEB4FEB50EB51EB52CBEDEB53EB54EB55EB56EB57EB58EB59EB5ADAF4EB5BEB5CE3C4EB5DEB5EC1A5EB5FEB60F6BFEB61EB62F6C0F6C1C4D1EB63C8B8D1E3EB64EB65D0DBD1C5BCAFB9CDEB66EFF4EB67EB68B4C6D3BAF6C2B3FBEB69EB6AF6C3EB6BEB6CB5F1EB6DEB6EEB6FEB70EB71EB72EB73EB74EB75EB76F6C5EB77EB78EB79EB7AEB7BEB7CEB7DD3EAF6A7D1A9EB7EEB80EB81EB82F6A9EB83EB84EB85F6A8EB86EB87C1E3C0D7EB88B1A2EB89EB8AEB8BEB8CCEEDEB8DD0E8F6ABEB8EEB8FCFF6EB90F6AAD5F0F6ACC3B9EB91EB92EB93BBF4F6AEF6ADEB94EB95EB96C4DEEB97EB98C1D8EB99EB9AEB9BEB9CEB9DCBAAEB9ECFBCEB9FEBA0EC40EC41EC42EC43EC44EC45EC46EC47EC48F6AFEC49EC4AF6B0EC4BEC4CF6B1EC4DC2B6EC4EEC4FEC50EC51EC52B0D4C5F9EC53EC54EC55EC56F6B2EC57EC58EC59EC5AEC5BEC5CEC5DEC5EEC5FEC60EC61EC62EC63EC64EC65EC66EC67EC68EC69C7E0F6A6EC6AEC6BBEB8EC6CEC6DBEB2EC6EB5E5EC6FEC70B7C7EC71BFBFC3D2C3E6EC72EC73D8CCEC74EC75EC76B8EFEC77EC78EC79EC7AEC7BEC7CEC7DEC7EEC80BDF9D1A5EC81B0D0EC82EC83EC84EC85EC86F7B0EC87EC88EC89EC8AEC8BEC8CEC8DEC8EF7B1EC8FEC90EC91EC92EC93D0ACEC94B0B0EC95EC96EC97F7B2F7B3EC98F7B4EC99EC9AEC9BC7CAEC9CEC9DEC9EEC9FECA0ED40ED41BECFED42ED43F7B7ED44ED45ED46ED47ED48ED49ED4AF7B6ED4BB1DEED4CF7B5ED4DED4EF7B8ED4FF7B9ED50ED51ED52ED53ED54ED55ED56ED57ED58ED59ED5AED5BED5CED5DED5EED5FED60ED61ED62ED63ED64ED65ED66ED67ED68ED69ED6AED6BED6CED6DED6EED6FED70ED71ED72ED73ED74ED75ED76ED77ED78ED79ED7AED7BED7CED7DED7EED80ED81CEA4C8CDED82BAABE8B8E8B9E8BABEC2ED83ED84ED85ED86ED87D2F4ED88D4CFC9D8ED89ED8AED8BED8CED8DED8EED8FED90ED91ED92ED93ED94ED95ED96ED97ED98ED99ED9AED9BED9CED9DED9EED9FEDA0EE40EE41EE42EE43EE44EE45EE46EE47EE48EE49EE4AEE4BEE4CEE4DEE4EEE4FEE50EE51EE52EE53EE54EE55EE56EE57EE58EE59EE5AEE5BEE5CEE5DEE5EEE5FEE60EE61EE62EE63EE64EE65EE66EE67EE68EE69EE6AEE6BEE6CEE6DEE6EEE6FEE70EE71EE72EE73EE74EE75EE76EE77EE78EE79EE7AEE7BEE7CEE7DEE7EEE80EE81EE82EE83EE84EE85EE86EE87EE88EE89EE8AEE8BEE8CEE8DEE8EEE8FEE90EE91EE92EE93EE94EE95EE96EE97EE98EE99EE9AEE9BEE9CEE9DEE9EEE9FEEA0EF40EF41EF42EF43EF44EF45D2B3B6A5C7EAF1FCCFEECBB3D0EBE7EFCDE7B9CBB6D9F1FDB0E4CBCCF1FED4A4C2ADC1ECC6C4BEB1F2A1BCD5EF46F2A2F2A3EF47F2A4D2C3C6B5EF48CDC7F2A5EF49D3B1BFC5CCE2EF4AF2A6F2A7D1D5B6EEF2A8F2A9B5DFF2AAF2ABEF4BB2FCF2ACF2ADC8A7EF4CEF4DEF4EEF4FEF50EF51EF52EF53EF54EF55EF56EF57EF58EF59EF5AEF5BEF5CEF5DEF5EEF5FEF60EF61EF62EF63EF64EF65EF66EF67EF68EF69EF6AEF6BEF6CEF6DEF6EEF6FEF70EF71B7E7EF72EF73ECA9ECAAECABEF74ECACEF75EF76C6AEECADECAEEF77EF78EF79B7C9CAB3EF7AEF7BEF7CEF7DEF7EEF80EF81E2B8F7CFEF82EF83EF84EF85EF86EF87EF88EF89EF8AEF8BEF8CEF8DEF8EEF8FEF90EF91EF92EF93EF94EF95EF96EF97EF98EF99EF9AEF9BEF9CEF9DEF9EEF9FEFA0F040F041F042F043F044F7D0F045F046B2CDF047F048F049F04AF04BF04CF04DF04EF04FF050F051F052F053F054F055F056F057F058F059F05AF05BF05CF05DF05EF05FF060F061F062F063F7D1F064F065F066F067F068F069F06AF06BF06CF06DF06EF06FF070F071F072F073F074F075F076F077F078F079F07AF07BF07CF07DF07EF080F081F082F083F084F085F086F087F088F089F7D3F7D2F08AF08BF08CF08DF08EF08FF090F091F092F093F094F095F096E2BBF097BCA2F098E2BCE2BDE2BEE2BFE2C0E2C1B7B9D2FBBDA4CACEB1A5CBC7F099E2C2B6FCC8C4E2C3F09AF09BBDC8F09CB1FDE2C4F09DB6F6E2C5C4D9F09EF09FE2C6CFDAB9DDE2C7C0A1F0A0E2C8B2F6F140E2C9F141C1F3E2CAE2CBC2F8E2CCE2CDE2CECAD7D8B8D9E5CFE3F142F143F144F145F146F147F148F149F14AF14BF14CF0A5F14DF14EDCB0F14FF150F151F152F153F154F155F156F157F158F159F15AF15BF15CF15DF15EF15FF160F161F162F163F164F165F166F167F168F169F16AF16BF16CF16DF16EF16FF170F171F172F173F174F175F176F177F178F179F17AF17BF17CF17DF17EF180F181F182F183F184F185F186F187F188F189F18AF18BF18CF18DF18EF18FF190F191F192F193F194F195F196F197F198F199F19AF19BF19CF19DF19EF19FF1A0F240F241F242F243F244F245F246F247F248F249F24AF24BF24CF24DF24EF24FF250F251F252F253F254F255F256F257F258F259F25AF25BF25CF25DF25EF25FF260F261F262F263F264F265F266F267F268F269F26AF26BF26CF26DF26EF26FF270F271F272F273F274F275F276F277F278F279F27AF27BF27CF27DF27EF280F281F282F283F284F285F286F287F288F289F28AF28BF28CF28DF28EF28FF290F291F292F293F294F295F296F297F298F299F29AF29BF29CF29DF29EF29FF2A0F340F341F342F343F344F345F346F347F348F349F34AF34BF34CF34DF34EF34FF350F351C2EDD4A6CDD4D1B1B3DBC7FDF352B2B5C2BFE6E0CABBE6E1E6E2BED4E6E3D7A4CDD5E6E5BCDDE6E4E6E6E6E7C2EEF353BDBEE6E8C2E6BAA7E6E9F354E6EAB3D2D1E9F355F356BFA5E6EBC6EFE6ECE6EDF357F358E6EEC6ADE6EFF359C9A7E6F0E6F1E6F2E5B9E6F3E6F4C2E2E6F5E6F6D6E8E6F7F35AE6F8B9C7F35BF35CF35DF35EF35FF360F361F7BBF7BAF362F363F364F365F7BEF7BCBAA1F366F7BFF367F7C0F368F369F36AF7C2F7C1F7C4F36BF36CF7C3F36DF36EF36FF370F371F7C5F7C6F372F373F374F375F7C7F376CBE8F377F378F379F37AB8DFF37BF37CF37DF37EF380F381F7D4F382F7D5F383F384F385F386F7D6F387F388F389F38AF7D8F38BF7DAF38CF7D7F38DF38EF38FF390F391F392F393F394F395F7DBF396F7D9F397F398F399F39AF39BF39CF39DD7D7F39EF39FF3A0F440F7DCF441F442F443F444F445F446F7DDF447F448F449F7DEF44AF44BF44CF44DF44EF44FF450F451F452F453F454F7DFF455F456F457F7E0F458F459F45AF45BF45CF45DF45EF45FF460F461F462DBCBF463F464D8AAF465F466F467F468F469F46AF46BF46CE5F7B9EDF46DF46EF46FF470BFFDBBEAF7C9C6C7F7C8F471F7CAF7CCF7CBF472F473F474F7CDF475CEBAF476F7CEF477F478C4A7F479F47AF47BF47CF47DF47EF480F481F482F483F484F485F486F487F488F489F48AF48BF48CF48DF48EF48FF490F491F492F493F494F495F496F497F498F499F49AF49BF49CF49DF49EF49FF4A0F540F541F542F543F544F545F546F547F548F549F54AF54BF54CF54DF54EF54FF550F551F552F553F554F555F556F557F558F559F55AF55BF55CF55DF55EF55FF560F561F562F563F564F565F566F567F568F569F56AF56BF56CF56DF56EF56FF570F571F572F573F574F575F576F577F578F579F57AF57BF57CF57DF57EF580F581F582F583F584F585F586F587F588F589F58AF58BF58CF58DF58EF58FF590F591F592F593F594F595F596F597F598F599F59AF59BF59CF59DF59EF59FF5A0F640F641F642F643F644F645F646F647F648F649F64AF64BF64CF64DF64EF64FF650F651F652F653F654F655F656F657F658F659F65AF65BF65CF65DF65EF65FF660F661F662F663F664F665F666F667F668F669F66AF66BF66CF66DF66EF66FF670F671F672F673F674F675F676F677F678F679F67AF67BF67CF67DF67EF680F681F682F683F684F685F686F687F688F689F68AF68BF68CF68DF68EF68FF690F691F692F693F694F695F696F697F698F699F69AF69BF69CF69DF69EF69FF6A0F740F741F742F743F744F745F746F747F748F749F74AF74BF74CF74DF74EF74FF750F751F752F753F754F755F756F757F758F759F75AF75BF75CF75DF75EF75FF760F761F762F763F764F765F766F767F768F769F76AF76BF76CF76DF76EF76FF770F771F772F773F774F775F776F777F778F779F77AF77BF77CF77DF77EF780D3E3F781F782F6CFF783C2B3F6D0F784F785F6D1F6D2F6D3F6D4F786F787F6D6F788B1ABF6D7F789F6D8F6D9F6DAF78AF6DBF6DCF78BF78CF78DF78EF6DDF6DECFCAF78FF6DFF6E0F6E1F6E2F6E3F6E4C0F0F6E5F6E6F6E7F6E8F6E9F790F6EAF791F6EBF6ECF792F6EDF6EEF6EFF6F0F6F1F6F2F6F3F6F4BEA8F793F6F5F6F6F6F7F6F8F794F795F796F797F798C8FAF6F9F6FAF6FBF6FCF799F79AF6FDF6FEF7A1F7A2F7A3F7A4F7A5F79BF79CF7A6F7A7F7A8B1EEF7A9F7AAF7ABF79DF79EF7ACF7ADC1DBF7AEF79FF7A0F7AFF840F841F842F843F844F845F846F847F848F849F84AF84BF84CF84DF84EF84FF850F851F852F853F854F855F856F857F858F859F85AF85BF85CF85DF85EF85FF860F861F862F863F864F865F866F867F868F869F86AF86BF86CF86DF86EF86FF870F871F872F873F874F875F876F877F878F879F87AF87BF87CF87DF87EF880F881F882F883F884F885F886F887F888F889F88AF88BF88CF88DF88EF88FF890F891F892F893F894F895F896F897F898F899F89AF89BF89CF89DF89EF89FF8A0F940F941F942F943F944F945F946F947F948F949F94AF94BF94CF94DF94EF94FF950F951F952F953F954F955F956F957F958F959F95AF95BF95CF95DF95EF95FF960F961F962F963F964F965F966F967F968F969F96AF96BF96CF96DF96EF96FF970F971F972F973F974F975F976F977F978F979F97AF97BF97CF97DF97EF980F981F982F983F984F985F986F987F988F989F98AF98BF98CF98DF98EF98FF990F991F992F993F994F995F996F997F998F999F99AF99BF99CF99DF99EF99FF9A0FA40FA41FA42FA43FA44FA45FA46FA47FA48FA49FA4AFA4BFA4CFA4DFA4EFA4FFA50FA51FA52FA53FA54FA55FA56FA57FA58FA59FA5AFA5BFA5CFA5DFA5EFA5FFA60FA61FA62FA63FA64FA65FA66FA67FA68FA69FA6AFA6BFA6CFA6DFA6EFA6FFA70FA71FA72FA73FA74FA75FA76FA77FA78FA79FA7AFA7BFA7CFA7DFA7EFA80FA81FA82FA83FA84FA85FA86FA87FA88FA89FA8AFA8BFA8CFA8DFA8EFA8FFA90FA91FA92FA93FA94FA95FA96FA97FA98FA99FA9AFA9BFA9CFA9DFA9EFA9FFAA0FB40FB41FB42FB43FB44FB45FB46FB47FB48FB49FB4AFB4BFB4CFB4DFB4EFB4FFB50FB51FB52FB53FB54FB55FB56FB57FB58FB59FB5AFB5BC4F1F0AFBCA6F0B0C3F9FB5CC5B8D1BBFB5DF0B1F0B2F0B3F0B4F0B5D1BCFB5ED1ECFB5FF0B7F0B6D4A7FB60CDD2F0B8F0BAF0B9F0BBF0BCFB61FB62B8EBF0BDBAE8FB63F0BEF0BFBEE9F0C0B6ECF0C1F0C2F0C3F0C4C8B5F0C5F0C6FB64F0C7C5F4FB65F0C8FB66FB67FB68F0C9FB69F0CAF7BDFB6AF0CBF0CCF0CDFB6BF0CEFB6CFB6DFB6EFB6FF0CFBAD7FB70F0D0F0D1F0D2F0D3F0D4F0D5F0D6F0D8FB71FB72D3A5F0D7FB73F0D9FB74FB75FB76FB77FB78FB79FB7AFB7BFB7CFB7DF5BAC2B9FB7EFB80F7E4FB81FB82FB83FB84F7E5F7E6FB85FB86F7E7FB87FB88FB89FB8AFB8BFB8CF7E8C2B4FB8DFB8EFB8FFB90FB91FB92FB93FB94FB95F7EAFB96F7EBFB97FB98FB99FB9AFB9BFB9CC2F3FB9DFB9EFB9FFBA0FC40FC41FC42FC43FC44FC45FC46FC47FC48F4F0FC49FC4AFC4BF4EFFC4CFC4DC2E9FC4EF7E1F7E2FC4FFC50FC51FC52FC53BBC6FC54FC55FC56FC57D9E4FC58FC59FC5ACAF2C0E8F0A4FC5BBADAFC5CFC5DC7ADFC5EFC5FFC60C4ACFC61FC62F7ECF7EDF7EEFC63F7F0F7EFFC64F7F1FC65FC66F7F4FC67F7F3FC68F7F2F7F5FC69FC6AFC6BFC6CF7F6FC6DFC6EFC6FFC70FC71FC72FC73FC74FC75EDE9FC76EDEAEDEBFC77F6BCFC78FC79FC7AFC7BFC7CFC7DFC7EFC80FC81FC82FC83FC84F6BDFC85F6BEB6A6FC86D8BEFC87FC88B9C4FC89FC8AFC8BD8BBFC8CDCB1FC8DFC8EFC8FFC90FC91FC92CAF3FC93F7F7FC94FC95FC96FC97FC98FC99FC9AFC9BFC9CF7F8FC9DFC9EF7F9FC9FFCA0FD40FD41FD42FD43FD44F7FBFD45F7FAFD46B1C7FD47F7FCF7FDFD48FD49FD4AFD4BFD4CF7FEFD4DFD4EFD4FFD50FD51FD52FD53FD54FD55FD56FD57C6EBECB4FD58FD59FD5AFD5BFD5CFD5DFD5EFD5FFD60FD61FD62FD63FD64FD65FD66FD67FD68FD69FD6AFD6BFD6CFD6DFD6EFD6FFD70FD71FD72FD73FD74FD75FD76FD77FD78FD79FD7AFD7BFD7CFD7DFD7EFD80FD81FD82FD83FD84FD85B3DDF6B3FD86FD87F6B4C1E4F6B5F6B6F6B7F6B8F6B9F6BAC8A3F6BBFD88FD89FD8AFD8BFD8CFD8DFD8EFD8FFD90FD91FD92FD93C1FAB9A8EDE8FD94FD95FD96B9EAD9DFFD97FD98FD99FD9AFD9'; + + for (var i = 0; i < str.length; i++) { + var c = str.charAt(i), + code = str.charCodeAt(i); + if (c == " ") strOut += "+"; + else if (code >= 19968 && code <= 40869) { + var index = code - 19968; + strOut += "%" + z.substr(index * 4, 2) + "%" + z.substr(index * 4 + 2, 2); + } else { + strOut += "%" + str.charCodeAt(i).toString(16); + } + } + return strOut; + }, + /* 改变图片大小 */ + 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", + url = "http://image.baidu.com/i?ct=201326592&cl=2&lm=-1&st=-1&tn=baiduimagejson&istype=2&rn=32&fm=index&pv=&word=" + _this.encodeToGb2312(key) + type + "&keeporiginname=" + keepOriginName + "&" + +new Date; + + $G('searchListUl').innerHTML = lang.searchLoading; + ajax.request(url, { + 'dataType': 'jsonp', + 'charset': 'GB18030', + '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].objURL, + url: json.data[i].fromURL + }); + } + } + } + _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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/image/images/alignicon.jpg b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/image/images/bg.png b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/image/images/icons.png b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/image/images/progress.png b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/image/images/success.gif b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/image/images/success.png b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/internal.js b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/internal.js new file mode 100644 index 000000000..44dc17fbf --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/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:editor.options.themePath + editor.options.theme + "/dialogbase.css?cache="+Math.random(), + tag:"link", + type:"text/css", + rel:"stylesheet" + }); + lang = editor.getLang(dialog.className.split( "-" )[2]); + if(lang){ + domUtils.on(window,'load',function () { + + 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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/link/link.html b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/link/link.html new file mode 100644 index 000000000..55ab4d1e2 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/link/link.html @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + +
          + + + diff --git a/nezha-fronted/static/ueditor-1.4.3.3/dialogs/map/map.html b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/map/map.html new file mode 100644 index 000000000..e763b8eb0 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/map/map.html @@ -0,0 +1,135 @@ + + + + + + + + + + +
          + + + + + + + + + +
          ::
          +
          + +
          + + + + + diff --git a/nezha-fronted/static/ueditor-1.4.3.3/dialogs/map/show.html b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/map/show.html new file mode 100644 index 000000000..329cfebfb --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/map/show.html @@ -0,0 +1,118 @@ + + + + + + + 百度地图API自定义地图 + + + + + + + +
          + + + \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/dialogs/music/music.css b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/music/music.css new file mode 100644 index 000000000..8fb7a94c3 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/music/music.css @@ -0,0 +1,30 @@ +.wrapper{margin: 5px 10px;} + +.searchBar{height:30px;padding:7px 0 3px;text-align:center;} +.searchBtn{font-size:13px;height:24px;} + +.resultBar{width:460px;margin:5px auto;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;} +.pageon{float:right;width:24px;line-height:24px;height:24px;margin-right: 5px;background: none;border: none;color: #000;font-weight: bold;text-align:center} +.pageoff{float:right;width:24px;line-height:24px;height:24px;cursor:pointer;background-color: #fff; + border: 1px solid #E7ECF0;color: #2D64B3;margin-right: 5px;text-decoration: none;text-align:center;} + +.m-box{width:460px;} +.m-m{float: left;line-height: 20px;height: 20px;} +.m-h{height:24px;line-height:24px;padding-left: 46px;background-color:#FAFAFA;border-bottom: 1px solid #DAD8D8;font-weight: bold;font-size: 12px;color: #333;} +.m-l{float:left;width:40px; } +.m-t{float:left;width:140px;} +.m-s{float:left;width:110px;} +.m-z{float:left;width:100px;} +.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-trying{float:left;width:20px;height:20px;background:url('http://static.tieba.baidu.com/tb/editor/images/stop_music.gif') no-repeat ;} + +.loading{width:95px;height:7px;font-size:7px;margin:60px auto;background:url(http://static.tieba.baidu.com/tb/editor/images/loading.gif) no-repeat} +.empty{width:300px;height:40px;padding:2px;margin:50px auto;line-height:40px; color:#006699;text-align:center;} \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/dialogs/music/music.html b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/music/music.html new file mode 100644 index 000000000..e7ef04f39 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/music/music.html @@ -0,0 +1,32 @@ + + + + + 插入音乐 + + + + +
          + +
          + +
          +
          +
          +
          + + + + \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/dialogs/music/music.js b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/music/music.js new file mode 100644 index 000000000..1c538bf66 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/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:"http://tingapi.ting.baidu.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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/preview/preview.html b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/preview/preview.html new file mode 100644 index 000000000..f6b433bcf --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/preview/preview.html @@ -0,0 +1,40 @@ + + + + + + + + + + +
          + +
          + + + \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/dialogs/scrawl/images/addimg.png b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/scrawl/images/empty.png b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/scrawl/images/emptyH.png b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/scrawl/images/eraser.png b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/scrawl/images/redoH.png b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/scrawl/images/size.png b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/scrawl/images/undo.png b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/scrawl/scrawl.css b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/scrawl/scrawl.css new file mode 100644 index 000000000..b18430dc5 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/scrawl/scrawl.css @@ -0,0 +1,72 @@ +/*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: 8px;overflow: hidden;} + +.hot{float:left;height:335px;} +.drawBoard{position: relative; cursor: crosshair;} +.brushBorad{position: absolute;left:0;top:0;z-index: 998;} +.picBoard{border: none;text-align: center;line-height: 300px;cursor: default;} +.operateBar{margin-top:10px;font-size:12px;text-align: center;} +.operateBar span{margin-left: 10px;} + +.drawToolbar{float:right;width:110px;height:300px;overflow: hidden;} +.colorBar{margin-top:10px;font-size: 12px;text-align: center;} +.colorBar a{display:block;width: 10px;height: 10px;border:1px solid #1006F1;border-radius: 3px; box-shadow:2px 2px 5px #d3d6da;opacity: 0.3} +.sectionBar{margin-top:15px;font-size: 12px;text-align: center;} +.sectionBar a{display:inline-block;width:10px;height:12px;color: #888;text-indent: -999px;opacity: 0.3} +.size1{background: url('images/size.png') 1px center no-repeat ;} +.size2{background: url('images/size.png') -10px center no-repeat;} +.size3{background: url('images/size.png') -22px center no-repeat;} +.size4{background: url('images/size.png') -35px center no-repeat;} + +.addImgH{position: relative;} +.addImgH_form{position: absolute;left: 18px;top: -1px;width: 75px;height: 21px;opacity: 0;cursor: pointer;} +.addImgH_form input{width: 100%;} +/*scrawl遮罩层 +*/ +.maskLayerNull{display: none;} +.maskLayer{position: absolute;top:0;left:0;width: 100%; height: 100%;opacity: 0.7; + background-color: #fff;text-align:center;font-weight:bold;line-height:300px;z-index: 1000;} +/*btn state +*/ +.previousStepH .icon{display: inline-block;width:16px;height:16px;background-image: url('images/undoH.png');cursor: pointer;} +.previousStepH .text{color:#888;cursor:pointer;} +.previousStep .icon{display: inline-block;width:16px;height:16px;background-image: url('images/undo.png');cursor:default;} +.previousStep .text{color:#ccc;cursor:default;} + +.nextStepH .icon{display: inline-block;width:16px;height:16px;background-image: url('images/redoH.png');cursor: pointer;} +.nextStepH .text{color:#888;cursor:pointer;} +.nextStep .icon{display: inline-block;width:16px;height:16px;background-image: url('images/redo.png');cursor:default;} +.nextStep .text{color:#ccc;cursor:default;} + +.clearBoardH .icon{display: inline-block;width:16px;height:16px;background-image: url('images/emptyH.png');cursor: pointer;} +.clearBoardH .text{color:#888;cursor:pointer;} +.clearBoard .icon{display: inline-block;width:16px;height:16px;background-image: url('images/empty.png');cursor:default;} +.clearBoard .text{color:#ccc;cursor:default;} + +.scaleBoardH .icon{display: inline-block;width:16px;height:16px;background-image: url('images/scaleH.png');cursor: pointer;} +.scaleBoardH .text{color:#888;cursor:pointer;} +.scaleBoard .icon{display: inline-block;width:16px;height:16px;background-image: url('images/scale.png');cursor:default;} +.scaleBoard .text{color:#ccc;cursor:default;} + +.removeImgH .icon{display: inline-block;width:16px;height:16px;background-image: url('images/delimgH.png');cursor: pointer;} +.removeImgH .text{color:#888;cursor:pointer;} +.removeImg .icon{display: inline-block;width:16px;height:16px;background-image: url('images/delimg.png');cursor:default;} +.removeImg .text{color:#ccc;cursor:default;} + +.addImgH .icon{vertical-align:top;display: inline-block;width:16px;height:16px;background-image: url('images/addimg.png')} +.addImgH .text{color:#888;cursor:pointer;} +/*icon +*/ +.brushIcon{display: inline-block;width:16px;height:16px;background-image: url('images/brush.png')} +.eraserIcon{display: inline-block;width:16px;height:16px;background-image: url('images/eraser.png')} + + diff --git a/nezha-fronted/static/ueditor-1.4.3.3/dialogs/scrawl/scrawl.html b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/scrawl/scrawl.html new file mode 100644 index 000000000..9371abd7b --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/scrawl/scrawl.html @@ -0,0 +1,95 @@ + + + + + + + + + + +
          +
          +
          + +
          +
          +
          + + + + + + + + + + + + + + + + +
          +
          +
          +
          +
          + + 1 + 3 + 5 + 7 +
          +
          + + 1 + 3 + 5 + 7 +
          +
          +
          + + +
          + +
          + +
          +
          +
          + + + + +
          +
          +
          +
          + + + + + \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/dialogs/scrawl/scrawl.js b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/scrawl/scrawl.js new file mode 100644 index 000000000..e0c005e75 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/scrawl/scrawl.js @@ -0,0 +1,671 @@ +/** + * 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(); + if (!!base64) { + var options = { + timeout:100000, + onsuccess:function (xhr) { + if (!scrawlObj.isCancelScrawl) { + var responseObj; + responseObj = eval("(" + xhr.responseText + ")"); + if (responseObj.state == "SUCCESS") { + var imgObj = {}, + url = editor.options.scrawlUrlPrefix + responseObj.url; + imgObj.src = url; + imgObj._src = url; + imgObj.alt = responseObj.original || ''; + imgObj.title = responseObj.title || ''; + editor.execCommand("insertImage", imgObj); + dialog.close(); + } else { + alert(responseObj.state); + } + + } + }, + onerror:function () { + alert(lang.imageError); + dialog.close(); + } + }; + options[editor.getOpt('scrawlFieldName')] = base64; + + var actionUrl = editor.getActionUrl(editor.getOpt('scrawlActionName')), + params = utils.serializeParam(editor.queryCommandValue('serverparam')) || '', + url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?':'&') + params); + ajax.request(url, options); + } + } else { + addMaskLayer(lang.noScarwl + "   "); + } +} + diff --git a/nezha-fronted/static/ueditor-1.4.3.3/dialogs/searchreplace/searchreplace.html b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/searchreplace/searchreplace.html new file mode 100644 index 000000000..b91f19014 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/searchreplace/searchreplace.html @@ -0,0 +1,102 @@ + + + + + + + + + +
          + +
          +
          + + + + + + + + + + + + + + + + + + + + + + +
          :
          + +
          + + +
          +   +
          + +
          +
          +
          + + + + + + + + + + + + + + + + + + + + + + + + + + +
          :
          :
          + +
          + + + + +
          +   +
          + +
          +
          +
          +
          + + + \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/dialogs/searchreplace/searchreplace.js b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/searchreplace/searchreplace.js new file mode 100644 index 000000000..1b5285736 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/searchreplace/searchreplace.js @@ -0,0 +1,164 @@ +/** + * 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 () { + 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"); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/dialogs/snapscreen/snapscreen.html b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/snapscreen/snapscreen.html new file mode 100644 index 000000000..cf8209ee7 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/snapscreen/snapscreen.html @@ -0,0 +1,58 @@ + + + + + + + + + +
          +

          +
          +
          +
          +
          +
          +
          + + \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/dialogs/spechars/spechars.html b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/spechars/spechars.html new file mode 100644 index 000000000..0b5c416f8 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/spechars/spechars.html @@ -0,0 +1,21 @@ + + + + + + + + + +
          +
          +
          + + + \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/dialogs/spechars/spechars.js b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/spechars/spechars.js new file mode 100644 index 000000000..f4c155e15 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/table/dragicon.png b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/table/edittable.js b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/table/edittable.js new file mode 100644 index 000000000..11dbee7c5 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/table/edittd.html b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/table/edittd.html new file mode 100644 index 000000000..49a52f719 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/table/edittd.html @@ -0,0 +1,61 @@ + + + + + + + + +
          + + +
          + + + \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/dialogs/table/edittip.html b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/table/edittip.html new file mode 100644 index 000000000..954f7bb66 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/table/edittip.html @@ -0,0 +1,33 @@ + + + + 表格删除提示 + + + + +
          +
          + +
          +
          + +
          +
          + + + \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/dialogs/template/config.js b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/template/config.js new file mode 100644 index 000000000..417b8f787 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/template/images/bg.gif b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/template/images/pre2.png b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/template/images/pre3.png b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/template/images/pre4.png b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/template/template.css b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/template/template.css new file mode 100644 index 000000000..6c1608dfc --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/template/template.css @@ -0,0 +1,18 @@ +.wrap{ padding: 5px;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: lemonChiffon;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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/template/template.html b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/template/template.html new file mode 100644 index 000000000..d9903a480 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/template/template.html @@ -0,0 +1,26 @@ + + + + + + + + + +
          +
          +
          + +
          +
          +
          +
          + +
          +
          +
          +
          + + + + diff --git a/nezha-fronted/static/ueditor-1.4.3.3/dialogs/template/template.js b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/template/template.js new file mode 100644 index 000000000..80a334b36 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/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":"lemonChiffon", + "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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/video/images/bg.png b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/video/images/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..580be0a01dff4c70c72f78a3f40186660ee8eee0 GIT binary patch literal 2810 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 Bm*4;Z literal 0 HcmV?d00001 diff --git a/nezha-fronted/static/ueditor-1.4.3.3/dialogs/video/images/file-icons.gif b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/video/images/file-icons.png b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/video/images/icons.gif b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/video/images/icons.png b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/video/images/left_focus.jpg b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/video/images/left_focus.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7886d276dda2e0aecdae22393eac534ed507babf GIT binary patch literal 11423 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 T+mF>-Zi@@LHB9%bmHhD^k7NPf literal 0 HcmV?d00001 diff --git a/nezha-fronted/static/ueditor-1.4.3.3/dialogs/video/images/none_focus.jpg b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/video/images/none_focus.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7c768dcb47aaa289135afd2bd0e8eb0b6ecb7536 GIT binary patch literal 11546 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 C61Fb@ literal 0 HcmV?d00001 diff --git a/nezha-fronted/static/ueditor-1.4.3.3/dialogs/video/images/right_focus.jpg b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/video/images/right_focus.jpg new file mode 100644 index 0000000000000000000000000000000000000000..173e10d2d91026c7283566993afb2f3a0267ea40 GIT binary patch literal 11334 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 literal 0 HcmV?d00001 diff --git a/nezha-fronted/static/ueditor-1.4.3.3/dialogs/video/images/success.gif b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/video/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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/video/images/success.png b/nezha-fronted/static/ueditor-1.4.3.3/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# + + + + + + + + +

          + + + + + + + + + + + + \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/dialogs/video/video.js b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/video/video.js new file mode 100644 index 000000000..a8c34d974 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/video/video.js @@ -0,0 +1,791 @@ +/** + * 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"); + if(!url) return false; + if ( !checkNum( [width, height] ) ) return false; + editor.execCommand('insertvideo', { + url: convert_url(url), + 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; + + var conUrl = convert_url(url); + + conUrl = utils.unhtmlForUrl(conUrl); + + $G("preview").innerHTML = '
          '+lang.urlError+'
          '+ + '' + + ''; + } + + + /* 插入上传视频 */ + 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 = $('
        5. ' + + '

          ' + file.name + '

          ' + + '

          ' + + '

          ' + + '
        6. '), + + $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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/webapp/webapp.html b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/webapp/webapp.html new file mode 100644 index 000000000..161437790 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/webapp/webapp.html @@ -0,0 +1,53 @@ + + + + + + + + + +
          +
          +
          + + + \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/dialogs/wordimage/fClipboard_ueditor.swf b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/wordimage/fClipboard_ueditor.swf new file mode 100644 index 0000000000000000000000000000000000000000..ac5d27f81d2111c8581a042564c5275edd751e1c GIT binary patch literal 1908 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
          ukC`1!p{x~JlsV7pDC73)_A$z0@ zf^VaotsN!9;`kLMvs4Vn;#33;L+{;zJb>YMTdz$s7T-T|zB}YO>oX`}$_XWnbT{0afRR z%S4AgM29@-EegyIYLzu{$yI#u3vIyrsyii5+ZVF;w1bDsXf^=VS$z262*2BhA1-^^ z!H`tI@A2Uq5q__PY9$qSfew0? z7hjV+jYVD{D$h{W@mVCNpD-={h9rxJ3xElT20Q52x7l_tnFl8=t$D7|0LAK}$kGxM-nJ;e;gCxrQpTr&QNZwGV3a#Cih+0=wj z4d=3%(Q>5~>JM_bnxlwvJhvF7L)AjKmh|8B^Z`*vMbdO}DF7|Dl?mlFge-R#JgRK6WapvV$YicR9kD(c=KR+C%KGxswWBvHq+s6`m8l$9(!ebhtVUI|z z8qRd{bZR)~3t{R~)b)`{p(Fea%xkN)_*}(e@kwDziqBUpIX*dTDe;HHmKvWDwzT-v zu%*YRg)QSI!(Of7JourMbd>n?aO|iYpAojMzDb6u4V8u@4Wzt!V$6wydVl+%o|s`) z+B3|=8+xVvhMt9@>~V6UQ6~OeX+MO2#^axfz^lunJi28BsrUzBquM< zG(*R333iqDY4;W8>*S?bK=ld@+2jW#XcC7RhaBcZ+T9w6{_!%Yj5_uN`G*ch zyZmOHT=#)g#Bq*Ns!K^M8817P@A16))dIt7)F{d5yC-6xceOH30HflrAPz$5DJkvVhY z>8tONC3=mecB&i_x$fcYML_OB7*<9qvQvQcKjKX1GYQpAh>4GtlMON*cY|xV%$58; zmry(FRVDydOQRZAOKsV@m0H~x8Tv-`7@1YC)ELItV`Wmj8!L0gJG{lrbxa%#M9*ne z%wfWX(s9Z~nK%LS7^KJ?WH6&))Nns)IFCBSaGuK?m$+{0{W8CJJvj`l9My918t_we z)t%v0cQmosoFg~h&vh%4T&?9YEoSX1k_Jvvm;Ooccx<}Y5qVgvd1~0qF2ar$rA74; zYRX@u8Zodr%%~iX#bFRaH_O(}kVAA~oJW3WET}4t(DIl3Ghw|((38Rh-3-v@d(cM> z>asZ8L?kLw$Y|#6Tf8fAorpSvi4T07hHB!qXg{=S4TT*mH5Qy)Oh zF)`mp88?WldA_urK?Nd2<`L6k<-LPN%?K3LWf3D}*B;W`)3CBj;r}fcxNF1zLd5~u zw`|iS%W|Y7pg(n|EVD?-&(BH2DLGrhXUCG_=r+kuZj<8RHo466;+~!G;z2tVG5R#8 zK`?nGW=p;nLNNC+#o3K1E=+hm^#ioQBTj#y{puc*@cbunpX8nZ)vb_%XFzu$DN$0c zn`fSO>wL0=zgsT!EWWfNTe(+OyEC>I#%(%+%aIbkGU1YaX1>`_kyh#|YAQkv6;)|9 zJ~v#uz+@@aseROBc}t#kds?#w-=1HW($=rOJ*`8~%%PSv8()v^?jKTw*4>^qQff+t z%u_}VnL*01{$}P-5xdTYaE!!q7n&t#okHbqn+L9iczeESU4MJpqyleGhoi%Bsx=?H zy((>f!-~%KoW|^Vu6te;)T``~Z=@nt$s^YFb9rRM(zqu|9(45qSNPj0m=iJU${aV- zie;_0*gET*vxef16G&xNI2En}LcyXdoGQ64Wv29Azb_P0+RzK3n@R8k(ej(2P&5UV z5LgUFEF{80o@*(y35$W3V2OBFK7e=;-eF3i1o7@M7pO~k54@BRR*4$+YL&?Qm|4BZ zWDRnD*{o{=mz=VTBh!NBJMrE=31eiy+F#&K(0Ug#Ecohmubl z>xX(wsC!DelDYj9W*<4#-3lSw>y8Gu$|AJo`rKB z$R*yX)%`LaQ*k+aHby=m7ae0gNb%>3_-tmjOj2j<0y!k^SB{nOcnDVlgJk;=IXg(P z=VC_VWLW5FcPY5_x5R9twQgkxo^vSu8fGYIHCsDhMipzB3le*S+UXHm{X-NgWh`(N z;KBc%M0VdF3k1C{g389TP~8%?zB4C5WO2rgq{3Q-C+UA_!7dxm)Tx60N3}&}#aQvYSG@Du<_*njP-OB94P9FnrwgatvK>9uH}0341jxV3|D!I>sD#0lQe{2a|J1y5=v>JW7K3 zL$V%Gwb=?v&`^N~B+3pjj2zg|l1qL}2<34~m zg3lp>4Ru4I@Q;PU9fiU@csn(p$7wF5 z)jnscb$P}5aZO%f4SDE4Myx@q|5QmCqNgw9J;g}&%N$2jr{t~c50!_S_aE4&roYnA zALKmI)+xo+b;a|z+LNS!JYH60RU05QcAn-MJMFnavZwvq%5~M;Q`QNx8CJCq=qUtb zGL?AD8cFjjm>yowo7@nkhZzNYrZiNv``iP!vkbvKOzc7+XQzz5kZm5uD~5yQ#~Fxe zl^pHxYhcH$4pVz9>_kOh;BkCg@Mi9cXM z2A`@oDVzc+ok)t0koYjfdqrd08?mYuG|b$X|(S- zA>oY-Oj|r6CjYNc<(aQUm4^xECKqRV>L};Wr-Y+7od)oKq6mNP`+|++bb-zkJg7x3 z-iO8AfY)8T*a!_Urv^mlKQW(7?TtRV|YXf zMUdebx(v%rNeqRS-oa)iJ6LNnXh9|^%ta)(LBtm^ACuU{V7~F}$JBk!&PlH&|3)E#eTtTw?tu6DJ_vbE2U+_gYP73mGKZ+oL(!)TV)6FV46Mmt&3 zx4@CuPGP$cRo4Os!Uarlpb9j%z=6QqizB!Nj^qI{8UvpsncqN1vGI+hXM1BPDqWK4 zjWs5j-bm6U)QODT?nYO1Jd@Flq-S#@f}(V1lN(Ki0;k)50o@)llK$gcqkup#3zyyc z1#wB~xs>i>lhV;X?b-2xHYU3tI@$e5qS+5%wbb}swfdv7t1A4$Y4$s>f&aH$;trpu za9k{;g&ptukAYj$z45q6*20>e_m*l6W$oP1sw+hGO>4Af)9dETxN1vwxoD$1#QvJC zoACNeHaEmuv2_%!*dPjD49L7J0|KP5hQe2wCwz4{`CLA;)~sJkQrAH)b)8mHb9_n7 zOCuyTzSK){L2a$+B)^dvr6q~Af;T9)K~EJczn%j5P76PLamriwX~gG~OI(o#`FwI| zP~J&C5fpbkUrO~BeJiQUxw0aOV;r;Osf)g^Dw1)9-K3DnxQ1@>ao0x}x;`$CC18pV zNMuPN10=aTmK19~=*D%A%3{^GST;*EeW^lHIcWf4r_xa}H$BNb34-~$BEkH55ztvM z4|Wn_CE=9Pn2zujek2u!mRIv=$`+`=n>`Yy6@J9PJ>RhCDiPjQcmge-;#&nN%}=wB zr^y$0mHg?u3X=2mBL4R}i})r?=Sg=qPr8$NvTOO?^yK@bE8Z84Hr&R97VDy`c(VQZ zMG&1td%eqkq@Qa)GK%_ zS+*B6G?|cGtHsxZo%rW0cN5i>Uh#cNb8@vWX?PCyq>N_y`$3-TG^c)@mRPUl>eqW& z)@{;iH))9fQ!?8B9)SmD8?@wlv=&Y8?yV#3f{hwIys}OM7rq_=e-AO#A%dW~QhMK| zrj+Ybb@lRDarvJpl)3U6~%A&v{UgA-)TrfuzLW4Qt zjopoy9dG*}*IHfXET8qUi=K~xg)srU@6lVs&bUl?!9xP$V=Wjki87_y)3vvQFc_2*>Q zuwF5%V@^PYem%(?w1`aMGp;LSRZ+Abp*CYj(W}s?(ugPj zY=~*p&i-GN;#i#Ou7mx+zl#C9B9X)LB&+4p>2XZYlTpn1?jBxUFa;!^^`&8&$AsoVMFYA@xKakXJEpj5wT|ScE1{+H<{1|tF;{{bfyvef zPTx0lK7HRP>uRI~uSzF{-2kz5-=0J9;-p%;)kLL?`qg-+d8(FXdOFjdB_(D^0pl`BZd)eNECsB~B)M^! zM2i$KFO%ffW$NZh+`i0uIaIe$5*B7Q$r=#uC_XIou;dz2Nw!K!Zbk(@$uk&HNfy~q zNqQz!5>q7ChzjP#O{l;pc?JV2$s+qHNzZ&rVyfgCP{F*o`4sph&tN!-%Bm;(2k^ws^Ns98Us3ct@DoHY>k@PKTB!vZ) zBsZXv6!ue+p81r`vaUo*KJD82$TeMBAMu`4y~}-4HOHS+buE$%I>jQ%>65rtO1@O5 z|5KSWd6|gtF1Oc^6y_Sj{8emW9II=MpKNBM98~#n{hp-;UhBK5)?cBXU(L3|DH=eY zeTP>(4WRb3Y5?{3G=SFNWVIzQn`PxrHmMvLU-P^!(P1XHnf34&{x?YQ*MEZ)gN9R( z_XsI+iVkKED<O;j6|#r?SIFe;Ae3Ag z>Hwic4Q&IV1k&eaH2i}5c}MiRD80y96Ll{cZ1r|Rc9>_lG+pVo_-MMB;B6#s(c*_? zdkd}s+E3X??2u2rEjE;jG@}xaUe1La_mb^5xT=UhI_Z9C0@0W{}iVw)HK62)` zYnd~%MRw|s;|)>%MRjAm(m+X3?yUV3wFtJO((r4Y0(W5G>s}$5ZRmeP_KcWplYP_e zvZp&NG?EYc>2_keL$YgO#Ibjt0{x~By$hk=3PA5V1^R7*4%4MyIkQBC1n*FS2oG}V zm!RhCVIORZ06XG?ZE?ZgEy`^ng1tvzeW49bNc`z!%ygle6(F_8NbUFiq5>%82dAXm z;-(~!+K(vZhooeCkp~9zqy?}YGB!m^^==c}^Jv#V+hlAS7w8zRAihr*kuWhWo^T=H zmXFGrVmmPaGJ$J9ZA!MeU=aP6UeD zcS=zo`~4wH`s}`c3;I8mQQ>+D+T8omD3BsQlB`>+aOt0|YX>B%te;iY086sl`x+lA@-=Bf{V*rIkH=Mf$+^{+T{9urdJz>12`NY zxkk-2>M*Wc*DhoLtu39#2+md(61Sjn zn78B_OBT~sfhu+(7PwW;>@yqMWmsL2O}(vh4#`Ip~$AU1!73|QpflCqoRfiMM zt9a=CKq%?a+z`MXULKB-c5_VxM{();NTaL$OkvfP!zfFifaZN5O8WzWRrp+yZJE>B^VMETXvQyO#2;sZV zN0G=Qsr^y+4zi`r3wYt(07cfqkrTKM=uBR!*RXa#$FZc=mSG)e{9DFRH(Xy(RoaIe z@|XEA3=FyaB6~O1gPI55erv>ACswGjh3A9zk~-v+0xlc}JN+!rqa1enS>m0=6k24k z_sG-=D%zbwRKRlwkH=yr@QePZL5J*)^#`Opees5Yf zU2N(Otg!FG@+T;GE|3N(*3qnj?P!UdW`*pWmdI-sv-4VFt7b{|RxQz{S+d=xCE7Jh zvD>vohh}MZhnCo;S-QPVOKjIH!``kXc4(Gq@6ZxEH7jiI)DpWiD`M|Lk$7S;QjF!0KDT-%Z;2zu{o~roP1@1wBX+FTc2rxYW zKsn4%Tsr^<1pN?UW?}PS8=|wqA+22ct12*o2 zbNmUr=b)bPTo<{BygKsnrKXqHcFL==IIny-&-40M%xh~`7~wsXC4M$LD4Tv>Hppn= zZQ+!7R<9E6##fJ1ur;C=peLJoP^o@c!F&E(zIjlIx0nlvjaEOz0V|LZK{(?U3bOQA z--AkXygkgb&2oUW3XPdkh4$&VPzV}Ocv*BLcsICSDLM?i8(ptV@0}htgqI$+ga#2_ zmEJqehJ{z7_fB)JSEu(*x4K?~-a8%ZrZqi1)-dU@h7I+?l0qRo;`74v&kN6dUfBA1 z;oZ**;gf~f$-+OMEIf6xP&iot2z&y2CJatREs*9YnHq9Cvcq2-1X9OYJ16uEBqkDR zwOM{AKFETB&(UkKWAU}vf1&4OJHp^hlXEqO-a^hb==@u9zJSgf$hj7s*N}4^I^*PA zkIqZ5J1{~i+8-~zQ)j3K4p52$ZG2mp+6UVvPp+m8G+tvVy>f*@E-BYNrRS|^^;5c3 zeaOV?pV2KLjuSy+zzVNP$NEi*ZP*d^nsgX{q}FXxY{Q9ulm0Z=N(!~1*Gek2;SRq^ ztAZ`8QycE|o78PXliJXPHvES|!JL1xu(ANaqffC(`k$Pv%igB@-B7!ZaQW_#7|j#$Z3u?L%_GIy zQ@hh%ASHp%b|IsKLxMLP(#tDEZf@?Tn>)6(8jKYE@pVqT=b=ac1oQEj?;C>oeut0L zHptC=B=rIqK8JMog;aO+NHltY8W%oSC`i{83jb6nJV%dE%vEsf^MdSE2xkV`1_Y1N z!vr#qrv1xd=^TF^I|)kT4savSxz=~CGZz4n=TnNFm|{MQni3QE3ZX5KdI-!aL<)uW$L zxQ_XB_rA_kegHo+dD;tbgo?%E3R>04c!f19rTC77*b29sDahRj&t{$#8SpS(%5yx- zv1clIe%I=G=rm+V9+S_6U#n8POd-R2R9CY1*Q{{u>}I9*N$THA6|~gyZ)DFjP^DF! ztF)?fmE3?YmLy$zl^jvT(gCEsSYi4xn>Jdqpn}WYeu>oxVpoy z2mGS&D}`Sf{Cc8+n{sgUf?sd=od>@@@H-!V7r^gA_+13Q3IyznON?1cwtBe|8rsG` z?T&Q=@Lu9LIqPp1Oeli|VYbqqt#nO$v<5pHTCI8m47fQU9j`{7kAHa3BW~PWbgT!* zJl8QF9RO)Ba2=1jzzbc+W3FS7>sahM9(Nr}pua2xdi6XDrg#TEo0$)gi_#_h?Zf#> z^}8lROfruuR-f`C$UXXJGk_z+)%2I_X=s>QseKQxV9Zy>p_bLXbWTrNPbn=!sof&bjQF?_EDKfuS<{C2>f)y$vO2L$ocnQikz(~ zCuhI%6X(*6#-9^OYR=S!__xfhdzsZ|HW6T6X9_4m3M@Pa3Z%aj1)3F30k(i!P9={L z^cV}ueuY557BaJx7E75qG~E+5*_J9;+iOt;t*oXjgx0M3QvK>bG*iNL)N>sJVQK~D zvs6j-B^#o0KGn0=YQXw*bazKT(SD|UF0{WzMxAAgA@Ml&y>Nd=qC~Od!b0Yb6iC3P8{@=B9h4$fe8$Y{?}7!raB?ru%>k#wfs@&s_j_0e1o1h1>;j z7kxz{{_j$VlK1&)$CX&wf`Fb=WMMNDxf#qeC{4NX_R4^J74V@| zz(8haGb@#Oko0*<`g1p_Qk-;6!2LqNy*A)p2U)HIp#`#Bt02?QW?sM&;Jb#3Sbo|f zjt7c39w_2?port=Qp5^H*v#ZR?JIG~Xy6_4k56ka@N42!Vh*mTRs~j)tBdnmqX^rB zr#t4j@|LSbRvU4X{e{4Z$=c!*lXd5KV)AwO#N>?wfSlH&$weIsXYq4MB61ETOxzVxLFS1u9c5Cq}d$*R@ zqs15L_8u*tJ|+@i8r+P^Sb>89(Q#VA9ro@_H9mzeVc15>{qZ2x6^jiU_j=e7XOib zP)i)r;(ucw(h_fK@m0G0rj~e1i?7k`x3t9DT70c;zpW+S(cUOh(-^Sc=>D|b51FiC zj@6G|K{$dogkM#Z9GiQ{C|XT-^s+O0E7tV~|j-`w%@Ja!-7CB&9Xu$w->y>8Lo&%~vlsSna4V z$;miWdc6SyFqksnf%0?sAOKlmD+0Q@d$-cx7Yasq12-Ua{sMv#y^mf%&>;m117>_R zCT_x|Tf8xXp-?|?kBCrk$(hkFX^xMKoD2F8!7)6FIUMaOyQaujBLfH|Ad~-ZY4qn9|~!N-Akp>A*Wpso&^rLc}Q!iIT9Jo3E9 zof8@<-EsSzF8W-j{GiW$)e7aTP%hBvx`G1F>8o_-S407_81<#HC_?ENdPIlA7ja%! zWcYV&_9}6;6`4mnKsg+!&F$t6@Xla2&-HqX9~-}+NWh*!E^%V_Tu^&Ym}ZTG6d1vG zb}q#P7frlT~d^ znCz}w%u+4Q>TdP0F0?MPBulY$tD6SJAO z4Y1|ML(>l-UXH{AQt-rAT(ki!lTbEe|3OLSDAiDod&2S^gJf&;cMkc?hCQA&WA=@N3rhAgi9%-&ysL;icBU0p?f7 zhO^j%EY`xHgv+cOVvn=fY6eyK`sHG8U96E20==Q;eSk6-Kn?o?1qJ|x zs(=dL06JU)^~E~=mGyn=2UfN9Lu-h2qg7-5#QF#8ChKPFr`9dj&#a$YY3o+&S60UQ zwPjoXWc|h(YTa%Pv+l5dZ~ejgck4f5BUo%Ci#4&>oh&wr#qMIUyIJfW78}cA<5=t= z78}oE6Ig5_i%nv&$t?CTi?y=YOctBPVzXIn4vRg)Vslw+9*fOqu_Y|Fl*OK4v1Kgw zB#S-8Vo$T!Gc5Kji>+a?7g%g9i>+g^^(?l5#Wu3oi!AmMi{)4>&th9ytc}ImS*(M_ zwz1fD7TdvM`&sM&i@nNXud&$cEcOPA9b~aXEcPagy~Sehv)BhL_92TMWwB!{_7RI6 zXR#A3_A!fn!ftM5_BP&pve)u{>qE;JNNm{*L~+3zVo2(JcQ1HmFRra zcfO_IgE>~Hn}P@4!`d9{*6!%Mbr@dvbF8aNaIMrWc2}h{6Qtmw^rSTSH!{*vrJ!tW zlN!p_-l^iVvm;boN*z{&(aYpVC?y{uFC8Ht!{x%eif<(I7;@zIe1NwR;C)(t2vb7U z1qC(yKcF>6DTcXfq9W!)m~~XG7E^z$;PVxgL$dwtj}^%MLsas6A9Yzj09U@%K8l+k zM-}VVnf6EM{7A8nlOo;;rS86PHq)S5;oAGcQh&T|q3DcT&dQS1WWP<2@4#PJCMns0 z18VP9S+@3Gto~>fPyV5(%m+&CeX5kL9fQI5!yiaRip5j47J`UR`;pSKBN?U}H2xYtY`|F{M{u5I$Tg zI5|Otk6;C-YQIIxI#q4i%wdq7dklc$t7@u35aLh}tklM#H38w7J+A&CHS5%lg2ozn zIki~;k)uV3)b+zISksR-8MBqpi}0R{GT2nLXF-x4(7{h?+d&kFK;uM#%?$u%_#LaH z3Z#Xe!11nw`TZJjcN3A{1WtD?_)CF9RsiTvtslc2Uk1Jygn!?<4Y=Ij0_0_oYA~>0 z8<_7u0y`dT{Rm)x4gBs8zzc^!*e`+E{vY6szqZmh4{p$L-OwJbMvD;mN^UMQI_$Js zS2si7#@n^SI`S4PF=$+OMDZ!&Sb=p{Lm~K}YB+G0%vMU3uOA&=Bjv2Yy_OaVfG0{a zgRC@6IB9VAf;!zGe0{)uEq7M|hzR~dKf+uMVy=Es%=erIb2dmDqz^LSYYqwzirj2K zNgB2ltYo9VmcC68GZ@%|zTucK;`&dyJy#tGb9c0K% zyHY(;mF)dA`a!bD?BD?hC;)`S%r+kIDg}VxklDopUc-U$i6X12)DIB;U{W}OnDeh7Bq3>tx%u;A@n|@iL`{zn+~py@UE7E50m0!Wx%!PK%R3c z1IKmY1uaGEqiXYY{(k0wv^pTI4M^()(#C+aIUpS#kd6#UmkdaE8<6fkAl+j?IyxX- zIv`y(Al-97x_m&o*MM~I0jPSyHEBoV_7Gr2&6T%w{5B6utDVDIhNU%dGZCf*HpJukLG%j z5Irq8^rETm&4Wr>howsifmHWYsQ}W*LqH{|Fl8T38I-M&(%>6~OrkA=xIjU_8g?AqTE@Y>Oooe0zT3U{JrrD_?$;|Or4kNDT|UjKZu;I_}*#qD!#7wvOxpnVJxc2%H#io!(uL`B$uK>HMhiT3Fu!ukc;rzq^p zv`@d&v`;kHK3Dx&+h;(qefk93#|XC1wO;!GkLGRjuh=%wFcti%Mtlm8*g0qFt@som zf+O(YUOV~bNI^ln@V|m#J+O*o7%R#@HJm?G^UsY%z7YSgqK_ANci7!ik z-K{u4DGbCN`N6&3EEGge0iZpn0^wy$6&DhVBvH^nUQnytsi2-bk2a8fi8;C1L~%nl zP)K`GA(7sMNwiZg9cRmBTQC<`YWF@=R3VYg_OoTPqbp=eJLR(TY`N^}0vWu5s$viP zDfWpgIk8H*>HuA~yxdjixW2g0ja2m>s`eCr)!A?#lR-sDyxj;GHB_NNv)Fr#yLDI{ zR^OvaAVG1_?gA1F4w0BfQW=`Agb$7-l*$I9bugbQ7?mT(0M9*RNM_2~#{f~O*@(-AyeSj2C?V=<`+Kv|&$sOXMSq`{uj zFkOBKh)qVcm0oBanl8a(O>>PwsSKVEi1w&LNjcq}jytm{ z9Wz|h9gmW%=*-@4!z!v9ID5>+#d^A178ooVYbRLQSgHP1UwBw*hYt2otWRYjlw-h)+dyogDDvd0(#>`!)$;X4X#@N2nz^#fsP zh?A^XiZ7tUcNFcA=Tl0nrL^YY*Id6^P3hGShC@T@#)jjgBQ;~g4B8y%=v^0tF%jI( zzFWn^Q!9H_-MDbT-1N6AD(t*c_mJ4){!WEm1;8*U#18jyEuPoy||`3roD>d0t^j_@C29WuDd>@_L&y@FH$!$3e3^n_2Q@hPHJaVO0l!$&}WX z;xrX!OtZyJV}`VabCBM9JfpPPJG#Y^gc$8*EG<)@fluqUZh67XkwY;uy?#bc9`)CCiQ zuS?=}VXqx0hR<++{Ch6hb2wC{s;H`UiD%=dQMrlX!`>$}D^h<#OMHxXoIl24I<2@- zrqig4VLfK4+_(t6(U^1cKl(`G&x*o$L^obUCK_H`1dY>-a)@zbE6PEJ+A__jgFEQL z9U{0ERg=S!zZTDuW;1hvWDDRo4}OoR$>Wl^Y?jTmLP(3csH(mGINDR_{6(_>wa=+^ z(OEsMJ)@Z_>L7g^i>qI(W^;Cnn$6p-D$d9~G@6R-8E6hclx82t%Ox|_%GzgDFaKG7 zH=c>zc(#hR2Iz_9{s@OQ?R}6I1bKuyODQSRO~-put!nL~DiU*JLZNKFynKS%%m_kQ!|f;%qt2R6UoIN@k8cvnE8IlBRpho5Qduv zc|?2{i0?f5*4->VL0C^I=spF?b>%T-!h@o)1msPg090A1`3(8twbxCcE`&6S)7eteArefeg5 z9*c6uOG+5uy=O3z)p@r zn@|q}#M5fvC35jt@H1-QVc;i;StqhrQIk{8Sil>79(9bQs4J9{&CFI?5M#s&YMSc= z+L;)LxKleNOg6ZQpI!slR|58cW`95v6IKG&L3GIgW&l<3=bO|hKs2NrajRU}1zg|TLY9RI^DX#Sn1FIw|1(6`6^yfM!XJ5SGmaLjU-Dz^ zG1meW2LLa=LFeESt5n>ZcJSUbJyJ=-^kc1_QwFURMH3=4Z$JdBqiM#NDe`Yc%muWd zbtlU5UPy=u3}?b};24b^m`}OAp=VY1E#s+Y5;1OYMU2bP+_sAPjyHgW@rf26A=#g3 ziBGloNXhS@-=*6pwM0RSXH~nPB^vbjUfpic(LQ(a z(qp;mYSK&-%Z$IOu%E{sw}RFgsADPgSW!h>#j{(~t0(Jcm6bQjFxM={*?a}g<|{Gb zD%CsiU5*pfYTv&C{cC*xO7y>=8jLHL7R>lxxZ0=jv61*8HU6erT`*ArX|1XV9aRhS z#k?>*bP|YM=dE+5`|F(V1Mw_W1t;S5g^CQ<wr{Yr?;fv6EF0f{m3kc zZjk+F65v$*nS^!&wgS(Hl)&1v?h_1kgi*6LDv>Ij!wR=kAte9VIcU3A)XYW|<9gEF ztyjp6i@2bSAv}9s3_AQww_v8*C{wcJqESZ4ZGV1_`i)^ z&1(}u6rb#7lFcU4nuvI*_K;dAJ*ZG9ieK@I7B!_s@S=7%ZkysJDRBc{gjNVWwH^dP z+rzf?q@V{6J&AhlA-XA2^-yhXC4WFcP!G;~GrQfiDF`|2%zN`@elxR~_hx5*y95d= zJ_t)YAbev!X*6~aebPzkF>9s!y3DM4xL0yNkp3M<=BVd~A(eCmdl|T-SAk0!67AYX z7#*Do6_M*IPMI7uXKO?hTvDqvyGR>FfQMK&%*g2(psHJjlMtW(BO3fleXIQ%4a(8j z%K#^W9di6p9Gh6eGZ~~4S%-qSHIWgKoI{fVh~(gkMZmA)y=*T3l5k2tl*_QY*7-yQ zqmxn`7*iI2fIS(wxWJYkTOoE8uYuo1n3x!RAF2+`sp)repe{aicE*Q4aIj9YxjrRB zt;}8SoK&&WDddeCY?~Ns`{cAH_VP*Xz|I0*XzSsR=`XmHt)rC|w8HLYDE9!$D58uu zuQII-8r~C)&9j-pH`;d4)A5W)Q8xntwF2P^`2BxEW$x8{pyl#1zrolDuZ5FA8&@%w zScL@A(YX>}q(duVeEEWN_&E@tmrC%SZUa#bMBzG->XoY6OsF&z*0?ajo3=>t#QrNJ z3w%oB_jq3jVtWAeJ0uuZmN>i@@eUTDjLCRHLJz^}3;~bZoK4AzugM&xK^mHc4T7k zjjWgw6BX%E%%YgZhn)k_gLN1x9)=2H&?6ugt%IS{BQA@f?SX^dIqvn2tK7t~GXDr3 z@4-i@L{iwc*|-Z6&2P5h)Ro!oPNNhL{ekSVqogi`Lod9~sVaW5 + * 参数的意思: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/nezha-fronted/static/ueditor-1.4.3.3/dialogs/wordimage/wordimage.html b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/wordimage/wordimage.html new file mode 100644 index 000000000..6cf606741 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/wordimage/wordimage.html @@ -0,0 +1,111 @@ + + + + + + + + + +
          +
          + +
          +
          +
          +
          +
          + +
          + : +
          +
          +
          + + + + + + \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/dialogs/wordimage/wordimage.js b/nezha-fronted/static/ueditor-1.4.3.3/dialogs/wordimage/wordimage.js new file mode 100644 index 000000000..98f3a2264 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/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_ueditor.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/nezha-fronted/static/ueditor-1.4.3.3/jsp/config.json b/nezha-fronted/static/ueditor-1.4.3.3/jsp/config.json new file mode 100644 index 000000000..53b6c9770 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/jsp/config.json @@ -0,0 +1,94 @@ +/* 前后端通信相关的配置,注释只允许使用多行方式 */ +{ + /* 上传图片配置项 */ + "imageActionName": "uploadimage", /* 执行上传图片的action名称 */ + "imageFieldName": "upfile", /* 提交的图片表单名称 */ + "imageMaxSize": 2048000, /* 上传大小限制,单位B */ + "imageAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 上传图片格式显示 */ + "imageCompressEnable": true, /* 是否压缩图片,默认是true */ + "imageCompressBorder": 1600, /* 图片压缩最长边限制 */ + "imageInsertAlign": "none", /* 插入的图片浮动方式 */ + "imageUrlPrefix": "", /* 图片访问路径前缀 */ + "imagePathFormat": "/ueditor/jsp/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + /* {filename} 会替换成原文件名,配置这项需要注意中文乱码问题 */ + /* {rand:6} 会替换成随机数,后面的数字是随机数的位数 */ + /* {time} 会替换成时间戳 */ + /* {yyyy} 会替换成四位年份 */ + /* {yy} 会替换成两位年份 */ + /* {mm} 会替换成两位月份 */ + /* {dd} 会替换成两位日期 */ + /* {hh} 会替换成两位小时 */ + /* {ii} 会替换成两位分钟 */ + /* {ss} 会替换成两位秒 */ + /* 非法字符 \ : * ? " < > | */ + /* 具请体看线上文档: fex.baidu.com/ueditor/#use-format_upload_filename */ + + /* 涂鸦图片上传配置项 */ + "scrawlActionName": "uploadscrawl", /* 执行上传涂鸦的action名称 */ + "scrawlFieldName": "upfile", /* 提交的图片表单名称 */ + "scrawlPathFormat": "/ueditor/jsp/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "scrawlMaxSize": 2048000, /* 上传大小限制,单位B */ + "scrawlUrlPrefix": "", /* 图片访问路径前缀 */ + "scrawlInsertAlign": "none", + + /* 截图工具上传 */ + "snapscreenActionName": "uploadimage", /* 执行上传截图的action名称 */ + "snapscreenPathFormat": "/ueditor/jsp/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "snapscreenUrlPrefix": "", /* 图片访问路径前缀 */ + "snapscreenInsertAlign": "none", /* 插入的图片浮动方式 */ + + /* 抓取远程图片配置 */ + "catcherLocalDomain": ["127.0.0.1", "localhost", "img.baidu.com"], + "catcherActionName": "catchimage", /* 执行抓取远程图片的action名称 */ + "catcherFieldName": "source", /* 提交的图片列表表单名称 */ + "catcherPathFormat": "/ueditor/jsp/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "catcherUrlPrefix": "", /* 图片访问路径前缀 */ + "catcherMaxSize": 2048000, /* 上传大小限制,单位B */ + "catcherAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 抓取图片格式显示 */ + + /* 上传视频配置 */ + "videoActionName": "uploadvideo", /* 执行上传视频的action名称 */ + "videoFieldName": "upfile", /* 提交的视频表单名称 */ + "videoPathFormat": "/ueditor/jsp/upload/video/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "videoUrlPrefix": "", /* 视频访问路径前缀 */ + "videoMaxSize": 102400000, /* 上传大小限制,单位B,默认100MB */ + "videoAllowFiles": [ + ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg", + ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid"], /* 上传视频格式显示 */ + + /* 上传文件配置 */ + "fileActionName": "uploadfile", /* controller里,执行上传视频的action名称 */ + "fileFieldName": "upfile", /* 提交的文件表单名称 */ + "filePathFormat": "/ueditor/jsp/upload/file/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "fileUrlPrefix": "", /* 文件访问路径前缀 */ + "fileMaxSize": 51200000, /* 上传大小限制,单位B,默认50MB */ + "fileAllowFiles": [ + ".png", ".jpg", ".jpeg", ".gif", ".bmp", + ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg", + ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid", + ".rar", ".zip", ".tar", ".gz", ".7z", ".bz2", ".cab", ".iso", + ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf", ".txt", ".md", ".xml" + ], /* 上传文件格式显示 */ + + /* 列出指定目录下的图片 */ + "imageManagerActionName": "listimage", /* 执行图片管理的action名称 */ + "imageManagerListPath": "/ueditor/jsp/upload/image/", /* 指定要列出图片的目录 */ + "imageManagerListSize": 20, /* 每次列出文件数量 */ + "imageManagerUrlPrefix": "", /* 图片访问路径前缀 */ + "imageManagerInsertAlign": "none", /* 插入的图片浮动方式 */ + "imageManagerAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 列出的文件类型 */ + + /* 列出指定目录下的文件 */ + "fileManagerActionName": "listfile", /* 执行文件管理的action名称 */ + "fileManagerListPath": "/ueditor/jsp/upload/file/", /* 指定要列出文件的目录 */ + "fileManagerUrlPrefix": "", /* 文件访问路径前缀 */ + "fileManagerListSize": 20, /* 每次列出文件数量 */ + "fileManagerAllowFiles": [ + ".png", ".jpg", ".jpeg", ".gif", ".bmp", + ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg", + ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid", + ".rar", ".zip", ".tar", ".gz", ".7z", ".bz2", ".cab", ".iso", + ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf", ".txt", ".md", ".xml" + ] /* 列出的文件类型 */ + +} \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/jsp/controller.jsp b/nezha-fronted/static/ueditor-1.4.3.3/jsp/controller.jsp new file mode 100644 index 000000000..6a3ef2f19 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/jsp/controller.jsp @@ -0,0 +1,14 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + import="com.baidu.ueditor.ActionEnter" + pageEncoding="UTF-8"%> +<%@ page trimDirectiveWhitespaces="true" %> +<% + + request.setCharacterEncoding( "utf-8" ); + response.setHeader("Content-Type" , "text/html"); + + String rootPath = application.getRealPath( "/" ); + + out.write( new ActionEnter( request, rootPath ).exec() ); + +%> \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/jsp/lib/commons-codec-1.9.jar b/nezha-fronted/static/ueditor-1.4.3.3/jsp/lib/commons-codec-1.9.jar new file mode 100644 index 0000000000000000000000000000000000000000..ef35f1c50d7c41278bc31f4b9fcfc8fbd708d55d GIT binary patch literal 263965 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
          D!WSd}>Pmv?<@ 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 literal 0 HcmV?d00001 diff --git a/nezha-fronted/static/ueditor-1.4.3.3/jsp/lib/commons-fileupload-1.3.1.jar b/nezha-fronted/static/ueditor-1.4.3.3/jsp/lib/commons-fileupload-1.3.1.jar new file mode 100644 index 0000000000000000000000000000000000000000..af0cda226fcab02b7ffdcd8fd9bf9c72dea63bf2 GIT binary patch literal 69002 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 literal 0 HcmV?d00001 diff --git a/nezha-fronted/static/ueditor-1.4.3.3/jsp/lib/commons-io-2.4.jar b/nezha-fronted/static/ueditor-1.4.3.3/jsp/lib/commons-io-2.4.jar new file mode 100644 index 0000000000000000000000000000000000000000..90035a4fe068e65d42edf621a0ffc78b4b020cdc GIT binary patch literal 185140 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�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

          ={!!P~zd?>j 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

          *W!7($pTaZ9 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

          Zbbe=&Js&#rw*)2%kMAMMPdt(Q^5 z^`QA(rop&Wn#~MtiTvBFzE4X+uxMWt$A@{P%^QGd6 z4)Me~n=bxkajjhE(K;fWYJY=LK-g3^uGM%)zh$}{nV76kcJ3L9y82d{0^5B$H1DqA zslde8Dg6j@FjX0eUQQaqx1g}PF5%{6{Gm%G|0e9!aj7LJ^}`xPf9S*>0b^%;o{+gPXhXH>`Joa!)m z=g%~%+1%2#d;5aVULp^6U0J%tq5B3>k;+T}LU(}|I5EmDl2Z6mgnRZYnh{kLX-@0? z@qM{g=^rOg#l+W`mAzl#PIC7;r0CV7)$sV$i_25Kn@*4)v%JaCsDwMams%r*1+s8T zu?p`{hDN+XEi8@hL*=Pn;ghs=EQpHL+Xz$}w(G>=wn4YqI1!uTMDBCbV7Js+tOHJ* zAg2@0KND{WOLWH$&G+p(l2;p`=n%UXNV?U3T8}DR534xv(;@G0B+l5Qy#}#Mgsc~@ zS%E02fFK=GXp({(AIC!u@1&wO&ZtRCFChY$5Ni|erlTKcKOk+>^CSMcZ`!7-myF;k zdy%|s8rw-IKbldmznS0ILb-!D*iGx764W9Xp z20h`<6SyL6#V@8)@%ieC!6dUzgWXe?L$W(tq{@OaCb36^_0_xc> z;Qe1a54eAB9f^7vn>x5y+S~nm55hL?s~nIVDD>yp*fzFs00_LfRs?RL)-L*>Y_3v4 zk`(;ZD_P}azKQOWzz>a&XmPFE?>s05O^k&;)a~C*e)sR;QLLPEgGaT`>zdt{bLJ)&8 zq6;c4UW+Jwyk{XI;TD=C3G~n*_1!HG+*_oa`~?aOq*TRY9Q*;JI5k4@{R6eFP&Iz0 zB#!1JrvroVXIm;-`2;`l&=OE6!)`2>HqyQr$Lz?qM;+1N`osKsk5LEXKVTL*vt%LJ_&yY`=n~LbJ;k{DsJc;0 z^jE(WPfpqwKXJ7N*piufe#1(N6AxgXFj0PS!U8l@ULilZaB`dQ4r~cExrMD-@4b$e z*e;5ip)$_Q&CiB_e=*1>vNq9}psa|mU$;6(r;e`p0!(wqU1ZHG)+ex+^$GUciL0&K zaUEJFX+W#Zoj&Tn#>P}2RT~WI204a?q6)7tR?p1*nsNVxpxIL3Ueopexz_|#8UV3( zGN-q4wzs2KaI$wWb#n3i4-=HiS2+|#R9#3a;faqeFcgvbpKS9`(Q57x?gEQ)MHRL} zz1|0%%P?nQKcV^elB3AV#H3^9_+0Y8K%>xqgQGwB4*O-fUcotJ~X?J!_dbO&wg*P4;WK#WC9PR$}vwl5i5pdnu9GFb6PD zj!Hv?kJyVkBS>)27G|W%R2|xz9NA^uBQ9`ztpet4)8yt!Bx(47p$rX^N-IgO(7^bM zUMM+B4oU|K2Eh@EVK6S5r|~INQ%S8%$wtL$$;`&k1#gy#4uEA9wTdGiv`p=2y9-Vb zI%cft19{2b8!>BaA%L<_qCv;>!KGJ}KhwY$b%U8JYvjt+7BdgHfrV z+VnkHycUOyEd5d1A%|G%iw>Cda|bc!)&fFdi?w_l@G+n)<80`6 zkp%&a-3|c?kX}w;6$_MRjvkUij*BPFoiq&qd%leOnS_sMM%a1`kDH*V+|icWK$)$n_$bPJ)AM&&#i9n z(qPhXQ=IoT9G@nT__Lzj(F7&8$Efi>_QG!@fIg|V+0LUaO=j>pTDTHWJ_B&NCK{dJ z;==44gnU`PD9IS)3mbQTEI=TrK1NK9R^`}1S83T4SA=s4YU(Iov67vlyRM@(z~Cr0 zu-fqvwl~qgtzg-u8B*J8CSCZ@7Qa5X_QNbMQ+`m}xPslKB|nQG@Da;8(YLfI5&nw} zmJ2XQu~-R~PEE3~nkD;6Th$xxa**Rh{?GyUquQxB#r|OUImfTO*y^R#=a5Tv25Kw( z$OQ@p?IXnc=SSy!)l0k!zhJ!Ar=nW|a^it{K=`v#4y`clwn0X@OF z?)*Ai=tsVfei1OpCo~aSEc0i%Hp7B$8wL z-b<=1fm*JdbX@wS#t}+Hb3wx&@8GsdP7wm^BT?X$B9fo~C2C4rB6XV$e6_XzrTy^k zJt_z)2ow|)2$D^qNWK62i(i$uUtD{rAVB8%f0(SOiXg3|oEW{Vpq!+bsIm&3tk~Q5 zuK@8kiZd`ofO4a6p8^>iae+&7Z|(#g81dhe^sddgjiAQ z@n-~nRFJ@%`Bl^U+lqjz(7zz0Ep7j27k<}}#r%6P@Cu#$xADJR5Oi`f{LixGPcMEK zRr)1s@waJl{ekk2_P;-Iei#1uCBgK!#ftxi^S2<=p8&rrZ~Sv^nPqB#Syz^@GNZ#ymeZTv4s{>by4uQc*$7fwDXF IHNSrPe|J|32LJ#7 literal 0 HcmV?d00001 diff --git a/nezha-fronted/static/ueditor-1.4.3.3/jsp/lib/ueditor-1.1.2.jar b/nezha-fronted/static/ueditor-1.4.3.3/jsp/lib/ueditor-1.1.2.jar new file mode 100644 index 0000000000000000000000000000000000000000..4819fe011f588977914d7e4b0794dc7609d9bc16 GIT binary patch literal 30725 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 OY literal 0 HcmV?d00001 diff --git a/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/ActionEnter.java b/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/ActionEnter.java new file mode 100644 index 000000000..33a3dc7b5 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/ActionEnter.java @@ -0,0 +1,127 @@ +package com.baidu.ueditor; + +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import com.baidu.ueditor.define.ActionMap; +import com.baidu.ueditor.define.AppInfo; +import com.baidu.ueditor.define.BaseState; +import com.baidu.ueditor.define.State; +import com.baidu.ueditor.hunter.FileManager; +import com.baidu.ueditor.hunter.ImageHunter; +import com.baidu.ueditor.upload.Uploader; + +public class ActionEnter { + + private HttpServletRequest request = null; + + private String rootPath = null; + private String contextPath = null; + + private String actionType = null; + + private ConfigManager configManager = null; + + public ActionEnter ( HttpServletRequest request, String rootPath ) { + + this.request = request; + this.rootPath = rootPath; + this.actionType = request.getParameter( "action" ); + this.contextPath = request.getContextPath(); + this.configManager = ConfigManager.getInstance( this.rootPath, this.contextPath, request.getRequestURI() ); + + } + + public String exec () { + + String callbackName = this.request.getParameter("callback"); + + if ( callbackName != null ) { + + if ( !validCallbackName( callbackName ) ) { + return new BaseState( false, AppInfo.ILLEGAL ).toJSONString(); + } + + return callbackName+"("+this.invoke()+");"; + + } else { + return this.invoke(); + } + + } + + public String invoke() { + + if ( actionType == null || !ActionMap.mapping.containsKey( actionType ) ) { + return new BaseState( false, AppInfo.INVALID_ACTION ).toJSONString(); + } + + if ( this.configManager == null || !this.configManager.valid() ) { + return new BaseState( false, AppInfo.CONFIG_ERROR ).toJSONString(); + } + + State state = null; + + int actionCode = ActionMap.getType( this.actionType ); + + Map conf = null; + + switch ( actionCode ) { + + case ActionMap.CONFIG: + return this.configManager.getAllConfig().toString(); + + case ActionMap.UPLOAD_IMAGE: + case ActionMap.UPLOAD_SCRAWL: + case ActionMap.UPLOAD_VIDEO: + case ActionMap.UPLOAD_FILE: + conf = this.configManager.getConfig( actionCode ); + state = new Uploader( request, conf ).doExec(); + break; + + case ActionMap.CATCH_IMAGE: + conf = configManager.getConfig( actionCode ); + String[] list = this.request.getParameterValues( (String)conf.get( "fieldName" ) ); + state = new ImageHunter( conf ).capture( list ); + break; + + case ActionMap.LIST_IMAGE: + case ActionMap.LIST_FILE: + conf = configManager.getConfig( actionCode ); + int start = this.getStartIndex(); + state = new FileManager( conf ).listFile( start ); + break; + + } + + return state.toJSONString(); + + } + + public int getStartIndex () { + + String start = this.request.getParameter( "start" ); + + try { + return Integer.parseInt( start ); + } catch ( Exception e ) { + return 0; + } + + } + + /** + * callback参数验证 + */ + public boolean validCallbackName ( String name ) { + + if ( name.matches( "^[a-zA-Z_]+[\\w0-9_]*$" ) ) { + return true; + } + + return false; + + } + +} \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/ConfigManager.java b/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/ConfigManager.java new file mode 100644 index 000000000..5551ee909 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/ConfigManager.java @@ -0,0 +1,222 @@ +package com.baidu.ueditor; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.UnsupportedEncodingException; +import java.util.HashMap; +import java.util.Map; + +import org.json.JSONArray; +import org.json.JSONObject; + +import com.baidu.ueditor.define.ActionMap; + +/** + * 配置管理器 + * @author hancong03@baidu.com + * + */ +public final class ConfigManager { + + private final String rootPath; + private final String originalPath; + private final String contextPath; + private static final String configFileName = "config.json"; + private String parentPath = null; + private JSONObject jsonConfig = null; + // 涂鸦上传filename定义 + private final static String SCRAWL_FILE_NAME = "scrawl"; + // 远程图片抓取filename定义 + private final static String REMOTE_FILE_NAME = "remote"; + + /* + * 通过一个给定的路径构建一个配置管理器, 该管理器要求地址路径所在目录下必须存在config.properties文件 + */ + private ConfigManager ( String rootPath, String contextPath, String uri ) throws FileNotFoundException, IOException { + + rootPath = rootPath.replace( "\\", "/" ); + + this.rootPath = rootPath; + this.contextPath = contextPath; + + if ( contextPath.length() > 0 ) { + this.originalPath = this.rootPath + uri.substring( contextPath.length() ); + } else { + this.originalPath = this.rootPath + uri; + } + + this.initEnv(); + + } + + /** + * 配置管理器构造工厂 + * @param rootPath 服务器根路径 + * @param contextPath 服务器所在项目路径 + * @param uri 当前访问的uri + * @return 配置管理器实例或者null + */ + public static ConfigManager getInstance ( String rootPath, String contextPath, String uri ) { + + try { + return new ConfigManager(rootPath, contextPath, uri); + } catch ( Exception e ) { + return null; + } + + } + + // 验证配置文件加载是否正确 + public boolean valid () { + return this.jsonConfig != null; + } + + public JSONObject getAllConfig () { + + return this.jsonConfig; + + } + + public Map getConfig ( int type ) { + + Map conf = new HashMap(); + String savePath = null; + + switch ( type ) { + + case ActionMap.UPLOAD_FILE: + conf.put( "isBase64", "false" ); + conf.put( "maxSize", this.jsonConfig.getLong( "fileMaxSize" ) ); + conf.put( "allowFiles", this.getArray( "fileAllowFiles" ) ); + conf.put( "fieldName", this.jsonConfig.getString( "fileFieldName" ) ); + savePath = this.jsonConfig.getString( "filePathFormat" ); + break; + + case ActionMap.UPLOAD_IMAGE: + conf.put( "isBase64", "false" ); + conf.put( "maxSize", this.jsonConfig.getLong( "imageMaxSize" ) ); + conf.put( "allowFiles", this.getArray( "imageAllowFiles" ) ); + conf.put( "fieldName", this.jsonConfig.getString( "imageFieldName" ) ); + savePath = this.jsonConfig.getString( "imagePathFormat" ); + break; + + case ActionMap.UPLOAD_VIDEO: + conf.put( "maxSize", this.jsonConfig.getLong( "videoMaxSize" ) ); + conf.put( "allowFiles", this.getArray( "videoAllowFiles" ) ); + conf.put( "fieldName", this.jsonConfig.getString( "videoFieldName" ) ); + savePath = this.jsonConfig.getString( "videoPathFormat" ); + break; + + case ActionMap.UPLOAD_SCRAWL: + conf.put( "filename", ConfigManager.SCRAWL_FILE_NAME ); + conf.put( "maxSize", this.jsonConfig.getLong( "scrawlMaxSize" ) ); + conf.put( "fieldName", this.jsonConfig.getString( "scrawlFieldName" ) ); + conf.put( "isBase64", "true" ); + savePath = this.jsonConfig.getString( "scrawlPathFormat" ); + break; + + case ActionMap.CATCH_IMAGE: + conf.put( "filename", ConfigManager.REMOTE_FILE_NAME ); + conf.put( "filter", this.getArray( "catcherLocalDomain" ) ); + conf.put( "maxSize", this.jsonConfig.getLong( "catcherMaxSize" ) ); + conf.put( "allowFiles", this.getArray( "catcherAllowFiles" ) ); + conf.put( "fieldName", this.jsonConfig.getString( "catcherFieldName" ) + "[]" ); + savePath = this.jsonConfig.getString( "catcherPathFormat" ); + break; + + case ActionMap.LIST_IMAGE: + conf.put( "allowFiles", this.getArray( "imageManagerAllowFiles" ) ); + conf.put( "dir", this.jsonConfig.getString( "imageManagerListPath" ) ); + conf.put( "count", this.jsonConfig.getInt( "imageManagerListSize" ) ); + break; + + case ActionMap.LIST_FILE: + conf.put( "allowFiles", this.getArray( "fileManagerAllowFiles" ) ); + conf.put( "dir", this.jsonConfig.getString( "fileManagerListPath" ) ); + conf.put( "count", this.jsonConfig.getInt( "fileManagerListSize" ) ); + break; + + } + + conf.put( "savePath", savePath ); + conf.put( "rootPath", this.rootPath ); + + return conf; + + } + + private void initEnv () throws FileNotFoundException, IOException { + + File file = new File( this.originalPath ); + + if ( !file.isAbsolute() ) { + file = new File( file.getAbsolutePath() ); + } + + this.parentPath = file.getParent(); + + String configContent = this.readFile( this.getConfigPath() ); + + try{ + JSONObject jsonConfig = new JSONObject( configContent ); + this.jsonConfig = jsonConfig; + } catch ( Exception e ) { + this.jsonConfig = null; + } + + } + + private String getConfigPath () { + return this.parentPath + File.separator + ConfigManager.configFileName; + } + + private String[] getArray ( String key ) { + + JSONArray jsonArray = this.jsonConfig.getJSONArray( key ); + String[] result = new String[ jsonArray.length() ]; + + for ( int i = 0, len = jsonArray.length(); i < len; i++ ) { + result[i] = jsonArray.getString( i ); + } + + return result; + + } + + private String readFile ( String path ) throws IOException { + + StringBuilder builder = new StringBuilder(); + + try { + + InputStreamReader reader = new InputStreamReader( new FileInputStream( path ), "UTF-8" ); + BufferedReader bfReader = new BufferedReader( reader ); + + String tmpContent = null; + + while ( ( tmpContent = bfReader.readLine() ) != null ) { + builder.append( tmpContent ); + } + + bfReader.close(); + + } catch ( UnsupportedEncodingException e ) { + // 忽略 + } + + return this.filter( builder.toString() ); + + } + + // 过滤输入字符串, 剔除多行注释以及替换掉反斜杠 + private String filter ( String input ) { + + return input.replaceAll( "/\\*[\\s\\S]*?\\*/", "" ); + + } + +} diff --git a/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/Encoder.java b/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/Encoder.java new file mode 100644 index 000000000..00bce19b3 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/Encoder.java @@ -0,0 +1,24 @@ +package com.baidu.ueditor; + +public class Encoder { + + public static String toUnicode ( String input ) { + + StringBuilder builder = new StringBuilder(); + char[] chars = input.toCharArray(); + + for ( char ch : chars ) { + + if ( ch < 256 ) { + builder.append( ch ); + } else { + builder.append( "\\u" + Integer.toHexString( ch& 0xffff ) ); + } + + } + + return builder.toString(); + + } + +} \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/PathFormat.java b/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/PathFormat.java new file mode 100644 index 000000000..080ea48fa --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/PathFormat.java @@ -0,0 +1,157 @@ +package com.baidu.ueditor; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class PathFormat { + + private static final String TIME = "time"; + private static final String FULL_YEAR = "yyyy"; + private static final String YEAR = "yy"; + private static final String MONTH = "mm"; + private static final String DAY = "dd"; + private static final String HOUR = "hh"; + private static final String MINUTE = "ii"; + private static final String SECOND = "ss"; + private static final String RAND = "rand"; + + private static Date currentDate = null; + + public static String parse ( String input ) { + + Pattern pattern = Pattern.compile( "\\{([^\\}]+)\\}", Pattern.CASE_INSENSITIVE ); + Matcher matcher = pattern.matcher(input); + + PathFormat.currentDate = new Date(); + + StringBuffer sb = new StringBuffer(); + + while ( matcher.find() ) { + + matcher.appendReplacement(sb, PathFormat.getString( matcher.group( 1 ) ) ); + + } + + matcher.appendTail(sb); + + return sb.toString(); + } + + /** + * 格式化路径, 把windows路径替换成标准路径 + * @param input 待格式化的路径 + * @return 格式化后的路径 + */ + public static String format ( String input ) { + + return input.replace( "\\", "/" ); + + } + + public static String parse ( String input, String filename ) { + + Pattern pattern = Pattern.compile( "\\{([^\\}]+)\\}", Pattern.CASE_INSENSITIVE ); + Matcher matcher = pattern.matcher(input); + String matchStr = null; + + PathFormat.currentDate = new Date(); + + StringBuffer sb = new StringBuffer(); + + while ( matcher.find() ) { + + matchStr = matcher.group( 1 ); + if ( matchStr.indexOf( "filename" ) != -1 ) { + filename = filename.replace( "$", "\\$" ).replaceAll( "[\\/:*?\"<>|]", "" ); + matcher.appendReplacement(sb, filename ); + } else { + matcher.appendReplacement(sb, PathFormat.getString( matchStr ) ); + } + + } + + matcher.appendTail(sb); + + return sb.toString(); + } + + private static String getString ( String pattern ) { + + pattern = pattern.toLowerCase(); + + // time 处理 + if ( pattern.indexOf( PathFormat.TIME ) != -1 ) { + return PathFormat.getTimestamp(); + } else if ( pattern.indexOf( PathFormat.FULL_YEAR ) != -1 ) { + return PathFormat.getFullYear(); + } else if ( pattern.indexOf( PathFormat.YEAR ) != -1 ) { + return PathFormat.getYear(); + } else if ( pattern.indexOf( PathFormat.MONTH ) != -1 ) { + return PathFormat.getMonth(); + } else if ( pattern.indexOf( PathFormat.DAY ) != -1 ) { + return PathFormat.getDay(); + } else if ( pattern.indexOf( PathFormat.HOUR ) != -1 ) { + return PathFormat.getHour(); + } else if ( pattern.indexOf( PathFormat.MINUTE ) != -1 ) { + return PathFormat.getMinute(); + } else if ( pattern.indexOf( PathFormat.SECOND ) != -1 ) { + return PathFormat.getSecond(); + } else if ( pattern.indexOf( PathFormat.RAND ) != -1 ) { + return PathFormat.getRandom( pattern ); + } + + return pattern; + + } + + private static String getTimestamp () { + return System.currentTimeMillis() + ""; + } + + private static String getFullYear () { + return new SimpleDateFormat( "yyyy" ).format( PathFormat.currentDate ); + } + + private static String getYear () { + return new SimpleDateFormat( "yy" ).format( PathFormat.currentDate ); + } + + private static String getMonth () { + return new SimpleDateFormat( "MM" ).format( PathFormat.currentDate ); + } + + private static String getDay () { + return new SimpleDateFormat( "dd" ).format( PathFormat.currentDate ); + } + + private static String getHour () { + return new SimpleDateFormat( "HH" ).format( PathFormat.currentDate ); + } + + private static String getMinute () { + return new SimpleDateFormat( "mm" ).format( PathFormat.currentDate ); + } + + private static String getSecond () { + return new SimpleDateFormat( "ss" ).format( PathFormat.currentDate ); + } + + private static String getRandom ( String pattern ) { + + int length = 0; + pattern = pattern.split( ":" )[ 1 ].trim(); + + length = Integer.parseInt( pattern ); + + return ( Math.random() + "" ).replace( ".", "" ).substring( 0, length ); + + } + + public static void main(String[] args) { + // TODO Auto-generated method stub + + } + +} diff --git a/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/define/ActionMap.java b/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/define/ActionMap.java new file mode 100644 index 000000000..88f4f3248 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/define/ActionMap.java @@ -0,0 +1,42 @@ +package com.baidu.ueditor.define; + +import java.util.Map; +import java.util.HashMap; + +/** + * 定义请求action类型 + * @author hancong03@baidu.com + * + */ +@SuppressWarnings("serial") +public final class ActionMap { + + public static final Map mapping; + // 获取配置请求 + public static final int CONFIG = 0; + public static final int UPLOAD_IMAGE = 1; + public static final int UPLOAD_SCRAWL = 2; + public static final int UPLOAD_VIDEO = 3; + public static final int UPLOAD_FILE = 4; + public static final int CATCH_IMAGE = 5; + public static final int LIST_FILE = 6; + public static final int LIST_IMAGE = 7; + + static { + mapping = new HashMap(){{ + put( "config", ActionMap.CONFIG ); + put( "uploadimage", ActionMap.UPLOAD_IMAGE ); + put( "uploadscrawl", ActionMap.UPLOAD_SCRAWL ); + put( "uploadvideo", ActionMap.UPLOAD_VIDEO ); + put( "uploadfile", ActionMap.UPLOAD_FILE ); + put( "catchimage", ActionMap.CATCH_IMAGE ); + put( "listfile", ActionMap.LIST_FILE ); + put( "listimage", ActionMap.LIST_IMAGE ); + }}; + } + + public static int getType ( String key ) { + return ActionMap.mapping.get( key ); + } + +} diff --git a/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/define/ActionState.java b/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/define/ActionState.java new file mode 100644 index 000000000..b0fad34fd --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/define/ActionState.java @@ -0,0 +1,5 @@ +package com.baidu.ueditor.define; + +public enum ActionState { + UNKNOW_ERROR +} diff --git a/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/define/AppInfo.java b/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/define/AppInfo.java new file mode 100644 index 000000000..b869f2aad --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/define/AppInfo.java @@ -0,0 +1,77 @@ +package com.baidu.ueditor.define; + +import java.util.HashMap; +import java.util.Map; + +public final class AppInfo { + + public static final int SUCCESS = 0; + public static final int MAX_SIZE = 1; + public static final int PERMISSION_DENIED = 2; + public static final int FAILED_CREATE_FILE = 3; + public static final int IO_ERROR = 4; + public static final int NOT_MULTIPART_CONTENT = 5; + public static final int PARSE_REQUEST_ERROR = 6; + public static final int NOTFOUND_UPLOAD_DATA = 7; + public static final int NOT_ALLOW_FILE_TYPE = 8; + + public static final int INVALID_ACTION = 101; + public static final int CONFIG_ERROR = 102; + + public static final int PREVENT_HOST = 201; + public static final int CONNECTION_ERROR = 202; + public static final int REMOTE_FAIL = 203; + + public static final int NOT_DIRECTORY = 301; + public static final int NOT_EXIST = 302; + + public static final int ILLEGAL = 401; + + public static Map info = new HashMap(){{ + + put( AppInfo.SUCCESS, "SUCCESS" ); + + // 无效的Action + put( AppInfo.INVALID_ACTION, "\u65E0\u6548\u7684Action" ); + // 配置文件初始化失败 + put( AppInfo.CONFIG_ERROR, "\u914D\u7F6E\u6587\u4EF6\u521D\u59CB\u5316\u5931\u8D25" ); + // 抓取远程图片失败 + put( AppInfo.REMOTE_FAIL, "\u6293\u53D6\u8FDC\u7A0B\u56FE\u7247\u5931\u8D25" ); + + // 被阻止的远程主机 + put( AppInfo.PREVENT_HOST, "\u88AB\u963B\u6B62\u7684\u8FDC\u7A0B\u4E3B\u673A" ); + // 远程连接出错 + put( AppInfo.CONNECTION_ERROR, "\u8FDC\u7A0B\u8FDE\u63A5\u51FA\u9519" ); + + // "文件大小超出限制" + put( AppInfo.MAX_SIZE, "\u6587\u4ef6\u5927\u5c0f\u8d85\u51fa\u9650\u5236" ); + // 权限不足, 多指写权限 + put( AppInfo.PERMISSION_DENIED, "\u6743\u9650\u4E0D\u8DB3" ); + // 创建文件失败 + put( AppInfo.FAILED_CREATE_FILE, "\u521B\u5EFA\u6587\u4EF6\u5931\u8D25" ); + // IO错误 + put( AppInfo.IO_ERROR, "IO\u9519\u8BEF" ); + // 上传表单不是multipart/form-data类型 + put( AppInfo.NOT_MULTIPART_CONTENT, "\u4E0A\u4F20\u8868\u5355\u4E0D\u662Fmultipart/form-data\u7C7B\u578B" ); + // 解析上传表单错误 + put( AppInfo.PARSE_REQUEST_ERROR, "\u89E3\u6790\u4E0A\u4F20\u8868\u5355\u9519\u8BEF" ); + // 未找到上传数据 + put( AppInfo.NOTFOUND_UPLOAD_DATA, "\u672A\u627E\u5230\u4E0A\u4F20\u6570\u636E" ); + // 不允许的文件类型 + put( AppInfo.NOT_ALLOW_FILE_TYPE, "\u4E0D\u5141\u8BB8\u7684\u6587\u4EF6\u7C7B\u578B" ); + + // 指定路径不是目录 + put( AppInfo.NOT_DIRECTORY, "\u6307\u5B9A\u8DEF\u5F84\u4E0D\u662F\u76EE\u5F55" ); + // 指定路径并不存在 + put( AppInfo.NOT_EXIST, "\u6307\u5B9A\u8DEF\u5F84\u5E76\u4E0D\u5B58\u5728" ); + + // callback参数名不合法 + put( AppInfo.ILLEGAL, "Callback\u53C2\u6570\u540D\u4E0D\u5408\u6CD5" ); + + }}; + + public static String getStateInfo ( int key ) { + return AppInfo.info.get( key ); + } + +} diff --git a/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/define/BaseState.java b/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/define/BaseState.java new file mode 100644 index 000000000..dcc881b12 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/define/BaseState.java @@ -0,0 +1,90 @@ +package com.baidu.ueditor.define; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import com.baidu.ueditor.Encoder; + +public class BaseState implements State { + + private boolean state = false; + private String info = null; + + private Map infoMap = new HashMap(); + + public BaseState () { + this.state = true; + } + + public BaseState ( boolean state ) { + this.setState( state ); + } + + public BaseState ( boolean state, String info ) { + this.setState( state ); + this.info = info; + } + + public BaseState ( boolean state, int infoCode ) { + this.setState( state ); + this.info = AppInfo.getStateInfo( infoCode ); + } + + public boolean isSuccess () { + return this.state; + } + + public void setState ( boolean state ) { + this.state = state; + } + + public void setInfo ( String info ) { + this.info = info; + } + + public void setInfo ( int infoCode ) { + this.info = AppInfo.getStateInfo( infoCode ); + } + + @Override + public String toJSONString() { + return this.toString(); + } + + public String toString () { + + String key = null; + String stateVal = this.isSuccess() ? AppInfo.getStateInfo( AppInfo.SUCCESS ) : this.info; + + StringBuilder builder = new StringBuilder(); + + builder.append( "{\"state\": \"" + stateVal + "\"" ); + + Iterator iterator = this.infoMap.keySet().iterator(); + + while ( iterator.hasNext() ) { + + key = iterator.next(); + + builder.append( ",\"" + key + "\": \"" + this.infoMap.get(key) + "\"" ); + + } + + builder.append( "}" ); + + return Encoder.toUnicode( builder.toString() ); + + } + + @Override + public void putInfo(String name, String val) { + this.infoMap.put(name, val); + } + + @Override + public void putInfo(String name, long val) { + this.putInfo(name, val+""); + } + +} diff --git a/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/define/FileType.java b/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/define/FileType.java new file mode 100644 index 000000000..9195b85b3 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/define/FileType.java @@ -0,0 +1,31 @@ +package com.baidu.ueditor.define; + +import java.util.HashMap; +import java.util.Map; + +public class FileType { + + public static final String JPG = "JPG"; + + private static final Map types = new HashMap(){{ + + put( FileType.JPG, ".jpg" ); + + }}; + + public static String getSuffix ( String key ) { + return FileType.types.get( key ); + } + + /** + * 根据给定的文件名,获取其后缀信息 + * @param filename + * @return + */ + public static String getSuffixByFilename ( String filename ) { + + return filename.substring( filename.lastIndexOf( "." ) ).toLowerCase(); + + } + +} diff --git a/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/define/MIMEType.java b/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/define/MIMEType.java new file mode 100644 index 000000000..77c6cddf1 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/define/MIMEType.java @@ -0,0 +1,20 @@ +package com.baidu.ueditor.define; + +import java.util.HashMap; +import java.util.Map; + +public class MIMEType { + + public static final Map types = new HashMap(){{ + put( "image/gif", ".gif" ); + put( "image/jpeg", ".jpg" ); + put( "image/jpg", ".jpg" ); + put( "image/png", ".png" ); + put( "image/bmp", ".bmp" ); + }}; + + public static String getSuffix ( String mime ) { + return MIMEType.types.get( mime ); + } + +} diff --git a/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/define/MultiState.java b/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/define/MultiState.java new file mode 100644 index 000000000..26caefb71 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/define/MultiState.java @@ -0,0 +1,112 @@ +package com.baidu.ueditor.define; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import com.baidu.ueditor.Encoder; + +/** + * 多状态集合状态 + * 其包含了多个状态的集合, 其本身自己也是一个状态 + * @author hancong03@baidu.com + * + */ +public class MultiState implements State { + + private boolean state = false; + private String info = null; + private Map intMap = new HashMap(); + private Map infoMap = new HashMap(); + private List stateList = new ArrayList(); + + public MultiState ( boolean state ) { + this.state = state; + } + + public MultiState ( boolean state, String info ) { + this.state = state; + this.info = info; + } + + public MultiState ( boolean state, int infoKey ) { + this.state = state; + this.info = AppInfo.getStateInfo( infoKey ); + } + + @Override + public boolean isSuccess() { + return this.state; + } + + public void addState ( State state ) { + stateList.add( state.toJSONString() ); + } + + /** + * 该方法调用无效果 + */ + @Override + public void putInfo(String name, String val) { + this.infoMap.put(name, val); + } + + @Override + public String toJSONString() { + + String stateVal = this.isSuccess() ? AppInfo.getStateInfo( AppInfo.SUCCESS ) : this.info; + + StringBuilder builder = new StringBuilder(); + + builder.append( "{\"state\": \"" + stateVal + "\"" ); + + // 数字转换 + Iterator iterator = this.intMap.keySet().iterator(); + + while ( iterator.hasNext() ) { + + stateVal = iterator.next(); + + builder.append( ",\""+ stateVal +"\": " + this.intMap.get( stateVal ) ); + + } + + iterator = this.infoMap.keySet().iterator(); + + while ( iterator.hasNext() ) { + + stateVal = iterator.next(); + + builder.append( ",\""+ stateVal +"\": \"" + this.infoMap.get( stateVal ) + "\"" ); + + } + + builder.append( ", list: [" ); + + + iterator = this.stateList.iterator(); + + while ( iterator.hasNext() ) { + + builder.append( iterator.next() + "," ); + + } + + if ( this.stateList.size() > 0 ) { + builder.deleteCharAt( builder.length() - 1 ); + } + + builder.append( " ]}" ); + + return Encoder.toUnicode( builder.toString() ); + + } + + @Override + public void putInfo(String name, long val) { + this.intMap.put( name, val ); + } + +} diff --git a/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/define/State.java b/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/define/State.java new file mode 100644 index 000000000..8f2227490 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/define/State.java @@ -0,0 +1,18 @@ +package com.baidu.ueditor.define; + +/** + * 处理状态接口 + * @author hancong03@baidu.com + * + */ +public interface State { + + public boolean isSuccess (); + + public void putInfo( String name, String val ); + + public void putInfo ( String name, long val ); + + public String toJSONString (); + +} diff --git a/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/hunter/FileManager.java b/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/hunter/FileManager.java new file mode 100644 index 000000000..5a8c1a053 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/hunter/FileManager.java @@ -0,0 +1,112 @@ +package com.baidu.ueditor.hunter; + +import java.io.File; +import java.util.Arrays; +import java.util.Collection; +import java.util.Map; + +import org.apache.commons.io.FileUtils; + +import com.baidu.ueditor.PathFormat; +import com.baidu.ueditor.define.AppInfo; +import com.baidu.ueditor.define.BaseState; +import com.baidu.ueditor.define.MultiState; +import com.baidu.ueditor.define.State; + +public class FileManager { + + private String dir = null; + private String rootPath = null; + private String[] allowFiles = null; + private int count = 0; + + public FileManager ( Map conf ) { + + this.rootPath = (String)conf.get( "rootPath" ); + this.dir = this.rootPath + (String)conf.get( "dir" ); + this.allowFiles = this.getAllowFiles( conf.get("allowFiles") ); + this.count = (Integer)conf.get( "count" ); + + } + + public State listFile ( int index ) { + + File dir = new File( this.dir ); + State state = null; + + if ( !dir.exists() ) { + return new BaseState( false, AppInfo.NOT_EXIST ); + } + + if ( !dir.isDirectory() ) { + return new BaseState( false, AppInfo.NOT_DIRECTORY ); + } + + Collection list = FileUtils.listFiles( dir, this.allowFiles, true ); + + if ( index < 0 || index > list.size() ) { + state = new MultiState( true ); + } else { + Object[] fileList = Arrays.copyOfRange( list.toArray(), index, index + this.count ); + state = this.getState( fileList ); + } + + state.putInfo( "start", index ); + state.putInfo( "total", list.size() ); + + return state; + + } + + private State getState ( Object[] files ) { + + MultiState state = new MultiState( true ); + BaseState fileState = null; + + File file = null; + + for ( Object obj : files ) { + if ( obj == null ) { + break; + } + file = (File)obj; + fileState = new BaseState( true ); + fileState.putInfo( "url", PathFormat.format( this.getPath( file ) ) ); + state.addState( fileState ); + } + + return state; + + } + + private String getPath ( File file ) { + + String path = file.getAbsolutePath(); + + return path.replace( this.rootPath, "/" ); + + } + + private String[] getAllowFiles ( Object fileExt ) { + + String[] exts = null; + String ext = null; + + if ( fileExt == null ) { + return new String[ 0 ]; + } + + exts = (String[])fileExt; + + for ( int i = 0, len = exts.length; i < len; i++ ) { + + ext = exts[ i ]; + exts[ i ] = ext.replace( ".", "" ); + + } + + return exts; + + } + +} diff --git a/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/hunter/ImageHunter.java b/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/hunter/ImageHunter.java new file mode 100644 index 000000000..265bfed49 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/hunter/ImageHunter.java @@ -0,0 +1,144 @@ +package com.baidu.ueditor.hunter; + +import java.net.HttpURLConnection; +import java.net.InetAddress; +import java.net.URL; +import java.net.UnknownHostException; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +import com.baidu.ueditor.PathFormat; +import com.baidu.ueditor.define.AppInfo; +import com.baidu.ueditor.define.BaseState; +import com.baidu.ueditor.define.MIMEType; +import com.baidu.ueditor.define.MultiState; +import com.baidu.ueditor.define.State; +import com.baidu.ueditor.upload.StorageManager; + +/** + * 图片抓取器 + * @author hancong03@baidu.com + * + */ +public class ImageHunter { + + private String filename = null; + private String savePath = null; + private String rootPath = null; + private List allowTypes = null; + private long maxSize = -1; + + private List filters = null; + + public ImageHunter ( Map conf ) { + + this.filename = (String)conf.get( "filename" ); + this.savePath = (String)conf.get( "savePath" ); + this.rootPath = (String)conf.get( "rootPath" ); + this.maxSize = (Long)conf.get( "maxSize" ); + this.allowTypes = Arrays.asList( (String[])conf.get( "allowFiles" ) ); + this.filters = Arrays.asList( (String[])conf.get( "filter" ) ); + + } + + public State capture ( String[] list ) { + + MultiState state = new MultiState( true ); + + for ( String source : list ) { + state.addState( captureRemoteData( source ) ); + } + + return state; + + } + + public State captureRemoteData ( String urlStr ) { + + HttpURLConnection connection = null; + URL url = null; + String suffix = null; + + try { + url = new URL( urlStr ); + + if ( !validHost( url.getHost() ) ) { + return new BaseState( false, AppInfo.PREVENT_HOST ); + } + + connection = (HttpURLConnection) url.openConnection(); + + connection.setInstanceFollowRedirects( true ); + connection.setUseCaches( true ); + + if ( !validContentState( connection.getResponseCode() ) ) { + return new BaseState( false, AppInfo.CONNECTION_ERROR ); + } + + suffix = MIMEType.getSuffix( connection.getContentType() ); + + if ( !validFileType( suffix ) ) { + return new BaseState( false, AppInfo.NOT_ALLOW_FILE_TYPE ); + } + + if ( !validFileSize( connection.getContentLength() ) ) { + return new BaseState( false, AppInfo.MAX_SIZE ); + } + + String savePath = this.getPath( this.savePath, this.filename, suffix ); + String physicalPath = this.rootPath + savePath; + + State state = StorageManager.saveFileByInputStream( connection.getInputStream(), physicalPath ); + + if ( state.isSuccess() ) { + state.putInfo( "url", PathFormat.format( savePath ) ); + state.putInfo( "source", urlStr ); + } + + return state; + + } catch ( Exception e ) { + return new BaseState( false, AppInfo.REMOTE_FAIL ); + } + + } + + private String getPath ( String savePath, String filename, String suffix ) { + + return PathFormat.parse( savePath + suffix, filename ); + + } + + private boolean validHost ( String hostname ) { + try { + InetAddress ip = InetAddress.getByName(hostname); + + if (ip.isSiteLocalAddress()) { + return false; + } + } catch (UnknownHostException e) { + return false; + } + + return !filters.contains( hostname ); + + } + + private boolean validContentState ( int code ) { + + return HttpURLConnection.HTTP_OK == code; + + } + + private boolean validFileType ( String type ) { + + return this.allowTypes.contains( type ); + + } + + private boolean validFileSize ( int size ) { + return size < this.maxSize; + } + +} diff --git a/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/upload/Base64Uploader.java b/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/upload/Base64Uploader.java new file mode 100644 index 000000000..2f81076ae --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/upload/Base64Uploader.java @@ -0,0 +1,52 @@ +package com.baidu.ueditor.upload; + +import com.baidu.ueditor.PathFormat; +import com.baidu.ueditor.define.AppInfo; +import com.baidu.ueditor.define.BaseState; +import com.baidu.ueditor.define.FileType; +import com.baidu.ueditor.define.State; + +import java.util.Map; + +import org.apache.commons.codec.binary.Base64; + +public final class Base64Uploader { + + public static State save(String content, Map conf) { + + byte[] data = decode(content); + + long maxSize = ((Long) conf.get("maxSize")).longValue(); + + if (!validSize(data, maxSize)) { + return new BaseState(false, AppInfo.MAX_SIZE); + } + + String suffix = FileType.getSuffix("JPG"); + + String savePath = PathFormat.parse((String) conf.get("savePath"), + (String) conf.get("filename")); + + savePath = savePath + suffix; + String physicalPath = (String) conf.get("rootPath") + savePath; + + State storageState = StorageManager.saveBinaryFile(data, physicalPath); + + if (storageState.isSuccess()) { + storageState.putInfo("url", PathFormat.format(savePath)); + storageState.putInfo("type", suffix); + storageState.putInfo("original", ""); + } + + return storageState; + } + + private static byte[] decode(String content) { + return Base64.decodeBase64(content); + } + + private static boolean validSize(byte[] data, long length) { + return data.length <= length; + } + +} \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/upload/BinaryUploader.java b/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/upload/BinaryUploader.java new file mode 100644 index 000000000..c69f9ddd7 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/upload/BinaryUploader.java @@ -0,0 +1,98 @@ +package com.baidu.ueditor.upload; + +import com.baidu.ueditor.PathFormat; +import com.baidu.ueditor.define.AppInfo; +import com.baidu.ueditor.define.BaseState; +import com.baidu.ueditor.define.FileType; +import com.baidu.ueditor.define.State; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.commons.fileupload.FileItemIterator; +import org.apache.commons.fileupload.FileItemStream; +import org.apache.commons.fileupload.FileUploadException; +import org.apache.commons.fileupload.disk.DiskFileItemFactory; +import org.apache.commons.fileupload.servlet.ServletFileUpload; + +public class BinaryUploader { + + public static final State save(HttpServletRequest request, + Map conf) { + FileItemStream fileStream = null; + boolean isAjaxUpload = request.getHeader( "X_Requested_With" ) != null; + + if (!ServletFileUpload.isMultipartContent(request)) { + return new BaseState(false, AppInfo.NOT_MULTIPART_CONTENT); + } + + ServletFileUpload upload = new ServletFileUpload( + new DiskFileItemFactory()); + + if ( isAjaxUpload ) { + upload.setHeaderEncoding( "UTF-8" ); + } + + try { + FileItemIterator iterator = upload.getItemIterator(request); + + while (iterator.hasNext()) { + fileStream = iterator.next(); + + if (!fileStream.isFormField()) + break; + fileStream = null; + } + + if (fileStream == null) { + return new BaseState(false, AppInfo.NOTFOUND_UPLOAD_DATA); + } + + String savePath = (String) conf.get("savePath"); + String originFileName = fileStream.getName(); + String suffix = FileType.getSuffixByFilename(originFileName); + + originFileName = originFileName.substring(0, + originFileName.length() - suffix.length()); + savePath = savePath + suffix; + + long maxSize = ((Long) conf.get("maxSize")).longValue(); + + if (!validType(suffix, (String[]) conf.get("allowFiles"))) { + return new BaseState(false, AppInfo.NOT_ALLOW_FILE_TYPE); + } + + savePath = PathFormat.parse(savePath, originFileName); + + String physicalPath = (String) conf.get("rootPath") + savePath; + + InputStream is = fileStream.openStream(); + State storageState = StorageManager.saveFileByInputStream(is, + physicalPath, maxSize); + is.close(); + + if (storageState.isSuccess()) { + storageState.putInfo("url", PathFormat.format(savePath)); + storageState.putInfo("type", suffix); + storageState.putInfo("original", originFileName + suffix); + } + + return storageState; + } catch (FileUploadException e) { + return new BaseState(false, AppInfo.PARSE_REQUEST_ERROR); + } catch (IOException e) { + } + return new BaseState(false, AppInfo.IO_ERROR); + } + + private static boolean validType(String type, String[] allowTypes) { + List list = Arrays.asList(allowTypes); + + return list.contains(type); + } +} diff --git a/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/upload/StorageManager.java b/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/upload/StorageManager.java new file mode 100644 index 000000000..33911c648 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/upload/StorageManager.java @@ -0,0 +1,155 @@ +package com.baidu.ueditor.upload; + +import com.baidu.ueditor.define.AppInfo; +import com.baidu.ueditor.define.BaseState; +import com.baidu.ueditor.define.State; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import org.apache.commons.io.FileUtils; + +public class StorageManager { + public static final int BUFFER_SIZE = 8192; + + public StorageManager() { + } + + public static State saveBinaryFile(byte[] data, String path) { + File file = new File(path); + + State state = valid(file); + + if (!state.isSuccess()) { + return state; + } + + try { + BufferedOutputStream bos = new BufferedOutputStream( + new FileOutputStream(file)); + bos.write(data); + bos.flush(); + bos.close(); + } catch (IOException ioe) { + return new BaseState(false, AppInfo.IO_ERROR); + } + + state = new BaseState(true, file.getAbsolutePath()); + state.putInfo( "size", data.length ); + state.putInfo( "title", file.getName() ); + return state; + } + + public static State saveFileByInputStream(InputStream is, String path, + long maxSize) { + State state = null; + + File tmpFile = getTmpFile(); + + byte[] dataBuf = new byte[ 2048 ]; + BufferedInputStream bis = new BufferedInputStream(is, StorageManager.BUFFER_SIZE); + + try { + BufferedOutputStream bos = new BufferedOutputStream( + new FileOutputStream(tmpFile), StorageManager.BUFFER_SIZE); + + int count = 0; + while ((count = bis.read(dataBuf)) != -1) { + bos.write(dataBuf, 0, count); + } + bos.flush(); + bos.close(); + + if (tmpFile.length() > maxSize) { + tmpFile.delete(); + return new BaseState(false, AppInfo.MAX_SIZE); + } + + state = saveTmpFile(tmpFile, path); + + if (!state.isSuccess()) { + tmpFile.delete(); + } + + return state; + + } catch (IOException e) { + } + return new BaseState(false, AppInfo.IO_ERROR); + } + + public static State saveFileByInputStream(InputStream is, String path) { + State state = null; + + File tmpFile = getTmpFile(); + + byte[] dataBuf = new byte[ 2048 ]; + BufferedInputStream bis = new BufferedInputStream(is, StorageManager.BUFFER_SIZE); + + try { + BufferedOutputStream bos = new BufferedOutputStream( + new FileOutputStream(tmpFile), StorageManager.BUFFER_SIZE); + + int count = 0; + while ((count = bis.read(dataBuf)) != -1) { + bos.write(dataBuf, 0, count); + } + bos.flush(); + bos.close(); + + state = saveTmpFile(tmpFile, path); + + if (!state.isSuccess()) { + tmpFile.delete(); + } + + return state; + } catch (IOException e) { + } + return new BaseState(false, AppInfo.IO_ERROR); + } + + private static File getTmpFile() { + File tmpDir = FileUtils.getTempDirectory(); + String tmpFileName = (Math.random() * 10000 + "").replace(".", ""); + return new File(tmpDir, tmpFileName); + } + + private static State saveTmpFile(File tmpFile, String path) { + State state = null; + File targetFile = new File(path); + + if (targetFile.canWrite()) { + return new BaseState(false, AppInfo.PERMISSION_DENIED); + } + try { + FileUtils.moveFile(tmpFile, targetFile); + } catch (IOException e) { + return new BaseState(false, AppInfo.IO_ERROR); + } + + state = new BaseState(true); + state.putInfo( "size", targetFile.length() ); + state.putInfo( "title", targetFile.getName() ); + + return state; + } + + private static State valid(File file) { + File parentPath = file.getParentFile(); + + if ((!parentPath.exists()) && (!parentPath.mkdirs())) { + return new BaseState(false, AppInfo.FAILED_CREATE_FILE); + } + + if (!parentPath.canWrite()) { + return new BaseState(false, AppInfo.PERMISSION_DENIED); + } + + return new BaseState(true); + } +} diff --git a/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/upload/Uploader.java b/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/upload/Uploader.java new file mode 100644 index 000000000..2312d1bcb --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/jsp/src/com/baidu/ueditor/upload/Uploader.java @@ -0,0 +1,29 @@ +package com.baidu.ueditor.upload; + +import com.baidu.ueditor.define.State; +import java.util.Map; +import javax.servlet.http.HttpServletRequest; + +public class Uploader { + private HttpServletRequest request = null; + private Map conf = null; + + public Uploader(HttpServletRequest request, Map conf) { + this.request = request; + this.conf = conf; + } + + public final State doExec() { + String filedName = (String) this.conf.get("fieldName"); + State state = null; + + if ("true".equals(this.conf.get("isBase64"))) { + state = Base64Uploader.save(this.request.getParameter(filedName), + this.conf); + } else { + state = BinaryUploader.save(this.request, this.conf); + } + + return state; + } +} diff --git a/nezha-fronted/static/ueditor-1.4.3.3/lang/en/en.js b/nezha-fronted/static/ueditor-1.4.3.3/lang/en/en.js new file mode 100644 index 000000000..c7e22f5b4 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/lang/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':["News", "Wallpaper", "emotions", "photo"]}, + 'searchTxt':{'value':"Enter the search keyword!"}, + 'searchBtn':{'value':"Search"}, + 'searchReset':{'value':"Clear"}, + 'noneAlign':{'title':'None Float'}, + 'leftAlign':{'title':'Left Float'}, + 'rightAlign':{'title':'Right Float'}, + 'centerAlign':{'title':'Center In A Line'} + }, + 'uploadSelectFile':'Select File', + 'uploadAddFile':'Add File', + 'uploadStart':'Start Upload', + 'uploadPause':'Pause Upload', + 'uploadContinue':'Continue Upload', + 'uploadRetry':'Retry Upload', + 'uploadDelete':'Delete', + 'uploadTurnLeft':'Turn Left', + 'uploadTurnRight':'Turn Right', + 'uploadPreview':'Doing Preview', + 'uploadNoPreview':'Can Not Preview', + '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 ueditor.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/nezha-fronted/static/ueditor-1.4.3.3/lang/en/images/addimage.png b/nezha-fronted/static/ueditor-1.4.3.3/lang/en/images/addimage.png new file mode 100644 index 0000000000000000000000000000000000000000..3a2fd17121b9e0d435b2ca082d696c33b9f27b79 GIT binary patch literal 3373 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 ZzyK$sgmq7P@T33$002ovPDHLkV1jUEUt0hG literal 0 HcmV?d00001 diff --git a/nezha-fronted/static/ueditor-1.4.3.3/lang/en/images/alldeletebtnupskin.png b/nezha-fronted/static/ueditor-1.4.3.3/lang/en/images/alldeletebtnupskin.png new file mode 100644 index 0000000000000000000000000000000000000000..61658ce6f10164478ce293c05f1f0485a8fa1fc4 GIT binary patch literal 743 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 P9go0R-$Jhf?tK5Bgo^WU literal 0 HcmV?d00001 diff --git a/nezha-fronted/static/ueditor-1.4.3.3/lang/en/images/button.png b/nezha-fronted/static/ueditor-1.4.3.3/lang/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/nezha-fronted/static/ueditor-1.4.3.3/lang/en/images/deletedisable.png b/nezha-fronted/static/ueditor-1.4.3.3/lang/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/nezha-fronted/static/ueditor-1.4.3.3/lang/en/images/deleteenable.png b/nezha-fronted/static/ueditor-1.4.3.3/lang/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/nezha-fronted/static/ueditor-1.4.3.3/lang/en/images/localimage.png b/nezha-fronted/static/ueditor-1.4.3.3/lang/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/nezha-fronted/static/ueditor-1.4.3.3/lang/en/images/music.png b/nezha-fronted/static/ueditor-1.4.3.3/lang/en/images/music.png new file mode 100644 index 0000000000000000000000000000000000000000..2f495fe92ffecdce42b74fd57dca2687414711fb GIT binary patch literal 91561 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 LNkvXXu0mjf3l)h% literal 0 HcmV?d00001 diff --git a/nezha-fronted/static/ueditor-1.4.3.3/lang/en/images/rotateleftdisable.png b/nezha-fronted/static/ueditor-1.4.3.3/lang/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/nezha-fronted/static/ueditor-1.4.3.3/lang/en/images/rotateleftenable.png b/nezha-fronted/static/ueditor-1.4.3.3/lang/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/nezha-fronted/static/ueditor-1.4.3.3/lang/en/images/upload.png b/nezha-fronted/static/ueditor-1.4.3.3/lang/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/nezha-fronted/static/ueditor-1.4.3.3/lang/zh-cn/images/copy.png b/nezha-fronted/static/ueditor-1.4.3.3/lang/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/nezha-fronted/static/ueditor-1.4.3.3/lang/zh-cn/images/localimage.png b/nezha-fronted/static/ueditor-1.4.3.3/lang/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':"申请完成之后请至ueditor.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/nezha-fronted/static/ueditor-1.4.3.3/net/App_Code/Config.cs b/nezha-fronted/static/ueditor-1.4.3.3/net/App_Code/Config.cs new file mode 100644 index 000000000..91c130f76 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/net/App_Code/Config.cs @@ -0,0 +1,55 @@ +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.Dynamic; +using System.IO; +using System.Linq; +using System.Web; + +///

          +/// Config 的摘要说明 +/// +public static class Config +{ + private static bool noCache = true; + private static JObject BuildItems() + { + var json = File.ReadAllText(HttpContext.Current.Server.MapPath("config.json")); + return JObject.Parse(json); + } + + public static JObject Items + { + get + { + if (noCache || _Items == null) + { + _Items = BuildItems(); + } + return _Items; + } + } + private static JObject _Items; + + + public static T GetValue(string key) + { + return Items[key].Value(); + } + + public static String[] GetStringList(string key) + { + return Items[key].Select(x => x.Value()).ToArray(); + } + + public static String GetString(string key) + { + return GetValue(key); + } + + public static int GetInt(string key) + { + return GetValue(key); + } +} \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/net/App_Code/ConfigHandler.cs b/nezha-fronted/static/ueditor-1.4.3.3/net/App_Code/ConfigHandler.cs new file mode 100644 index 000000000..03cdc9a42 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/net/App_Code/ConfigHandler.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; + +/// +/// Config 的摘要说明 +/// +public class ConfigHandler : Handler +{ + public ConfigHandler(HttpContext context) : base(context) { } + + public override void Process() + { + WriteJson(Config.Items); + } +} \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/net/App_Code/CrawlerHandler.cs b/nezha-fronted/static/ueditor-1.4.3.3/net/App_Code/CrawlerHandler.cs new file mode 100644 index 000000000..2fdf94088 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/net/App_Code/CrawlerHandler.cs @@ -0,0 +1,164 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net; +using System.Web; + +/// +/// Crawler 的摘要说明 +/// +public class CrawlerHandler : Handler +{ + private string[] Sources; + private Crawler[] Crawlers; + public CrawlerHandler(HttpContext context) : base(context) { } + + public override void Process() + { + Sources = Request.Form.GetValues("source[]"); + if (Sources == null || Sources.Length == 0) + { + WriteJson(new + { + state = "参数错误:没有指定抓取源" + }); + return; + } + Crawlers = Sources.Select(x => new Crawler(x, Server).Fetch()).ToArray(); + WriteJson(new + { + state = "SUCCESS", + list = Crawlers.Select(x => new + { + state = x.State, + source = x.SourceUrl, + url = x.ServerUrl + }) + }); + } +} + +public class Crawler +{ + public string SourceUrl { get; set; } + public string ServerUrl { get; set; } + public string State { get; set; } + + private HttpServerUtility Server { get; set; } + + + public Crawler(string sourceUrl, HttpServerUtility server) + { + this.SourceUrl = sourceUrl; + this.Server = server; + } + + public Crawler Fetch() + { + if (!IsExternalIPAddress(this.SourceUrl)) + { + State = "INVALID_URL"; + return this; + } + var request = HttpWebRequest.Create(this.SourceUrl) as HttpWebRequest; + using (var response = request.GetResponse() as HttpWebResponse) + { + if (response.StatusCode != HttpStatusCode.OK) + { + State = "Url returns " + response.StatusCode + ", " + response.StatusDescription; + return this; + } + if (response.ContentType.IndexOf("image") == -1) + { + State = "Url is not an image"; + return this; + } + ServerUrl = PathFormatter.Format(Path.GetFileName(this.SourceUrl), Config.GetString("catcherPathFormat")); + var savePath = Server.MapPath(ServerUrl); + if (!Directory.Exists(Path.GetDirectoryName(savePath))) + { + Directory.CreateDirectory(Path.GetDirectoryName(savePath)); + } + try + { + var stream = response.GetResponseStream(); + var reader = new BinaryReader(stream); + byte[] bytes; + using (var ms = new MemoryStream()) + { + byte[] buffer = new byte[4096]; + int count; + while ((count = reader.Read(buffer, 0, buffer.Length)) != 0) + { + ms.Write(buffer, 0, count); + } + bytes = ms.ToArray(); + } + File.WriteAllBytes(savePath, bytes); + State = "SUCCESS"; + } + catch (Exception e) + { + State = "抓取错误:" + e.Message; + } + return this; + } + } + + private bool IsExternalIPAddress(string url) + { + var uri = new Uri(url); + switch (uri.HostNameType) + { + case UriHostNameType.Dns: + var ipHostEntry = Dns.GetHostEntry(uri.DnsSafeHost); + foreach (IPAddress ipAddress in ipHostEntry.AddressList) + { + byte[] ipBytes = ipAddress.GetAddressBytes(); + if (ipAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) + { + if (!IsPrivateIP(ipAddress)) + { + return true; + } + } + } + break; + + case UriHostNameType.IPv4: + return !IsPrivateIP(IPAddress.Parse(uri.DnsSafeHost)); + } + return false; + } + + private bool IsPrivateIP(IPAddress myIPAddress) + { + if (IPAddress.IsLoopback(myIPAddress)) return true; + if (myIPAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) + { + byte[] ipBytes = myIPAddress.GetAddressBytes(); + // 10.0.0.0/24 + if (ipBytes[0] == 10) + { + return true; + } + // 172.16.0.0/16 + else if (ipBytes[0] == 172 && ipBytes[1] == 16) + { + return true; + } + // 192.168.0.0/16 + else if (ipBytes[0] == 192 && ipBytes[1] == 168) + { + return true; + } + // 169.254.0.0/16 + else if (ipBytes[0] == 169 && ipBytes[1] == 254) + { + return true; + } + } + return false; + } +} \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/net/App_Code/Handler.cs b/nezha-fronted/static/ueditor-1.4.3.3/net/App_Code/Handler.cs new file mode 100644 index 000000000..4d20ed52e --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/net/App_Code/Handler.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using Newtonsoft.Json; + + +/// +/// Handler 的摘要说明 +/// +public abstract class Handler +{ + public Handler(HttpContext context) + { + this.Request = context.Request; + this.Response = context.Response; + this.Context = context; + this.Server = context.Server; + } + + public abstract void Process(); + + protected void WriteJson(object response) + { + string jsonpCallback = Request["callback"], + json = JsonConvert.SerializeObject(response); + if (String.IsNullOrWhiteSpace(jsonpCallback)) + { + Response.AddHeader("Content-Type", "text/plain"); + Response.Write(json); + } + else + { + Response.AddHeader("Content-Type", "application/javascript"); + Response.Write(String.Format("{0}({1});", jsonpCallback, json)); + } + Response.End(); + } + + public HttpRequest Request { get; private set; } + public HttpResponse Response { get; private set; } + public HttpContext Context { get; private set; } + public HttpServerUtility Server { get; private set; } +} \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/net/App_Code/ListFileHandler.cs b/nezha-fronted/static/ueditor-1.4.3.3/net/App_Code/ListFileHandler.cs new file mode 100644 index 000000000..2cfa22a18 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/net/App_Code/ListFileHandler.cs @@ -0,0 +1,106 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Web; + +/// +/// FileManager 的摘要说明 +/// +public class ListFileManager : Handler +{ + enum ResultState + { + Success, + InvalidParam, + AuthorizError, + IOError, + PathNotFound + } + + private int Start; + private int Size; + private int Total; + private ResultState State; + private String PathToList; + private String[] FileList; + private String[] SearchExtensions; + + public ListFileManager(HttpContext context, string pathToList, string[] searchExtensions) + : base(context) + { + this.SearchExtensions = searchExtensions.Select(x => x.ToLower()).ToArray(); + this.PathToList = pathToList; + } + + public override void Process() + { + try + { + Start = String.IsNullOrEmpty(Request["start"]) ? 0 : Convert.ToInt32(Request["start"]); + Size = String.IsNullOrEmpty(Request["size"]) ? Config.GetInt("imageManagerListSize") : Convert.ToInt32(Request["size"]); + } + catch (FormatException) + { + State = ResultState.InvalidParam; + WriteResult(); + return; + } + var buildingList = new List(); + try + { + var localPath = Server.MapPath(PathToList); + buildingList.AddRange(Directory.GetFiles(localPath, "*", SearchOption.AllDirectories) + .Where(x => SearchExtensions.Contains(Path.GetExtension(x).ToLower())) + .Select(x => PathToList + x.Substring(localPath.Length).Replace("\\", "/"))); + Total = buildingList.Count; + FileList = buildingList.OrderBy(x => x).Skip(Start).Take(Size).ToArray(); + } + catch (UnauthorizedAccessException) + { + State = ResultState.AuthorizError; + } + catch (DirectoryNotFoundException) + { + State = ResultState.PathNotFound; + } + catch (IOException) + { + State = ResultState.IOError; + } + finally + { + WriteResult(); + } + } + + private void WriteResult() + { + WriteJson(new + { + state = GetStateString(), + list = FileList == null ? null : FileList.Select(x => new { url = x }), + start = Start, + size = Size, + total = Total + }); + } + + private string GetStateString() + { + switch (State) + { + case ResultState.Success: + return "SUCCESS"; + case ResultState.InvalidParam: + return "参数不正确"; + case ResultState.PathNotFound: + return "路径不存在"; + case ResultState.AuthorizError: + return "文件系统权限不足"; + case ResultState.IOError: + return "文件系统读取错误"; + } + return "未知错误"; + } +} \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/net/App_Code/NotSupportedHandler.cs b/nezha-fronted/static/ueditor-1.4.3.3/net/App_Code/NotSupportedHandler.cs new file mode 100644 index 000000000..d9d73230d --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/net/App_Code/NotSupportedHandler.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; + +/// +/// NotSupportedHandler 的摘要说明 +/// +public class NotSupportedHandler : Handler +{ + public NotSupportedHandler(HttpContext context) + : base(context) + { + } + + public override void Process() + { + WriteJson(new + { + state = "action 参数为空或者 action 不被支持。" + }); + } +} \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/net/App_Code/PathFormater.cs b/nezha-fronted/static/ueditor-1.4.3.3/net/App_Code/PathFormater.cs new file mode 100644 index 000000000..e6fbfd471 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/net/App_Code/PathFormater.cs @@ -0,0 +1,50 @@ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text.RegularExpressions; +using System.Web; + +/// +/// PathFormater 的摘要说明 +/// +public static class PathFormatter +{ + public static string Format(string originFileName, string pathFormat) + { + if (String.IsNullOrWhiteSpace(pathFormat)) + { + pathFormat = "{filename}{rand:6}"; + } + + var invalidPattern = new Regex(@"[\\\/\:\*\?\042\<\>\|]"); + originFileName = invalidPattern.Replace(originFileName, ""); + + string extension = Path.GetExtension(originFileName); + string filename = Path.GetFileNameWithoutExtension(originFileName); + + pathFormat = pathFormat.Replace("{filename}", filename); + pathFormat = new Regex(@"\{rand(\:?)(\d+)\}", RegexOptions.Compiled).Replace(pathFormat, new MatchEvaluator(delegate(Match match) + { + var digit = 6; + if (match.Groups.Count > 2) + { + digit = Convert.ToInt32(match.Groups[2].Value); + } + var rand = new Random(); + return rand.Next((int)Math.Pow(10, digit), (int)Math.Pow(10, digit + 1)).ToString(); + })); + + pathFormat = pathFormat.Replace("{time}", DateTime.Now.Ticks.ToString()); + pathFormat = pathFormat.Replace("{yyyy}", DateTime.Now.Year.ToString()); + pathFormat = pathFormat.Replace("{yy}", (DateTime.Now.Year % 100).ToString("D2")); + pathFormat = pathFormat.Replace("{mm}", DateTime.Now.Month.ToString("D2")); + pathFormat = pathFormat.Replace("{dd}", DateTime.Now.Day.ToString("D2")); + pathFormat = pathFormat.Replace("{hh}", DateTime.Now.Hour.ToString("D2")); + pathFormat = pathFormat.Replace("{ii}", DateTime.Now.Minute.ToString("D2")); + pathFormat = pathFormat.Replace("{ss}", DateTime.Now.Second.ToString("D2")); + + return pathFormat + extension; + } +} \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/net/App_Code/UploadHandler.cs b/nezha-fronted/static/ueditor-1.4.3.3/net/App_Code/UploadHandler.cs new file mode 100644 index 000000000..ea45e79c2 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/net/App_Code/UploadHandler.cs @@ -0,0 +1,182 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text.RegularExpressions; +using System.Web; + +/// +/// UploadHandler 的摘要说明 +/// +public class UploadHandler : Handler +{ + + public UploadConfig UploadConfig { get; private set; } + public UploadResult Result { get; private set; } + + public UploadHandler(HttpContext context, UploadConfig config) + : base(context) + { + this.UploadConfig = config; + this.Result = new UploadResult() { State = UploadState.Unknown }; + } + + public override void Process() + { + byte[] uploadFileBytes = null; + string uploadFileName = null; + + if (UploadConfig.Base64) + { + uploadFileName = UploadConfig.Base64Filename; + uploadFileBytes = Convert.FromBase64String(Request[UploadConfig.UploadFieldName]); + } + else + { + var file = Request.Files[UploadConfig.UploadFieldName]; + uploadFileName = file.FileName; + + if (!CheckFileType(uploadFileName)) + { + Result.State = UploadState.TypeNotAllow; + WriteResult(); + return; + } + if (!CheckFileSize(file.ContentLength)) + { + Result.State = UploadState.SizeLimitExceed; + WriteResult(); + return; + } + + uploadFileBytes = new byte[file.ContentLength]; + try + { + file.InputStream.Read(uploadFileBytes, 0, file.ContentLength); + } + catch (Exception) + { + Result.State = UploadState.NetworkError; + WriteResult(); + } + } + + Result.OriginFileName = uploadFileName; + + var savePath = PathFormatter.Format(uploadFileName, UploadConfig.PathFormat); + var localPath = Server.MapPath(savePath); + try + { + if (!Directory.Exists(Path.GetDirectoryName(localPath))) + { + Directory.CreateDirectory(Path.GetDirectoryName(localPath)); + } + File.WriteAllBytes(localPath, uploadFileBytes); + Result.Url = savePath; + Result.State = UploadState.Success; + } + catch (Exception e) + { + Result.State = UploadState.FileAccessError; + Result.ErrorMessage = e.Message; + } + finally + { + WriteResult(); + } + } + + private void WriteResult() + { + this.WriteJson(new + { + state = GetStateMessage(Result.State), + url = Result.Url, + title = Result.OriginFileName, + original = Result.OriginFileName, + error = Result.ErrorMessage + }); + } + + private string GetStateMessage(UploadState state) + { + switch (state) + { + case UploadState.Success: + return "SUCCESS"; + case UploadState.FileAccessError: + return "文件访问出错,请检查写入权限"; + case UploadState.SizeLimitExceed: + return "文件大小超出服务器限制"; + case UploadState.TypeNotAllow: + return "不允许的文件格式"; + case UploadState.NetworkError: + return "网络错误"; + } + return "未知错误"; + } + + private bool CheckFileType(string filename) + { + var fileExtension = Path.GetExtension(filename).ToLower(); + return UploadConfig.AllowExtensions.Select(x => x.ToLower()).Contains(fileExtension); + } + + private bool CheckFileSize(int size) + { + return size < UploadConfig.SizeLimit; + } +} + +public class UploadConfig +{ + /// + /// 文件命名规则 + /// + public string PathFormat { get; set; } + + /// + /// 上传表单域名称 + /// + public string UploadFieldName { get; set; } + + /// + /// 上传大小限制 + /// + public int SizeLimit { get; set; } + + /// + /// 上传允许的文件格式 + /// + public string[] AllowExtensions { get; set; } + + /// + /// 文件是否以 Base64 的形式上传 + /// + public bool Base64 { get; set; } + + /// + /// Base64 字符串所表示的文件名 + /// + public string Base64Filename { get; set; } +} + +public class UploadResult +{ + public UploadState State { get; set; } + public string Url { get; set; } + public string OriginFileName { get; set; } + + public string ErrorMessage { get; set; } +} + +public enum UploadState +{ + Success = 0, + SizeLimitExceed = -1, + TypeNotAllow = -2, + FileAccessError = -3, + NetworkError = -4, + Unknown = 1, +} + diff --git a/nezha-fronted/static/ueditor-1.4.3.3/net/README.md b/nezha-fronted/static/ueditor-1.4.3.3/net/README.md new file mode 100644 index 000000000..b7c7ddd50 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/net/README.md @@ -0,0 +1,141 @@ +UEditor ASP.NET 后台使用说明 +===== + +## 背景 + +UEditor 在 1.4 版本之后进行了一次[前后端统一配置](../_doc/3.1 后端请求规范.md)的整理,.Net 的后台也进行了一次重写,跟之前的版本差别较大,升级的用户注意阅读本文档。 + +本文档介绍 UEditor ASP.NET 后台的部署、配置、源码说明。 + + +## 1. 部署说明 + +### 1.1. 安装并注册 .NET Framework 4.0 + +代码的运行时环境是 .NET Framework 4.0,首先要确认 IIS 已经安装了 .NET 4.0 的运行时框架。方法是打开「IIS 管理器」,选择根目录下的「应用程序池」,在右侧查看是否有一个应用程序池的版本是 v4.0,如果存在,则 IIS 已经安装了所需的运行时环境,此时读者可以跳过本节。 + +![检查 .NET 4.0 安装情况](../_doc/images/net-publish-1.png) + +如果没有找到对应的应用程序池,需要手动安装。 + +Windows 7 和 Windows Server 2008 R2 默认安装了 .Net Framework 4.0,如果是 Server 03 和老掉牙的 Windows XP,则需要手动安装 [.NET Framework 4.0](http://www.microsoft.com/zh-cn/download/details.aspx?id=17718)。 + +安装完 .NET Framework 4.0 后,还需要向 IIS 注册应用程序池,注册的方法是,使用**管理员权限**打开命令提示符(CMD),输入以下命令: + +```shell +C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis -i +``` + +安装完毕后,在 IIS 管理器刷新就能看到 4.0 的应用程序池。 + +### 1.2. 设置 .NET 应用程序 + +代码要求以应用程序的形式来运行(可以方便加入库依赖和组织代码)。需要把 `net` 目录转换为应用程序。 + +1. 在 IIS 中,展开到 `ueditor/net` 目录,在目录上右击,点击「转换为应用程序」。 + + ![转换为应用程序](../_doc/images/net-publish-2.png) + +2. 弹出的对话框中,点击「选择...」来指定使用的应用程序池。选择版本为 4.0 的应用程序池,然后点确定。 + + ![选择应用程序池](../_doc/images/net-publish-3.png) + +3. 设置连接凭据。点击「链接为...」按钮,在弹出的对话框中指定一个对目录具有读写权限的用户(如 administrator),然后点确定。 + + ![设置连接凭据](../_doc/images/net-publish-4.png) + + 设置完毕后,可以点击「测试设置...」来测试权限是否正常。 + + ![设置连接凭据](../_doc/images/net-publish-5.png) + +### 1.3. 运行测试 + +在浏览器中运行 `net/controller.ashx`,如果返回 "`{"state":"action 参数为空或者 action 不被支持。"}`",则表示应用程序运行成功。 + +如果你确认上述步骤已经执行,但是依然有问题,请给我们[提 Issue](https://github.com/fex-team/ueditor/issues/new?labels=NET%E5%90%8E%E5%8F%B0),我们会尽快答复解决。 + +## 2. 配置说明 + +前后端配置统一之后,配置文件由后台读取,返回给前端。但是部分配置是给后台使用的。 + +### 2.1. 上传配置说明 + +关于上传的部分,后台需要关心以下模板的配置项。 + +```json +{ + "{tpl}FieldName": "upfile", + "{tpl}PathFormat": "upload/{tpl}/{yyyy}{mm}{dd}/{time}{rand:6}", + "{tpl}UrlPrefix": "/ueditor/net/", + "{tpl}AllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], + "{tpl}MaxSize": 2048000 +} +``` + +"{tpl}FieldName" 表示提交的表单的文件域名称。 + +"{tpl}PathFormat" 表示上传文件保存的路径和名称。注意,这里的路径是相对应用程序的,如果需要修改的话,请自行修改源码。 + +"{tpl}UrlPrefix" 表示上传文件访问的 URL 前缀。注意,这里应该给出应用程序的 URL 路径,否则上传的文件不能正确定位。 + +> 举个例子,如果你的 UEditor 的位置在 `http://www.mydomain.com/myapp/ueditor`,对应的本地路径是 `C:\iis_pub\www\myapp\ueditor`,那么 .NET 应用程序的位置在 `http://www.mydomain.com/myapp/ueditor/net`,对应的本地路径是 `C:\iis_pub\www\myapp\ueditor\net`。图片上传配置项应该如下: +> +> { +> "imagePathFormat": "upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", +> "imageUrlPrefix": "/myapp/ueditor/net/", +> } +> +> 上传的文件会保存在 `C:\iis_pub\www\myapp\ueditor\net\upload\image\{日期}\{文件名}` + +"{tpl}AllowFiles" 限制文件上传的类型,注意要有 "."。 + +"{tpl}MaxSize" 限制文件上传的大小。注意这里的限制是代码上的判断,应用程序本身还有一个请求报文大小限制。该限制在 web.config 文件中修改,注意要有以下的节: + +```xml + + + + + +``` + +maxRequestLength 就是请求报文大小限制,该大小应该要比设置的所有上传大小都大,否则应用程序执行之前,请求会被被拒绝。 + +## 3. 源码说明 + +可以看到 net 目录内的源码结构是这样的: + +``` +net + App_Code + Config.cs + Handler.cs + PathFormatter.cs + *Handler.cs + Bin + Newtonsoft.Json.dll + config.json + controller.ashx + net.sln + README.md + Web.config +``` + +App_Code 上的文件是应用程序的源码。 + +- Config.cs 负责读取配置文件 +- Handler.cs 是请求处理器的基类,提供了一些基本对象的访问以及输出控制。如果需要增加处理器,应该从该基类继承 +- PathFormatter.cs 解析 PathFormat,把信息填充为运行时信息。 +- *Handler.cs 是各种处理器,处理各种 UEditor 需要的请求。 + +Bin 里面的是应用程序的依赖库,当前依赖 Newtonsoft 的 Json 库。Bin 目录和 App_Code 目录受应用程序保护,不用担心被用户访问到。 + +config.json 是 UEditor 后端的配置文件,上一节已经介绍了比较重要的配置项。 + +controller.ashx 是 UEditor 请求的入口,它把不同的 action 分发到不同的 Handler 来处理。 + +net.sln 是项目的解决方案文件,安装 Visual Studio 2013 或以上的机器可以打开进行项目的改造。 + +README.md 是本说明文件。 + +Web.config 是应用程序的配置文件。 diff --git a/nezha-fronted/static/ueditor-1.4.3.3/net/Web.config b/nezha-fronted/static/ueditor-1.4.3.3/net/Web.config new file mode 100644 index 000000000..992ee5280 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/net/Web.config @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/nezha-fronted/static/ueditor-1.4.3.3/net/config.json b/nezha-fronted/static/ueditor-1.4.3.3/net/config.json new file mode 100644 index 000000000..55d948f22 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/net/config.json @@ -0,0 +1,94 @@ +/* 前后端通信相关的配置,注释只允许使用多行方式 */ +{ + /* 上传图片配置项 */ + "imageActionName": "uploadimage", /* 执行上传图片的action名称 */ + "imageFieldName": "upfile", /* 提交的图片表单名称 */ + "imageMaxSize": 2048000, /* 上传大小限制,单位B */ + "imageAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 上传图片格式显示 */ + "imageCompressEnable": true, /* 是否压缩图片,默认是true */ + "imageCompressBorder": 1600, /* 图片压缩最长边限制 */ + "imageInsertAlign": "none", /* 插入的图片浮动方式 */ + "imageUrlPrefix": "/ueditor/net/", /* 图片访问路径前缀 */ + "imagePathFormat": "upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + /* {filename} 会替换成原文件名,配置这项需要注意中文乱码问题 */ + /* {rand:6} 会替换成随机数,后面的数字是随机数的位数 */ + /* {time} 会替换成时间戳 */ + /* {yyyy} 会替换成四位年份 */ + /* {yy} 会替换成两位年份 */ + /* {mm} 会替换成两位月份 */ + /* {dd} 会替换成两位日期 */ + /* {hh} 会替换成两位小时 */ + /* {ii} 会替换成两位分钟 */ + /* {ss} 会替换成两位秒 */ + /* 非法字符 \ : * ? " < > | */ + /* 具请体看线上文档: fex.baidu.com/ueditor/#use-format_upload_filename */ + + /* 涂鸦图片上传配置项 */ + "scrawlActionName": "uploadscrawl", /* 执行上传涂鸦的action名称 */ + "scrawlFieldName": "upfile", /* 提交的图片表单名称 */ + "scrawlPathFormat": "upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "scrawlMaxSize": 2048000, /* 上传大小限制,单位B */ + "scrawlUrlPrefix": "/ueditor/net/", /* 图片访问路径前缀 */ + "scrawlInsertAlign": "none", + + /* 截图工具上传 */ + "snapscreenActionName": "uploadimage", /* 执行上传截图的action名称 */ + "snapscreenPathFormat": "upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "snapscreenUrlPrefix": "/ueditor/net/", /* 图片访问路径前缀 */ + "snapscreenInsertAlign": "none", /* 插入的图片浮动方式 */ + + /* 抓取远程图片配置 */ + "catcherLocalDomain": ["127.0.0.1", "localhost", "img.baidu.com"], + "catcherActionName": "catchimage", /* 执行抓取远程图片的action名称 */ + "catcherFieldName": "source", /* 提交的图片列表表单名称 */ + "catcherPathFormat": "upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "catcherUrlPrefix": "/ueditor/net/", /* 图片访问路径前缀 */ + "catcherMaxSize": 2048000, /* 上传大小限制,单位B */ + "catcherAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 抓取图片格式显示 */ + + /* 上传视频配置 */ + "videoActionName": "uploadvideo", /* 执行上传视频的action名称 */ + "videoFieldName": "upfile", /* 提交的视频表单名称 */ + "videoPathFormat": "upload/video/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "videoUrlPrefix": "/ueditor/net/", /* 视频访问路径前缀 */ + "videoMaxSize": 102400000, /* 上传大小限制,单位B,默认100MB */ + "videoAllowFiles": [ + ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg", + ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid"], /* 上传视频格式显示 */ + + /* 上传文件配置 */ + "fileActionName": "uploadfile", /* controller里,执行上传视频的action名称 */ + "fileFieldName": "upfile", /* 提交的文件表单名称 */ + "filePathFormat": "upload/file/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "fileUrlPrefix": "/ueditor/net/", /* 文件访问路径前缀 */ + "fileMaxSize": 51200000, /* 上传大小限制,单位B,默认50MB */ + "fileAllowFiles": [ + ".png", ".jpg", ".jpeg", ".gif", ".bmp", + ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg", + ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid", + ".rar", ".zip", ".tar", ".gz", ".7z", ".bz2", ".cab", ".iso", + ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf", ".txt", ".md", ".xml" + ], /* 上传文件格式显示 */ + + /* 列出指定目录下的图片 */ + "imageManagerActionName": "listimage", /* 执行图片管理的action名称 */ + "imageManagerListPath": "upload/image", /* 指定要列出图片的目录 */ + "imageManagerListSize": 20, /* 每次列出文件数量 */ + "imageManagerUrlPrefix": "/ueditor/net/", /* 图片访问路径前缀 */ + "imageManagerInsertAlign": "none", /* 插入的图片浮动方式 */ + "imageManagerAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 列出的文件类型 */ + + /* 列出指定目录下的文件 */ + "fileManagerActionName": "listfile", /* 执行文件管理的action名称 */ + "fileManagerListPath": "upload/file", /* 指定要列出文件的目录 */ + "fileManagerUrlPrefix": "/ueditor/net/", /* 文件访问路径前缀 */ + "fileManagerListSize": 20, /* 每次列出文件数量 */ + "fileManagerAllowFiles": [ + ".png", ".jpg", ".jpeg", ".gif", ".bmp", + ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg", + ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid", + ".rar", ".zip", ".tar", ".gz", ".7z", ".bz2", ".cab", ".iso", + ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf", ".txt", ".md", ".xml" + ] /* 列出的文件类型 */ + +} \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/net/controller.ashx b/nezha-fronted/static/ueditor-1.4.3.3/net/controller.ashx new file mode 100644 index 000000000..320714e9e --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/net/controller.ashx @@ -0,0 +1,80 @@ +<%@ WebHandler Language="C#" Class="UEditorHandler" %> + +using System; +using System.Web; +using System.IO; +using System.Collections; +using Newtonsoft.Json; + +public class UEditorHandler : IHttpHandler +{ + public void ProcessRequest(HttpContext context) + { + Handler action = null; + switch (context.Request["action"]) + { + case "config": + action = new ConfigHandler(context); + break; + case "uploadimage": + action = new UploadHandler(context, new UploadConfig() + { + AllowExtensions = Config.GetStringList("imageAllowFiles"), + PathFormat = Config.GetString("imagePathFormat"), + SizeLimit = Config.GetInt("imageMaxSize"), + UploadFieldName = Config.GetString("imageFieldName") + }); + break; + case "uploadscrawl": + action = new UploadHandler(context, new UploadConfig() + { + AllowExtensions = new string[] { ".png" }, + PathFormat = Config.GetString("scrawlPathFormat"), + SizeLimit = Config.GetInt("scrawlMaxSize"), + UploadFieldName = Config.GetString("scrawlFieldName"), + Base64 = true, + Base64Filename = "scrawl.png" + }); + break; + case "uploadvideo": + action = new UploadHandler(context, new UploadConfig() + { + AllowExtensions = Config.GetStringList("videoAllowFiles"), + PathFormat = Config.GetString("videoPathFormat"), + SizeLimit = Config.GetInt("videoMaxSize"), + UploadFieldName = Config.GetString("videoFieldName") + }); + break; + case "uploadfile": + action = new UploadHandler(context, new UploadConfig() + { + AllowExtensions = Config.GetStringList("fileAllowFiles"), + PathFormat = Config.GetString("filePathFormat"), + SizeLimit = Config.GetInt("fileMaxSize"), + UploadFieldName = Config.GetString("fileFieldName") + }); + break; + case "listimage": + action = new ListFileManager(context, Config.GetString("imageManagerListPath"), Config.GetStringList("imageManagerAllowFiles")); + break; + case "listfile": + action = new ListFileManager(context, Config.GetString("fileManagerListPath"), Config.GetStringList("fileManagerAllowFiles")); + break; + case "catchimage": + action = new CrawlerHandler(context); + break; + default: + action = new NotSupportedHandler(context); + break; + } + action.Process(); + } + + public bool IsReusable + { + get + { + return false; + } + } +} \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/package.json b/nezha-fronted/static/ueditor-1.4.3.3/package.json new file mode 100644 index 000000000..1988b1f39 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/package.json @@ -0,0 +1,36 @@ +{ + "name": "ueditor", + "title": "ueditor", + "description": "UEditor富文本web编辑器", + "version": "1.4.3", + "homepage": "http://ueditor.baidu.com/", + "author": { + "name": "f-cube @ FEX", + "url": "http://fex.baidu.com" + }, + "repository": { + "type": "git", + "url": "https://github.com/fex-team/ueditor.git" + }, + "keywords": [ + "ueditor", + "web editor", + "javascript" + ], + "bugs": { + "url": "https://github.com/fex-team/ueditor/issues" + }, + "dependencies": { + "grunt": "~0.4.1", + "grunt-contrib-concat": "~0.3.0", + "grunt-contrib-cssmin": "~0.6.0", + "grunt-contrib-uglify": "~1.0.1", + "grunt-contrib-copy": "~0.4.0", + "grunt-transcoding": "~0.1.1", + "grunt-text-replace": "~0.3.9", + "grunt-contrib-clean": "~0.5.0" + }, + "devDependencies": { + "grunt": "~0.4.1" + } +} diff --git a/nezha-fronted/static/ueditor-1.4.3.3/php/Uploader.class.php b/nezha-fronted/static/ueditor-1.4.3.3/php/Uploader.class.php new file mode 100644 index 000000000..b7d6bf8d5 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/php/Uploader.class.php @@ -0,0 +1,372 @@ + "临时文件错误", + "ERROR_TMP_FILE_NOT_FOUND" => "找不到临时文件", + "ERROR_SIZE_EXCEED" => "文件大小超出网站限制", + "ERROR_TYPE_NOT_ALLOWED" => "文件类型不允许", + "ERROR_CREATE_DIR" => "目录创建失败", + "ERROR_DIR_NOT_WRITEABLE" => "目录没有写权限", + "ERROR_FILE_MOVE" => "文件保存时出错", + "ERROR_FILE_NOT_FOUND" => "找不到上传文件", + "ERROR_WRITE_CONTENT" => "写入文件内容错误", + "ERROR_UNKNOWN" => "未知错误", + "ERROR_DEAD_LINK" => "链接不可用", + "ERROR_HTTP_LINK" => "链接不是http链接", + "ERROR_HTTP_CONTENTTYPE" => "链接contentType不正确", + "INVALID_URL" => "非法 URL", + "INVALID_IP" => "非法 IP" + ); + + /** + * 构造函数 + * @param string $fileField 表单名称 + * @param array $config 配置项 + * @param bool $base64 是否解析base64编码,可省略。若开启,则$fileField代表的是base64编码的字符串表单名 + */ + public function __construct($fileField, $config, $type = "upload") + { + $this->fileField = $fileField; + $this->config = $config; + $this->type = $type; + if ($type == "remote") { + $this->saveRemote(); + } else if($type == "base64") { + $this->upBase64(); + } else { + $this->upFile(); + } + + $this->stateMap['ERROR_TYPE_NOT_ALLOWED'] = iconv('unicode', 'utf-8', $this->stateMap['ERROR_TYPE_NOT_ALLOWED']); + } + + /** + * 上传文件的主处理方法 + * @return mixed + */ + private function upFile() + { + $file = $this->file = $_FILES[$this->fileField]; + if (!$file) { + $this->stateInfo = $this->getStateInfo("ERROR_FILE_NOT_FOUND"); + return; + } + if ($this->file['error']) { + $this->stateInfo = $this->getStateInfo($file['error']); + return; + } else if (!file_exists($file['tmp_name'])) { + $this->stateInfo = $this->getStateInfo("ERROR_TMP_FILE_NOT_FOUND"); + return; + } else if (!is_uploaded_file($file['tmp_name'])) { + $this->stateInfo = $this->getStateInfo("ERROR_TMPFILE"); + return; + } + + $this->oriName = $file['name']; + $this->fileSize = $file['size']; + $this->fileType = $this->getFileExt(); + $this->fullName = $this->getFullName(); + $this->filePath = $this->getFilePath(); + $this->fileName = $this->getFileName(); + $dirname = dirname($this->filePath); + + //检查文件大小是否超出限制 + if (!$this->checkSize()) { + $this->stateInfo = $this->getStateInfo("ERROR_SIZE_EXCEED"); + return; + } + + //检查是否不允许的文件格式 + if (!$this->checkType()) { + $this->stateInfo = $this->getStateInfo("ERROR_TYPE_NOT_ALLOWED"); + return; + } + + //创建目录失败 + if (!file_exists($dirname) && !mkdir($dirname, 0777, true)) { + $this->stateInfo = $this->getStateInfo("ERROR_CREATE_DIR"); + return; + } else if (!is_writeable($dirname)) { + $this->stateInfo = $this->getStateInfo("ERROR_DIR_NOT_WRITEABLE"); + return; + } + + //移动文件 + if (!(move_uploaded_file($file["tmp_name"], $this->filePath) && file_exists($this->filePath))) { //移动失败 + $this->stateInfo = $this->getStateInfo("ERROR_FILE_MOVE"); + } else { //移动成功 + $this->stateInfo = $this->stateMap[0]; + } + } + + /** + * 处理base64编码的图片上传 + * @return mixed + */ + private function upBase64() + { + $base64Data = $_POST[$this->fileField]; + $img = base64_decode($base64Data); + + $this->oriName = $this->config['oriName']; + $this->fileSize = strlen($img); + $this->fileType = $this->getFileExt(); + $this->fullName = $this->getFullName(); + $this->filePath = $this->getFilePath(); + $this->fileName = $this->getFileName(); + $dirname = dirname($this->filePath); + + //检查文件大小是否超出限制 + if (!$this->checkSize()) { + $this->stateInfo = $this->getStateInfo("ERROR_SIZE_EXCEED"); + return; + } + + //创建目录失败 + if (!file_exists($dirname) && !mkdir($dirname, 0777, true)) { + $this->stateInfo = $this->getStateInfo("ERROR_CREATE_DIR"); + return; + } else if (!is_writeable($dirname)) { + $this->stateInfo = $this->getStateInfo("ERROR_DIR_NOT_WRITEABLE"); + return; + } + + //移动文件 + if (!(file_put_contents($this->filePath, $img) && file_exists($this->filePath))) { //移动失败 + $this->stateInfo = $this->getStateInfo("ERROR_WRITE_CONTENT"); + } else { //移动成功 + $this->stateInfo = $this->stateMap[0]; + } + + } + + /** + * 拉取远程图片 + * @return mixed + */ + private function saveRemote() + { + $imgUrl = htmlspecialchars($this->fileField); + $imgUrl = str_replace("&", "&", $imgUrl); + + //http开头验证 + if (strpos($imgUrl, "http") !== 0) { + $this->stateInfo = $this->getStateInfo("ERROR_HTTP_LINK"); + return; + } + + preg_match('/(^https*:\/\/[^:\/]+)/', $imgUrl, $matches); + $host_with_protocol = count($matches) > 1 ? $matches[1] : ''; + + // 判断是否是合法 url + if (!filter_var($host_with_protocol, FILTER_VALIDATE_URL)) { + $this->stateInfo = $this->getStateInfo("INVALID_URL"); + return; + } + + preg_match('/^https*:\/\/(.+)/', $host_with_protocol, $matches); + $host_without_protocol = count($matches) > 1 ? $matches[1] : ''; + + // 此时提取出来的可能是 ip 也有可能是域名,先获取 ip + $ip = gethostbyname($host_without_protocol); + // 判断是否是私有 ip + if(!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE)) { + $this->stateInfo = $this->getStateInfo("INVALID_IP"); + return; + } + + //获取请求头并检测死链 + $heads = get_headers($imgUrl, 1); + if (!(stristr($heads[0], "200") && stristr($heads[0], "OK"))) { + $this->stateInfo = $this->getStateInfo("ERROR_DEAD_LINK"); + return; + } + //格式验证(扩展名验证和Content-Type验证) + $fileType = strtolower(strrchr($imgUrl, '.')); + if (!in_array($fileType, $this->config['allowFiles']) || !isset($heads['Content-Type']) || !stristr($heads['Content-Type'], "image")) { + $this->stateInfo = $this->getStateInfo("ERROR_HTTP_CONTENTTYPE"); + return; + } + + //打开输出缓冲区并获取远程图片 + ob_start(); + $context = stream_context_create( + array('http' => array( + 'follow_location' => false // don't follow redirects + )) + ); + readfile($imgUrl, false, $context); + $img = ob_get_contents(); + ob_end_clean(); + preg_match("/[\/]([^\/]*)[\.]?[^\.\/]*$/", $imgUrl, $m); + + $this->oriName = $m ? $m[1]:""; + $this->fileSize = strlen($img); + $this->fileType = $this->getFileExt(); + $this->fullName = $this->getFullName(); + $this->filePath = $this->getFilePath(); + $this->fileName = $this->getFileName(); + $dirname = dirname($this->filePath); + + //检查文件大小是否超出限制 + if (!$this->checkSize()) { + $this->stateInfo = $this->getStateInfo("ERROR_SIZE_EXCEED"); + return; + } + + //创建目录失败 + if (!file_exists($dirname) && !mkdir($dirname, 0777, true)) { + $this->stateInfo = $this->getStateInfo("ERROR_CREATE_DIR"); + return; + } else if (!is_writeable($dirname)) { + $this->stateInfo = $this->getStateInfo("ERROR_DIR_NOT_WRITEABLE"); + return; + } + + //移动文件 + if (!(file_put_contents($this->filePath, $img) && file_exists($this->filePath))) { //移动失败 + $this->stateInfo = $this->getStateInfo("ERROR_WRITE_CONTENT"); + } else { //移动成功 + $this->stateInfo = $this->stateMap[0]; + } + + } + + /** + * 上传错误检查 + * @param $errCode + * @return string + */ + private function getStateInfo($errCode) + { + return !$this->stateMap[$errCode] ? $this->stateMap["ERROR_UNKNOWN"] : $this->stateMap[$errCode]; + } + + /** + * 获取文件扩展名 + * @return string + */ + private function getFileExt() + { + return strtolower(strrchr($this->oriName, '.')); + } + + /** + * 重命名文件 + * @return string + */ + private function getFullName() + { + //替换日期事件 + $t = time(); + $d = explode('-', date("Y-y-m-d-H-i-s")); + $format = $this->config["pathFormat"]; + $format = str_replace("{yyyy}", $d[0], $format); + $format = str_replace("{yy}", $d[1], $format); + $format = str_replace("{mm}", $d[2], $format); + $format = str_replace("{dd}", $d[3], $format); + $format = str_replace("{hh}", $d[4], $format); + $format = str_replace("{ii}", $d[5], $format); + $format = str_replace("{ss}", $d[6], $format); + $format = str_replace("{time}", $t, $format); + + //过滤文件名的非法自负,并替换文件名 + $oriName = substr($this->oriName, 0, strrpos($this->oriName, '.')); + $oriName = preg_replace("/[\|\?\"\<\>\/\*\\\\]+/", '', $oriName); + $format = str_replace("{filename}", $oriName, $format); + + //替换随机字符串 + $randNum = rand(1, 10000000000) . rand(1, 10000000000); + if (preg_match("/\{rand\:([\d]*)\}/i", $format, $matches)) { + $format = preg_replace("/\{rand\:[\d]*\}/i", substr($randNum, 0, $matches[1]), $format); + } + + $ext = $this->getFileExt(); + return $format . $ext; + } + + /** + * 获取文件名 + * @return string + */ + private function getFileName () { + return substr($this->filePath, strrpos($this->filePath, '/') + 1); + } + + /** + * 获取文件完整路径 + * @return string + */ + private function getFilePath() + { + $fullname = $this->fullName; + $rootPath = $_SERVER['DOCUMENT_ROOT']; + + if (substr($fullname, 0, 1) != '/') { + $fullname = '/' . $fullname; + } + + return $rootPath . $fullname; + } + + /** + * 文件类型检测 + * @return bool + */ + private function checkType() + { + return in_array($this->getFileExt(), $this->config["allowFiles"]); + } + + /** + * 文件大小检测 + * @return bool + */ + private function checkSize() + { + return $this->fileSize <= ($this->config["maxSize"]); + } + + /** + * 获取当前上传成功文件的各项信息 + * @return array + */ + public function getFileInfo() + { + return array( + "state" => $this->stateInfo, + "url" => $this->fullName, + "title" => $this->fileName, + "original" => $this->oriName, + "type" => $this->fileType, + "size" => $this->fileSize + ); + } + +} \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/php/action_crawler.php b/nezha-fronted/static/ueditor-1.4.3.3/php/action_crawler.php new file mode 100644 index 000000000..b9e18dfae --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/php/action_crawler.php @@ -0,0 +1,44 @@ + $CONFIG['catcherPathFormat'], + "maxSize" => $CONFIG['catcherMaxSize'], + "allowFiles" => $CONFIG['catcherAllowFiles'], + "oriName" => "remote.png" +); +$fieldName = $CONFIG['catcherFieldName']; + +/* 抓取远程图片 */ +$list = array(); +if (isset($_POST[$fieldName])) { + $source = $_POST[$fieldName]; +} else { + $source = $_GET[$fieldName]; +} +foreach ($source as $imgUrl) { + $item = new Uploader($imgUrl, $config, "remote"); + $info = $item->getFileInfo(); + array_push($list, array( + "state" => $info["state"], + "url" => $info["url"], + "size" => $info["size"], + "title" => htmlspecialchars($info["title"]), + "original" => htmlspecialchars($info["original"]), + "source" => htmlspecialchars($imgUrl) + )); +} + +/* 返回抓取数据 */ +return json_encode(array( + 'state'=> count($list) ? 'SUCCESS':'ERROR', + 'list'=> $list +)); \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/php/action_list.php b/nezha-fronted/static/ueditor-1.4.3.3/php/action_list.php new file mode 100644 index 000000000..bf9cd62c1 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/php/action_list.php @@ -0,0 +1,92 @@ + "no match file", + "list" => array(), + "start" => $start, + "total" => count($files) + )); +} + +/* 获取指定范围的列表 */ +$len = count($files); +for ($i = min($end, $len) - 1, $list = array(); $i < $len && $i >= 0 && $i >= $start; $i--){ + $list[] = $files[$i]; +} +//倒序 +//for ($i = $end, $list = array(); $i < $len && $i < $end; $i++){ +// $list[] = $files[$i]; +//} + +/* 返回数据 */ +$result = json_encode(array( + "state" => "SUCCESS", + "list" => $list, + "start" => $start, + "total" => count($files) +)); + +return $result; + + +/** + * 遍历获取目录下的指定类型的文件 + * @param $path + * @param array $files + * @return array + */ +function getfiles($path, $allowFiles, &$files = array()) +{ + if (!is_dir($path)) return null; + if(substr($path, strlen($path) - 1) != '/') $path .= '/'; + $handle = opendir($path); + while (false !== ($file = readdir($handle))) { + if ($file != '.' && $file != '..') { + $path2 = $path . $file; + if (is_dir($path2)) { + getfiles($path2, $allowFiles, $files); + } else { + if (preg_match("/\.(".$allowFiles.")$/i", $file)) { + $files[] = array( + 'url'=> substr($path2, strlen($_SERVER['DOCUMENT_ROOT'])), + 'mtime'=> filemtime($path2) + ); + } + } + } + } + return $files; +} \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/php/action_upload.php b/nezha-fronted/static/ueditor-1.4.3.3/php/action_upload.php new file mode 100644 index 000000000..d55b6591a --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/php/action_upload.php @@ -0,0 +1,66 @@ + $CONFIG['imagePathFormat'], + "maxSize" => $CONFIG['imageMaxSize'], + "allowFiles" => $CONFIG['imageAllowFiles'] + ); + $fieldName = $CONFIG['imageFieldName']; + break; + case 'uploadscrawl': + $config = array( + "pathFormat" => $CONFIG['scrawlPathFormat'], + "maxSize" => $CONFIG['scrawlMaxSize'], + "allowFiles" => $CONFIG['scrawlAllowFiles'], + "oriName" => "scrawl.png" + ); + $fieldName = $CONFIG['scrawlFieldName']; + $base64 = "base64"; + break; + case 'uploadvideo': + $config = array( + "pathFormat" => $CONFIG['videoPathFormat'], + "maxSize" => $CONFIG['videoMaxSize'], + "allowFiles" => $CONFIG['videoAllowFiles'] + ); + $fieldName = $CONFIG['videoFieldName']; + break; + case 'uploadfile': + default: + $config = array( + "pathFormat" => $CONFIG['filePathFormat'], + "maxSize" => $CONFIG['fileMaxSize'], + "allowFiles" => $CONFIG['fileAllowFiles'] + ); + $fieldName = $CONFIG['fileFieldName']; + break; +} + +/* 生成上传实例对象并完成上传 */ +$up = new Uploader($fieldName, $config, $base64); + +/** + * 得到上传文件所对应的各个参数,数组结构 + * array( + * "state" => "", //上传状态,上传成功时必须返回"SUCCESS" + * "url" => "", //返回的地址 + * "title" => "", //新文件名 + * "original" => "", //原始文件名 + * "type" => "" //文件类型 + * "size" => "", //文件大小 + * ) + */ + +/* 返回数据 */ +return json_encode($up->getFileInfo()); diff --git a/nezha-fronted/static/ueditor-1.4.3.3/php/config.json b/nezha-fronted/static/ueditor-1.4.3.3/php/config.json new file mode 100644 index 000000000..dd5bc1743 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/php/config.json @@ -0,0 +1,94 @@ +/* 前后端通信相关的配置,注释只允许使用多行方式 */ +{ + /* 上传图片配置项 */ + "imageActionName": "uploadimage", /* 执行上传图片的action名称 */ + "imageFieldName": "upfile", /* 提交的图片表单名称 */ + "imageMaxSize": 2048000, /* 上传大小限制,单位B */ + "imageAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 上传图片格式显示 */ + "imageCompressEnable": true, /* 是否压缩图片,默认是true */ + "imageCompressBorder": 1600, /* 图片压缩最长边限制 */ + "imageInsertAlign": "none", /* 插入的图片浮动方式 */ + "imageUrlPrefix": "", /* 图片访问路径前缀 */ + "imagePathFormat": "/ueditor/php/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + /* {filename} 会替换成原文件名,配置这项需要注意中文乱码问题 */ + /* {rand:6} 会替换成随机数,后面的数字是随机数的位数 */ + /* {time} 会替换成时间戳 */ + /* {yyyy} 会替换成四位年份 */ + /* {yy} 会替换成两位年份 */ + /* {mm} 会替换成两位月份 */ + /* {dd} 会替换成两位日期 */ + /* {hh} 会替换成两位小时 */ + /* {ii} 会替换成两位分钟 */ + /* {ss} 会替换成两位秒 */ + /* 非法字符 \ : * ? " < > | */ + /* 具请体看线上文档: fex.baidu.com/ueditor/#use-format_upload_filename */ + + /* 涂鸦图片上传配置项 */ + "scrawlActionName": "uploadscrawl", /* 执行上传涂鸦的action名称 */ + "scrawlFieldName": "upfile", /* 提交的图片表单名称 */ + "scrawlPathFormat": "/ueditor/php/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "scrawlMaxSize": 2048000, /* 上传大小限制,单位B */ + "scrawlUrlPrefix": "", /* 图片访问路径前缀 */ + "scrawlInsertAlign": "none", + + /* 截图工具上传 */ + "snapscreenActionName": "uploadimage", /* 执行上传截图的action名称 */ + "snapscreenPathFormat": "/ueditor/php/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "snapscreenUrlPrefix": "", /* 图片访问路径前缀 */ + "snapscreenInsertAlign": "none", /* 插入的图片浮动方式 */ + + /* 抓取远程图片配置 */ + "catcherLocalDomain": ["127.0.0.1", "localhost", "img.baidu.com"], + "catcherActionName": "catchimage", /* 执行抓取远程图片的action名称 */ + "catcherFieldName": "source", /* 提交的图片列表表单名称 */ + "catcherPathFormat": "/ueditor/php/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "catcherUrlPrefix": "", /* 图片访问路径前缀 */ + "catcherMaxSize": 2048000, /* 上传大小限制,单位B */ + "catcherAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 抓取图片格式显示 */ + + /* 上传视频配置 */ + "videoActionName": "uploadvideo", /* 执行上传视频的action名称 */ + "videoFieldName": "upfile", /* 提交的视频表单名称 */ + "videoPathFormat": "/ueditor/php/upload/video/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "videoUrlPrefix": "", /* 视频访问路径前缀 */ + "videoMaxSize": 102400000, /* 上传大小限制,单位B,默认100MB */ + "videoAllowFiles": [ + ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg", + ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid"], /* 上传视频格式显示 */ + + /* 上传文件配置 */ + "fileActionName": "uploadfile", /* controller里,执行上传视频的action名称 */ + "fileFieldName": "upfile", /* 提交的文件表单名称 */ + "filePathFormat": "/ueditor/php/upload/file/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "fileUrlPrefix": "", /* 文件访问路径前缀 */ + "fileMaxSize": 51200000, /* 上传大小限制,单位B,默认50MB */ + "fileAllowFiles": [ + ".png", ".jpg", ".jpeg", ".gif", ".bmp", + ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg", + ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid", + ".rar", ".zip", ".tar", ".gz", ".7z", ".bz2", ".cab", ".iso", + ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf", ".txt", ".md", ".xml" + ], /* 上传文件格式显示 */ + + /* 列出指定目录下的图片 */ + "imageManagerActionName": "listimage", /* 执行图片管理的action名称 */ + "imageManagerListPath": "/ueditor/php/upload/image/", /* 指定要列出图片的目录 */ + "imageManagerListSize": 20, /* 每次列出文件数量 */ + "imageManagerUrlPrefix": "", /* 图片访问路径前缀 */ + "imageManagerInsertAlign": "none", /* 插入的图片浮动方式 */ + "imageManagerAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 列出的文件类型 */ + + /* 列出指定目录下的文件 */ + "fileManagerActionName": "listfile", /* 执行文件管理的action名称 */ + "fileManagerListPath": "/ueditor/php/upload/file/", /* 指定要列出文件的目录 */ + "fileManagerUrlPrefix": "", /* 文件访问路径前缀 */ + "fileManagerListSize": 20, /* 每次列出文件数量 */ + "fileManagerAllowFiles": [ + ".png", ".jpg", ".jpeg", ".gif", ".bmp", + ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg", + ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid", + ".rar", ".zip", ".tar", ".gz", ".7z", ".bz2", ".cab", ".iso", + ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf", ".txt", ".md", ".xml" + ] /* 列出的文件类型 */ + +} \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/php/controller.php b/nezha-fronted/static/ueditor-1.4.3.3/php/controller.php new file mode 100644 index 000000000..feac890ce --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/php/controller.php @@ -0,0 +1,59 @@ + '请求地址出错' + )); + break; +} + +/* 输出结果 */ +if (isset($_GET["callback"])) { + if (preg_match("/^[\w_]+$/", $_GET["callback"])) { + echo htmlspecialchars($_GET["callback"]) . '(' . $result . ')'; + } else { + echo json_encode(array( + 'state'=> 'callback参数不合法' + )); + } +} else { + echo $result; +} \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/autotypesetpicker.css b/nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/autotypesetpicker.css new file mode 100644 index 000000000..72c4c76cd --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/button.css b/nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/button.css new file mode 100644 index 000000000..722639fd2 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/buttonicon.css b/nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/buttonicon.css new file mode 100644 index 000000000..ee086e9ab --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/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; +} \ No newline at end of file diff --git a/nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/cellalignpicker.css b/nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/cellalignpicker.css new file mode 100644 index 000000000..9f5aa5ca5 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/colorbutton.css b/nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/colorbutton.css new file mode 100644 index 000000000..791c61d96 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/colorpicker.css b/nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/colorpicker.css new file mode 100644 index 000000000..fae12192c --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/combox.css b/nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/combox.css new file mode 100644 index 000000000..796c1c09d --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/contextmenu.css b/nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/contextmenu.css new file mode 100644 index 000000000..366e653a5 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/dialog.css b/nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/dialog.css new file mode 100644 index 000000000..42e9855b2 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/editor.css b/nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/editor.css new file mode 100644 index 000000000..de6af7ab6 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/menu.css b/nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/menu.css new file mode 100644 index 000000000..92bf7aaef --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/menubutton.css b/nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/menubutton.css new file mode 100644 index 000000000..966519214 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/message.css b/nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/message.css new file mode 100644 index 000000000..3088efd6d --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/multiMenu.css b/nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/multiMenu.css new file mode 100644 index 000000000..78f354b7f --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/paragraphpicker.css b/nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/paragraphpicker.css new file mode 100644 index 000000000..9118c0632 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/pastepicker.css b/nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/pastepicker.css new file mode 100644 index 000000000..73c5b9556 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/popup.css b/nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/popup.css new file mode 100644 index 000000000..bb4c50cc2 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/popup.css @@ -0,0 +1,73 @@ +/* 弹出菜单 */ +.edui-default .edui-popup { + z-index: 3000; + background-color: #ffffff; + width:auto; + height:auto; + +} + +.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/nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/separtor.css b/nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/separtor.css new file mode 100644 index 000000000..f932a60d4 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/shortcutmenu.css b/nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/shortcutmenu.css new file mode 100644 index 000000000..ec4a81ac9 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/splitbutton.css b/nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/splitbutton.css new file mode 100644 index 000000000..ef7667260 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/tablepicker.css b/nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/tablepicker.css new file mode 100644 index 000000000..34232ed22 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/toolbar.css b/nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/toolbar.css new file mode 100644 index 000000000..9f7db121d --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/ueditor.css b/nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/ueditor.css new file mode 100644 index 000000000..fee7d8323 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/uibase.css b/nezha-fronted/static/ueditor-1.4.3.3/themes/default/_css/uibase.css new file mode 100644 index 000000000..6be464c36 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/themes/default/dialogbase.css b/nezha-fronted/static/ueditor-1.4.3.3/themes/default/dialogbase.css new file mode 100644 index 000000000..cd663d5de --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/anchor.gif b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/arrow_down.png b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/arrow_up.png b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/button-bg.gif b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/cancelbutton.gif b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/cursor_h.gif b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/cursor_v.gif b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/filescan.png b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/highlighted.gif b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/icons-all.gif b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/icons.png b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/loaderror.png b/nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/loaderror.png new file mode 100644 index 0000000000000000000000000000000000000000..35ff3336457d48dbecbc11698ef8245441a94f82 GIT binary patch literal 3209 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 literal 0 HcmV?d00001 diff --git a/nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/loading.gif b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/pagebreak.gif b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/sortable.png b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/spacer.gif b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/sparator_v.png b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/table-cell-align.png b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/toolbar_bg.png b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/unhighlighted.gif b/nezha-fronted/static/ueditor-1.4.3.3/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/nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/upload.png b/nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/upload.png new file mode 100644 index 0000000000000000000000000000000000000000..08d4d9268204a20ca343bf75784302cc706d2417 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/word.gif b/nezha-fronted/static/ueditor-1.4.3.3/themes/default/images/word.gif new file mode 100644 index 0000000000000000000000000000000000000000..9ef5d09b7b30c4f3225f77788462e429cc494b9b GIT binary patch literal 1019 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 bp?H9uNI6(~=EJQ&zcn<}bW|&qZNmQtXU+rA literal 0 HcmV?d00001 diff --git a/nezha-fronted/static/ueditor-1.4.3.3/themes/iframe.css b/nezha-fronted/static/ueditor-1.4.3.3/themes/iframe.css new file mode 100644 index 000000000..774013afd --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/themes/iframe.css @@ -0,0 +1 @@ +/*可以在这里添加你自己的css*/ diff --git a/nezha-fronted/static/ueditor-1.4.3.3/third-party/SyntaxHighlighter/shCore.js b/nezha-fronted/static/ueditor-1.4.3.3/third-party/SyntaxHighlighter/shCore.js new file mode 100644 index 000000000..324918425 --- /dev/null +++ b/nezha-fronted/static/ueditor-1.4.3.3/third-party/SyntaxHighlighter/shCore.js @@ -0,0 +1,3655 @@ +// 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 '); + } +})();

        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�CS+w$qSLs@@#8?7y%xfv*Tcppx%N|e_~tc<&GD-b ze|kdKKfnz>dmU_+ymuX-sYkgV_g@q4dG|p_s!q@XF8~L0M_`i= zmCNvezbaMtfFRh00q_00#4rXETBB`IE>tUP#RWdv>;yLA5Udx-Nkfnj)+^M5pI`%n zA>5EkzyJ*vXB72?op6AiXp_fVq6#x|fRyJV+9$nHZr9*~X|*UD+S!CO zUs4_XLjyc#UiHsmW$CU}72wva`6h4WFV`&krpSfVyYx>MGAM0ML#?1S_O-cTUG54y zwKQvD)cm;4ZbO7sr_)brk+rUTL#SG)Gns0h)_}5kVx8g&Qngf@ocK*%EH9d{6ZgX( zmSXPbT1fIRsIGp}EE9Ti{ipG}{jWCpcgi0>M^W%oH__n%E_tK20W$keY=i!^diB_Q z$qSceFsaxV{R@GuTZ0H@{sfXm0F_k45;PV2&u^|5c+0t&d&I2}k{p@<=8Pibav~e+ zHX}T~!ClbasRvFs<&Jg?4vw{5xr$bv0iIC;@u!{8OhTX+8Q1>X24{@=C;(KD4cCsY zjXj!%x^GDCO`G^&!t~M|SfCaz{cu;Z=vCK#P<*T$2^*6gkCSUYzwM(3jlnFVmy1lC?Eb_$*xNDt26p+HsxE)31q);zx|V4 zD0v}h{2&516UpcIKqED)=@-6GN-yaOz4RU6vP1JPyoYda!sv@P;!UU)^xFtI?#TEw zK--~5{zZnC7AGb%>^FR6I$z_O6-HAC4G)BI?x=y5bc72)UC-d^YB^F$GxW&J_wg@1 z6e@lr3SZ+55Wdl~{Sg*x;n>$E`r9x@3=(v1rUV;%k?fGjjvLrzD_SON*K2{cy>fFd z^@-}>9d>#iR(=wJ?L)Fe7ls{9#@SKo9_TD}{Yi*xhaB$?240pI#>tPF;2c@Z2xxPk zRg=#fABD<|R%0c~_0>A<=EkeBQoE2&hTtrR2p$Lbm782{PCbo#=$l+0 z#CT&mUq^^@ot160cFk|$AG;-C{eTzTv1LJ&;a}wd7qk%|g!4Oohm7OF*Utpp4tA47 z2IifMAT9>L$lcK%GZj@xwxt0|x$$KGx+;P#dd!3^z&@NCDImwW=wz37!GUo>A?#U7 z#3Ld;2VHDNy2w<8=6U@%wf@9C^K(uLfgyaec*5-)O!Qz|asy2)|75uv=|qr4KLyb45~`J$h1 zY@FmS7~Rqm7j4l7*FuSsd*t>k2SE+5fRkJV_nqO8%^ijR!iE1r4Ew=%*q5Wx3d^1u zIUIyj?Z~K;1@QE3T;hmZa; zdW~$j%(%W3ssY;%J>o;}MUcA{eHxV1mJoC)nXsju+!c8{jPWJRI&`R`zLV78)ZK=> zlyrPPyyi4uy(CXMb#ME$1<=v0$xTd$q1mZ2tiPwHjLW@0DEX$z)!?idEz{DQZfYfN zS*)(+j|ZG_$@AWelAhnAqxEHS=z5nqEwpl8f%?LqJh7Zg6Crf%~XWfrXUE7r(mE1}Tbkm<02MYMR`aZ63 z-veRUKU|!t5eLeWgei!fKql>FYY%R&vJW@q_iDQ@^KAGaXMq)YVUaGpPfKiqoxXpJ zFVP0zeVC5V(YjVyFevi75yE`;9d20;(b(o;*po?{{ObKUpK#*4ApHxw Kikr^L6 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 UdB`$dV-3 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%0AjsWbWhw- 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 &dd1xJWx2 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%0D~jK?}nG(SK>~o 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