Forráskód Böngészése

📦 富文本编辑器修改和已排版标记

快乐的梦鱼 4 hónapja
szülő
commit
f8a9b359dd
100 módosított fájl, 26438 hozzáadás és 0 törlés
  1. 4 0
      index.html
  2. 10716 0
      public/js/jquery-3.7.1.js
  3. 18 0
      public/kindeditor/.gitignore
  4. 178 0
      public/kindeditor/Gruntfile.js
  5. 21 0
      public/kindeditor/LICENSE
  6. 1 0
      public/kindeditor/NKeditor-all-min.js
  7. 9536 0
      public/kindeditor/NKeditor-all.js
  8. 98 0
      public/kindeditor/README.md
  9. 74 0
      public/kindeditor/customplugin.js
  10. 201 0
      public/kindeditor/index.html
  11. 242 0
      public/kindeditor/lang/ar.js
  12. 243 0
      public/kindeditor/lang/en.js
  13. 234 0
      public/kindeditor/lang/ja-JP.js
  14. 246 0
      public/kindeditor/lang/ko.js
  15. 242 0
      public/kindeditor/lang/ru.js
  16. 267 0
      public/kindeditor/lang/zh-CN.js
  17. 243 0
      public/kindeditor/lang/zh-TW.js
  18. 1 0
      public/kindeditor/libs/JDialog/JDialog.min.js
  19. 1 0
      public/kindeditor/libs/JDialog/css/JDialog.css
  20. BIN
      public/kindeditor/libs/JDialog/css/bg-default.png
  21. BIN
      public/kindeditor/libs/JDialog/css/gb_tip_loading.gif
  22. BIN
      public/kindeditor/libs/JDialog/css/gb_tips.png
  23. BIN
      public/kindeditor/libs/JDialog/css/gb_tips_ie6.gif
  24. BIN
      public/kindeditor/libs/JDialog/css/jdialog_confirm_icon.gif
  25. BIN
      public/kindeditor/libs/JDialog/css/jdialog_confirm_icon_espresso.png
  26. BIN
      public/kindeditor/libs/JDialog/css/jwindow_default.gif
  27. BIN
      public/kindeditor/libs/JDialog/css/loader.gif
  28. BIN
      public/kindeditor/libs/JDialog/css/loader1.gif
  29. 6 0
      public/kindeditor/libs/bootstrap/bootstrap.min.css
  30. 7 0
      public/kindeditor/libs/bootstrap/bootstrap.min.js
  31. 5 0
      public/kindeditor/libs/jquery.min.js
  32. 502 0
      public/kindeditor/licenses/KINDEDITOR
  33. 21 0
      public/kindeditor/licenses/NKEDITOR
  34. 52 0
      public/kindeditor/old.html
  35. 646 0
      public/kindeditor/package-lock.json
  36. 15 0
      public/kindeditor/package.json
  37. 260 0
      public/kindeditor/php/JsonResult.php
  38. 1 0
      public/kindeditor/php/default/cache.tmp
  39. 116 0
      public/kindeditor/php/default/db/SimpleDB.php
  40. 18 0
      public/kindeditor/php/default/db/test.php
  41. 29 0
      public/kindeditor/php/default/file_manager_json.php
  42. 77 0
      public/kindeditor/php/default/import.php
  43. 152 0
      public/kindeditor/php/default/upload_json.php
  44. 109 0
      public/kindeditor/php/functions.php
  45. 1 0
      public/kindeditor/php/qiniu/cache.tmp
  46. 15 0
      public/kindeditor/php/qiniu/composer.json
  47. 70 0
      public/kindeditor/php/qiniu/composer.lock
  48. 61 0
      public/kindeditor/php/qiniu/config.php
  49. 68 0
      public/kindeditor/php/qiniu/file_manager_json.php
  50. 92 0
      public/kindeditor/php/qiniu/upload_json.php
  51. 7 0
      public/kindeditor/php/qiniu/vendor/autoload.php
  52. 413 0
      public/kindeditor/php/qiniu/vendor/composer/ClassLoader.php
  53. 21 0
      public/kindeditor/php/qiniu/vendor/composer/LICENSE
  54. 9 0
      public/kindeditor/php/qiniu/vendor/composer/autoload_classmap.php
  55. 10 0
      public/kindeditor/php/qiniu/vendor/composer/autoload_files.php
  56. 9 0
      public/kindeditor/php/qiniu/vendor/composer/autoload_namespaces.php
  57. 10 0
      public/kindeditor/php/qiniu/vendor/composer/autoload_psr4.php
  58. 70 0
      public/kindeditor/php/qiniu/vendor/composer/autoload_real.php
  59. 35 0
      public/kindeditor/php/qiniu/vendor/composer/autoload_static.php
  60. 55 0
      public/kindeditor/php/qiniu/vendor/composer/installed.json
  61. 46 0
      public/kindeditor/plugins/anchor/anchor.js
  62. 59 0
      public/kindeditor/plugins/autoheight/autoheight.js
  63. 91 0
      public/kindeditor/plugins/baidumap/baidumap.js
  64. 103 0
      public/kindeditor/plugins/baidumap/index.html
  65. 53 0
      public/kindeditor/plugins/baidumap/map.html
  66. 29 0
      public/kindeditor/plugins/clearhtml/clearhtml.js
  67. 64 0
      public/kindeditor/plugins/code/code.js
  68. 18 0
      public/kindeditor/plugins/code/pretty.js
  69. 292 0
      public/kindeditor/plugins/code/prism.css
  70. 26 0
      public/kindeditor/plugins/code/prism.js
  71. 129 0
      public/kindeditor/plugins/emoticons/emoticons.js
  72. BIN
      public/kindeditor/plugins/emoticons/images/0.gif
  73. BIN
      public/kindeditor/plugins/emoticons/images/1.gif
  74. BIN
      public/kindeditor/plugins/emoticons/images/10.gif
  75. BIN
      public/kindeditor/plugins/emoticons/images/100.gif
  76. BIN
      public/kindeditor/plugins/emoticons/images/101.gif
  77. BIN
      public/kindeditor/plugins/emoticons/images/102.gif
  78. BIN
      public/kindeditor/plugins/emoticons/images/103.gif
  79. BIN
      public/kindeditor/plugins/emoticons/images/104.gif
  80. BIN
      public/kindeditor/plugins/emoticons/images/105.gif
  81. BIN
      public/kindeditor/plugins/emoticons/images/106.gif
  82. BIN
      public/kindeditor/plugins/emoticons/images/107.gif
  83. BIN
      public/kindeditor/plugins/emoticons/images/108.gif
  84. BIN
      public/kindeditor/plugins/emoticons/images/109.gif
  85. BIN
      public/kindeditor/plugins/emoticons/images/11.gif
  86. BIN
      public/kindeditor/plugins/emoticons/images/110.gif
  87. BIN
      public/kindeditor/plugins/emoticons/images/111.gif
  88. BIN
      public/kindeditor/plugins/emoticons/images/112.gif
  89. BIN
      public/kindeditor/plugins/emoticons/images/113.gif
  90. BIN
      public/kindeditor/plugins/emoticons/images/114.gif
  91. BIN
      public/kindeditor/plugins/emoticons/images/115.gif
  92. BIN
      public/kindeditor/plugins/emoticons/images/116.gif
  93. BIN
      public/kindeditor/plugins/emoticons/images/117.gif
  94. BIN
      public/kindeditor/plugins/emoticons/images/118.gif
  95. BIN
      public/kindeditor/plugins/emoticons/images/119.gif
  96. BIN
      public/kindeditor/plugins/emoticons/images/12.gif
  97. BIN
      public/kindeditor/plugins/emoticons/images/120.gif
  98. BIN
      public/kindeditor/plugins/emoticons/images/121.gif
  99. BIN
      public/kindeditor/plugins/emoticons/images/122.gif
  100. 0 0
      public/kindeditor/plugins/emoticons/images/123.gif

+ 4 - 0
index.html

@@ -5,6 +5,10 @@
     <link rel="icon" href="/favicon.ico">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <title>闽南文化生态保护区(厦门市)</title>
+    <link rel="stylesheet" href="/kindeditor/themes/black/editor.css">
+    <script src="/js/jquery-3.7.1.js"></script>
+    <script src="/kindeditor/NKeditor-all.js"></script>
+    <script src="/kindeditor/lang/zh-CN.js"></script>
   </head>
   <body>
     <div id="app"></div>

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 10716 - 0
public/js/jquery-3.7.1.js


+ 18 - 0
public/kindeditor/.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

+ 178 - 0
public/kindeditor/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');
+
+};

+ 21 - 0
public/kindeditor/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.

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 1 - 0
public/kindeditor/NKeditor-all-min.js


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 9536 - 0
public/kindeditor/NKeditor-all.js


+ 98 - 0
public/kindeditor/README.md

