diff --git a/package-lock.json b/package-lock.json
index 4c2e0cc..462544a 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1630,8 +1630,7 @@
"ansi-regex": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
- "dev": true
+ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
},
"ansi-styles": {
"version": "3.2.1",
@@ -2484,8 +2483,7 @@
"camelcase": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
- "dev": true
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
},
"camelcase-keys": {
"version": "2.1.0",
@@ -2725,7 +2723,6 @@
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
"integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
- "dev": true,
"requires": {
"string-width": "^3.1.0",
"strip-ansi": "^5.2.0",
@@ -2735,14 +2732,12 @@
"emoji-regex": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
- "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
- "dev": true
+ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA=="
},
"string-width": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
"integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
- "dev": true,
"requires": {
"emoji-regex": "^7.0.1",
"is-fullwidth-code-point": "^2.0.0",
@@ -2753,7 +2748,6 @@
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
"integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
- "dev": true,
"requires": {
"ansi-styles": "^3.2.0",
"string-width": "^3.0.0",
@@ -5551,8 +5545,7 @@
"get-caller-file": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
- "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
- "dev": true
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
},
"get-stdin": {
"version": "4.0.1",
@@ -6513,7 +6506,8 @@
"has-symbols": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
- "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg=="
+ "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
+ "dev": true
},
"has-unicode": {
"version": "2.0.1",
@@ -8486,9 +8480,9 @@
}
},
"node-sass": {
- "version": "4.14.0",
- "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.14.0.tgz",
- "integrity": "sha512-AxqU+DFpk0lEz95sI6jO0hU0Rwyw7BXVEv6o9OItoXLyeygPeaSpiV4rwQb10JiTghHaa0gZeD21sz+OsQluaw==",
+ "version": "4.14.1",
+ "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.14.1.tgz",
+ "integrity": "sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g==",
"requires": {
"async-foreach": "^0.1.3",
"chalk": "^1.1.1",
@@ -8504,7 +8498,7 @@
"node-gyp": "^3.8.0",
"npmlog": "^4.0.0",
"request": "^2.88.0",
- "sass-graph": "^2.2.4",
+ "sass-graph": "2.2.5",
"stdout-stream": "^1.4.0",
"true-case-path": "^1.0.2"
},
@@ -8720,6 +8714,7 @@
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
"integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
+ "dev": true,
"requires": {
"define-properties": "^1.1.2",
"function-bind": "^1.1.1",
@@ -9104,8 +9099,7 @@
"path-exists": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
- "dev": true
+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
},
"path-is-absolute": {
"version": "1.0.1",
@@ -10684,8 +10678,7 @@
"require-main-filename": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
- "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
- "dev": true
+ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
},
"requires-port": {
"version": "1.0.0",
@@ -10829,139 +10822,93 @@
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"sass-graph": {
- "version": "2.2.6",
- "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.6.tgz",
- "integrity": "sha512-MKuEYXFSGuRSi8FZ3A7imN1CeVn9Gpw0/SFJKdL1ejXJneI9a5rwlEZrKejhEFAA3O6yr3eIyl/WuvASvlT36g==",
+ "version": "2.2.5",
+ "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz",
+ "integrity": "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==",
"requires": {
"glob": "^7.0.0",
"lodash": "^4.0.0",
"scss-tokenizer": "^0.2.3",
- "yargs": "^7.0.0"
+ "yargs": "^13.3.2"
},
"dependencies": {
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA=="
+ "emoji-regex": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
+ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA=="
},
- "camelcase": {
+ "find-up": {
"version": "3.0.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
- "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg=="
- },
- "cliui": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
- "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
"requires": {
- "string-width": "^1.0.1",
- "strip-ansi": "^3.0.1",
- "wrap-ansi": "^2.0.0"
+ "locate-path": "^3.0.0"
}
},
- "get-caller-file": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
- "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w=="
- },
- "invert-kv": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
- "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ=="
- },
- "is-fullwidth-code-point": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
- "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==",
+ "locate-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
"requires": {
- "number-is-nan": "^1.0.0"
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
}
},
- "lcid": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
- "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==",
+ "p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"requires": {
- "invert-kv": "^1.0.0"
+ "p-try": "^2.0.0"
}
},
- "os-locale": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
- "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==",
+ "p-locate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
"requires": {
- "lcid": "^1.0.0"
+ "p-limit": "^2.0.0"
}
},
- "require-main-filename": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
- "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug=="
+ "p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
},
"string-width": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
- "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==",
- "requires": {
- "code-point-at": "^1.0.0",
- "is-fullwidth-code-point": "^1.0.0",
- "strip-ansi": "^3.0.0"
- }
- },
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- },
- "which-module": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz",
- "integrity": "sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ=="
- },
- "wrap-ansi": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
- "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+ "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
"requires": {
- "string-width": "^1.0.1",
- "strip-ansi": "^3.0.1"
+ "emoji-regex": "^7.0.1",
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^5.1.0"
}
},
- "y18n": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz",
- "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ=="
- },
"yargs": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.2.tgz",
- "integrity": "sha512-ZEjj/dQYQy0Zx0lgLMLR8QuaqTihnxirir7EwUHp1Axq4e3+k8jXU5K0VLbNvedv1f4EWtBonDIZm0NUr+jCcA==",
+ "version": "13.3.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
+ "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
"requires": {
- "camelcase": "^3.0.0",
- "cliui": "^3.2.0",
- "decamelize": "^1.1.1",
- "get-caller-file": "^1.0.1",
- "os-locale": "^1.4.0",
- "read-pkg-up": "^1.0.1",
+ "cliui": "^5.0.0",
+ "find-up": "^3.0.0",
+ "get-caller-file": "^2.0.1",
"require-directory": "^2.1.1",
- "require-main-filename": "^1.0.1",
+ "require-main-filename": "^2.0.0",
"set-blocking": "^2.0.0",
- "string-width": "^1.0.2",
- "which-module": "^1.0.0",
- "y18n": "^3.2.1",
- "yargs-parser": "^5.0.1"
+ "string-width": "^3.0.0",
+ "which-module": "^2.0.0",
+ "y18n": "^4.0.0",
+ "yargs-parser": "^13.1.2"
}
},
"yargs-parser": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.1.tgz",
- "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==",
+ "version": "13.1.2",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
+ "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
"requires": {
- "camelcase": "^3.0.0",
- "object.assign": "^4.1.0"
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
}
}
}
@@ -11862,7 +11809,6 @@
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
"integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "dev": true,
"requires": {
"ansi-regex": "^4.1.0"
}
@@ -13263,8 +13209,7 @@
"which-module": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
- "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
- "dev": true
+ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
},
"wide-align": {
"version": "1.1.5",
@@ -13395,8 +13340,7 @@
"y18n": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
- "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
- "dev": true
+ "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w=="
},
"yallist": {
"version": "3.1.1",
diff --git a/package.json b/package.json
index 4def737..5b215d1 100644
--- a/package.json
+++ b/package.json
@@ -36,7 +36,7 @@
"@vue/cli-plugin-babel": "^3.9.0",
"@vue/cli-service": "^3.9.0",
"element-theme-chalk": "^2.13.0",
- "node-sass": "^4.14.0",
+ "node-sass": "^4.14.1",
"sass-loader": "^8.0.0",
"vue-template-compiler": "^2.6.10"
}
diff --git a/public/styles/tinymce/langs/zh_CN.js b/public/styles/tinymce/langs/zh_CN.js
index 25740bc..74ad47b 100644
--- a/public/styles/tinymce/langs/zh_CN.js
+++ b/public/styles/tinymce/langs/zh_CN.js
@@ -218,6 +218,7 @@ tinymce.addI18n('zh_CN', {
"Top": "上方对齐",
"Middle": "居中对齐",
"Bottom": "下方对齐",
+"Format Painter": "格式刷",
"Header cell": "表头单元格",
"Row group": "行组",
"Column group": "列组",
diff --git a/public/styles/tinymce/plugins/formatpainter/plugin.min.js b/public/styles/tinymce/plugins/formatpainter/plugin.min.js
new file mode 100644
index 0000000..055e9c7
--- /dev/null
+++ b/public/styles/tinymce/plugins/formatpainter/plugin.min.js
@@ -0,0 +1 @@
+!function(l){"use strict";var e,r,n,t,o,i,m,a,d,u,c,s,v,f,p=function(e){var r=e,n=function(){return r};return{get:n,set:function(e){r=e},clone:function(){return p(n())}}},g=function(e){return parseInt(e,10)},h=function(e,r,n){return{major:e,minor:r,patch:n}},b=function(e){var r=/([0-9]+)\.([0-9]+)\.([0-9]+)(?:(\-.+)?)/.exec(e);return r?h(g(r[1]),g(r[2]),g(r[3])):h(0,0,0)},y=function(e,r){var n=e-r;return 0===n?0:0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/public/ueditor/dialogs/attachment/attachment.css b/public/ueditor/dialogs/attachment/attachment.css
new file mode 100644
index 0000000..9c61716
--- /dev/null
+++ b/public/ueditor/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: 15px;
+ color: #555555;
+ text-align: center;
+ width: 107px;
+ white-space: nowrap;
+ word-break: break-all;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+#online li .icon {
+ cursor: pointer;
+ width: 113px;
+ height: 113px;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 2;
+ border: 0;
+ background-repeat: no-repeat;
+}
+#online li .icon:hover {
+ width: 107px;
+ height: 107px;
+ border: 3px solid #1094fa;
+}
+#online li.selected .icon {
+ background-image: url(images/success.png);
+ background-image: url(images/success.gif) \9;
+ background-position: 75px 75px;
+}
+#online li.selected .icon:hover {
+ width: 107px;
+ height: 107px;
+ border: 3px solid #1094fa;
+ background-position: 72px 72px;
+}
+
+
+/* 在线文件的文件预览图标 */
+i.file-preview {
+ display: block;
+ margin: 10px auto;
+ width: 70px;
+ height: 70px;
+ background-image: url("./images/file-icons.png");
+ background-image: url("./images/file-icons.gif") \9;
+ background-position: -140px center;
+ background-repeat: no-repeat;
+}
+i.file-preview.file-type-dir{
+ background-position: 0 center;
+}
+i.file-preview.file-type-file{
+ background-position: -140px center;
+}
+i.file-preview.file-type-filelist{
+ background-position: -210px center;
+}
+i.file-preview.file-type-zip,
+i.file-preview.file-type-rar,
+i.file-preview.file-type-7z,
+i.file-preview.file-type-tar,
+i.file-preview.file-type-gz,
+i.file-preview.file-type-bz2{
+ background-position: -280px center;
+}
+i.file-preview.file-type-xls,
+i.file-preview.file-type-xlsx{
+ background-position: -350px center;
+}
+i.file-preview.file-type-doc,
+i.file-preview.file-type-docx{
+ background-position: -420px center;
+}
+i.file-preview.file-type-ppt,
+i.file-preview.file-type-pptx{
+ background-position: -490px center;
+}
+i.file-preview.file-type-vsd{
+ background-position: -560px center;
+}
+i.file-preview.file-type-pdf{
+ background-position: -630px center;
+}
+i.file-preview.file-type-txt,
+i.file-preview.file-type-md,
+i.file-preview.file-type-json,
+i.file-preview.file-type-htm,
+i.file-preview.file-type-xml,
+i.file-preview.file-type-html,
+i.file-preview.file-type-js,
+i.file-preview.file-type-css,
+i.file-preview.file-type-php,
+i.file-preview.file-type-jsp,
+i.file-preview.file-type-asp{
+ background-position: -700px center;
+}
+i.file-preview.file-type-apk{
+ background-position: -770px center;
+}
+i.file-preview.file-type-exe{
+ background-position: -840px center;
+}
+i.file-preview.file-type-ipa{
+ background-position: -910px center;
+}
+i.file-preview.file-type-mp4,
+i.file-preview.file-type-swf,
+i.file-preview.file-type-mkv,
+i.file-preview.file-type-avi,
+i.file-preview.file-type-flv,
+i.file-preview.file-type-mov,
+i.file-preview.file-type-mpg,
+i.file-preview.file-type-mpeg,
+i.file-preview.file-type-ogv,
+i.file-preview.file-type-webm,
+i.file-preview.file-type-rm,
+i.file-preview.file-type-rmvb{
+ background-position: -980px center;
+}
+i.file-preview.file-type-ogg,
+i.file-preview.file-type-wav,
+i.file-preview.file-type-wmv,
+i.file-preview.file-type-mid,
+i.file-preview.file-type-mp3{
+ background-position: -1050px center;
+}
+i.file-preview.file-type-jpg,
+i.file-preview.file-type-jpeg,
+i.file-preview.file-type-gif,
+i.file-preview.file-type-bmp,
+i.file-preview.file-type-png,
+i.file-preview.file-type-psd{
+ background-position: -140px center;
+}
diff --git a/public/ueditor/dialogs/attachment/attachment.html b/public/ueditor/dialogs/attachment/attachment.html
new file mode 100644
index 0000000..2ae9282
--- /dev/null
+++ b/public/ueditor/dialogs/attachment/attachment.html
@@ -0,0 +1,60 @@
+
+
+
+
+ ueditor图片对话框
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/public/ueditor/dialogs/attachment/attachment.js b/public/ueditor/dialogs/attachment/attachment.js
new file mode 100644
index 0000000..5e73d5e
--- /dev/null
+++ b/public/ueditor/dialogs/attachment/attachment.js
@@ -0,0 +1,760 @@
+/**
+ * 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 = $('
' +
+ '' + file.name + '
' +
+ '' +
+ '
' +
+ ''),
+
+ $btns = $('
' +
+ '' + lang.uploadDelete + '' +
+ '' + lang.uploadTurnRight + '' +
+ '' + lang.uploadTurnLeft + '
').appendTo($li),
+ $prgress = $li.find('p.progress span'),
+ $wrap = $li.find('p.imgWrap'),
+ $info = $('
').hide().appendTo($li),
+
+ showError = function (code) {
+ switch (code) {
+ case 'exceed_size':
+ text = lang.errorExceedSize;
+ break;
+ case 'interrupt':
+ text = lang.errorInterrupt;
+ break;
+ case 'http':
+ text = lang.errorHttp;
+ break;
+ case 'not_allow_type':
+ text = lang.errorFileType;
+ break;
+ default:
+ text = lang.errorUploadRetry;
+ break;
+ }
+ $info.text(text).show();
+ };
+
+ if (file.getStatus() === 'invalid') {
+ showError(file.statusText);
+ } else {
+ $wrap.text(lang.uploadPreview);
+ if ('|png|jpg|jpeg|bmp|gif|'.indexOf('|'+file.ext.toLowerCase()+'|') == -1) {
+ $wrap.empty().addClass('notimage').append('
' +
+ '
' + file.name + '');
+ } else {
+ if (browser.ie && browser.version <= 7) {
+ $wrap.text(lang.uploadNoPreview);
+ } else {
+ uploader.makeThumb(file, function (error, src) {
+ if (error || !src) {
+ $wrap.text(lang.uploadNoPreview);
+ } else {
+ var $img = $('
');
+ $wrap.empty().append($img);
+ $img.on('error', function () {
+ $wrap.text(lang.uploadNoPreview);
+ });
+ }
+ }, thumbnailWidth, thumbnailHeight);
+ }
+ }
+ percentages[ file.id ] = [ file.size, 0 ];
+ file.rotation = 0;
+
+ /* 检查文件格式 */
+ if (!file.ext || acceptExtensions.indexOf(file.ext.toLowerCase()) == -1) {
+ showError('not_allow_type');
+ uploader.removeFile(file);
+ }
+ }
+
+ file.on('statuschange', function (cur, prev) {
+ if (prev === 'progress') {
+ $prgress.hide().width(0);
+ } else if (prev === 'queued') {
+ $li.off('mouseenter mouseleave');
+ $btns.remove();
+ }
+ // 成功
+ if (cur === 'error' || cur === 'invalid') {
+ showError(file.statusText);
+ percentages[ file.id ][ 1 ] = 1;
+ } else if (cur === 'interrupt') {
+ showError('interrupt');
+ } else if (cur === 'queued') {
+ percentages[ file.id ][ 1 ] = 0;
+ } else if (cur === 'progress') {
+ $info.hide();
+ $prgress.css('display', 'block');
+ } else if (cur === 'complete') {
+ }
+
+ $li.removeClass('state-' + prev).addClass('state-' + cur);
+ });
+
+ $li.on('mouseenter', function () {
+ $btns.stop().animate({height: 30});
+ });
+ $li.on('mouseleave', function () {
+ $btns.stop().animate({height: 0});
+ });
+
+ $btns.on('click', 'span', function () {
+ var index = $(this).index(),
+ deg;
+
+ switch (index) {
+ case 0:
+ uploader.removeFile(file);
+ return;
+ case 1:
+ file.rotation += 90;
+ break;
+ case 2:
+ file.rotation -= 90;
+ break;
+ }
+
+ if (supportTransition) {
+ deg = 'rotate(' + file.rotation + 'deg)';
+ $wrap.css({
+ '-webkit-transform': deg,
+ '-mos-transform': deg,
+ '-o-transform': deg,
+ 'transform': deg
+ });
+ } else {
+ $wrap.css('filter', 'progid:DXImageTransform.Microsoft.BasicImage(rotation=' + (~~((file.rotation / 90) % 4 + 4) % 4) + ')');
+ }
+
+ });
+
+ $li.insertBefore($filePickerBlock);
+ }
+
+ // 负责view的销毁
+ function removeFile(file) {
+ var $li = $('#' + file.id);
+ delete percentages[ file.id ];
+ updateTotalProgress();
+ $li.off().find('.file-panel').off().end().remove();
+ }
+
+ function updateTotalProgress() {
+ var loaded = 0,
+ total = 0,
+ spans = $progress.children(),
+ percent;
+
+ $.each(percentages, function (k, v) {
+ total += v[ 0 ];
+ loaded += v[ 0 ] * v[ 1 ];
+ });
+
+ percent = total ? loaded / total : 0;
+
+ spans.eq(0).text(Math.round(percent * 100) + '%');
+ spans.eq(1).css('width', Math.round(percent * 100) + '%');
+ updateStatus();
+ }
+
+ function setState(val, files) {
+
+ if (val != state) {
+
+ var stats = uploader.getStats();
+
+ $upload.removeClass('state-' + state);
+ $upload.addClass('state-' + val);
+
+ switch (val) {
+
+ /* 未选择文件 */
+ case 'pedding':
+ $queue.addClass('element-invisible');
+ $statusBar.addClass('element-invisible');
+ $placeHolder.removeClass('element-invisible');
+ $progress.hide(); $info.hide();
+ uploader.refresh();
+ break;
+
+ /* 可以开始上传 */
+ case 'ready':
+ $placeHolder.addClass('element-invisible');
+ $queue.removeClass('element-invisible');
+ $statusBar.removeClass('element-invisible');
+ $progress.hide(); $info.show();
+ $upload.text(lang.uploadStart);
+ uploader.refresh();
+ break;
+
+ /* 上传中 */
+ case 'uploading':
+ $progress.show(); $info.hide();
+ $upload.text(lang.uploadPause);
+ break;
+
+ /* 暂停上传 */
+ case 'paused':
+ $progress.show(); $info.hide();
+ $upload.text(lang.uploadContinue);
+ break;
+
+ case 'confirm':
+ $progress.show(); $info.hide();
+ $upload.text(lang.uploadStart);
+
+ stats = uploader.getStats();
+ if (stats.successNum && !stats.uploadFailNum) {
+ setState('finish');
+ return;
+ }
+ break;
+
+ case 'finish':
+ $progress.hide(); $info.show();
+ if (stats.uploadFailNum) {
+ $upload.text(lang.uploadRetry);
+ } else {
+ $upload.text(lang.uploadStart);
+ }
+ break;
+ }
+
+ state = val;
+ updateStatus();
+
+ }
+
+ if (!_this.getQueueCount()) {
+ $upload.addClass('disabled')
+ } else {
+ $upload.removeClass('disabled')
+ }
+
+ }
+
+ function updateStatus() {
+ var text = '', stats;
+
+ if (state === 'ready') {
+ text = lang.updateStatusReady.replace('_', fileCount).replace('_KB', WebUploader.formatSize(fileSize));
+ } else if (state === 'confirm') {
+ stats = uploader.getStats();
+ if (stats.uploadFailNum) {
+ text = lang.updateStatusConfirm.replace('_', stats.successNum).replace('_', stats.successNum);
+ }
+ } else {
+ stats = uploader.getStats();
+ text = lang.updateStatusFinish.replace('_', fileCount).
+ replace('_KB', WebUploader.formatSize(fileSize)).
+ replace('_', stats.successNum);
+
+ if (stats.uploadFailNum) {
+ text += lang.updateStatusError.replace('_', stats.uploadFailNum);
+ }
+ }
+
+ $info.html(text);
+ }
+
+ uploader.on('fileQueued', function (file) {
+ if (file.ext && acceptExtensions.indexOf(file.ext.toLowerCase()) != -1 && file.size <= fileMaxSize) {
+ fileCount++;
+ fileSize += file.size;
+ }
+
+ if (fileCount === 1) {
+ $placeHolder.addClass('element-invisible');
+ $statusBar.show();
+ }
+
+ addFile(file);
+ });
+
+ uploader.on('fileDequeued', function (file) {
+ if (file.ext && acceptExtensions.indexOf(file.ext.toLowerCase()) != -1 && file.size <= fileMaxSize) {
+ fileCount--;
+ fileSize -= file.size;
+ }
+
+ removeFile(file);
+ updateTotalProgress();
+ });
+
+ uploader.on('filesQueued', function (file) {
+ if (!uploader.isInProgress() && (state == 'pedding' || state == 'finish' || state == 'confirm' || state == 'ready')) {
+ setState('ready');
+ }
+ updateTotalProgress();
+ });
+
+ uploader.on('all', function (type, files) {
+ switch (type) {
+ case 'uploadFinished':
+ setState('confirm', files);
+ break;
+ case 'startUpload':
+ /* 添加额外的GET参数 */
+ var params = utils.serializeParam(editor.queryCommandValue('serverparam')) || '',
+ url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?':'&') + 'encode=utf-8&' + params);
+ uploader.option('server', url);
+ setState('uploading', files);
+ break;
+ case 'stopUpload':
+ setState('paused', files);
+ break;
+ }
+ });
+
+ uploader.on('uploadBeforeSend', function (file, data, header) {
+ //这里可以通过data对象添加POST参数
+ if (actionUrl.toLowerCase().indexOf('jsp') != -1) {
+ header['X_Requested_With'] = 'XMLHttpRequest';
+ }
+ });
+
+ uploader.on('uploadProgress', function (file, percentage) {
+ var $li = $('#' + file.id),
+ $percent = $li.find('.progress span');
+
+ $percent.css('width', percentage * 100 + '%');
+ percentages[ file.id ][ 1 ] = percentage;
+ updateTotalProgress();
+ });
+
+ uploader.on('uploadSuccess', function (file, ret) {
+ var $file = $('#' + file.id);
+ try {
+ var responseText = (ret._raw || ret),
+ json = utils.str2json(responseText);
+ 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;
+ }
+ };
+
+
+})();
diff --git a/public/ueditor/dialogs/attachment/fileTypeImages/icon_chm.gif b/public/ueditor/dialogs/attachment/fileTypeImages/icon_chm.gif
new file mode 100644
index 0000000..9ca4fb6
Binary files /dev/null and b/public/ueditor/dialogs/attachment/fileTypeImages/icon_chm.gif differ
diff --git a/public/ueditor/dialogs/attachment/fileTypeImages/icon_default.png b/public/ueditor/dialogs/attachment/fileTypeImages/icon_default.png
new file mode 100644
index 0000000..50ac1cb
Binary files /dev/null and b/public/ueditor/dialogs/attachment/fileTypeImages/icon_default.png differ
diff --git a/public/ueditor/dialogs/attachment/fileTypeImages/icon_doc.gif b/public/ueditor/dialogs/attachment/fileTypeImages/icon_doc.gif
new file mode 100644
index 0000000..206fede
Binary files /dev/null and b/public/ueditor/dialogs/attachment/fileTypeImages/icon_doc.gif differ
diff --git a/public/ueditor/dialogs/attachment/fileTypeImages/icon_exe.gif b/public/ueditor/dialogs/attachment/fileTypeImages/icon_exe.gif
new file mode 100644
index 0000000..2e3b7a2
Binary files /dev/null and b/public/ueditor/dialogs/attachment/fileTypeImages/icon_exe.gif differ
diff --git a/public/ueditor/dialogs/attachment/fileTypeImages/icon_jpg.gif b/public/ueditor/dialogs/attachment/fileTypeImages/icon_jpg.gif
new file mode 100644
index 0000000..5d5dec0
Binary files /dev/null and b/public/ueditor/dialogs/attachment/fileTypeImages/icon_jpg.gif differ
diff --git a/public/ueditor/dialogs/attachment/fileTypeImages/icon_mp3.gif b/public/ueditor/dialogs/attachment/fileTypeImages/icon_mp3.gif
new file mode 100644
index 0000000..b351a1f
Binary files /dev/null and b/public/ueditor/dialogs/attachment/fileTypeImages/icon_mp3.gif differ
diff --git a/public/ueditor/dialogs/attachment/fileTypeImages/icon_mv.gif b/public/ueditor/dialogs/attachment/fileTypeImages/icon_mv.gif
new file mode 100644
index 0000000..26019b0
Binary files /dev/null and b/public/ueditor/dialogs/attachment/fileTypeImages/icon_mv.gif differ
diff --git a/public/ueditor/dialogs/attachment/fileTypeImages/icon_pdf.gif b/public/ueditor/dialogs/attachment/fileTypeImages/icon_pdf.gif
new file mode 100644
index 0000000..bbb65c8
Binary files /dev/null and b/public/ueditor/dialogs/attachment/fileTypeImages/icon_pdf.gif differ
diff --git a/public/ueditor/dialogs/attachment/fileTypeImages/icon_ppt.gif b/public/ueditor/dialogs/attachment/fileTypeImages/icon_ppt.gif
new file mode 100644
index 0000000..ccb26fb
Binary files /dev/null and b/public/ueditor/dialogs/attachment/fileTypeImages/icon_ppt.gif differ
diff --git a/public/ueditor/dialogs/attachment/fileTypeImages/icon_psd.gif b/public/ueditor/dialogs/attachment/fileTypeImages/icon_psd.gif
new file mode 100644
index 0000000..2e8743a
Binary files /dev/null and b/public/ueditor/dialogs/attachment/fileTypeImages/icon_psd.gif differ
diff --git a/public/ueditor/dialogs/attachment/fileTypeImages/icon_rar.gif b/public/ueditor/dialogs/attachment/fileTypeImages/icon_rar.gif
new file mode 100644
index 0000000..5359e46
Binary files /dev/null and b/public/ueditor/dialogs/attachment/fileTypeImages/icon_rar.gif differ
diff --git a/public/ueditor/dialogs/attachment/fileTypeImages/icon_txt.gif b/public/ueditor/dialogs/attachment/fileTypeImages/icon_txt.gif
new file mode 100644
index 0000000..e7b8dd2
Binary files /dev/null and b/public/ueditor/dialogs/attachment/fileTypeImages/icon_txt.gif differ
diff --git a/public/ueditor/dialogs/attachment/fileTypeImages/icon_xls.gif b/public/ueditor/dialogs/attachment/fileTypeImages/icon_xls.gif
new file mode 100644
index 0000000..e86c1c6
Binary files /dev/null and b/public/ueditor/dialogs/attachment/fileTypeImages/icon_xls.gif differ
diff --git a/public/ueditor/dialogs/attachment/images/alignicon.gif b/public/ueditor/dialogs/attachment/images/alignicon.gif
new file mode 100644
index 0000000..005a5ac
Binary files /dev/null and b/public/ueditor/dialogs/attachment/images/alignicon.gif differ
diff --git a/public/ueditor/dialogs/attachment/images/alignicon.png b/public/ueditor/dialogs/attachment/images/alignicon.png
new file mode 100644
index 0000000..4b6c444
Binary files /dev/null and b/public/ueditor/dialogs/attachment/images/alignicon.png differ
diff --git a/public/ueditor/dialogs/attachment/images/bg.png b/public/ueditor/dialogs/attachment/images/bg.png
new file mode 100644
index 0000000..580be0a
Binary files /dev/null and b/public/ueditor/dialogs/attachment/images/bg.png differ
diff --git a/public/ueditor/dialogs/attachment/images/file-icons.gif b/public/ueditor/dialogs/attachment/images/file-icons.gif
new file mode 100644
index 0000000..d8c02c2
Binary files /dev/null and b/public/ueditor/dialogs/attachment/images/file-icons.gif differ
diff --git a/public/ueditor/dialogs/attachment/images/file-icons.png b/public/ueditor/dialogs/attachment/images/file-icons.png
new file mode 100644
index 0000000..3ff82c8
Binary files /dev/null and b/public/ueditor/dialogs/attachment/images/file-icons.png differ
diff --git a/public/ueditor/dialogs/attachment/images/icons.gif b/public/ueditor/dialogs/attachment/images/icons.gif
new file mode 100644
index 0000000..78459de
Binary files /dev/null and b/public/ueditor/dialogs/attachment/images/icons.gif differ
diff --git a/public/ueditor/dialogs/attachment/images/icons.png b/public/ueditor/dialogs/attachment/images/icons.png
new file mode 100644
index 0000000..12e4700
Binary files /dev/null and b/public/ueditor/dialogs/attachment/images/icons.png differ
diff --git a/public/ueditor/dialogs/attachment/images/image.png b/public/ueditor/dialogs/attachment/images/image.png
new file mode 100644
index 0000000..19699f6
Binary files /dev/null and b/public/ueditor/dialogs/attachment/images/image.png differ
diff --git a/public/ueditor/dialogs/attachment/images/progress.png b/public/ueditor/dialogs/attachment/images/progress.png
new file mode 100644
index 0000000..717c486
Binary files /dev/null and b/public/ueditor/dialogs/attachment/images/progress.png differ
diff --git a/public/ueditor/dialogs/attachment/images/success.gif b/public/ueditor/dialogs/attachment/images/success.gif
new file mode 100644
index 0000000..8d4f311
Binary files /dev/null and b/public/ueditor/dialogs/attachment/images/success.gif differ
diff --git a/public/ueditor/dialogs/attachment/images/success.png b/public/ueditor/dialogs/attachment/images/success.png
new file mode 100644
index 0000000..94f968d
Binary files /dev/null and b/public/ueditor/dialogs/attachment/images/success.png differ
diff --git a/public/ueditor/dialogs/background/background.css b/public/ueditor/dialogs/background/background.css
new file mode 100644
index 0000000..5c41fe9
--- /dev/null
+++ b/public/ueditor/dialogs/background/background.css
@@ -0,0 +1,94 @@
+.wrapper{ width: 424px;margin: 10px auto; zoom:1;position: relative}
+.tabbody{height:225px;}
+.tabbody .panel { position: absolute;width:100%; height:100%;background: #fff; display: none;}
+.tabbody .focus { display: block;}
+
+body{font-size: 12px;color: #888;overflow: hidden;}
+input,label{vertical-align:middle}
+.clear{clear: both;}
+.pl{padding-left: 18px;padding-left: 23px\9;}
+
+#imageList {width: 420px;height: 215px;margin-top: 10px;overflow: hidden;overflow-y: auto;}
+#imageList div {float: left;width: 100px;height: 95px;margin: 5px 10px;}
+#imageList img {cursor: pointer;border: 2px solid white;}
+
+.bgarea{margin: 10px;padding: 5px;height: 84%;border: 1px solid #A8A297;}
+.content div{margin: 10px 0 10px 5px;}
+.content .iptradio{margin: 0px 5px 5px 0px;}
+.txt{width:280px;}
+
+.wrapcolor{height: 19px;}
+div.color{float: left;margin: 0;}
+#colorPicker{width: 17px;height: 17px;border: 1px solid #CCC;display: inline-block;border-radius: 3px;box-shadow: 2px 2px 5px #D3D6DA;margin: 0;float: left;}
+div.alignment,#custom{margin-left: 23px;margin-left: 28px\9;}
+#custom input{height: 15px;min-height: 15px;width:20px;}
+#repeatType{width:100px;}
+
+
+/* 图片管理样式 */
+#imgManager {
+ width: 100%;
+ height: 225px;
+}
+#imgManager #imageList{
+ width: 100%;
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+#imgManager ul {
+ display: block;
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+#imgManager li {
+ float: left;
+ display: block;
+ list-style: none;
+ padding: 0;
+ width: 113px;
+ height: 113px;
+ margin: 9px 0 0 19px;
+ background-color: #eee;
+ overflow: hidden;
+ cursor: pointer;
+ position: relative;
+}
+#imgManager li.clearFloat {
+ float: none;
+ clear: both;
+ display: block;
+ width:0;
+ height:0;
+ margin: 0;
+ padding: 0;
+}
+#imgManager li img {
+ cursor: pointer;
+}
+#imgManager li .icon {
+ cursor: pointer;
+ width: 113px;
+ height: 113px;
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 2;
+ border: 0;
+ background-repeat: no-repeat;
+}
+#imgManager li .icon:hover {
+ width: 107px;
+ height: 107px;
+ border: 3px solid #1094fa;
+}
+#imgManager li.selected .icon {
+ background-image: url(images/success.png);
+ background-position: 75px 75px;
+}
+#imgManager li.selected .icon:hover {
+ width: 107px;
+ height: 107px;
+ border: 3px solid #1094fa;
+ background-position: 72px 72px;
+}
\ No newline at end of file
diff --git a/public/ueditor/dialogs/background/background.html b/public/ueditor/dialogs/background/background.html
new file mode 100644
index 0000000..3cc2ac1
--- /dev/null
+++ b/public/ueditor/dialogs/background/background.html
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/ueditor/dialogs/background/background.js b/public/ueditor/dialogs/background/background.js
new file mode 100644
index 0000000..9a4a131
--- /dev/null
+++ b/public/ueditor/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/public/ueditor/dialogs/background/images/bg.png b/public/ueditor/dialogs/background/images/bg.png
new file mode 100644
index 0000000..580be0a
Binary files /dev/null and b/public/ueditor/dialogs/background/images/bg.png differ
diff --git a/public/ueditor/dialogs/background/images/success.png b/public/ueditor/dialogs/background/images/success.png
new file mode 100644
index 0000000..94f968d
Binary files /dev/null and b/public/ueditor/dialogs/background/images/success.png differ
diff --git a/public/ueditor/dialogs/charts/chart.config.js b/public/ueditor/dialogs/charts/chart.config.js
new file mode 100644
index 0000000..678b00d
--- /dev/null
+++ b/public/ueditor/dialogs/charts/chart.config.js
@@ -0,0 +1,65 @@
+/*
+ * 图表配置文件
+ * */
+
+
+//不同类型的配置
+var typeConfig = [
+ {
+ chart: {
+ type: 'line'
+ },
+ plotOptions: {
+ line: {
+ dataLabels: {
+ enabled: false
+ },
+ enableMouseTracking: true
+ }
+ }
+ }, {
+ chart: {
+ type: 'line'
+ },
+ plotOptions: {
+ line: {
+ dataLabels: {
+ enabled: true
+ },
+ enableMouseTracking: false
+ }
+ }
+ }, {
+ chart: {
+ type: 'area'
+ }
+ }, {
+ chart: {
+ type: 'bar'
+ }
+ }, {
+ chart: {
+ type: 'column'
+ }
+ }, {
+ chart: {
+ plotBackgroundColor: null,
+ plotBorderWidth: null,
+ plotShadow: false
+ },
+ plotOptions: {
+ pie: {
+ allowPointSelect: true,
+ cursor: 'pointer',
+ dataLabels: {
+ enabled: true,
+ color: '#000000',
+ connectorColor: '#000000',
+ formatter: function() {
+ return '
'+ this.point.name +': '+ ( Math.round( this.point.percentage*100 ) / 100 ) +' %';
+ }
+ }
+ }
+ }
+ }
+];
diff --git a/public/ueditor/dialogs/charts/charts.css b/public/ueditor/dialogs/charts/charts.css
new file mode 100644
index 0000000..ac3c764
--- /dev/null
+++ b/public/ueditor/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/public/ueditor/dialogs/charts/charts.html b/public/ueditor/dialogs/charts/charts.html
new file mode 100644
index 0000000..70e2314
--- /dev/null
+++ b/public/ueditor/dialogs/charts/charts.html
@@ -0,0 +1,89 @@
+
+
+
+
chart
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/public/ueditor/dialogs/charts/charts.js b/public/ueditor/dialogs/charts/charts.js
new file mode 100644
index 0000000..37344fd
--- /dev/null
+++ b/public/ueditor/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/public/ueditor/dialogs/charts/images/charts0.png b/public/ueditor/dialogs/charts/images/charts0.png
new file mode 100644
index 0000000..9485e5e
Binary files /dev/null and b/public/ueditor/dialogs/charts/images/charts0.png differ
diff --git a/public/ueditor/dialogs/charts/images/charts1.png b/public/ueditor/dialogs/charts/images/charts1.png
new file mode 100644
index 0000000..b5a0039
Binary files /dev/null and b/public/ueditor/dialogs/charts/images/charts1.png differ
diff --git a/public/ueditor/dialogs/charts/images/charts2.png b/public/ueditor/dialogs/charts/images/charts2.png
new file mode 100644
index 0000000..7c91a39
Binary files /dev/null and b/public/ueditor/dialogs/charts/images/charts2.png differ
diff --git a/public/ueditor/dialogs/charts/images/charts3.png b/public/ueditor/dialogs/charts/images/charts3.png
new file mode 100644
index 0000000..a6bc29b
Binary files /dev/null and b/public/ueditor/dialogs/charts/images/charts3.png differ
diff --git a/public/ueditor/dialogs/charts/images/charts4.png b/public/ueditor/dialogs/charts/images/charts4.png
new file mode 100644
index 0000000..742006a
Binary files /dev/null and b/public/ueditor/dialogs/charts/images/charts4.png differ
diff --git a/public/ueditor/dialogs/charts/images/charts5.png b/public/ueditor/dialogs/charts/images/charts5.png
new file mode 100644
index 0000000..c49a296
Binary files /dev/null and b/public/ueditor/dialogs/charts/images/charts5.png differ
diff --git a/public/ueditor/dialogs/emotion/emotion.css b/public/ueditor/dialogs/emotion/emotion.css
new file mode 100644
index 0000000..f801105
--- /dev/null
+++ b/public/ueditor/dialogs/emotion/emotion.css
@@ -0,0 +1,43 @@
+.jd img{
+ background:transparent url(images/jxface2.gif?v=1.1) no-repeat scroll left top;
+ cursor:pointer;width:35px;height:35px;display:block;
+}
+.pp img{
+ background:transparent url(images/fface.gif?v=1.1) no-repeat scroll left top;
+ cursor:pointer;width:25px;height:25px;display:block;
+}
+.ldw img{
+ background:transparent url(images/wface.gif?v=1.1) no-repeat scroll left top;
+ cursor:pointer;width:35px;height:35px;display:block;
+}
+.tsj img{
+ background:transparent url(images/tface.gif?v=1.1) no-repeat scroll left top;
+ cursor:pointer;width:35px;height:35px;display:block;
+}
+.cat img{
+ background:transparent url(images/cface.gif?v=1.1) no-repeat scroll left top;
+ cursor:pointer;width:35px;height:35px;display:block;
+}
+.bb img{
+ background:transparent url(images/bface.gif?v=1.1) no-repeat scroll left top;
+ cursor:pointer;width:35px;height:35px;display:block;
+}
+.youa img{
+ background:transparent url(images/yface.gif?v=1.1) no-repeat scroll left top;
+ cursor:pointer;width:35px;height:35px;display:block;
+}
+
+.smileytable td {height: 37px;}
+#tabPanel{margin-left:5px;overflow: hidden;}
+#tabContent {float:left;background:#FFFFFF;}
+#tabContent div{display: none;width:480px;overflow:hidden;}
+#tabIconReview.show{left:17px;display:block;}
+.menuFocus{background:#ACCD3C;}
+.menuDefault{background:#FFFFFF;}
+#tabIconReview{position:absolute;left:406px;left:398px \9;top:41px;z-index:65533;width:90px;height:76px;}
+img.review{width:90px;height:76px;border:2px solid #9cb945;background:#FFFFFF;background-position:center;background-repeat:no-repeat;}
+
+.wrapper .tabbody{position:relative;float:left;clear:both;padding:10px;width: 95%;}
+.tabbody table{width: 100%;}
+.tabbody td{border:1px solid #BAC498;}
+.tabbody td span{display: block;zoom:1;padding:0 4px;}
\ No newline at end of file
diff --git a/public/ueditor/dialogs/emotion/emotion.html b/public/ueditor/dialogs/emotion/emotion.html
new file mode 100644
index 0000000..fca0850
--- /dev/null
+++ b/public/ueditor/dialogs/emotion/emotion.html
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/public/ueditor/dialogs/emotion/emotion.js b/public/ueditor/dialogs/emotion/emotion.js
new file mode 100644
index 0000000..6e158a9
--- /dev/null
+++ b/public/ueditor/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( '' );
+ } else {
+ textHTML.push( ' | ' );
+ }
+ textHTML.push( ' | ' );
+ }
+ 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/public/ueditor/dialogs/emotion/images/0.gif b/public/ueditor/dialogs/emotion/images/0.gif
new file mode 100644
index 0000000..6964168
Binary files /dev/null and b/public/ueditor/dialogs/emotion/images/0.gif differ
diff --git a/public/ueditor/dialogs/emotion/images/bface.gif b/public/ueditor/dialogs/emotion/images/bface.gif
new file mode 100644
index 0000000..14fe618
Binary files /dev/null and b/public/ueditor/dialogs/emotion/images/bface.gif differ
diff --git a/public/ueditor/dialogs/emotion/images/cface.gif b/public/ueditor/dialogs/emotion/images/cface.gif
new file mode 100644
index 0000000..bff947f
Binary files /dev/null and b/public/ueditor/dialogs/emotion/images/cface.gif differ
diff --git a/public/ueditor/dialogs/emotion/images/fface.gif b/public/ueditor/dialogs/emotion/images/fface.gif
new file mode 100644
index 0000000..0d8a6af
Binary files /dev/null and b/public/ueditor/dialogs/emotion/images/fface.gif differ
diff --git a/public/ueditor/dialogs/emotion/images/jxface2.gif b/public/ueditor/dialogs/emotion/images/jxface2.gif
new file mode 100644
index 0000000..a959c90
Binary files /dev/null and b/public/ueditor/dialogs/emotion/images/jxface2.gif differ
diff --git a/public/ueditor/dialogs/emotion/images/neweditor-tab-bg.png b/public/ueditor/dialogs/emotion/images/neweditor-tab-bg.png
new file mode 100644
index 0000000..8f398b0
Binary files /dev/null and b/public/ueditor/dialogs/emotion/images/neweditor-tab-bg.png differ
diff --git a/public/ueditor/dialogs/emotion/images/tface.gif b/public/ueditor/dialogs/emotion/images/tface.gif
new file mode 100644
index 0000000..1354f54
Binary files /dev/null and b/public/ueditor/dialogs/emotion/images/tface.gif differ
diff --git a/public/ueditor/dialogs/emotion/images/wface.gif b/public/ueditor/dialogs/emotion/images/wface.gif
new file mode 100644
index 0000000..5667160
Binary files /dev/null and b/public/ueditor/dialogs/emotion/images/wface.gif differ
diff --git a/public/ueditor/dialogs/emotion/images/yface.gif b/public/ueditor/dialogs/emotion/images/yface.gif
new file mode 100644
index 0000000..51608be
Binary files /dev/null and b/public/ueditor/dialogs/emotion/images/yface.gif differ
diff --git a/public/ueditor/dialogs/gmap/gmap.html b/public/ueditor/dialogs/gmap/gmap.html
new file mode 100644
index 0000000..c4cbfe6
--- /dev/null
+++ b/public/ueditor/dialogs/gmap/gmap.html
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/public/ueditor/dialogs/help/help.css b/public/ueditor/dialogs/help/help.css
new file mode 100644
index 0000000..4478475
--- /dev/null
+++ b/public/ueditor/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/public/ueditor/dialogs/help/help.html b/public/ueditor/dialogs/help/help.html
new file mode 100644
index 0000000..9e50060
--- /dev/null
+++ b/public/ueditor/dialogs/help/help.html
@@ -0,0 +1,82 @@
+
+
+
+
帮助
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+ |
+
+
+
+
+ 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/public/ueditor/dialogs/help/help.js b/public/ueditor/dialogs/help/help.js
new file mode 100644
index 0000000..9a2272e
--- /dev/null
+++ b/public/ueditor/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/public/ueditor/dialogs/image/image.css b/public/ueditor/dialogs/image/image.css
new file mode 100644
index 0000000..52c2295
--- /dev/null
+++ b/public/ueditor/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/public/ueditor/dialogs/image/image.html b/public/ueditor/dialogs/image/image.html
new file mode 100644
index 0000000..08ca022
--- /dev/null
+++ b/public/ueditor/dialogs/image/image.html
@@ -0,0 +1,120 @@
+
+
+
+
+
ueditor图片对话框
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/public/ueditor/dialogs/image/image.js b/public/ueditor/dialogs/image/image.js
new file mode 100644
index 0000000..3cff524
--- /dev/null
+++ b/public/ueditor/dialogs/image/image.js
@@ -0,0 +1,1127 @@
+/**
+ * User: Jinqn
+ * Date: 14-04-08
+ * Time: 下午16:34
+ * 上传图片对话框逻辑代码,包括tab: 远程图片/上传图片/在线图片/搜索图片
+ */
+
+(function () {
+
+ var remoteImage,
+ uploadImage,
+ onlineImage,
+ searchImage;
+
+ window.onload = function () {
+ initTabs();
+ initAlign();
+ initButtons();
+ };
+
+ /* 初始化tab标签 */
+ function initTabs() {
+ var tabs = $G('tabhead').children;
+ for (var i = 0; i < tabs.length; i++) {
+ domUtils.on(tabs[i], "click", function (e) {
+ var target = e.target || e.srcElement;
+ setTabFocus(target.getAttribute('data-content-id'));
+ });
+ }
+
+ var img = editor.selection.getRange().getClosedNode();
+ if (img && img.tagName && img.tagName.toLowerCase() == 'img') {
+ setTabFocus('remote');
+ } else {
+ setTabFocus('upload');
+ }
+ }
+
+ /* 初始化tabbody */
+ function setTabFocus(id) {
+ if(!id) return;
+ var i, bodyId, tabs = $G('tabhead').children;
+ for (i = 0; i < tabs.length; i++) {
+ bodyId = tabs[i].getAttribute('data-content-id');
+ if (bodyId == id) {
+ domUtils.addClass(tabs[i], 'focus');
+ domUtils.addClass($G(bodyId), 'focus');
+ } else {
+ domUtils.removeClasses(tabs[i], 'focus');
+ domUtils.removeClasses($G(bodyId), 'focus');
+ }
+ }
+ switch (id) {
+ case 'remote':
+ remoteImage = remoteImage || new RemoteImage();
+ break;
+ case 'upload':
+ setAlign(editor.getOpt('imageInsertAlign'));
+ uploadImage = uploadImage || new UploadImage('queueList');
+ break;
+ case 'online':
+ setAlign(editor.getOpt('imageManagerInsertAlign'));
+ onlineImage = onlineImage || new OnlineImage('imageList');
+ onlineImage.reset();
+ break;
+ case 'search':
+ setAlign(editor.getOpt('imageManagerInsertAlign'));
+ searchImage = searchImage || new SearchImage();
+ break;
+ }
+ }
+
+ /* 初始化onok事件 */
+ function initButtons() {
+
+ dialog.onok = function () {
+ var remote = false, list = [], id, tabs = $G('tabhead').children;
+ for (var i = 0; i < tabs.length; i++) {
+ if (domUtils.hasClass(tabs[i], 'focus')) {
+ id = tabs[i].getAttribute('data-content-id');
+ break;
+ }
+ }
+
+ switch (id) {
+ case 'remote':
+ list = remoteImage.getInsertList();
+ break;
+ case 'upload':
+ list = uploadImage.getInsertList();
+ var count = uploadImage.getQueueCount();
+ if (count) {
+ $('.info', '#queueList').html('
' + '还有2个未上传文件'.replace(/[\d]/, count) + '');
+ return false;
+ }
+ break;
+ case 'online':
+ list = onlineImage.getInsertList();
+ break;
+ case 'search':
+ list = searchImage.getInsertList();
+ remote = true;
+ break;
+ }
+
+ if(list) {
+ editor.execCommand('insertimage', list);
+ remote && editor.fireEvent("catchRemoteImage");
+ }
+ };
+ }
+
+
+ /* 初始化对其方式的点击事件 */
+ function initAlign(){
+ /* 点击align图标 */
+ domUtils.on($G("alignIcon"), 'click', function(e){
+ var target = e.target || e.srcElement;
+ if(target.className && target.className.indexOf('-align') != -1) {
+ setAlign(target.getAttribute('data-align'));
+ }
+ });
+ }
+
+ /* 设置对齐方式 */
+ function setAlign(align){
+ align = align || 'none';
+ var aligns = $G("alignIcon").children;
+ for(i = 0; i < aligns.length; i++){
+ if(aligns[i].getAttribute('data-align') == align) {
+ domUtils.addClass(aligns[i], 'focus');
+ $G("align").value = aligns[i].getAttribute('data-align');
+ } else {
+ domUtils.removeClasses(aligns[i], 'focus');
+ }
+ }
+ }
+ /* 获取对齐方式 */
+ function getAlign(){
+ var align = $G("align").value || 'none';
+ return align == 'none' ? '':align;
+ }
+
+
+ /* 在线图片 */
+ function RemoteImage(target) {
+ this.container = utils.isString(target) ? document.getElementById(target) : target;
+ this.init();
+ }
+ RemoteImage.prototype = {
+ init: function () {
+ this.initContainer();
+ this.initEvents();
+ },
+ initContainer: function () {
+ this.dom = {
+ 'url': $G('url'),
+ 'width': $G('width'),
+ 'height': $G('height'),
+ 'border': $G('border'),
+ 'vhSpace': $G('vhSpace'),
+ 'title': $G('title'),
+ 'align': $G('align')
+ };
+ var img = editor.selection.getRange().getClosedNode();
+ if (img) {
+ this.setImage(img);
+ }
+ },
+ initEvents: function () {
+ var _this = this,
+ locker = $G('lock');
+
+ /* 改变url */
+ domUtils.on($G("url"), 'keyup', updatePreview);
+ domUtils.on($G("border"), 'keyup', updatePreview);
+ domUtils.on($G("title"), 'keyup', updatePreview);
+
+ domUtils.on($G("width"), 'keyup', function(){
+ if(locker.checked) {
+ var proportion =locker.getAttribute('data-proportion');
+ $G('height').value = Math.round(this.value / proportion);
+ } else {
+ _this.updateLocker();
+ }
+ updatePreview();
+ });
+ domUtils.on($G("height"), 'keyup', function(){
+ if(locker.checked) {
+ var proportion =locker.getAttribute('data-proportion');
+ $G('width').value = Math.round(this.value * proportion);
+ } else {
+ _this.updateLocker();
+ }
+ updatePreview();
+ });
+ domUtils.on($G("lock"), 'change', function(){
+ var proportion = parseInt($G("width").value) /parseInt($G("height").value);
+ locker.setAttribute('data-proportion', proportion);
+ });
+
+ function updatePreview(){
+ _this.setPreview();
+ }
+ },
+ updateLocker: function(){
+ var width = $G('width').value,
+ height = $G('height').value,
+ locker = $G('lock');
+ if(width && height && width == parseInt(width) && height == parseInt(height)) {
+ locker.disabled = false;
+ locker.title = '';
+ } else {
+ locker.checked = false;
+ locker.disabled = 'disabled';
+ locker.title = lang.remoteLockError;
+ }
+ },
+ setImage: function(img){
+ /* 不是正常的图片 */
+ if (!img.tagName || img.tagName.toLowerCase() != 'img' && !img.getAttribute("src") || !img.src) return;
+
+ var wordImgFlag = img.getAttribute("word_img"),
+ src = wordImgFlag ? wordImgFlag.replace("&", "&") : (img.getAttribute('_src') || img.getAttribute("src", 2).replace("&", "&")),
+ align = editor.queryCommandValue("imageFloat");
+
+ /* 防止onchange事件循环调用 */
+ if (src !== $G("url").value) $G("url").value = src;
+ if(src) {
+ /* 设置表单内容 */
+ $G("width").value = img.width || '';
+ $G("height").value = img.height || '';
+ $G("border").value = img.getAttribute("border") || '0';
+ $G("vhSpace").value = img.getAttribute("vspace") || '0';
+ $G("title").value = img.title || img.alt || '';
+ setAlign(align);
+ this.setPreview();
+ this.updateLocker();
+ }
+ },
+ getData: function(){
+ var data = {};
+ for(var k in this.dom){
+ data[k] = this.dom[k].value;
+ }
+ return data;
+ },
+ setPreview: function(){
+ var url = $G('url').value,
+ ow = $G('width').value,
+ oh = $G('height').value,
+ border = $G('border').value,
+ title = $G('title').value,
+ preview = $G('preview'),
+ width,
+ height;
+
+ width = ((!ow || !oh) ? preview.offsetWidth:Math.min(ow, preview.offsetWidth));
+ width = width+(border*2) > preview.offsetWidth ? width:(preview.offsetWidth - (border*2));
+ height = (!ow || !oh) ? '':width*oh/ow;
+
+ if(url) {
+ preview.innerHTML = '
';
+ }
+ },
+ getInsertList: function () {
+ var data = this.getData();
+ if(data['url']) {
+ return [{
+ src: data['url'],
+ _src: data['url'],
+ width: data['width'] || '',
+ height: data['height'] || '',
+ border: data['border'] || '',
+ floatStyle: data['align'] || '',
+ vspace: data['vhSpace'] || '',
+ alt: data['title'] || '',
+ style: "width:" + data['width'] + "px;height:" + data['height'] + "px;"
+ }];
+ } else {
+ return [];
+ }
+ }
+ };
+
+
+
+ /* 上传图片 */
+ function UploadImage(target) {
+ this.$wrap = target.constructor == String ? $('#' + target) : $(target);
+ this.init();
+ }
+ UploadImage.prototype = {
+ init: function () {
+ this.imageList = [];
+ this.initContainer();
+ this.initUploader();
+ },
+ initContainer: function () {
+ this.$queue = this.$wrap.find('.filelist');
+ },
+ /* 初始化容器 */
+ initUploader: function () {
+ var _this = this,
+ $ = jQuery, // just in case. Make sure it's not an other libaray.
+ $wrap = _this.$wrap,
+ // 图片容器
+ $queue = $wrap.find('.filelist'),
+ // 状态栏,包括进度和控制按钮
+ $statusBar = $wrap.find('.statusBar'),
+ // 文件总体选择信息。
+ $info = $statusBar.find('.info'),
+ // 上传按钮
+ $upload = $wrap.find('.uploadBtn'),
+ // 上传按钮
+ $filePickerBtn = $wrap.find('.filePickerBtn'),
+ // 上传按钮
+ $filePickerBlock = $wrap.find('.filePickerBlock'),
+ // 没选择文件之前的内容。
+ $placeHolder = $wrap.find('.placeholder'),
+ // 总体进度条
+ $progress = $statusBar.find('.progress').hide(),
+ // 添加的文件数量
+ fileCount = 0,
+ // 添加的文件总大小
+ fileSize = 0,
+ // 优化retina, 在retina下这个值是2
+ ratio = window.devicePixelRatio || 1,
+ // 缩略图大小
+ thumbnailWidth = 113 * ratio,
+ thumbnailHeight = 113 * ratio,
+ // 可能有pedding, ready, uploading, confirm, done.
+ state = '',
+ // 所有文件的进度信息,key为file id
+ percentages = {},
+ supportTransition = (function () {
+ var s = document.createElement('p').style,
+ r = 'transition' in s ||
+ 'WebkitTransition' in s ||
+ 'MozTransition' in s ||
+ 'msTransition' in s ||
+ 'OTransition' in s;
+ s = null;
+ return r;
+ })(),
+ // WebUploader实例
+ uploader,
+ actionUrl = editor.getActionUrl(editor.getOpt('imageActionName')),
+ acceptExtensions = (editor.getOpt('imageAllowFiles') || []).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 = $('
' +
+ '' + file.name + '
' +
+ '' +
+ '
' +
+ ''),
+
+ $btns = $('
' +
+ '' + lang.uploadDelete + '' +
+ '' + lang.uploadTurnRight + '' +
+ '' + lang.uploadTurnLeft + '
').appendTo($li),
+ $prgress = $li.find('p.progress span'),
+ $wrap = $li.find('p.imgWrap'),
+ $info = $('
').hide().appendTo($li),
+
+ showError = function (code) {
+ switch (code) {
+ case 'exceed_size':
+ text = lang.errorExceedSize;
+ break;
+ case 'interrupt':
+ text = lang.errorInterrupt;
+ break;
+ case 'http':
+ text = lang.errorHttp;
+ break;
+ case 'not_allow_type':
+ text = lang.errorFileType;
+ break;
+ default:
+ text = lang.errorUploadRetry;
+ break;
+ }
+ $info.text(text).show();
+ };
+
+ if (file.getStatus() === 'invalid') {
+ showError(file.statusText);
+ } else {
+ $wrap.text(lang.uploadPreview);
+ if (browser.ie && browser.version <= 7) {
+ $wrap.text(lang.uploadNoPreview);
+ } else {
+ uploader.makeThumb(file, function (error, src) {
+ if (error || !src) {
+ $wrap.text(lang.uploadNoPreview);
+ } else {
+ var $img = $('
');
+ $wrap.empty().append($img);
+ $img.on('error', function () {
+ $wrap.text(lang.uploadNoPreview);
+ });
+ }
+ }, thumbnailWidth, thumbnailHeight);
+ }
+ percentages[ file.id ] = [ file.size, 0 ];
+ file.rotation = 0;
+
+ /* 检查文件格式 */
+ if (!file.ext || acceptExtensions.indexOf(file.ext.toLowerCase()) == -1) {
+ showError('not_allow_type');
+ uploader.removeFile(file);
+ }
+ }
+
+ file.on('statuschange', function (cur, prev) {
+ if (prev === 'progress') {
+ $prgress.hide().width(0);
+ } else if (prev === 'queued') {
+ $li.off('mouseenter mouseleave');
+ $btns.remove();
+ }
+ // 成功
+ if (cur === 'error' || cur === 'invalid') {
+ showError(file.statusText);
+ percentages[ file.id ][ 1 ] = 1;
+ } else if (cur === 'interrupt') {
+ showError('interrupt');
+ } else if (cur === 'queued') {
+ percentages[ file.id ][ 1 ] = 0;
+ } else if (cur === 'progress') {
+ $info.hide();
+ $prgress.css('display', 'block');
+ } else if (cur === 'complete') {
+ }
+
+ $li.removeClass('state-' + prev).addClass('state-' + cur);
+ });
+
+ $li.on('mouseenter', function () {
+ $btns.stop().animate({height: 30});
+ });
+ $li.on('mouseleave', function () {
+ $btns.stop().animate({height: 0});
+ });
+
+ $btns.on('click', 'span', function () {
+ var index = $(this).index(),
+ deg;
+
+ switch (index) {
+ case 0:
+ uploader.removeFile(file);
+ return;
+ case 1:
+ file.rotation += 90;
+ break;
+ case 2:
+ file.rotation -= 90;
+ break;
+ }
+
+ if (supportTransition) {
+ deg = 'rotate(' + file.rotation + 'deg)';
+ $wrap.css({
+ '-webkit-transform': deg,
+ '-mos-transform': deg,
+ '-o-transform': deg,
+ 'transform': deg
+ });
+ } else {
+ $wrap.css('filter', 'progid:DXImageTransform.Microsoft.BasicImage(rotation=' + (~~((file.rotation / 90) % 4 + 4) % 4) + ')');
+ }
+
+ });
+
+ $li.insertBefore($filePickerBlock);
+ }
+
+ // 负责view的销毁
+ function removeFile(file) {
+ var $li = $('#' + file.id);
+ delete percentages[ file.id ];
+ updateTotalProgress();
+ $li.off().find('.file-panel').off().end().remove();
+ }
+
+ function updateTotalProgress() {
+ var loaded = 0,
+ total = 0,
+ spans = $progress.children(),
+ percent;
+
+ $.each(percentages, function (k, v) {
+ total += v[ 0 ];
+ loaded += v[ 0 ] * v[ 1 ];
+ });
+
+ percent = total ? loaded / total : 0;
+
+ spans.eq(0).text(Math.round(percent * 100) + '%');
+ spans.eq(1).css('width', Math.round(percent * 100) + '%');
+ updateStatus();
+ }
+
+ function setState(val, files) {
+
+ if (val != state) {
+
+ var stats = uploader.getStats();
+
+ $upload.removeClass('state-' + state);
+ $upload.addClass('state-' + val);
+
+ switch (val) {
+
+ /* 未选择文件 */
+ case 'pedding':
+ $queue.addClass('element-invisible');
+ $statusBar.addClass('element-invisible');
+ $placeHolder.removeClass('element-invisible');
+ $progress.hide(); $info.hide();
+ uploader.refresh();
+ break;
+
+ /* 可以开始上传 */
+ case 'ready':
+ $placeHolder.addClass('element-invisible');
+ $queue.removeClass('element-invisible');
+ $statusBar.removeClass('element-invisible');
+ $progress.hide(); $info.show();
+ $upload.text(lang.uploadStart);
+ uploader.refresh();
+ break;
+
+ /* 上传中 */
+ case 'uploading':
+ $progress.show(); $info.hide();
+ $upload.text(lang.uploadPause);
+ break;
+
+ /* 暂停上传 */
+ case 'paused':
+ $progress.show(); $info.hide();
+ $upload.text(lang.uploadContinue);
+ break;
+
+ case 'confirm':
+ $progress.show(); $info.hide();
+ $upload.text(lang.uploadStart);
+
+ stats = uploader.getStats();
+ if (stats.successNum && !stats.uploadFailNum) {
+ setState('finish');
+ return;
+ }
+ break;
+
+ case 'finish':
+ $progress.hide(); $info.show();
+ if (stats.uploadFailNum) {
+ $upload.text(lang.uploadRetry);
+ } else {
+ $upload.text(lang.uploadStart);
+ }
+ break;
+ }
+
+ state = val;
+ updateStatus();
+
+ }
+
+ if (!_this.getQueueCount()) {
+ $upload.addClass('disabled')
+ } else {
+ $upload.removeClass('disabled')
+ }
+
+ }
+
+ function updateStatus() {
+ var text = '', stats;
+
+ if (state === 'ready') {
+ text = lang.updateStatusReady.replace('_', fileCount).replace('_KB', WebUploader.formatSize(fileSize));
+ } else if (state === 'confirm') {
+ stats = uploader.getStats();
+ if (stats.uploadFailNum) {
+ text = lang.updateStatusConfirm.replace('_', stats.successNum).replace('_', stats.successNum);
+ }
+ } else {
+ stats = uploader.getStats();
+ text = lang.updateStatusFinish.replace('_', fileCount).
+ replace('_KB', WebUploader.formatSize(fileSize)).
+ replace('_', stats.successNum);
+
+ if (stats.uploadFailNum) {
+ text += lang.updateStatusError.replace('_', stats.uploadFailNum);
+ }
+ }
+
+ $info.html(text);
+ }
+
+ uploader.on('fileQueued', function (file) {
+ fileCount++;
+ fileSize += file.size;
+
+ if (fileCount === 1) {
+ $placeHolder.addClass('element-invisible');
+ $statusBar.show();
+ }
+
+ addFile(file);
+ });
+
+ uploader.on('fileDequeued', function (file) {
+ if (file.ext && acceptExtensions.indexOf(file.ext.toLowerCase()) != -1 && file.size <= imageMaxSize) {
+ fileCount--;
+ fileSize -= file.size;
+ }
+
+ removeFile(file);
+ updateTotalProgress();
+ });
+
+ uploader.on('filesQueued', function (file) {
+ if (!uploader.isInProgress() && (state == 'pedding' || state == 'finish' || state == 'confirm' || state == 'ready')) {
+ setState('ready');
+ }
+ updateTotalProgress();
+ });
+
+ uploader.on('all', function (type, files) {
+ switch (type) {
+ case 'uploadFinished':
+ setState('confirm', files);
+ break;
+ case 'startUpload':
+ /* 添加额外的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) {
+ const token = JSON.parse(localStorage.getItem('IASF_server_token')).value
+ console.log("🚀 ~ file: image.js:704 ~ token:", token)
+ header['Authorization'] = token
+ //这里可以通过data对象添加POST参数
+ if (actionUrl.toLowerCase().indexOf('jsp') != -1) {
+ header['X-Requested-With'] = 'XMLHttpRequest';
+ }
+ });
+
+ uploader.on('uploadProgress', function (file, percentage) {
+ var $li = $('#' + file.id),
+ $percent = $li.find('.progress span');
+
+ $percent.css('width', percentage * 100 + '%');
+ percentages[ file.id ][ 1 ] = percentage;
+ updateTotalProgress();
+ });
+
+ uploader.on('uploadSuccess', function (file, ret) {
+ var $file = $('#' + file.id);
+ try {
+ var responseText = (ret._raw || ret),
+ json = utils.str2json(responseText);
+ 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');
+ console.log("🚀 ~ file: image.js:779 ~ prefix:", prefix)
+ for (i = 0; i < this.imageList.length; i++) {
+ data = this.imageList[i];
+ list.push({
+ src: prefix + data.url,
+ _src: prefix + data.url,
+ alt: data.original,
+ floatStyle: align
+ });
+ }
+ return list;
+ }
+ };
+
+
+ /* 在线图片 */
+ function OnlineImage(target) {
+ this.container = utils.isString(target) ? document.getElementById(target) : target;
+ this.init();
+ }
+ OnlineImage.prototype = {
+ init: function () {
+ this.reset();
+ this.initEvents();
+ },
+ /* 初始化容器 */
+ initContainer: function () {
+ this.container.innerHTML = '';
+ this.list = document.createElement('ul');
+ this.clearFloat = document.createElement('li');
+
+ domUtils.addClass(this.list, 'list');
+ domUtils.addClass(this.clearFloat, 'clearFloat');
+
+ this.list.appendChild(this.clearFloat);
+ this.container.appendChild(this.list);
+ },
+ /* 初始化滚动事件,滚动到地步自动拉取数据 */
+ initEvents: function () {
+ var _this = this;
+
+ /* 滚动拉取图片 */
+ domUtils.on($G('imageList'), 'scroll', function(e){
+ var panel = this;
+ if (panel.scrollHeight - (panel.offsetHeight + panel.scrollTop) < 10) {
+ _this.getImageData();
+ }
+ });
+ /* 选中图片 */
+ domUtils.on(this.container, 'click', function (e) {
+ var target = e.target || e.srcElement,
+ li = target.parentNode;
+
+ if (li.tagName.toLowerCase() == 'li') {
+ if (domUtils.hasClass(li, 'selected')) {
+ domUtils.removeClasses(li, 'selected');
+ } else {
+ domUtils.addClass(li, 'selected');
+ }
+ }
+ });
+ },
+ /* 初始化第一次的数据 */
+ initData: function () {
+
+ /* 拉取数据需要使用的值 */
+ this.state = 0;
+ this.listSize = editor.getOpt('imageManagerListSize');
+ this.listIndex = 0;
+ this.listEnd = false;
+
+ /* 第一次拉取数据 */
+ this.getImageData();
+ },
+ /* 重置界面 */
+ reset: function() {
+ this.initContainer();
+ this.initData();
+ },
+ /* 向后台拉取图片列表数据 */
+ getImageData: function () {
+ var _this = this;
+
+ if(!_this.listEnd && !this.isLoadingData) {
+ this.isLoadingData = true;
+ var url = editor.getActionUrl(editor.getOpt('imageManagerActionName')),
+ isJsonp = utils.isCrossDomainUrl(url);
+ ajax.request(url, {
+ 'timeout': 100000,
+ 'dataType': isJsonp ? 'jsonp':'',
+ 'data': utils.extend({
+ start: this.listIndex,
+ size: this.listSize
+ }, editor.queryCommandValue('serverparam')),
+ 'method': 'get',
+ 'onsuccess': function (r) {
+ try {
+ var json = isJsonp ? r:eval('(' + r.responseText + ')');
+ if (json.state == 'SUCCESS') {
+ _this.pushData(json.list);
+ _this.listIndex = parseInt(json.start) + parseInt(json.list.length);
+ if(_this.listIndex >= json.total) {
+ _this.listEnd = true;
+ }
+ _this.isLoadingData = false;
+ }
+ } catch (e) {
+ if(r.responseText.indexOf('ue_separate_ue') != -1) {
+ var list = r.responseText.split(r.responseText);
+ _this.pushData(list);
+ _this.listIndex = parseInt(list.length);
+ _this.listEnd = true;
+ _this.isLoadingData = false;
+ }
+ }
+ },
+ 'onerror': function () {
+ _this.isLoadingData = false;
+ }
+ });
+ }
+ },
+ /* 添加图片到列表界面上 */
+ pushData: function (list) {
+ var i, item, img, icon, _this = this,
+ urlPrefix = editor.getOpt('imageManagerUrlPrefix');
+ for (i = 0; i < list.length; i++) {
+ if(list[i] && list[i].url) {
+ item = document.createElement('li');
+ img = document.createElement('img');
+ icon = document.createElement('span');
+
+ domUtils.on(img, 'load', (function(image){
+ return function(){
+ _this.scale(image, image.parentNode.offsetWidth, image.parentNode.offsetHeight);
+ }
+ })(img));
+ img.width = 113;
+ img.setAttribute('src', urlPrefix + list[i].url + (list[i].url.indexOf('?') == -1 ? '?noCache=':'&noCache=') + (+new Date()).toString(36) );
+ img.setAttribute('_src', urlPrefix + list[i].url);
+ domUtils.addClass(icon, 'icon');
+
+ item.appendChild(img);
+ item.appendChild(icon);
+ this.list.insertBefore(item, this.clearFloat);
+ }
+ }
+ },
+ /* 改变图片大小 */
+ scale: function (img, w, h, type) {
+ var ow = img.width,
+ oh = img.height;
+
+ if (type == 'justify') {
+ if (ow >= oh) {
+ img.width = w;
+ img.height = h * oh / ow;
+ img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px';
+ } else {
+ img.width = w * ow / oh;
+ img.height = h;
+ img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px';
+ }
+ } else {
+ if (ow >= oh) {
+ img.width = w * ow / oh;
+ img.height = h;
+ img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px';
+ } else {
+ img.width = w;
+ img.height = h * oh / ow;
+ img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px';
+ }
+ }
+ },
+ getInsertList: function () {
+ var i, lis = this.list.children, list = [], align = getAlign();
+ for (i = 0; i < lis.length; i++) {
+ if (domUtils.hasClass(lis[i], 'selected')) {
+ var img = lis[i].firstChild,
+ src = img.getAttribute('_src');
+ list.push({
+ src: src,
+ _src: src,
+ alt: src.substr(src.lastIndexOf('/') + 1),
+ floatStyle: align
+ });
+ }
+
+ }
+ return list;
+ }
+ };
+
+ /*搜索图片 */
+ function SearchImage() {
+ this.init();
+ }
+ SearchImage.prototype = {
+ init: function () {
+ this.initEvents();
+ },
+ initEvents: function(){
+ var _this = this;
+
+ /* 点击搜索按钮 */
+ domUtils.on($G('searchBtn'), 'click', function(){
+ var key = $G('searchTxt').value;
+ if(key && key != lang.searchRemind) {
+ _this.getImageData();
+ }
+ });
+ /* 点击清除妞 */
+ domUtils.on($G('searchReset'), 'click', function(){
+ $G('searchTxt').value = lang.searchRemind;
+ $G('searchListUl').innerHTML = '';
+ $G('searchType').selectedIndex = 0;
+ });
+ /* 搜索框聚焦 */
+ domUtils.on($G('searchTxt'), 'focus', function(){
+ var key = $G('searchTxt').value;
+ if(key && key == lang.searchRemind) {
+ $G('searchTxt').value = '';
+ }
+ });
+ /* 搜索框回车键搜索 */
+ domUtils.on($G('searchTxt'), 'keydown', function(e){
+ var keyCode = e.keyCode || e.which;
+ if (keyCode == 13) {
+ $G('searchBtn').click();
+ }
+ });
+
+ /* 选中图片 */
+ domUtils.on($G('searchList'), 'click', function(e){
+ var target = e.target || e.srcElement,
+ li = target.parentNode.parentNode;
+
+ if (li.tagName.toLowerCase() == 'li') {
+ if (domUtils.hasClass(li, 'selected')) {
+ domUtils.removeClasses(li, 'selected');
+ } else {
+ domUtils.addClass(li, 'selected');
+ }
+ }
+ });
+ },
+ /* 改变图片大小 */
+ scale: function (img, w, h) {
+ var ow = img.width,
+ oh = img.height;
+
+ if (ow >= oh) {
+ img.width = w * ow / oh;
+ img.height = h;
+ img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px';
+ } else {
+ img.width = w;
+ img.height = h * oh / ow;
+ img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px';
+ }
+ },
+ getImageData: function(){
+ var _this = this,
+ key = $G('searchTxt').value,
+ type = $G('searchType').value,
+ keepOriginName = editor.options.keepOriginName ? "1" : "0",
+ url = "http://image.baidu.com/i?ct=201326592&cl=2&lm=-1&st=-1&tn=baiduimagejson&istype=2&rn=32&fm=index&pv=&word=" + key + type + "&ie=utf-8&oe=utf-8&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/public/ueditor/dialogs/image/images/alignicon.jpg b/public/ueditor/dialogs/image/images/alignicon.jpg
new file mode 100644
index 0000000..754755b
Binary files /dev/null and b/public/ueditor/dialogs/image/images/alignicon.jpg differ
diff --git a/public/ueditor/dialogs/image/images/bg.png b/public/ueditor/dialogs/image/images/bg.png
new file mode 100644
index 0000000..580be0a
Binary files /dev/null and b/public/ueditor/dialogs/image/images/bg.png differ
diff --git a/public/ueditor/dialogs/image/images/icons.gif b/public/ueditor/dialogs/image/images/icons.gif
new file mode 100644
index 0000000..78459de
Binary files /dev/null and b/public/ueditor/dialogs/image/images/icons.gif differ
diff --git a/public/ueditor/dialogs/image/images/icons.png b/public/ueditor/dialogs/image/images/icons.png
new file mode 100644
index 0000000..12e4700
Binary files /dev/null and b/public/ueditor/dialogs/image/images/icons.png differ
diff --git a/public/ueditor/dialogs/image/images/image.png b/public/ueditor/dialogs/image/images/image.png
new file mode 100644
index 0000000..19699f6
Binary files /dev/null and b/public/ueditor/dialogs/image/images/image.png differ
diff --git a/public/ueditor/dialogs/image/images/progress.png b/public/ueditor/dialogs/image/images/progress.png
new file mode 100644
index 0000000..717c486
Binary files /dev/null and b/public/ueditor/dialogs/image/images/progress.png differ
diff --git a/public/ueditor/dialogs/image/images/success.gif b/public/ueditor/dialogs/image/images/success.gif
new file mode 100644
index 0000000..8d4f311
Binary files /dev/null and b/public/ueditor/dialogs/image/images/success.gif differ
diff --git a/public/ueditor/dialogs/image/images/success.png b/public/ueditor/dialogs/image/images/success.png
new file mode 100644
index 0000000..94f968d
Binary files /dev/null and b/public/ueditor/dialogs/image/images/success.png differ
diff --git a/public/ueditor/dialogs/insertframe/insertframe.html b/public/ueditor/dialogs/insertframe/insertframe.html
new file mode 100644
index 0000000..7f1f3e9
--- /dev/null
+++ b/public/ueditor/dialogs/insertframe/insertframe.html
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/public/ueditor/dialogs/internal.js b/public/ueditor/dialogs/internal.js
new file mode 100644
index 0000000..44dc17f
--- /dev/null
+++ b/public/ueditor/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/public/ueditor/dialogs/link/link.html b/public/ueditor/dialogs/link/link.html
new file mode 100644
index 0000000..01d19f7
--- /dev/null
+++ b/public/ueditor/dialogs/link/link.html
@@ -0,0 +1,132 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/ueditor/dialogs/map/map.html b/public/ueditor/dialogs/map/map.html
new file mode 100644
index 0000000..e763b8e
--- /dev/null
+++ b/public/ueditor/dialogs/map/map.html
@@ -0,0 +1,135 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/ueditor/dialogs/map/show.html b/public/ueditor/dialogs/map/show.html
new file mode 100644
index 0000000..329cfeb
--- /dev/null
+++ b/public/ueditor/dialogs/map/show.html
@@ -0,0 +1,118 @@
+
+
+
+
+
+
+
百度地图API自定义地图
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/public/ueditor/dialogs/music/music.css b/public/ueditor/dialogs/music/music.css
new file mode 100644
index 0000000..8fb7a94
--- /dev/null
+++ b/public/ueditor/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/public/ueditor/dialogs/music/music.html b/public/ueditor/dialogs/music/music.html
new file mode 100644
index 0000000..e7ef04f
--- /dev/null
+++ b/public/ueditor/dialogs/music/music.html
@@ -0,0 +1,32 @@
+
+
+
+
+
插入音乐
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/public/ueditor/dialogs/music/music.js b/public/ueditor/dialogs/music/music.js
new file mode 100644
index 0000000..1c538bf
--- /dev/null
+++ b/public/ueditor/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 = '
+ *
+ *
+ *
+ * xxx
+ *
+ *
+ *
+ * xxx
+ *
+ * xxx
+ *
+ *
+ *
+ *
+ *
+ * xxx
+ *
+ *
+ *
+ * xx[xxx]x
+ *
+ *
+ *
+ *
+ * xx[xxx]x
+ *
+ *
+ *
+ *
+ * xx[xxx]x
+ *
+ *
+ *
+ *
+ *
+ * xxxxxxxxx[xxx]xxxxxxxx
+ *
+ *
+ *
+ *
+ *
+ *
+ * xxxxxxxx[x]xxxxxxxxxxx
+ *
+ *
+ *
+ *