addons.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. define([], function () {
  2. require.config({
  3. paths: {
  4. 'nkeditor': '../addons/nkeditor/js/customplugin',
  5. 'nkeditor-core': '../addons/nkeditor/nkeditor.min',
  6. 'nkeditor-lang': '../addons/nkeditor/lang/zh-CN',
  7. },
  8. shim: {
  9. 'nkeditor': {
  10. deps: [
  11. 'nkeditor-core',
  12. 'nkeditor-lang'
  13. ]
  14. },
  15. 'nkeditor-core': {
  16. deps: [
  17. 'css!../addons/nkeditor/themes/black/editor.min.css',
  18. 'css!../addons/nkeditor/css/common.css'
  19. ],
  20. exports: 'window.KindEditor'
  21. },
  22. 'nkeditor-lang': {
  23. deps: [
  24. 'nkeditor-core'
  25. ]
  26. }
  27. }
  28. });
  29. require(['form'], function (Form) {
  30. var _bindevent = Form.events.bindevent;
  31. Form.events.bindevent = function (form) {
  32. _bindevent.apply(this, [form]);
  33. if ($(".editor", form).size() > 0) {
  34. require(['nkeditor', 'upload'], function (Nkeditor, Upload) {
  35. var getImageFromClipboard, getImageFromDrop, getFileFromBase64;
  36. getImageFromClipboard = function (data) {
  37. var i, item;
  38. i = 0;
  39. while (i < data.clipboardData.items.length) {
  40. item = data.clipboardData.items[i];
  41. if (item.type.indexOf("image") !== -1) {
  42. return item.getAsFile() || false;
  43. }
  44. i++;
  45. }
  46. return false;
  47. };
  48. getImageFromDrop = function (data) {
  49. var i, item, images;
  50. i = 0;
  51. images = [];
  52. while (i < data.dataTransfer.files.length) {
  53. item = data.dataTransfer.files[i];
  54. if (item.type.indexOf("image") !== -1) {
  55. images.push(item);
  56. }
  57. i++;
  58. }
  59. return images;
  60. };
  61. getFileFromBase64 = function (data, url) {
  62. var arr = data.split(','), mime = arr[0].match(/:(.*?);/)[1],
  63. bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
  64. while (n--) {
  65. u8arr[n] = bstr.charCodeAt(n);
  66. }
  67. var filename, suffix;
  68. if (typeof url != 'undefined') {
  69. var urlArr = url.split('.');
  70. filename = url.substr(url.lastIndexOf('/') + 1);
  71. suffix = urlArr.pop();
  72. } else {
  73. filename = Math.random().toString(36).substring(5, 15);
  74. }
  75. if (!suffix) {
  76. suffix = data.substring("data:image/".length, data.indexOf(";base64"));
  77. }
  78. var exp = new RegExp("\\." + suffix + "$", "i");
  79. filename = exp.test(filename) ? filename : filename + "." + suffix;
  80. var file = new File([u8arr], filename, {type: mime});
  81. return file;
  82. };
  83. var getImageFromUrl = function (url, callback, outputFormat) {
  84. var canvas = document.createElement('CANVAS'),
  85. ctx = canvas.getContext('2d'),
  86. img = new Image;
  87. img.crossOrigin = 'Anonymous';
  88. img.onload = function () {
  89. var urlArr = url.split('.');
  90. var suffix = urlArr.pop();
  91. suffix = suffix.match(/^(jpg|png|gif|bmp|jpeg)$/i) ? suffix : 'png';
  92. try {
  93. canvas.height = img.height;
  94. canvas.width = img.width;
  95. ctx.drawImage(img, 0, 0);
  96. var dataURL = canvas.toDataURL(outputFormat || 'image/' + suffix);
  97. var file = getFileFromBase64(dataURL, url);
  98. } catch (e) {
  99. callback.call(this, null);
  100. }
  101. callback.call(this, file);
  102. canvas = null;
  103. };
  104. img.onerror = function (e) {
  105. callback.call(this, null);
  106. };
  107. img.src = Fast.api.fixurl("/addons/nkeditor/index/download") + "?url=" + encodeURIComponent(url);
  108. };
  109. //上传Word图片
  110. Nkeditor.uploadwordimage = function (index, image) {
  111. var that = this;
  112. (function () {
  113. var file = getFileFromBase64(image);
  114. var placeholder = new RegExp("##" + index + "##", "g");
  115. Upload.api.send(file, function (data) {
  116. that.html(that.html().replace(placeholder, Fast.api.cdnurl(data.url)));
  117. }, function (data) {
  118. that.html(that.html().replace(placeholder, ""));
  119. });
  120. }(index, image));
  121. };
  122. Nkeditor.lang({
  123. remoteimage: '下载远程图片'
  124. });
  125. //远程下载图片
  126. Nkeditor.plugin('remoteimage', function (K) {
  127. var editor = this, name = 'remoteimage';
  128. editor.plugin.remoteimage = {
  129. download: function (e) {
  130. var that = this;
  131. var html = that.html();
  132. var staging = {}, orgined = {}, index = 0, images = 0, completed = 0, failured = 0;
  133. var checkrestore = function () {
  134. if (completed + failured >= images) {
  135. $.each(staging, function (i, j) {
  136. that.html(that.html().replace("<code>" + i + "</code>", j));
  137. });
  138. }
  139. };
  140. html.replace(/<code>([\s\S]*?)<\/code>/g, function (code) {
  141. staging[index] = code;
  142. return "<code>" + index + "</code>";
  143. }
  144. );
  145. html = html.replace(/<img([\s\S]*?)\ssrc\s*=\s*('|")((http(s?):)([\s\S]*?))('|")([\s\S]*?)[\/]?>/g, function () {
  146. images++;
  147. var url = arguments[3];
  148. var placeholder = '<img src="' + Fast.api.cdnurl("/assets/addons/nkeditor/img/downloading.png") + '" data-index="' + index + '" />';
  149. //如果是云存储的链接,则忽略
  150. if (Config.upload.cdnurl && url.indexOf(Config.upload.cdnurl) > -1) {
  151. completed++;
  152. return arguments[0];
  153. } else {
  154. orgined[index] = arguments[0];
  155. }
  156. //下载远程图片
  157. (function (index, url, placeholder) {
  158. getImageFromUrl(url, function (file) {
  159. if (!file) {
  160. failured++;
  161. that.html(that.html().replace(placeholder, orgined[index]));
  162. checkrestore();
  163. } else {
  164. Upload.api.send(file, function (data) {
  165. completed++;
  166. that.html(that.html().replace(placeholder, '<img src="' + Fast.api.cdnurl(data.url) + '" />'));
  167. checkrestore();
  168. }, function (data) {
  169. failured++;
  170. that.html(that.html().replace(placeholder, orgined[index]));
  171. checkrestore();
  172. });
  173. }
  174. });
  175. })(index, url, placeholder);
  176. index++;
  177. return placeholder;
  178. });
  179. if (index > 0) {
  180. that.html(html);
  181. } else {
  182. Toastr.info("没有需要下载的远程图片");
  183. }
  184. }
  185. };
  186. // 点击图标时执行
  187. editor.clickToolbar(name, editor.plugin.remoteimage.download);
  188. });
  189. $(".editor", form).each(function () {
  190. var that = this;
  191. Nkeditor.create(that, {
  192. width: '100%',
  193. filterMode: false,
  194. wellFormatMode: false,
  195. allowMediaUpload: true, //是否允许媒体上传
  196. allowFileManager: true,
  197. allowImageUpload: true,
  198. fontSizeTable: ['9px', '10px', '12px', '14px', '16px', '18px', '21px', '24px', '32px'],
  199. wordImageServer: typeof Config.nkeditor != 'undefined' && Config.nkeditor.wordimageserver ? "127.0.0.1:10101" : "", //word图片替换服务器的IP和端口
  200. cssPath: Fast.api.cdnurl('/assets/addons/nkeditor/plugins/code/prism.css'),
  201. cssData: "body {font-size: 13px}",
  202. fillDescAfterUploadImage: false, //是否在上传后继续添加描述信息
  203. themeType: typeof Config.nkeditor != 'undefined' ? Config.nkeditor.theme : 'black', //编辑器皮肤,这个值从后台获取
  204. fileManagerJson: Fast.api.fixurl("/addons/nkeditor/index/attachment/module/" + Config.modulename),
  205. items: [
  206. 'source', 'undo', 'redo', 'preview', 'print', 'template', 'code', 'quote', 'cut', 'copy', 'paste',
  207. 'plainpaste', 'wordpaste', 'justifyleft', 'justifycenter', 'justifyright',
  208. 'justifyfull', 'insertorderedlist', 'insertunorderedlist', 'indent', 'outdent', 'subscript',
  209. 'superscript', 'clearhtml', 'quickformat', 'selectall',
  210. 'formatblock', 'fontname', 'fontsize', 'forecolor', 'hilitecolor', 'bold',
  211. 'italic', 'underline', 'strikethrough', 'lineheight', 'removeformat', 'image', 'multiimage', 'graft',
  212. 'flash', 'media', 'insertfile', 'table', 'hr', 'emoticons', 'baidumap', 'pagebreak',
  213. 'anchor', 'link', 'unlink', 'remoteimage', 'about', 'fullscreen'
  214. ],
  215. afterCreate: function () {
  216. var self = this;
  217. //Ctrl+回车提交
  218. Nkeditor.ctrl(document, 13, function () {
  219. self.sync();
  220. $(that).closest("form").submit();
  221. });
  222. Nkeditor.ctrl(self.edit.doc, 13, function () {
  223. self.sync();
  224. $(that).closest("form").submit();
  225. });
  226. //粘贴上传
  227. $("body", self.edit.doc).bind('paste', function (event) {
  228. var image, pasteEvent;
  229. pasteEvent = event.originalEvent;
  230. if (pasteEvent.clipboardData && pasteEvent.clipboardData.items) {
  231. image = getImageFromClipboard(pasteEvent);
  232. if (image) {
  233. event.preventDefault();
  234. Upload.api.send(image, function (data) {
  235. self.exec("insertimage", Fast.api.cdnurl(data.url));
  236. });
  237. }
  238. }
  239. });
  240. //挺拽上传
  241. $("body", self.edit.doc).bind('drop', function (event) {
  242. var image, pasteEvent;
  243. pasteEvent = event.originalEvent;
  244. if (pasteEvent.dataTransfer && pasteEvent.dataTransfer.files) {
  245. images = getImageFromDrop(pasteEvent);
  246. if (images.length > 0) {
  247. event.preventDefault();
  248. $.each(images, function (i, image) {
  249. Upload.api.send(image, function (data) {
  250. self.exec("insertimage", Fast.api.cdnurl(data.url));
  251. });
  252. });
  253. }
  254. }
  255. });
  256. },
  257. //FastAdmin自定义处理
  258. beforeUpload: function (callback, file) {
  259. var file = file ? file : $("input.ke-upload-file", this.form).prop('files')[0];
  260. Upload.api.send(file, function (data) {
  261. var data = {code: '000', data: {url: Fast.api.cdnurl(data.url)}, title: '', width: '', height: '', border: '', align: ''};
  262. callback(data);
  263. });
  264. },
  265. //错误处理 handler
  266. errorMsgHandler: function (message, type) {
  267. try {
  268. console.log(message, type);
  269. } catch (Error) {
  270. alert(message);
  271. }
  272. }
  273. });
  274. });
  275. });
  276. }
  277. }
  278. });
  279. if (Config.modulename === 'index' && Config.controllername === 'user' && ['login', 'register'].indexOf(Config.actionname) > -1 && $("#register-form,#login-form").length > 0 && $(".social-login").length == 0) {
  280. $("#register-form,#login-form").append(Config.third.loginhtml || '');
  281. }
  282. });