@@ -0,0 +1,98 @@
+> # 再一次温馨提示:建议有问题请提 issue 不要在评论区提, 评论区的内容一般没有及时看就被其他消息掩盖了,很容易被忽略看不到。
+# NKeditor
+NKedtior是基于 kindeditor 进行二次开发的项目
+kindeditor 是一款优秀的开源在线编辑器。轻量级且功能强大,代码量却不到百度的ueditor编辑器的一半。可惜已经4年没有更新了,由于业务的需求我们在kindeditor的基础上开发了 NKeditor, 主要做了一下工作:
+1. 调整编辑器和弹出 dialog 的样式,美化了UI
+2. 重写图片上传和批量图片上传插件,使用 html5 上传代替了 flash,实现了待上传图片预览,优化用户体验
+3. 修复一些已知的bug,如 ajax 提交无法获取内容等
+4. 新增涂鸦等功能
+
+再次感谢 kindeditor 的开发者,为我们提供了如此优秀的在线编辑器,让我们能在前人的基础上继续贡献自己的微薄之力。
+
+# 关于版本号
+NKeditor 沿用了 kindeditor 最后发布的版本号 v4.1.11,所以NKeditor 发布的第一个稳定版本是 v4.2.0, 以后的版本都是在 v4.2.0 版本的基础上发布的。
+
+# 在线演示
+
+### http://d.r9it.com/nkeditor/
+
+# 部署和构建
+1. npm install -g grunt-cli
+2. 切换到 NKeditor 根目录,执行 npm install
+3. 编译 : 执行 grunt
+4. 如果要打包的话,执行 grunt zip,就会把编辑器的有关的的文件全部打包放入 dist 文件夹中,解压之后你就会得到一个干净的编辑器了。直接访问 index.html 进行预览。
+
+# java版本接入
+在本人的另一个 spring-boot 开源项目 https://gitee.com/blackfox/spring-boot-demo 中做了集成,'
+这里顺便介绍一下 spring-boot-demo 项目,就是用 spring-boot 结合国产前端框架 AmazeUI 做了一个后台基础开发框架,集成了mybatis Mapper3, 分页插件,
+并集成了 shiro 实现了 RBAC 权限管理系统,可谓开箱即用,分分钟搭建好一个高大上的后台管理系统。
+
+clone 下来,导入数据库,更改application.yml的数据库配置,就可以直接运行了,登录进去就可以体验了。
+不过java版本目前只实现了七牛云的文件上传和管理,原生的没有做实现。
+
+# 使用说明
+1. 批量图片上传的插件依赖 jQuery-1.7 以上的版本,jquery需要自己手动引入,编辑器没有默认引入的,这样避免加载了你不需要的脚本库导致页面加载变慢
+2. 文件上传实现了 php 传统方式和七牛云图片上传,默认推荐使用七牛云,使用很简单,而且免费(企业版收费)。demo 上使用的是我的个人空间,多人测试的时候上传速度和并发都有很大的限制,如果大家测试的时候觉得慢,可以改成自己的七牛空间或者使用本地上传。
+5. 七牛云的 SDK 依赖 composer 构建,所以如果使用七牛云上传的话请在 php/qiniu 目录下执行 __composer install__
+4. 还有就是 demo 中我的七牛存储空间仅供大家测试使用,请不要上传有违法律法规和道德规范的图片和文件资源,你懂的 O(∩_∩)O~。
+3. 后端上传和文件管理代码我只是写了简单的 demo, 没有做安全处理之类,请谨慎使用,仅做参考。
+
+NKeditor 更新记录
+========
+
+### version 5.0.4
+* 修复代码高亮的预览的 Bug
+* 新增日文语言包
+
+### version 5.0.3
+* 删除了图片搜索和图片抓取功能
+* 增加代码高亮支持,新增编辑辅助功能
+* 新增插入引用(quote)插件,支持插入引用
+* 修复文件管理的无法获取七牛服务器文件列表的 bug
+* 美化表格控件,使用 bootstrap 表格样式
+* 美化内容预览插件,支持预览时候代码高亮,支持在预览页面引入自定义的 css 样式和 javascript 脚本
+* 修复 IE 下涂鸦上传失败的 bug
+
+### version 5.0.2
+* 修复字体,颜色等下拉菜单图标的位置的bug
+* 修复搜索相对路径的bug issue [https://gitee.com/blackfox/kindeditor/issues/IFLFS](https://gitee
+.com/blackfox/kindeditor/issues/IFLFS),感谢 @mean2015 的反馈
+* 重构了通用图片上传和图片列表的API,优化图片的存储和列表算法 issue [https://gitee.com/blackfox/kindeditor/issues/IFHXZ](https://gitee
+.com/blackfox/kindeditor/issues/IFHXZ), 感谢 @快乐的langYa 的反馈。
+
+在
+
+### version 5.0.1
+* 鉴于很多网友反馈新版的皮肤很丑,吓得宝宝赶紧修正了皮肤,更改图标尺寸和间距,使编辑器看起来不那么拥挤, 更改了样式,图标参参考了 "wysiwyg-editor", 看起来确实好多了,感谢 @
+公孙二狗 同学的推荐。
+* 删除了一些非主流色调的皮肤,恢复并保留了原版的皮肤,如果还是觉得原版皮肤好看的,可以通过设置 themeType:"default" 来加载原版的皮肤。
+* 新增了java 版本的接入 demo https://gitee.com/blackfox/spring-boot-demo.
+* 修复了一些已知的bug
+
+### version 5.0.0
+大版本更新,使用 sass 重写了全部的 css 代码,方便维护了,重写了皮肤,而且提供了5套皮肤供自由选择,修复了 N 个bug。 
+* 修复切换源代码再返回就看不到图标了的bug, 感谢开源中国用户 “吴小华” 同学的反馈
+* 修复 [#IFA3P](https://gitee.com/blackfox/kindeditor/issues/IFA3P) 提出的bug,弹出框和语言包的问题,提供新的 options 参数 dialogOffset 用来设置弹出框的位置。默认为 0 ,即居中显示。
+* 应广大网友的强烈要求,紧急更新了一套皮肤,默认使用了 svg 矢量图标,对于IE浏览器,使用 png 图标进行了兼容,不过清晰度没有 svg 那么高(这个是必须要的)
+* 新增 tableBorderColor 配置选项,设置表格的默认边框,并把表格的默认边框颜色设置为 #cccccc
+
+
+### version 4.2.2
+* 修复在有滚动条的时候,批量文件上传的弹框定位到不可见区域的bug
+* 给弹框新增 css3 animation 动画特效
+* 优化 loadStyle(), loadScript() 方法,新增缓存,避免同样的css和js资源被多次加载
+* 精简了项目,将类似的css的css,js合并复用,减少资源加载
+* 修复在伪静态php框架中,获取js相对路径出错而导致资源加载失败的bug
+
+### version 4.2.1
+* 修改语言包的加载方式,默认加载中文语言包,不用再手动通过 script 去加载,现在使用 NKeditor 只需要引入一个 NKeditor-all-min.js 就可以了
+* 精简资源,比较大的插件js,css 代码全部压缩,加载 min 版的静态资源。
+* 新增 [YYGraft](https://gitee.com/blackfox/scrawl)在线涂鸦工具插件,可以愉快的添加涂鸦了。
+* 修改图片上传类,支持 base64 图片上传
+
+### version 4.2.0(接原来kindeditor版本)
+* 调整了编辑器和弹出 dialog 的样式,美化了UI
+* 重写了图片上传和批量图片上传插件,使用 html5 上传代替了 flash,实现了待上传图片预览,优化用户体验
+* 添加七牛云上传支持,并封装了上传工具
+* 修复了一些已知的bug,如 ajax 提交无法获取内容等
+

+ 74 - 0
public/kindeditor/customplugin.js

@@ -0,0 +1,74 @@
+define(['nkeditor-core'], function (Nkeditor) {
+    Nkeditor.plugin('multiimage', function (K) {
+        var self = this, name = 'multiimage', lang = self.lang(name + '.'),
+            allowImages = K.undef(self.allowImages, false);
+
+        var click = function () {
+
+            var html = [
+                '<div class="ke-dialog-content-inner">',
+                '<div class="ke-dialog-row ke-clearfix">',
+                '<div class=""><div class="ke-inline-block ke-upload-button">' +
+                '<form class="ke-upload-area ke-form nice-validator n-default" method="post" enctype="multipart/form-data" style="width: 266px;margin:50px auto;">' +
+                '<span class="ke-button-common"><input type="button" class="ke-button-common ke-button" value="批量上传图片" style="width:128px;"></span><input type="file" class="ke-upload-file" name="imgFiles" multiple style="width:128px;left:0;right:inherit" tabindex="-1">' +
+                '<span class="ke-button-common" style="margin-left:10px;"><input type="button" class="ke-button-common ke-button ke-select-image" style="width:128px;" value="从图片空间选择"></span>' +
+                '</form>' +
+                '</div></span></div>',
+                '</div>',
+                '</div>'
+            ].join('');
+            var dialog = self.createDialog({
+                    name: name,
+                    width: Math.min(document.body.clientWidth, 450),
+                    height: 260,
+                    title: self.lang(name),
+                    body: html,
+                    noBtn: {
+                        name: self.lang('no'),
+                        click: function (e) {
+                            self.hideDialog().focus();
+                        }
+                    }
+                }),
+                div = dialog.div;
+            $("input[name=imgFiles]", div).change(function () {
+                dialog.showLoading();
+                var files = $(this).prop('files');
+                $.each(files, function (i, file) {
+                    self.beforeUpload.call(self, function (data) {
+                        self.exec('insertimage', Fast.api.cdnurl(data.data.url));
+                    }, file);
+                });
+                setTimeout(function () {
+                    self.hideDialog().focus();
+                }, 0);
+            });
+            $(".ke-select-image", div).click(function () {
+                self.loadPlugin('filemanager', function () {
+                    self.plugin.filemanagerDialog({
+                        dirName: 'image',
+                        multiple: true,
+                        clickFn: function (urls) {
+                            $.each(urls, function(i, url){
+                                self.exec('insertimage', Fast.api.cdnurl(url));
+                            });
+                        }
+                    });
+                });
+                self.hideDialog().focus();
+                // parent.Fast.api.open("general/attachment/select?element_id=&multiple=true&mimetype=*", __('Choose'), {
+                //     callback: function (data) {
+                //         var urlArr = data.url.split(/\,/);
+                //         $.each(urlArr, function () {
+                //             var url = Fast.api.cdnurl(this);
+                //             self.exec('insertimage', url);
+                //         });
+                //     }
+                // });
+            });
+        };
+        self.clickToolbar(name, click);
+    });
+
+    return Nkeditor;
+});

+ 201 - 0
public/kindeditor/index.html

@@ -0,0 +1,201 @@
+<!doctype html>
+<html>
+<head>
+	<meta charset="utf-8" />
+	<title>NKeditor 在线编辑器 PHP demo</title>
+	<link href="libs/bootstrap/bootstrap.min.css" rel="stylesheet">
+	<style>
+		.tab-pane form {
+			margin-top: 20px;
+		}
+	</style>
+</head>
+<body>
+
+	<div class="container" style="padding-top: 20px;">
+
+		<!-- Nav tabs -->
+		<ul class="nav nav-tabs" role="tablist">
+			<li role="presentation" class="active"><a href="#light" aria-controls="home" role="tab" data-toggle="tab">精简版</a></li>
+			<li role="presentation"><a href="#default" aria-controls="profile" role="tab" data-toggle="tab">全功能版</a></li>
+			<li role="presentation"><a href="#block" aria-controls="messages" role="tab" data-toggle="tab">雅黑主题</a></li>
+			<li role="presentation"><a href="#grey" aria-controls="messages" role="tab" data-toggle="tab">深灰主题</a></li>
+			<li role="presentation"><a href="#blue" aria-controls="settings" role="tab" data-toggle="tab">淡蓝主题</a></li>
+			<li role="presentation"><a href="#classic" aria-controls="settings" role="tab" data-toggle="tab">经典主题</a></li>
+		</ul>
+
+		<div class="tab-content">
+			<div role="tabpanel" class="tab-pane fade in active" id="light">
+				<form name="example" method="post">
+					<textarea name="content1" style="width:900px;height:500px;visibility:hidden;">
+						<p>
+							<ol>
+								<li>
+									sdasdass&nbsp; &nbsp; 呵呵。。。&nbsp;&nbsp;&nbsp;&nbsp;测试空格键
+								</li>
+							</ol>
+						</p>
+					</textarea>
+				</form>
+			</div>
+			<div role="tabpanel" class="tab-pane fade" id="default">
+				<form name="example" method="post">
+					<textarea name="content2" style="width:900px;height:500px;visibility:hidden;"></textarea>
+				</form>
+			</div>
+			<div role="tabpanel" class="tab-pane fade" id="block">
+				<form name="example" method="post">
+					<textarea name="content3" style="width:900px;height:500px;visibility:hidden;"></textarea>
+				</form>
+			</div>
+			<div role="tabpanel" class="tab-pane fade" id="grey">
+				<form name="example" method="post">
+					<textarea name="content4" style="width:900px;height:500px;visibility:hidden;"></textarea>
+				</form>
+			</div>
+			<div role="tabpanel" class="tab-pane fade" id="blue">
+				<form name="example" method="post">
+					<textarea name="content5" style="width:900px;height:500px;visibility:hidden;"></textarea>
+				</form>
+			</div>
+			<div role="tabpanel" class="tab-pane fade" id="classic">
+				<iframe frameborder="0" src="old.html" height="580" width="950"></iframe>
+			</div>
+		</div>
+
+		<div class="row container text-left" style="margin-top: 20px;">
+			<button class="btn btn-primary" id="btn">获取编辑器内容</button>
+		</div>
+
+	</div>
+
+	<script charset="utf-8" src="NKeditor-all.js"></script>
+	<!-- 如果你不需要使用批量图片上传,涂鸦功能和文件管理功能,就不需要引入 jquery -->
+	<script charset="utf-8" src="libs/jquery.min.js"></script>
+	<!-- JDialog是一款优秀的漂亮,轻量级的js弹出框插件 不是必须引入的,如果不引入则使用默认的 window.alert() 来弹出提示信息 -->
+	<script charset="utf-8" src="libs/JDialog/JDialog.min.js"></script>
+	<script src="libs/bootstrap/bootstrap.min.js"></script>
+	<script>
+		KindEditor.ready(function(K) {
+
+			K.create('textarea[name="content1"]', {
+				uploadJson : K.basePath+'php/qiniu/upload_json.php',
+				fileManagerJson : K.basePath+'php/qiniu/file_manager_json.php',
+				dialogOffset : 0, //对话框距离页面顶部的位置,默认为0居中,
+				allowFileManager : true,
+				items : ['source','formatblock', 'fontname', 'fontsize','forecolor','justifyleft', 'justifycenter', 'justifyright',
+					'justifyfull', 'insertorderedlist', 'insertunorderedlist', 'indent', 'outdent', 'bold', 'italic', 'underline',
+					'lineheight', 'removeformat','code', 'quote', 'plainpaste','image', 'table', 'hr', 'pagebreak','link', 'unlink',
+					'preview','about'
+				],
+				afterChange : function() {
+					this.sync();
+				},
+				themeType : "primary", //主题
+				//错误处理 handler
+				errorMsgHandler : function(message, type) {
+					try {
+						JDialog.msg({type:type, content:message, timer:2000});
+					} catch (Error) {
+						alert(message);
+					}
+				}
+			});
+
+			K.create('textarea[name="content2"]', {
+				uploadJson : K.basePath+'php/qiniu/upload_json.php',
+				fileManagerJson : K.basePath+'php/qiniu/file_manager_json.php',
+				// 添加上传参数
+				extraFileUploadParams : {
+					name: "RockYang",
+					sex: "Man"
+				},
+				dialogOffset : 0, //对话框距离页面顶部的位置,默认为0居中,
+				allowFileManager : true,
+				allowImageUpload : true,
+				allowMediaUpload : true,
+				//cssPath : [K.basePath+'plugins/code/prism.css'], //网编辑器中插入自定义的 css
+				//jsPath: ['http://www.r9it.com/assets/themes/twitter/js/jquery-1.11.1.min.js'], // 插入自定义的脚本
+				afterCreate : function() {
+					var self = this;
+					K.ctrl(document, 13, function() {
+						self.sync();
+						K('form[name=example]')[0].submit();
+					});
+					K.ctrl(self.edit.doc, 13, function() {
+						self.sync();
+						K('form[name=example]')[0].submit();
+					});
+				},
+				showHelpGrid: true, // 是否显示输入辅助线
+				themeType : "primary", //主题
+				//错误处理 handler
+				errorMsgHandler : function(message, type) {
+					try {
+						JDialog.msg({type:type, content:message, timer:2000});
+					} catch (Error) {
+						alert(message);
+					}
+				}
+			});
+
+			// black theme
+			K.create('textarea[name="content3"]', {
+				uploadJson : K.basePath+'php/default/upload_json.php',
+				fileManagerJson : K.basePath+'php/default/file_manager_json.php',
+				allowFileManager : true,
+				allowImageUpload : true,
+				allowMediaUpload : true,
+				themeType : "black", //主题
+				//错误处理 handler
+				errorMsgHandler : function(message, type) {
+					try {
+						JDialog.msg({type:type, content:message, timer:2000});
+					} catch (Error) {
+						alert(message);
+					}
+				}
+			});
+
+			K.create('textarea[name="content4"]', {
+				uploadJson : K.basePath+'php/default/upload_json.php',
+				fileManagerJson : K.basePath+'php/default/file_manager_json.php',
+				allowFileManager : true,
+				allowImageUpload : true,
+				allowMediaUpload : true,
+				themeType : "grey", //主题
+				//错误处理 handler
+				errorMsgHandler : function(message, type) {
+					try {
+						JDialog.msg({type:type, content:message, timer:2000});
+					} catch (Error) {
+						alert(message);
+					}
+				}
+			});
+
+			K.create('textarea[name="content5"]', {
+				uploadJson : K.basePath+'php/default/upload_json.php',
+				fileManagerJson : K.basePath+'php/default/file_manager_json.php',
+				allowFileManager : true,
+				allowImageUpload : true,
+				allowMediaUpload : true,
+				themeType : "blue", //主题
+				//错误处理 handler
+				errorMsgHandler : function(message, type) {
+					try {
+						JDialog.msg({type:type, content:message, timer:2000});
+					} catch (Error) {
+						alert(message);
+					}
+				}
+			});
+		});
+
+		$('#btn').click(function () {
+			alert($('textarea[name="content1"]').val());
+		});
+	</script>
+</body>
+</html>
+

+ 242 - 0
public/kindeditor/lang/ar.js

@@ -0,0 +1,242 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+* Arabic Translation By daif alotaibi (http://daif.net/)
+*******************************************************************************/
+
+KindEditor.lang({
+	source : 'عرض المصدر',
+	preview : 'معاينة الصفحة',
+	undo : 'تراجع(Ctrl+Z)',
+	redo : 'إعادة التراجع(Ctrl+Y)',
+	cut : 'قص(Ctrl+X)',
+	copy : 'نسخ(Ctrl+C)',
+	paste : 'لصق(Ctrl+V)',
+	plainpaste : 'لصق كنص عادي',
+	wordpaste : 'لصق من مايكروسفت ورد',
+	selectall : 'تحديد الكل',
+	justifyleft : 'محاذاه لليسار',
+	justifycenter : 'محاذاه للوسط',
+	justifyright : 'محاذاه لليمين',
+	justifyfull : 'محاذاه تلقائية',
+	insertorderedlist : 'قائمة مرقمه',
+	insertunorderedlist : 'قائمة نقطية',
+	indent : 'إزاحه النص',
+	outdent : 'إلغاء الازاحة',
+	subscript : 'أسفل النص',
+	superscript : 'أعلى النص',
+	formatblock : 'Paragraph format',
+	fontname : 'نوع الخط',
+	fontsize : 'حجم الخط',
+	forecolor : 'لون النص',
+	hilitecolor : 'لون خلفية النص',
+	bold : 'عريض(Ctrl+B)',
+	italic : 'مائل(Ctrl+I)',
+	underline : 'خط تحت النص(Ctrl+U)',
+	strikethrough : 'خط على النص',
+	removeformat : 'إزالة التنسيق',
+	image : 'إدراج صورة',
+	multiimage : 'Multi image',
+	flash : 'إدراج فلاش',
+	media : 'إدراج وسائط متعددة',
+	table : 'إدراج جدول',
+	tablecell : 'خلية',
+	hr : 'إدراج خط أفقي',
+	emoticons : 'إدراج وجه ضاحك',
+	link : 'رابط',
+	unlink : 'إزالة الرابط',
+	fullscreen : 'محرر ملئ الشاشة',
+	about : 'حول',
+	print : 'طباعة',
+	filemanager : 'مدير الملفات',
+	code : 'إدراج نص برمجي',
+	map : 'خرائط قووقل',
+	baidumap : 'خرائط قووقل',
+	lineheight : 'إرتفاع السطر',
+	clearhtml : 'مسح كود HTML',
+	pagebreak : 'إدراج فاصل صفحات',
+	quickformat : 'تنسيق سريع',
+	insertfile : 'إدراج ملف',
+	template : 'إدراج قالب',
+	anchor : 'رابط',
+	yes : 'موافق',
+	no : 'إلغاء',
+	close : 'إغلاق',
+	editImage : 'خصائص الصورة',
+	deleteImage : 'حذفالصورة',
+	editFlash : 'خصائص الفلاش',
+	deleteFlash : 'حذف الفلاش',
+	editMedia : 'خصائص الوسائط',
+	deleteMedia : 'حذف الوسائط',
+	editLink : 'خصائص الرابط',
+	deleteLink : 'إزالة الرابط',
+	editAnchor : 'Anchor properties',
+	deleteAnchor : 'Delete Anchor',
+	tableprop : 'خصائص الجدول',
+	tablecellprop : 'خصائص الخلية',
+	tableinsert : 'إدراج جدول',
+	tabledelete : 'حذف جدول',
+	tablecolinsertleft : 'إدراج عمود لليسار',
+	tablecolinsertright : 'إدراج عمود لليسار',
+	tablerowinsertabove : 'إدراج صف للأعلى',
+	tablerowinsertbelow : 'إدراج صف للأسفل',
+	tablerowmerge : 'دمج للأسفل',
+	tablecolmerge : 'دمج لليمين',
+	tablerowsplit : 'تقسم الصف',
+	tablecolsplit : 'تقسيم العمود',
+	tablecoldelete : 'حذف العمود',
+	tablerowdelete : 'حذف الصف',
+	noColor : 'إفتراضي',
+	pleaseSelectFile : 'Please select file.',
+	invalidImg : "الرجاء إدخال رابط صحيح.\nالملفات المسموح بها: jpg,gif,bmp,png",
+	invalidMedia : "الرجاء إدخال رابط صحيح.\nالملفات المسموح بها: swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb",
+	invalidWidth : "العرض يجب أن يكون رقم.",
+	invalidHeight : "الإرتفاع يجب أن يكون رقم.",
+	invalidBorder : "عرض الحد يجب أن يكون رقم.",
+	invalidUrl : "الرجاء إدخال رابط حيح.",
+	invalidRows : 'صفوف غير صحيح.',
+	invalidCols : 'أعمدة غير صحيحة.',
+	invalidPadding : 'The padding must be number.',
+	invalidSpacing : 'The spacing must be number.',
+	invalidJson : 'Invalid JSON string.',
+	uploadSuccess : 'تم رفع الملف بنجاح.',
+	cutError : 'حاليا غير مدعومة من المتصفح, إستخدم إختصار لوحة المفاتيح (Ctrl+X).',
+	copyError : 'حاليا غير مدعومة من المتصفح, إستخدم إختصار لوحة المفاتيح (Ctrl+C).',
+	pasteError : 'حاليا غير مدعومة من المتصفح, إستخدم إختصار لوحة المفاتيح (Ctrl+V).',
+	ajaxLoading : 'Loading ...',
+	uploadLoading : 'Uploading ...',
+	uploadError : 'Upload Error',
+	'plainpaste.comment' : 'إستخدم إختصار لوحة المفاتيح (Ctrl+V) للصق داخل النافذة.',
+	'wordpaste.comment' : 'إستخدم إختصار لوحة المفاتيح (Ctrl+V) للصق داخل النافذة.',
+	'code.pleaseInput' : 'Please input code.',
+	'link.url' : 'الرابط',
+	'link.linkType' : 'الهدف',
+	'link.newWindow' : 'نافذة جديدة',
+	'link.selfWindow' : 'نفس النافذة',
+	'flash.url' : 'الرابط',
+	'flash.width' : 'العرض',
+	'flash.height' : 'الإرتفاع',
+	'flash.upload' : 'رفع',
+	'flash.viewServer' : 'أستعراض',
+	'media.url' : 'الرابط',
+	'media.width' : 'العرض',
+	'media.height' : 'الإرتفاع',
+	'media.autostart' : 'تشغيل تلقائي',
+	'media.upload' : 'رفع',
+	'media.viewServer' : 'أستعراض',
+	'image.remoteImage' : 'إدراج الرابط',
+	'image.localImage' : 'رفع',
+	'image.remoteUrl' : 'الرابط',
+	'image.localUrl' : 'الملف',
+	'image.size' : 'الحجم',
+	'image.width' : 'العرض',
+	'image.height' : 'الإرتفاع',
+	'image.resetSize' : 'إستعادة الأبعاد',
+	'image.align' : 'محاذاة',
+	'image.defaultAlign' : 'الإفتراضي',
+	'image.leftAlign' : 'اليسار',
+	'image.rightAlign' : 'اليمين',
+	'image.imgTitle' : 'العنوان',
+	'image.upload' : 'أستعراض',
+	'image.viewServer' : 'أستعراض',
+	'multiimage.uploadDesc' : 'Allows users to upload <%=uploadLimit%> images, single image size not exceeding <%=sizeLimit%>',
+	'multiimage.startUpload' : 'Start upload',
+	'multiimage.clearAll' : 'Clear all',
+	'multiimage.insertAll' : 'Insert all',
+	'multiimage.queueLimitExceeded' : 'Queue limit exceeded.',
+	'multiimage.fileExceedsSizeLimit' : 'File exceeds size limit.',
+	'multiimage.zeroByteFile' : 'Zero byte file.',
+	'multiimage.invalidFiletype' : 'Invalid file type.',
+	'multiimage.unknownError' : 'Unknown upload error.',
+	'multiimage.pending' : 'Pending ...',
+	'multiimage.uploadError' : 'Upload error',
+	'filemanager.emptyFolder' : 'فارغ',
+	'filemanager.moveup' : 'المجلد الأب',
+	'filemanager.viewType' : 'العرض: ',
+	'filemanager.viewImage' : 'مصغرات',
+	'filemanager.listImage' : 'قائمة',
+	'filemanager.orderType' : 'الترتيب: ',
+	'filemanager.fileName' : 'بالإسم',
+	'filemanager.fileSize' : 'بالحجم',
+	'filemanager.fileType' : 'بالنوع',
+	'insertfile.url' : 'الرابط',
+	'insertfile.title' : 'العنوان',
+	'insertfile.upload' : 'رفع',
+	'insertfile.viewServer' : 'أستعراض',
+	'table.cells' : 'خلايا',
+	'table.rows' : 'صفوف',
+	'table.cols' : 'أعمدة',
+	'table.size' : 'الأبعاد',
+	'table.width' : 'العرض',
+	'table.height' : 'الإرتفاع',
+	'table.percent' : '%',
+	'table.px' : 'px',
+	'table.space' : 'الخارج',
+	'table.padding' : 'الداخل',
+	'table.spacing' : 'الفراغات',
+	'table.align' : 'محاذاه',
+	'table.textAlign' : 'افقى',
+	'table.verticalAlign' : 'رأسي',
+	'table.alignDefault' : 'إفتراضي',
+	'table.alignLeft' : 'يسار',
+	'table.alignCenter' : 'وسط',
+	'table.alignRight' : 'يمين',
+	'table.alignTop' : 'أعلى',
+	'table.alignMiddle' : 'منتصف',
+	'table.alignBottom' : 'أسفل',
+	'table.alignBaseline' : 'Baseline',
+	'table.border' : 'الحدود',
+	'table.borderWidth' : 'العرض',
+	'table.borderColor' : 'اللون',
+	'table.backgroundColor' : 'الخلفية',
+	'map.address' : 'العنوان: ',
+	'map.search' : 'بحث',
+	'baidumap.address' : 'العنوان: ',
+	'baidumap.search' : 'بحث',
+	'baidumap.insertDynamicMap' : 'Dynamic Map',
+	'anchor.name' : 'إسم الرابط',
+	'formatblock.formatBlock' : {
+		h1 : 'عنوان 1',
+		h2 : 'عنوان 2',
+		h3 : 'عنوان 3',
+		h4 : 'عنوان 4',
+		p : 'عادي'
+	},
+	'fontname.fontName' : {
+		'Arial' : 'Arial',
+		'Arial Black' : 'Arial Black',
+		'Comic Sans MS' : 'Comic Sans MS',
+		'Courier New' : 'Courier New',
+		'Garamond' : 'Garamond',
+		'Georgia' : 'Georgia',
+		'Tahoma' : 'Tahoma',
+		'Times New Roman' : 'Times New Roman',
+		'Trebuchet MS' : 'Trebuchet MS',
+		'Verdana' : 'Verdana'
+	},
+	'lineheight.lineHeight' : [
+		{'1' : 'إرتفاع السطر 1'},
+		{'1.5' : 'إرتفاع السطر 1.5'},
+		{'2' : 'إرتفاع السطر 2'},
+		{'2.5' : 'إرتفاع السطر 2.5'},
+		{'3' : 'إرتفاع السطر 3'}
+	],
+	'template.selectTemplate' : 'قالب',
+	'template.replaceContent' : 'إستبدال المحتوى الحالي',
+	'template.fileList' : {
+		'1.html' : 'صورة ونص',
+		'2.html' : 'جدول',
+		'3.html' : 'قائمة'
+	}
+}, 'ar');
+
+KindEditor.each(KindEditor.options.items, function(i, name) {
+	if (name == 'baidumap') {
+		KindEditor.options.items[i] = 'map';
+	}
+});
+KindEditor.options.langType = 'ar';

+ 243 - 0
public/kindeditor/lang/en.js

@@ -0,0 +1,243 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.lang({
+	source : 'Source',
+	preview : 'Preview',
+	undo : 'Undo(Ctrl+Z)',
+	redo : 'Redo(Ctrl+Y)',
+	cut : 'Cut(Ctrl+X)',
+	copy : 'Copy(Ctrl+C)',
+	paste : 'Paste(Ctrl+V)',
+	plainpaste : 'Paste as plain text',
+	wordpaste : 'Paste from Word',
+	selectall : 'Select all',
+	justifyleft : 'Align left',
+	justifycenter : 'Align center',
+	justifyright : 'Align right',
+	justifyfull : 'Align full',
+	insertorderedlist : 'Ordered list',
+	insertunorderedlist : 'Unordered list',
+	indent : 'Increase indent',
+	outdent : 'Decrease indent',
+	subscript : 'Subscript',
+	superscript : 'Superscript',
+	formatblock : 'Paragraph format',
+	fontname : 'Font family',
+	fontsize : 'Font size',
+	forecolor : 'Text color',
+	hilitecolor : 'Highlight color',
+	bold : 'Bold(Ctrl+B)',
+	italic : 'Italic(Ctrl+I)',
+	underline : 'Underline(Ctrl+U)',
+	strikethrough : 'Strikethrough',
+	removeformat : 'Remove format',
+	image : 'Image',
+	multiimage : 'Multi image',
+	flash : 'Flash',
+	media : 'Embeded media',
+	table : 'Table',
+	tablecell : 'Cell',
+	hr : 'Insert horizontal line',
+	emoticons : 'Insert emoticon',
+	link : 'Link',
+	unlink : 'Unlink',
+	fullscreen : 'Toggle fullscreen mode',
+	about : 'About',
+	print : 'Print',
+	filemanager : 'File Manager',
+	code : 'Insert code',
+	map : 'Google Maps',
+	baidumap : 'Baidu Maps',
+	lineheight : 'Line height',
+	clearhtml : 'Clear HTML code',
+	pagebreak : 'Insert Page Break',
+	quickformat : 'Quick Format',
+	insertfile : 'Insert file',
+	template : 'Insert Template',
+	anchor : 'Anchor',
+	yes : 'OK',
+	no : 'Cancel',
+	close : 'Close',
+	editImage : 'Image properties',
+	deleteImage : 'Delete image',
+	editFlash : 'Flash properties',
+	deleteFlash : 'Delete flash',
+	editMedia : 'Media properties',
+	deleteMedia : 'Delete media',
+	editLink : 'Link properties',
+	deleteLink : 'Unlink',
+	editAnchor : 'Anchor properties',
+	deleteAnchor : 'Delete Anchor',
+	tableprop : 'Table properties',
+	tablecellprop : 'Cell properties',
+	tableinsert : 'Insert table',
+	tabledelete : 'Delete table',
+	tablecolinsertleft : 'Insert column left',
+	tablecolinsertright : 'Insert column right',
+	tablerowinsertabove : 'Insert row above',
+	tablerowinsertbelow : 'Insert row below',
+	tablerowmerge : 'Merge down',
+	tablecolmerge : 'Merge right',
+	tablerowsplit : 'Split row',
+	tablecolsplit : 'Split column',
+	tablecoldelete : 'Delete column',
+	tablerowdelete : 'Delete row',
+	noColor : 'Default',
+	pleaseSelectFile : 'Please select file.',
+	invalidImg : "Please type valid URL.\nAllowed file extension: jpg,gif,bmp,png",
+	invalidMedia : "Please type valid URL.\nAllowed file extension: swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb",
+	invalidWidth : "The width must be number.",
+	invalidHeight : "The height must be number.",
+	invalidBorder : "The border must be number.",
+	invalidUrl : "Please type valid URL.",
+	invalidRows : 'Invalid rows.',
+	invalidCols : 'Invalid columns.',
+	invalidPadding : 'The padding must be number.',
+	invalidSpacing : 'The spacing must be number.',
+	invalidJson : 'Invalid JSON string.',
+	uploadSuccess : 'Upload success.',
+	cutError : 'Currently not supported by your browser, use keyboard shortcut(Ctrl+X) instead.',
+	copyError : 'Currently not supported by your browser, use keyboard shortcut(Ctrl+C) instead.',
+	pasteError : 'Currently not supported by your browser, use keyboard shortcut(Ctrl+V) instead.',
+	ajaxLoading : 'Loading ...',
+	uploadLoading : 'Uploading ...',
+	uploadError : 'Upload Error',
+	'plainpaste.comment' : 'Use keyboard shortcut(Ctrl+V) to paste the text into the window.',
+	'wordpaste.comment' : 'Use keyboard shortcut(Ctrl+V) to paste the text into the window.',
+	'code.pleaseInput' : 'Please input code.',
+	'link.url' : 'URL',
+	'link.linkType' : 'Target',
+	'link.newWindow' : 'New window',
+	'link.selfWindow' : 'Same window',
+	'flash.url' : 'URL',
+	'flash.width' : 'Width',
+	'flash.height' : 'Height',
+	'flash.upload' : 'Upload',
+	'flash.viewServer' : 'Browse',
+	'media.url' : 'URL',
+	'media.width' : 'Width',
+	'media.height' : 'Height',
+	'media.autostart' : 'Auto start',
+	'media.upload' : 'Upload',
+	'media.viewServer' : 'Browse',
+	'image.remoteImage' : 'Insert URL',
+	'image.localImage' : 'Upload',
+	'image.remoteUrl' : 'URL',
+	'image.localUrl' : 'File',
+	'image.size' : 'Size',
+	'image.width' : 'Width',
+	'image.height' : 'Height',
+	'image.resetSize' : 'Reset dimensions',
+	'image.align' : 'Align',
+	'image.defaultAlign' : 'Default',
+	'image.leftAlign' : 'Left',
+	'image.rightAlign' : 'Right',
+	'image.imgTitle' : 'Title',
+	'image.upload' : 'Browse',
+	'image.viewServer' : 'Browse',
+	'multiimage.uploadDesc' : 'Allows users to upload <%=uploadLimit%> images, single image size not exceeding <%=sizeLimit%>',
+	'multiimage.startUpload' : 'Start upload',
+	'multiimage.clearAll' : 'Clear all',
+	'multiimage.insertAll' : 'Insert all',
+	'multiimage.queueLimitExceeded' : 'Queue limit exceeded.',
+	'multiimage.fileExceedsSizeLimit' : 'File exceeds size limit.',
+	'multiimage.zeroByteFile' : 'Zero byte file.',
+	'multiimage.invalidFiletype' : 'Invalid file type.',
+	'multiimage.unknownError' : 'Unknown upload error.',
+	'multiimage.pending' : 'Pending ...',
+	'multiimage.uploadError' : 'Upload error',
+	'filemanager.emptyFolder' : 'Blank',
+	'filemanager.moveup' : 'Parent folder',
+	'filemanager.viewType' : 'Display: ',
+	'filemanager.viewImage' : 'Thumbnails',
+	'filemanager.listImage' : 'List',
+	'filemanager.orderType' : 'Sorting: ',
+	'filemanager.fileName' : 'By name',
+	'filemanager.fileSize' : 'By size',
+	'filemanager.fileType' : 'By type',
+	'insertfile.url' : 'URL',
+	'insertfile.title' : 'Title',
+	'insertfile.upload' : 'Upload',
+	'insertfile.viewServer' : 'Browse',
+	'table.cells' : 'Cells',
+	'table.rows' : 'Rows',
+	'table.cols' : 'Columns',
+	'table.size' : 'Dimensions',
+	'table.width' : 'Width',
+	'table.height' : 'Height',
+	'table.percent' : '%',
+	'table.px' : 'px',
+	'table.space' : 'Space',
+	'table.padding' : 'Padding',
+	'table.spacing' : 'Spacing',
+	'table.align' : 'Align',
+	'table.textAlign' : 'Horizontal',
+	'table.verticalAlign' : 'Vertical',
+	'table.alignDefault' : 'Default',
+	'table.alignLeft' : 'Left',
+	'table.alignCenter' : 'Center',
+	'table.alignRight' : 'Right',
+	'table.alignTop' : 'Top',
+	'table.alignMiddle' : 'Middle',
+	'table.alignBottom' : 'Bottom',
+	'table.alignBaseline' : 'Baseline',
+	'table.border' : 'Border',
+	'table.borderWidth' : 'Width',
+	'table.borderColor' : 'Color',
+	'table.backgroundColor' : 'Background',
+	'map.address' : 'Address: ',
+	'map.search' : 'Search',
+	'baidumap.address' : 'Address: ',
+	'baidumap.search' : 'Search',
+	'baidumap.insertDynamicMap' : 'Dynamic Map',
+	'anchor.name' : 'Anchor name',
+	'formatblock.formatBlock' : {
+		h1 : 'Heading 1',
+		h2 : 'Heading 2',
+		h3 : 'Heading 3',
+		h4 : 'Heading 4',
+		p : 'Normal'
+	},
+	'fontname.fontName' : {
+		'Arial' : 'Arial',
+		'Arial Black' : 'Arial Black',
+		'Comic Sans MS' : 'Comic Sans MS',
+		'Courier New' : 'Courier New',
+		'Garamond' : 'Garamond',
+		'Georgia' : 'Georgia',
+		'Tahoma' : 'Tahoma',
+		'Times New Roman' : 'Times New Roman',
+		'Trebuchet MS' : 'Trebuchet MS',
+		'Verdana' : 'Verdana'
+	},
+	'lineheight.lineHeight' : [
+		{'1' : 'Line height 1'},
+		{'1.5' : 'Line height 1.5'},
+		{'2' : 'Line height 2'},
+		{'2.5' : 'Line height 2.5'},
+		{'3' : 'Line height 3'}
+	],
+	'template.selectTemplate' : 'Template',
+	'template.replaceContent' : 'Replace current content',
+	'template.fileList' : {
+		'1.html' : 'Image and Text',
+		'2.html' : 'Table',
+		'3.html' : 'List'
+	}
+}, 'en');
+
+//自动加载代码美化的js插件
+// KindEditor.loadScript(KindEditor.options.pluginsPath+"code/prettify.js");
+// KindEditor.each(KindEditor.options.items, function(i, name) {
+// 	if (name == 'code') {
+// 		KindEditor.options.items[i] = 'map';
+// 	}
+// });
+KindEditor.options.langType = 'en';

+ 234 - 0
public/kindeditor/lang/ja-JP.js

@@ -0,0 +1,234 @@
+/*******************************************************************************
+* @author 您的名字 お名前
+*******************************************************************************/
+
+KindEditor.lang({
+	source : 'HTMLコード',
+	preview : 'プレビュー',
+	undo : '戻る(Ctrl+Z)',
+	redo : '進む(Ctrl+Y)',
+	cut : 'カット(Ctrl+X)',
+	copy : 'コピー(Ctrl+C)',
+	paste : '貼り付け(Ctrl+V)',
+	plainpaste : 'フォーマットされていないテキストとして貼り付ける',
+	wordpaste : '「word」ドからペースト',
+	selectall : 'すべて選択(Ctrl+A)',
+	justifyleft : '左揃え',
+	justifycenter : '中央揃え',
+	justifyright : '右揃え',
+	justifyfull : '両端揃え',
+	insertorderedlist : '番号',
+	insertunorderedlist : '箇条書き',
+	indent : 'インデントを増やす',
+	outdent : 'インデントを減らす',
+	subscript : '下付き',
+	superscript : '上付き',
+	formatblock : '段落',
+	fontname : 'フォント',
+	fontsize : 'フォントサイズ',
+	forecolor : 'フォントカラー',
+	hilitecolor : 'テキストの背景',
+	bold : '太字(Ctrl+B)',
+	italic : '斜体(Ctrl+I)',
+	underline : '下線(Ctrl+U)',
+	strikethrough : '取り消し線',
+	removeformat : 'フォーマットを削除',
+	image : '画像',
+	multiimage : '一括画像アップロード',
+	flash : 'Flash',
+	media : 'ビデオとオーディオ',
+	table : 'テーブル',
+	tablecell : 'セル',
+	hr : '水平線を挿入する',
+	emoticons : '絵文字を挿入する',
+	link : 'ハイパーリンク',
+	unlink : 'ハイパーリンクをキャンセル',
+	fullscreen : 'フルスクリーン表示',
+	about : 'について',
+	print : 'プリント(Ctrl+P)',
+	filemanager : 'ファイルスペース',
+	code : 'プログラムコードを挿入',
+	map : 'Googleマップ',
+	baidumap : 'Baiduマップ',
+	lineheight : '行間隔',
+	clearhtml : 'HTMLコードをクリア',
+	pagebreak : 'ページ区切りの挿入',
+	quickformat : 'ワンクリックレイアウト',
+	insertfile : 'ファイルの挿入',
+	template : 'テンプレートの挿入',
+	anchor : 'アンカー',
+	yes : 'はい',
+	no : 'いいえ',
+	close : '閉じる',
+	editImage : 'イメージプロパティ',
+	deleteImage : 'イメージを削除',
+	editFlash : 'Flashプロパティ',
+	deleteFlash : 'Flashを削除',
+	editMedia : 'ビデオとオーディオのプロパティ',
+	deleteMedia : 'ビデオとオーディオを削除',
+	editLink : 'ハイパーリンク属性',
+	deleteLink : 'ハイパーリンクを削除',
+	editAnchor : 'アンカー属性',
+	deleteAnchor : 'アンカーを削除',
+	tableprop : 'テーブル属性',
+	tablecellprop : 'セル属性',
+	tableinsert : 'テーブルを挿入',
+	tabledelete : 'テーブルを削除',
+	tablecolinsertleft : '左に列を挿入する',
+	tablecolinsertright : '右に列を挿入する',
+	tablerowinsertabove : '上に行を挿入する',
+	tablerowinsertbelow : '下に行を挿入する',
+	tablerowmerge : '下にセルをマージする',
+	tablecolmerge : '右にセルをマージする',
+	tablerowsplit : '行を分割',
+	tablecolsplit : '列を分割',
+	tablecoldelete : '列を削除',
+	tablerowdelete : '行を削除',
+	noColor : '色なし',
+	pleaseSelectFile : 'ファイルを選択してください。',
+	invalidImg : "有効なURLアドレスを入力してください。\ n jpg、gif、bmp、png形式のみが許可されています。",
+	invalidMedia : "有効なURLアドレスを入力してください。swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb形式のみが許可されています。",
+	invalidWidth : "幅は数字でなければなりません。",
+	invalidHeight : "高さは数字でなければなりません。",
+	invalidBorder : "ボーダーは数字でなければなりません。",
+	invalidUrl : "有効なURLアドレスを入力してください。",
+	invalidRows : '行数は必須項目で、0以上の数字を入力してください。',
+	invalidCols : '列数は必須項目で、0以上の数字を入力してください。',
+	invalidPadding : 'マージンは数字でなければなりません。',
+	invalidSpacing : 'スペースは数字でなければなりません。',
+	invalidJson : 'サーバーエラー。',
+	uploadSuccess : 'アップロード成功。',
+	cutError : 'ブラウザのセキュリティ設定によってカット操作を使用できないので、ショートカットキー(Ctrl + X)を使用してください。',
+	copyError : 'ブラウザのセキュリティ設定によってコピー操作をできないので、ショートカットキー(Ctrl + C)を使用してください。',
+	pasteError : 'ブラウザのセキュリティ設定によって貼り付け操作をできないので、ショートカットキー(Ctrl + V)を使用してください。',
+	ajaxLoading : '読み込み中、お待ちください...',
+	uploadLoading : 'アップロード、しばらくお待ちください...',
+	uploadError : 'アップロードエラー',
+	'plainpaste.comment' : 'ショートカットキー(Ctrl + V)でコンテンツを下のボックスに貼り付けてください。',
+	'wordpaste.comment' : 'ショートカットキー(Ctrl + V)でコンテンツを下のボックスに貼り付けてください。',
+	'code.pleaseInput' : 'プログラムコードを入力してください。 ',
+	'link.url' : 'URL',
+	'link.linkType' : 'タイプを開く',
+	'link.newWindow' : '新しいウィンドウ',
+	'link.selfWindow' : '現在のウィンドウ',
+	'flash.url' : 'URL',
+	'flash.width' : '幅',
+	'flash.height' : '高さ',
+	'flash.upload' : 'アップロード',
+	'flash.viewServer' : 'ファイルスペース',
+	'media.url' : 'URL',
+	'media.width' : '幅',
+	'media.height' : '高さ',
+	'media.autostart' : '自動再生',
+	'media.upload' : 'アップロード',
+	'media.viewServer' : 'ファイルスペース',
+	'image.remoteImage' : 'ネットワークイメージ',
+	'image.localImage' : 'ローカルアップロード',
+	'image.remoteUrl' : 'イメージアドレス  ',
+	'image.localUrl' : 'アップロードファイル',
+	'image.size' : 'イメージサイズ',
+	'image.width' : '幅',
+	'image.height' : '高さ',
+	'image.resetSize' : 'リセットサイズ',
+	'image.align' : '配置',
+	'image.defaultAlign' : 'デフォルト',
+	'image.leftAlign' : '左揃え',
+	'image.rightAlign' : '右揃え',
+	'image.imgTitle' : '画像の説明',
+	'image.upload' : 'ブラウズ...',
+	'image.viewServer' : 'イメージスペース',
+	'multiimage.uploadDesc' : 'ユーザーが<%= uploadLimit%>画像を同時にアップロードできますが、画像の容量は<%= sizeLimit%>を超えることができません',
+	'multiimage.startUpload' : 'アップロード',
+	'multiimage.clearAll' : 'すべてクリア',
+	'multiimage.insertAll' : 'すべて挿入',
+	'multiimage.queueLimitExceeded' : 'ファイルの数が上限を超えています。',
+	'multiimage.fileExceedsSizeLimit' : 'ファイルサイズが制限を超えています。',
+	'multiimage.zeroByteFile' : '空のファイルをアップロードできません。   ',
+	'multiimage.invalidFiletype' : 'ファイル形式は正しくありません。',
+	'multiimage.unknownError' : 'エラー、アップロードできません。',
+	'multiimage.pending' : 'アップロード待ち',
+	'multiimage.uploadError' : 'アップロード失敗',
+	'filemanager.emptyFolder' : '空のフォルダ',
+	'filemanager.moveup' : '前のフォルダに移動',
+	'filemanager.viewType' : '表示モード:',
+	'filemanager.viewImage' : 'サムネイル',
+	'filemanager.listImage' : '詳細',
+	'filemanager.orderType' : '並べ替え:',
+	'filemanager.fileName' : 'ネーム',
+	'filemanager.fileSize' : 'サイズ',
+	'filemanager.fileType' : 'タイプ',
+	'insertfile.url' : 'URL',
+	'insertfile.title' : 'ファイルの説明',
+	'insertfile.upload' : 'アップロード',
+	'insertfile.viewServer' : 'ファイルスペース',
+	'table.cells' : 'セル番号',
+	'table.rows' : '行数',
+	'table.cols' : '列数',
+	'table.size' : 'サイズ',
+	'table.width' : '幅',
+	'table.height' : '高さ',
+	'table.percent' : '%',
+	'table.px' : 'px',
+	'table.space' : 'テーブルスペース',
+	'table.padding' : 'パッディング',
+	'table.spacing' : 'スペース',
+	'table.align' : '配置',
+	'table.textAlign' : '水平配置',
+	'table.verticalAlign' : '垂直配置',
+	'table.alignDefault' : 'デフォルト',
+	'table.alignLeft' : '左揃え',
+	'table.alignCenter' : '中央揃え',
+	'table.alignRight' : '右揃え',
+	'table.alignTop' : 'トップ',
+	'table.alignMiddle' : 'ミドル',
+	'table.alignBottom' : 'ボトム',
+	'table.alignBaseline' : 'ベースライン',
+	'table.border' : 'ボーダー',
+	'table.borderWidth' : 'ボーダー',
+	'table.borderColor' : 'カラー',
+	'table.backgroundColor' : '背景色',
+	'map.address' : 'アドレス: ',
+	'map.search' : '検索',
+	'baidumap.address' : 'アドレス: ',
+	'baidumap.search' : '検索',
+	'baidumap.insertDynamicMap' : 'ダイナミックマップの挿入',
+	'anchor.name' : 'アンカー名',
+		
+	'formatblock.formatBlock' : {
+		h1 : '見出し1',
+		h2 : '見出し2',
+		h3 : '見出し3',
+		h4 : '見出し4',
+		p : '正 文'
+	},
+	'fontname.fontName' : {
+		'SimSun' : '明朝体',
+		'NSimSun' : '新宋体',
+		'FangSong_GB2312' : '仿宋_GB2312',
+		'KaiTi_GB2312' : '楷書体_GB2312',
+		'SimHei' : 'ゴチック体',
+		'Microsoft YaHei' : 'Msyh',
+		'Arial' : 'Arial',
+		'Arial Black' : 'Arial Black',
+		'Times New Roman' : 'Times New Roman',
+		'Courier New' : 'Courier New',
+		'Tahoma' : 'Tahoma',
+		'Verdana' : 'Verdana'
+	},
+	'lineheight.lineHeight' : [
+		{'1' : '行間1倍'},
+		{'1.5' : '行間1.5倍'},
+		{'2' : '行間2倍'},
+		{'2.5' : '行間2.5倍'},
+		{'3' : '行間3倍'}
+	],
+	'template.selectTemplate' : 'オプションテンプレート',
+	'template.replaceContent' : '現在のコンテンツを置き換える',
+	'template.fileList' : {
+		'1.html' : 'イメージとテキスト',
+		'2.html' : '表',
+		'3.html' : '段落番号'
+	}
+}, 'ja-JP');
+
+KindEditor.options.langType = 'ja-JP';

+ 246 - 0
public/kindeditor/lang/ko.js

@@ -0,0 +1,246 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Composite <ukjinplant@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.lang({
+	source : '소스',
+	preview : '미리보기',
+	undo : '작업취소(Ctrl+Z)',
+	redo : '작업재개(Ctrl+Y)',
+	cut : '잘라내기(Ctrl+X)',
+	copy : '복사(Ctrl+C)',
+	paste : '붙여넣기(Ctrl+V)',
+	plainpaste : '일반 텍스트로 붙여넣기',
+	wordpaste : '워드 문서로 붙여넣기',
+	selectall : '전체 선택',
+	justifyleft : '왼쪽 정렬',
+	justifycenter : '가운데 정렬',
+	justifyright : '오른쪽 정렬',
+	justifyfull : '양쪽 정렬',
+	insertorderedlist : '순서 목록',
+	insertunorderedlist : '비순서 목록',
+	indent : '들여쓰기',
+	outdent : '내어쓰기',
+	subscript : '아랫첨자',
+	superscript : '윗첨자',
+	formatblock : '문단 형식',
+	fontname : '글꼴',
+	fontsize : '글자 크기',
+	forecolor : '글자색',
+	hilitecolor : '강조색',
+	bold : '굵게(Ctrl+B)',
+	italic : '이텔릭(Ctrl+I)',
+	underline : '빝줄(Ctrl+U)',
+	strikethrough : '취소선',
+	removeformat : '형식 제거',
+	image : '이미지 추가',
+	multiimage : '여러 이미지 추가',
+	flash : '플래시 추가',
+	media : '미디어 추가',
+	table : '표',
+	tablecell : '열',
+	hr : '구분선 추가',
+	emoticons : '이모티콘 추가',
+	link : '링크',
+	unlink : '링크 제거',
+	fullscreen : '전체 화면 모드',
+	about : '이 에디터는...',
+	print : '인쇄',
+	filemanager : '파일 관리자',
+	code : '코드 추가',
+	map : '구글 맵 추가',
+	baidumap : '바이두 맵 추가',
+	lineheight : '행 간격',
+	clearhtml : 'HTML 코드 정리',
+	pagebreak : '페이지 구분 추가',
+	quickformat : '빠른 형식',
+	insertfile : '파일 추가',
+	template : '템플릿 추가',
+	anchor : '책갈피',
+	yes : '확인',
+	no : '취소',
+	close : '닫기',
+	editImage : '이미지 속성',
+	deleteImage : '이미지 삭제',
+	editFlash : '플래시 속성',
+	deleteFlash : '플래시 삭제',
+	editMedia : '미디어 속성',
+	deleteMedia : '미디어 삭제',
+	editLink : '링크 속성',
+	deleteLink : '링크 삭제',
+	editAnchor : 'Anchor properties',
+	deleteAnchor : 'Delete Anchor',
+	tableprop : '표 속성',
+	tablecellprop : '열 속성',
+	tableinsert : '표 추가',
+	tabledelete : '표 삭제',
+	tablecolinsertleft : '왼쪽으로 열 추가',
+	tablecolinsertright : '오른쪽으로 열 추가',
+	tablerowinsertabove : '위쪽으로 열 추가',
+	tablerowinsertbelow : '아래쪽으로 열 추가',
+	tablerowmerge : '아래로 병합',
+	tablecolmerge : '오른쪽으로 병합',
+	tablerowsplit : '행 나누기',
+	tablecolsplit : '열 나누기',
+	tablecoldelete : '열 삭제',
+	tablerowdelete : '행 삭제',
+	noColor : '기본색',
+	pleaseSelectFile : '파일 선택',
+	invalidImg : "올바른 주소를 입력하세요.\njpg,gif,bmp,png 형식이 가능합니다.",
+	invalidMedia : "올바른 주소를 입력하세요.\nswf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb 형식이 가능합니다.",
+	invalidWidth : "넓이 값은 숫자여야 합니다.",
+	invalidHeight : "높이 값은 숫자여야 합니다.",
+	invalidBorder : "굵기 값은 숫자여야 합니다.",
+	invalidUrl : "올바른 주소를 입력하세요.",
+	invalidRows : '올바른 행이 아닙니다.',
+	invalidCols : '올바른 열이 아닙니다.',
+	invalidPadding : '안쪽 여백 값은 숫자여야 합니다.',
+	invalidSpacing : '간격 길이 값은 숫자여야 합니다.',
+	invalidJson : '올바른 JSON 형식이 아닙니다.',
+	uploadSuccess : '업로드가 완료되었습니다.',
+	cutError : '브라우저가 잘라내기 기능을 지원하지 않습니다, 단축키로 대신 사용하세요. (Ctrl+X)',
+	copyError : '브라우저가 복사 기능을 지원하지 않습니다, 단축키로 대신 사용하세요. (Ctrl+X)',
+	pasteError : '브라우저가 붙여넣기 기능을 지원하지 않습니다, 단축키로 대신 사용하세요. (Ctrl+X)',
+	ajaxLoading : '불러오는 중 ...',
+	uploadLoading : '업로드 중 ...',
+	uploadError : '업로드 오류',
+	'plainpaste.comment' : '단축키(Ctrl+V)를 통하여 여기에 텍스트를 붙여넣으세요.',
+	'wordpaste.comment' : '단축키(Ctrl+V)를 통하여 여기에 워드 텍스트를 붙여넣으세요.',
+	'code.pleaseInput' : 'Please input code.',
+	'link.url' : '주소',
+	'link.linkType' : '창',
+	'link.newWindow' : '새 창',
+	'link.selfWindow' : '현재 창',
+	'flash.url' : '주소',
+	'flash.width' : '넓이',
+	'flash.height' : '높이',
+	'flash.upload' : '업로드',
+	'flash.viewServer' : '찾아보기',
+	'media.url' : '주소',
+	'media.width' : '넓이',
+	'media.height' : '높이',
+	'media.autostart' : '자동 시작',
+	'media.upload' : '업로드',
+	'media.viewServer' : '찾아보기',
+	'image.remoteImage' : '외부 이미지',
+	'image.localImage' : '내부 이미지',
+	'image.remoteUrl' : '주소',
+	'image.localUrl' : '파일',
+	'image.size' : '크기',
+	'image.width' : '넓이',
+	'image.height' : '높이',
+	'image.resetSize' : '기본 크기로',
+	'image.align' : '정렬',
+	'image.defaultAlign' : '기본',
+	'image.leftAlign' : '왼쪽',
+	'image.rightAlign' : '오른쪽',
+	'image.imgTitle' : '제목',
+	'image.upload' : '찾아보기',
+	'image.viewServer' : '찾아보기',
+	'multiimage.uploadDesc' : '최대 이미지 개수: <%=uploadLimit%>개, 개당 이미지 크기: <%=sizeLimit%>',
+	'multiimage.startUpload' : '업로드 시작',
+	'multiimage.clearAll' : '모두 삭제',
+	'multiimage.insertAll' : '모두 삽입',
+	'multiimage.queueLimitExceeded' : '업로드 개수가 초과되었습니다.',
+	'multiimage.fileExceedsSizeLimit' : '업로드 크기가 초과되었습니다.',
+	'multiimage.zeroByteFile' : '파일 크기가 없습니다.',
+	'multiimage.invalidFiletype' : '올바른 이미지가 아닙니다.',
+	'multiimage.unknownError' : '알 수 없는 업로드 오류가 발생하였습니다.',
+	'multiimage.pending' : '처리 중 ...',
+	'multiimage.uploadError' : '업로드 오류',
+	'filemanager.emptyFolder' : '빈 폴더',
+	'filemanager.moveup' : '위로',
+	'filemanager.viewType' : '보기 방식: ',
+	'filemanager.viewImage' : '미리 보기',
+	'filemanager.listImage' : '목록',
+	'filemanager.orderType' : '정렬 방식: ',
+	'filemanager.fileName' : '이름별',
+	'filemanager.fileSize' : '크기별',
+	'filemanager.fileType' : '종류별',
+	'insertfile.url' : '주소',
+	'insertfile.title' : '제목',
+	'insertfile.upload' : '업로드',
+	'insertfile.viewServer' : '찾아보기',
+	'table.cells' : '열',
+	'table.rows' : '행',
+	'table.cols' : '열',
+	'table.size' : '표 크기',
+	'table.width' : '넓이',
+	'table.height' : '높이',
+	'table.percent' : '%',
+	'table.px' : 'px',
+	'table.space' : '간격',
+	'table.padding' : '안쪽여백',
+	'table.spacing' : '간격',
+	'table.align' : '정렬',
+	'table.textAlign' : '수직',
+	'table.verticalAlign' : '수평',
+	'table.alignDefault' : '기본',
+	'table.alignLeft' : '왼쪽',
+	'table.alignCenter' : '가운데',
+	'table.alignRight' : '오른쪽',
+	'table.alignTop' : '위쪽',
+	'table.alignMiddle' : '중간',
+	'table.alignBottom' : '아래쪽',
+	'table.alignBaseline' : '글자기준',
+	'table.border' : '테두리',
+	'table.borderWidth' : '크기',
+	'table.borderColor' : '색상',
+	'table.backgroundColor' : '배경',
+	'map.address' : '주소: ',
+	'map.search' : '검색',
+	'baidumap.address' : '주소: ',
+	'baidumap.search' : '검색',
+	'baidumap.insertDynamicMap' : '동적 지도',
+	'anchor.name' : '책갈피명',
+	'formatblock.formatBlock' : {
+		h1 : '제목 1',
+		h2 : '제목 2',
+		h3 : '제목 3',
+		h4 : '제목 4',
+		p : '본문'
+	},
+	'fontname.fontName' : {
+		'Gulim' : '굴림',
+		'Dotum' : '돋움',
+		'Batang' : '바탕',
+		'Gungsuh' : '궁서',
+		'Malgun Gothic' : '맑은 고딕',
+		'Arial' : 'Arial',
+		'Arial Black' : 'Arial Black',
+		'Comic Sans MS' : 'Comic Sans MS',
+		'Courier New' : 'Courier New',
+		'Garamond' : 'Garamond',
+		'Georgia' : 'Georgia',
+		'Tahoma' : 'Tahoma',
+		'Times New Roman' : 'Times New Roman',
+		'Trebuchet MS' : 'Trebuchet MS',
+		'Verdana' : 'Verdana'
+	},
+	'lineheight.lineHeight' : [
+		{'1' : '행간 1'},
+		{'1.5' : '행간 1.5'},
+		{'2' : '행간 2'},
+		{'2.5' : '행간 2.5'},
+		{'3' : '행간 3'}
+	],
+	'template.selectTemplate' : '템플릿',
+	'template.replaceContent' : '내용 바꾸기',
+	'template.fileList' : {
+		'1.html' : '이미지와 텍스트',
+		'2.html' : '표',
+		'3.html' : '목록'
+	}
+}, 'ko');
+
+KindEditor.each(KindEditor.options.items, function(i, name) {
+	if (name == 'baidumap') {
+		KindEditor.options.items[i] = 'map';
+	}
+});
+KindEditor.options.langType = 'ko';

+ 242 - 0
public/kindeditor/lang/ru.js

@@ -0,0 +1,242 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+* Translated to Russian by Valery Votintsev (http://codersclub.org/)
+*******************************************************************************/
+
+KindEditor.lang({
+	source : 'Source',
+	preview : 'Preview',
+	undo : 'Отмена(Ctrl+Z)',
+	redo : 'Повтор(Ctrl+Y)',
+	cut : 'Вырезать(Ctrl+X)',
+	copy : 'Копировать(Ctrl+C)',
+	paste : 'Вставить(Ctrl+V)',
+	plainpaste : 'Вставить как простой текст',
+	wordpaste : 'Вставить из Word',
+	selectall : 'Выбрать все',
+	justifyleft : 'Выравнивание влево',
+	justifycenter : 'Выравнивание по центру',
+	justifyright : 'Выравнивание вправо',
+	justifyfull : 'Выравнивание по обеим сторонам',
+	insertorderedlist : 'Нумерованый список',
+	insertunorderedlist : 'Ненумерованый список',
+	indent : 'Добавить отступ',
+	outdent : 'Убрать отступ',
+	subscript : 'Надстрочный',
+	superscript : 'Подстрочный',
+	formatblock : 'Формат параграфа',
+	fontname : 'Шрифт',
+	fontsize : 'Размер',
+	forecolor : 'Цвет текста',
+	hilitecolor : 'Цвет фона',
+	bold : 'Жирный(Ctrl+B)',
+	italic : 'Наклонный(Ctrl+I)',
+	underline : 'Подчёркнутый(Ctrl+U)',
+	strikethrough : 'Перечёркнутый',
+	removeformat : 'Удалить формат',
+	image : 'Изображение',
+	multiimage : 'Мульти-загрузка',
+	flash : 'Flash',
+	media : 'Встроенные данные',
+	table : 'Таблица',
+	tablecell : 'Ячейка',
+	hr : 'Горизонтальный разделитель',
+	emoticons : 'Смайл',
+	link : 'Ссылка',
+	unlink : 'Убрать ссылку',
+	fullscreen : 'На весь экран',
+	about : 'О программе',
+	print : 'Печать',
+	filemanager : 'Файлы',
+	code : 'Код',
+	map : 'Карта Google',
+	baidumap : 'Карта Baidu',
+	lineheight : 'Межстрочный интервал',
+	clearhtml : 'Очистить HTML код',
+	pagebreak : 'Разрыв страницы',
+	quickformat : 'Быстрый формат',
+	insertfile : 'Вставить файл',
+	template : 'Вставить шаблон',
+	anchor : 'Якорь',
+	yes : 'OK',
+	no : 'Отмена',
+	close : 'Закрыть',
+	editImage : 'Свойства изображения',
+	deleteImage : 'Удалить изображение',
+	editFlash : 'Свойства Flash',
+	deleteFlash : 'Удалить Flash',
+	editMedia : 'Свойства Media',
+	deleteMedia : 'Удалить Media',
+	editLink : 'Свойства ссылки',
+	deleteLink : 'Удалить ссылку',
+	editAnchor : 'Anchor properties',
+	deleteAnchor : 'Delete Anchor',
+	tableprop : 'Свойства таблицы',
+	tablecellprop : 'Свойства ячейки',
+	tableinsert : 'Вставить таблицу',
+	tabledelete : 'Удалить таблицу',
+	tablecolinsertleft : 'Добавить столбец слева',
+	tablecolinsertright : 'Добавить столбец справа',
+	tablerowinsertabove : 'Добавить строку выше',
+	tablerowinsertbelow : 'Добавить строку ниже',
+	tablerowmerge : 'Объединить вниз',
+	tablecolmerge : 'Объединить вправо',
+	tablerowsplit : 'Разделить строку',
+	tablecolsplit : 'Разделить столбец',
+	tablecoldelete : 'Удалить столбец',
+	tablerowdelete : 'Удалить строку',
+	noColor : 'По умолчанию',
+	pleaseSelectFile : 'Выберите файл.',
+	invalidImg : "Укажите корректный URL изображения.\nРазрешённые форматы: jpg,gif,bmp,png",
+	invalidMedia : "Укажите корректный тип медиа-объекта.\nРазрешённые типы: swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb",
+	invalidWidth : "Ширина должна быть числом.",
+	invalidHeight : "Высота должна быть числом.",
+	invalidBorder : "Ширина рамки должна быть числом.",
+	invalidUrl : "Укажите корректный URL.",
+	invalidRows : 'Неверные строки.',
+	invalidCols : 'Неверные столбцы.',
+	invalidPadding : 'padding должен быть числом.',
+	invalidSpacing : 'spacing должен быть числом.',
+	invalidJson : 'Неверная JSON строка.',
+	uploadSuccess : 'Загрузка завершена.',
+	cutError : 'Данная опция не поддерживается вашим браузером, воспользуйтесь комбинацией клавиш (Ctrl+X).',
+	copyError : 'Данная опция не поддерживается вашим браузером, воспользуйтесь комбинацией клавиш (Ctrl+C).',
+	pasteError : 'Данная опция не поддерживается вашим браузером, воспользуйтесь комбинацией клавиш (Ctrl+V).',
+	ajaxLoading : 'Загрузка ...',
+	uploadLoading : 'Загрузка ...',
+	uploadError : 'Сбой загрузки',
+	'plainpaste.comment' : 'Для вставки скопированного текста воспользуйтесь комбинацией клавиш (Ctrl+V).',
+	'wordpaste.comment' : 'Для вставки скопированного текста воспользуйтесь комбинацией клавиш (Ctrl+V).',
+	'code.pleaseInput' : 'Введите код.',
+	'link.url' : 'URL',
+	'link.linkType' : 'Открывать ссылку',
+	'link.newWindow' : 'в новом окне',
+	'link.selfWindow' : 'в том же окне',
+	'flash.url' : 'URL',
+	'flash.width' : 'Ширина',
+	'flash.height' : 'Высота',
+	'flash.upload' : 'Загрузить',
+	'flash.viewServer' : 'Выбрать',
+	'media.url' : 'URL',
+	'media.width' : 'Ширина',
+	'media.height' : 'Высота',
+	'media.autostart' : 'Автостарт',
+	'media.upload' : 'Загрузить',
+	'media.viewServer' : 'Выбрать',
+	'image.remoteImage' : 'Вставить URL изображения',
+	'image.localImage' : 'Загрузить',
+	'image.remoteUrl' : 'URL',
+	'image.localUrl' : 'Файл',
+	'image.size' : 'Размер',
+	'image.width' : 'Ширина',
+	'image.height' : 'Высота',
+	'image.resetSize' : 'Сбросить размеры',
+	'image.align' : 'Выравнивание',
+	'image.defaultAlign' : 'По умолчанию',
+	'image.leftAlign' : 'Влево',
+	'image.rightAlign' : 'Вправо',
+	'image.imgTitle' : 'Название',
+	'image.upload' : 'Загрузить',
+	'image.viewServer' : 'Выбрать',
+	'multiimage.uploadDesc' : 'Максимальное кол-во изображений: <%=uploadLimit%>, Максимальный размер одного изображения: <%=sizeLimit%>',
+	'multiimage.startUpload' : 'Начать загрузку',
+	'multiimage.clearAll' : 'Очистить все',
+	'multiimage.insertAll' : 'Вставить все',
+	'multiimage.queueLimitExceeded' : 'Превышен лимит очереди.',
+	'multiimage.fileExceedsSizeLimit' : 'Превышен максимальный размер файла.',
+	'multiimage.zeroByteFile' : 'Файл нулевой длины.',
+	'multiimage.invalidFiletype' : 'Недопустимый тип файла.',
+	'multiimage.unknownError' : 'Непредвиденная ошибка загрузки.',
+	'multiimage.pending' : 'Ожидает ...',
+	'multiimage.uploadError' : 'Ошибка загрузки',
+	'filemanager.emptyFolder' : 'Папка пуста',
+	'filemanager.moveup' : 'Наверх',
+	'filemanager.viewType' : 'Тип показа: ',
+	'filemanager.viewImage' : 'Превьюшки',
+	'filemanager.listImage' : 'Список',
+	'filemanager.orderType' : 'Сортировка: ',
+	'filemanager.fileName' : 'По имени',
+	'filemanager.fileSize' : 'По размеру',
+	'filemanager.fileType' : 'По типу',
+	'insertfile.url' : 'URL',
+	'insertfile.title' : 'Название',
+	'insertfile.upload' : 'Загрузить',
+	'insertfile.viewServer' : 'Выбрать',
+	'table.cells' : 'Ячейки',
+	'table.rows' : 'Строки',
+	'table.cols' : 'Столбцы',
+	'table.size' : 'Размеры',
+	'table.width' : 'Ширина',
+	'table.height' : 'Высота',
+	'table.percent' : '%',
+	'table.px' : 'px',
+	'table.space' : 'Space',
+	'table.padding' : 'Padding',
+	'table.spacing' : 'Spacing',
+	'table.align' : 'Выравнивание',
+	'table.textAlign' : 'По горизонтали',
+	'table.verticalAlign' : 'По вертикали',
+	'table.alignDefault' : 'По умолчанию',
+	'table.alignLeft' : 'Влево',
+	'table.alignCenter' : 'По центру',
+	'table.alignRight' : 'Вправо',
+	'table.alignTop' : 'Вверх',
+	'table.alignMiddle' : 'Посередине',
+	'table.alignBottom' : 'Вниз',
+	'table.alignBaseline' : 'По базовой линии',
+	'table.border' : 'Рамка',
+	'table.borderWidth' : 'Ширина',
+	'table.borderColor' : 'Цвет',
+	'table.backgroundColor' : 'Цвет фона',
+	'map.address' : 'Адрес: ',
+	'map.search' : 'Поиск',
+	'baidumap.address' : 'Адрес: ',
+	'baidumap.search' : 'Поиск',
+	'baidumap.insertDynamicMap' : 'Динамическая карта',
+	'anchor.name' : 'Имя якоря',
+	'formatblock.formatBlock' : {
+		h1 : 'Заголовок 1',
+		h2 : 'Заголовок 2',
+		h3 : 'Заголовок 3',
+		h4 : 'Заголовок 4',
+		p : 'Обычный текст'
+	},
+	'fontname.fontName' : {
+		'Arial' : 'Arial',
+		'Arial Black' : 'Arial Black',
+		'Comic Sans MS' : 'Comic Sans MS',
+		'Courier New' : 'Courier New',
+		'Garamond' : 'Garamond',
+		'Georgia' : 'Georgia',
+		'Tahoma' : 'Tahoma',
+		'Times New Roman' : 'Times New Roman',
+		'Trebuchet MS' : 'Trebuchet MS',
+		'Verdana' : 'Verdana'
+	},
+	'lineheight.lineHeight' : [
+		{'1' : '1'},
+		{'1.5' : '1.5'},
+		{'2' : '2'},
+		{'2.5' : '2.5'},
+		{'3' : '3'}
+	],
+	'template.selectTemplate' : 'Шаблон',
+	'template.replaceContent' : 'Заменить текущий шаблон',
+	'template.fileList' : {
+		'1.html' : 'Текст и изображения',
+		'2.html' : 'Таблица',
+		'3.html' : 'Список'
+	}
+}, 'en');
+
+KindEditor.each(KindEditor.options.items, function(i, name) {
+	if (name == 'baidumap') {
+		KindEditor.options.items[i] = 'map';
+	}
+});
+KindEditor.options.langType = 'ru';

+ 267 - 0
public/kindeditor/lang/zh-CN.js

@@ -0,0 +1,267 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.lang({
+	source : 'HTML代码',
+	preview : '预览',
+	undo : '后退(Ctrl+Z)',
+	redo : '前进(Ctrl+Y)',
+	cut : '剪切(Ctrl+X)',
+	copy : '复制(Ctrl+C)',
+	paste : '粘贴(Ctrl+V)',
+	plainpaste : '粘贴为无格式文本',
+	wordpaste : '从Word粘贴',
+	selectall : '全选(Ctrl+A)',
+	justifyleft : '左对齐',
+	justifycenter : '居中',
+	justifyright : '右对齐',
+	justifyfull : '两端对齐',
+	insertorderedlist : '编号',
+	insertunorderedlist : '项目符号',
+	indent : '增加缩进',
+	outdent : '减少缩进',
+	subscript : '下标',
+	superscript : '上标',
+	formatblock : '段落',
+	fontname : '字体',
+	fontsize : '文字大小',
+	forecolor : '文字颜色',
+	hilitecolor : '文字背景',
+	bold : '粗体(Ctrl+B)',
+	italic : '斜体(Ctrl+I)',
+	underline : '下划线(Ctrl+U)',
+	strikethrough : '删除线',
+	removeformat : '删除格式',
+	image : '图片',
+	multiimage : '批量图片上传',
+	graft : '涂鸦',
+	flash : 'Flash',
+	media : '视音频',
+	table : '表格',
+	tablecell : '单元格',
+	hr : '插入横线',
+	emoticons : '插入表情',
+	link : '超级链接',
+	unlink : '取消超级链接',
+	fullscreen : '全屏显示',
+	about : '关于',
+	print : '打印(Ctrl+P)',
+	filemanager : '文件空间',
+	code : '插入程序代码',
+	quote : '插入引用',
+	map : 'Google地图',
+	baidumap : '百度地图',
+	lineheight : '行距',
+	clearhtml : '清理HTML代码',
+	pagebreak : '插入分页符',
+	quickformat : '一键排版',
+	insertfile : '插入文件',
+	template : '插入模板',
+	anchor : '锚点',
+	yes : '确定',
+	no : '取消',
+	close : '关闭',
+	editImage : '图片属性',
+	deleteImage : '删除图片',
+	editFlash : 'Flash属性',
+	deleteFlash : '删除Flash',
+	editMedia : '视音频属性',
+	deleteMedia : '删除视音频',
+	editLink : '超级链接属性',
+	deleteLink : '取消超级链接',
+	editAnchor : '锚点属性',
+	deleteAnchor : '删除锚点',
+	tableprop : '表格属性',
+	tablecellprop : '单元格属性',
+	tableinsert : '插入表格',
+	tabledelete : '删除表格',
+	tablecolinsertleft : '左侧插入列',
+	tablecolinsertright : '右侧插入列',
+	tablerowinsertabove : '上方插入行',
+	tablerowinsertbelow : '下方插入行',
+	tablerowmerge : '向下合并单元格',
+	tablecolmerge : '向右合并单元格',
+	tablerowsplit : '拆分行',
+	tablecolsplit : '拆分列',
+	tablecoldelete : '删除列',
+	tablerowdelete : '删除行',
+	noColor : '无颜色',
+	pleaseSelectFile : '请选择文件。',
+	invalidImg : "请输入有效的URL地址。\n只允许jpg,gif,bmp,png格式。",
+	invalidMedia : "请输入有效的URL地址。\n只允许swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb格式。",
+	invalidWidth : "宽度必须为数字。",
+	invalidHeight : "高度必须为数字。",
+	invalidBorder : "边框必须为数字。",
+	invalidUrl : "请输入有效的URL地址。",
+	invalidRows : '行数为必选项,只允许输入大于0的数字。',
+	invalidCols : '列数为必选项,只允许输入大于0的数字。',
+	invalidPadding : '边距必须为数字。',
+	invalidSpacing : '间距必须为数字。',
+	invalidJson : '服务器发生故障。',
+	uploadSuccess : '上传成功。',
+	cutError : '您的浏览器安全设置不允许使用剪切操作,请使用快捷键(Ctrl+X)来完成。',
+	copyError : '您的浏览器安全设置不允许使用复制操作,请使用快捷键(Ctrl+C)来完成。',
+	pasteError : '您的浏览器安全设置不允许使用粘贴操作,请使用快捷键(Ctrl+V)来完成。',
+	ajaxLoading : '加载中,请稍候 ...',
+	uploadLoading : '上传中,请稍候 ...',
+	uploadError : '上传错误',
+
+	'plainpaste.comment' : '请使用快捷键(Ctrl+V)把内容粘贴到下面的方框里。',
+	'wordpaste.comment' : '请使用快捷键(Ctrl+V)把内容粘贴到下面的方框里。',
+	'code.pleaseInput' : '请输入程序代码。',
+	'link.url' : 'URL',
+	'link.linkType' : '打开类型',
+	'link.newWindow' : '新窗口',
+	'link.selfWindow' : '当前窗口',
+	'flash.url' : 'URL',
+	'flash.width' : '宽度',
+	'flash.height' : '高度',
+	'flash.upload' : '上传',
+	'flash.viewServer' : '文件空间',
+	'media.url' : 'URL',
+	'media.width' : '宽度',
+	'media.height' : '高度',
+	'media.autostart' : '自动播放',
+	'media.upload' : '上传',
+	'media.viewServer' : '文件空间',
+	'image.remoteImage' : '网络图片',
+	'image.localImage' : '本地上传',
+	'image.remoteUrl' : '图片地址',
+	'image.localUrl' : '上传文件',
+	'image.size' : '图片大小',
+	'image.width' : '宽',
+	'image.height' : '高',
+	'image.resetSize' : '重置大小',
+	'image.align' : '对齐方式',
+	'image.defaultAlign' : '默认方式',
+	'image.leftAlign' : '左对齐',
+	'image.rightAlign' : '右对齐',
+	'image.imgTitle' : '图片说明',
+	'image.upload' : '浏览...',
+	'image.viewServer' : '图片空间',
+
+	'multiimage.title' : '多图上传',
+	'multiimage.uploadDesc' : '共选择了 <%=numSelect%> 张图片,共 <%=totalSize%>, 还可以添加 <%=numLeft%> 张图片.',
+	'multiimage.startUpload' : '开始上传',
+	'multiimage.noListUrl' : '无法获取图片,请先配置 fileManagerJson.',
+	'multiimage.noSearchUrl' : '无法进行图片搜索,请先配置 imageSearchJson.',
+	'multiimage.noDataText' : '(⊙o⊙)亲,没有多数据了。',
+	'multiimage.closeText' : '关闭对话框',
+	'multiimage.confirmBtnText' : '确定',
+	'multiimage.cancelBtnText' : '取消',
+	'multiimage.loadMoreData' : '往下拉动滚动条可以加载更多数据.',
+	'multiimage.depJQueryError' : '文件管理插件依赖 jQuery, 请先引入 jQuery.',
+	'multiimage.localUpload' : '本地上传',
+	'multiimage.fileServer' : '文件服务器',
+	'multiimage.imgSearch' : '图片搜索',
+	'multiimage.selectFile' : '点击选择图片',
+	'multiimage.continueAdd' : '继续添加',
+	'multiimage.searchBtn' : '搜索一下',
+	'multiimage.searchPlaceholder' : '请输入搜索关键词',
+	'multiimage.searchClear' : '清空搜索',
+	'multiimage.noFileAdded' : '请至少添加一个文件!',
+	'multiimage.uploading' : '正在上传',
+	'multiimage.fileNotUpload' : '您还有文件没有上传!',
+	'multiimage.uploadLimit' : '您本次最多上传 <%=uploadLimit%> 个文件.',
+	'multiimage.sizeLimit' : '文件大小不能超过 <%=sizeLimit%> KB.',
+	'multiimage.invalidExt' : '非法的文件后缀 <%=invalidExt%>.',
+	'multiimage.remove' : '删除',
+	'multiimage.rotateRight' : '向右旋转',
+	'multiimage.rotateLeft' : '向左旋转',
+	'multiimage.uploadFail' : '发生异常,上传失败!',
+	'multiimage.noFileSelected' : '请至少选择一个文件或一张图片.',
+
+	'filemanager.noDataText' : '(⊙o⊙)亲,没有多数据了。',
+	'filemanager.title' : '文件服务器',
+	'filemanager.noListUrl' : '无法获取图片,请先配置 fileManagerJson.',
+	'filemanager.closeText' : '关闭对话框',
+	'filemanager.confirmBtnText' : '确定',
+	'filemanager.cancelBtnText' : '取消',
+	'filemanager.loadMoreData' : '往下拉动滚动条可以加载更多数据.',
+	'filemanager.depJQueryError' : '文件管理插件依赖 jQuery, 请先引入 jQuery.',
+	'filemanager.fileType' : '类型',
+
+	'graft.btnText' : '保存并插入涂鸦',
+	'graft.uploadSuccess' : '涂鸦上传成功',
+	'graft.uploadFaild' : '涂鸦上传失败',
+	'graft.empty' : '您没有在画布上绘制任何图像',
+
+	'insertfile.url' : 'URL',
+	'insertfile.title' : '文件说明',
+	'insertfile.upload' : '上传',
+	'insertfile.viewServer' : '文件空间',
+	'table.cells' : '单元格数',
+	'table.rows' : '行数',
+	'table.cols' : '列数',
+	'table.size' : '大小',
+	'table.width' : '宽度',
+	'table.height' : '高度',
+	'table.percent' : '%',
+	'table.px' : 'px',
+	'table.space' : '边距间距',
+	'table.padding' : '边距',
+	'table.spacing' : '间距',
+	'table.align' : '对齐方式',
+	'table.textAlign' : '水平对齐',
+	'table.verticalAlign' : '垂直对齐',
+	'table.alignDefault' : '默认',
+	'table.alignLeft' : '左对齐',
+	'table.alignCenter' : '居中',
+	'table.alignRight' : '右对齐',
+	'table.alignTop' : '顶部',
+	'table.alignMiddle' : '中部',
+	'table.alignBottom' : '底部',
+	'table.alignBaseline' : '基线',
+	'table.border' : '边框',
+	'table.borderWidth' : '宽度',
+	'table.borderColor' : '颜色',
+	'table.backgroundColor' : '背景颜色',
+	'map.address' : '地址: ',
+	'map.search' : '搜索',
+	'baidumap.address' : '地址: ',
+	'baidumap.search' : '搜索',
+	'baidumap.insertDynamicMap' : '插入动态地图',
+	'anchor.name' : '锚点名称',
+	'formatblock.formatBlock' : {
+		h1 : '标题 1',
+		h2 : '标题 2',
+		h3 : '标题 3',
+		h4 : '标题 4',
+		p : '正 文'
+	},
+	'fontname.fontName' : {
+		'SimSun' : '宋体',
+		'NSimSun' : '新宋体',
+		'FangSong' : '仿宋',
+		'KaiTi' : '楷体',
+		'SimHei' : '黑体',
+		'Microsoft YaHei' : '微软雅黑',
+		'Arial' : 'Arial',
+		'Arial Black' : 'Arial Black',
+		'Times New Roman' : 'Times New Roman',
+		'Courier New' : 'Courier New',
+		'Tahoma' : 'Tahoma',
+		'Verdana' : 'Verdana'
+	},
+	'lineheight.lineHeight' : [
+		{'1' : '单倍行距'},
+		{'1.5' : '1.5倍行距'},
+		{'2' : '2倍行距'},
+		{'2.5' : '2.5倍行距'},
+		{'3' : '3倍行距'}
+	],
+	'template.selectTemplate' : '可选模板',
+	'template.replaceContent' : '替换当前内容',
+	'template.fileList' : {
+		'1.html' : '图片和文字',
+		'2.html' : '表格',
+		'3.html' : '项目编号'
+	}
+}, 'zh-CN');
+KindEditor.options.langType = 'zh-CN';

+ 243 - 0
public/kindeditor/lang/zh-TW.js

@@ -0,0 +1,243 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.lang({
+	source : '原始碼',
+	preview : '預覽',
+	undo : '復原(Ctrl+Z)',
+	redo : '重複(Ctrl+Y)',
+	cut : '剪下(Ctrl+X)',
+	copy : '複製(Ctrl+C)',
+	paste : '貼上(Ctrl+V)',
+	plainpaste : '貼為純文字格式',
+	wordpaste : '自Word貼上',
+	selectall : '全選(Ctrl+A)',
+	justifyleft : '靠左對齊',
+	justifycenter : '置中',
+	justifyright : '靠右對齊',
+	justifyfull : '左右對齊',
+	insertorderedlist : '編號清單',
+	insertunorderedlist : '項目清單',
+	indent : '增加縮排',
+	outdent : '減少縮排',
+	subscript : '下標',
+	superscript : '上標',
+	formatblock : '標題',
+	fontname : '字體',
+	fontsize : '文字大小',
+	forecolor : '文字顏色',
+	hilitecolor : '背景顏色',
+	bold : '粗體(Ctrl+B)',
+	italic : '斜體(Ctrl+I)',
+	underline : '底線(Ctrl+U)',
+	strikethrough : '刪除線',
+	removeformat : '清除格式',
+	image : '影像',
+	multiimage : '批量影像上傳',
+	flash : 'Flash',
+	media : '多媒體',
+	table : '表格',
+	tablecell : '儲存格',
+	hr : '插入水平線',
+	emoticons : '插入表情',
+	link : '超連結',
+	unlink : '移除超連結',
+	fullscreen : '最大化',
+	about : '關於',
+	print : '列印(Ctrl+P)',
+	filemanager : '瀏覽伺服器',
+	code : '插入程式代碼',
+	map : 'Google地圖',
+	baidumap : 'Baidu地圖',
+	lineheight : '行距',
+	clearhtml : '清理HTML代碼',
+	pagebreak : '插入分頁符號',
+	quickformat : '快速排版',
+	insertfile : '插入文件',
+	template : '插入樣板',
+	anchor : '錨點',
+	yes : '確定',
+	no : '取消',
+	close : '關閉',
+	editImage : '影像屬性',
+	deleteImage : '刪除影像',
+	editFlash : 'Flash屬性',
+	deleteFlash : '删除Flash',
+	editMedia : '多媒體屬性',
+	deleteMedia : '删除多媒體',
+	editLink : '超連結屬性',
+	deleteLink : '移除超連結',
+	editAnchor : '锚点属性',
+	deleteAnchor : '删除锚点',
+	tableprop : '表格屬性',
+	tablecellprop : '儲存格屬性',
+	tableinsert : '插入表格',
+	tabledelete : '刪除表格',
+	tablecolinsertleft : '向左插入列',
+	tablecolinsertright : '向右插入列',
+	tablerowinsertabove : '向上插入欄',
+	tablerowinsertbelow : '下方插入欄',
+	tablerowmerge : '向下合併單元格',
+	tablecolmerge : '向右合併單元格',
+	tablerowsplit : '分割欄',
+	tablecolsplit : '分割列',
+	tablecoldelete : '删除列',
+	tablerowdelete : '删除欄',
+	noColor : '自動',
+	pleaseSelectFile : '請選擇文件。',
+	invalidImg : "請輸入有效的URL。\n只允許jpg,gif,bmp,png格式。",
+	invalidMedia : "請輸入有效的URL。\n只允許swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb格式。",
+	invalidWidth : "寬度必須是數字。",
+	invalidHeight : "高度必須是數字。",
+	invalidBorder : "邊框必須是數字。",
+	invalidUrl : "請輸入有效的URL。",
+	invalidRows : '欄數是必須輸入項目,只允許輸入大於0的數字。',
+	invalidCols : '列數是必須輸入項目,只允許輸入大於0的數字。',
+	invalidPadding : '內距必須是數字。',
+	invalidSpacing : '間距必須是數字。',
+	invalidJson : '伺服器發生故障。',
+	uploadSuccess : '上傳成功。',
+	cutError : '您的瀏覽器安全設置不允許使用剪下操作,請使用快捷鍵(Ctrl+X)完成。',
+	copyError : '您的瀏覽器安全設置不允許使用剪下操作,請使用快捷鍵(Ctrl+C)完成。',
+	pasteError : '您的瀏覽器安全設置不允許使用剪下操作,請使用快捷鍵(Ctrl+V)完成。',
+	ajaxLoading : '加載中,請稍候 ...',
+	uploadLoading : '上傳中,請稍候 ...',
+	uploadError : '上傳錯誤',
+	'plainpaste.comment' : '請使用快捷鍵(Ctrl+V)把內容貼到下方區域裡。',
+	'wordpaste.comment' : '請使用快捷鍵(Ctrl+V)把內容貼到下方區域裡。',
+	'code.pleaseInput' : 'Please input code.',
+	'link.url' : 'URL',
+	'link.linkType' : '打開類型',
+	'link.newWindow' : '新窗口',
+	'link.selfWindow' : '本頁窗口',
+	'flash.url' : 'URL',
+	'flash.width' : '寬度',
+	'flash.height' : '高度',
+	'flash.upload' : '上傳',
+	'flash.viewServer' : '瀏覽',
+	'media.url' : 'URL',
+	'media.width' : '寬度',
+	'media.height' : '高度',
+	'media.autostart' : '自動播放',
+	'media.upload' : '上傳',
+	'media.viewServer' : '瀏覽',
+	'image.remoteImage' : '網絡影像',
+	'image.localImage' : '上傳影像',
+	'image.remoteUrl' : '影像URL',
+	'image.localUrl' : '影像URL',
+	'image.size' : '影像大小',
+	'image.width' : '寬度',
+	'image.height' : '高度',
+	'image.resetSize' : '原始大小',
+	'image.align' : '對齊方式',
+	'image.defaultAlign' : '未設定',
+	'image.leftAlign' : '向左對齊',
+	'image.rightAlign' : '向右對齊',
+	'image.imgTitle' : '影像說明',
+	'image.upload' : '瀏覽...',
+	'image.viewServer' : '瀏覽...',
+	'multiimage.uploadDesc' : 'Allows users to upload <%=uploadLimit%> images, single image size not exceeding <%=sizeLimit%>',
+	'multiimage.startUpload' : 'Start upload',
+	'multiimage.clearAll' : 'Clear all',
+	'multiimage.insertAll' : 'Insert all',
+	'multiimage.queueLimitExceeded' : 'Queue limit exceeded.',
+	'multiimage.fileExceedsSizeLimit' : 'File exceeds size limit.',
+	'multiimage.zeroByteFile' : 'Zero byte file.',
+	'multiimage.invalidFiletype' : 'Invalid file type.',
+	'multiimage.unknownError' : 'Unknown upload error.',
+	'multiimage.pending' : 'Pending ...',
+	'multiimage.uploadError' : 'Upload error',
+	'filemanager.emptyFolder' : '空文件夾',
+	'filemanager.moveup' : '至上一級文件夾',
+	'filemanager.viewType' : '顯示方式:',
+	'filemanager.viewImage' : '縮略圖',
+	'filemanager.listImage' : '詳細信息',
+	'filemanager.orderType' : '排序方式:',
+	'filemanager.fileName' : '名稱',
+	'filemanager.fileSize' : '大小',
+	'filemanager.fileType' : '類型',
+	'insertfile.url' : 'URL',
+	'insertfile.title' : '文件說明',
+	'insertfile.upload' : '上傳',
+	'insertfile.viewServer' : '瀏覽',
+	'table.cells' : '儲存格數',
+	'table.rows' : '欄數',
+	'table.cols' : '列數',
+	'table.size' : '表格大小',
+	'table.width' : '寬度',
+	'table.height' : '高度',
+	'table.percent' : '%',
+	'table.px' : 'px',
+	'table.space' : '內距間距',
+	'table.padding' : '內距',
+	'table.spacing' : '間距',
+	'table.align' : '對齊方式',
+	'table.textAlign' : '水平對齊',
+	'table.verticalAlign' : '垂直對齊',
+	'table.alignDefault' : '未設定',
+	'table.alignLeft' : '向左對齊',
+	'table.alignCenter' : '置中',
+	'table.alignRight' : '向右對齊',
+	'table.alignTop' : '靠上',
+	'table.alignMiddle' : '置中',
+	'table.alignBottom' : '靠下',
+	'table.alignBaseline' : '基線',
+	'table.border' : '表格邊框',
+	'table.borderWidth' : '邊框',
+	'table.borderColor' : '顏色',
+	'table.backgroundColor' : '背景顏色',
+	'map.address' : '住所: ',
+	'map.search' : '尋找',
+	'baidumap.address' : '住所: ',
+	'baidumap.search' : '尋找',
+	'baidumap.insertDynamicMap' : '插入動態地圖',
+	'anchor.name' : '錨點名稱',
+	'formatblock.formatBlock' : {
+		h1 : '標題 1',
+		h2 : '標題 2',
+		h3 : '標題 3',
+		h4 : '標題 4',
+		p : '一般'
+	},
+	'fontname.fontName' : {
+		'MingLiU' : '細明體',
+		'PMingLiU' : '新細明體',
+		'DFKai-SB' : '標楷體',
+		'SimSun' : '宋體',
+		'NSimSun' : '新宋體',
+		'FangSong' : '仿宋體',
+		'Arial' : 'Arial',
+		'Arial Black' : 'Arial Black',
+		'Times New Roman' : 'Times New Roman',
+		'Courier New' : 'Courier New',
+		'Tahoma' : 'Tahoma',
+		'Verdana' : 'Verdana'
+	},
+	'lineheight.lineHeight' : [
+		{'1' : '单倍行距'},
+		{'1.5' : '1.5倍行距'},
+		{'2' : '2倍行距'},
+		{'2.5' : '2.5倍行距'},
+		{'3' : '3倍行距'}
+	],
+	'template.selectTemplate' : '可選樣板',
+	'template.replaceContent' : '取代當前內容',
+	'template.fileList' : {
+		'1.html' : '影像和文字',
+		'2.html' : '表格',
+		'3.html' : '项目清單'
+	}
+}, 'zh-TW');
+
+KindEditor.each(KindEditor.options.items, function(i, name) {
+	if (name == 'baidumap') {
+		KindEditor.options.items[i] = 'map';
+	}
+});
+KindEditor.options.langType = 'zh-TW';

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 1 - 0
public/kindeditor/libs/JDialog/JDialog.min.js


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 1 - 0
public/kindeditor/libs/JDialog/css/JDialog.css


BIN
public/kindeditor/libs/JDialog/css/bg-default.png


BIN
public/kindeditor/libs/JDialog/css/gb_tip_loading.gif


BIN
public/kindeditor/libs/JDialog/css/gb_tips.png


BIN
public/kindeditor/libs/JDialog/css/gb_tips_ie6.gif


BIN
public/kindeditor/libs/JDialog/css/jdialog_confirm_icon.gif


BIN
public/kindeditor/libs/JDialog/css/jdialog_confirm_icon_espresso.png


BIN
public/kindeditor/libs/JDialog/css/jwindow_default.gif


BIN
public/kindeditor/libs/JDialog/css/loader.gif


BIN
public/kindeditor/libs/JDialog/css/loader1.gif


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 6 - 0
public/kindeditor/libs/bootstrap/bootstrap.min.css


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 7 - 0
public/kindeditor/libs/bootstrap/bootstrap.min.js


A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 5 - 0
public/kindeditor/libs/jquery.min.js


+ 502 - 0
public/kindeditor/licenses/KINDEDITOR

@@ -0,0 +1,502 @@
+                  GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+                  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+                            NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!

+ 21 - 0
public/kindeditor/licenses/NKEDITOR

@@ -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.

+ 52 - 0
public/kindeditor/old.html

@@ -0,0 +1,52 @@
+<!doctype html>
+<html>
+<head>
+	<meta charset="utf-8" />
+	<title>NKeditor 在线编辑器 PHP demo</title>
+
+	<script charset="utf-8" src="NKeditor-all.js"></script>
+	<!-- 下面是外部插件不是必须引入的 -->
+	<script charset="utf-8" src="libs/jquery.min.js"></script>
+	<script charset="utf-8" src="libs/JDialog/JDialog.min.js"></script>
+
+	<script>
+		KindEditor.ready(function(K) {
+			K.create('textarea[name="content1"]', {
+				uploadJson : K.basePath+'php/qiniu/upload_json.php',
+				fileManagerJson : K.basePath+'php/qiniu/file_manager_json.php',
+				dialogOffset : 0, //对话框距离页面顶部的位置,默认为0居中,
+				allowFileManager : true,
+				allowImageUpload : true,
+				allowMediaUpload : true,
+				afterCreate : function() {
+					var self = this;
+					K.ctrl(document, 13, function() {
+						self.sync();
+						K('form[name=example]')[0].submit();
+					});
+					K.ctrl(self.edit.doc, 13, function() {
+						self.sync();
+						K('form[name=example]')[0].submit();
+					});
+				},
+				themeType : "default", //主题
+				//错误处理 handler
+				errorMsgHandler : function(message, type) {
+					try {
+						JDialog.msg({type:type, content:message, timer:2000});
+					} catch (Error) {
+						alert(message);
+					}
+				}
+			});
+
+		});
+	</script>
+</head>
+<body>
+<form name="example" method="post" style="margin-top: 20px;">
+	<textarea name="content1" style="width:900px;height:500px;visibility:hidden;"></textarea>
+</form>
+</body>
+</html>
+

+ 646 - 0
public/kindeditor/package-lock.json

@@ -0,0 +1,646 @@
+{
+	"name": "NKeditor",
+	"version": "5.0.3",
+	"lockfileVersion": 1,
+	"requires": true,
+	"dependencies": {
+		"abbrev": {
+			"version": "1.1.1",
+			"resolved": "http://registry.npm.taobao.org/abbrev/download/abbrev-1.1.1.tgz",
+			"integrity": "sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg=",
+			"dev": true
+		},
+		"amdefine": {
+			"version": "1.0.1",
+			"resolved": "http://registry.npm.taobao.org/amdefine/download/amdefine-1.0.1.tgz",
+			"integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
+			"dev": true
+		},
+		"ansi-regex": {
+			"version": "2.1.1",
+			"resolved": "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz",
+			"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+			"dev": true
+		},
+		"ansi-styles": {
+			"version": "2.2.1",
+			"resolved": "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz",
+			"integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+			"dev": true
+		},
+		"archiver": {
+			"version": "0.4.10",
+			"resolved": "http://registry.npm.taobao.org/archiver/download/archiver-0.4.10.tgz",
+			"integrity": "sha1-3w/qyPHRKV5ezrOiBVWQctIfR0c=",
+			"dev": true,
+			"requires": {
+				"iconv-lite": "0.2.11",
+				"readable-stream": "1.0.34"
+			}
+		},
+		"argparse": {
+			"version": "0.1.16",
+			"resolved": "http://registry.npm.taobao.org/argparse/download/argparse-0.1.16.tgz",
+			"integrity": "sha1-z9AeD7uj1srtBJ+9dY1A9lGW9Xw=",
+			"dev": true,
+			"requires": {
+				"underscore": "1.7.0",
+				"underscore.string": "2.4.0"
+			},
+			"dependencies": {
+				"underscore.string": {
+					"version": "2.4.0",
+					"resolved": "http://registry.npm.taobao.org/underscore.string/download/underscore.string-2.4.0.tgz",
+					"integrity": "sha1-jN2PusTi0uoefi6Al8QvRCKA+Fs=",
+					"dev": true
+				}
+			}
+		},
+		"async": {
+			"version": "0.1.22",
+			"resolved": "http://registry.npm.taobao.org/async/download/async-0.1.22.tgz",
+			"integrity": "sha1-D8GqoIig4+8Ovi2IMbqw3PiEUGE=",
+			"dev": true
+		},
+		"camelcase": {
+			"version": "1.2.1",
+			"resolved": "http://registry.npm.taobao.org/camelcase/download/camelcase-1.2.1.tgz",
+			"integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
+			"dev": true
+		},
+		"chalk": {
+			"version": "1.1.3",
+			"resolved": "http://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz",
+			"integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+			"dev": true,
+			"requires": {
+				"ansi-styles": "2.2.1",
+				"escape-string-regexp": "1.0.5",
+				"has-ansi": "2.0.0",
+				"strip-ansi": "3.0.1",
+				"supports-color": "2.0.0"
+			}
+		},
+		"clean-css": {
+			"version": "4.1.11",
+			"resolved": "http://registry.npm.taobao.org/clean-css/download/clean-css-4.1.11.tgz",
+			"integrity": "sha1-Ls3xRaujj1R0DybO/Q/z4D4SXWo=",
+			"dev": true,
+			"requires": {
+				"source-map": "0.5.7"
+			}
+		},
+		"coffee-script": {
+			"version": "1.3.3",
+			"resolved": "http://registry.npm.taobao.org/coffee-script/download/coffee-script-1.3.3.tgz",
+			"integrity": "sha1-FQ1rTLUiiUNp7+1qIQHCC8f0pPQ=",
+			"dev": true
+		},
+		"colors": {
+			"version": "0.6.2",
+			"resolved": "http://registry.npm.taobao.org/colors/download/colors-0.6.2.tgz",
+			"integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=",
+			"dev": true
+		},
+		"core-util-is": {
+			"version": "1.0.2",
+			"resolved": "http://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz",
+			"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+			"dev": true
+		},
+		"dateformat": {
+			"version": "1.0.2-1.2.3",
+			"resolved": "http://registry.npm.taobao.org/dateformat/download/dateformat-1.0.2-1.2.3.tgz",
+			"integrity": "sha1-sCIMAt6YYXQztyhRz0fePfLNvuk=",
+			"dev": true
+		},
+		"decamelize": {
+			"version": "1.2.0",
+			"resolved": "http://registry.npm.taobao.org/decamelize/download/decamelize-1.2.0.tgz",
+			"integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+			"dev": true
+		},
+		"duplexer": {
+			"version": "0.1.1",
+			"resolved": "http://registry.npm.taobao.org/duplexer/download/duplexer-0.1.1.tgz",
+			"integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=",
+			"dev": true
+		},
+		"escape-string-regexp": {
+			"version": "1.0.5",
+			"resolved": "http://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz",
+			"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+			"dev": true
+		},
+		"esprima": {
+			"version": "1.0.4",
+			"resolved": "http://registry.npm.taobao.org/esprima/download/esprima-1.0.4.tgz",
+			"integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=",
+			"dev": true
+		},
+		"eventemitter2": {
+			"version": "0.4.14",
+			"resolved": "http://registry.npm.taobao.org/eventemitter2/download/eventemitter2-0.4.14.tgz",
+			"integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=",
+			"dev": true
+		},
+		"exit": {
+			"version": "0.1.2",
+			"resolved": "http://registry.npm.taobao.org/exit/download/exit-0.1.2.tgz",
+			"integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
+			"dev": true
+		},
+		"figures": {
+			"version": "1.7.0",
+			"resolved": "http://registry.npm.taobao.org/figures/download/figures-1.7.0.tgz",
+			"integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=",
+			"dev": true,
+			"requires": {
+				"escape-string-regexp": "1.0.5",
+				"object-assign": "4.1.1"
+			}
+		},
+		"findup-sync": {
+			"version": "0.1.3",
+			"resolved": "http://registry.npm.taobao.org/findup-sync/download/findup-sync-0.1.3.tgz",
+			"integrity": "sha1-fz56l7gjksZTvwZYm9hRkOk8NoM=",
+			"dev": true,
+			"requires": {
+				"glob": "3.2.11",
+				"lodash": "2.4.2"
+			},
+			"dependencies": {
+				"glob": {
+					"version": "3.2.11",
+					"resolved": "http://registry.npm.taobao.org/glob/download/glob-3.2.11.tgz",
+					"integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=",
+					"dev": true,
+					"requires": {
+						"inherits": "2.0.3",
+						"minimatch": "0.3.0"
+					}
+				},
+				"lodash": {
+					"version": "2.4.2",
+					"resolved": "http://registry.npm.taobao.org/lodash/download/lodash-2.4.2.tgz",
+					"integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=",
+					"dev": true
+				},
+				"minimatch": {
+					"version": "0.3.0",
+					"resolved": "http://registry.npm.taobao.org/minimatch/download/minimatch-0.3.0.tgz",
+					"integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=",
+					"dev": true,
+					"requires": {
+						"lru-cache": "2.7.3",
+						"sigmund": "1.0.1"
+					}
+				}
+			}
+		},
+		"getobject": {
+			"version": "0.1.0",
+			"resolved": "http://registry.npm.taobao.org/getobject/download/getobject-0.1.0.tgz",
+			"integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=",
+			"dev": true
+		},
+		"glob": {
+			"version": "3.1.21",
+			"resolved": "http://registry.npm.taobao.org/glob/download/glob-3.1.21.tgz",
+			"integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=",
+			"dev": true,
+			"requires": {
+				"graceful-fs": "1.2.3",
+				"inherits": "1.0.2",
+				"minimatch": "0.2.14"
+			},
+			"dependencies": {
+				"inherits": {
+					"version": "1.0.2",
+					"resolved": "http://registry.npm.taobao.org/inherits/download/inherits-1.0.2.tgz",
+					"integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=",
+					"dev": true
+				}
+			}
+		},
+		"graceful-fs": {
+			"version": "1.2.3",
+			"resolved": "http://registry.npm.taobao.org/graceful-fs/download/graceful-fs-1.2.3.tgz",
+			"integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=",
+			"dev": true
+		},
+		"grunt": {
+			"version": "0.4.5",
+			"resolved": "http://registry.npm.taobao.org/grunt/download/grunt-0.4.5.tgz",
+			"integrity": "sha1-VpN81RlDJK3/bSB2MYMqnWuk5/A=",
+			"dev": true,
+			"requires": {
+				"async": "0.1.22",
+				"coffee-script": "1.3.3",
+				"colors": "0.6.2",
+				"dateformat": "1.0.2-1.2.3",
+				"eventemitter2": "0.4.14",
+				"exit": "0.1.2",
+				"findup-sync": "0.1.3",
+				"getobject": "0.1.0",
+				"glob": "3.1.21",
+				"grunt-legacy-log": "0.1.3",
+				"grunt-legacy-util": "0.2.0",
+				"hooker": "0.2.3",
+				"iconv-lite": "0.2.11",
+				"js-yaml": "2.0.5",
+				"lodash": "0.9.2",
+				"minimatch": "0.2.14",
+				"nopt": "1.0.10",
+				"rimraf": "2.2.8",
+				"underscore.string": "2.2.1",
+				"which": "1.0.9"
+			}
+		},
+		"grunt-contrib-compress": {
+			"version": "0.5.3",
+			"resolved": "http://registry.npm.taobao.org/grunt-contrib-compress/download/grunt-contrib-compress-0.5.3.tgz",
+			"integrity": "sha1-ujtbL/Q4xFMFeeaWLKuAaWWA6+0=",
+			"dev": true,
+			"requires": {
+				"archiver": "0.4.10",
+				"lazystream": "0.1.0",
+				"prettysize": "0.0.3"
+			}
+		},
+		"grunt-contrib-concat": {
+			"version": "0.3.0",
+			"resolved": "http://registry.npm.taobao.org/grunt-contrib-concat/download/grunt-contrib-concat-0.3.0.tgz",
+			"integrity": "sha1-SPoNQzbSm2U62CJaa9b4VrRIPjI=",
+			"dev": true
+		},
+		"grunt-contrib-copy": {
+			"version": "0.4.1",
+			"resolved": "http://registry.npm.taobao.org/grunt-contrib-copy/download/grunt-contrib-copy-0.4.1.tgz",
+			"integrity": "sha1-8HU7QK4hu3BtrvsLKZ4DzfX6nW4=",
+			"dev": true
+		},
+		"grunt-contrib-cssmin": {
+			"version": "2.2.1",
+			"resolved": "http://registry.npm.taobao.org/grunt-contrib-cssmin/download/grunt-contrib-cssmin-2.2.1.tgz",
+			"integrity": "sha1-ZMvr5gE0vBJwykFUUU7EAHzBb38=",
+			"dev": true,
+			"requires": {
+				"chalk": "1.1.3",
+				"clean-css": "4.1.11",
+				"maxmin": "2.1.0"
+			}
+		},
+		"grunt-contrib-uglify": {
+			"version": "0.2.7",
+			"resolved": "http://registry.npm.taobao.org/grunt-contrib-uglify/download/grunt-contrib-uglify-0.2.7.tgz",
+			"integrity": "sha1-5r2lHgxAoUWfbOrUI8Ze/XJaG/c=",
+			"dev": true,
+			"requires": {
+				"grunt-lib-contrib": "0.6.1",
+				"uglify-js": "2.4.24"
+			}
+		},
+		"grunt-legacy-log": {
+			"version": "0.1.3",
+			"resolved": "http://registry.npm.taobao.org/grunt-legacy-log/download/grunt-legacy-log-0.1.3.tgz",
+			"integrity": "sha1-7ClCboAwIa9ZAp+H0vnNczWgVTE=",
+			"dev": true,
+			"requires": {
+				"colors": "0.6.2",
+				"grunt-legacy-log-utils": "0.1.1",
+				"hooker": "0.2.3",
+				"lodash": "2.4.2",
+				"underscore.string": "2.3.3"
+			},
+			"dependencies": {
+				"lodash": {
+					"version": "2.4.2",
+					"resolved": "http://registry.npm.taobao.org/lodash/download/lodash-2.4.2.tgz",
+					"integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=",
+					"dev": true
+				},
+				"underscore.string": {
+					"version": "2.3.3",
+					"resolved": "http://registry.npm.taobao.org/underscore.string/download/underscore.string-2.3.3.tgz",
+					"integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=",
+					"dev": true
+				}
+			}
+		},
+		"grunt-legacy-log-utils": {
+			"version": "0.1.1",
+			"resolved": "http://registry.npm.taobao.org/grunt-legacy-log-utils/download/grunt-legacy-log-utils-0.1.1.tgz",
+			"integrity": "sha1-wHBrndkGThFvNvI/5OawSGcsD34=",
+			"dev": true,
+			"requires": {
+				"colors": "0.6.2",
+				"lodash": "2.4.2",
+				"underscore.string": "2.3.3"
+			},
+			"dependencies": {
+				"lodash": {
+					"version": "2.4.2",
+					"resolved": "http://registry.npm.taobao.org/lodash/download/lodash-2.4.2.tgz",
+					"integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=",
+					"dev": true
+				},
+				"underscore.string": {
+					"version": "2.3.3",
+					"resolved": "http://registry.npm.taobao.org/underscore.string/download/underscore.string-2.3.3.tgz",
+					"integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=",
+					"dev": true
+				}
+			}
+		},
+		"grunt-legacy-util": {
+			"version": "0.2.0",
+			"resolved": "http://registry.npm.taobao.org/grunt-legacy-util/download/grunt-legacy-util-0.2.0.tgz",
+			"integrity": "sha1-kzJIhNv343qf98Am3/RR2UqeVUs=",
+			"dev": true,
+			"requires": {
+				"async": "0.1.22",
+				"exit": "0.1.2",
+				"getobject": "0.1.0",
+				"hooker": "0.2.3",
+				"lodash": "0.9.2",
+				"underscore.string": "2.2.1",
+				"which": "1.0.9"
+			}
+		},
+		"grunt-lib-contrib": {
+			"version": "0.6.1",
+			"resolved": "http://registry.npm.taobao.org/grunt-lib-contrib/download/grunt-lib-contrib-0.6.1.tgz",
+			"integrity": "sha1-P1att9oG6BR5XuJBWw6+X7iQPrs=",
+			"dev": true,
+			"requires": {
+				"zlib-browserify": "0.0.1"
+			}
+		},
+		"gzip-size": {
+			"version": "3.0.0",
+			"resolved": "http://registry.npm.taobao.org/gzip-size/download/gzip-size-3.0.0.tgz",
+			"integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=",
+			"dev": true,
+			"requires": {
+				"duplexer": "0.1.1"
+			}
+		},
+		"has-ansi": {
+			"version": "2.0.0",
+			"resolved": "http://registry.npm.taobao.org/has-ansi/download/has-ansi-2.0.0.tgz",
+			"integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+			"dev": true,
+			"requires": {
+				"ansi-regex": "2.1.1"
+			}
+		},
+		"hooker": {
+			"version": "0.2.3",
+			"resolved": "http://registry.npm.taobao.org/hooker/download/hooker-0.2.3.tgz",
+			"integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=",
+			"dev": true
+		},
+		"iconv-lite": {
+			"version": "0.2.11",
+			"resolved": "http://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.2.11.tgz",
+			"integrity": "sha1-HOYKOleGSiktEyH/RgnKS7llrcg=",
+			"dev": true
+		},
+		"inherits": {
+			"version": "2.0.3",
+			"resolved": "http://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz",
+			"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+			"dev": true
+		},
+		"isarray": {
+			"version": "0.0.1",
+			"resolved": "http://registry.npm.taobao.org/isarray/download/isarray-0.0.1.tgz",
+			"integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+			"dev": true
+		},
+		"js-yaml": {
+			"version": "2.0.5",
+			"resolved": "http://registry.npm.taobao.org/js-yaml/download/js-yaml-2.0.5.tgz",
+			"integrity": "sha1-olrmUJmZ6X3yeMZxnaEb0Gh3Q6g=",
+			"dev": true,
+			"requires": {
+				"argparse": "0.1.16",
+				"esprima": "1.0.4"
+			}
+		},
+		"lazystream": {
+			"version": "0.1.0",
+			"resolved": "http://registry.npm.taobao.org/lazystream/download/lazystream-0.1.0.tgz",
+			"integrity": "sha1-GyXWPHcqTCDwpe0KnXf0hLbhaSA=",
+			"dev": true,
+			"requires": {
+				"readable-stream": "1.0.34"
+			}
+		},
+		"lodash": {
+			"version": "0.9.2",
+			"resolved": "http://registry.npm.taobao.org/lodash/download/lodash-0.9.2.tgz",
+			"integrity": "sha1-jzSZxSRdNG1oLlsNO0B2fgnxqSw=",
+			"dev": true
+		},
+		"lru-cache": {
+			"version": "2.7.3",
+			"resolved": "http://registry.npm.taobao.org/lru-cache/download/lru-cache-2.7.3.tgz",
+			"integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=",
+			"dev": true
+		},
+		"maxmin": {
+			"version": "2.1.0",
+			"resolved": "http://registry.npm.taobao.org/maxmin/download/maxmin-2.1.0.tgz",
+			"integrity": "sha1-TTsiCQPZXu5+t6x/qGTnLcCaMWY=",
+			"dev": true,
+			"requires": {
+				"chalk": "1.1.3",
+				"figures": "1.7.0",
+				"gzip-size": "3.0.0",
+				"pretty-bytes": "3.0.1"
+			}
+		},
+		"minimatch": {
+			"version": "0.2.14",
+			"resolved": "http://registry.npm.taobao.org/minimatch/download/minimatch-0.2.14.tgz",
+			"integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=",
+			"dev": true,
+			"requires": {
+				"lru-cache": "2.7.3",
+				"sigmund": "1.0.1"
+			}
+		},
+		"nopt": {
+			"version": "1.0.10",
+			"resolved": "http://registry.npm.taobao.org/nopt/download/nopt-1.0.10.tgz",
+			"integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=",
+			"dev": true,
+			"requires": {
+				"abbrev": "1.1.1"
+			}
+		},
+		"number-is-nan": {
+			"version": "1.0.1",
+			"resolved": "http://registry.npm.taobao.org/number-is-nan/download/number-is-nan-1.0.1.tgz",
+			"integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+			"dev": true
+		},
+		"object-assign": {
+			"version": "4.1.1",
+			"resolved": "http://registry.npm.taobao.org/object-assign/download/object-assign-4.1.1.tgz",
+			"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+			"dev": true
+		},
+		"pretty-bytes": {
+			"version": "3.0.1",
+			"resolved": "http://registry.npm.taobao.org/pretty-bytes/download/pretty-bytes-3.0.1.tgz",
+			"integrity": "sha1-J9AAjXeAY6C0gRuzXHnxvV1fvM8=",
+			"dev": true,
+			"requires": {
+				"number-is-nan": "1.0.1"
+			}
+		},
+		"prettysize": {
+			"version": "0.0.3",
+			"resolved": "http://registry.npm.taobao.org/prettysize/download/prettysize-0.0.3.tgz",
+			"integrity": "sha1-FK//amReWRpN3xxykZwjtBRhgaE=",
+			"dev": true
+		},
+		"readable-stream": {
+			"version": "1.0.34",
+			"resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-1.0.34.tgz",
+			"integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+			"dev": true,
+			"requires": {
+				"core-util-is": "1.0.2",
+				"inherits": "2.0.3",
+				"isarray": "0.0.1",
+				"string_decoder": "0.10.31"
+			}
+		},
+		"rimraf": {
+			"version": "2.2.8",
+			"resolved": "http://registry.npm.taobao.org/rimraf/download/rimraf-2.2.8.tgz",
+			"integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=",
+			"dev": true
+		},
+		"sigmund": {
+			"version": "1.0.1",
+			"resolved": "http://registry.npm.taobao.org/sigmund/download/sigmund-1.0.1.tgz",
+			"integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=",
+			"dev": true
+		},
+		"source-map": {
+			"version": "0.5.7",
+			"resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz",
+			"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+			"dev": true
+		},
+		"string_decoder": {
+			"version": "0.10.31",
+			"resolved": "http://registry.npm.taobao.org/string_decoder/download/string_decoder-0.10.31.tgz",
+			"integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+			"dev": true
+		},
+		"strip-ansi": {
+			"version": "3.0.1",
+			"resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz",
+			"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+			"dev": true,
+			"requires": {
+				"ansi-regex": "2.1.1"
+			}
+		},
+		"supports-color": {
+			"version": "2.0.0",
+			"resolved": "http://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz",
+			"integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+			"dev": true
+		},
+		"uglify-js": {
+			"version": "2.4.24",
+			"resolved": "http://registry.npm.taobao.org/uglify-js/download/uglify-js-2.4.24.tgz",
+			"integrity": "sha1-+tV1XB4Vd2WLsG/5q25UjJW+vW4=",
+			"dev": true,
+			"requires": {
+				"async": "0.2.10",
+				"source-map": "0.1.34",
+				"uglify-to-browserify": "1.0.2",
+				"yargs": "3.5.4"
+			},
+			"dependencies": {
+				"async": {
+					"version": "0.2.10",
+					"resolved": "http://registry.npm.taobao.org/async/download/async-0.2.10.tgz",
+					"integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=",
+					"dev": true
+				},
+				"source-map": {
+					"version": "0.1.34",
+					"resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.1.34.tgz",
+					"integrity": "sha1-p8/omux7FoLDsZjQrPtH19CQVms=",
+					"dev": true,
+					"requires": {
+						"amdefine": "1.0.1"
+					}
+				}
+			}
+		},
+		"uglify-to-browserify": {
+			"version": "1.0.2",
+			"resolved": "http://registry.npm.taobao.org/uglify-to-browserify/download/uglify-to-browserify-1.0.2.tgz",
+			"integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
+			"dev": true
+		},
+		"underscore": {
+			"version": "1.7.0",
+			"resolved": "http://registry.npm.taobao.org/underscore/download/underscore-1.7.0.tgz",
+			"integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=",
+			"dev": true
+		},
+		"underscore.string": {
+			"version": "2.2.1",
+			"resolved": "http://registry.npm.taobao.org/underscore.string/download/underscore.string-2.2.1.tgz",
+			"integrity": "sha1-18D6KvXVoaZ/QlPa7pgTLnM/Dxk=",
+			"dev": true
+		},
+		"which": {
+			"version": "1.0.9",
+			"resolved": "http://registry.npm.taobao.org/which/download/which-1.0.9.tgz",
+			"integrity": "sha1-RgwdoPgQED0DIam2M6+eV15kSG8=",
+			"dev": true
+		},
+		"window-size": {
+			"version": "0.1.0",
+			"resolved": "http://registry.npm.taobao.org/window-size/download/window-size-0.1.0.tgz",
+			"integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=",
+			"dev": true
+		},
+		"wordwrap": {
+			"version": "0.0.2",
+			"resolved": "http://registry.npm.taobao.org/wordwrap/download/wordwrap-0.0.2.tgz",
+			"integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
+			"dev": true
+		},
+		"yargs": {
+			"version": "3.5.4",
+			"resolved": "http://registry.npm.taobao.org/yargs/download/yargs-3.5.4.tgz",
+			"integrity": "sha1-2K/49mXpTDS9JZvevRv68N3TU2E=",
+			"dev": true,
+			"requires": {
+				"camelcase": "1.2.1",
+				"decamelize": "1.2.0",
+				"window-size": "0.1.0",
+				"wordwrap": "0.0.2"
+			}
+		},
+		"zlib-browserify": {
+			"version": "0.0.1",
+			"resolved": "http://registry.npm.taobao.org/zlib-browserify/download/zlib-browserify-0.0.1.tgz",
+			"integrity": "sha1-T6akXQDbwV8xikr6HZr8Aljhdsw=",
+			"dev": true
+		}
+	}
+}

+ 15 - 0
public/kindeditor/package.json

@@ -0,0 +1,15 @@
+{
+	"name": "NKeditor",
+	"version": "5.0.4",
+	"filename": "NKeditor",
+	"repository": "blackfox/NKeditor",
+	"devDependencies": {
+		"grunt": "~0.4.1",
+		"grunt-contrib-concat": "~0.3.0",
+		"grunt-contrib-uglify": "~0.2.7",
+		"grunt-contrib-cssmin": "~2.2.1",
+		"grunt-contrib-copy": "~0.4.1",
+		"grunt-contrib-compress": "~0.5.3"
+	},
+	"license": "MIT"
+}

+ 260 - 0
public/kindeditor/php/JsonResult.php

@@ -0,0 +1,260 @@
+<?php
+/**
+ * json result vo
+ * ---------------------------------------------------------------------
+ * @author yangjian<yangjian102621@gmail.com>
+ * @since v1.2.1
+ */
+
+class JsonResult {
+
+    const CODE_SUCCESS = "000";
+    const CODE_FAIL = "001";
+
+    /**
+     * 数据载体
+     * @var array
+     */
+    private $data;
+
+    /**
+     * 列表数据条数
+     * @var int
+     */
+    private $count;
+
+    /**
+     * 当前数据页码
+     * @var int
+     */
+    private $page;
+
+    /**
+     * 每页显示数据条数
+     * @var int
+     */
+    private $pagesize;
+
+    /**
+     * 附带数据
+     * @var mixed
+     */
+    private $extra;
+    /**
+     * 错误代码
+     * @var string
+     */
+    private $code = self::CODE_SUCCESS;
+
+    /**
+     * 状态码信息
+     * @var array
+     */
+    private static $_CODE_STATUS = [
+        self::CODE_SUCCESS => '操作成功.',
+        self::CODE_FAIL => '系统开了小差.',
+    ];
+
+    /**
+     * 消息
+     * @var string
+     */
+    private $message;
+
+    /**
+     * JsonResult constructor.
+     * @param $code
+     * @param $message
+     */
+    public function __construct($code=null, $message=null){
+        $this->setCode($code);
+        $this->setMessage($message);
+    }
+
+    /**
+     * 创建 JsonResult 实例, 并输出
+     * @param $code
+     * @param $message
+     * @return JsonResult
+     */
+    public static function result($code, $message) {
+        $result = new self($code, $message);
+        $result->output();
+    }
+
+    /**
+     * 返回一个成功的 result vo
+     * @param string $message
+     * @return JsonResult
+     */
+    public static function success($message='操作成功') {
+        $result = new self(self::CODE_SUCCESS, $message);
+        $result->output();
+    }
+
+    /**
+     * 返回一个失败的 result vo
+     * @param string $message
+     * @return JsonResult
+     */
+    public static function fail($message='系统开了小差') {
+        $result = new self(self::CODE_FAIL, $message);
+        $result->output();
+    }
+
+    /**
+     * 返回jsonp数据格式
+     * @param $code
+     * @param $message
+     * @param $callback
+     */
+    public static function jsonp($code, $message, $callback){
+        $result = new self($code, $message);
+        die($callback. "(". $result .")");
+    }
+
+    /**
+     * @return int
+     */
+    public function getCode()
+    {
+        return $this->code;
+    }
+
+    /**
+     * @param int $code
+     */
+    public function setCode($code)
+    {
+        $this->code = $code;
+    }
+
+    /**
+     * @return the $message
+     */
+    public function getMessage() {
+        return $this->message;
+    }
+
+    /**
+     * @param string $message
+     */
+    public function setMessage($message) {
+        $this->message = $message;
+    }
+
+    /**
+     * @return array
+     */
+    public function getData()
+    {
+        return $this->data;
+    }
+
+    /**
+     * @param array $data
+     */
+    public function setData($data)
+    {
+        $this->data = $data;
+    }
+
+    /**
+     * @return int
+     */
+    public function getCount()
+    {
+        return $this->count;
+    }
+
+    /**
+     * @param int $count
+     */
+    public function setCount($count)
+    {
+        $this->count = $count;
+    }
+
+    /**
+     * @return int
+     */
+    public function getPage()
+    {
+        return $this->page;
+    }
+
+    /**
+     * @param int $page
+     */
+    public function setPage($page)
+    {
+        $this->page = $page;
+    }
+
+    /**
+     * @return int
+     */
+    public function getPagesize()
+    {
+        return $this->pagesize;
+    }
+
+    /**
+     * @param int $pagesize
+     */
+    public function setPagesize($pagesize)
+    {
+        $this->pagesize = $pagesize;
+    }
+
+    /**
+     * @return mixed
+     */
+    public function getExtra()
+    {
+        return $this->extra;
+    }
+
+    /**
+     * @param mixed $extra
+     */
+    public function setExtra($extra)
+    {
+        $this->extra = $extra;
+    }
+
+    /**
+     * 判断是否成功
+     * @return bool
+     */
+    public function isSucess() {
+        return $this->code == self::CODE_SUCCESS;
+    }
+
+    /**
+     * 转换字符串
+     * @return string
+     */
+    public function __toString() {
+        if ( !$this->getMessage() ) {
+            $this->setMessage(self::$_CODE_STATUS[$this->code]);
+        }
+        return json_encode(array(
+            'code'=>$this->getCode(),
+            'message'=>$this->getMessage(),
+            'count'=>$this->getCount(),
+            'page'=>$this->getPage(),
+            'pagesize'=>$this->getPagesize(),
+            'extra'=>$this->getExtra(),
+            'data'=>$this->getData()), JSON_UNESCAPED_UNICODE);
+    }
+
+    /**
+     * 以json格式输出
+     */
+    public function output() {
+        header('Content-type: application/json;charset=utf-8');
+        echo $this;
+        die();
+    }
+}

+ 1 - 0
public/kindeditor/php/default/cache.tmp

@@ -0,0 +1 @@
+1508678800

+ 116 - 0
public/kindeditor/php/default/db/SimpleDB.php

@@ -0,0 +1,116 @@
+<?php
+/****************************************************
+ * NKeditor PHP
+ * 本PHP程序是演示程序,建议不要直接在实际项目中使用。
+ * 如果您确定直接使用本程序,使用之前请仔细确认相关安全设置。
+ * **************************************************
+ * 简易数据库, 单表 100w 条数据,查询一页数据在 0.015 秒左右
+ * 缺陷,无法排序,如果要排序的话,那么不适合使用 SimpleDB, 请使用 mysql 或者 mongdb
+ * User: yangjian
+ * Date: 17-10-14
+ * Time: 下午5:15
+ */
+
+class SimpleDB {
+
+    /**
+     * 文件资源
+     * @var null|resource
+     */
+    private $handler = null;
+
+    /**
+     * 初始化,打开文件
+     * SimpleDB constructor.
+     * @param $dbname
+     */
+    public function __construct($dbname)
+    {
+        $dataDir = __DIR__."/data/";
+        if (!file_exists($dataDir)) {
+            mkdir($dataDir);
+        }
+        $this->handler = fopen($dataDir.$dbname.'.db', 'a+');
+    }
+
+    /**
+     * 写入一行数据
+     * @return bool
+     */
+    public function putLine($data) {
+
+        if ($this->handler != null) {
+            fwrite($this->handler, $this->seralize($data));
+        }
+        return false;
+
+    }
+
+    /**
+     * 分页获取数据列表
+     * @param $key
+     * @return array|null
+     */
+    public function getDataList($page, $pagesize) {
+
+        if($page <= 0) {
+            $page = 1;
+        }
+        $offset = ($page - 1) * $pagesize;
+        //循环读取数据
+        $datas = [];
+        $counter = 0;
+        while (!feof($this->handler)) {
+            if ($counter < $offset) {
+                fgets($this->handler); //移动指针到下一行
+                $counter++;
+                continue;
+            }
+            if (count($datas) == $pagesize) {
+                break;
+            }
+            $line = fgets($this->handler);
+            if (!empty($line)) {
+                $datas[] = $this->unseralize($line);
+            }
+        }
+
+        return $datas;
+    }
+
+    /**
+     * 序列化数据
+     * @param $data
+     * @return string
+     */
+    private function seralize($data) {
+
+        $break = "\n"; //换行符
+        if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
+            $break = "\r\n";
+        }
+        return json_encode($data, JSON_UNESCAPED_UNICODE).$break;
+
+    }
+
+    /**
+     * 反序列化
+     * @param $data
+     * @return mixed
+     */
+    private function unseralize($data) {
+
+        return json_decode($data, true);
+
+    }
+
+    /**
+     * 关闭文件
+     */
+    public function __destruct()
+    {
+        if ($this->handler != null) {
+            fclose($this->handler);
+        }
+    }
+}

+ 18 - 0
public/kindeditor/php/default/db/test.php

@@ -0,0 +1,18 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: yangjian
+ * Date: 17-10-14
+ * Time: 下午5:28
+ */
+require_once "SimpleDB.php";
+
+$db = new SimpleDB("test");
+$t = 100000000;
+for($i = 0; $i < 1000000; $i++) {
+    $db->putLine($t+$i);
+}
+printf("数据插入完毕!\n");
+$items = $db->getDataList(2, 10);
+print_r($items);
+

+ 29 - 0
public/kindeditor/php/default/file_manager_json.php

@@ -0,0 +1,29 @@
+<?php
+/****************************************************
+ * NKeditor PHP
+ * 本PHP程序是演示程序,建议不要直接在实际项目中使用。
+ * 如果您确定直接使用本程序,使用之前请仔细确认相关安全设置。
+ * **************************************************
+ * 获取图片服务器上已上传的图片列表
+ * @author yangjian<yangjian102621@gmail.com>
+ */
+error_reporting(0);
+require_once '../JsonResult.php';
+require_once '../functions.php';
+require_once "db/SimpleDB.php";
+
+usleep(500000);
+$page = intval($_GET["page"]);
+$fileType = trim($_GET['fileType']);
+$pagesize = 15;
+//读取文件数据
+$db = new SimpleDB($fileType);
+$files = $db->getDataList($page, $pagesize);
+$result = new JsonResult();
+if (!empty($files)) {
+    $result->setCode(JsonResult::CODE_SUCCESS);
+    $result->setData($files);
+} else {
+    $result->setCode(JsonResult::CODE_FAIL);
+}
+$result->output();

+ 77 - 0
public/kindeditor/php/default/import.php

@@ -0,0 +1,77 @@
+<?php
+/**
+ * 从老版本的 kindeditor 升级到 NKeditor,你可能需要把之前的文件初始化插入数据库。
+ * 考虑到你可能更改了之前的老版本的文件上传代码,比如存储路径的风格,这里就只个给出一个参考思路:
+ * 1. 遍历你的附件存储根目录, 并根据不同的文件类型 image, flash, file, media 分别创建4个数据库;
+ * 2. 分别递归遍历这4个文件夹,把数据文件的 url 插入到各自的 SimpleDB 数据库.
+ * ----------------------
+ * 重建文件索引, 请使用命令行运行 php import.php
+ * @author yangjian
+ */
+error_reporting(0);
+require_once "db/SimpleDB.php";
+require_once "../functions.php";
+
+// 文件上传的根目录,请根据自己的实际情况修改
+$root = $basePath = dirname(dirname(__DIR__)) . "/uploads/";
+// 图片上传的根url,请根据实际项目修改
+$baseUrl = "/editor/nkeditor/uploads/";
+
+//如果数据库已经存在,则先删除
+$datadir = __DIR__.'/db/data';
+file_exists($datadir) && deldir($datadir);
+
+chdir($root);
+$dirs = glob("*");
+foreach ($dirs as $dir) {
+    $db = new SimpleDB($dir);
+    walkDir($root.$dir, $db, $dir);
+}
+
+tprint("数据导入完毕!");
+
+/**
+ * 遍历目录,建立路径索引
+ * @param $dir
+ * @param SimpleDB $db
+ * @param $fileType
+ */
+function walkDir($dir, $db, $fileType) {
+    $handler = opendir($dir);
+    global $root;
+    global $baseUrl;
+    while (($filename = readdir($handler)) !== false) {
+        if ($filename != '.' && $filename != '..') {
+            $filePath = $dir.'/'.$filename;
+            if (is_dir($filePath)) {
+                walkDir($filePath, $db, $fileType);
+                continue;
+            }
+            $filesize = filesize($filePath);
+            //如果是图片则获取尺寸
+            if ($fileType == "image") {
+                $size = getimagesize($filePath);
+            }
+            $fileUrl = $baseUrl.str_replace('\\', '/', str_replace($root, '', $filePath));
+            $data = [
+                "thumbURL" => $fileUrl,
+                "oriURL" => $fileUrl,
+                "filesize" => $filesize,
+                "width" => intval($size[0]),
+                "height" => intval($size[1])
+            ];
+            $db->putLine($data);
+            tprint("添加路径: {$fileUrl}");
+        }
+    }
+
+    closedir($handler);
+}
+
+/**
+ * 终端打印函数
+ * @param $message
+ */
+function tprint($message) {
+    printf("\033[32m\033[1m{$message}\033[0m\n");
+}

+ 152 - 0
public/kindeditor/php/default/upload_json.php

@@ -0,0 +1,152 @@
+<?php
+/****************************************************
+ * NKeditor PHP
+ * 本PHP程序是演示程序,建议不要直接在实际项目中使用。
+ * 如果您确定直接使用本程序,使用之前请仔细确认相关安全设置。
+ * **************************************************
+ * @author yangjian<yangjian102621@gmail.com>
+ * 文件上传程序
+ */
+error_reporting(0);
+require_once '../JsonResult.php';
+require_once '../functions.php';
+require_once "db/SimpleDB.php";
+
+$fileType = empty($_GET['dir']) ? 'image' : trim($_GET['dir']);
+//文件保存目录路径
+$basePath = BASE_PATH."{$fileType}/".UPLOAD_PREFIX;
+//文件保存目录URL
+$baseUrl = BASE_URL . "{$fileType}/".UPLOAD_PREFIX;
+//定义允许上传的文件扩展名
+$allowExtesions = array(
+	'image' => array('gif', 'jpg', 'jpeg', 'png', 'bmp'),
+	'flash' => array('swf', 'flv'),
+	'media' => array('swf', 'flv', 'mp3', 'wav', 'wma', 'wmv', 'mid', 'avi', 'mpg', 'asf', 'rm', 'rmvb'),
+	'file' => array('doc', 'docx', 'xls', 'xlsx', 'ppt', 'htm', 'html', 'txt', 'zip', 'rar', 'gz', 'bz2'),
+);
+//最大文件大小 2MB
+$maxSize = 2*1024*1024;
+if (!file_exists($basePath)) {
+    mkdirs($basePath);
+}
+//PHP上传失败
+if (!empty($_FILES['imgFile']['error'])) {
+	switch($_FILES['imgFile']['error']){
+		case '1':
+			$error = '超过php.ini允许的大小。';
+			break;
+		case '2':
+			$error = '超过表单允许的大小。';
+			break;
+		case '3':
+			$error = '图片只有部分被上传。';
+			break;
+		case '4':
+			$error = '请选择图片。';
+			break;
+		case '6':
+			$error = '找不到临时目录。';
+			break;
+		case '7':
+			$error = '写文件到硬盘出错。';
+			break;
+		case '8':
+			$error = 'File upload stopped by extension。';
+			break;
+		case '999':
+		default:
+			$error = '未知错误。';
+	}
+	alert($error);
+}
+
+//base64 文件上传
+$base64 = trim($_POST['base64']);
+if ($base64) {
+	$imgData = $_POST['img_base64_data'];
+
+	$json = new JsonResult();
+	if ($imgData && preg_match('/^(data:\s*image\/(\w+);base64,)/', $imgData, $match)){
+		$type = $match[2];
+		$filename = date("YmdHis") . '_' . rand(10000, 99999) . '.png';
+		if (file_put_contents($basePath.$filename, base64_decode(str_replace($match[1], '', $imgData)))){
+			$json->setCode(JsonResult::CODE_SUCCESS);
+			$json->setData(array('url' => $baseUrl.$filename));
+			$json->output();
+		}
+	}
+	$json->setCode(JsonResult::CODE_FAIL);
+	$json->setMessage("涂鸦保存失败.");
+	$json->output();
+}
+
+// input 文件上传
+if (empty($_FILES) == false) {
+	//原文件名
+	$filename = $_FILES['imgFile']['name'];
+	//服务器上临时文件名
+	$tmpName = $_FILES['imgFile']['tmp_name'];
+	//文件大小
+	$filesize = $_FILES['imgFile']['size'];
+	//检查文件名
+	if (!$filename) {
+		alert("请选择文件。");
+	}
+	//检查目录
+	if (@is_dir($basePath) === false) {
+		alert("上传目录不存在。");
+	}
+	//检查目录写权限
+	if (@is_writable($basePath) === false) {
+		alert("上传目录没有写权限。");
+	}
+	//检查是否已上传
+	if (@is_uploaded_file($tmpName) === false) {
+		alert("上传失败。");
+	}
+	//检查文件大小
+	if ($filesize > $maxSize) {
+		alert("上传文件大小超过限制。");
+	}
+
+	//获得文件扩展名
+	$extesion = getFileExt($filename);
+	//检查扩展名
+	if (in_array($extesion, $allowExtesions[$fileType]) === false) {
+		alert("上传文件扩展名是不允许的扩展名。\n只允许" . implode(",", $allowExtesions[$fileType]) . "格式。");
+	}
+	//新文件名
+	$newFileName = genNewFilename($filename);
+	//移动文件
+	$filePath = $basePath . $newFileName;
+	if (move_uploaded_file($tmpName, $filePath) === false) {
+		alert("上传文件失败。");
+	}
+	@chmod($filePath, 0644);
+	$fileUrl = $baseUrl . $newFileName;
+
+	$json = new JsonResult(JsonResult::CODE_SUCCESS, "上传成功");
+	$json->setData(array('url' => $fileUrl));
+
+	//保存文件地址到数据库
+    $db = new SimpleDB($fileType);
+    //过滤掉非图片文件
+    if ($fileType == "image") {
+        $size = getimagesize($filePath);
+    }
+    $data = [
+        "thumbURL" => $fileUrl,
+        "oriURL" => $fileUrl,
+        "filesize" => $filesize,
+        "width" => intval($size[0]),
+        "height" => intval($size[1])
+    ];
+    $db->putLine($data);
+
+	$json->output();
+}
+
+function alert($msg) {
+	$json = new JsonResult(JsonResult::CODE_FAIL, $msg);
+	$json->output();
+}

+ 109 - 0
public/kindeditor/php/functions.php

@@ -0,0 +1,109 @@
+<?php
+/**
+ * 全局函数
+ * @author yangjian<yangjian102621@gmail.com>
+ */
+
+// 文件上传的根路径
+define('BASE_PATH', dirname(__DIR__)."/uploads/");
+// 文件上传路径前缀
+define('UPLOAD_PREFIX', date('Ym').'/'.date('d').'/');
+// 文件上传的根 url
+define('BASE_URL', dirname(dirname(dirname($_SERVER['PHP_SELF'])))."/uploads/");
+
+/**
+ * 创建多级目录
+ * @param $dir
+ */
+function mkdirs($path) {
+    $files = preg_split('/[\/|\\\]/s', $path);
+    $_dir = '';
+    foreach ($files as $value) {
+        $_dir .= $value.DIRECTORY_SEPARATOR;
+        if ( !file_exists($_dir) ) {
+            mkdir($_dir);
+        }
+    }
+}
+
+/**
+ * 获取文件后缀名
+ * @param $filename
+ * @return string
+ */
+function getFileExt($filename) {
+    $temp_arr = explode(".", $filename);
+    $file_ext = array_pop($temp_arr);
+    return strtolower(trim($file_ext));
+}
+
+/**
+ * 显示图片
+ * @param $image
+ * @param $img_url
+ */
+function show_image($image, $img_url) {
+
+    $info = pathinfo($img_url);
+    switch ( strtolower($info["extension"]) ) {
+        case "jpg":
+        case "jpeg":
+            header('content-type:image/jpg;');
+            imagejpeg($image);
+            break;
+
+        case "gif":
+            header('content-type:image/gif;');
+            imagegif($image);
+            break;
+
+        case "png":
+            header('content-type:image/png;');
+            imagepng($image);
+            break;
+
+        default:
+            header('content-type:image/wbmp;');
+            image2wbmp($image);
+    }
+
+}
+
+/**
+ * 生成新的文件名
+ * @param $file
+ * @return string
+ */
+function genNewFilename($file) {
+    $extesion = getFileExt($file);
+    return date("YmdHis") . '_' . rand(10000, 99999) . '.' . $extesion;
+}
+
+/**
+ * 清空目录
+ * @param $dirName
+ * @return bool
+ */
+function deldir($dirName) {
+    //节省资源,每天清理一次
+    $file = "cache.tmp";
+    $t = @file_get_contents($file);
+    $now = time();
+    if ($now - intval($t) < 60*60*24) {
+        return false;
+    }
+    file_put_contents($file, $now);
+
+    if(file_exists($dirName) && $handle=opendir($dirName)){
+        while(false!==($item = readdir($handle))){
+            if($item!= "." && $item != ".."){
+                if(file_exists($dirName.'/'.$item) && is_dir($dirName.'/'.$item)){
+                    delFile($dirName.'/'.$item);
+                }else{
+                    @unlink($dirName.'/'.$item);
+                }
+            }
+        }
+        closedir( $handle);
+    }
+}

+ 1 - 0
public/kindeditor/php/qiniu/cache.tmp

@@ -0,0 +1 @@
+1508682572

+ 15 - 0
public/kindeditor/php/qiniu/composer.json

@@ -0,0 +1,15 @@
+{
+    "name": "demo/myapp",
+    "description": "just a test",
+    "type": "project",
+    "require": {
+        "qiniu/php-sdk": "7.2.1"
+    },
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "yangjian",
+            "email": "yangjian102621@gmail.com"
+        }
+    ]
+}

+ 70 - 0
public/kindeditor/php/qiniu/composer.lock

@@ -0,0 +1,70 @@
+{
+    "_readme": [
+        "This file locks the dependencies of your project to a known state",
+        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
+        "This file is @generated automatically"
+    ],
+    "hash": "950bafd0ae6623c9fdc42a0ef039aac6",
+    "content-hash": "e0dd4b480ce3ed67ad527554d82237fd",
+    "packages": [
+        {
+            "name": "qiniu/php-sdk",
+            "version": "v7.2.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/qiniu/php-sdk.git",
+                "reference": "8c7ba738bd4443ee3569a07441913b07c4b2c4a2"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/qiniu/php-sdk/zipball/8c7ba738bd4443ee3569a07441913b07c4b2c4a2",
+                "reference": "8c7ba738bd4443ee3569a07441913b07c4b2c4a2",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.0",
+                "squizlabs/php_codesniffer": "~2.3"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Qiniu\\": "src/Qiniu"
+                },
+                "files": [
+                    "src/Qiniu/functions.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Qiniu",
+                    "email": "sdk@qiniu.com",
+                    "homepage": "http://www.qiniu.com"
+                }
+            ],
+            "description": "Qiniu Resource (Cloud) Storage SDK for PHP",
+            "homepage": "http://developer.qiniu.com/",
+            "keywords": [
+                "cloud",
+                "qiniu",
+                "sdk",
+                "storage"
+            ],
+            "time": "2017-08-26 00:46:11"
+        }
+    ],
+    "packages-dev": [],
+    "aliases": [],
+    "minimum-stability": "stable",
+    "stability-flags": [],
+    "prefer-stable": false,
+    "prefer-lowest": false,
+    "platform": [],
+    "platform-dev": []
+}

