订单异常
1
addons/nkeditor/.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
.addonrc
|
||||
70
addons/nkeditor/Nkeditor.php
Normal file
|
|
@ -0,0 +1,70 @@
|
|||
<?php
|
||||
|
||||
namespace addons\nkeditor;
|
||||
|
||||
use app\common\library\Menu;
|
||||
use think\Addons;
|
||||
|
||||
/**
|
||||
* 富文本编辑器插件
|
||||
*/
|
||||
class Nkeditor extends Addons
|
||||
{
|
||||
|
||||
/**
|
||||
* 插件安装方法
|
||||
* @return bool
|
||||
*/
|
||||
public function install()
|
||||
{
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 插件卸载方法
|
||||
* @return bool
|
||||
*/
|
||||
public function uninstall()
|
||||
{
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 插件启用方法
|
||||
* @return bool
|
||||
*/
|
||||
public function enable()
|
||||
{
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 插件禁用方法
|
||||
* @return bool
|
||||
*/
|
||||
public function disable()
|
||||
{
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $params
|
||||
*/
|
||||
public function configInit(&$params)
|
||||
{
|
||||
$config = $this->getConfig();
|
||||
$params['nkeditor'] = [
|
||||
'theme' => $config['theme'],
|
||||
'fullmode' => !!($config['fullmode'] ?? '1'),
|
||||
'classname' => $config['classname'] ?? '.editor',
|
||||
'formulapreviewurl' => $config['formulapreviewurl'] ?? '',
|
||||
'baidumapkey' => $config['baidumapkey'] ?? '',
|
||||
'baidumapcenter' => $config['baidumapcenter'] ?? ''
|
||||
];
|
||||
}
|
||||
|
||||
}
|
||||
17
addons/nkeditor/README.md
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
# NKeditor
|
||||
NKedtior是基于 kindeditor 进行二次开发的项目
|
||||
kindeditor 是一款优秀的开源在线编辑器。轻量级且功能强大,代码量却不到百度的ueditor编辑器的一半。可惜已经4年没有更新了,由于业务的需求我们在kindeditor的基础上开发了 NKeditor, 主要做了一下工作:
|
||||
1. 调整编辑器和弹出 dialog 的样式,美化了UI
|
||||
2. 重写图片上传和批量图片上传插件,使用 html5 上传代替了 flash,实现了待上传图片预览,优化用户体验
|
||||
3. 修复一些已知的bug,如 ajax 提交无法获取内容等
|
||||
4. 新增涂鸦等功能
|
||||
|
||||
再次感谢 kindeditor 的开发者,为我们提供了如此优秀的在线编辑器,让我们能在前人的基础上继续贡献自己的微薄之力。
|
||||
|
||||
# 开源说明
|
||||
本插件基于Nkeditor进行二次开发,修改的核心文件已开源于 https://gitee.com/karson/kindeditor
|
||||
|
||||
# 特别感谢
|
||||
[Kindeditor](https://gitee.com/luolonghao/kindeditor)
|
||||
[Nkeditor](https://gitee.com/blackfox/kindeditor)
|
||||
|
||||
170
addons/nkeditor/bootstrap.js
vendored
Normal file
|
|
@ -0,0 +1,170 @@
|
|||
require.config({
|
||||
paths: {
|
||||
'nkeditor': '../addons/nkeditor/js/customplugin',
|
||||
'nkeditor-core': '../addons/nkeditor/nkeditor',
|
||||
'nkeditor-lang': '../addons/nkeditor/lang/zh-CN',
|
||||
},
|
||||
shim: {
|
||||
'nkeditor': {
|
||||
deps: [
|
||||
'nkeditor-core',
|
||||
'nkeditor-lang'
|
||||
]
|
||||
},
|
||||
'nkeditor-core': {
|
||||
deps: [
|
||||
'css!../addons/nkeditor/themes/black/editor.min.css',
|
||||
'css!../addons/nkeditor/css/common.css'
|
||||
],
|
||||
exports: 'window.KindEditor'
|
||||
},
|
||||
'nkeditor-lang': {
|
||||
deps: [
|
||||
'nkeditor-core'
|
||||
]
|
||||
}
|
||||
}
|
||||
});
|
||||
require(['form'], function (Form) {
|
||||
var _bindevent = Form.events.bindevent;
|
||||
Form.events.bindevent = function (form) {
|
||||
_bindevent.apply(this, [form]);
|
||||
if ($(Config.nkeditor.classname || '.editor', form).length > 0) {
|
||||
require(['nkeditor', 'upload'], function (Nkeditor, Upload) {
|
||||
var getFileFromBase64, uploadFiles;
|
||||
uploadFiles = async function (files) {
|
||||
var self = this;
|
||||
for (var i = 0; i < files.length; i++) {
|
||||
try {
|
||||
await new Promise((resolve) => {
|
||||
var url, html, file;
|
||||
file = files[i];
|
||||
Upload.api.send(file, function (data) {
|
||||
url = Config.nkeditor.fullmode ? Fast.api.cdnurl(data.url, true) : Fast.api.cdnurl(data.url);
|
||||
if (file.type.indexOf("image") !== -1) {
|
||||
self.exec("insertimage", url);
|
||||
} else {
|
||||
html = '<a class="ke-insertfile" href="' + url + '" data-ke-src="' + url + '" target="_blank">' + (file.name || url) + '</a>';
|
||||
self.exec("inserthtml", html);
|
||||
}
|
||||
resolve();
|
||||
}, function () {
|
||||
resolve();
|
||||
});
|
||||
});
|
||||
} catch (e) {
|
||||
|
||||
}
|
||||
}
|
||||
};
|
||||
getFileFromBase64 = function (data, url) {
|
||||
var arr = data.split(','), mime = arr[0].match(/:(.*?);/)[1],
|
||||
bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
|
||||
while (n--) {
|
||||
u8arr[n] = bstr.charCodeAt(n);
|
||||
}
|
||||
var filename, suffix;
|
||||
if (typeof url != 'undefined') {
|
||||
var urlArr = url.split('.');
|
||||
filename = url.substr(url.lastIndexOf('/') + 1);
|
||||
suffix = urlArr.pop();
|
||||
} else {
|
||||
filename = Math.random().toString(36).substring(5, 15);
|
||||
}
|
||||
if (!suffix) {
|
||||
suffix = data.substring("data:image/".length, data.indexOf(";base64"));
|
||||
}
|
||||
|
||||
var exp = new RegExp("\\." + suffix + "$", "i");
|
||||
filename = exp.test(filename) ? filename : filename + "." + suffix;
|
||||
var file = new File([u8arr], filename, {type: mime});
|
||||
return file;
|
||||
};
|
||||
|
||||
$(Config.nkeditor.classname || '.editor', form).each(function () {
|
||||
var that = this;
|
||||
var options = $(this).data("nkeditor-options");
|
||||
var editor = Nkeditor.create(that, $.extend({}, {
|
||||
width: '100%',
|
||||
filterMode: false,
|
||||
wellFormatMode: false,
|
||||
allowMediaUpload: true, //是否允许媒体上传
|
||||
allowFileManager: true,
|
||||
allowImageUpload: true,
|
||||
baiduMapKey: Config.nkeditor.baidumapkey || '',
|
||||
baiduMapCenter: Config.nkeditor.baidumapcenter || '',
|
||||
fontSizeTable: ['9px', '10px', '12px', '14px', '16px', '18px', '21px', '24px', '32px'],
|
||||
formulaPreviewUrl: typeof Config.nkeditor != 'undefined' && Config.nkeditor.formulapreviewurl ? Config.nkeditor.formulapreviewurl : "", //数学公式的预览地址
|
||||
cssPath: Config.site.cdnurl + '/assets/addons/nkeditor/plugins/code/prism.css',
|
||||
cssData: "body {font-size: 13px}",
|
||||
fillDescAfterUploadImage: false, //是否在上传后继续添加描述信息
|
||||
themeType: typeof Config.nkeditor != 'undefined' ? Config.nkeditor.theme : 'black', //编辑器皮肤,这个值从后台获取
|
||||
fileManagerJson: Fast.api.fixurl("/addons/nkeditor/index/attachment/module/" + Config.modulename),
|
||||
items: [
|
||||
'source', 'undo', 'redo', 'preview', 'print', 'template', 'code', 'quote', 'cut', 'copy', 'paste',
|
||||
'plainpaste', 'justifyleft', 'justifycenter', 'justifyright',
|
||||
'justifyfull', 'insertorderedlist', 'insertunorderedlist', 'indent', 'outdent', 'subscript',
|
||||
'superscript', 'clearhtml', 'quickformat', 'selectall',
|
||||
'formatblock', 'fontname', 'fontsize', 'forecolor', 'hilitecolor', 'bold',
|
||||
'italic', 'underline', 'strikethrough', 'lineheight', 'removeformat', 'image', 'multiimage', 'graft',
|
||||
'media', 'insertfile', 'table', 'hr', 'emoticons', 'baidumap', 'pagebreak',
|
||||
'anchor', 'link', 'unlink', 'remoteimage', 'search', 'math', 'about', 'fullscreen'
|
||||
],
|
||||
afterCreate: function () {
|
||||
var self = this;
|
||||
//Ctrl+回车提交
|
||||
Nkeditor.ctrl(document, 13, function () {
|
||||
self.sync();
|
||||
$(that).closest("form").submit();
|
||||
});
|
||||
Nkeditor.ctrl(self.edit.doc, 13, function () {
|
||||
self.sync();
|
||||
$(that).closest("form").submit();
|
||||
});
|
||||
//粘贴上传
|
||||
$("body", self.edit.doc).bind('paste', function (event) {
|
||||
var originalEvent;
|
||||
originalEvent = event.originalEvent;
|
||||
if (originalEvent.clipboardData && originalEvent.clipboardData.files.length > 0) {
|
||||
uploadFiles.call(self, originalEvent.clipboardData.files);
|
||||
return false;
|
||||
}
|
||||
});
|
||||
//拖拽上传
|
||||
$("body", self.edit.doc).bind('drop', function (event) {
|
||||
var originalEvent;
|
||||
originalEvent = event.originalEvent;
|
||||
if (originalEvent.dataTransfer && originalEvent.dataTransfer.files.length > 0) {
|
||||
uploadFiles.call(self, originalEvent.dataTransfer.files);
|
||||
return false;
|
||||
}
|
||||
});
|
||||
},
|
||||
afterChange: function () {
|
||||
$(this.srcElement[0]).trigger("change");
|
||||
},
|
||||
//自定义处理
|
||||
beforeUpload: function (callback, file) {
|
||||
var file = file ? file : $("input.ke-upload-file", this.form).prop('files')[0];
|
||||
Upload.api.send(file, function (data) {
|
||||
var data = {code: '000', data: {url: Config.nkeditor.fullmode ? Fast.api.cdnurl(data.url, true) : Fast.api.cdnurl(data.url)}, title: '', width: '', height: '', border: '', align: ''};
|
||||
callback(data);
|
||||
});
|
||||
},
|
||||
//错误处理 handler
|
||||
errorMsgHandler: function (message, type) {
|
||||
try {
|
||||
Fast.api.msg(message);
|
||||
console.log(message, type);
|
||||
} catch (Error) {
|
||||
alert(message);
|
||||
}
|
||||
},
|
||||
uploadFiles: uploadFiles
|
||||
}, options || {}));
|
||||
$(this).data("nkeditor", editor);
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
116
addons/nkeditor/config.php
Normal file
|
|
@ -0,0 +1,116 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
[
|
||||
'name' => 'classname',
|
||||
'title' => '渲染文本框元素',
|
||||
'type' => 'string',
|
||||
'content' => [],
|
||||
'value' => '.editor',
|
||||
'rule' => 'required',
|
||||
'msg' => '',
|
||||
'tip' => '用于对指定的元素渲染,一般情况下无需修改',
|
||||
'ok' => '',
|
||||
'extend' => '',
|
||||
],
|
||||
[
|
||||
'name' => 'theme',
|
||||
'title' => '编辑器主题',
|
||||
'type' => 'select',
|
||||
'content' => [
|
||||
'default' => '经典主题',
|
||||
'black' => '雅黑主题',
|
||||
'blue' => '淡蓝主题',
|
||||
'grey' => '深灰主题',
|
||||
'primary' => '深绿主题',
|
||||
],
|
||||
'value' => 'black',
|
||||
'rule' => 'required',
|
||||
'msg' => '',
|
||||
'tip' => '',
|
||||
'ok' => '',
|
||||
'extend' => '',
|
||||
],
|
||||
[
|
||||
'name' => 'attachmentmode_admin',
|
||||
'title' => '管理员附件选择模式',
|
||||
'type' => 'select',
|
||||
'content' => [
|
||||
'all' => '任何管理员均可以查看全部上传的文件',
|
||||
'auth' => '仅可以查看自己及所有子管理员上传的文件',
|
||||
'personal' => '仅可以查看选择自己上传的文件',
|
||||
],
|
||||
'value' => 'all',
|
||||
'rule' => 'required',
|
||||
'msg' => '',
|
||||
'tip' => '',
|
||||
'ok' => '',
|
||||
'extend' => '',
|
||||
],
|
||||
[
|
||||
'name' => 'fullmode',
|
||||
'title' => '是否启用完整URL路径模式',
|
||||
'type' => 'radio',
|
||||
'content' => [
|
||||
1 => '是',
|
||||
0 => '否',
|
||||
],
|
||||
'value' => '1',
|
||||
'rule' => 'required',
|
||||
'msg' => '',
|
||||
'tip' => '',
|
||||
'ok' => '',
|
||||
'extend' => '',
|
||||
],
|
||||
[
|
||||
'name' => 'attachmentmode_index',
|
||||
'title' => '前台附件选择模式',
|
||||
'type' => 'select',
|
||||
'content' => [
|
||||
'all' => '任何会员均可以查看全部上传的文件',
|
||||
'personal' => '仅可以查看选择自己上传的文件',
|
||||
],
|
||||
'value' => 'personal',
|
||||
'rule' => 'required',
|
||||
'msg' => '',
|
||||
'tip' => '',
|
||||
'ok' => '',
|
||||
'extend' => '',
|
||||
],
|
||||
[
|
||||
'name' => 'baidumapkey',
|
||||
'title' => '百度地图API密钥',
|
||||
'type' => 'string',
|
||||
'content' => [],
|
||||
'value' => '',
|
||||
'rule' => '',
|
||||
'msg' => '',
|
||||
'tip' => '',
|
||||
'ok' => '',
|
||||
'extend' => '',
|
||||
],
|
||||
[
|
||||
'name' => 'baidumapcenter',
|
||||
'title' => '百度地图中心点经纬度',
|
||||
'type' => 'string',
|
||||
'content' => [],
|
||||
'value' => '116.404413,39.903536',
|
||||
'rule' => '',
|
||||
'msg' => '',
|
||||
'tip' => '',
|
||||
'ok' => '',
|
||||
'extend' => '',
|
||||
],
|
||||
[
|
||||
'name' => '__tips__',
|
||||
'title' => '温馨提示',
|
||||
'type' => 'string',
|
||||
'content' => [],
|
||||
'value' => '百度地图API密钥申请地址:http://lbsyun.baidu.com/apiconsole/key<br>百度地图经纬度坐标获取:https://api.map.baidu.com/lbsapi/getpoint/index.html',
|
||||
'rule' => '',
|
||||
'msg' => '',
|
||||
'tip' => '',
|
||||
'ok' => '',
|
||||
'extend' => '',
|
||||
],
|
||||
];
|
||||
145
addons/nkeditor/controller/Index.php
Normal file
|
|
@ -0,0 +1,145 @@
|
|||
<?php
|
||||
|
||||
namespace addons\nkeditor\controller;
|
||||
|
||||
use app\common\model\Attachment;
|
||||
use GuzzleHttp\Client;
|
||||
use Symfony\Component\HttpFoundation\StreamedResponse;
|
||||
use think\addons\Controller;
|
||||
|
||||
class Index extends Controller
|
||||
{
|
||||
|
||||
public function index()
|
||||
{
|
||||
$this->error('该插件暂无前台页面');
|
||||
}
|
||||
|
||||
/**
|
||||
* 文件列表
|
||||
*/
|
||||
public function attachment()
|
||||
{
|
||||
$model = new Attachment;
|
||||
$page = $this->request->request('page');
|
||||
$fileType = $this->request->request('fileType');
|
||||
$module = $this->request->param('module');
|
||||
$pagesize = 15;
|
||||
$config = get_addon_config('nkeditor');
|
||||
$type = [];
|
||||
$imageSuffix = ['png', 'jpg', 'jpeg', 'gif', 'bmp', 'webp', 'svg'];
|
||||
if ($fileType == 'image') {
|
||||
$type = $imageSuffix;
|
||||
} elseif ($fileType == 'flash') {
|
||||
$type = ['swf', 'flv'];
|
||||
} elseif ($fileType == 'media') {
|
||||
$type = ['swf', 'flv', 'mp4', 'mpeg', 'mp3', 'wav', 'ogg', 'acc', 'webm'];
|
||||
} elseif ($fileType == 'file') {
|
||||
|
||||
}
|
||||
if ($module == 'admin') {
|
||||
$auth = \app\admin\library\Auth::instance();
|
||||
if (!$auth->id) {
|
||||
$this->error('请登录后再操作!');
|
||||
} else {
|
||||
$mode = $config['attachmentmode_admin'];
|
||||
}
|
||||
if ($mode == 'all') {
|
||||
|
||||
} else {
|
||||
if (!$auth->isSuperAdmin()) {
|
||||
$adminIds = $mode == 'auth' ? $auth->getChildrenAdminIds(true) : [$auth->id];
|
||||
$model->where('admin_id', 'in', $adminIds);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (!$this->auth->id) {
|
||||
$this->error('请登录后再操作!');
|
||||
} else {
|
||||
$mode = $config['attachmentmode_index'];
|
||||
}
|
||||
if ($mode == 'all') {
|
||||
|
||||
} else {
|
||||
$model->where('user_id', 'in', [$this->auth->id]);
|
||||
}
|
||||
}
|
||||
|
||||
if ($type) {
|
||||
$model->where('imagetype', 'in', $type);
|
||||
}
|
||||
|
||||
$list = $model
|
||||
->order('id', 'desc')
|
||||
->paginate($pagesize);
|
||||
|
||||
$fullmode = !!($config['fullmode'] ?? '1');
|
||||
$items = $list->items();
|
||||
$data = [];
|
||||
foreach ($items as $k => &$v) {
|
||||
$v['imagetype'] = strtolower($v['imagetype']);
|
||||
$v['fullurl'] = cdnurl($v['url'], true);
|
||||
$thumbUrl = addon_url("nkeditor/index/preview") . "?suffix=" . $v['imagetype'];
|
||||
$data[] = [
|
||||
'width' => $v['imagewidth'],
|
||||
'height' => $v['imageheight'],
|
||||
'filename' => $v['filename'],
|
||||
'filesize' => $v['filesize'],
|
||||
'oriURL' => $fullmode ? $v['fullurl'] : cdnurl($v['url']),
|
||||
'thumbURL' => $v['fullurl'],
|
||||
];
|
||||
}
|
||||
$result = [
|
||||
'code' => '000',
|
||||
'count' => $list->total(),
|
||||
'page' => $page,
|
||||
'pagesize' => $pagesize,
|
||||
'extra' => '',
|
||||
'data' => $data
|
||||
];
|
||||
return json($result);
|
||||
}
|
||||
|
||||
/**
|
||||
* 下载图片
|
||||
*/
|
||||
public function download()
|
||||
{
|
||||
$url = $this->request->request("url");
|
||||
$contentType = '';
|
||||
try {
|
||||
$client = new Client();
|
||||
$response = $client->request('GET', $url, ['stream' => true, 'verify' => false, 'allow_redirects' => ['strict' => true]]);
|
||||
|
||||
$body = $response->getBody();
|
||||
$contentType = $response->getHeader('Content-Type');
|
||||
$contentType = $contentType[0] ?? 'image/png';
|
||||
} catch (\Exception $e) {
|
||||
$this->error("图片下载失败");
|
||||
}
|
||||
|
||||
$contentTypeArr = explode('/', $contentType);
|
||||
if ($contentTypeArr[0] !== 'image') {
|
||||
$this->error("只支持图片文件");
|
||||
}
|
||||
|
||||
$response = new StreamedResponse(function () use ($body) {
|
||||
while (!$body->eof()) {
|
||||
echo $body->read(1024);
|
||||
}
|
||||
});
|
||||
$response->headers->set('Content-Type', $contentType);
|
||||
$response->send();
|
||||
return;
|
||||
}
|
||||
|
||||
public function get_map_config()
|
||||
{
|
||||
$config = get_addon_config('nkeditor');
|
||||
$params = [
|
||||
'baidumapkey' => $config['baidumapkey'] ?? ''
|
||||
];
|
||||
return json($params);
|
||||
}
|
||||
|
||||
}
|
||||
10
addons/nkeditor/info.ini
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
name = nkeditor
|
||||
title = 简洁强大的富文本编辑器
|
||||
intro = 一款简洁强大的富文本编辑器
|
||||
author = FastAdmin
|
||||
website = https://www.fastadmin.net
|
||||
version = 1.2.0
|
||||
state = 1
|
||||
url = http://fast.cc:8088/addons/nkeditor
|
||||
license = basic
|
||||
licenseto = 15976
|
||||
502
addons/nkeditor/licenses/kindeditor.txt
Normal file
|
|
@ -0,0 +1,502 @@
|
|||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 2.1, February 1999
|
||||
|
||||
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
[This is the first released version of the Lesser GPL. It also counts
|
||||
as the successor of the GNU Library Public License, version 2, hence
|
||||
the version number 2.1.]
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
Licenses are intended to guarantee your freedom to share and change
|
||||
free software--to make sure the software is free for all its users.
|
||||
|
||||
This license, the Lesser General Public License, applies to some
|
||||
specially designated software packages--typically libraries--of the
|
||||
Free Software Foundation and other authors who decide to use it. You
|
||||
can use it too, but we suggest you first think carefully about whether
|
||||
this license or the ordinary General Public License is the better
|
||||
strategy to use in any particular case, based on the explanations below.
|
||||
|
||||
When we speak of free software, we are referring to freedom of use,
|
||||
not price. Our General Public Licenses are designed to make sure that
|
||||
you have the freedom to distribute copies of free software (and charge
|
||||
for this service if you wish); that you receive source code or can get
|
||||
it if you want it; that you can change the software and use pieces of
|
||||
it in new free programs; and that you are informed that you can do
|
||||
these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
distributors to deny you these rights or to ask you to surrender these
|
||||
rights. These restrictions translate to certain responsibilities for
|
||||
you if you distribute copies of the library or if you modify it.
|
||||
|
||||
For example, if you distribute copies of the library, whether gratis
|
||||
or for a fee, you must give the recipients all the rights that we gave
|
||||
you. You must make sure that they, too, receive or can get the source
|
||||
code. If you link other code with the library, you must provide
|
||||
complete object files to the recipients, so that they can relink them
|
||||
with the library after making changes to the library and recompiling
|
||||
it. And you must show them these terms so they know their rights.
|
||||
|
||||
We protect your rights with a two-step method: (1) we copyright the
|
||||
library, and (2) we offer you this license, which gives you legal
|
||||
permission to copy, distribute and/or modify the library.
|
||||
|
||||
To protect each distributor, we want to make it very clear that
|
||||
there is no warranty for the free library. Also, if the library is
|
||||
modified by someone else and passed on, the recipients should know
|
||||
that what they have is not the original version, so that the original
|
||||
author's reputation will not be affected by problems that might be
|
||||
introduced by others.
|
||||
|
||||
Finally, software patents pose a constant threat to the existence of
|
||||
any free program. We wish to make sure that a company cannot
|
||||
effectively restrict the users of a free program by obtaining a
|
||||
restrictive license from a patent holder. Therefore, we insist that
|
||||
any patent license obtained for a version of the library must be
|
||||
consistent with the full freedom of use specified in this license.
|
||||
|
||||
Most GNU software, including some libraries, is covered by the
|
||||
ordinary GNU General Public License. This license, the GNU Lesser
|
||||
General Public License, applies to certain designated libraries, and
|
||||
is quite different from the ordinary General Public License. We use
|
||||
this license for certain libraries in order to permit linking those
|
||||
libraries into non-free programs.
|
||||
|
||||
When a program is linked with a library, whether statically or using
|
||||
a shared library, the combination of the two is legally speaking a
|
||||
combined work, a derivative of the original library. The ordinary
|
||||
General Public License therefore permits such linking only if the
|
||||
entire combination fits its criteria of freedom. The Lesser General
|
||||
Public License permits more lax criteria for linking other code with
|
||||
the library.
|
||||
|
||||
We call this license the "Lesser" General Public License because it
|
||||
does Less to protect the user's freedom than the ordinary General
|
||||
Public License. It also provides other free software developers Less
|
||||
of an advantage over competing non-free programs. These disadvantages
|
||||
are the reason we use the ordinary General Public License for many
|
||||
libraries. However, the Lesser license provides advantages in certain
|
||||
special circumstances.
|
||||
|
||||
For example, on rare occasions, there may be a special need to
|
||||
encourage the widest possible use of a certain library, so that it becomes
|
||||
a de-facto standard. To achieve this, non-free programs must be
|
||||
allowed to use the library. A more frequent case is that a free
|
||||
library does the same job as widely used non-free libraries. In this
|
||||
case, there is little to gain by limiting the free library to free
|
||||
software only, so we use the Lesser General Public License.
|
||||
|
||||
In other cases, permission to use a particular library in non-free
|
||||
programs enables a greater number of people to use a large body of
|
||||
free software. For example, permission to use the GNU C Library in
|
||||
non-free programs enables many more people to use the whole GNU
|
||||
operating system, as well as its variant, the GNU/Linux operating
|
||||
system.
|
||||
|
||||
Although the Lesser General Public License is Less protective of the
|
||||
users' freedom, it does ensure that the user of a program that is
|
||||
linked with the Library has the freedom and the wherewithal to run
|
||||
that program using a modified version of the Library.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow. Pay close attention to the difference between a
|
||||
"work based on the library" and a "work that uses the library". The
|
||||
former contains code derived from the library, whereas the latter must
|
||||
be combined with the library in order to run.
|
||||
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License Agreement applies to any software library or other
|
||||
program which contains a notice placed by the copyright holder or
|
||||
other authorized party saying it may be distributed under the terms of
|
||||
this Lesser General Public License (also called "this License").
|
||||
Each licensee is addressed as "you".
|
||||
|
||||
A "library" means a collection of software functions and/or data
|
||||
prepared so as to be conveniently linked with application programs
|
||||
(which use some of those functions and data) to form executables.
|
||||
|
||||
The "Library", below, refers to any such software library or work
|
||||
which has been distributed under these terms. A "work based on the
|
||||
Library" means either the Library or any derivative work under
|
||||
copyright law: that is to say, a work containing the Library or a
|
||||
portion of it, either verbatim or with modifications and/or translated
|
||||
straightforwardly into another language. (Hereinafter, translation is
|
||||
included without limitation in the term "modification".)
|
||||
|
||||
"Source code" for a work means the preferred form of the work for
|
||||
making modifications to it. For a library, complete source code means
|
||||
all the source code for all modules it contains, plus any associated
|
||||
interface definition files, plus the scripts used to control compilation
|
||||
and installation of the library.
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running a program using the Library is not restricted, and output from
|
||||
such a program is covered only if its contents constitute a work based
|
||||
on the Library (independent of the use of the Library in a tool for
|
||||
writing it). Whether that is true depends on what the Library does
|
||||
and what the program that uses the Library does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Library's
|
||||
complete source code as you receive it, in any medium, provided that
|
||||
you conspicuously and appropriately publish on each copy an
|
||||
appropriate copyright notice and disclaimer of warranty; keep intact
|
||||
all the notices that refer to this License and to the absence of any
|
||||
warranty; and distribute a copy of this License along with the
|
||||
Library.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy,
|
||||
and you may at your option offer warranty protection in exchange for a
|
||||
fee.
|
||||
|
||||
2. You may modify your copy or copies of the Library or any portion
|
||||
of it, thus forming a work based on the Library, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) The modified work must itself be a software library.
|
||||
|
||||
b) You must cause the files modified to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
c) You must cause the whole of the work to be licensed at no
|
||||
charge to all third parties under the terms of this License.
|
||||
|
||||
d) If a facility in the modified Library refers to a function or a
|
||||
table of data to be supplied by an application program that uses
|
||||
the facility, other than as an argument passed when the facility
|
||||
is invoked, then you must make a good faith effort to ensure that,
|
||||
in the event an application does not supply such function or
|
||||
table, the facility still operates, and performs whatever part of
|
||||
its purpose remains meaningful.
|
||||
|
||||
(For example, a function in a library to compute square roots has
|
||||
a purpose that is entirely well-defined independent of the
|
||||
application. Therefore, Subsection 2d requires that any
|
||||
application-supplied function or table used by this function must
|
||||
be optional: if the application does not supply it, the square
|
||||
root function must still compute square roots.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Library,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Library, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote
|
||||
it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Library.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Library
|
||||
with the Library (or with a work based on the Library) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may opt to apply the terms of the ordinary GNU General Public
|
||||
License instead of this License to a given copy of the Library. To do
|
||||
this, you must alter all the notices that refer to this License, so
|
||||
that they refer to the ordinary GNU General Public License, version 2,
|
||||
instead of to this License. (If a newer version than version 2 of the
|
||||
ordinary GNU General Public License has appeared, then you can specify
|
||||
that version instead if you wish.) Do not make any other change in
|
||||
these notices.
|
||||
|
||||
Once this change is made in a given copy, it is irreversible for
|
||||
that copy, so the ordinary GNU General Public License applies to all
|
||||
subsequent copies and derivative works made from that copy.
|
||||
|
||||
This option is useful when you wish to copy part of the code of
|
||||
the Library into a program that is not a library.
|
||||
|
||||
4. You may copy and distribute the Library (or a portion or
|
||||
derivative of it, under Section 2) in object code or executable form
|
||||
under the terms of Sections 1 and 2 above provided that you accompany
|
||||
it with the complete corresponding machine-readable source code, which
|
||||
must be distributed under the terms of Sections 1 and 2 above on a
|
||||
medium customarily used for software interchange.
|
||||
|
||||
If distribution of object code is made by offering access to copy
|
||||
from a designated place, then offering equivalent access to copy the
|
||||
source code from the same place satisfies the requirement to
|
||||
distribute the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
5. A program that contains no derivative of any portion of the
|
||||
Library, but is designed to work with the Library by being compiled or
|
||||
linked with it, is called a "work that uses the Library". Such a
|
||||
work, in isolation, is not a derivative work of the Library, and
|
||||
therefore falls outside the scope of this License.
|
||||
|
||||
However, linking a "work that uses the Library" with the Library
|
||||
creates an executable that is a derivative of the Library (because it
|
||||
contains portions of the Library), rather than a "work that uses the
|
||||
library". The executable is therefore covered by this License.
|
||||
Section 6 states terms for distribution of such executables.
|
||||
|
||||
When a "work that uses the Library" uses material from a header file
|
||||
that is part of the Library, the object code for the work may be a
|
||||
derivative work of the Library even though the source code is not.
|
||||
Whether this is true is especially significant if the work can be
|
||||
linked without the Library, or if the work is itself a library. The
|
||||
threshold for this to be true is not precisely defined by law.
|
||||
|
||||
If such an object file uses only numerical parameters, data
|
||||
structure layouts and accessors, and small macros and small inline
|
||||
functions (ten lines or less in length), then the use of the object
|
||||
file is unrestricted, regardless of whether it is legally a derivative
|
||||
work. (Executables containing this object code plus portions of the
|
||||
Library will still fall under Section 6.)
|
||||
|
||||
Otherwise, if the work is a derivative of the Library, you may
|
||||
distribute the object code for the work under the terms of Section 6.
|
||||
Any executables containing that work also fall under Section 6,
|
||||
whether or not they are linked directly with the Library itself.
|
||||
|
||||
6. As an exception to the Sections above, you may also combine or
|
||||
link a "work that uses the Library" with the Library to produce a
|
||||
work containing portions of the Library, and distribute that work
|
||||
under terms of your choice, provided that the terms permit
|
||||
modification of the work for the customer's own use and reverse
|
||||
engineering for debugging such modifications.
|
||||
|
||||
You must give prominent notice with each copy of the work that the
|
||||
Library is used in it and that the Library and its use are covered by
|
||||
this License. You must supply a copy of this License. If the work
|
||||
during execution displays copyright notices, you must include the
|
||||
copyright notice for the Library among them, as well as a reference
|
||||
directing the user to the copy of this License. Also, you must do one
|
||||
of these things:
|
||||
|
||||
a) Accompany the work with the complete corresponding
|
||||
machine-readable source code for the Library including whatever
|
||||
changes were used in the work (which must be distributed under
|
||||
Sections 1 and 2 above); and, if the work is an executable linked
|
||||
with the Library, with the complete machine-readable "work that
|
||||
uses the Library", as object code and/or source code, so that the
|
||||
user can modify the Library and then relink to produce a modified
|
||||
executable containing the modified Library. (It is understood
|
||||
that the user who changes the contents of definitions files in the
|
||||
Library will not necessarily be able to recompile the application
|
||||
to use the modified definitions.)
|
||||
|
||||
b) Use a suitable shared library mechanism for linking with the
|
||||
Library. A suitable mechanism is one that (1) uses at run time a
|
||||
copy of the library already present on the user's computer system,
|
||||
rather than copying library functions into the executable, and (2)
|
||||
will operate properly with a modified version of the library, if
|
||||
the user installs one, as long as the modified version is
|
||||
interface-compatible with the version that the work was made with.
|
||||
|
||||
c) Accompany the work with a written offer, valid for at
|
||||
least three years, to give the same user the materials
|
||||
specified in Subsection 6a, above, for a charge no more
|
||||
than the cost of performing this distribution.
|
||||
|
||||
d) If distribution of the work is made by offering access to copy
|
||||
from a designated place, offer equivalent access to copy the above
|
||||
specified materials from the same place.
|
||||
|
||||
e) Verify that the user has already received a copy of these
|
||||
materials or that you have already sent this user a copy.
|
||||
|
||||
For an executable, the required form of the "work that uses the
|
||||
Library" must include any data and utility programs needed for
|
||||
reproducing the executable from it. However, as a special exception,
|
||||
the materials to be distributed need not include anything that is
|
||||
normally distributed (in either source or binary form) with the major
|
||||
components (compiler, kernel, and so on) of the operating system on
|
||||
which the executable runs, unless that component itself accompanies
|
||||
the executable.
|
||||
|
||||
It may happen that this requirement contradicts the license
|
||||
restrictions of other proprietary libraries that do not normally
|
||||
accompany the operating system. Such a contradiction means you cannot
|
||||
use both them and the Library together in an executable that you
|
||||
distribute.
|
||||
|
||||
7. You may place library facilities that are a work based on the
|
||||
Library side-by-side in a single library together with other library
|
||||
facilities not covered by this License, and distribute such a combined
|
||||
library, provided that the separate distribution of the work based on
|
||||
the Library and of the other library facilities is otherwise
|
||||
permitted, and provided that you do these two things:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work
|
||||
based on the Library, uncombined with any other library
|
||||
facilities. This must be distributed under the terms of the
|
||||
Sections above.
|
||||
|
||||
b) Give prominent notice with the combined library of the fact
|
||||
that part of it is a work based on the Library, and explaining
|
||||
where to find the accompanying uncombined form of the same work.
|
||||
|
||||
8. You may not copy, modify, sublicense, link with, or distribute
|
||||
the Library except as expressly provided under this License. Any
|
||||
attempt otherwise to copy, modify, sublicense, link with, or
|
||||
distribute the Library is void, and will automatically terminate your
|
||||
rights under this License. However, parties who have received copies,
|
||||
or rights, from you under this License will not have their licenses
|
||||
terminated so long as such parties remain in full compliance.
|
||||
|
||||
9. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Library or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Library (or any work based on the
|
||||
Library), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Library or works based on it.
|
||||
|
||||
10. Each time you redistribute the Library (or any work based on the
|
||||
Library), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute, link with or modify the Library
|
||||
subject to these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties with
|
||||
this License.
|
||||
|
||||
11. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Library at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Library by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Library.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under any
|
||||
particular circumstance, the balance of the section is intended to apply,
|
||||
and the section as a whole is intended to apply in other circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
12. If the distribution and/or use of the Library is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Library under this License may add
|
||||
an explicit geographical distribution limitation excluding those countries,
|
||||
so that distribution is permitted only in or among countries not thus
|
||||
excluded. In such case, this License incorporates the limitation as if
|
||||
written in the body of this License.
|
||||
|
||||
13. The Free Software Foundation may publish revised and/or new
|
||||
versions of the Lesser General Public License from time to time.
|
||||
Such new versions will be similar in spirit to the present version,
|
||||
but may differ in detail to address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Library
|
||||
specifies a version number of this License which applies to it and
|
||||
"any later version", you have the option of following the terms and
|
||||
conditions either of that version or of any later version published by
|
||||
the Free Software Foundation. If the Library does not specify a
|
||||
license version number, you may choose any version ever published by
|
||||
the Free Software Foundation.
|
||||
|
||||
14. If you wish to incorporate parts of the Library into other free
|
||||
programs whose distribution conditions are incompatible with these,
|
||||
write to the author to ask for permission. For software which is
|
||||
copyrighted by the Free Software Foundation, write to the Free
|
||||
Software Foundation; we sometimes make exceptions for this. Our
|
||||
decision will be guided by the two goals of preserving the free status
|
||||
of all derivatives of our free software and of promoting the sharing
|
||||
and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
||||
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
||||
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
|
||||
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
|
||||
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
|
||||
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
||||
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
|
||||
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
|
||||
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
|
||||
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
|
||||
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
|
||||
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
|
||||
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
|
||||
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
||||
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Libraries
|
||||
|
||||
If you develop a new library, and you want it to be of the greatest
|
||||
possible use to the public, we recommend making it free software that
|
||||
everyone can redistribute and change. You can do so by permitting
|
||||
redistribution under these terms (or, alternatively, under the terms of the
|
||||
ordinary General Public License).
|
||||
|
||||
To apply these terms, attach the following notices to the library. It is
|
||||
safest to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least the
|
||||
"copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the library's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the library, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the
|
||||
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1990
|
||||
Ty Coon, President of Vice
|
||||
|
||||
That's all there is to it!
|
||||
197
application/admin/controller/orders/Abnormal.php
Normal file
|
|
@ -0,0 +1,197 @@
|
|||
<?php
|
||||
|
||||
namespace app\admin\controller\orders;
|
||||
|
||||
use app\admin\model\Order;
|
||||
use app\common\controller\Backend;
|
||||
use think\Db;
|
||||
use think\Exception;
|
||||
use think\exception\DbException;
|
||||
use think\exception\PDOException;
|
||||
use think\exception\ValidateException;
|
||||
|
||||
/**
|
||||
* 订单异常记录
|
||||
*
|
||||
* @icon fa fa-circle-o
|
||||
*/
|
||||
class Abnormal extends Backend
|
||||
{
|
||||
|
||||
/**
|
||||
* OrderAbnormal模型对象
|
||||
* @var \app\admin\model\OrderAbnormal
|
||||
*/
|
||||
protected $model = null;
|
||||
|
||||
protected $searchFields = 'order.order_no,order.tel,order.customer';
|
||||
|
||||
protected $relationSearch = true;
|
||||
|
||||
public function _initialize()
|
||||
{
|
||||
parent::_initialize();
|
||||
$this->model = new \app\admin\model\OrderAbnormal;
|
||||
$this->view->assign("statusList", $this->model->getStatusList());
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个基础方法、destroy/restore/recyclebin三个回收站方法
|
||||
* 因此在当前控制器中可不用编写增删改查的代码,除非需要自己控制这部分逻辑
|
||||
* 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* 查看
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
//当前是否为关联查询
|
||||
$this->relationSearch = true;
|
||||
//设置过滤方法
|
||||
$this->request->filter(['strip_tags', 'trim']);
|
||||
if ($this->request->isAjax()) {
|
||||
//如果发送的来源是Selectpage,则转发到Selectpage
|
||||
if ($this->request->request('keyField')) {
|
||||
return $this->selectpage();
|
||||
}
|
||||
list($where, $sort, $order, $offset, $limit) = $this->buildparams();
|
||||
|
||||
$list = $this->model
|
||||
->with(['order','abnormal'])
|
||||
->where($where)
|
||||
->order($sort, $order)
|
||||
->paginate($limit);
|
||||
|
||||
foreach ($list as $row) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
$result = array("total" => $list->total(), "rows" => $list->items());
|
||||
|
||||
return json($result);
|
||||
}
|
||||
return $this->view->fetch();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 添加
|
||||
*
|
||||
* @return string
|
||||
* @throws \think\Exception
|
||||
*/
|
||||
public function add()
|
||||
{
|
||||
if (false === $this->request->isPost()) {
|
||||
|
||||
$order_id = $this->request->get('order_id');
|
||||
|
||||
$this->assign('order_id',$order_id);
|
||||
|
||||
return $this->view->fetch();
|
||||
}
|
||||
$params = $this->request->post('row/a');
|
||||
if (empty($params)) {
|
||||
$this->error(__('Parameter %s can not be empty', ''));
|
||||
}
|
||||
$params = $this->preExcludeFields($params);
|
||||
|
||||
if ($this->dataLimit && $this->dataLimitFieldAutoFill) {
|
||||
$params[$this->dataLimitField] = $this->auth->id;
|
||||
}
|
||||
$result = false;
|
||||
Db::startTrans();
|
||||
try {
|
||||
//是否采用模型验证
|
||||
if ($this->modelValidate) {
|
||||
$name = str_replace("\\model\\", "\\validate\\", get_class($this->model));
|
||||
$validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.add' : $name) : $this->modelValidate;
|
||||
$this->model->validateFailException()->validate($validate);
|
||||
}
|
||||
|
||||
$order = Order::where('id',$params['order_id'])->find();
|
||||
if(empty($order)){
|
||||
throw new Exception('请选择订单');
|
||||
}
|
||||
|
||||
$abnormal_title = \app\admin\model\Abnormal::where('id',$params['abnormal_id'])->value('title');
|
||||
|
||||
$params['abnormal_title'] = $abnormal_title;
|
||||
$params['admin_id'] = $this->auth->id;
|
||||
$params['admin_user'] = $this->auth->username;
|
||||
$result = $this->model->allowField(true)->save($params);
|
||||
Db::commit();
|
||||
} catch (ValidateException|PDOException|Exception $e) {
|
||||
Db::rollback();
|
||||
throw $e;
|
||||
$this->error($e->getMessage());
|
||||
}
|
||||
if ($result === false) {
|
||||
$this->error(__('No rows were inserted'));
|
||||
}
|
||||
$this->success();
|
||||
}
|
||||
|
||||
/**
|
||||
* 编辑
|
||||
*
|
||||
* @param $ids
|
||||
* @return string
|
||||
* @throws DbException
|
||||
* @throws \think\Exception
|
||||
*/
|
||||
public function edit($ids = null)
|
||||
{
|
||||
$row = $this->model->get($ids);
|
||||
if (!$row) {
|
||||
$this->error(__('No Results were found'));
|
||||
}
|
||||
$adminIds = $this->getDataLimitAdminIds();
|
||||
if (is_array($adminIds) && !in_array($row[$this->dataLimitField], $adminIds)) {
|
||||
$this->error(__('You have no permission'));
|
||||
}
|
||||
if (false === $this->request->isPost()) {
|
||||
$this->view->assign('row', $row);
|
||||
|
||||
$status = $this->model->getStatusList();
|
||||
unset($status[0]);
|
||||
|
||||
$this->view->assign("statusList", $status);
|
||||
|
||||
return $this->view->fetch();
|
||||
}
|
||||
$params = $this->request->post('row/a');
|
||||
if (empty($params)) {
|
||||
$this->error(__('Parameter %s can not be empty', ''));
|
||||
}
|
||||
$params = $this->preExcludeFields($params);
|
||||
$result = false;
|
||||
Db::startTrans();
|
||||
try {
|
||||
//是否采用模型验证
|
||||
if ($this->modelValidate) {
|
||||
$name = str_replace("\\model\\", "\\validate\\", get_class($this->model));
|
||||
$validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.edit' : $name) : $this->modelValidate;
|
||||
$row->validateFailException()->validate($validate);
|
||||
}
|
||||
$params['handle_admin_id'] = $this->auth->id;
|
||||
$params['handle_admin_user'] = $this->auth->username;
|
||||
$params['handle_time'] = date('Y-m-d H:i:s');
|
||||
$result = $row->allowField(true)->save($params);
|
||||
Db::commit();
|
||||
} catch (ValidateException|PDOException|Exception $e) {
|
||||
Db::rollback();
|
||||
$this->error($e->getMessage());
|
||||
}
|
||||
if (false === $result) {
|
||||
$this->error(__('No rows were updated'));
|
||||
}
|
||||
$this->success();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -12,6 +12,9 @@ use app\common\controller\Backend;
|
|||
class Income extends Backend
|
||||
{
|
||||
|
||||
|
||||
protected $searchFields = 'order_no,tel';
|
||||
|
||||
/**
|
||||
* OrderIncome模型对象
|
||||
* @var \app\admin\model\OrderIncome
|
||||
|
|
|
|||
37
application/admin/controller/setting/Abnormal.php
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
<?php
|
||||
|
||||
namespace app\admin\controller\setting;
|
||||
|
||||
use app\common\controller\Backend;
|
||||
|
||||
/**
|
||||
* 订单异常配置
|
||||
*
|
||||
* @icon fa fa-circle-o
|
||||
*/
|
||||
class Abnormal extends Backend
|
||||
{
|
||||
|
||||
/**
|
||||
* Abnormal模型对象
|
||||
* @var \app\admin\model\Abnormal
|
||||
*/
|
||||
protected $model = null;
|
||||
|
||||
public function _initialize()
|
||||
{
|
||||
parent::_initialize();
|
||||
$this->model = new \app\admin\model\Abnormal;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个基础方法、destroy/restore/recyclebin三个回收站方法
|
||||
* 因此在当前控制器中可不用编写增删改查的代码,除非需要自己控制这部分逻辑
|
||||
* 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
|
||||
*/
|
||||
|
||||
|
||||
}
|
||||
77
application/admin/lang/zh-cn/orders/abnormal.php
Normal file
|
|
@ -0,0 +1,77 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
'Id' => 'ID',
|
||||
'Order_id' => '订单ID',
|
||||
'Status' => '处理进度',
|
||||
'Status 0' => '待处理',
|
||||
'Set status to 0' => '设为待处理',
|
||||
'Status 1' => '已处理',
|
||||
'Set status to 1' => '设为已处理',
|
||||
'Status -1' => '不予处理',
|
||||
'Set status to -1' => '设为不予处理',
|
||||
'Abnormal_id' => '异常类型',
|
||||
'Abnormal_title' => '异常类型',
|
||||
'Detail' => '异常详情',
|
||||
'Handle_detail' => '处理详情',
|
||||
'Handle_admin_user' => '处理人',
|
||||
'Handle_time' => '处理时间',
|
||||
'Admin_user' => '创建人姓名',
|
||||
'Admin_id' => '创建人',
|
||||
'Create_time' => '创建时间',
|
||||
'Update_time' => '编辑时间',
|
||||
'Order.id' => 'ID',
|
||||
'Order.order_no' => '订单号',
|
||||
'Order.customer' => '客户姓名',
|
||||
'Order.tel' => '客户电话',
|
||||
'Order.status' => '订单状态',
|
||||
'Order.status 10' => '未派单',
|
||||
'Order.status 20' => '已派单',
|
||||
'Order.status 30' => '已接单',
|
||||
'Order.status 40' => '处理中',
|
||||
'Order.status 50' => '已完成',
|
||||
'Order.status -10' => '取消',
|
||||
'Order.status -20' => '作废',
|
||||
'Order.status -30' => '已拒接',
|
||||
'Order.area_id' => '地域',
|
||||
'Order.address' => '详细地址',
|
||||
'Order.work_tel_id' => '工作机',
|
||||
'Order.worker_id' => '师傅ID',
|
||||
'Order.worker_name' => '师傅姓名',
|
||||
'Order.worker_tel' => '师傅手机',
|
||||
'Order.source' => '订单来源',
|
||||
'Order.source_uid' => '来源UID',
|
||||
'Order.service_id' => '服务ID',
|
||||
'Order.service_title' => '服务名称',
|
||||
'Order.detail' => '订单详情',
|
||||
'Order.remark' => '订单备注',
|
||||
'Order.images' => '图片',
|
||||
'Order.collect' => '是否收藏',
|
||||
'Order.collect 0' => '否',
|
||||
'Order.collect 1' => '是',
|
||||
'Order.collect_remark' => '收藏备注',
|
||||
'Order.enter_admin_id' => '录单员ID',
|
||||
'Order.dispatch_admin_id' => '派单员ID',
|
||||
'Order.dispatch_type' => '派单方式',
|
||||
'Order.dispatch_type 10' => '线上手动',
|
||||
'Order.dispatch_type 11' => '线上自动',
|
||||
'Order.dispatch_type 20' => '线下',
|
||||
'Order.total' => '总收款',
|
||||
'Order.cost' => '成本',
|
||||
'Order.performance' => '绩效',
|
||||
'Order.sb_amount' => '垫付',
|
||||
'Order.real_amount' => '实付',
|
||||
'Order.cancel_reason_id' => '取消原因',
|
||||
'Order.cancel_detail' => '取消详情',
|
||||
'Order.abolish_reason_id' => '作废原因',
|
||||
'Order.abolish_detail' => '作废详情',
|
||||
'Order.create_time' => '录单时间',
|
||||
'Order.update_time' => '更新时间',
|
||||
'Order.payment_time' => '付款时间',
|
||||
'Order.finishe_time' => '完成时间',
|
||||
'Order.dispatch_time' => '派单时间',
|
||||
'Order.delete_time' => '删除时间',
|
||||
'Abnormal.id' => 'ID',
|
||||
'Abnormal.title' => '异常名称',
|
||||
'Abnormal.sort' => '排序'
|
||||
];
|
||||
7
application/admin/lang/zh-cn/setting/abnormal.php
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
'Id' => 'ID',
|
||||
'Title' => '异常名称',
|
||||
'Sort' => '排序'
|
||||
];
|
||||
40
application/admin/model/Abnormal.php
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
<?php
|
||||
|
||||
namespace app\admin\model;
|
||||
|
||||
use think\Model;
|
||||
|
||||
|
||||
class Abnormal extends Model
|
||||
{
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// 表名
|
||||
protected $name = 'abnormal';
|
||||
|
||||
// 自动写入时间戳字段
|
||||
protected $autoWriteTimestamp = false;
|
||||
|
||||
// 定义时间戳字段名
|
||||
protected $createTime = false;
|
||||
protected $updateTime = false;
|
||||
protected $deleteTime = false;
|
||||
|
||||
// 追加属性
|
||||
protected $append = [
|
||||
|
||||
];
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
62
application/admin/model/OrderAbnormal.php
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
<?php
|
||||
|
||||
namespace app\admin\model;
|
||||
|
||||
use think\Model;
|
||||
|
||||
|
||||
class OrderAbnormal extends Model
|
||||
{
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// 表名
|
||||
protected $name = 'order_abnormal';
|
||||
|
||||
// 自动写入时间戳字段
|
||||
protected $autoWriteTimestamp = 'datetime';
|
||||
|
||||
protected $dateFormat = 'Y-m-d H:i:s';
|
||||
|
||||
// 定义时间戳字段名
|
||||
protected $createTime = 'create_time';
|
||||
protected $updateTime = 'update_time';
|
||||
protected $deleteTime = false;
|
||||
|
||||
// 追加属性
|
||||
protected $append = [
|
||||
'status_text'
|
||||
];
|
||||
|
||||
|
||||
|
||||
public function getStatusList()
|
||||
{
|
||||
return ['0' => __('Status 0'), '1' => __('Status 1'), '-1' => __('Status -1')];
|
||||
}
|
||||
|
||||
|
||||
public function getStatusTextAttr($value, $data)
|
||||
{
|
||||
$value = $value ?: ($data['status'] ?? '');
|
||||
$list = $this->getStatusList();
|
||||
return $list[$value] ?? '';
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
public function order()
|
||||
{
|
||||
return $this->belongsTo('Order', 'order_id', 'id', [], 'LEFT')->setEagerlyType(0);
|
||||
}
|
||||
|
||||
|
||||
public function abnormal()
|
||||
{
|
||||
return $this->belongsTo('Abnormal', 'abnormal_id', 'id', [], 'LEFT')->setEagerlyType(0);
|
||||
}
|
||||
}
|
||||
27
application/admin/validate/Abnormal.php
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
<?php
|
||||
|
||||
namespace app\admin\validate;
|
||||
|
||||
use think\Validate;
|
||||
|
||||
class Abnormal extends Validate
|
||||
{
|
||||
/**
|
||||
* 验证规则
|
||||
*/
|
||||
protected $rule = [
|
||||
];
|
||||
/**
|
||||
* 提示消息
|
||||
*/
|
||||
protected $message = [
|
||||
];
|
||||
/**
|
||||
* 验证场景
|
||||
*/
|
||||
protected $scene = [
|
||||
'add' => [],
|
||||
'edit' => [],
|
||||
];
|
||||
|
||||
}
|
||||
27
application/admin/validate/OrderAbnormal.php
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
<?php
|
||||
|
||||
namespace app\admin\validate;
|
||||
|
||||
use think\Validate;
|
||||
|
||||
class OrderAbnormal extends Validate
|
||||
{
|
||||
/**
|
||||
* 验证规则
|
||||
*/
|
||||
protected $rule = [
|
||||
];
|
||||
/**
|
||||
* 提示消息
|
||||
*/
|
||||
protected $message = [
|
||||
];
|
||||
/**
|
||||
* 验证场景
|
||||
*/
|
||||
protected $scene = [
|
||||
'add' => [],
|
||||
'edit' => [],
|
||||
];
|
||||
|
||||
}
|
||||
39
application/admin/view/orders/abnormal/add.html
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
<form id="add-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
|
||||
|
||||
|
||||
{empty name='order_id'}
|
||||
|
||||
<div class="form-group">
|
||||
<label class="control-label col-xs-12 col-sm-2">{:__('Order_id')}:</label>
|
||||
<div class="col-xs-12 col-sm-8">
|
||||
<input id="c-order_id" data-rule="required" data-field="order_no" data-source="order/index" class="form-control selectpage" name="row[order_id]" type="text" value="">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{else /}
|
||||
|
||||
<input type="hidden" name="row[order_id]" value="{$order_id}" >
|
||||
|
||||
{/empty}
|
||||
|
||||
<div class="form-group">
|
||||
<label class="control-label col-xs-12 col-sm-2">{:__('Abnormal_id')}:</label>
|
||||
<div class="col-xs-12 col-sm-8">
|
||||
<input id="c-abnormal_id" data-field="title" data-rule="required" data-source="setting/abnormal/index" class="form-control selectpage" name="row[abnormal_id]" type="text" value="">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label class="control-label col-xs-12 col-sm-2">{:__('Detail')}:</label>
|
||||
<div class="col-xs-12 col-sm-8">
|
||||
<textarea id="c-detail" data-rule="required" class="form-control editor" rows="5" name="row[detail]" cols="50"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group layer-footer">
|
||||
<label class="control-label col-xs-12 col-sm-2"></label>
|
||||
<div class="col-xs-12 col-sm-8">
|
||||
<button type="submit" class="btn btn-primary btn-embossed disabled">{:__('OK')}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
50
application/admin/view/orders/abnormal/edit.html
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
<form id="edit-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
|
||||
|
||||
<div class="form-group">
|
||||
<label class="control-label col-xs-12 col-sm-2">{:__('Abnormal_title')}:</label>
|
||||
<div class="col-xs-12 col-sm-8" >
|
||||
<div style="padding-top: 5px;">
|
||||
{$row.abnormal_title|htmlentities}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label class="control-label col-xs-12 col-sm-2">{:__('Detail')}:</label>
|
||||
<div class="col-xs-12 col-sm-8">
|
||||
<div style="padding-top: 5px;">
|
||||
{$row.detail|htmlentities}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label class="control-label col-xs-12 col-sm-2">{:__('Status')}:</label>
|
||||
<div class="col-xs-12 col-sm-8">
|
||||
|
||||
<div class="radio">
|
||||
<label for="row[status]-1"><input id="row[status]-1" name="row[status]" type="radio" value="1" checked /> 设为已处理</label>
|
||||
<label for="row[status]--1"><input id="row[status]--1" name="row[status]" type="radio" value="-1" /> 设为不予处理</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
<div class="form-group">
|
||||
<label class="control-label col-xs-12 col-sm-2">{:__('Handle_detail')}:</label>
|
||||
<div class="col-xs-12 col-sm-8">
|
||||
<textarea id="c-handle_detail" class="form-control editor" rows="5" name="row[handle_detail]" cols="50">{$row.handle_detail|htmlentities}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="form-group layer-footer">
|
||||
<label class="control-label col-xs-12 col-sm-2"></label>
|
||||
<div class="col-xs-12 col-sm-8">
|
||||
<button type="submit" class="btn btn-primary btn-embossed disabled">{:__('OK')}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
46
application/admin/view/orders/abnormal/index.html
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
<div class="panel panel-default panel-intro">
|
||||
|
||||
<div class="panel-heading">
|
||||
{:build_heading(null,FALSE)}
|
||||
<ul class="nav nav-tabs" data-field="status">
|
||||
<li class="{:$Think.get.status === null ? 'active' : ''}"><a href="#t-all" data-value="" data-toggle="tab">{:__('All')}</a></li>
|
||||
{foreach name="statusList" item="vo"}
|
||||
<li class="{:$Think.get.status === (string)$key ? 'active' : ''}"><a href="#t-{$key}" data-value="{$key}" data-toggle="tab">{$vo}</a></li>
|
||||
{/foreach}
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="panel-body">
|
||||
<div id="myTabContent" class="tab-content">
|
||||
<div class="tab-pane fade active in" id="one">
|
||||
<div class="widget-body no-padding">
|
||||
<div id="toolbar" class="toolbar">
|
||||
<a href="javascript:;" class="btn btn-primary btn-refresh" title="{:__('Refresh')}" ><i class="fa fa-refresh"></i> </a>
|
||||
<a href="javascript:;" class="btn btn-success btn-add {:$auth->check('orders/abnormal/add')?'':'hide'}" title="{:__('Add')}" ><i class="fa fa-plus"></i> {:__('Add')}</a>
|
||||
<!-- <a href="javascript:;" class="btn btn-success btn-edit btn-disabled disabled {:$auth->check('orders/abnormal/edit')?'':'hide'}" title="{:__('Edit')}" ><i class="fa fa-pencil"></i> {:__('Edit')}</a>-->
|
||||
<!-- <a href="javascript:;" class="btn btn-danger btn-del btn-disabled disabled {:$auth->check('orders/abnormal/del')?'':'hide'}" title="{:__('Delete')}" ><i class="fa fa-trash"></i> {:__('Delete')}</a>-->
|
||||
<!-- -->
|
||||
|
||||
<!-- <div class="dropdown btn-group {:$auth->check('orders/abnormal/multi')?'':'hide'}">-->
|
||||
<!-- <a class="btn btn-primary btn-more dropdown-toggle btn-disabled disabled" data-toggle="dropdown"><i class="fa fa-cog"></i> {:__('More')}</a>-->
|
||||
<!-- <ul class="dropdown-menu text-left" role="menu">-->
|
||||
<!-- {foreach name="statusList" item="vo"}-->
|
||||
<!-- <li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:" data-params="status={$key}">{:__('Set status to ' . $key)}</a></li>-->
|
||||
<!-- {/foreach}-->
|
||||
<!-- </ul>-->
|
||||
<!-- </div>-->
|
||||
|
||||
|
||||
</div>
|
||||
<table id="table" class="table table-striped table-bordered table-hover table-nowrap"
|
||||
data-operate-edit="{:$auth->check('orders/abnormal/edit')}"
|
||||
data-operate-del="{:$auth->check('orders/abnormal/del')}"
|
||||
width="100%">
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
21
application/admin/view/setting/abnormal/add.html
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
<form id="add-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
|
||||
|
||||
<div class="form-group">
|
||||
<label class="control-label col-xs-12 col-sm-2">{:__('Title')}:</label>
|
||||
<div class="col-xs-12 col-sm-8">
|
||||
<input id="c-title" data-rule="required" class="form-control" name="row[title]" type="text" value="">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-xs-12 col-sm-2">{:__('Sort')}:</label>
|
||||
<div class="col-xs-12 col-sm-8">
|
||||
<input id="c-sort" data-rule="required" class="form-control" name="row[sort]" type="number" value="0">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group layer-footer">
|
||||
<label class="control-label col-xs-12 col-sm-2"></label>
|
||||
<div class="col-xs-12 col-sm-8">
|
||||
<button type="submit" class="btn btn-primary btn-embossed disabled">{:__('OK')}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
21
application/admin/view/setting/abnormal/edit.html
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
<form id="edit-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
|
||||
|
||||
<div class="form-group">
|
||||
<label class="control-label col-xs-12 col-sm-2">{:__('Title')}:</label>
|
||||
<div class="col-xs-12 col-sm-8">
|
||||
<input id="c-title" data-rule="required" class="form-control" name="row[title]" type="text" value="{$row.title|htmlentities}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="control-label col-xs-12 col-sm-2">{:__('Sort')}:</label>
|
||||
<div class="col-xs-12 col-sm-8">
|
||||
<input id="c-sort" data-rule="required" class="form-control" name="row[sort]" type="number" value="{$row.sort|htmlentities}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group layer-footer">
|
||||
<label class="control-label col-xs-12 col-sm-2"></label>
|
||||
<div class="col-xs-12 col-sm-8">
|
||||
<button type="submit" class="btn btn-primary btn-embossed disabled">{:__('OK')}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
29
application/admin/view/setting/abnormal/index.html
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
<div class="panel panel-default panel-intro">
|
||||
{:build_heading()}
|
||||
|
||||
<div class="panel-body">
|
||||
<div id="myTabContent" class="tab-content">
|
||||
<div class="tab-pane fade active in" id="one">
|
||||
<div class="widget-body no-padding">
|
||||
<div id="toolbar" class="toolbar">
|
||||
<a href="javascript:;" class="btn btn-primary btn-refresh" title="{:__('Refresh')}" ><i class="fa fa-refresh"></i> </a>
|
||||
<a href="javascript:;" class="btn btn-success btn-add {:$auth->check('setting/abnormal/add')?'':'hide'}" title="{:__('Add')}" ><i class="fa fa-plus"></i> {:__('Add')}</a>
|
||||
<a href="javascript:;" class="btn btn-success btn-edit btn-disabled disabled {:$auth->check('setting/abnormal/edit')?'':'hide'}" title="{:__('Edit')}" ><i class="fa fa-pencil"></i> {:__('Edit')}</a>
|
||||
<a href="javascript:;" class="btn btn-danger btn-del btn-disabled disabled {:$auth->check('setting/abnormal/del')?'':'hide'}" title="{:__('Delete')}" ><i class="fa fa-trash"></i> {:__('Delete')}</a>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
<table id="table" class="table table-striped table-bordered table-hover table-nowrap"
|
||||
data-operate-edit="{:$auth->check('setting/abnormal/edit')}"
|
||||
data-operate-del="{:$auth->check('setting/abnormal/del')}"
|
||||
width="100%">
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -2,7 +2,11 @@
|
|||
|
||||
return [
|
||||
'autoload' => false,
|
||||
'hooks' => [],
|
||||
'hooks' => [
|
||||
'config_init' => [
|
||||
'nkeditor',
|
||||
],
|
||||
],
|
||||
'route' => [],
|
||||
'priority' => [],
|
||||
'domain' => '',
|
||||
|
|
|
|||
64
public/assets/addons/nkeditor/css/common.css
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
|
||||
.ke-container-black .ke-toolbar .ke-icon-remoteimage {
|
||||
background-image: url(../img/download.png);
|
||||
background-size: 16px 16px;
|
||||
}
|
||||
|
||||
.ke-container-black .ke-toolbar .ke-icon-search {
|
||||
background-image: url(../img/search.png);
|
||||
background-position: 0 0;
|
||||
background-size: 16px 16px;
|
||||
}
|
||||
|
||||
|
||||
.ke-container-black .ke-toolbar .ke-icon-math {
|
||||
background-image: url(../img/math.png);
|
||||
background-position: 0 0;
|
||||
background-size: 16px 16px;
|
||||
}
|
||||
|
||||
|
||||
body.darktheme .ke-toolbar {
|
||||
filter: invert(1) hue-rotate(180deg);
|
||||
background-color: #fff;
|
||||
border-top-color: #fff;
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
body.darktheme .ke-toolbar .ke-icon-image {
|
||||
filter: invert(1) hue-rotate(180deg);
|
||||
}
|
||||
|
||||
body.darktheme .ke-menu, body.darktheme .ke-colorpicker {
|
||||
filter: invert(1) hue-rotate(180deg);
|
||||
}
|
||||
|
||||
body.darktheme .ke-menu img {
|
||||
filter: invert(1) hue-rotate(180deg);
|
||||
}
|
||||
|
||||
body.darktheme .ke-dialog, body.darktheme .uedbody {
|
||||
filter: invert(1) hue-rotate(180deg);
|
||||
}
|
||||
|
||||
body.darktheme .ke-dialog img, body.darktheme .uedbody img {
|
||||
filter: invert(1) hue-rotate(180deg);
|
||||
}
|
||||
|
||||
body.darktheme .uedbody .wrapper {
|
||||
background-color: #fff;
|
||||
}
|
||||
|
||||
body.darktheme .ke-container {
|
||||
border-color: #262626;
|
||||
background-color: #262626;
|
||||
}
|
||||
|
||||
body.darktheme .ke-container .ke-edit {
|
||||
background-color: #262626;
|
||||
}
|
||||
|
||||
body.darktheme .ke-container .ke-edit .ke-edit-textarea {
|
||||
background-color: #404040;
|
||||
color: #ccc;
|
||||
}
|
||||
0
public/assets/addons/nkeditor/css/richtext.css
Normal file
BIN
public/assets/addons/nkeditor/img/download.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
public/assets/addons/nkeditor/img/downloading.png
Normal file
|
After Width: | Height: | Size: 8.6 KiB |
BIN
public/assets/addons/nkeditor/img/math.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
public/assets/addons/nkeditor/img/search.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
231
public/assets/addons/nkeditor/js/customplugin.js
Normal file
|
|
@ -0,0 +1,231 @@
|
|||
define(['nkeditor-core'], function (Nkeditor) {
|
||||
|
||||
Nkeditor.lang({
|
||||
remoteimage: '下载远程图片',
|
||||
search: '查找替换',
|
||||
math: '插入公式',
|
||||
});
|
||||
|
||||
var getImageFromUrl = function (url, callback) {
|
||||
var req = new XMLHttpRequest();
|
||||
req.open("GET", Fast.api.fixurl("/addons/nkeditor/index/download") + "?url=" + encodeURIComponent(url), true);
|
||||
req.responseType = "blob";
|
||||
req.onload = function (event) {
|
||||
var file;
|
||||
if (req.status >= 200 && req.status < 300 || req.status == 304) {
|
||||
var blob = req.response;
|
||||
var mimetype = blob.type || "image/png";
|
||||
var mimetypeArr = mimetype.split("/");
|
||||
if (mimetypeArr[0].toLowerCase() === 'image') {
|
||||
console.log(mimetypeArr, mimetype);
|
||||
var suffix = ['jpeg', 'jpg', 'bmp', 'gif', 'png', 'webp', 'svg+xml'].indexOf(mimetypeArr[1]) > -1 ? mimetypeArr[1] : 'png';
|
||||
suffix = suffix === 'svg+xml' ? 'svg' : suffix;
|
||||
var filename = Math.random().toString(36).substring(5, 15) + "." + suffix;
|
||||
file = new File([blob], filename, {type: mimetype});
|
||||
}
|
||||
}
|
||||
callback.call(this, file);
|
||||
};
|
||||
req.send();
|
||||
return;
|
||||
};
|
||||
|
||||
Nkeditor.plugin('multiimage', function (K) {
|
||||
var self = this, name = 'multiimage', lang = self.lang(name + '.'),
|
||||
allowImages = K.undef(self.allowImages, false);
|
||||
|
||||
var click = function () {
|
||||
|
||||
var html = [
|
||||
'<div class="ke-dialog-content-inner">',
|
||||
'<div class="ke-dialog-row ke-clearfix">',
|
||||
'<div class=""><div class="ke-inline-block ke-upload-button">' +
|
||||
'<form class="ke-upload-area ke-form nice-validator n-default" method="post" enctype="multipart/form-data" style="width: 266px;margin:50px auto;">' +
|
||||
'<span class="ke-button-common"><input type="button" class="ke-button-common ke-button" value="批量上传图片" style="width:128px;"></span><input type="file" class="ke-upload-file" name="imgFiles" multiple style="width:128px;left:0;right:inherit" tabindex="-1">' +
|
||||
'<span class="ke-button-common" style="margin-left:10px;"><input type="button" class="ke-button-common ke-button ke-select-image" style="width:128px;" value="从图片空间选择"></span>' +
|
||||
'</form>' +
|
||||
'</div></span></div>',
|
||||
'</div>',
|
||||
'</div>'
|
||||
].join('');
|
||||
var dialog = self.createDialog({
|
||||
name: name,
|
||||
width: Math.min(document.body.clientWidth, 450),
|
||||
height: 260,
|
||||
title: self.lang(name),
|
||||
body: html,
|
||||
noBtn: {
|
||||
name: self.lang('no'),
|
||||
click: function (e) {
|
||||
self.hideDialog().focus();
|
||||
}
|
||||
}
|
||||
}),
|
||||
div = dialog.div;
|
||||
$("input[name=imgFiles]", div).change(function () {
|
||||
dialog.showLoading();
|
||||
var files = $(this).prop('files');
|
||||
self.options.uploadFiles.call(self, files).then(function(){
|
||||
self.hideDialog().focus();
|
||||
});
|
||||
return false;
|
||||
});
|
||||
$(".ke-select-image", div).click(function () {
|
||||
self.loadPlugin('filemanager', function () {
|
||||
self.plugin.filemanagerDialog({
|
||||
dirName: 'image',
|
||||
multiple: true,
|
||||
clickFn: function (urls) {
|
||||
$.each(urls, function (i, url) {
|
||||
self.exec('insertimage', Config.nkeditor.fullmode ? Fast.api.cdnurl(url, true) : Fast.api.cdnurl(url));
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
self.hideDialog().focus();
|
||||
});
|
||||
};
|
||||
self.clickToolbar(name, click);
|
||||
});
|
||||
|
||||
//远程下载图片
|
||||
Nkeditor.plugin('remoteimage', function (K) {
|
||||
var editor = this, name = 'remoteimage';
|
||||
var Upload = require('upload');
|
||||
editor.plugin.remoteimage = {
|
||||
download: function (e) {
|
||||
var that = this;
|
||||
var html = that.html();
|
||||
var staging = {}, orgined = {}, index = 0, images = 0, completed = 0, failured = 0;
|
||||
var checkrestore = function () {
|
||||
if (completed + failured >= images) {
|
||||
$.each(staging, function (i, j) {
|
||||
that.html(that.html().replace("<code>" + i + "</code>", j));
|
||||
});
|
||||
Toastr.info("成功:" + completed + " 失败:" + failured);
|
||||
}
|
||||
};
|
||||
html.replace(/<code>([\s\S]*?)<\/code>/g, function (code) {
|
||||
staging[index] = code;
|
||||
return "<code>" + index + "</code>";
|
||||
}
|
||||
);
|
||||
html = html.replace(/<img([\s\S]*?)\ssrc\s*=\s*('|")((http(s?):)([\s\S]*?))('|")([\s\S]*?)[\/]?>/g, function () {
|
||||
images++;
|
||||
var url = arguments[3];
|
||||
var placeholder = '<img src="' + Config.site.cdnurl + "/assets/addons/nkeditor/img/downloading.png" + '" data-index="' + index + '" />';
|
||||
//如果是云存储的链接或本地的链接,则忽略
|
||||
if ((Config.upload.cdnurl && url.indexOf(Config.upload.cdnurl) > -1) || url.indexOf(location.origin) > -1) {
|
||||
completed++;
|
||||
return arguments[0];
|
||||
} else {
|
||||
orgined[index] = arguments[0];
|
||||
}
|
||||
var attributes = arguments[1] + " " + arguments[8];
|
||||
attributes = attributes.replace(/'/g, '"').replace(/\sdata\-(src|original|actualsrc|ke\-src)\s*=\s*('|")(.*?)('|")/g, '');
|
||||
//下载远程图片
|
||||
(function (index, url, placeholder, attributes) {
|
||||
placeholder = new RegExp('\<img src="((?!\\<).)*?" data-index="' + index + '"(.*?)\>', 'g');
|
||||
getImageFromUrl(url, function (file) {
|
||||
if (!file) {
|
||||
failured++;
|
||||
that.html(that.html().replace(placeholder, orgined[index]));
|
||||
checkrestore();
|
||||
} else {
|
||||
Upload.api.send(file, function (data) {
|
||||
completed++;
|
||||
var replaceValue = '<img src="' + (Config.nkeditor.fullmode ? Fast.api.cdnurl(data.url, true) : Fast.api.cdnurl(data.url)) + '" ' + attributes + ' />';
|
||||
that.html(that.html().replace(placeholder, replaceValue));
|
||||
checkrestore();
|
||||
}, function (data) {
|
||||
failured++;
|
||||
that.html(that.html().replace(placeholder, orgined[index]));
|
||||
checkrestore();
|
||||
});
|
||||
}
|
||||
});
|
||||
})(index, url, placeholder, attributes);
|
||||
|
||||
index++;
|
||||
return placeholder;
|
||||
});
|
||||
if (index > 0) {
|
||||
that.html(html);
|
||||
} else {
|
||||
Toastr.info("没有需要下载的远程图片");
|
||||
}
|
||||
}
|
||||
};
|
||||
// 点击图标时执行
|
||||
editor.clickToolbar(name, editor.plugin.remoteimage.download);
|
||||
});
|
||||
|
||||
//查找替换
|
||||
Nkeditor.plugin('search', function (K) {
|
||||
var self = this, name = 'search', lang = self.lang(name + '.');
|
||||
|
||||
var click = function () {
|
||||
|
||||
var html = [
|
||||
'<div class="ke-dialog-content-inner">',
|
||||
'<div class="ke-dialog-row ke-clearfix">',
|
||||
'<div class=""><div class="ke-inline-block ke-upload-button">' +
|
||||
'<form class="ke-upload-area ke-form nice-validator n-default" method="post" style="width: 366px;margin:20px auto;">' +
|
||||
'<div style="margin-bottom:20px;color:red;">温馨提示:替换完成后务必核对最终结果是否正确</div>' +
|
||||
'<span class="ke-button-common">请输入查找的字符:<input type="text" class="ke-input-text" name="search" value="" placeholder="" style="width:220px;"></span>' +
|
||||
'<span class="ke-button-common" style="margin-top:10px;">请输入替换的字符:<input type="text" name="replace" class="ke-input-text" value="" placeholder="" style="width:220px;"></span>' +
|
||||
'</form>' +
|
||||
'</div></span></div>',
|
||||
'</div>',
|
||||
'</div>'
|
||||
].join('');
|
||||
var dialog = self.createDialog({
|
||||
name: name,
|
||||
width: Math.min(document.body.clientWidth, 450),
|
||||
height: 260,
|
||||
title: self.lang(name),
|
||||
body: html,
|
||||
yesBtn: {
|
||||
name: self.lang('yes'),
|
||||
click: function (e) {
|
||||
var search = $("input[name=search]", self.bodyDiv).val();
|
||||
var replace = $("input[name=replace]", self.bodyDiv).val();
|
||||
if (search === '') {
|
||||
Layer.msg("查找的字符不能为空");
|
||||
return false;
|
||||
}
|
||||
if (search === replace) {
|
||||
Layer.msg("查找的字符不能等于替换的字符");
|
||||
return false;
|
||||
}
|
||||
var html = self.html();
|
||||
if (html === '') {
|
||||
Layer.msg("暂无可替换的文本");
|
||||
}
|
||||
var searchExp = new RegExp("(" + search + ")(?!([^<]+)?>)", "gi");
|
||||
var matches = html.match(searchExp);
|
||||
if (matches && matches.length > 0) {
|
||||
self._firstAddBookmark = true;
|
||||
self.addBookmark(false);
|
||||
self.html(html.replace(searchExp, replace));
|
||||
Toastr.success("共完成" + matches.length + "处文本替换");
|
||||
} else {
|
||||
Layer.msg("暂未找到可替换的文本");
|
||||
}
|
||||
self.hideDialog().focus();
|
||||
}
|
||||
},
|
||||
noBtn: {
|
||||
name: self.lang('no'),
|
||||
click: function (e) {
|
||||
self.hideDialog().focus();
|
||||
}
|
||||
}
|
||||
}),
|
||||
div = dialog.div;
|
||||
};
|
||||
self.clickToolbar(name, click);
|
||||
});
|
||||
|
||||
return Nkeditor;
|
||||
});
|
||||
242
public/assets/addons/nkeditor/lang/ar.js
Normal file
|
|
@ -0,0 +1,242 @@
|
|||
/*******************************************************************************
|
||||
* KindEditor - WYSIWYG HTML Editor for Internet
|
||||
* Copyright (C) 2006-2011 kindsoft.net
|
||||
*
|
||||
* @author Roddy <luolonghao@gmail.com>
|
||||
* @site http://www.kindsoft.net/
|
||||
* @licence http://www.kindsoft.net/license.php
|
||||
* Arabic Translation By daif alotaibi (http://daif.net/)
|
||||
*******************************************************************************/
|
||||
|
||||
KindEditor.lang({
|
||||
source : 'عرض المصدر',
|
||||
preview : 'معاينة الصفحة',
|
||||
undo : 'تراجع(Ctrl+Z)',
|
||||
redo : 'إعادة التراجع(Ctrl+Y)',
|
||||
cut : 'قص(Ctrl+X)',
|
||||
copy : 'نسخ(Ctrl+C)',
|
||||
paste : 'لصق(Ctrl+V)',
|
||||
plainpaste : 'لصق كنص عادي',
|
||||
wordpaste : 'لصق من مايكروسفت ورد',
|
||||
selectall : 'تحديد الكل',
|
||||
justifyleft : 'محاذاه لليسار',
|
||||
justifycenter : 'محاذاه للوسط',
|
||||
justifyright : 'محاذاه لليمين',
|
||||
justifyfull : 'محاذاه تلقائية',
|
||||
insertorderedlist : 'قائمة مرقمه',
|
||||
insertunorderedlist : 'قائمة نقطية',
|
||||
indent : 'إزاحه النص',
|
||||
outdent : 'إلغاء الازاحة',
|
||||
subscript : 'أسفل النص',
|
||||
superscript : 'أعلى النص',
|
||||
formatblock : 'Paragraph format',
|
||||
fontname : 'نوع الخط',
|
||||
fontsize : 'حجم الخط',
|
||||
forecolor : 'لون النص',
|
||||
hilitecolor : 'لون خلفية النص',
|
||||
bold : 'عريض(Ctrl+B)',
|
||||
italic : 'مائل(Ctrl+I)',
|
||||
underline : 'خط تحت النص(Ctrl+U)',
|
||||
strikethrough : 'خط على النص',
|
||||
removeformat : 'إزالة التنسيق',
|
||||
image : 'إدراج صورة',
|
||||
multiimage : 'Multi image',
|
||||
flash : 'إدراج فلاش',
|
||||
media : 'إدراج وسائط متعددة',
|
||||
table : 'إدراج جدول',
|
||||
tablecell : 'خلية',
|
||||
hr : 'إدراج خط أفقي',
|
||||
emoticons : 'إدراج وجه ضاحك',
|
||||
link : 'رابط',
|
||||
unlink : 'إزالة الرابط',
|
||||
fullscreen : 'محرر ملئ الشاشة',
|
||||
about : 'حول',
|
||||
print : 'طباعة',
|
||||
filemanager : 'مدير الملفات',
|
||||
code : 'إدراج نص برمجي',
|
||||
map : 'خرائط قووقل',
|
||||
baidumap : 'خرائط قووقل',
|
||||
lineheight : 'إرتفاع السطر',
|
||||
clearhtml : 'مسح كود HTML',
|
||||
pagebreak : 'إدراج فاصل صفحات',
|
||||
quickformat : 'تنسيق سريع',
|
||||
insertfile : 'إدراج ملف',
|
||||
template : 'إدراج قالب',
|
||||
anchor : 'رابط',
|
||||
yes : 'موافق',
|
||||
no : 'إلغاء',
|
||||
close : 'إغلاق',
|
||||
editImage : 'خصائص الصورة',
|
||||
deleteImage : 'حذفالصورة',
|
||||
editFlash : 'خصائص الفلاش',
|
||||
deleteFlash : 'حذف الفلاش',
|
||||
editMedia : 'خصائص الوسائط',
|
||||
deleteMedia : 'حذف الوسائط',
|
||||
editLink : 'خصائص الرابط',
|
||||
deleteLink : 'إزالة الرابط',
|
||||
editAnchor : 'Anchor properties',
|
||||
deleteAnchor : 'Delete Anchor',
|
||||
tableprop : 'خصائص الجدول',
|
||||
tablecellprop : 'خصائص الخلية',
|
||||
tableinsert : 'إدراج جدول',
|
||||
tabledelete : 'حذف جدول',
|
||||
tablecolinsertleft : 'إدراج عمود لليسار',
|
||||
tablecolinsertright : 'إدراج عمود لليسار',
|
||||
tablerowinsertabove : 'إدراج صف للأعلى',
|
||||
tablerowinsertbelow : 'إدراج صف للأسفل',
|
||||
tablerowmerge : 'دمج للأسفل',
|
||||
tablecolmerge : 'دمج لليمين',
|
||||
tablerowsplit : 'تقسم الصف',
|
||||
tablecolsplit : 'تقسيم العمود',
|
||||
tablecoldelete : 'حذف العمود',
|
||||
tablerowdelete : 'حذف الصف',
|
||||
noColor : 'إفتراضي',
|
||||
pleaseSelectFile : 'Please select file.',
|
||||
invalidImg : "الرجاء إدخال رابط صحيح.\nالملفات المسموح بها: jpg,gif,bmp,png",
|
||||
invalidMedia : "الرجاء إدخال رابط صحيح.\nالملفات المسموح بها: swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb",
|
||||
invalidWidth : "العرض يجب أن يكون رقم.",
|
||||
invalidHeight : "الإرتفاع يجب أن يكون رقم.",
|
||||
invalidBorder : "عرض الحد يجب أن يكون رقم.",
|
||||
invalidUrl : "الرجاء إدخال رابط حيح.",
|
||||
invalidRows : 'صفوف غير صحيح.',
|
||||
invalidCols : 'أعمدة غير صحيحة.',
|
||||
invalidPadding : 'The padding must be number.',
|
||||
invalidSpacing : 'The spacing must be number.',
|
||||
invalidJson : 'Invalid JSON string.',
|
||||
uploadSuccess : 'تم رفع الملف بنجاح.',
|
||||
cutError : 'حاليا غير مدعومة من المتصفح, إستخدم إختصار لوحة المفاتيح (Ctrl+X).',
|
||||
copyError : 'حاليا غير مدعومة من المتصفح, إستخدم إختصار لوحة المفاتيح (Ctrl+C).',
|
||||
pasteError : 'حاليا غير مدعومة من المتصفح, إستخدم إختصار لوحة المفاتيح (Ctrl+V).',
|
||||
ajaxLoading : 'Loading ...',
|
||||
uploadLoading : 'Uploading ...',
|
||||
uploadError : 'Upload Error',
|
||||
'plainpaste.comment' : 'إستخدم إختصار لوحة المفاتيح (Ctrl+V) للصق داخل النافذة.',
|
||||
'wordpaste.comment' : 'إستخدم إختصار لوحة المفاتيح (Ctrl+V) للصق داخل النافذة.',
|
||||
'code.pleaseInput' : 'Please input code.',
|
||||
'link.url' : 'الرابط',
|
||||
'link.linkType' : 'الهدف',
|
||||
'link.newWindow' : 'نافذة جديدة',
|
||||
'link.selfWindow' : 'نفس النافذة',
|
||||
'flash.url' : 'الرابط',
|
||||
'flash.width' : 'العرض',
|
||||
'flash.height' : 'الإرتفاع',
|
||||
'flash.upload' : 'رفع',
|
||||
'flash.viewServer' : 'أستعراض',
|
||||
'media.url' : 'الرابط',
|
||||
'media.width' : 'العرض',
|
||||
'media.height' : 'الإرتفاع',
|
||||
'media.autostart' : 'تشغيل تلقائي',
|
||||
'media.upload' : 'رفع',
|
||||
'media.viewServer' : 'أستعراض',
|
||||
'image.remoteImage' : 'إدراج الرابط',
|
||||
'image.localImage' : 'رفع',
|
||||
'image.remoteUrl' : 'الرابط',
|
||||
'image.localUrl' : 'الملف',
|
||||
'image.size' : 'الحجم',
|
||||
'image.width' : 'العرض',
|
||||
'image.height' : 'الإرتفاع',
|
||||
'image.resetSize' : 'إستعادة الأبعاد',
|
||||
'image.align' : 'محاذاة',
|
||||
'image.defaultAlign' : 'الإفتراضي',
|
||||
'image.leftAlign' : 'اليسار',
|
||||
'image.rightAlign' : 'اليمين',
|
||||
'image.imgTitle' : 'العنوان',
|
||||
'image.upload' : 'أستعراض',
|
||||
'image.viewServer' : 'أستعراض',
|
||||
'multiimage.uploadDesc' : 'Allows users to upload <%=uploadLimit%> images, single image size not exceeding <%=sizeLimit%>',
|
||||
'multiimage.startUpload' : 'Start upload',
|
||||
'multiimage.clearAll' : 'Clear all',
|
||||
'multiimage.insertAll' : 'Insert all',
|
||||
'multiimage.queueLimitExceeded' : 'Queue limit exceeded.',
|
||||
'multiimage.fileExceedsSizeLimit' : 'File exceeds size limit.',
|
||||
'multiimage.zeroByteFile' : 'Zero byte file.',
|
||||
'multiimage.invalidFiletype' : 'Invalid file type.',
|
||||
'multiimage.unknownError' : 'Unknown upload error.',
|
||||
'multiimage.pending' : 'Pending ...',
|
||||
'multiimage.uploadError' : 'Upload error',
|
||||
'filemanager.emptyFolder' : 'فارغ',
|
||||
'filemanager.moveup' : 'المجلد الأب',
|
||||
'filemanager.viewType' : 'العرض: ',
|
||||
'filemanager.viewImage' : 'مصغرات',
|
||||
'filemanager.listImage' : 'قائمة',
|
||||
'filemanager.orderType' : 'الترتيب: ',
|
||||
'filemanager.fileName' : 'بالإسم',
|
||||
'filemanager.fileSize' : 'بالحجم',
|
||||
'filemanager.fileType' : 'بالنوع',
|
||||
'insertfile.url' : 'الرابط',
|
||||
'insertfile.title' : 'العنوان',
|
||||
'insertfile.upload' : 'رفع',
|
||||
'insertfile.viewServer' : 'أستعراض',
|
||||
'table.cells' : 'خلايا',
|
||||
'table.rows' : 'صفوف',
|
||||
'table.cols' : 'أعمدة',
|
||||
'table.size' : 'الأبعاد',
|
||||
'table.width' : 'العرض',
|
||||
'table.height' : 'الإرتفاع',
|
||||
'table.percent' : '%',
|
||||
'table.px' : 'px',
|
||||
'table.space' : 'الخارج',
|
||||
'table.padding' : 'الداخل',
|
||||
'table.spacing' : 'الفراغات',
|
||||
'table.align' : 'محاذاه',
|
||||
'table.textAlign' : 'افقى',
|
||||
'table.verticalAlign' : 'رأسي',
|
||||
'table.alignDefault' : 'إفتراضي',
|
||||
'table.alignLeft' : 'يسار',
|
||||
'table.alignCenter' : 'وسط',
|
||||
'table.alignRight' : 'يمين',
|
||||
'table.alignTop' : 'أعلى',
|
||||
'table.alignMiddle' : 'منتصف',
|
||||
'table.alignBottom' : 'أسفل',
|
||||
'table.alignBaseline' : 'Baseline',
|
||||
'table.border' : 'الحدود',
|
||||
'table.borderWidth' : 'العرض',
|
||||
'table.borderColor' : 'اللون',
|
||||
'table.backgroundColor' : 'الخلفية',
|
||||
'map.address' : 'العنوان: ',
|
||||
'map.search' : 'بحث',
|
||||
'baidumap.address' : 'العنوان: ',
|
||||
'baidumap.search' : 'بحث',
|
||||
'baidumap.insertDynamicMap' : 'Dynamic Map',
|
||||
'anchor.name' : 'إسم الرابط',
|
||||
'formatblock.formatBlock' : {
|
||||
h1 : 'عنوان 1',
|
||||
h2 : 'عنوان 2',
|
||||
h3 : 'عنوان 3',
|
||||
h4 : 'عنوان 4',
|
||||
p : 'عادي'
|
||||
},
|
||||
'fontname.fontName' : {
|
||||
'Arial' : 'Arial',
|
||||
'Arial Black' : 'Arial Black',
|
||||
'Comic Sans MS' : 'Comic Sans MS',
|
||||
'Courier New' : 'Courier New',
|
||||
'Garamond' : 'Garamond',
|
||||
'Georgia' : 'Georgia',
|
||||
'Tahoma' : 'Tahoma',
|
||||
'Times New Roman' : 'Times New Roman',
|
||||
'Trebuchet MS' : 'Trebuchet MS',
|
||||
'Verdana' : 'Verdana'
|
||||
},
|
||||
'lineheight.lineHeight' : [
|
||||
{'1' : 'إرتفاع السطر 1'},
|
||||
{'1.5' : 'إرتفاع السطر 1.5'},
|
||||
{'2' : 'إرتفاع السطر 2'},
|
||||
{'2.5' : 'إرتفاع السطر 2.5'},
|
||||
{'3' : 'إرتفاع السطر 3'}
|
||||
],
|
||||
'template.selectTemplate' : 'قالب',
|
||||
'template.replaceContent' : 'إستبدال المحتوى الحالي',
|
||||
'template.fileList' : {
|
||||
'1.html' : 'صورة ونص',
|
||||
'2.html' : 'جدول',
|
||||
'3.html' : 'قائمة'
|
||||
}
|
||||
}, 'ar');
|
||||
|
||||
KindEditor.each(KindEditor.options.items, function(i, name) {
|
||||
if (name == 'baidumap') {
|
||||
KindEditor.options.items[i] = 'map';
|
||||
}
|
||||
});
|
||||
KindEditor.options.langType = 'ar';
|
||||
243
public/assets/addons/nkeditor/lang/en.js
Normal file
|
|
@ -0,0 +1,243 @@
|
|||
/*******************************************************************************
|
||||
* KindEditor - WYSIWYG HTML Editor for Internet
|
||||
* Copyright (C) 2006-2011 kindsoft.net
|
||||
*
|
||||
* @author Roddy <luolonghao@gmail.com>
|
||||
* @site http://www.kindsoft.net/
|
||||
* @licence http://www.kindsoft.net/license.php
|
||||
*******************************************************************************/
|
||||
|
||||
KindEditor.lang({
|
||||
source : 'Source',
|
||||
preview : 'Preview',
|
||||
undo : 'Undo(Ctrl+Z)',
|
||||
redo : 'Redo(Ctrl+Y)',
|
||||
cut : 'Cut(Ctrl+X)',
|
||||
copy : 'Copy(Ctrl+C)',
|
||||
paste : 'Paste(Ctrl+V)',
|
||||
plainpaste : 'Paste as plain text',
|
||||
wordpaste : 'Paste from Word',
|
||||
selectall : 'Select all',
|
||||
justifyleft : 'Align left',
|
||||
justifycenter : 'Align center',
|
||||
justifyright : 'Align right',
|
||||
justifyfull : 'Align full',
|
||||
insertorderedlist : 'Ordered list',
|
||||
insertunorderedlist : 'Unordered list',
|
||||
indent : 'Increase indent',
|
||||
outdent : 'Decrease indent',
|
||||
subscript : 'Subscript',
|
||||
superscript : 'Superscript',
|
||||
formatblock : 'Paragraph format',
|
||||
fontname : 'Font family',
|
||||
fontsize : 'Font size',
|
||||
forecolor : 'Text color',
|
||||
hilitecolor : 'Highlight color',
|
||||
bold : 'Bold(Ctrl+B)',
|
||||
italic : 'Italic(Ctrl+I)',
|
||||
underline : 'Underline(Ctrl+U)',
|
||||
strikethrough : 'Strikethrough',
|
||||
removeformat : 'Remove format',
|
||||
image : 'Image',
|
||||
multiimage : 'Multi image',
|
||||
flash : 'Flash',
|
||||
media : 'Embeded media',
|
||||
table : 'Table',
|
||||
tablecell : 'Cell',
|
||||
hr : 'Insert horizontal line',
|
||||
emoticons : 'Insert emoticon',
|
||||
link : 'Link',
|
||||
unlink : 'Unlink',
|
||||
fullscreen : 'Toggle fullscreen mode',
|
||||
about : 'About',
|
||||
print : 'Print',
|
||||
filemanager : 'File Manager',
|
||||
code : 'Insert code',
|
||||
map : 'Google Maps',
|
||||
baidumap : 'Baidu Maps',
|
||||
lineheight : 'Line height',
|
||||
clearhtml : 'Clear HTML code',
|
||||
pagebreak : 'Insert Page Break',
|
||||
quickformat : 'Quick Format',
|
||||
insertfile : 'Insert file',
|
||||
template : 'Insert Template',
|
||||
anchor : 'Anchor',
|
||||
yes : 'OK',
|
||||
no : 'Cancel',
|
||||
close : 'Close',
|
||||
editImage : 'Image properties',
|
||||
deleteImage : 'Delete image',
|
||||
editFlash : 'Flash properties',
|
||||
deleteFlash : 'Delete flash',
|
||||
editMedia : 'Media properties',
|
||||
deleteMedia : 'Delete media',
|
||||
editLink : 'Link properties',
|
||||
deleteLink : 'Unlink',
|
||||
editAnchor : 'Anchor properties',
|
||||
deleteAnchor : 'Delete Anchor',
|
||||
tableprop : 'Table properties',
|
||||
tablecellprop : 'Cell properties',
|
||||
tableinsert : 'Insert table',
|
||||
tabledelete : 'Delete table',
|
||||
tablecolinsertleft : 'Insert column left',
|
||||
tablecolinsertright : 'Insert column right',
|
||||
tablerowinsertabove : 'Insert row above',
|
||||
tablerowinsertbelow : 'Insert row below',
|
||||
tablerowmerge : 'Merge down',
|
||||
tablecolmerge : 'Merge right',
|
||||
tablerowsplit : 'Split row',
|
||||
tablecolsplit : 'Split column',
|
||||
tablecoldelete : 'Delete column',
|
||||
tablerowdelete : 'Delete row',
|
||||
noColor : 'Default',
|
||||
pleaseSelectFile : 'Please select file.',
|
||||
invalidImg : "Please type valid URL.\nAllowed file extension: jpg,gif,bmp,png",
|
||||
invalidMedia : "Please type valid URL.\nAllowed file extension: swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb",
|
||||
invalidWidth : "The width must be number.",
|
||||
invalidHeight : "The height must be number.",
|
||||
invalidBorder : "The border must be number.",
|
||||
invalidUrl : "Please type valid URL.",
|
||||
invalidRows : 'Invalid rows.',
|
||||
invalidCols : 'Invalid columns.',
|
||||
invalidPadding : 'The padding must be number.',
|
||||
invalidSpacing : 'The spacing must be number.',
|
||||
invalidJson : 'Invalid JSON string.',
|
||||
uploadSuccess : 'Upload success.',
|
||||
cutError : 'Currently not supported by your browser, use keyboard shortcut(Ctrl+X) instead.',
|
||||
copyError : 'Currently not supported by your browser, use keyboard shortcut(Ctrl+C) instead.',
|
||||
pasteError : 'Currently not supported by your browser, use keyboard shortcut(Ctrl+V) instead.',
|
||||
ajaxLoading : 'Loading ...',
|
||||
uploadLoading : 'Uploading ...',
|
||||
uploadError : 'Upload Error',
|
||||
'plainpaste.comment' : 'Use keyboard shortcut(Ctrl+V) to paste the text into the window.',
|
||||
'wordpaste.comment' : 'Use keyboard shortcut(Ctrl+V) to paste the text into the window.',
|
||||
'code.pleaseInput' : 'Please input code.',
|
||||
'link.url' : 'URL',
|
||||
'link.linkType' : 'Target',
|
||||
'link.newWindow' : 'New window',
|
||||
'link.selfWindow' : 'Same window',
|
||||
'flash.url' : 'URL',
|
||||
'flash.width' : 'Width',
|
||||
'flash.height' : 'Height',
|
||||
'flash.upload' : 'Upload',
|
||||
'flash.viewServer' : 'Browse',
|
||||
'media.url' : 'URL',
|
||||
'media.width' : 'Width',
|
||||
'media.height' : 'Height',
|
||||
'media.autostart' : 'Auto start',
|
||||
'media.upload' : 'Upload',
|
||||
'media.viewServer' : 'Browse',
|
||||
'image.remoteImage' : 'Insert URL',
|
||||
'image.localImage' : 'Upload',
|
||||
'image.remoteUrl' : 'URL',
|
||||
'image.localUrl' : 'File',
|
||||
'image.size' : 'Size',
|
||||
'image.width' : 'Width',
|
||||
'image.height' : 'Height',
|
||||
'image.resetSize' : 'Reset dimensions',
|
||||
'image.align' : 'Align',
|
||||
'image.defaultAlign' : 'Default',
|
||||
'image.leftAlign' : 'Left',
|
||||
'image.rightAlign' : 'Right',
|
||||
'image.imgTitle' : 'Title',
|
||||
'image.upload' : 'Browse',
|
||||
'image.viewServer' : 'Browse',
|
||||
'multiimage.uploadDesc' : 'Allows users to upload <%=uploadLimit%> images, single image size not exceeding <%=sizeLimit%>',
|
||||
'multiimage.startUpload' : 'Start upload',
|
||||
'multiimage.clearAll' : 'Clear all',
|
||||
'multiimage.insertAll' : 'Insert all',
|
||||
'multiimage.queueLimitExceeded' : 'Queue limit exceeded.',
|
||||
'multiimage.fileExceedsSizeLimit' : 'File exceeds size limit.',
|
||||
'multiimage.zeroByteFile' : 'Zero byte file.',
|
||||
'multiimage.invalidFiletype' : 'Invalid file type.',
|
||||
'multiimage.unknownError' : 'Unknown upload error.',
|
||||
'multiimage.pending' : 'Pending ...',
|
||||
'multiimage.uploadError' : 'Upload error',
|
||||
'filemanager.emptyFolder' : 'Blank',
|
||||
'filemanager.moveup' : 'Parent folder',
|
||||
'filemanager.viewType' : 'Display: ',
|
||||
'filemanager.viewImage' : 'Thumbnails',
|
||||
'filemanager.listImage' : 'List',
|
||||
'filemanager.orderType' : 'Sorting: ',
|
||||
'filemanager.fileName' : 'By name',
|
||||
'filemanager.fileSize' : 'By size',
|
||||
'filemanager.fileType' : 'By type',
|
||||
'insertfile.url' : 'URL',
|
||||
'insertfile.title' : 'Title',
|
||||
'insertfile.upload' : 'Upload',
|
||||
'insertfile.viewServer' : 'Browse',
|
||||
'table.cells' : 'Cells',
|
||||
'table.rows' : 'Rows',
|
||||
'table.cols' : 'Columns',
|
||||
'table.size' : 'Dimensions',
|
||||
'table.width' : 'Width',
|
||||
'table.height' : 'Height',
|
||||
'table.percent' : '%',
|
||||
'table.px' : 'px',
|
||||
'table.space' : 'Space',
|
||||
'table.padding' : 'Padding',
|
||||
'table.spacing' : 'Spacing',
|
||||
'table.align' : 'Align',
|
||||
'table.textAlign' : 'Horizontal',
|
||||
'table.verticalAlign' : 'Vertical',
|
||||
'table.alignDefault' : 'Default',
|
||||
'table.alignLeft' : 'Left',
|
||||
'table.alignCenter' : 'Center',
|
||||
'table.alignRight' : 'Right',
|
||||
'table.alignTop' : 'Top',
|
||||
'table.alignMiddle' : 'Middle',
|
||||
'table.alignBottom' : 'Bottom',
|
||||
'table.alignBaseline' : 'Baseline',
|
||||
'table.border' : 'Border',
|
||||
'table.borderWidth' : 'Width',
|
||||
'table.borderColor' : 'Color',
|
||||
'table.backgroundColor' : 'Background',
|
||||
'map.address' : 'Address: ',
|
||||
'map.search' : 'Search',
|
||||
'baidumap.address' : 'Address: ',
|
||||
'baidumap.search' : 'Search',
|
||||
'baidumap.insertDynamicMap' : 'Dynamic Map',
|
||||
'anchor.name' : 'Anchor name',
|
||||
'formatblock.formatBlock' : {
|
||||
h1 : 'Heading 1',
|
||||
h2 : 'Heading 2',
|
||||
h3 : 'Heading 3',
|
||||
h4 : 'Heading 4',
|
||||
p : 'Normal'
|
||||
},
|
||||
'fontname.fontName' : {
|
||||
'Arial' : 'Arial',
|
||||
'Arial Black' : 'Arial Black',
|
||||
'Comic Sans MS' : 'Comic Sans MS',
|
||||
'Courier New' : 'Courier New',
|
||||
'Garamond' : 'Garamond',
|
||||
'Georgia' : 'Georgia',
|
||||
'Tahoma' : 'Tahoma',
|
||||
'Times New Roman' : 'Times New Roman',
|
||||
'Trebuchet MS' : 'Trebuchet MS',
|
||||
'Verdana' : 'Verdana'
|
||||
},
|
||||
'lineheight.lineHeight' : [
|
||||
{'1' : 'Line height 1'},
|
||||
{'1.5' : 'Line height 1.5'},
|
||||
{'2' : 'Line height 2'},
|
||||
{'2.5' : 'Line height 2.5'},
|
||||
{'3' : 'Line height 3'}
|
||||
],
|
||||
'template.selectTemplate' : 'Template',
|
||||
'template.replaceContent' : 'Replace current content',
|
||||
'template.fileList' : {
|
||||
'1.html' : 'Image and Text',
|
||||
'2.html' : 'Table',
|
||||
'3.html' : 'List'
|
||||
}
|
||||
}, 'en');
|
||||
|
||||
//自动加载代码美化的js插件
|
||||
// KindEditor.loadScript(KindEditor.options.pluginsPath+"code/prettify.js");
|
||||
// KindEditor.each(KindEditor.options.items, function(i, name) {
|
||||
// if (name == 'code') {
|
||||
// KindEditor.options.items[i] = 'map';
|
||||
// }
|
||||
// });
|
||||
KindEditor.options.langType = 'en';
|
||||
234
public/assets/addons/nkeditor/lang/ja-JP.js
Normal file
|
|
@ -0,0 +1,234 @@
|
|||
/*******************************************************************************
|
||||
* @author 您的名字 お名前
|
||||
*******************************************************************************/
|
||||
|
||||
KindEditor.lang({
|
||||
source : 'HTMLコード',
|
||||
preview : 'プレビュー',
|
||||
undo : '戻る(Ctrl+Z)',
|
||||
redo : '進む(Ctrl+Y)',
|
||||
cut : 'カット(Ctrl+X)',
|
||||
copy : 'コピー(Ctrl+C)',
|
||||
paste : '貼り付け(Ctrl+V)',
|
||||
plainpaste : 'フォーマットされていないテキストとして貼り付ける',
|
||||
wordpaste : '「word」ドからペースト',
|
||||
selectall : 'すべて選択(Ctrl+A)',
|
||||
justifyleft : '左揃え',
|
||||
justifycenter : '中央揃え',
|
||||
justifyright : '右揃え',
|
||||
justifyfull : '両端揃え',
|
||||
insertorderedlist : '番号',
|
||||
insertunorderedlist : '箇条書き',
|
||||
indent : 'インデントを増やす',
|
||||
outdent : 'インデントを減らす',
|
||||
subscript : '下付き',
|
||||
superscript : '上付き',
|
||||
formatblock : '段落',
|
||||
fontname : 'フォント',
|
||||
fontsize : 'フォントサイズ',
|
||||
forecolor : 'フォントカラー',
|
||||
hilitecolor : 'テキストの背景',
|
||||
bold : '太字(Ctrl+B)',
|
||||
italic : '斜体(Ctrl+I)',
|
||||
underline : '下線(Ctrl+U)',
|
||||
strikethrough : '取り消し線',
|
||||
removeformat : 'フォーマットを削除',
|
||||
image : '画像',
|
||||
multiimage : '一括画像アップロード',
|
||||
flash : 'Flash',
|
||||
media : 'ビデオとオーディオ',
|
||||
table : 'テーブル',
|
||||
tablecell : 'セル',
|
||||
hr : '水平線を挿入する',
|
||||
emoticons : '絵文字を挿入する',
|
||||
link : 'ハイパーリンク',
|
||||
unlink : 'ハイパーリンクをキャンセル',
|
||||
fullscreen : 'フルスクリーン表示',
|
||||
about : 'について',
|
||||
print : 'プリント(Ctrl+P)',
|
||||
filemanager : 'ファイルスペース',
|
||||
code : 'プログラムコードを挿入',
|
||||
map : 'Googleマップ',
|
||||
baidumap : 'Baiduマップ',
|
||||
lineheight : '行間隔',
|
||||
clearhtml : 'HTMLコードをクリア',
|
||||
pagebreak : 'ページ区切りの挿入',
|
||||
quickformat : 'ワンクリックレイアウト',
|
||||
insertfile : 'ファイルの挿入',
|
||||
template : 'テンプレートの挿入',
|
||||
anchor : 'アンカー',
|
||||
yes : 'はい',
|
||||
no : 'いいえ',
|
||||
close : '閉じる',
|
||||
editImage : 'イメージプロパティ',
|
||||
deleteImage : 'イメージを削除',
|
||||
editFlash : 'Flashプロパティ',
|
||||
deleteFlash : 'Flashを削除',
|
||||
editMedia : 'ビデオとオーディオのプロパティ',
|
||||
deleteMedia : 'ビデオとオーディオを削除',
|
||||
editLink : 'ハイパーリンク属性',
|
||||
deleteLink : 'ハイパーリンクを削除',
|
||||
editAnchor : 'アンカー属性',
|
||||
deleteAnchor : 'アンカーを削除',
|
||||
tableprop : 'テーブル属性',
|
||||
tablecellprop : 'セル属性',
|
||||
tableinsert : 'テーブルを挿入',
|
||||
tabledelete : 'テーブルを削除',
|
||||
tablecolinsertleft : '左に列を挿入する',
|
||||
tablecolinsertright : '右に列を挿入する',
|
||||
tablerowinsertabove : '上に行を挿入する',
|
||||
tablerowinsertbelow : '下に行を挿入する',
|
||||
tablerowmerge : '下にセルをマージする',
|
||||
tablecolmerge : '右にセルをマージする',
|
||||
tablerowsplit : '行を分割',
|
||||
tablecolsplit : '列を分割',
|
||||
tablecoldelete : '列を削除',
|
||||
tablerowdelete : '行を削除',
|
||||
noColor : '色なし',
|
||||
pleaseSelectFile : 'ファイルを選択してください。',
|
||||
invalidImg : "有効なURLアドレスを入力してください。\ n jpg、gif、bmp、png形式のみが許可されています。",
|
||||
invalidMedia : "有効なURLアドレスを入力してください。swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb形式のみが許可されています。",
|
||||
invalidWidth : "幅は数字でなければなりません。",
|
||||
invalidHeight : "高さは数字でなければなりません。",
|
||||
invalidBorder : "ボーダーは数字でなければなりません。",
|
||||
invalidUrl : "有効なURLアドレスを入力してください。",
|
||||
invalidRows : '行数は必須項目で、0以上の数字を入力してください。',
|
||||
invalidCols : '列数は必須項目で、0以上の数字を入力してください。',
|
||||
invalidPadding : 'マージンは数字でなければなりません。',
|
||||
invalidSpacing : 'スペースは数字でなければなりません。',
|
||||
invalidJson : 'サーバーエラー。',
|
||||
uploadSuccess : 'アップロード成功。',
|
||||
cutError : 'ブラウザのセキュリティ設定によってカット操作を使用できないので、ショートカットキー(Ctrl + X)を使用してください。',
|
||||
copyError : 'ブラウザのセキュリティ設定によってコピー操作をできないので、ショートカットキー(Ctrl + C)を使用してください。',
|
||||
pasteError : 'ブラウザのセキュリティ設定によって貼り付け操作をできないので、ショートカットキー(Ctrl + V)を使用してください。',
|
||||
ajaxLoading : '読み込み中、お待ちください...',
|
||||
uploadLoading : 'アップロード、しばらくお待ちください...',
|
||||
uploadError : 'アップロードエラー',
|
||||
'plainpaste.comment' : 'ショートカットキー(Ctrl + V)でコンテンツを下のボックスに貼り付けてください。',
|
||||
'wordpaste.comment' : 'ショートカットキー(Ctrl + V)でコンテンツを下のボックスに貼り付けてください。',
|
||||
'code.pleaseInput' : 'プログラムコードを入力してください。 ',
|
||||
'link.url' : 'URL',
|
||||
'link.linkType' : 'タイプを開く',
|
||||
'link.newWindow' : '新しいウィンドウ',
|
||||
'link.selfWindow' : '現在のウィンドウ',
|
||||
'flash.url' : 'URL',
|
||||
'flash.width' : '幅',
|
||||
'flash.height' : '高さ',
|
||||
'flash.upload' : 'アップロード',
|
||||
'flash.viewServer' : 'ファイルスペース',
|
||||
'media.url' : 'URL',
|
||||
'media.width' : '幅',
|
||||
'media.height' : '高さ',
|
||||
'media.autostart' : '自動再生',
|
||||
'media.upload' : 'アップロード',
|
||||
'media.viewServer' : 'ファイルスペース',
|
||||
'image.remoteImage' : 'ネットワークイメージ',
|
||||
'image.localImage' : 'ローカルアップロード',
|
||||
'image.remoteUrl' : 'イメージアドレス ',
|
||||
'image.localUrl' : 'アップロードファイル',
|
||||
'image.size' : 'イメージサイズ',
|
||||
'image.width' : '幅',
|
||||
'image.height' : '高さ',
|
||||
'image.resetSize' : 'リセットサイズ',
|
||||
'image.align' : '配置',
|
||||
'image.defaultAlign' : 'デフォルト',
|
||||
'image.leftAlign' : '左揃え',
|
||||
'image.rightAlign' : '右揃え',
|
||||
'image.imgTitle' : '画像の説明',
|
||||
'image.upload' : 'ブラウズ...',
|
||||
'image.viewServer' : 'イメージスペース',
|
||||
'multiimage.uploadDesc' : 'ユーザーが<%= uploadLimit%>画像を同時にアップロードできますが、画像の容量は<%= sizeLimit%>を超えることができません',
|
||||
'multiimage.startUpload' : 'アップロード',
|
||||
'multiimage.clearAll' : 'すべてクリア',
|
||||
'multiimage.insertAll' : 'すべて挿入',
|
||||
'multiimage.queueLimitExceeded' : 'ファイルの数が上限を超えています。',
|
||||
'multiimage.fileExceedsSizeLimit' : 'ファイルサイズが制限を超えています。',
|
||||
'multiimage.zeroByteFile' : '空のファイルをアップロードできません。 ',
|
||||
'multiimage.invalidFiletype' : 'ファイル形式は正しくありません。',
|
||||
'multiimage.unknownError' : 'エラー、アップロードできません。',
|
||||
'multiimage.pending' : 'アップロード待ち',
|
||||
'multiimage.uploadError' : 'アップロード失敗',
|
||||
'filemanager.emptyFolder' : '空のフォルダ',
|
||||
'filemanager.moveup' : '前のフォルダに移動',
|
||||
'filemanager.viewType' : '表示モード:',
|
||||
'filemanager.viewImage' : 'サムネイル',
|
||||
'filemanager.listImage' : '詳細',
|
||||
'filemanager.orderType' : '並べ替え:',
|
||||
'filemanager.fileName' : 'ネーム',
|
||||
'filemanager.fileSize' : 'サイズ',
|
||||
'filemanager.fileType' : 'タイプ',
|
||||
'insertfile.url' : 'URL',
|
||||
'insertfile.title' : 'ファイルの説明',
|
||||
'insertfile.upload' : 'アップロード',
|
||||
'insertfile.viewServer' : 'ファイルスペース',
|
||||
'table.cells' : 'セル番号',
|
||||
'table.rows' : '行数',
|
||||
'table.cols' : '列数',
|
||||
'table.size' : 'サイズ',
|
||||
'table.width' : '幅',
|
||||
'table.height' : '高さ',
|
||||
'table.percent' : '%',
|
||||
'table.px' : 'px',
|
||||
'table.space' : 'テーブルスペース',
|
||||
'table.padding' : 'パッディング',
|
||||
'table.spacing' : 'スペース',
|
||||
'table.align' : '配置',
|
||||
'table.textAlign' : '水平配置',
|
||||
'table.verticalAlign' : '垂直配置',
|
||||
'table.alignDefault' : 'デフォルト',
|
||||
'table.alignLeft' : '左揃え',
|
||||
'table.alignCenter' : '中央揃え',
|
||||
'table.alignRight' : '右揃え',
|
||||
'table.alignTop' : 'トップ',
|
||||
'table.alignMiddle' : 'ミドル',
|
||||
'table.alignBottom' : 'ボトム',
|
||||
'table.alignBaseline' : 'ベースライン',
|
||||
'table.border' : 'ボーダー',
|
||||
'table.borderWidth' : 'ボーダー',
|
||||
'table.borderColor' : 'カラー',
|
||||
'table.backgroundColor' : '背景色',
|
||||
'map.address' : 'アドレス: ',
|
||||
'map.search' : '検索',
|
||||
'baidumap.address' : 'アドレス: ',
|
||||
'baidumap.search' : '検索',
|
||||
'baidumap.insertDynamicMap' : 'ダイナミックマップの挿入',
|
||||
'anchor.name' : 'アンカー名',
|
||||
|
||||
'formatblock.formatBlock' : {
|
||||
h1 : '見出し1',
|
||||
h2 : '見出し2',
|
||||
h3 : '見出し3',
|
||||
h4 : '見出し4',
|
||||
p : '正 文'
|
||||
},
|
||||
'fontname.fontName' : {
|
||||
'SimSun' : '明朝体',
|
||||
'NSimSun' : '新宋体',
|
||||
'FangSong_GB2312' : '仿宋_GB2312',
|
||||
'KaiTi_GB2312' : '楷書体_GB2312',
|
||||
'SimHei' : 'ゴチック体',
|
||||
'Microsoft YaHei' : 'Msyh',
|
||||
'Arial' : 'Arial',
|
||||
'Arial Black' : 'Arial Black',
|
||||
'Times New Roman' : 'Times New Roman',
|
||||
'Courier New' : 'Courier New',
|
||||
'Tahoma' : 'Tahoma',
|
||||
'Verdana' : 'Verdana'
|
||||
},
|
||||
'lineheight.lineHeight' : [
|
||||
{'1' : '行間1倍'},
|
||||
{'1.5' : '行間1.5倍'},
|
||||
{'2' : '行間2倍'},
|
||||
{'2.5' : '行間2.5倍'},
|
||||
{'3' : '行間3倍'}
|
||||
],
|
||||
'template.selectTemplate' : 'オプションテンプレート',
|
||||
'template.replaceContent' : '現在のコンテンツを置き換える',
|
||||
'template.fileList' : {
|
||||
'1.html' : 'イメージとテキスト',
|
||||
'2.html' : '表',
|
||||
'3.html' : '段落番号'
|
||||
}
|
||||
}, 'ja-JP');
|
||||
|
||||
KindEditor.options.langType = 'ja-JP';
|
||||
246
public/assets/addons/nkeditor/lang/ko.js
Normal file
|
|
@ -0,0 +1,246 @@
|
|||
/*******************************************************************************
|
||||
* KindEditor - WYSIWYG HTML Editor for Internet
|
||||
* Copyright (C) 2006-2011 kindsoft.net
|
||||
*
|
||||
* @author Composite <ukjinplant@gmail.com>
|
||||
* @site http://www.kindsoft.net/
|
||||
* @licence http://www.kindsoft.net/license.php
|
||||
*******************************************************************************/
|
||||
|
||||
KindEditor.lang({
|
||||
source : '소스',
|
||||
preview : '미리보기',
|
||||
undo : '작업취소(Ctrl+Z)',
|
||||
redo : '작업재개(Ctrl+Y)',
|
||||
cut : '잘라내기(Ctrl+X)',
|
||||
copy : '복사(Ctrl+C)',
|
||||
paste : '붙여넣기(Ctrl+V)',
|
||||
plainpaste : '일반 텍스트로 붙여넣기',
|
||||
wordpaste : '워드 문서로 붙여넣기',
|
||||
selectall : '전체 선택',
|
||||
justifyleft : '왼쪽 정렬',
|
||||
justifycenter : '가운데 정렬',
|
||||
justifyright : '오른쪽 정렬',
|
||||
justifyfull : '양쪽 정렬',
|
||||
insertorderedlist : '순서 목록',
|
||||
insertunorderedlist : '비순서 목록',
|
||||
indent : '들여쓰기',
|
||||
outdent : '내어쓰기',
|
||||
subscript : '아랫첨자',
|
||||
superscript : '윗첨자',
|
||||
formatblock : '문단 형식',
|
||||
fontname : '글꼴',
|
||||
fontsize : '글자 크기',
|
||||
forecolor : '글자색',
|
||||
hilitecolor : '강조색',
|
||||
bold : '굵게(Ctrl+B)',
|
||||
italic : '이텔릭(Ctrl+I)',
|
||||
underline : '빝줄(Ctrl+U)',
|
||||
strikethrough : '취소선',
|
||||
removeformat : '형식 제거',
|
||||
image : '이미지 추가',
|
||||
multiimage : '여러 이미지 추가',
|
||||
flash : '플래시 추가',
|
||||
media : '미디어 추가',
|
||||
table : '표',
|
||||
tablecell : '열',
|
||||
hr : '구분선 추가',
|
||||
emoticons : '이모티콘 추가',
|
||||
link : '링크',
|
||||
unlink : '링크 제거',
|
||||
fullscreen : '전체 화면 모드',
|
||||
about : '이 에디터는...',
|
||||
print : '인쇄',
|
||||
filemanager : '파일 관리자',
|
||||
code : '코드 추가',
|
||||
map : '구글 맵 추가',
|
||||
baidumap : '바이두 맵 추가',
|
||||
lineheight : '행 간격',
|
||||
clearhtml : 'HTML 코드 정리',
|
||||
pagebreak : '페이지 구분 추가',
|
||||
quickformat : '빠른 형식',
|
||||
insertfile : '파일 추가',
|
||||
template : '템플릿 추가',
|
||||
anchor : '책갈피',
|
||||
yes : '확인',
|
||||
no : '취소',
|
||||
close : '닫기',
|
||||
editImage : '이미지 속성',
|
||||
deleteImage : '이미지 삭제',
|
||||
editFlash : '플래시 속성',
|
||||
deleteFlash : '플래시 삭제',
|
||||
editMedia : '미디어 속성',
|
||||
deleteMedia : '미디어 삭제',
|
||||
editLink : '링크 속성',
|
||||
deleteLink : '링크 삭제',
|
||||
editAnchor : 'Anchor properties',
|
||||
deleteAnchor : 'Delete Anchor',
|
||||
tableprop : '표 속성',
|
||||
tablecellprop : '열 속성',
|
||||
tableinsert : '표 추가',
|
||||
tabledelete : '표 삭제',
|
||||
tablecolinsertleft : '왼쪽으로 열 추가',
|
||||
tablecolinsertright : '오른쪽으로 열 추가',
|
||||
tablerowinsertabove : '위쪽으로 열 추가',
|
||||
tablerowinsertbelow : '아래쪽으로 열 추가',
|
||||
tablerowmerge : '아래로 병합',
|
||||
tablecolmerge : '오른쪽으로 병합',
|
||||
tablerowsplit : '행 나누기',
|
||||
tablecolsplit : '열 나누기',
|
||||
tablecoldelete : '열 삭제',
|
||||
tablerowdelete : '행 삭제',
|
||||
noColor : '기본색',
|
||||
pleaseSelectFile : '파일 선택',
|
||||
invalidImg : "올바른 주소를 입력하세요.\njpg,gif,bmp,png 형식이 가능합니다.",
|
||||
invalidMedia : "올바른 주소를 입력하세요.\nswf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb 형식이 가능합니다.",
|
||||
invalidWidth : "넓이 값은 숫자여야 합니다.",
|
||||
invalidHeight : "높이 값은 숫자여야 합니다.",
|
||||
invalidBorder : "굵기 값은 숫자여야 합니다.",
|
||||
invalidUrl : "올바른 주소를 입력하세요.",
|
||||
invalidRows : '올바른 행이 아닙니다.',
|
||||
invalidCols : '올바른 열이 아닙니다.',
|
||||
invalidPadding : '안쪽 여백 값은 숫자여야 합니다.',
|
||||
invalidSpacing : '간격 길이 값은 숫자여야 합니다.',
|
||||
invalidJson : '올바른 JSON 형식이 아닙니다.',
|
||||
uploadSuccess : '업로드가 완료되었습니다.',
|
||||
cutError : '브라우저가 잘라내기 기능을 지원하지 않습니다, 단축키로 대신 사용하세요. (Ctrl+X)',
|
||||
copyError : '브라우저가 복사 기능을 지원하지 않습니다, 단축키로 대신 사용하세요. (Ctrl+X)',
|
||||
pasteError : '브라우저가 붙여넣기 기능을 지원하지 않습니다, 단축키로 대신 사용하세요. (Ctrl+X)',
|
||||
ajaxLoading : '불러오는 중 ...',
|
||||
uploadLoading : '업로드 중 ...',
|
||||
uploadError : '업로드 오류',
|
||||
'plainpaste.comment' : '단축키(Ctrl+V)를 통하여 여기에 텍스트를 붙여넣으세요.',
|
||||
'wordpaste.comment' : '단축키(Ctrl+V)를 통하여 여기에 워드 텍스트를 붙여넣으세요.',
|
||||
'code.pleaseInput' : 'Please input code.',
|
||||
'link.url' : '주소',
|
||||
'link.linkType' : '창',
|
||||
'link.newWindow' : '새 창',
|
||||
'link.selfWindow' : '현재 창',
|
||||
'flash.url' : '주소',
|
||||
'flash.width' : '넓이',
|
||||
'flash.height' : '높이',
|
||||
'flash.upload' : '업로드',
|
||||
'flash.viewServer' : '찾아보기',
|
||||
'media.url' : '주소',
|
||||
'media.width' : '넓이',
|
||||
'media.height' : '높이',
|
||||
'media.autostart' : '자동 시작',
|
||||
'media.upload' : '업로드',
|
||||
'media.viewServer' : '찾아보기',
|
||||
'image.remoteImage' : '외부 이미지',
|
||||
'image.localImage' : '내부 이미지',
|
||||
'image.remoteUrl' : '주소',
|
||||
'image.localUrl' : '파일',
|
||||
'image.size' : '크기',
|
||||
'image.width' : '넓이',
|
||||
'image.height' : '높이',
|
||||
'image.resetSize' : '기본 크기로',
|
||||
'image.align' : '정렬',
|
||||
'image.defaultAlign' : '기본',
|
||||
'image.leftAlign' : '왼쪽',
|
||||
'image.rightAlign' : '오른쪽',
|
||||
'image.imgTitle' : '제목',
|
||||
'image.upload' : '찾아보기',
|
||||
'image.viewServer' : '찾아보기',
|
||||
'multiimage.uploadDesc' : '최대 이미지 개수: <%=uploadLimit%>개, 개당 이미지 크기: <%=sizeLimit%>',
|
||||
'multiimage.startUpload' : '업로드 시작',
|
||||
'multiimage.clearAll' : '모두 삭제',
|
||||
'multiimage.insertAll' : '모두 삽입',
|
||||
'multiimage.queueLimitExceeded' : '업로드 개수가 초과되었습니다.',
|
||||
'multiimage.fileExceedsSizeLimit' : '업로드 크기가 초과되었습니다.',
|
||||
'multiimage.zeroByteFile' : '파일 크기가 없습니다.',
|
||||
'multiimage.invalidFiletype' : '올바른 이미지가 아닙니다.',
|
||||
'multiimage.unknownError' : '알 수 없는 업로드 오류가 발생하였습니다.',
|
||||
'multiimage.pending' : '처리 중 ...',
|
||||
'multiimage.uploadError' : '업로드 오류',
|
||||
'filemanager.emptyFolder' : '빈 폴더',
|
||||
'filemanager.moveup' : '위로',
|
||||
'filemanager.viewType' : '보기 방식: ',
|
||||
'filemanager.viewImage' : '미리 보기',
|
||||
'filemanager.listImage' : '목록',
|
||||
'filemanager.orderType' : '정렬 방식: ',
|
||||
'filemanager.fileName' : '이름별',
|
||||
'filemanager.fileSize' : '크기별',
|
||||
'filemanager.fileType' : '종류별',
|
||||
'insertfile.url' : '주소',
|
||||
'insertfile.title' : '제목',
|
||||
'insertfile.upload' : '업로드',
|
||||
'insertfile.viewServer' : '찾아보기',
|
||||
'table.cells' : '열',
|
||||
'table.rows' : '행',
|
||||
'table.cols' : '열',
|
||||
'table.size' : '표 크기',
|
||||
'table.width' : '넓이',
|
||||
'table.height' : '높이',
|
||||
'table.percent' : '%',
|
||||
'table.px' : 'px',
|
||||
'table.space' : '간격',
|
||||
'table.padding' : '안쪽여백',
|
||||
'table.spacing' : '간격',
|
||||
'table.align' : '정렬',
|
||||
'table.textAlign' : '수직',
|
||||
'table.verticalAlign' : '수평',
|
||||
'table.alignDefault' : '기본',
|
||||
'table.alignLeft' : '왼쪽',
|
||||
'table.alignCenter' : '가운데',
|
||||
'table.alignRight' : '오른쪽',
|
||||
'table.alignTop' : '위쪽',
|
||||
'table.alignMiddle' : '중간',
|
||||
'table.alignBottom' : '아래쪽',
|
||||
'table.alignBaseline' : '글자기준',
|
||||
'table.border' : '테두리',
|
||||
'table.borderWidth' : '크기',
|
||||
'table.borderColor' : '색상',
|
||||
'table.backgroundColor' : '배경',
|
||||
'map.address' : '주소: ',
|
||||
'map.search' : '검색',
|
||||
'baidumap.address' : '주소: ',
|
||||
'baidumap.search' : '검색',
|
||||
'baidumap.insertDynamicMap' : '동적 지도',
|
||||
'anchor.name' : '책갈피명',
|
||||
'formatblock.formatBlock' : {
|
||||
h1 : '제목 1',
|
||||
h2 : '제목 2',
|
||||
h3 : '제목 3',
|
||||
h4 : '제목 4',
|
||||
p : '본문'
|
||||
},
|
||||
'fontname.fontName' : {
|
||||
'Gulim' : '굴림',
|
||||
'Dotum' : '돋움',
|
||||
'Batang' : '바탕',
|
||||
'Gungsuh' : '궁서',
|
||||
'Malgun Gothic' : '맑은 고딕',
|
||||
'Arial' : 'Arial',
|
||||
'Arial Black' : 'Arial Black',
|
||||
'Comic Sans MS' : 'Comic Sans MS',
|
||||
'Courier New' : 'Courier New',
|
||||
'Garamond' : 'Garamond',
|
||||
'Georgia' : 'Georgia',
|
||||
'Tahoma' : 'Tahoma',
|
||||
'Times New Roman' : 'Times New Roman',
|
||||
'Trebuchet MS' : 'Trebuchet MS',
|
||||
'Verdana' : 'Verdana'
|
||||
},
|
||||
'lineheight.lineHeight' : [
|
||||
{'1' : '행간 1'},
|
||||
{'1.5' : '행간 1.5'},
|
||||
{'2' : '행간 2'},
|
||||
{'2.5' : '행간 2.5'},
|
||||
{'3' : '행간 3'}
|
||||
],
|
||||
'template.selectTemplate' : '템플릿',
|
||||
'template.replaceContent' : '내용 바꾸기',
|
||||
'template.fileList' : {
|
||||
'1.html' : '이미지와 텍스트',
|
||||
'2.html' : '표',
|
||||
'3.html' : '목록'
|
||||
}
|
||||
}, 'ko');
|
||||
|
||||
KindEditor.each(KindEditor.options.items, function(i, name) {
|
||||
if (name == 'baidumap') {
|
||||
KindEditor.options.items[i] = 'map';
|
||||
}
|
||||
});
|
||||
KindEditor.options.langType = 'ko';
|
||||
242
public/assets/addons/nkeditor/lang/ru.js
Normal file
|
|
@ -0,0 +1,242 @@
|
|||
/*******************************************************************************
|
||||
* KindEditor - WYSIWYG HTML Editor for Internet
|
||||
* Copyright (C) 2006-2011 kindsoft.net
|
||||
*
|
||||
* @author Roddy <luolonghao@gmail.com>
|
||||
* @site http://www.kindsoft.net/
|
||||
* @licence http://www.kindsoft.net/license.php
|
||||
* Translated to Russian by Valery Votintsev (http://codersclub.org/)
|
||||
*******************************************************************************/
|
||||
|
||||
KindEditor.lang({
|
||||
source : 'Source',
|
||||
preview : 'Preview',
|
||||
undo : 'Отмена(Ctrl+Z)',
|
||||
redo : 'Повтор(Ctrl+Y)',
|
||||
cut : 'Вырезать(Ctrl+X)',
|
||||
copy : 'Копировать(Ctrl+C)',
|
||||
paste : 'Вставить(Ctrl+V)',
|
||||
plainpaste : 'Вставить как простой текст',
|
||||
wordpaste : 'Вставить из Word',
|
||||
selectall : 'Выбрать все',
|
||||
justifyleft : 'Выравнивание влево',
|
||||
justifycenter : 'Выравнивание по центру',
|
||||
justifyright : 'Выравнивание вправо',
|
||||
justifyfull : 'Выравнивание по обеим сторонам',
|
||||
insertorderedlist : 'Нумерованый список',
|
||||
insertunorderedlist : 'Ненумерованый список',
|
||||
indent : 'Добавить отступ',
|
||||
outdent : 'Убрать отступ',
|
||||
subscript : 'Надстрочный',
|
||||
superscript : 'Подстрочный',
|
||||
formatblock : 'Формат параграфа',
|
||||
fontname : 'Шрифт',
|
||||
fontsize : 'Размер',
|
||||
forecolor : 'Цвет текста',
|
||||
hilitecolor : 'Цвет фона',
|
||||
bold : 'Жирный(Ctrl+B)',
|
||||
italic : 'Наклонный(Ctrl+I)',
|
||||
underline : 'Подчёркнутый(Ctrl+U)',
|
||||
strikethrough : 'Перечёркнутый',
|
||||
removeformat : 'Удалить формат',
|
||||
image : 'Изображение',
|
||||
multiimage : 'Мульти-загрузка',
|
||||
flash : 'Flash',
|
||||
media : 'Встроенные данные',
|
||||
table : 'Таблица',
|
||||
tablecell : 'Ячейка',
|
||||
hr : 'Горизонтальный разделитель',
|
||||
emoticons : 'Смайл',
|
||||
link : 'Ссылка',
|
||||
unlink : 'Убрать ссылку',
|
||||
fullscreen : 'На весь экран',
|
||||
about : 'О программе',
|
||||
print : 'Печать',
|
||||
filemanager : 'Файлы',
|
||||
code : 'Код',
|
||||
map : 'Карта Google',
|
||||
baidumap : 'Карта Baidu',
|
||||
lineheight : 'Межстрочный интервал',
|
||||
clearhtml : 'Очистить HTML код',
|
||||
pagebreak : 'Разрыв страницы',
|
||||
quickformat : 'Быстрый формат',
|
||||
insertfile : 'Вставить файл',
|
||||
template : 'Вставить шаблон',
|
||||
anchor : 'Якорь',
|
||||
yes : 'OK',
|
||||
no : 'Отмена',
|
||||
close : 'Закрыть',
|
||||
editImage : 'Свойства изображения',
|
||||
deleteImage : 'Удалить изображение',
|
||||
editFlash : 'Свойства Flash',
|
||||
deleteFlash : 'Удалить Flash',
|
||||
editMedia : 'Свойства Media',
|
||||
deleteMedia : 'Удалить Media',
|
||||
editLink : 'Свойства ссылки',
|
||||
deleteLink : 'Удалить ссылку',
|
||||
editAnchor : 'Anchor properties',
|
||||
deleteAnchor : 'Delete Anchor',
|
||||
tableprop : 'Свойства таблицы',
|
||||
tablecellprop : 'Свойства ячейки',
|
||||
tableinsert : 'Вставить таблицу',
|
||||
tabledelete : 'Удалить таблицу',
|
||||
tablecolinsertleft : 'Добавить столбец слева',
|
||||
tablecolinsertright : 'Добавить столбец справа',
|
||||
tablerowinsertabove : 'Добавить строку выше',
|
||||
tablerowinsertbelow : 'Добавить строку ниже',
|
||||
tablerowmerge : 'Объединить вниз',
|
||||
tablecolmerge : 'Объединить вправо',
|
||||
tablerowsplit : 'Разделить строку',
|
||||
tablecolsplit : 'Разделить столбец',
|
||||
tablecoldelete : 'Удалить столбец',
|
||||
tablerowdelete : 'Удалить строку',
|
||||
noColor : 'По умолчанию',
|
||||
pleaseSelectFile : 'Выберите файл.',
|
||||
invalidImg : "Укажите корректный URL изображения.\nРазрешённые форматы: jpg,gif,bmp,png",
|
||||
invalidMedia : "Укажите корректный тип медиа-объекта.\nРазрешённые типы: swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb",
|
||||
invalidWidth : "Ширина должна быть числом.",
|
||||
invalidHeight : "Высота должна быть числом.",
|
||||
invalidBorder : "Ширина рамки должна быть числом.",
|
||||
invalidUrl : "Укажите корректный URL.",
|
||||
invalidRows : 'Неверные строки.',
|
||||
invalidCols : 'Неверные столбцы.',
|
||||
invalidPadding : 'padding должен быть числом.',
|
||||
invalidSpacing : 'spacing должен быть числом.',
|
||||
invalidJson : 'Неверная JSON строка.',
|
||||
uploadSuccess : 'Загрузка завершена.',
|
||||
cutError : 'Данная опция не поддерживается вашим браузером, воспользуйтесь комбинацией клавиш (Ctrl+X).',
|
||||
copyError : 'Данная опция не поддерживается вашим браузером, воспользуйтесь комбинацией клавиш (Ctrl+C).',
|
||||
pasteError : 'Данная опция не поддерживается вашим браузером, воспользуйтесь комбинацией клавиш (Ctrl+V).',
|
||||
ajaxLoading : 'Загрузка ...',
|
||||
uploadLoading : 'Загрузка ...',
|
||||
uploadError : 'Сбой загрузки',
|
||||
'plainpaste.comment' : 'Для вставки скопированного текста воспользуйтесь комбинацией клавиш (Ctrl+V).',
|
||||
'wordpaste.comment' : 'Для вставки скопированного текста воспользуйтесь комбинацией клавиш (Ctrl+V).',
|
||||
'code.pleaseInput' : 'Введите код.',
|
||||
'link.url' : 'URL',
|
||||
'link.linkType' : 'Открывать ссылку',
|
||||
'link.newWindow' : 'в новом окне',
|
||||
'link.selfWindow' : 'в том же окне',
|
||||
'flash.url' : 'URL',
|
||||
'flash.width' : 'Ширина',
|
||||
'flash.height' : 'Высота',
|
||||
'flash.upload' : 'Загрузить',
|
||||
'flash.viewServer' : 'Выбрать',
|
||||
'media.url' : 'URL',
|
||||
'media.width' : 'Ширина',
|
||||
'media.height' : 'Высота',
|
||||
'media.autostart' : 'Автостарт',
|
||||
'media.upload' : 'Загрузить',
|
||||
'media.viewServer' : 'Выбрать',
|
||||
'image.remoteImage' : 'Вставить URL изображения',
|
||||
'image.localImage' : 'Загрузить',
|
||||
'image.remoteUrl' : 'URL',
|
||||
'image.localUrl' : 'Файл',
|
||||
'image.size' : 'Размер',
|
||||
'image.width' : 'Ширина',
|
||||
'image.height' : 'Высота',
|
||||
'image.resetSize' : 'Сбросить размеры',
|
||||
'image.align' : 'Выравнивание',
|
||||
'image.defaultAlign' : 'По умолчанию',
|
||||
'image.leftAlign' : 'Влево',
|
||||
'image.rightAlign' : 'Вправо',
|
||||
'image.imgTitle' : 'Название',
|
||||
'image.upload' : 'Загрузить',
|
||||
'image.viewServer' : 'Выбрать',
|
||||
'multiimage.uploadDesc' : 'Максимальное кол-во изображений: <%=uploadLimit%>, Максимальный размер одного изображения: <%=sizeLimit%>',
|
||||
'multiimage.startUpload' : 'Начать загрузку',
|
||||
'multiimage.clearAll' : 'Очистить все',
|
||||
'multiimage.insertAll' : 'Вставить все',
|
||||
'multiimage.queueLimitExceeded' : 'Превышен лимит очереди.',
|
||||
'multiimage.fileExceedsSizeLimit' : 'Превышен максимальный размер файла.',
|
||||
'multiimage.zeroByteFile' : 'Файл нулевой длины.',
|
||||
'multiimage.invalidFiletype' : 'Недопустимый тип файла.',
|
||||
'multiimage.unknownError' : 'Непредвиденная ошибка загрузки.',
|
||||
'multiimage.pending' : 'Ожидает ...',
|
||||
'multiimage.uploadError' : 'Ошибка загрузки',
|
||||
'filemanager.emptyFolder' : 'Папка пуста',
|
||||
'filemanager.moveup' : 'Наверх',
|
||||
'filemanager.viewType' : 'Тип показа: ',
|
||||
'filemanager.viewImage' : 'Превьюшки',
|
||||
'filemanager.listImage' : 'Список',
|
||||
'filemanager.orderType' : 'Сортировка: ',
|
||||
'filemanager.fileName' : 'По имени',
|
||||
'filemanager.fileSize' : 'По размеру',
|
||||
'filemanager.fileType' : 'По типу',
|
||||
'insertfile.url' : 'URL',
|
||||
'insertfile.title' : 'Название',
|
||||
'insertfile.upload' : 'Загрузить',
|
||||
'insertfile.viewServer' : 'Выбрать',
|
||||
'table.cells' : 'Ячейки',
|
||||
'table.rows' : 'Строки',
|
||||
'table.cols' : 'Столбцы',
|
||||
'table.size' : 'Размеры',
|
||||
'table.width' : 'Ширина',
|
||||
'table.height' : 'Высота',
|
||||
'table.percent' : '%',
|
||||
'table.px' : 'px',
|
||||
'table.space' : 'Space',
|
||||
'table.padding' : 'Padding',
|
||||
'table.spacing' : 'Spacing',
|
||||
'table.align' : 'Выравнивание',
|
||||
'table.textAlign' : 'По горизонтали',
|
||||
'table.verticalAlign' : 'По вертикали',
|
||||
'table.alignDefault' : 'По умолчанию',
|
||||
'table.alignLeft' : 'Влево',
|
||||
'table.alignCenter' : 'По центру',
|
||||
'table.alignRight' : 'Вправо',
|
||||
'table.alignTop' : 'Вверх',
|
||||
'table.alignMiddle' : 'Посередине',
|
||||
'table.alignBottom' : 'Вниз',
|
||||
'table.alignBaseline' : 'По базовой линии',
|
||||
'table.border' : 'Рамка',
|
||||
'table.borderWidth' : 'Ширина',
|
||||
'table.borderColor' : 'Цвет',
|
||||
'table.backgroundColor' : 'Цвет фона',
|
||||
'map.address' : 'Адрес: ',
|
||||
'map.search' : 'Поиск',
|
||||
'baidumap.address' : 'Адрес: ',
|
||||
'baidumap.search' : 'Поиск',
|
||||
'baidumap.insertDynamicMap' : 'Динамическая карта',
|
||||
'anchor.name' : 'Имя якоря',
|
||||
'formatblock.formatBlock' : {
|
||||
h1 : 'Заголовок 1',
|
||||
h2 : 'Заголовок 2',
|
||||
h3 : 'Заголовок 3',
|
||||
h4 : 'Заголовок 4',
|
||||
p : 'Обычный текст'
|
||||
},
|
||||
'fontname.fontName' : {
|
||||
'Arial' : 'Arial',
|
||||
'Arial Black' : 'Arial Black',
|
||||
'Comic Sans MS' : 'Comic Sans MS',
|
||||
'Courier New' : 'Courier New',
|
||||
'Garamond' : 'Garamond',
|
||||
'Georgia' : 'Georgia',
|
||||
'Tahoma' : 'Tahoma',
|
||||
'Times New Roman' : 'Times New Roman',
|
||||
'Trebuchet MS' : 'Trebuchet MS',
|
||||
'Verdana' : 'Verdana'
|
||||
},
|
||||
'lineheight.lineHeight' : [
|
||||
{'1' : '1'},
|
||||
{'1.5' : '1.5'},
|
||||
{'2' : '2'},
|
||||
{'2.5' : '2.5'},
|
||||
{'3' : '3'}
|
||||
],
|
||||
'template.selectTemplate' : 'Шаблон',
|
||||
'template.replaceContent' : 'Заменить текущий шаблон',
|
||||
'template.fileList' : {
|
||||
'1.html' : 'Текст и изображения',
|
||||
'2.html' : 'Таблица',
|
||||
'3.html' : 'Список'
|
||||
}
|
||||
}, 'en');
|
||||
|
||||
KindEditor.each(KindEditor.options.items, function(i, name) {
|
||||
if (name == 'baidumap') {
|
||||
KindEditor.options.items[i] = 'map';
|
||||
}
|
||||
});
|
||||
KindEditor.options.langType = 'ru';
|
||||
267
public/assets/addons/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';
|
||||
243
public/assets/addons/nkeditor/lang/zh-TW.js
Normal file
|
|
@ -0,0 +1,243 @@
|
|||
/*******************************************************************************
|
||||
* KindEditor - WYSIWYG HTML Editor for Internet
|
||||
* Copyright (C) 2006-2011 kindsoft.net
|
||||
*
|
||||
* @author Roddy <luolonghao@gmail.com>
|
||||
* @site http://www.kindsoft.net/
|
||||
* @licence http://www.kindsoft.net/license.php
|
||||
*******************************************************************************/
|
||||
|
||||
KindEditor.lang({
|
||||
source : '原始碼',
|
||||
preview : '預覽',
|
||||
undo : '復原(Ctrl+Z)',
|
||||
redo : '重複(Ctrl+Y)',
|
||||
cut : '剪下(Ctrl+X)',
|
||||
copy : '複製(Ctrl+C)',
|
||||
paste : '貼上(Ctrl+V)',
|
||||
plainpaste : '貼為純文字格式',
|
||||
wordpaste : '自Word貼上',
|
||||
selectall : '全選(Ctrl+A)',
|
||||
justifyleft : '靠左對齊',
|
||||
justifycenter : '置中',
|
||||
justifyright : '靠右對齊',
|
||||
justifyfull : '左右對齊',
|
||||
insertorderedlist : '編號清單',
|
||||
insertunorderedlist : '項目清單',
|
||||
indent : '增加縮排',
|
||||
outdent : '減少縮排',
|
||||
subscript : '下標',
|
||||
superscript : '上標',
|
||||
formatblock : '標題',
|
||||
fontname : '字體',
|
||||
fontsize : '文字大小',
|
||||
forecolor : '文字顏色',
|
||||
hilitecolor : '背景顏色',
|
||||
bold : '粗體(Ctrl+B)',
|
||||
italic : '斜體(Ctrl+I)',
|
||||
underline : '底線(Ctrl+U)',
|
||||
strikethrough : '刪除線',
|
||||
removeformat : '清除格式',
|
||||
image : '影像',
|
||||
multiimage : '批量影像上傳',
|
||||
flash : 'Flash',
|
||||
media : '多媒體',
|
||||
table : '表格',
|
||||
tablecell : '儲存格',
|
||||
hr : '插入水平線',
|
||||
emoticons : '插入表情',
|
||||
link : '超連結',
|
||||
unlink : '移除超連結',
|
||||
fullscreen : '最大化',
|
||||
about : '關於',
|
||||
print : '列印(Ctrl+P)',
|
||||
filemanager : '瀏覽伺服器',
|
||||
code : '插入程式代碼',
|
||||
map : 'Google地圖',
|
||||
baidumap : 'Baidu地圖',
|
||||
lineheight : '行距',
|
||||
clearhtml : '清理HTML代碼',
|
||||
pagebreak : '插入分頁符號',
|
||||
quickformat : '快速排版',
|
||||
insertfile : '插入文件',
|
||||
template : '插入樣板',
|
||||
anchor : '錨點',
|
||||
yes : '確定',
|
||||
no : '取消',
|
||||
close : '關閉',
|
||||
editImage : '影像屬性',
|
||||
deleteImage : '刪除影像',
|
||||
editFlash : 'Flash屬性',
|
||||
deleteFlash : '删除Flash',
|
||||
editMedia : '多媒體屬性',
|
||||
deleteMedia : '删除多媒體',
|
||||
editLink : '超連結屬性',
|
||||
deleteLink : '移除超連結',
|
||||
editAnchor : '锚点属性',
|
||||
deleteAnchor : '删除锚点',
|
||||
tableprop : '表格屬性',
|
||||
tablecellprop : '儲存格屬性',
|
||||
tableinsert : '插入表格',
|
||||
tabledelete : '刪除表格',
|
||||
tablecolinsertleft : '向左插入列',
|
||||
tablecolinsertright : '向右插入列',
|
||||
tablerowinsertabove : '向上插入欄',
|
||||
tablerowinsertbelow : '下方插入欄',
|
||||
tablerowmerge : '向下合併單元格',
|
||||
tablecolmerge : '向右合併單元格',
|
||||
tablerowsplit : '分割欄',
|
||||
tablecolsplit : '分割列',
|
||||
tablecoldelete : '删除列',
|
||||
tablerowdelete : '删除欄',
|
||||
noColor : '自動',
|
||||
pleaseSelectFile : '請選擇文件。',
|
||||
invalidImg : "請輸入有效的URL。\n只允許jpg,gif,bmp,png格式。",
|
||||
invalidMedia : "請輸入有效的URL。\n只允許swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb格式。",
|
||||
invalidWidth : "寬度必須是數字。",
|
||||
invalidHeight : "高度必須是數字。",
|
||||
invalidBorder : "邊框必須是數字。",
|
||||
invalidUrl : "請輸入有效的URL。",
|
||||
invalidRows : '欄數是必須輸入項目,只允許輸入大於0的數字。',
|
||||
invalidCols : '列數是必須輸入項目,只允許輸入大於0的數字。',
|
||||
invalidPadding : '內距必須是數字。',
|
||||
invalidSpacing : '間距必須是數字。',
|
||||
invalidJson : '伺服器發生故障。',
|
||||
uploadSuccess : '上傳成功。',
|
||||
cutError : '您的瀏覽器安全設置不允許使用剪下操作,請使用快捷鍵(Ctrl+X)完成。',
|
||||
copyError : '您的瀏覽器安全設置不允許使用剪下操作,請使用快捷鍵(Ctrl+C)完成。',
|
||||
pasteError : '您的瀏覽器安全設置不允許使用剪下操作,請使用快捷鍵(Ctrl+V)完成。',
|
||||
ajaxLoading : '加載中,請稍候 ...',
|
||||
uploadLoading : '上傳中,請稍候 ...',
|
||||
uploadError : '上傳錯誤',
|
||||
'plainpaste.comment' : '請使用快捷鍵(Ctrl+V)把內容貼到下方區域裡。',
|
||||
'wordpaste.comment' : '請使用快捷鍵(Ctrl+V)把內容貼到下方區域裡。',
|
||||
'code.pleaseInput' : 'Please input code.',
|
||||
'link.url' : 'URL',
|
||||
'link.linkType' : '打開類型',
|
||||
'link.newWindow' : '新窗口',
|
||||
'link.selfWindow' : '本頁窗口',
|
||||
'flash.url' : 'URL',
|
||||
'flash.width' : '寬度',
|
||||
'flash.height' : '高度',
|
||||
'flash.upload' : '上傳',
|
||||
'flash.viewServer' : '瀏覽',
|
||||
'media.url' : 'URL',
|
||||
'media.width' : '寬度',
|
||||
'media.height' : '高度',
|
||||
'media.autostart' : '自動播放',
|
||||
'media.upload' : '上傳',
|
||||
'media.viewServer' : '瀏覽',
|
||||
'image.remoteImage' : '網絡影像',
|
||||
'image.localImage' : '上傳影像',
|
||||
'image.remoteUrl' : '影像URL',
|
||||
'image.localUrl' : '影像URL',
|
||||
'image.size' : '影像大小',
|
||||
'image.width' : '寬度',
|
||||
'image.height' : '高度',
|
||||
'image.resetSize' : '原始大小',
|
||||
'image.align' : '對齊方式',
|
||||
'image.defaultAlign' : '未設定',
|
||||
'image.leftAlign' : '向左對齊',
|
||||
'image.rightAlign' : '向右對齊',
|
||||
'image.imgTitle' : '影像說明',
|
||||
'image.upload' : '瀏覽...',
|
||||
'image.viewServer' : '瀏覽...',
|
||||
'multiimage.uploadDesc' : 'Allows users to upload <%=uploadLimit%> images, single image size not exceeding <%=sizeLimit%>',
|
||||
'multiimage.startUpload' : 'Start upload',
|
||||
'multiimage.clearAll' : 'Clear all',
|
||||
'multiimage.insertAll' : 'Insert all',
|
||||
'multiimage.queueLimitExceeded' : 'Queue limit exceeded.',
|
||||
'multiimage.fileExceedsSizeLimit' : 'File exceeds size limit.',
|
||||
'multiimage.zeroByteFile' : 'Zero byte file.',
|
||||
'multiimage.invalidFiletype' : 'Invalid file type.',
|
||||
'multiimage.unknownError' : 'Unknown upload error.',
|
||||
'multiimage.pending' : 'Pending ...',
|
||||
'multiimage.uploadError' : 'Upload error',
|
||||
'filemanager.emptyFolder' : '空文件夾',
|
||||
'filemanager.moveup' : '至上一級文件夾',
|
||||
'filemanager.viewType' : '顯示方式:',
|
||||
'filemanager.viewImage' : '縮略圖',
|
||||
'filemanager.listImage' : '詳細信息',
|
||||
'filemanager.orderType' : '排序方式:',
|
||||
'filemanager.fileName' : '名稱',
|
||||
'filemanager.fileSize' : '大小',
|
||||
'filemanager.fileType' : '類型',
|
||||
'insertfile.url' : 'URL',
|
||||
'insertfile.title' : '文件說明',
|
||||
'insertfile.upload' : '上傳',
|
||||
'insertfile.viewServer' : '瀏覽',
|
||||
'table.cells' : '儲存格數',
|
||||
'table.rows' : '欄數',
|
||||
'table.cols' : '列數',
|
||||
'table.size' : '表格大小',
|
||||
'table.width' : '寬度',
|
||||
'table.height' : '高度',
|
||||
'table.percent' : '%',
|
||||
'table.px' : 'px',
|
||||
'table.space' : '內距間距',
|
||||
'table.padding' : '內距',
|
||||
'table.spacing' : '間距',
|
||||
'table.align' : '對齊方式',
|
||||
'table.textAlign' : '水平對齊',
|
||||
'table.verticalAlign' : '垂直對齊',
|
||||
'table.alignDefault' : '未設定',
|
||||
'table.alignLeft' : '向左對齊',
|
||||
'table.alignCenter' : '置中',
|
||||
'table.alignRight' : '向右對齊',
|
||||
'table.alignTop' : '靠上',
|
||||
'table.alignMiddle' : '置中',
|
||||
'table.alignBottom' : '靠下',
|
||||
'table.alignBaseline' : '基線',
|
||||
'table.border' : '表格邊框',
|
||||
'table.borderWidth' : '邊框',
|
||||
'table.borderColor' : '顏色',
|
||||
'table.backgroundColor' : '背景顏色',
|
||||
'map.address' : '住所: ',
|
||||
'map.search' : '尋找',
|
||||
'baidumap.address' : '住所: ',
|
||||
'baidumap.search' : '尋找',
|
||||
'baidumap.insertDynamicMap' : '插入動態地圖',
|
||||
'anchor.name' : '錨點名稱',
|
||||
'formatblock.formatBlock' : {
|
||||
h1 : '標題 1',
|
||||
h2 : '標題 2',
|
||||
h3 : '標題 3',
|
||||
h4 : '標題 4',
|
||||
p : '一般'
|
||||
},
|
||||
'fontname.fontName' : {
|
||||
'MingLiU' : '細明體',
|
||||
'PMingLiU' : '新細明體',
|
||||
'DFKai-SB' : '標楷體',
|
||||
'SimSun' : '宋體',
|
||||
'NSimSun' : '新宋體',
|
||||
'FangSong' : '仿宋體',
|
||||
'Arial' : 'Arial',
|
||||
'Arial Black' : 'Arial Black',
|
||||
'Times New Roman' : 'Times New Roman',
|
||||
'Courier New' : 'Courier New',
|
||||
'Tahoma' : 'Tahoma',
|
||||
'Verdana' : 'Verdana'
|
||||
},
|
||||
'lineheight.lineHeight' : [
|
||||
{'1' : '单倍行距'},
|
||||
{'1.5' : '1.5倍行距'},
|
||||
{'2' : '2倍行距'},
|
||||
{'2.5' : '2.5倍行距'},
|
||||
{'3' : '3倍行距'}
|
||||
],
|
||||
'template.selectTemplate' : '可選樣板',
|
||||
'template.replaceContent' : '取代當前內容',
|
||||
'template.fileList' : {
|
||||
'1.html' : '影像和文字',
|
||||
'2.html' : '表格',
|
||||
'3.html' : '项目清單'
|
||||
}
|
||||
}, 'zh-TW');
|
||||
|
||||
KindEditor.each(KindEditor.options.items, function(i, name) {
|
||||
if (name == 'baidumap') {
|
||||
KindEditor.options.items[i] = 'map';
|
||||
}
|
||||
});
|
||||
KindEditor.options.langType = 'zh-TW';
|
||||
123
public/assets/addons/nkeditor/less/richtext.less
Normal file
|
|
@ -0,0 +1,123 @@
|
|||
.richtext {
|
||||
margin: 8px 0 0;
|
||||
overflow: hidden;
|
||||
h3 {border-left:2px solid @brand-pink;display:block;font-size:18px;text-indent:14px;line-height:18px;font-weight:400;}
|
||||
p,ul,ol {
|
||||
font-family: 'Microsoft YaHei',san-serif;
|
||||
font-size: 14px !important;
|
||||
color: #555;
|
||||
line-height: 29px !important;
|
||||
white-space: pre-line;
|
||||
word-break: break-all
|
||||
}
|
||||
|
||||
p {
|
||||
margin-top: 15px;
|
||||
margin-bottom: 15px;
|
||||
text-indent: 2em;
|
||||
text-align: justify;
|
||||
span {
|
||||
font-family: 'Microsoft YaHei',san-serif;
|
||||
font-size: 14px !important;
|
||||
color: #555;
|
||||
line-height: 29px !important;
|
||||
white-space: pre-line;
|
||||
word-break: break-all
|
||||
}
|
||||
}
|
||||
|
||||
ul,ol {
|
||||
padding-left: 20px;
|
||||
li{
|
||||
text-indent: 0
|
||||
}
|
||||
p {
|
||||
font-size: 18px;
|
||||
text-indent: .5em
|
||||
}
|
||||
}
|
||||
|
||||
ul li {
|
||||
list-style: outside square
|
||||
}
|
||||
|
||||
ol li {
|
||||
list-style: outside decimal
|
||||
}
|
||||
|
||||
strong {
|
||||
font-weight: 700;
|
||||
color: #333
|
||||
}
|
||||
|
||||
img {
|
||||
max-width: 790px;
|
||||
}
|
||||
.pd-card {
|
||||
position: relative;
|
||||
height: 140px;
|
||||
width: 630px;
|
||||
margin: 23px auto;
|
||||
border: 1px solid #eee;
|
||||
.transition(box-shadow 300ms ease-out);
|
||||
&:hover {
|
||||
.box-shadow(0 2px 2px #eee);
|
||||
}
|
||||
.img-wrap {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
z-index: 2;
|
||||
width: 140px;
|
||||
height: 140px;
|
||||
border-right: 1px solid #eee;
|
||||
img {
|
||||
width: 120px;
|
||||
height: 120px;
|
||||
margin: 10px;
|
||||
}
|
||||
}
|
||||
.card-info {
|
||||
.box-sizing(border-box);
|
||||
position: absolute;
|
||||
top: 17px;
|
||||
left: 165px;
|
||||
width: 436px;
|
||||
}
|
||||
.title {
|
||||
max-height: 56px;
|
||||
margin: 0;
|
||||
overflow: hidden;
|
||||
display: -webkit-box;
|
||||
-webkit-line-clamp: 2;
|
||||
-webkit-box-orient: vertical;
|
||||
font-size: 16px;
|
||||
font-weight: 400;
|
||||
line-height: 28px;
|
||||
color: #202e3b;
|
||||
a {
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
}
|
||||
}
|
||||
.card-b {
|
||||
position: absolute;
|
||||
top: 64px;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
}
|
||||
.card-price, .merchant {
|
||||
float: left;
|
||||
}
|
||||
.card-price {
|
||||
margin-right: 22px;
|
||||
font-size: 24px;
|
||||
line-height: 34px;
|
||||
color: #fe5579;
|
||||
}
|
||||
.merchant {
|
||||
margin-top: 10px;
|
||||
color: #6e86ad;
|
||||
}
|
||||
}
|
||||
}
|
||||
9562
public/assets/addons/nkeditor/nkeditor.js
Normal file
1
public/assets/addons/nkeditor/nkeditor.min.js
vendored
Normal file
46
public/assets/addons/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
|
||||
* */
|
||||
115
public/assets/addons/nkeditor/plugins/baidumap/baidumap.js
Normal file
|
|
@ -0,0 +1,115 @@
|
|||
/*******************************************************************************
|
||||
* KindEditor - WYSIWYG HTML Editor for Internet
|
||||
* Copyright (C) 2006-2011 kindsoft.net
|
||||
*
|
||||
* @author Roddy <luolonghao@gmail.com>
|
||||
* @site http://www.kindsoft.net/
|
||||
* @licence http://www.kindsoft.net/license.php
|
||||
*******************************************************************************/
|
||||
|
||||
// Baidu Maps: http://dev.baidu.com/wiki/map/index.php?title=%E9%A6%96%E9%A1%B5
|
||||
|
||||
KindEditor.plugin('baidumap', function (K) {
|
||||
var self = this, name = 'baidumap', lang = self.lang(name + '.');
|
||||
var mapWidth = K.undef(self.mapWidth, Math.min(document.body.clientWidth - 42, 558));
|
||||
var mapHeight = K.undef(self.mapHeight, 360);
|
||||
var getParam = function (name, url) {
|
||||
url = url || location.href;
|
||||
return url.match(new RegExp('[?&]' + name + '=([^?&]+)', 'i')) ? decodeURIComponent(RegExp.$1) : '';
|
||||
};
|
||||
self.clickToolbar(name, function () {
|
||||
if(!self.options.baiduMapKey){
|
||||
alert("请在配置中配置百度地图API密钥");
|
||||
return false;
|
||||
}
|
||||
var img = self.plugin.getSelectedImage();
|
||||
var src = img && img[0] ? $(img[0]).attr("src") : '';
|
||||
var center = getParam("center", src) || self.options.baiduMapCenter || '';
|
||||
var markers = getParam("markers", src);
|
||||
var html = ['<div class="ke-dialog-content-inner" style="padding-top: 0">',
|
||||
'<div class="ke-dialog-row ke-clearfix">',
|
||||
'<div class="ke-header">' + lang.address,
|
||||
'<input id="kindeditor_plugin_map_address" name="address" class="ke-input-text" value="" style="width:200px;" /> ',
|
||||
'<span>',
|
||||
'<input type="button" name="searchBtn" class="ke-button-common ke-button" value="' + lang.search + '" style="line-height:22px;padding:0 10px;" />',
|
||||
'</span>',
|
||||
'<input type="checkbox" id="keInsertDynamicMap" name="insertDynamicMap" class="checkbox" value="1" style="display:inline-block;" /> <label for="keInsertDynamicMap">' + lang.insertDynamicMap + '</label>',
|
||||
'</div>',
|
||||
'</div>',
|
||||
'<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 overlays = map.getOverlays();
|
||||
var markerArr = [];
|
||||
var point;
|
||||
if (overlays) {
|
||||
overlays.forEach(function (item) {
|
||||
if (item.point && item.isVisible() && !item.Fb) {
|
||||
point = item.point.lng + ',' + item.point.lat;
|
||||
if (markerArr.indexOf(point) < 0) {
|
||||
markerArr.push(point);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
var markers = markerArr.join("|");
|
||||
var center = centerObj.lng + ',' + centerObj.lat;
|
||||
var zoom = map.getZoom();
|
||||
var url = [checkbox[0].checked ? self.pluginsPath + 'baidumap/index.html' : 'https://api.map.baidu.com/staticimage',
|
||||
'?center=' + encodeURIComponent(center),
|
||||
'&zoom=' + encodeURIComponent(zoom),
|
||||
'&width=' + mapWidth,
|
||||
'&height=' + mapHeight,
|
||||
'&markers=' + encodeURIComponent(markers),
|
||||
'&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?center=' + center + '&markers=' + markers + '&key=' + (self.options.baiduMapKey || "") + '" 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);
|
||||
searchBtn.click(function () {
|
||||
win.search(addressBox.val());
|
||||
});
|
||||
});
|
||||
});
|
||||
123
public/assets/addons/nkeditor/plugins/baidumap/index.html
Normal file
|
|
@ -0,0 +1,123 @@
|
|||
<!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"/>
|
||||
<title>Map</title>
|
||||
|
||||
<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 charset="utf-8" src="//api.map.baidu.com/api?ak=&v=1.3&services=true&s=1"></script>-->
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div style="width:697px;height:550px;border:#ccc solid 1px;" id="mapContent"></div>
|
||||
</body>
|
||||
<script>
|
||||
window.onload = function () {
|
||||
var req = new XMLHttpRequest();
|
||||
req.open('GET', "/addons/nkeditor/index/get_map_config", false);
|
||||
req.onreadystatechange = function () {
|
||||
if (req.readyState == 4) {
|
||||
try {
|
||||
var params = JSON.parse(req.responseText);
|
||||
loadScript(params.baidumapkey || '');
|
||||
} catch (e) {
|
||||
|
||||
}
|
||||
}
|
||||
};
|
||||
req.send(null);
|
||||
};
|
||||
|
||||
function loadScript(key) {
|
||||
var script = document.createElement("script");
|
||||
script.src = "https://api.map.baidu.com/api?v=3.0&ak=" + (getParam("key") || key) + "&callback=initialize";
|
||||
document.body.appendChild(script);
|
||||
}
|
||||
|
||||
// window.onload = loadScript;
|
||||
|
||||
var centerParam = getParam('center') || '116.404,39.915';
|
||||
var zoomParam = getParam('zoom') || '';
|
||||
var widthParam = getParam('width') || 558;
|
||||
var heightParam = getParam('height') || 360;
|
||||
var markersParam = getParam('markers') || '';
|
||||
|
||||
//创建和初始化地图函数:
|
||||
function initialize() {
|
||||
var mapContent = document.getElementById('mapContent');
|
||||
mapContent.style.width = widthParam + 'px';
|
||||
mapContent.style.height = heightParam + 'px';
|
||||
|
||||
createMap();//创建地图
|
||||
setMapEvent();//设置地图事件
|
||||
addMapControl();//向地图添加控件
|
||||
|
||||
// 创建标注
|
||||
if (markersParam) {
|
||||
markersParam.split('|').forEach(function (value, key){
|
||||
var markersArr = value.replace(/[\s]+/g, '').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("mapContent");//在百度地图容器中创建一个地图
|
||||
var centerArr = centerParam.replace(/[\s]+/g, '').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);
|
||||
}
|
||||
|
||||
//获取URL参数
|
||||
function getParam(name) {
|
||||
return location.href.match(new RegExp('[?&]' + name + '=([^?&]+)', 'i')) ? decodeURIComponent(RegExp.$1) : '';
|
||||
}
|
||||
</script>
|
||||
</html>
|
||||
128
public/assets/addons/nkeditor/plugins/baidumap/map.html
Normal file
|
|
@ -0,0 +1,128 @@
|
|||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<title>Map</title>
|
||||
<style>
|
||||
html {
|
||||
height: 100%
|
||||
}
|
||||
|
||||
body {
|
||||
height: 100%;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
background-color: #FFF
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id="mapContent" style="width:100%; height:100%"></div>
|
||||
|
||||
<!--<script charset="utf-8" src="//api.map.baidu.com/api?ak=&v=1.3&services=true&s=1"></script>-->
|
||||
<script>
|
||||
function loadScript() {
|
||||
if (!(getParam("key") || "")) {
|
||||
alert("请在配置中配置百度地图API密钥");
|
||||
return;
|
||||
}
|
||||
var script = document.createElement("script");
|
||||
script.src = "https://api.map.baidu.com/api?v=3.0&ak=" + (getParam("key") || "") + "&callback=initialize";
|
||||
document.body.appendChild(script);
|
||||
}
|
||||
|
||||
window.onload = loadScript;
|
||||
|
||||
var centerParam = getParam('center') || '116.404413,39.903536';
|
||||
var zoomParam = getParam('zoom') || 11;
|
||||
var widthParam = getParam('width') || 558;
|
||||
var heightParam = getParam('height') || 360;
|
||||
var markersParam = getParam('markers') || '';
|
||||
|
||||
//创建和初始化地图函数:
|
||||
function initialize() {
|
||||
var mapContent = document.getElementById('mapContent');
|
||||
// mapContent.style.width = widthParam + 'px';
|
||||
// mapContent.style.height = heightParam + 'px';
|
||||
|
||||
createMap();//创建地图
|
||||
setMapEvent();//设置地图事件
|
||||
addMapControl();//向地图添加控件
|
||||
|
||||
// 创建标注
|
||||
if (markersParam) {
|
||||
var point, marker, markerArr;
|
||||
var markersArr = markersParam.replace(/[\s]+/g, '').split('|');
|
||||
markersArr.forEach(function (item) {
|
||||
markerArr = item.split(",");
|
||||
point = new BMap.Point(markerArr[0], markerArr[1]);
|
||||
marker = new BMap.Marker(point);
|
||||
map.addOverlay(marker);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
//创建地图函数:
|
||||
function createMap() {
|
||||
var map = new BMap.Map("mapContent");//在百度地图容器中创建一个地图
|
||||
var centerArr = centerParam.replace(/[\s]+/g, '').split(',');
|
||||
var point = new BMap.Point(centerArr[0], centerArr[1]);//定义一个中心点坐标
|
||||
map.centerAndZoom(point, zoomParam);//设定地图的中心点和坐标并将地图显示在地图容器中
|
||||
window.map = map;//将map变量存储在全局
|
||||
|
||||
// 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 setMapEvent() {
|
||||
map.enableDragging();//启用地图拖拽事件,默认启用(可不写)
|
||||
map.enableScrollWheelZoom();//启用地图滚轮放大缩小
|
||||
map.enableDoubleClickZoom();//启用鼠标双击放大,默认启用(可不写)
|
||||
map.enableKeyboard();//启用键盘上下左右键移动地图
|
||||
map.addEventListener("click", function (e) {
|
||||
map.clearOverlays();
|
||||
var marker = new BMap.Marker(e.point, {
|
||||
enableDragging: true
|
||||
});
|
||||
map.addOverlay(marker);
|
||||
});
|
||||
}
|
||||
|
||||
//地图控件添加函数:
|
||||
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);
|
||||
}
|
||||
|
||||
//获取URL参数
|
||||
function getParam(name) {
|
||||
return location.href.match(new RegExp('[?&]' + name + '=([^?&]+)', 'i')) ? decodeURIComponent(RegExp.$1) : '';
|
||||
}
|
||||
|
||||
//执行搜索
|
||||
function search(address) {
|
||||
if (!map) return;
|
||||
var local = new BMap.LocalSearch(map, {
|
||||
renderOptions: {
|
||||
map: map,
|
||||
autoViewport: true,
|
||||
selectFirstResult: false
|
||||
}
|
||||
});
|
||||
local.search(address);
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
29
public/assets/addons/nkeditor/plugins/clearhtml/clearhtml.js
Normal file
|
|
@ -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/assets/addons/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 : Math.min(document.body.clientWidth, 450),
|
||||
title : self.lang(name),
|
||||
body : html,
|
||||
yesBtn : {
|
||||
name : self.lang('yes'),
|
||||
click : function(e) {
|
||||
var type = K('.ke-select', dialog.div).val(),
|
||||
code = textarea.val(),
|
||||
cls = type === '' ? '' : 'language-' + type,
|
||||
html = '<pre class="' + cls + '"><code>' + K.escape(code) + '</code></pre> <br/>';
|
||||
if (K.trim(code) === '') {
|
||||
K.options.errorMsgHandler(lang.pleaseInput, "error");
|
||||
textarea[0].focus();
|
||||
return;
|
||||
}
|
||||
self.insertHtml(html).hideDialog().focus();
|
||||
}
|
||||
}
|
||||
}),
|
||||
textarea = K('textarea', dialog.div);
|
||||
textarea[0].focus();
|
||||
});
|
||||
});
|
||||
18
public/assets/addons/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/assets/addons/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/assets/addons/nkeditor/plugins/code/prism.js
Normal file
129
public/assets/addons/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/assets/addons/nkeditor/plugins/emoticons/images/0.gif
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
public/assets/addons/nkeditor/plugins/emoticons/images/1.gif
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
public/assets/addons/nkeditor/plugins/emoticons/images/10.gif
Normal file
|
After Width: | Height: | Size: 3.6 KiB |
BIN
public/assets/addons/nkeditor/plugins/emoticons/images/100.gif
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
public/assets/addons/nkeditor/plugins/emoticons/images/101.gif
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
BIN
public/assets/addons/nkeditor/plugins/emoticons/images/102.gif
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
public/assets/addons/nkeditor/plugins/emoticons/images/103.gif
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
public/assets/addons/nkeditor/plugins/emoticons/images/104.gif
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
public/assets/addons/nkeditor/plugins/emoticons/images/105.gif
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
public/assets/addons/nkeditor/plugins/emoticons/images/106.gif
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
BIN
public/assets/addons/nkeditor/plugins/emoticons/images/107.gif
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
BIN
public/assets/addons/nkeditor/plugins/emoticons/images/108.gif
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
BIN
public/assets/addons/nkeditor/plugins/emoticons/images/109.gif
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
public/assets/addons/nkeditor/plugins/emoticons/images/11.gif
Normal file
|
After Width: | Height: | Size: 7.8 KiB |
BIN
public/assets/addons/nkeditor/plugins/emoticons/images/110.gif
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
public/assets/addons/nkeditor/plugins/emoticons/images/111.gif
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
BIN
public/assets/addons/nkeditor/plugins/emoticons/images/112.gif
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
public/assets/addons/nkeditor/plugins/emoticons/images/113.gif
Normal file
|
After Width: | Height: | Size: 1015 B |
BIN
public/assets/addons/nkeditor/plugins/emoticons/images/114.gif
Normal file
|
After Width: | Height: | Size: 1003 B |
BIN
public/assets/addons/nkeditor/plugins/emoticons/images/115.gif
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
BIN
public/assets/addons/nkeditor/plugins/emoticons/images/116.gif
Normal file
|
After Width: | Height: | Size: 996 B |
BIN
public/assets/addons/nkeditor/plugins/emoticons/images/117.gif
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
BIN
public/assets/addons/nkeditor/plugins/emoticons/images/118.gif
Normal file
|
After Width: | Height: | Size: 1012 B |
BIN
public/assets/addons/nkeditor/plugins/emoticons/images/119.gif
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
public/assets/addons/nkeditor/plugins/emoticons/images/12.gif
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
public/assets/addons/nkeditor/plugins/emoticons/images/120.gif
Normal file
|
After Width: | Height: | Size: 1008 B |
BIN
public/assets/addons/nkeditor/plugins/emoticons/images/121.gif
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
BIN
public/assets/addons/nkeditor/plugins/emoticons/images/122.gif
Normal file
|
After Width: | Height: | Size: 999 B |
BIN
public/assets/addons/nkeditor/plugins/emoticons/images/123.gif
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
BIN
public/assets/addons/nkeditor/plugins/emoticons/images/124.gif
Normal file
|
After Width: | Height: | Size: 1022 B |
BIN
public/assets/addons/nkeditor/plugins/emoticons/images/125.gif
Normal file
|
After Width: | Height: | Size: 1013 B |
BIN
public/assets/addons/nkeditor/plugins/emoticons/images/126.gif
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
BIN
public/assets/addons/nkeditor/plugins/emoticons/images/127.gif
Normal file
|
After Width: | Height: | Size: 956 B |
BIN
public/assets/addons/nkeditor/plugins/emoticons/images/128.gif
Normal file
|
After Width: | Height: | Size: 1022 B |
BIN
public/assets/addons/nkeditor/plugins/emoticons/images/129.gif
Normal file
|
After Width: | Height: | Size: 972 B |
BIN
public/assets/addons/nkeditor/plugins/emoticons/images/13.gif
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
public/assets/addons/nkeditor/plugins/emoticons/images/130.gif
Normal file
|
After Width: | Height: | Size: 980 B |
BIN
public/assets/addons/nkeditor/plugins/emoticons/images/131.gif
Normal file
|
After Width: | Height: | Size: 945 B |
BIN
public/assets/addons/nkeditor/plugins/emoticons/images/132.gif
Normal file
|
After Width: | Height: | Size: 936 B |
BIN
public/assets/addons/nkeditor/plugins/emoticons/images/133.gif
Normal file
|
After Width: | Height: | Size: 1012 B |
BIN
public/assets/addons/nkeditor/plugins/emoticons/images/134.gif
Normal file
|
After Width: | Height: | Size: 968 B |
BIN
public/assets/addons/nkeditor/plugins/emoticons/images/14.gif
Normal file
|
After Width: | Height: | Size: 3.9 KiB |
BIN
public/assets/addons/nkeditor/plugins/emoticons/images/15.gif
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
public/assets/addons/nkeditor/plugins/emoticons/images/16.gif
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
public/assets/addons/nkeditor/plugins/emoticons/images/17.gif
Normal file
|
After Width: | Height: | Size: 3.3 KiB |
BIN
public/assets/addons/nkeditor/plugins/emoticons/images/18.gif
Normal file
|
After Width: | Height: | Size: 7.9 KiB |
BIN
public/assets/addons/nkeditor/plugins/emoticons/images/19.gif
Normal file
|
After Width: | Height: | Size: 7.9 KiB |
BIN
public/assets/addons/nkeditor/plugins/emoticons/images/2.gif
Normal file
|
After Width: | Height: | Size: 1.8 KiB |