更换编辑器
@@ -426,4 +426,46 @@ function go_to_top(obj){
|
||||
}else{
|
||||
$("#"+obj).fadeOut("slow");
|
||||
}
|
||||
}
|
||||
|
||||
var load = {
|
||||
script: function(xyUrl, callback){
|
||||
var head = document.getElementsByTagName('head')[0];
|
||||
var script = document.createElement('script');
|
||||
script.type = 'text/javascript';
|
||||
script.src = xyUrl;
|
||||
//借鉴了jQuery的script跨域方法
|
||||
script.onload = script.onreadystatechange = function() {
|
||||
if ((!this.readyState || this.readyState === "loaded" || this.readyState === "complete")) {
|
||||
callback && callback();
|
||||
// Handle memory leak in IE
|
||||
script.onload = script.onreadystatechange = null;
|
||||
if (head && script.parentNode) {
|
||||
head.removeChild(script);
|
||||
}
|
||||
}
|
||||
};
|
||||
// Use insertBefore instead of appendChild to circumvent an IE6 bug.
|
||||
head.insertBefore(script, head.firstChild);
|
||||
},
|
||||
css: function(xyUrl, callback){
|
||||
var head = document.getElementsByTagName('head')[0];
|
||||
var link = document.createElement('link');
|
||||
link.type = 'text/css';
|
||||
link.rel = 'stylesheet';
|
||||
link.src = xyUrl;
|
||||
//借鉴了jQuery的script跨域方法
|
||||
link.onload = link.onreadystatechange = function() {
|
||||
if ((!this.readyState || this.readyState === "loaded" || this.readyState === "complete")) {
|
||||
callback && callback();
|
||||
// Handle memory leak in IE
|
||||
link.onload = link.onreadystatechange = null;
|
||||
if (head && link.parentNode) {
|
||||
head.removeChild(link);
|
||||
}
|
||||
}
|
||||
};
|
||||
// Use insertBefore instead of appendChild to circumvent an IE6 bug.
|
||||
head.insertBefore(link, head.firstChild);
|
||||
}
|
||||
}
|
||||
7
public/static/plugins/NKeditor/NKeditor-all-min.js
vendored
Normal file
9189
public/static/plugins/NKeditor/NKeditor-all.js
Normal file
267
public/static/plugins/NKeditor/lang/zh-CN.js
Normal file
@@ -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';
|
||||
260
public/static/plugins/NKeditor/php/JsonResult.php
Normal file
@@ -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
public/static/plugins/NKeditor/php/default/cache.tmp
Normal file
@@ -0,0 +1 @@
|
||||
1508678800
|
||||
116
public/static/plugins/NKeditor/php/default/db/SimpleDB.php
Normal file
@@ -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
public/static/plugins/NKeditor/php/default/db/test.php
Normal file
@@ -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);
|
||||
|
||||
@@ -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
public/static/plugins/NKeditor/php/default/import.php
Normal file
@@ -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
public/static/plugins/NKeditor/php/default/upload_json.php
Normal file
@@ -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
public/static/plugins/NKeditor/php/functions.php
Normal file
@@ -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
public/static/plugins/NKeditor/php/qiniu/cache.tmp
Normal file
@@ -0,0 +1 @@
|
||||
1508682572
|
||||
15
public/static/plugins/NKeditor/php/qiniu/composer.json
Normal file
@@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
61
public/static/plugins/NKeditor/php/qiniu/config.php
Normal file
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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
public/static/plugins/NKeditor/php/qiniu/upload_json.php
Normal file
@@ -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
public/static/plugins/NKeditor/php/qiniu/vendor/autoload.php
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
<?php
|
||||
|
||||
// autoload.php @generated by Composer
|
||||
|
||||
require_once __DIR__ . '/composer' . '/autoload_real.php';
|
||||
|
||||
return ComposerAutoloaderInitd54131a8e41e2a2e6c26ad98ddf3c990::getLoader();
|
||||
413
public/static/plugins/NKeditor/php/qiniu/vendor/composer/ClassLoader.php
vendored
Normal file
@@ -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
public/static/plugins/NKeditor/php/qiniu/vendor/composer/LICENSE
vendored
Normal file
@@ -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
public/static/plugins/NKeditor/php/qiniu/vendor/composer/autoload_classmap.php
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
<?php
|
||||
|
||||
// autoload_classmap.php @generated by Composer
|
||||
|
||||
$vendorDir = dirname(dirname(__FILE__));
|
||||
$baseDir = dirname($vendorDir);
|
||||
|
||||
return array(
|
||||
);
|
||||
10
public/static/plugins/NKeditor/php/qiniu/vendor/composer/autoload_files.php
vendored
Normal file
@@ -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
public/static/plugins/NKeditor/php/qiniu/vendor/composer/autoload_namespaces.php
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
<?php
|
||||
|
||||
// autoload_namespaces.php @generated by Composer
|
||||
|
||||
$vendorDir = dirname(dirname(__FILE__));
|
||||
$baseDir = dirname($vendorDir);
|
||||
|
||||
return array(
|
||||
);
|
||||
10
public/static/plugins/NKeditor/php/qiniu/vendor/composer/autoload_psr4.php
vendored
Normal file
@@ -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
public/static/plugins/NKeditor/php/qiniu/vendor/composer/autoload_real.php
vendored
Normal file
@@ -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
public/static/plugins/NKeditor/php/qiniu/vendor/composer/autoload_static.php
vendored
Normal file
@@ -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
public/static/plugins/NKeditor/php/qiniu/vendor/composer/installed.json
vendored
Normal file
@@ -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
public/static/plugins/NKeditor/plugins/anchor/anchor.js
Normal file
@@ -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);
|
||||
});
|
||||
@@ -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
public/static/plugins/NKeditor/plugins/baidumap/baidumap.js
Normal file
@@ -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, 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 + '" />',
|
||||
'</span>',
|
||||
'<input type="checkbox" id="keInsertDynamicMap" name="insertDynamicMap" class="checkbox" value="1" /> <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' : 'http://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());
|
||||
});
|
||||
});
|
||||
});
|
||||
83
public/static/plugins/NKeditor/plugins/baidumap/index.html
Normal file
@@ -0,0 +1,83 @@
|
||||
<!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="http://api.map.baidu.com/api?key=&v=1.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>
|
||||
43
public/static/plugins/NKeditor/plugins/baidumap/map.html
Normal file
@@ -0,0 +1,43 @@
|
||||
<!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="http://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>
|
||||
@@ -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
public/static/plugins/NKeditor/plugins/code/code.js
Normal file
@@ -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 : 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
public/static/plugins/NKeditor/plugins/code/pretty.js
Normal file
@@ -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
public/static/plugins/NKeditor/plugins/code/prism.css
Normal file
@@ -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;
|
||||
}
|
||||
|
||||
26
public/static/plugins/NKeditor/plugins/code/prism.js
Normal file
129
public/static/plugins/NKeditor/plugins/emoticons/emoticons.js
Normal file
@@ -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('@ '));
|
||||
}
|
||||
}
|
||||
createPageTable(currentPageNum);
|
||||
});
|
||||
});
|
||||
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/0.gif
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/1.gif
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/10.gif
Normal file
|
After Width: | Height: | Size: 3.6 KiB |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/100.gif
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/101.gif
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/102.gif
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/103.gif
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/104.gif
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/105.gif
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/106.gif
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/107.gif
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/108.gif
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/109.gif
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/11.gif
Normal file
|
After Width: | Height: | Size: 7.8 KiB |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/110.gif
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/111.gif
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/112.gif
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/113.gif
Normal file
|
After Width: | Height: | Size: 1015 B |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/114.gif
Normal file
|
After Width: | Height: | Size: 1003 B |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/115.gif
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/116.gif
Normal file
|
After Width: | Height: | Size: 996 B |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/117.gif
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/118.gif
Normal file
|
After Width: | Height: | Size: 1012 B |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/119.gif
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/12.gif
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/120.gif
Normal file
|
After Width: | Height: | Size: 1008 B |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/121.gif
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/122.gif
Normal file
|
After Width: | Height: | Size: 999 B |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/123.gif
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/124.gif
Normal file
|
After Width: | Height: | Size: 1022 B |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/125.gif
Normal file
|
After Width: | Height: | Size: 1013 B |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/126.gif
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/127.gif
Normal file
|
After Width: | Height: | Size: 956 B |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/128.gif
Normal file
|
After Width: | Height: | Size: 1022 B |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/129.gif
Normal file
|
After Width: | Height: | Size: 972 B |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/13.gif
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/130.gif
Normal file
|
After Width: | Height: | Size: 980 B |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/131.gif
Normal file
|
After Width: | Height: | Size: 945 B |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/132.gif
Normal file
|
After Width: | Height: | Size: 936 B |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/133.gif
Normal file
|
After Width: | Height: | Size: 1012 B |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/134.gif
Normal file
|
After Width: | Height: | Size: 968 B |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/14.gif
Normal file
|
After Width: | Height: | Size: 3.9 KiB |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/15.gif
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/16.gif
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/17.gif
Normal file
|
After Width: | Height: | Size: 3.3 KiB |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/18.gif
Normal file
|
After Width: | Height: | Size: 7.9 KiB |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/19.gif
Normal file
|
After Width: | Height: | Size: 7.9 KiB |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/2.gif
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/20.gif
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/21.gif
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/22.gif
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/23.gif
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/24.gif
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/25.gif
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/26.gif
Normal file
|
After Width: | Height: | Size: 3.9 KiB |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/27.gif
Normal file
|
After Width: | Height: | Size: 2.8 KiB |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/28.gif
Normal file
|
After Width: | Height: | Size: 3.2 KiB |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/29.gif
Normal file
|
After Width: | Height: | Size: 5.7 KiB |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/3.gif
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/30.gif
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/31.gif
Normal file
|
After Width: | Height: | Size: 5.1 KiB |
BIN
public/static/plugins/NKeditor/plugins/emoticons/images/32.gif
Normal file
|
After Width: | Height: | Size: 7.0 KiB |