+ 61 - 0
public/kindeditor/php/qiniu/config.php

@@ -0,0 +1,61 @@
+<?php
+/**
+ * 七牛服务器配置信息
+ * User: yangjian
+ * Date: 17-9-14
+ * Time: 上午11:29
+ */
+define("QINIU_ACCESS_KEY", "_-BMslq1mPL_zY0KN2iLD1-ym4TcHhQUi0_dDFPB");
+define("QINIU_SECRET_KEY", "J_As9ApfpyCpk31l3hOAZe3QQTc8iYlEfdd6-5an");
+define("QINIU_TEST_BUCKET", "kindeditor");
+define("QINIU_BUCKET_DOMAIN", "http://nk.img.r9it.com/");
+error_reporting(0); //关闭报错输出,以免打乱 json 数据格式
+
+/**
+ * 获取图片尺寸
+ * @param $filename
+ * @return mixed
+ */
+function getImgSize($filename) {
+    $json = file_get_contents(QINIU_BUCKET_DOMAIN."{$filename}?imageInfo");
+    return json_decode($json, true);
+}
+
+/**
+ * 上传 base64 图片
+ * @param $data
+ * @param $filename
+ * @param $upToken
+ * @return bool|mixed
+ */
+function base64Upload($data, $filename, $upToken)
+{
+
+    if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $data, $match)) {
+
+        $imgData = str_replace($match[1], '', $data); //去掉图片的声明前缀
+
+        /**
+         * upload.qiniu.com 上传域名适用于华东空间。华北空间使用 upload-z1.qiniu.com,
+         * 华南空间使用 upload-z2.qiniu.com,北美空间使用 upload-na0.qiniu.com。
+         */
+        $url = "http://upload-z2.qiniu.com/putb64/-1/key/".base64_encode($filename);
+        $headers = array();
+        $headers[] = 'Content-Type:image/png';
+        $headers[] = 'Authorization:UpToken ' . $upToken;
+        $ch = curl_init();
+        curl_setopt($ch, CURLOPT_URL, $url);
+        //curl_setopt($ch, CURLOPT_HEADER, 0);
+        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
+        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+        //curl_setopt($ch, CURLOPT_POST, 1);
+        curl_setopt($ch, CURLOPT_POSTFIELDS, $imgData);
+        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
+        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
+        $data = curl_exec($ch);
+        curl_close($ch);
+        return $data;
+    }
+    return false;
+
+}

