diff --git a/data.json b/data.json index 9e050737..b2749e2e 100644 --- a/data.json +++ b/data.json @@ -59,6 +59,11 @@ "url":"/lib/tools/BullshitGenerator/", "type":"文字工具" }, + { + "name":"NKeditor 富文本编辑器", + "url":"/lib/tools/NKeditor/", + "type":"文字工具" + }, { "name":"在线 x86 虚拟机", "url":"/lib/tools/v86/", diff --git a/js/api.js b/js/api.js index 6e2d7a41..794d6ead 100644 --- a/js/api.js +++ b/js/api.js @@ -77,6 +77,11 @@ var classify = [{ "url": "/incert/?link=/lib/tools/BullshitGenerator/", "hot": 0, "img": "" + }, { + "name": "NKeditor 富文本编辑器", + "url": "/incert/?link=/lib/tools/NKeditor/", + "hot": 0, + "img": "" }] }, { "id": 6, diff --git a/tools/NKeditor/.gitignore b/tools/NKeditor/.gitignore new file mode 100644 index 00000000..127b6c08 --- /dev/null +++ b/tools/NKeditor/.gitignore @@ -0,0 +1,18 @@ +*~ +~* +*.diff +*.patch +*.bak +.DS_Store +Thumbs.db +.sass-cache +.project +.*proj +.svn/ +*.swp +dist/ +node_modules/ +_build/ +uploads +.idea +php/default/db/data diff --git a/tools/NKeditor/Gruntfile.js b/tools/NKeditor/Gruntfile.js new file mode 100644 index 00000000..cb3c48b9 --- /dev/null +++ b/tools/NKeditor/Gruntfile.js @@ -0,0 +1,178 @@ + +module.exports = function(grunt) { + +var BANNER = '/* <%= pkg.name %> <%= pkg.version %> (<%= grunt.template.today("yyyy-mm-dd") %>), Copyright (C)' + + ' r9it.com,*/\r\n'; + +var SRC_FILES = [ + 'src/header.js', + 'src/core.js', + 'src/config.js', + 'src/event.js', + 'src/html.js', + 'src/selector.js', + 'src/node.js', + 'src/range.js', + 'src/cmd.js', + 'src/widget.js', + 'src/edit.js', + 'src/toolbar.js', + 'src/menu.js', + 'src/colorpicker.js', + 'src/uploadbutton.js', + 'src/dialog.js', + 'src/tabs.js', + 'src/ajax.js', + 'src/main.js', + 'src/footer.js', +]; + +var PLUGIN_FILES = [ + 'plugins/anchor/anchor.js', + 'plugins/autoheight/autoheight.js', + 'plugins/baidumap/baidumap.js', + 'plugins/map/map.js', + 'plugins/clearhtml/clearhtml.js', + 'plugins/code/code.js', + 'plugins/emoticons/emoticons.js', + 'plugins/filemanager/filemanager.js', + 'plugins/flash/flash.js', + 'plugins/image/image.js', + 'plugins/insertfile/insertfile.js', + 'plugins/lineheight/lineheight.js', + 'plugins/link/link.js', + 'plugins/map/map.js', + 'plugins/media/media.js', + 'plugins/multiimage/multiimage.js', + 'plugins/graft/graft.js', + 'plugins/pagebreak/pagebreak.js', + 'plugins/plainpaste/plainpaste.js', + 'plugins/preview/preview.js', + 'plugins/quickformat/quickformat.js', + 'plugins/table/table.js', + 'plugins/template/template.js', + 'plugins/wordpaste/wordpaste.js', + 'plugins/fixtoolbar/fixtoolbar.js' +]; + +var pkg = grunt.file.readJSON('package.json'); + +var lang = grunt.option('lang') || 'zh-CN'; + +grunt.initConfig({ + pkg : pkg, + concat : { + options : { + process : function(src, filepath) { + src = src.replace(/\$\{VERSION\}/g, pkg.version + ' (' + grunt.template.today('yyyy-mm-dd') + ')'); + src = src.replace(/\$\{THISYEAR\}/g, grunt.template.today('yyyy')); + src = src.replace(/\/\*\*(\r\n|\n)[\s\S]*?\*\//g, ''); + src = src.replace(/(^|\s)\/\/.*$/mg, ''); + src = src.replace(/(\r\n|\n)\/\*\*\/.*(\r\n|\n)/g, ''); + src = src.replace(/[ \t]+$/mg, ''); + src = src.replace(/(\r\n|\n){2,}/g, '$1'); + return src; + } + }, + build : { + src : SRC_FILES.concat('lang/' + lang + '.js').concat(PLUGIN_FILES), + dest : '<%= pkg.filename %>-all.js' + } + }, + + uglify : { + options : { + banner : BANNER, + }, + //压缩js + build : { + + files: [ + { + src : '<%= pkg.filename %>-all.js', + dest : '<%= pkg.filename %>-all-min.js' + } + ] + + } + }, + + //压缩css + cssmin : { + options: { + banner : BANNER, + beautify: { + //中文ascii化 + ascii_only: true + } + }, + build : { + files: [ + { + src: 'themes/black/editor.css', + dest: 'themes/black/editor.min.css' + }, + { + src: 'themes/grey/editor.css', + dest: 'themes/grey/editor.min.css' + }, + { + src: 'themes/blue/editor.css', + dest: 'themes/blue/editor.min.css' + }, + { + src: 'themes/primary/editor.css', + dest: 'themes/primary/editor.min.css' + }, + { + src: 'themes/default/editor.css', + dest: 'themes/default/editor.min.css' + }, + { + src : 'plugins/multiimage/css/upload.css', + dest : 'plugins/multiimage/css/upload.min.css' + }, + { + src : 'plugins/filemanager/css/filemanager.css', + dest : 'plugins/filemanager/css/filemanager.min.css' + } + ] + } + }, + + // 打包压缩文件 + compress : { + main : { + options: { + archive: 'dist/<%= pkg.filename %>-<%= pkg.version %>-' + lang + '.zip', + }, + files: [ + {src: ['asp/**'], dest: '<%= pkg.name %>/'}, + {src: ['asp.net/**'], dest: '<%= pkg.name %>/'}, + {src: ['attached'], dest: '<%= pkg.name %>/'}, + {src: ['jsp/**'], dest: '<%= pkg.name %>/'}, + {src: ['libs/**'], dest: '<%= pkg.name %>/'}, + {src: ['lang/**'], dest: '<%= pkg.name %>/'}, + {src: ['php/**'], dest: '<%= pkg.name %>/'}, + {src: ['plugins/**'], dest: '<%= pkg.name %>/'}, + {src: ['themes/**'], dest: '<%= pkg.name %>/'}, + {src: ['<%= pkg.filename %>*-all-min.js'], dest: '<%= pkg.name %>/'}, + {src: ['<%= pkg.filename %>*-all.js'], dest: '<%= pkg.name %>/'}, + {src: ['index.html'], dest: '<%= pkg.name %>/'}, + {src: ['old.html'], dest: '<%= pkg.name %>/'}, + ] + } + } +}); + +grunt.loadNpmTasks('grunt-contrib-concat'); +grunt.loadNpmTasks('grunt-contrib-uglify'); +grunt.loadNpmTasks('grunt-contrib-compress'); +grunt.loadNpmTasks('grunt-contrib-cssmin'); + +grunt.registerTask('build', ['concat', 'uglify', 'cssmin']); +grunt.registerTask('zip', ['build', 'compress']); + +grunt.registerTask('default', 'build'); + +}; diff --git a/tools/NKeditor/LICENSE b/tools/NKeditor/LICENSE new file mode 100644 index 00000000..078c4d17 --- /dev/null +++ b/tools/NKeditor/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 RockYang + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/tools/NKeditor/NKeditor-all-min.js b/tools/NKeditor/NKeditor-all-min.js new file mode 100644 index 00000000..3b7dfc9f --- /dev/null +++ b/tools/NKeditor/NKeditor-all-min.js @@ -0,0 +1,7 @@ +/* NKeditor 5.0.4 (2020-03-11), Copyright (C) r9it.com,*/ +!function(window,undefined){function _isArray(a){return a?"[object Array]"===Object.prototype.toString.call(a):!1}function _isFunction(a){return a?"[object Function]"===Object.prototype.toString.call(a):!1}function _inArray(a,b){for(var c=0,d=b.length;d>c;c++)if(a===b[c])return c;return-1}function _each(a,b){if(_isArray(a))for(var c=0,d=a.length;d>c&&b.call(a[c],c,a[c])!==!1;c++);else for(var e in a)if(a.hasOwnProperty(e)&&b.call(a[e],e,a[e])===!1)break}function _trim(a){return a.replace(/(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g,"")}function _inString(a,b,c){return c=c===undefined?",":c,(c+b+c).indexOf(c+a+c)>=0}function _addUnit(a,b){return b=b||"px",a&&/^-?\d+(?:\.\d+)?$/.test(a)?a+b:a}function _removeUnit(a){var b;return a&&(b=/(\d+)/.exec(a))?parseInt(b[1],10):0}function _escape(a){return a.replace(/&/g,"&").replace(//g,">").replace(/"/g,""")}function _unescape(a){return a.replace(/</g,"<").replace(/>/g,">").replace(/"/g,'"').replace(/&/g,"&")}function _toCamel(a){var b=a.split("-");return a="",_each(b,function(b,c){a+=b>0?c.charAt(0).toUpperCase()+c.substr(1):c}),a}function _toHex(a){function b(a){var b=parseInt(a,10).toString(16).toUpperCase();return b.length>1?b:"0"+b}return a.replace(/rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/gi,function(a,c,d,e){return"#"+b(c)+b(d)+b(e)})}function _toMap(a,b){b=b===undefined?",":b;var c,d={},e=_isArray(a)?a:a.split(b);return _each(e,function(a,b){if(c=/^(\d+)\.\.(\d+)$/.exec(b))for(var e=parseInt(c[1],10);e<=parseInt(c[2],10);e++)d[e.toString()]=!0;else d[b]=!0}),d}function _toArray(a,b){return Array.prototype.slice.call(a,b||0)}function _undef(a,b){return a===undefined?b:a}function _invalidUrl(a){return!a||/[<>"]/.test(a)}function _addParam(a,b){return a.indexOf("?")>=0?a+"&"+b:a+"?"+b}function _extend(a,b,c){c||(c=b,b=null);var d;if(b){var e=function(){};e.prototype=b.prototype,d=new e,_each(c,function(a,b){d[a]=b})}else d=c;d.constructor=a,a.prototype=d,a.parent=b?b.prototype:null}function _json(text){var match;(match=/\{[\s\S]*\}|\[[\s\S]*\]/.exec(text))&&(text=match[0]);var cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;if(cx.lastIndex=0,cx.test(text)&&(text=text.replace(cx,function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})),/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return eval("("+text+")");throw"JSON parse error"}function _merge(a,b){for(var c in a)b[c]=a[c];return b}function _getBasePath(){for(var a,b=document.getElementsByTagName("script"),c=0,d=b.length;d>c;c++)if(a=b[c].src||"",/NKeditor[\w\-\.]*\.js/i.test(a))return a.substring(0,a.lastIndexOf("/")+1);return""}function _bindEvent(a,b,c){a.addEventListener?a.addEventListener(b,c,_useCapture):a.attachEvent&&a.attachEvent("on"+b,c)}function _unbindEvent(a,b,c){a.removeEventListener?a.removeEventListener(b,c,_useCapture):a.detachEvent&&a.detachEvent("on"+b,c)}function KEvent(a,b){this.init(a,b)}function _getId(a){return a[_eventExpendo]||null}function _setId(a){return a[_eventExpendo]=++_eventId,_eventId}function _removeId(a){try{delete a[_eventExpendo]}catch(b){a.removeAttribute&&a.removeAttribute(_eventExpendo)}}function _bind(a,b,c){if(b.indexOf(",")>=0)return void _each(b.split(","),function(){_bind(a,this,c)});var d=_getId(a);d||(d=_setId(a)),_eventData[d]===undefined&&(_eventData[d]={});var e=_eventData[d][b];e&&e.length>0?_unbindEvent(a,b,e[0]):(_eventData[d][b]=[],_eventData[d].el=a),e=_eventData[d][b],0===e.length&&(e[0]=function(b){var c=b?new KEvent(a,b):undefined;_each(e,function(b,d){b>0&&d&&d.call(a,c)})}),_inArray(c,e)<0&&e.push(c),_bindEvent(a,b,e[0])}function _unbind(a,b,c){if(b&&b.indexOf(",")>=0)return void _each(b.split(","),function(){_unbind(a,this,c)});var d=_getId(a);if(d){if(b===undefined)return void(d in _eventData&&(_each(_eventData[d],function(b,c){"el"!=b&&c.length>0&&_unbindEvent(a,b,c[0])}),delete _eventData[d],_removeId(a)));if(_eventData[d]){var e=_eventData[d][b];if(e&&e.length>0){c===undefined?(_unbindEvent(a,b,e[0]),delete _eventData[d][b]):(_each(e,function(a,b){a>0&&b===c&&e.splice(a,1)}),1==e.length&&(_unbindEvent(a,b,e[0]),delete _eventData[d][b]));var f=0;_each(_eventData[d],function(){f++}),2>f&&(delete _eventData[d],_removeId(a))}}}}function _fire(a,b){if(b.indexOf(",")>=0)return void _each(b.split(","),function(){_fire(a,this)});var c=_getId(a);if(c){var d=_eventData[c][b];_eventData[c]&&d&&d.length>0&&d[0]()}}function _ctrl(a,b,c){b=/^\d{2,}$/.test(b)?b:b.toUpperCase().charCodeAt(0),_bind(a,"keydown",function(d){!d.ctrlKey||d.which!=b||d.shiftKey||d.altKey||(c.call(a),d.stop())})}function _ready(a){function b(){e||(e=!0,a(KindEditor),_readyFinished=!0)}function c(){if(!e){try{document.documentElement.doScroll("left")}catch(a){return void setTimeout(c,100)}b()}}function d(){"complete"===document.readyState&&b()}if(_readyFinished)return void a(KindEditor);var e=!1;if(document.addEventListener)_bind(document,"DOMContentLoaded",b);else if(document.attachEvent){_bind(document,"readystatechange",d);var f=!1;try{f=null==window.frameElement}catch(g){}document.documentElement.doScroll&&f&&c()}_bind(window,"load",b)}function _getCssList(a){a=a.replace(/"/g,'"');for(var b,c={},d=/\s*([\w\-]+)\s*:([^;]*)(;|$)/g;b=d.exec(a);){var e=_trim(b[1].toLowerCase()),f=_trim(_toHex(b[2]));c[e]=f}return c}function _getAttrList(a){for(var b,c={},d=/\s+(?:([\w\-:]+)|(?:([\w\-:]+)=([^\s"'<>]+))|(?:([\w\-:"]+)="([^"]*)")|(?:([\w\-:"]+)='([^']*)'))(?=(?:\s|\/|>)+)/g;b=d.exec(a);){var e=(b[1]||b[2]||b[4]||b[6]).toLowerCase(),f=(b[2]?b[3]:b[4]?b[5]:b[7])||"";c[e]=f}return c}function _addClassToTag(a,b){return a=/\s+class\s*=/.test(a)?a.replace(/(\s+class=["']?)([^"']*)(["']?[\s>])/,function(a,c,d,e){return(" "+d+" ").indexOf(" "+b+" ")<0?""===d?c+b+e:c+d+" "+b+e:a}):a.substr(0,a.length-1)+' class="'+b+'">'}function _formatCss(a){var b="";return _each(_getCssList(a),function(a,c){b+=a+":"+c+";"}),b}function _formatUrl(a,b,c,d){function e(a){for(var b=a.split("/"),c=[],d=0,e=b.length;e>d;d++){var f=b[d];".."==f?c.length>0&&c.pop():""!==f&&"."!=f&&c.push(f)}return"/"+c.join("/")}function f(b,c){if(a.substr(0,b.length)===b){for(var e=[],g=0;c>g;g++)e.push("..");var i=".";return e.length>0&&(i+="/"+e.join("/")),"/"==d&&(i+="/"),i+a.substr(b.length)}return(h=/^(.*)\//.exec(b))?f(h[1],++c):void 0}if(b=_undef(b,"").toLowerCase(),"data:"!=a.substr(0,5)&&(a=a.replace(/([^:])\/\//g,"$1/")),_inArray(b,["absolute","relative","domain"])<0)return a;if(c=c||location.protocol+"//"+location.host,d===undefined){var g=location.pathname.match(/^(\/.*)\//);d=g?g[1]:""}var h;if(h=/^(\w+:\/\/[^\/]*)/.exec(a)){if(h[1]!==c)return a}else if(/^\w+:/.test(a))return a;return/^\//.test(a)?a=c+e(a.substr(1)):/^\w+:\/\//.test(a)||(a=c+e(d+"/"+a)),"relative"===b?a=f(c+d,0).substr(2):"absolute"===b&&a.substr(0,c.length)===c&&(a=a.substr(c.length)),a}function _formatHtml(a,b,c,d,e){null==a&&(a=""),c=c||"",d=_undef(d,!1),e=_undef(e," ");var f="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");a=a.replace(/(<(?:pre|pre\s[^>]*)>)([\s\S]*?)(<\/pre>)/gi,function(a,b,c,d){return b+c.replace(/<(?:br|br\s[^>]*)>/gi,"\n")+d}),a=a.replace(/<(?:br|br\s[^>]*)\s*\/?>\s*<\/p>/gi,"
"),a=a.replace(/(<(?:p|p\s[^>]*)>)\s*(<\/p>)/gi,"$1