+ 68 - 0
public/kindeditor/php/qiniu/file_manager_json.php

@@ -0,0 +1,68 @@
+<?php
+namespace qiniu\upload;
+/****************************************************
+ * NKeditor PHP
+ * 本PHP程序是演示程序,建议不要直接在实际项目中使用。
+ * 如果您确定直接使用本程序,使用之前请仔细确认相关安全设置。
+ * **************************************************
+ * 获取图片服务器上已上传的图片列表
+ * @author yangjian<yangjian102621@gmail.com>
+ */
+
+use Qiniu\Auth;
+use Qiniu\Storage\BucketManager;
+
+require_once "vendor/autoload.php";
+require_once "../JsonResult.php";
+require_once "config.php";
+require_once "../functions.php";
+
+$page = intval($_GET["page"]);
+$fileType = trim($_GET['fileType']);
+if ($fileType == '') {
+    $fileType = "image";
+}
+$marker = trim($_GET['marker']); //上次列举返回的位置标记,作为本次列举的起点信息。
+
+if ($marker == "no_records") {
+    \JsonResult::fail("没有更多的文件了");
+}
+
+// 构建鉴权对象
+$auth = new Auth(QINIU_ACCESS_KEY, QINIU_SECRET_KEY);
+$bucketManager = new BucketManager($auth);
+
+// 要列取文件的公共前缀
+$prefix = $fileType."-";
+
+// 本次列举的条目数
+$limit = 15;
+$delimiter = '/';
+list($ret, $err) = $bucketManager->listFiles(QINIU_TEST_BUCKET, $prefix, $marker, $limit, $delimiter);
+$result = new \JsonResult();
+if ($err !== null) {
+    $result->setCode(\JsonResult::CODE_FAIL);
+    $result->setMessage($err);
+} else {
+    $files = array();
+    $result->setCode(\JsonResult::CODE_SUCCESS);
+    foreach($ret["items"] as $value) {
+        $filename = $value['key'];
+        if (strpos($value['mimeType'], 'image') !== false) { //如果是图片则获取尺寸
+            $imgSize = getImgSize($value['key']);
+        }
+        array_push($files, array(
+            "thumbURL" => QINIU_BUCKET_DOMAIN.$filename,
+            "oriURL" => QINIU_BUCKET_DOMAIN.$filename,
+            "filesize" => $value['fsize'],
+            "width" => intval($imgSize["width"]),
+            "height" => intval($imgSize["height"])));
+    }
+    $result->setData($files);
+    if (array_key_exists('marker', $ret)) {
+        $result->setExtra($ret['marker']);
+    } else {
+        $result->setExtra("no_records");
+    }
+}
+$result->output();

+ 92 - 0
public/kindeditor/php/qiniu/upload_json.php

@@ -0,0 +1,92 @@
+<?php
+namespace qiniu\upload;
+/****************************************************
+ * NKeditor PHP
+ * 本PHP程序是演示程序,建议不要直接在实际项目中使用。
+ * 如果您确定直接使用本程序,使用之前请仔细确认相关安全设置。
+ * **************************************************
+ * @author yangjian<yangjian102621@gmail.com>
+ * 文件上传程序
+ */
+
+error_reporting(0);
+
+use Qiniu\Auth;
+use Qiniu\Storage\UploadManager;
+
+require_once "vendor/autoload.php";
+require_once "../JsonResult.php";
+require_once "config.php";
+require_once "../functions.php";
+
+$fileType = trim($_GET['fileType']);
+if (empty($fileType)) {
+    $fileType = "image";
+}
+// 构建鉴权对象
+$auth = new Auth(QINIU_ACCESS_KEY, QINIU_SECRET_KEY);
+// 生成上传 Token
+$token = $auth->uploadToken(QINIU_TEST_BUCKET);
+
+// 要上传文件的本地路径
+//$filePath = './php-logo.png';
+$base64 = trim($_POST['base64']);
+if ($base64) {
+    $data = $_POST['img_base64_data'];
+    $filename = "{$fileType}-".time().".png";
+    $res = base64Upload($data, $filename, $token);
+    $json = new \JsonResult();
+    if ($res) {
+        $res = json_decode($res, true);
+        $json->setCode(\JsonResult::CODE_SUCCESS);
+        $json->setData(array('url' => QINIU_BUCKET_DOMAIN.$res['key']));
+    } else {
+        $json->setCode(\JsonResult::CODE_FAIL);
+        $json->setMessage("上传涂鸦失败!");
+    }
+    $json->output();
+} else {
+    $filePath = $_FILES['imgFile']['tmp_name'];
+    $fileExt = getFileExt($_FILES['imgFile']['name']);
+
+    // 返回结果
+    $json = new \JsonResult();
+    //定义允许上传的文件扩展名
+    $extArr = array(
+        'image' => array('gif', 'jpg', 'jpeg', 'png', 'bmp'),
+        'flash' => array('swf', 'flv'),
+        'media' => array('swf', 'flv', 'mp3', 'wav', 'wma', 'wmv', 'mid', 'avi', 'mpg', 'asf', 'rm', 'rmvb'),
+        'file' => array('doc', 'docx', 'xls', 'xlsx', 'ppt', 'htm', 'html', 'txt', 'zip', 'rar', 'gz', 'bz2'),
+    );
+    //最大文件大小 2MB
+    $maxSize = 2*1024*1024;
+    if (!in_array($fileExt, $extArr[$fileType])) {
+        $json->setCode(\JsonResult::CODE_FAIL);
+        $json->setMessage("非法的文件后缀名.");
+        $json->output();
+    }
+    if (filesize($filePath) > $maxSize) {
+        $json->setCode(\JsonResult::CODE_FAIL);
+        $json->setMessage("文件大小超出限制 2MB.");
+        $json->output();
+    }
+
+    // 上传到七牛后保存的文件名
+    $key = $fileType . "-" . time() . mt_rand(1000, 9999) . ".{$fileExt}";
+
+    // 初始化 UploadManager 对象并进行文件的上传。
+    $uploadMgr = new UploadManager();
+
+    // 调用 UploadManager 的 putFile 方法进行文件的上传。
+    list($ret, $err) = $uploadMgr->putFile($token, $key, $filePath);
+    if ($err !== null) {
+        $json->setCode(\JsonResult::CODE_FAIL);
+        $json->setMessage("上传失败.");
+    } else {
+        $json->setCode(\JsonResult::CODE_SUCCESS);
+        $json->setMessage("上传成功.".$_POST['name']);
+        $json->setData(array('url' => QINIU_BUCKET_DOMAIN . $ret['key']));
+    }
+    $json->output();
+}
+

+ 7 - 0
public/kindeditor/php/qiniu/vendor/autoload.php

@@ -0,0 +1,7 @@
+<?php
+
+// autoload.php @generated by Composer
+
+require_once __DIR__ . '/composer' . '/autoload_real.php';
+
+return ComposerAutoloaderInitd54131a8e41e2a2e6c26ad98ddf3c990::getLoader();

+ 413 - 0
public/kindeditor/php/qiniu/vendor/composer/ClassLoader.php

@@ -0,0 +1,413 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Autoload;
+
+/**
+ * ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
+ *
+ *     $loader = new \Composer\Autoload\ClassLoader();
+ *
+ *     // register classes with namespaces
+ *     $loader->add('Symfony\Component', __DIR__.'/component');
+ *     $loader->add('Symfony',           __DIR__.'/framework');
+ *
+ *     // activate the autoloader
+ *     $loader->register();
+ *
+ *     // to enable searching the include path (eg. for PEAR packages)
+ *     $loader->setUseIncludePath(true);
+ *
+ * In this example, if you try to use a class in the Symfony\Component
+ * namespace or one of its children (Symfony\Component\Console for instance),
+ * the autoloader will first look for the class under the component/
+ * directory, and it will then fallback to the framework/ directory if not
+ * found before giving up.
+ *
+ * This class is loosely based on the Symfony UniversalClassLoader.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ * @see    http://www.php-fig.org/psr/psr-0/
+ * @see    http://www.php-fig.org/psr/psr-4/
+ */
+class ClassLoader
+{
+    // PSR-4
+    private $prefixLengthsPsr4 = array();
+    private $prefixDirsPsr4 = array();
+    private $fallbackDirsPsr4 = array();
+
+    // PSR-0
+    private $prefixesPsr0 = array();
+    private $fallbackDirsPsr0 = array();
+
+    private $useIncludePath = false;
+    private $classMap = array();
+
+    private $classMapAuthoritative = false;
+
+    public function getPrefixes()
+    {
+        if (!empty($this->prefixesPsr0)) {
+            return call_user_func_array('array_merge', $this->prefixesPsr0);
+        }
+
+        return array();
+    }
+
+    public function getPrefixesPsr4()
+    {
+        return $this->prefixDirsPsr4;
+    }
+
+    public function getFallbackDirs()
+    {
+        return $this->fallbackDirsPsr0;
+    }
+
+    public function getFallbackDirsPsr4()
+    {
+        return $this->fallbackDirsPsr4;
+    }
+
+    public function getClassMap()
+    {
+        return $this->classMap;
+    }
+
+    /**
+     * @param array $classMap Class to filename map
+     */
+    public function addClassMap(array $classMap)
+    {
+        if ($this->classMap) {
+            $this->classMap = array_merge($this->classMap, $classMap);
+        } else {
+            $this->classMap = $classMap;
+        }
+    }
+
+    /**
+     * Registers a set of PSR-0 directories for a given prefix, either
+     * appending or prepending to the ones previously set for this prefix.
+     *
+     * @param string       $prefix  The prefix
+     * @param array|string $paths   The PSR-0 root directories
+     * @param bool         $prepend Whether to prepend the directories
+     */
+    public function add($prefix, $paths, $prepend = false)
+    {
+        if (!$prefix) {
+            if ($prepend) {
+                $this->fallbackDirsPsr0 = array_merge(
+                    (array) $paths,
+                    $this->fallbackDirsPsr0
+                );
+            } else {
+                $this->fallbackDirsPsr0 = array_merge(
+                    $this->fallbackDirsPsr0,
+                    (array) $paths
+                );
+            }
+
+            return;
+        }
+
+        $first = $prefix[0];
+        if (!isset($this->prefixesPsr0[$first][$prefix])) {
+            $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+
+            return;
+        }
+        if ($prepend) {
+            $this->prefixesPsr0[$first][$prefix] = array_merge(
+                (array) $paths,
+                $this->prefixesPsr0[$first][$prefix]
+            );
+        } else {
+            $this->prefixesPsr0[$first][$prefix] = array_merge(
+                $this->prefixesPsr0[$first][$prefix],
+                (array) $paths
+            );
+        }
+    }
+
+    /**
+     * Registers a set of PSR-4 directories for a given namespace, either
+     * appending or prepending to the ones previously set for this namespace.
+     *
+     * @param string       $prefix  The prefix/namespace, with trailing '\\'
+     * @param array|string $paths   The PSR-4 base directories
+     * @param bool         $prepend Whether to prepend the directories
+     *
+     * @throws \InvalidArgumentException
+     */
+    public function addPsr4($prefix, $paths, $prepend = false)
+    {
+        if (!$prefix) {
+            // Register directories for the root namespace.
+            if ($prepend) {
+                $this->fallbackDirsPsr4 = array_merge(
+                    (array) $paths,
+                    $this->fallbackDirsPsr4
+                );
+            } else {
+                $this->fallbackDirsPsr4 = array_merge(
+                    $this->fallbackDirsPsr4,
+                    (array) $paths
+                );
+            }
+        } elseif (!isset($this->prefixDirsPsr4[$prefix])) {
+            // Register directories for a new namespace.
+            $length = strlen($prefix);
+            if ('\\' !== $prefix[$length - 1]) {
+                throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
+            }
+            $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
+            $this->prefixDirsPsr4[$prefix] = (array) $paths;
+        } elseif ($prepend) {
+            // Prepend directories for an already registered namespace.
+            $this->prefixDirsPsr4[$prefix] = array_merge(
+                (array) $paths,
+                $this->prefixDirsPsr4[$prefix]
+            );
+        } else {
+            // Append directories for an already registered namespace.
+            $this->prefixDirsPsr4[$prefix] = array_merge(
+                $this->prefixDirsPsr4[$prefix],
+                (array) $paths
+            );
+        }
+    }
+
+    /**
+     * Registers a set of PSR-0 directories for a given prefix,
+     * replacing any others previously set for this prefix.
+     *
+     * @param string       $prefix The prefix
+     * @param array|string $paths  The PSR-0 base directories
+     */
+    public function set($prefix, $paths)
+    {
+        if (!$prefix) {
+            $this->fallbackDirsPsr0 = (array) $paths;
+        } else {
+            $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
+        }
+    }
+
+    /**
+     * Registers a set of PSR-4 directories for a given namespace,
+     * replacing any others previously set for this namespace.
+     *
+     * @param string       $prefix The prefix/namespace, with trailing '\\'
+     * @param array|string $paths  The PSR-4 base directories
+     *
+     * @throws \InvalidArgumentException
+     */
+    public function setPsr4($prefix, $paths)
+    {
+        if (!$prefix) {
+            $this->fallbackDirsPsr4 = (array) $paths;
+        } else {
+            $length = strlen($prefix);
+            if ('\\' !== $prefix[$length - 1]) {
+                throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
+            }
+            $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
+            $this->prefixDirsPsr4[$prefix] = (array) $paths;
+        }
+    }
+
+    /**
+     * Turns on searching the include path for class files.
+     *
+     * @param bool $useIncludePath
+     */
+    public function setUseIncludePath($useIncludePath)
+    {
+        $this->useIncludePath = $useIncludePath;
+    }
+
+    /**
+     * Can be used to check if the autoloader uses the include path to check
+     * for classes.
+     *
+     * @return bool
+     */
+    public function getUseIncludePath()
+    {
+        return $this->useIncludePath;
+    }
+
+    /**
+     * Turns off searching the prefix and fallback directories for classes
+     * that have not been registered with the class map.
+     *
+     * @param bool $classMapAuthoritative
+     */
+    public function setClassMapAuthoritative($classMapAuthoritative)
+    {
+        $this->classMapAuthoritative = $classMapAuthoritative;
+    }
+
+    /**
+     * Should class lookup fail if not found in the current class map?
+     *
+     * @return bool
+     */
+    public function isClassMapAuthoritative()
+    {
+        return $this->classMapAuthoritative;
+    }
+
+    /**
+     * Registers this instance as an autoloader.
+     *
+     * @param bool $prepend Whether to prepend the autoloader or not
+     */
+    public function register($prepend = false)
+    {
+        spl_autoload_register(array($this, 'loadClass'), true, $prepend);
+    }
+
+    /**
+     * Unregisters this instance as an autoloader.
+     */
+    public function unregister()
+    {
+        spl_autoload_unregister(array($this, 'loadClass'));
+    }
+
+    /**
+     * Loads the given class or interface.
+     *
+     * @param  string    $class The name of the class
+     * @return bool|null True if loaded, null otherwise
+     */
+    public function loadClass($class)
+    {
+        if ($file = $this->findFile($class)) {
+            includeFile($file);
+
+            return true;
+        }
+    }
+
+    /**
+     * Finds the path to the file where the class is defined.
+     *
+     * @param string $class The name of the class
+     *
+     * @return string|false The path if found, false otherwise
+     */
+    public function findFile($class)
+    {
+        // work around for PHP 5.3.0 - 5.3.2 https://bugs.php.net/50731
+        if ('\\' == $class[0]) {
+            $class = substr($class, 1);
+        }
+
+        // class map lookup
+        if (isset($this->classMap[$class])) {
+            return $this->classMap[$class];
+        }
+        if ($this->classMapAuthoritative) {
+            return false;
+        }
+
+        $file = $this->findFileWithExtension($class, '.php');
+
+        // Search for Hack files if we are running on HHVM
+        if ($file === null && defined('HHVM_VERSION')) {
+            $file = $this->findFileWithExtension($class, '.hh');
+        }
+
+        if ($file === null) {
+            // Remember that this class does not exist.
+            return $this->classMap[$class] = false;
+        }
+
+        return $file;
+    }
+
+    private function findFileWithExtension($class, $ext)
+    {
+        // PSR-4 lookup
+        $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
+
+        $first = $class[0];
+        if (isset($this->prefixLengthsPsr4[$first])) {
+            foreach ($this->prefixLengthsPsr4[$first] as $prefix => $length) {
+                if (0 === strpos($class, $prefix)) {
+                    foreach ($this->prefixDirsPsr4[$prefix] as $dir) {
+                        if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) {
+                            return $file;
+                        }
+                    }
+                }
+            }
+        }
+
+        // PSR-4 fallback dirs
+        foreach ($this->fallbackDirsPsr4 as $dir) {
+            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
+                return $file;
+            }
+        }
+
+        // PSR-0 lookup
+        if (false !== $pos = strrpos($class, '\\')) {
+            // namespaced class name
+            $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
+                . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
+        } else {
+            // PEAR-like class name
+            $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
+        }
+
+        if (isset($this->prefixesPsr0[$first])) {
+            foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
+                if (0 === strpos($class, $prefix)) {
+                    foreach ($dirs as $dir) {
+                        if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
+                            return $file;
+                        }
+                    }
+                }
+            }
+        }
+
+        // PSR-0 fallback dirs
+        foreach ($this->fallbackDirsPsr0 as $dir) {
+            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
+                return $file;
+            }
+        }
+
+        // PSR-0 include paths.
+        if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
+            return $file;
+        }
+    }
+}
+
+/**
+ * Scope isolated include.
+ *
+ * Prevents access to $this/self from included files.
+ */
+function includeFile($file)
+{
+    include $file;
+}

+ 21 - 0
public/kindeditor/php/qiniu/vendor/composer/LICENSE

@@ -0,0 +1,21 @@
+
+Copyright (c) 2016 Nils Adermann, Jordi Boggiano
+
+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.
+

+ 9 - 0
public/kindeditor/php/qiniu/vendor/composer/autoload_classmap.php

@@ -0,0 +1,9 @@
+<?php
+
+// autoload_classmap.php @generated by Composer
+
+$vendorDir = dirname(dirname(__FILE__));
+$baseDir = dirname($vendorDir);
+
+return array(
+);

+ 10 - 0
public/kindeditor/php/qiniu/vendor/composer/autoload_files.php

@@ -0,0 +1,10 @@
+<?php
+
+// autoload_files.php @generated by Composer
+
+$vendorDir = dirname(dirname(__FILE__));
+$baseDir = dirname($vendorDir);
+
+return array(
+    '841780ea2e1d6545ea3a253239d59c05' => $vendorDir . '/qiniu/php-sdk/src/Qiniu/functions.php',
+);

+ 9 - 0
public/kindeditor/php/qiniu/vendor/composer/autoload_namespaces.php

@@ -0,0 +1,9 @@
+<?php
+
+// autoload_namespaces.php @generated by Composer
+
+$vendorDir = dirname(dirname(__FILE__));
+$baseDir = dirname($vendorDir);
+
+return array(
+);

+ 10 - 0
public/kindeditor/php/qiniu/vendor/composer/autoload_psr4.php

@@ -0,0 +1,10 @@
+<?php
+
+// autoload_psr4.php @generated by Composer
+
+$vendorDir = dirname(dirname(__FILE__));
+$baseDir = dirname($vendorDir);
+
+return array(
+    'Qiniu\\' => array($vendorDir . '/qiniu/php-sdk/src/Qiniu'),
+);

+ 70 - 0
public/kindeditor/php/qiniu/vendor/composer/autoload_real.php

@@ -0,0 +1,70 @@
+<?php
+
+// autoload_real.php @generated by Composer
+
+class ComposerAutoloaderInitd54131a8e41e2a2e6c26ad98ddf3c990
+{
+    private static $loader;
+
+    public static function loadClassLoader($class)
+    {
+        if ('Composer\Autoload\ClassLoader' === $class) {
+            require __DIR__ . '/ClassLoader.php';
+        }
+    }
+
+    public static function getLoader()
+    {
+        if (null !== self::$loader) {
+            return self::$loader;
+        }
+
+        spl_autoload_register(array('ComposerAutoloaderInitd54131a8e41e2a2e6c26ad98ddf3c990', 'loadClassLoader'), true, true);
+        self::$loader = $loader = new \Composer\Autoload\ClassLoader();
+        spl_autoload_unregister(array('ComposerAutoloaderInitd54131a8e41e2a2e6c26ad98ddf3c990', 'loadClassLoader'));
+
+        $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION');
+        if ($useStaticLoader) {
+            require_once __DIR__ . '/autoload_static.php';
+
+            call_user_func(\Composer\Autoload\ComposerStaticInitd54131a8e41e2a2e6c26ad98ddf3c990::getInitializer($loader));
+        } else {
+            $map = require __DIR__ . '/autoload_namespaces.php';
+            foreach ($map as $namespace => $path) {
+                $loader->set($namespace, $path);
+            }
+
+            $map = require __DIR__ . '/autoload_psr4.php';
+            foreach ($map as $namespace => $path) {
+                $loader->setPsr4($namespace, $path);
+            }
+
+            $classMap = require __DIR__ . '/autoload_classmap.php';
+            if ($classMap) {
+                $loader->addClassMap($classMap);
+            }
+        }
+
+        $loader->register(true);
+
+        if ($useStaticLoader) {
+            $includeFiles = Composer\Autoload\ComposerStaticInitd54131a8e41e2a2e6c26ad98ddf3c990::$files;
+        } else {
+            $includeFiles = require __DIR__ . '/autoload_files.php';
+        }
+        foreach ($includeFiles as $fileIdentifier => $file) {
+            composerRequired54131a8e41e2a2e6c26ad98ddf3c990($fileIdentifier, $file);
+        }
+
+        return $loader;
+    }
+}
+
+function composerRequired54131a8e41e2a2e6c26ad98ddf3c990($fileIdentifier, $file)
+{
+    if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
+        require $file;
+
+        $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
+    }
+}

+ 35 - 0
public/kindeditor/php/qiniu/vendor/composer/autoload_static.php

@@ -0,0 +1,35 @@
+<?php
+
+// autoload_static.php @generated by Composer
+
+namespace Composer\Autoload;
+
+class ComposerStaticInitd54131a8e41e2a2e6c26ad98ddf3c990
+{
+    public static $files = array (
+        '841780ea2e1d6545ea3a253239d59c05' => __DIR__ . '/..' . '/qiniu/php-sdk/src/Qiniu/functions.php',
+    );
+
+    public static $prefixLengthsPsr4 = array (
+        'Q' => 
+        array (
+            'Qiniu\\' => 6,
+        ),
+    );
+
+    public static $prefixDirsPsr4 = array (
+        'Qiniu\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/qiniu/php-sdk/src/Qiniu',
+        ),
+    );
+
+    public static function getInitializer(ClassLoader $loader)
+    {
+        return \Closure::bind(function () use ($loader) {
+            $loader->prefixLengthsPsr4 = ComposerStaticInitd54131a8e41e2a2e6c26ad98ddf3c990::$prefixLengthsPsr4;
+            $loader->prefixDirsPsr4 = ComposerStaticInitd54131a8e41e2a2e6c26ad98ddf3c990::$prefixDirsPsr4;
+
+        }, null, ClassLoader::class);
+    }
+}

+ 55 - 0
public/kindeditor/php/qiniu/vendor/composer/installed.json

@@ -0,0 +1,55 @@
+[
+    {
+        "name": "qiniu/php-sdk",
+        "version": "v7.2.1",
+        "version_normalized": "7.2.1.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/qiniu/php-sdk.git",
+            "reference": "8c7ba738bd4443ee3569a07441913b07c4b2c4a2"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/qiniu/php-sdk/zipball/8c7ba738bd4443ee3569a07441913b07c4b2c4a2",
+            "reference": "8c7ba738bd4443ee3569a07441913b07c4b2c4a2",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.3"
+        },
+        "require-dev": {
+            "phpunit/phpunit": "~4.0",
+            "squizlabs/php_codesniffer": "~2.3"
+        },
+        "time": "2017-08-26 00:46:11",
+        "type": "library",
+        "installation-source": "source",
+        "autoload": {
+            "psr-4": {
+                "Qiniu\\": "src/Qiniu"
+            },
+            "files": [
+                "src/Qiniu/functions.php"
+            ]
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "Qiniu",
+                "email": "sdk@qiniu.com",
+                "homepage": "http://www.qiniu.com"
+            }
+        ],
+        "description": "Qiniu Resource (Cloud) Storage SDK for PHP",
+        "homepage": "http://developer.qiniu.com/",
+        "keywords": [
+            "cloud",
+            "qiniu",
+            "sdk",
+            "storage"
+        ]
+    }
+]

+ 46 - 0
public/kindeditor/plugins/anchor/anchor.js

@@ -0,0 +1,46 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('anchor', function(K) {
+	var self = this, name = 'anchor', lang = self.lang(name + '.');
+	self.plugin.anchor = {
+		edit : function() {
+			var html = ['<div class="ke-dialog-content-inner">',
+					'<div class="ke-dialog-row ke-clearfix">',
+					'<label for="keName">' + lang.name + ':</label>',
+					'<input class="ke-input-text" type="text" id="keName" name="name" value="" style="width:100px;" />',
+					'</div>',
+					'</div>'].join('');
+			var dialog = self.createDialog({
+				name : name,
+				width : 300,
+				title : self.lang(name),
+				body : html,
+				yesBtn : {
+					name : self.lang('yes'),
+					click : function(e) {
+						self.insertHtml('<a name="' + nameBox.val() + '">').hideDialog().focus();
+					}
+				}
+			});
+			var div = dialog.div,
+				nameBox = K('input[name="name"]', div);
+			var img = self.plugin.getSelectedAnchor();
+			if (img) {
+				nameBox.val(unescape(img.attr('data-ke-name')));
+			}
+			nameBox[0].focus();
+			nameBox[0].select();
+		},
+		'delete' : function() {
+			self.plugin.getSelectedAnchor().remove();
+		}
+	};
+	self.clickToolbar(name, self.plugin.anchor.edit);
+});

+ 59 - 0
public/kindeditor/plugins/autoheight/autoheight.js

@@ -0,0 +1,59 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('autoheight', function(K) {
+	var self = this;
+
+	if (!self.autoHeightMode) {
+		return;
+	}
+
+	var minHeight;
+
+	function hideScroll() {
+		var edit = self.edit;
+		var body = edit.doc.body;
+		edit.iframe[0].scroll = 'no';
+		body.style.overflowY = 'hidden';
+	}
+
+	function resetHeight() {
+		if(self.fullscreenMode){
+			return;
+		}
+		var edit = self.edit;
+		var body = edit.doc.body;
+		edit.iframe.height(minHeight);
+		self.resize(null, Math.max((K.IE ? body.scrollHeight : body.offsetHeight) + 76, minHeight));
+	}
+
+	function init() {
+		minHeight = K.removeUnit(self.height);
+
+		self.edit.afterChange(resetHeight);
+		if(!self.fullscreenMode){
+			hideScroll();
+		}
+		resetHeight();
+	}
+
+	if (self.isCreated) {
+		init();
+	} else {
+		self.afterCreate(init);
+	}
+});
+
+/*
+* 如何实现真正的自动高度?
+* 修改编辑器高度之后,再次获取body内容高度时,最小值只会是当前iframe的设置高度,这样就导致高度只增不减。
+* 所以每次获取body内容高度之前,先将iframe的高度重置为最小高度,这样就能获取body的实际高度。
+* 由此就实现了真正的自动高度
+* 测试:chrome、firefox、IE9、IE8
+* */

+ 91 - 0
public/kindeditor/plugins/baidumap/baidumap.js

@@ -0,0 +1,91 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+// Baidu Maps: http://dev.baidu.com/wiki/map/index.php?title=%E9%A6%96%E9%A1%B5
+
+KindEditor.plugin('baidumap', function(K) {
+	var self = this, name = 'baidumap', lang = self.lang(name + '.');
+	var mapWidth = K.undef(self.mapWidth, Math.min(document.body.clientWidth - 42, 558));
+	var mapHeight = K.undef(self.mapHeight, 360);
+	self.clickToolbar(name, function() {
+		var html = ['<div class="ke-dialog-content-inner" style="padding-top: 0">',
+			'<div class="ke-dialog-row ke-clearfix">',
+			// right start
+			'<div class="ke-header">' + lang.address,
+			'<input id="kindeditor_plugin_map_address" name="address" class="ke-input-text" value="" style="width:200px;" /> ',
+			'<span>',
+			'<input type="button" name="searchBtn" class="ke-button-common ke-button" value="' + lang.search + '" style="line-height:22px;padding:0 10px;" />',
+			'</span>',
+			'<input type="checkbox" id="keInsertDynamicMap" name="insertDynamicMap" class="checkbox" value="1" style="display:inline-block;" /> <label for="keInsertDynamicMap">' + lang.insertDynamicMap + '</label>',
+			'</div>',
+			'</div>',
+
+			//map iframe
+			'<div class="ke-map" style="width:' + mapWidth + 'px;height:' + mapHeight + 'px;"></div>',
+			'</div>'].join('');
+		var dialog = self.createDialog({
+			name : name,
+			width : mapWidth + 42,
+			title : self.lang(name),
+			body : html,
+			yesBtn : {
+				name : self.lang('yes'),
+				click : function(e) {
+					var map = win.map;
+					var centerObj = map.getCenter();
+					var center = centerObj.lng + ',' + centerObj.lat;
+					var zoom = map.getZoom();
+					var url = [checkbox[0].checked ? self.pluginsPath + 'baidumap/index.html' : 'https://api.map.baidu.com/staticimage',
+						'?center=' + encodeURIComponent(center),
+						'&zoom=' + encodeURIComponent(zoom),
+						'&width=' + mapWidth,
+						'&height=' + mapHeight,
+						'&markers=' + encodeURIComponent(center),
+						'&markerStyles=' + encodeURIComponent('l,A')].join('');
+					if (checkbox[0].checked) {
+						self.insertHtml('<iframe src="' + url + '" frameborder="0" style="width:' + (mapWidth + 2) + 'px;height:' + (mapHeight + 2) + 'px;"></iframe>');
+					} else {
+						self.exec('insertimage', url);
+					}
+					self.hideDialog().focus();
+				}
+			},
+			beforeRemove : function() {
+				searchBtn.remove();
+				if (doc) {
+					doc.write('');
+				}
+				iframe.remove();
+			}
+		});
+		var div = dialog.div,
+			addressBox = K('[name="address"]', div),
+			searchBtn = K('[name="searchBtn"]', div),
+			checkbox = K('[name="insertDynamicMap"]', dialog.div),
+			win, doc;
+		var iframe = K('<iframe class="ke-textarea" frameborder="0" src="' + self.pluginsPath + 'baidumap/map.html" style="width:' + mapWidth + 'px;height:' + mapHeight + 'px;"></iframe>');
+		function ready() {
+			win = iframe[0].contentWindow;
+			doc = K.iframeDoc(iframe);
+		}
+		iframe.bind('load', function() {
+			iframe.unbind('load');
+			if (K.IE) {
+				ready();
+			} else {
+				setTimeout(ready, 0);
+			}
+		});
+		K('.ke-map', div).replaceWith(iframe);
+		// search map
+		searchBtn.click(function() {
+			win.search(addressBox.val());
+		});
+	});
+});

+ 103 - 0
public/kindeditor/plugins/baidumap/index.html

@@ -0,0 +1,103 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+    <meta charset="utf-8"/>
+    <meta name="keywords" content="百度地图,百度地图API,百度地图自定义工具,百度地图所见即所得工具"/>
+    <meta name="description" content="百度地图API自定义地图,帮助用户在可视化操作下生成百度地图"/>
+    <title>百度地图API自定义地图</title>
+    <!--引用百度地图API-->
+    <style type="text/css">
+        html, body {
+            margin: 0;
+            padding: 0;
+        }
+
+        .iw_poi_title {
+            color: #CC5522;
+            font-size: 14px;
+            font-weight: bold;
+            overflow: hidden;
+            padding-right: 13px;
+            white-space: nowrap
+        }
+
+        .iw_poi_content {
+            font: 12px arial, sans-serif;
+            overflow: visible;
+            padding-top: 4px;
+            white-space: -moz-pre-wrap;
+            word-wrap: break-word
+        }
+    </style>
+    <!--<script type="text/javascript" src="//api.map.baidu.com/api?ak=i6FqAeOc2zIGHRwjKv35jBrAOjilpvG4&v=2.0&s=1&services=true"></script>-->
+    <script type="text/javascript" src="//api.map.baidu.com/api?key=&v=1.1&s=1&services=true"></script>
+</head>
+
+<body onload="initMap();">
+<!--百度地图容器-->
+<div style="width:697px;height:550px;border:#ccc solid 1px;" id="dituContent"></div>
+</body>
+<script type="text/javascript">
+    function getParam(name) {
+        return location.href.match(new RegExp('[?&]' + name + '=([^?&]+)', 'i')) ? decodeURIComponent(RegExp.$1) : '';
+    }
+
+    var centerParam = getParam('center');
+    var zoomParam = getParam('zoom');
+    var widthParam = getParam('width');
+    var heightParam = getParam('height');
+    var markersParam = getParam('markers');
+    var markerStylesParam = getParam('markerStyles');
+
+    //创建和初始化地图函数:
+    function initMap() {
+        // [FF]切换模式后报错
+        if (!window.BMap) {
+            return;
+        }
+        var dituContent = document.getElementById('dituContent');
+        dituContent.style.width = widthParam + 'px';
+        dituContent.style.height = heightParam + 'px';
+
+        createMap();//创建地图
+        setMapEvent();//设置地图事件
+        addMapControl();//向地图添加控件
+
+        // 创建标注
+        var markersArr = markersParam.split(',');
+        var point = new BMap.Point(markersArr[0], markersArr[1]);
+        var marker = new BMap.Marker(point);
+        map.addOverlay(marker); // 将标注添加到地图中
+    }
+
+    //创建地图函数:
+    function createMap() {
+        var map = new BMap.Map("dituContent");//在百度地图容器中创建一个地图
+        var centerArr = centerParam.split(',');
+        var point = new BMap.Point(centerArr[0], centerArr[1]);//定义一个中心点坐标
+        map.centerAndZoom(point, zoomParam);//设定地图的中心点和坐标并将地图显示在地图容器中
+        window.map = map;//将map变量存储在全局
+    }
+
+    //地图事件设置函数:
+    function setMapEvent() {
+        map.enableDragging();//启用地图拖拽事件,默认启用(可不写)
+        map.enableScrollWheelZoom();//启用地图滚轮放大缩小
+        map.enableDoubleClickZoom();//启用鼠标双击放大,默认启用(可不写)
+        map.enableKeyboard();//启用键盘上下左右键移动地图
+    }
+
+    //地图控件添加函数:
+    function addMapControl() {
+        //向地图中添加缩放控件
+        var ctrl_nav = new BMap.NavigationControl({anchor: BMAP_ANCHOR_TOP_LEFT, type: BMAP_NAVIGATION_CONTROL_LARGE});
+        map.addControl(ctrl_nav);
+        //向地图中添加缩略图控件
+        var ctrl_ove = new BMap.OverviewMapControl({anchor: BMAP_ANCHOR_BOTTOM_RIGHT, isOpen: 1});
+        map.addControl(ctrl_ove);
+        //向地图中添加比例尺控件
+        var ctrl_sca = new BMap.ScaleControl({anchor: BMAP_ANCHOR_BOTTOM_LEFT});
+        map.addControl(ctrl_sca);
+    }
+</script>
+</html>

+ 53 - 0
public/kindeditor/plugins/baidumap/map.html

@@ -0,0 +1,53 @@
+<!doctype html>
+<html>
+<head>
+    <meta charset="utf-8"/>
+    <title>Baidu Maps</title>
+    <style>
+        html {
+            height: 100%
+        }
+
+        body {
+            height: 100%;
+            margin: 0;
+            padding: 0;
+            background-color: #FFF
+        }
+    </style>
+    <script charset="utf-8" src="//api.map.baidu.com/api?v=1.3"></script>
+    <script>
+        var map, geocoder;
+
+        function initialize() {
+            map = new BMap.Map('map_canvas');
+            var point = new BMap.Point(114.025974, 22.546054);
+            map.centerAndZoom(point, 11);
+            map.addControl(new BMap.NavigationControl());
+            map.enableScrollWheelZoom();
+
+            var gc = new BMap.Geocoder();
+            gc.getLocation(point, function (rs) {
+                var addComp = rs.addressComponents;
+                var address = [addComp.city].join('');
+                parent.document.getElementById("kindeditor_plugin_map_address").value = address;
+            });
+        }
+
+        function search(address) {
+            if (!map) return;
+            var local = new BMap.LocalSearch(map, {
+                renderOptions: {
+                    map: map,
+                    autoViewport: true,
+                    selectFirstResult: false
+                }
+            });
+            local.search(address);
+        }
+    </script>
+</head>
+<body onload="initialize();">
+<div id="map_canvas" style="width:100%; height:100%"></div>
+</body>
+</html>

+ 29 - 0
public/kindeditor/plugins/clearhtml/clearhtml.js

@@ -0,0 +1,29 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('clearhtml', function(K) {
+	var self = this, name = 'clearhtml';
+	self.clickToolbar(name, function() {
+		self.focus();
+		var html = self.html();
+		html = html.replace(/(<script[^>]*>)([\s\S]*?)(<\/script>)/ig, '');
+		html = html.replace(/(<style[^>]*>)([\s\S]*?)(<\/style>)/ig, '');
+		html = K.formatHtml(html, {
+			a : ['href', 'target'],
+			embed : ['src', 'width', 'height', 'type', 'loop', 'autostart', 'quality', '.width', '.height', 'align', 'allowscriptaccess'],
+			img : ['src', 'width', 'height', 'border', 'alt', 'title', '.width', '.height'],
+			table : ['border'],
+			'td,th' : ['rowspan', 'colspan'],
+			'div,hr,br,tbody,tr,p,ol,ul,li,blockquote,h1,h2,h3,h4,h5,h6' : []
+		});
+		self.html(html);
+		self.cmd.selection(true);
+		self.addBookmark();
+	});
+});

+ 64 - 0
public/kindeditor/plugins/code/code.js

@@ -0,0 +1,64 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+// google code prettify: http://google-code-prettify.googlecode.com/
+// http://google-code-prettify.googlecode.com/
+
+KindEditor.plugin('code', function(K) {
+	var self = this, name = 'code';
+	self.clickToolbar(name, function() {
+		var lang = self.lang(name + '.'),
+			html = ['<div style="margin: 0px 20px;">',
+				'<div class="ke-dialog-row">',
+				'<select class="ke-select" style="margin-bottom: 5px;">',
+				'<option value="javascript">JavaScript</option>',
+				'<option value="html">HTML</option>',
+				'<option value="css">CSS</option>',
+				'<option value="php">PHP</option>',
+				'<option value="perl">Perl</option>',
+				'<option value="python">Python</option>',
+				'<option value="ruby">Ruby</option>',
+				'<option value="java">Java</option>',
+				'<option value="go">Go</option>',
+				'<option value="asp">ASP/VB</option>',
+				'<option value="csharp">C#</option>',
+				'<option value="cpp">C/C++</option>',
+				'<option value="cs">C#</option>',
+				'<option value="bash">Shell</option>',
+				'<option value="sql">SQL</option>',
+				'<option value="markup">Other</option>',
+				'</select>',
+				'</div>',
+				'<textarea class="ke-textarea" style="width:408px;height:260px;"></textarea>',
+				'</div>'].join(''),
+			dialog = self.createDialog({
+				name : name,
+				width : Math.min(document.body.clientWidth, 450),
+				title : self.lang(name),
+				body : html,
+				yesBtn : {
+					name : self.lang('yes'),
+					click : function(e) {
+						var type = K('.ke-select', dialog.div).val(),
+							code = textarea.val(),
+							cls = type === '' ? '' :  'language-' + type,
+							html = '<pre class="' + cls + '"><code>' + K.escape(code) + '</code></pre> <br/>';
+						if (K.trim(code) === '') {
+							K.options.errorMsgHandler(lang.pleaseInput, "error");
+							textarea[0].focus();
+							return;
+						}
+						self.insertHtml(html).hideDialog().focus();
+					}
+				}
+			}),
+			textarea = K('textarea', dialog.div);
+		textarea[0].focus();
+	});
+});

+ 18 - 0
public/kindeditor/plugins/code/pretty.js

@@ -0,0 +1,18 @@
+/**
+ * @author yangjian
+ * @since 18-9-11 下午9:02.
+ */
+
+// function _bindEvent(el, type, fn) {
+// 	if (el.addEventListener){
+// 		el.addEventListener(type, fn);
+// 	} else if (el.attachEvent){
+// 		el.attachEvent('on' + type, fn);
+// 	}
+// }
+// _bindEvent(document.body, "DOMNodeInserted", function(e) {
+// 	var className = e.target.className;
+// 	if (className && className.indexOf("language-") != -1) {
+// 		Prism.highlightElement(e.target);
+// 	}
+// })

+ 292 - 0
public/kindeditor/plugins/code/prism.css

@@ -0,0 +1,292 @@
+/* PrismJS 1.15.0
+https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript+c+csharp+bash+cpp+aspnet+ruby+markup-templating+go+markdown+php+python+sass+yaml&plugins=line-highlight+line-numbers+toolbar+highlight-keywords+show-language+copy-to-clipboard */
+/**
+ * prism.js default theme for JavaScript, CSS and HTML
+ * Based on dabblet (http://dabblet.com)
+ * @author Lea Verou
+ */
+
+code[class*="language-"],
+pre[class*="language-"] {
+	color: black;
+	background: none;
+	text-shadow: 0 1px white;
+	font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
+	text-align: left;
+	white-space: pre;
+	word-spacing: normal;
+	word-break: normal;
+	word-wrap: normal;
+	line-height: 1.5;
+
+	-moz-tab-size: 4;
+	-o-tab-size: 4;
+	tab-size: 4;
+
+	-webkit-hyphens: none;
+	-moz-hyphens: none;
+	-ms-hyphens: none;
+	hyphens: none;
+}
+
+pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection,
+code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection {
+	text-shadow: none;
+	background: #b3d4fc;
+}
+
+pre[class*="language-"]::selection, pre[class*="language-"] ::selection,
+code[class*="language-"]::selection, code[class*="language-"] ::selection {
+	text-shadow: none;
+	background: #b3d4fc;
+}
+
+@media print {
+	code[class*="language-"],
+	pre[class*="language-"] {
+		text-shadow: none;
+	}
+}
+
+/* Code blocks */
+pre[class*="language-"] {
+	padding: 1em;
+	margin: .5em 0;
+	overflow: auto;
+}
+
+:not(pre) > code[class*="language-"],
+pre[class*="language-"] {
+	background: #f5f2f0;
+}
+
+/* Inline code */
+:not(pre) > code[class*="language-"] {
+	padding: .1em;
+	border-radius: .3em;
+	white-space: normal;
+}
+
+.token.comment,
+.token.prolog,
+.token.doctype,
+.token.cdata {
+	color: slategray;
+}
+
+.token.punctuation {
+	color: #999;
+}
+
+.namespace {
+	opacity: .7;
+}
+
+.token.property,
+.token.tag,
+.token.boolean,
+.token.number,
+.token.constant,
+.token.symbol,
+.token.deleted {
+	color: #905;
+}
+
+.token.selector,
+.token.attr-name,
+.token.string,
+.token.char,
+.token.builtin,
+.token.inserted {
+	color: #690;
+}
+
+.token.operator,
+.token.entity,
+.token.url,
+.language-css .token.string,
+.style .token.string {
+	color: #9a6e3a;
+	background: hsla(0, 0%, 100%, .5);
+}
+
+.token.atrule,
+.token.attr-value,
+.token.keyword {
+	color: #07a;
+}
+
+.token.function,
+.token.class-name {
+	color: #DD4A68;
+}
+
+.token.regex,
+.token.important,
+.token.variable {
+	color: #e90;
+}
+
+.token.important,
+.token.bold {
+	font-weight: bold;
+}
+.token.italic {
+	font-style: italic;
+}
+
+.token.entity {
+	cursor: help;
+}
+
+pre[data-line] {
+	position: relative;
+	padding: 1em 0 1em 3em;
+}
+
+.line-highlight {
+	position: absolute;
+	left: 0;
+	right: 0;
+	padding: inherit 0;
+	margin-top: 1em; /* Same as .prism’s padding-top */
+
+	background: hsla(24, 20%, 50%,.08);
+	background: linear-gradient(to right, hsla(24, 20%, 50%,.1) 70%, hsla(24, 20%, 50%,0));
+
+	pointer-events: none;
+
+	line-height: inherit;
+	white-space: pre;
+}
+
+	.line-highlight:before,
+	.line-highlight[data-end]:after {
+		content: attr(data-start);
+		position: absolute;
+		top: .4em;
+		left: .6em;
+		min-width: 1em;
+		padding: 0 .5em;
+		background-color: hsla(24, 20%, 50%,.4);
+		color: hsl(24, 20%, 95%);
+		font: bold 65%/1.5 sans-serif;
+		text-align: center;
+		vertical-align: .3em;
+		border-radius: 999px;
+		text-shadow: none;
+		box-shadow: 0 1px white;
+	}
+
+	.line-highlight[data-end]:after {
+		content: attr(data-end);
+		top: auto;
+		bottom: .4em;
+	}
+
+.line-numbers .line-highlight:before,
+.line-numbers .line-highlight:after {
+	content: none;
+}
+
+pre[class*="language-"].line-numbers {
+	position: relative;
+	padding-left: 3.8em;
+	counter-reset: linenumber;
+}
+
+pre[class*="language-"].line-numbers > code {
+	position: relative;
+	white-space: inherit;
+}
+
+.line-numbers .line-numbers-rows {
+	position: absolute;
+	pointer-events: none;
+	top: 0;
+	font-size: 100%;
+	left: -3.8em;
+	width: 3em; /* works for line-numbers below 1000 lines */
+	letter-spacing: -1px;
+	border-right: 1px solid #999;
+
+	-webkit-user-select: none;
+	-moz-user-select: none;
+	-ms-user-select: none;
+	user-select: none;
+
+}
+
+	.line-numbers-rows > span {
+		pointer-events: none;
+		display: block;
+		counter-increment: linenumber;
+	}
+
+		.line-numbers-rows > span:before {
+			content: counter(linenumber);
+			color: #999;
+			display: block;
+			padding-right: 0.8em;
+			text-align: right;
+		}
+
+div.code-toolbar {
+	position: relative;
+}
+
+div.code-toolbar > .toolbar {
+	position: absolute;
+	top: .3em;
+	right: .2em;
+	transition: opacity 0.3s ease-in-out;
+	opacity: 0;
+}
+
+div.code-toolbar:hover > .toolbar {
+	opacity: 1;
+}
+
+div.code-toolbar > .toolbar .toolbar-item {
+	display: inline-block;
+}
+
+div.code-toolbar > .toolbar a {
+	cursor: pointer;
+}
+
+div.code-toolbar > .toolbar button {
+	background: none;
+	border: 0;
+	color: inherit;
+	font: inherit;
+	line-height: normal;
+	overflow: visible;
+	padding: 0;
+	-webkit-user-select: none; /* for button */
+	-moz-user-select: none;
+	-ms-user-select: none;
+}
+
+div.code-toolbar > .toolbar a,
+div.code-toolbar > .toolbar button,
+div.code-toolbar > .toolbar span {
+	color: #bbb;
+	font-size: .8em;
+	padding: 0 .5em;
+	background: #f5f2f0;
+	background: rgba(224, 224, 224, 0.2);
+	box-shadow: 0 2px 0 0 rgba(0,0,0,0.2);
+	border-radius: .5em;
+}
+
+div.code-toolbar > .toolbar a:hover,
+div.code-toolbar > .toolbar a:focus,
+div.code-toolbar > .toolbar button:hover,
+div.code-toolbar > .toolbar button:focus,
+div.code-toolbar > .toolbar span:hover,
+div.code-toolbar > .toolbar span:focus {
+	color: inherit;
+	text-decoration: none;
+}
+

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 26 - 0
public/kindeditor/plugins/code/prism.js


+ 129 - 0
public/kindeditor/plugins/emoticons/emoticons.js

@@ -0,0 +1,129 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('emoticons', function(K) {
+	var self = this, name = 'emoticons',
+		path = (self.emoticonsPath || self.pluginsPath + 'emoticons/images/'),
+		allowPreview = self.allowPreviewEmoticons === undefined ? true : self.allowPreviewEmoticons,
+		currentPageNum = 1;
+	self.clickToolbar(name, function() {
+		var rows = 5, cols = 9, total = 135, startNum = 0,
+			cells = rows * cols, pages = Math.ceil(total / cells),
+			colsHalf = Math.floor(cols / 2),
+			wrapperDiv = K('<div class="ke-plugin-emoticons"></div>'),
+			elements = [],
+			menu = self.createMenu({
+				name : name,
+				beforeRemove : function() {
+					removeEvent();
+				}
+			});
+		menu.div.append(wrapperDiv);
+		var previewDiv, previewImg;
+		if (allowPreview) {
+			previewDiv = K('<div class="ke-preview"></div>').css('right', 0);
+			previewImg = K('<img class="ke-preview-img" src="' + path + startNum + '.gif" />');
+			wrapperDiv.append(previewDiv);
+			previewDiv.append(previewImg);
+		}
+		function bindCellEvent(cell, j, num) {
+			if (previewDiv) {
+				cell.mouseover(function() {
+					if (j > colsHalf) {
+						previewDiv.css('left', 0);
+						previewDiv.css('right', '');
+					} else {
+						previewDiv.css('left', '');
+						previewDiv.css('right', 0);
+					}
+					previewImg.attr('src', path + num + '.gif');
+					K(this).addClass('ke-on');
+				});
+			} else {
+				cell.mouseover(function() {
+					K(this).addClass('ke-on');
+				});
+			}
+			cell.mouseout(function() {
+				K(this).removeClass('ke-on');
+			});
+			cell.click(function(e) {
+				self.insertHtml('<img src="' + path + num + '.gif" border="0" alt="" />').hideMenu().focus();
+				e.stop();
+			});
+		}
+		function createEmoticonsTable(pageNum, parentDiv) {
+			var table = document.createElement('table');
+			parentDiv.append(table);
+			if (previewDiv) {
+				K(table).mouseover(function() {
+					previewDiv.show('block');
+				});
+				K(table).mouseout(function() {
+					previewDiv.hide();
+				});
+				elements.push(K(table));
+			}
+			table.className = 'ke-table';
+			table.cellPadding = 0;
+			table.cellSpacing = 0;
+			table.border = 0;
+			var num = (pageNum - 1) * cells + startNum;
+			for (var i = 0; i < rows; i++) {
+				var row = table.insertRow(i);
+				for (var j = 0; j < cols; j++) {
+					var cell = K(row.insertCell(j));
+					cell.addClass('ke-cell');
+					bindCellEvent(cell, j, num);
+					var span = K('<span class="ke-img"></span>')
+						.css('background-position', '-' + (24 * num) + 'px 0px')
+						.css('background-image', 'url(' + path + 'static.gif)');
+					cell.append(span);
+					elements.push(cell);
+					num++;
+				}
+			}
+			return table;
+		}
+		var table = createEmoticonsTable(currentPageNum, wrapperDiv);
+		function removeEvent() {
+			K.each(elements, function() {
+				this.unbind();
+			});
+		}
+		var pageDiv;
+		function bindPageEvent(el, pageNum) {
+			el.click(function(e) {
+				removeEvent();
+				table.parentNode.removeChild(table);
+				pageDiv.remove();
+				table = createEmoticonsTable(pageNum, wrapperDiv);
+				createPageTable(pageNum);
+				currentPageNum = pageNum;
+				e.stop();
+			});
+		}
+		function createPageTable(currentPageNum) {
+			pageDiv = K('<div class="ke-page"></div>');
+			wrapperDiv.append(pageDiv);
+			for (var pageNum = 1; pageNum <= pages; pageNum++) {
+				if (currentPageNum !== pageNum) {
+					var a = K('<a href="javascript:;">[' + pageNum + ']</a>');
+					bindPageEvent(a, pageNum);
+					pageDiv.append(a);
+					elements.push(a);
+				} else {
+					pageDiv.append(K('@[' + pageNum + ']'));
+				}
+				pageDiv.append(K('@&nbsp;'));
+			}
+		}
+		createPageTable(currentPageNum);
+	});
+});

BIN
public/kindeditor/plugins/emoticons/images/0.gif


BIN
public/kindeditor/plugins/emoticons/images/1.gif


BIN
public/kindeditor/plugins/emoticons/images/10.gif


BIN
public/kindeditor/plugins/emoticons/images/100.gif


BIN
public/kindeditor/plugins/emoticons/images/101.gif


BIN
public/kindeditor/plugins/emoticons/images/102.gif


BIN
public/kindeditor/plugins/emoticons/images/103.gif


BIN
public/kindeditor/plugins/emoticons/images/104.gif


BIN
public/kindeditor/plugins/emoticons/images/105.gif


BIN
public/kindeditor/plugins/emoticons/images/106.gif


BIN
public/kindeditor/plugins/emoticons/images/107.gif


BIN
public/kindeditor/plugins/emoticons/images/108.gif


BIN
public/kindeditor/plugins/emoticons/images/109.gif


BIN
public/kindeditor/plugins/emoticons/images/11.gif


BIN
public/kindeditor/plugins/emoticons/images/110.gif


BIN
public/kindeditor/plugins/emoticons/images/111.gif


BIN
public/kindeditor/plugins/emoticons/images/112.gif


BIN
public/kindeditor/plugins/emoticons/images/113.gif


BIN
public/kindeditor/plugins/emoticons/images/114.gif


BIN
public/kindeditor/plugins/emoticons/images/115.gif


BIN
public/kindeditor/plugins/emoticons/images/116.gif


BIN
public/kindeditor/plugins/emoticons/images/117.gif


BIN
public/kindeditor/plugins/emoticons/images/118.gif


BIN
public/kindeditor/plugins/emoticons/images/119.gif


BIN
public/kindeditor/plugins/emoticons/images/12.gif


BIN
public/kindeditor/plugins/emoticons/images/120.gif


BIN
public/kindeditor/plugins/emoticons/images/121.gif


BIN
public/kindeditor/plugins/emoticons/images/122.gif


+ 0 - 0
public/kindeditor/plugins/emoticons/images/123.gif


Nem az összes módosított fájl került megjelenítésre, mert túl sok fájl változott