image manager optimization, i18n
This commit is contained in:
1 parent
ad295d97c8
commit
6a35f98f89
24 files changed
+4704
-6
No files matched your search
@@ -14,6 +14,12 @@ type Album struct {
|
|||||||
BaseController
|
BaseController
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 图片管理, iframe
|
||||||
|
func (c Album) Index() revel.Result {
|
||||||
|
c.SetLocale();
|
||||||
|
return c.RenderTemplate("album/index.html")
|
||||||
|
}
|
||||||
|
|
||||||
// all albums by userId
|
// all albums by userId
|
||||||
func (c Album) GetAlbums() revel.Result {
|
func (c Album) GetAlbums() revel.Result {
|
||||||
re := albumService.GetAlbums(c.GetUserId())
|
re := albumService.GetAlbums(c.GetUserId())
|
||||||
|
|||||||
@@ -146,6 +146,7 @@ func init() {
|
|||||||
revel.InterceptFunc(AuthInterceptor, revel.BEFORE, &Note{})
|
revel.InterceptFunc(AuthInterceptor, revel.BEFORE, &Note{})
|
||||||
revel.InterceptFunc(AuthInterceptor, revel.BEFORE, &Share{})
|
revel.InterceptFunc(AuthInterceptor, revel.BEFORE, &Share{})
|
||||||
revel.InterceptFunc(AuthInterceptor, revel.BEFORE, &User{})
|
revel.InterceptFunc(AuthInterceptor, revel.BEFORE, &User{})
|
||||||
|
revel.InterceptFunc(AuthInterceptor, revel.BEFORE, &Album{})
|
||||||
revel.InterceptFunc(AuthInterceptor, revel.BEFORE, &File{})
|
revel.InterceptFunc(AuthInterceptor, revel.BEFORE, &File{})
|
||||||
revel.InterceptFunc(AuthInterceptor, revel.BEFORE, &Attach{})
|
revel.InterceptFunc(AuthInterceptor, revel.BEFORE, &Attach{})
|
||||||
// revel.InterceptFunc(AuthInterceptor, revel.BEFORE, &Blog{})
|
// revel.InterceptFunc(AuthInterceptor, revel.BEFORE, &Blog{})
|
||||||
|
|||||||
@@ -0,0 +1,166 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||||
|
<title>
|
||||||
|
Leanote Album Image Manager
|
||||||
|
</title>
|
||||||
|
|
||||||
|
<link href="/css/bootstrap-min.css" rel="stylesheet" />
|
||||||
|
<link href="/css/font-awesome-4.2.0/css/font-awesome-min.css" rel="stylesheet" />
|
||||||
|
<link href="/public/album/css/style-min.css" rel="stylesheet" />
|
||||||
|
|
||||||
|
</head>
|
||||||
|
<body class="md" id="body">
|
||||||
|
<div style="margin: 3px;">
|
||||||
|
<div class="holder"></div>
|
||||||
|
|
||||||
|
<div class="tabs">
|
||||||
|
<ul id="myTab" class="nav nav-tabs">
|
||||||
|
<li class="active"><a href="#images" data-toggle="tab">{{leaMsg . "Images"}}</a></li>
|
||||||
|
<li class=""><a href="#uploadTab" data-toggle="tab">{{leaMsg . "Upload"}}</a></li>
|
||||||
|
<li class=""><a href="#url" data-toggle="tab">{{leaMsg . "Image URL"}}</a></li>
|
||||||
|
</ul>
|
||||||
|
<div id="myTabContent" class="tab-content">
|
||||||
|
<div class="tab-pane fade active in" id="images">
|
||||||
|
<!-- tools -->
|
||||||
|
<div>
|
||||||
|
<form class="form-inline" role="form">
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label" for="albums">{{leaMsg . "Albums"}}:</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<select class="form-control" id="albumsForList">
|
||||||
|
<option value="">{{leaMsg . "Default"}}</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<input class="form-control" type="text" id="key" placeholder="{{leaMsg . "File title search"}}"/>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<a href="javascript:;" title="refresh" id="refresh"><span class="fa fa-refresh"></span></a>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="imagePage">
|
||||||
|
<ul id="imageList" class="clearfix">
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<!-- pagination -->
|
||||||
|
<div id="paginationContainer">
|
||||||
|
<ul class="pagination">
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="imageMask">
|
||||||
|
<div id="noImages">
|
||||||
|
<p>{{msg . "No Images"}}!</p>
|
||||||
|
<btn class="btn btn-default" id="goAddImageBtn">{{leaMsg . "Go to upload images"}}</btn>
|
||||||
|
</div>
|
||||||
|
<div id="loading">
|
||||||
|
loading....
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="tab-pane fade" id="uploadTab">
|
||||||
|
<div>
|
||||||
|
<form class="form-inline" role="form">
|
||||||
|
<div class="form-group" id="albumSelect">
|
||||||
|
<label class="control-label" for="albums">{{leaMsg . "Albums"}}:</label>
|
||||||
|
|
||||||
|
<select class="form-control" id="albumsForUpload">
|
||||||
|
<option value="">{{leaMsg . "Default"}}</option>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<a href="javascript:;" id="deleteAlbumBtn">{{leaMsg . "Delete"}}</a> |
|
||||||
|
<a href="javascript:;" id="renameAlbumBtn">{{leaMsg . "Rename"}}</a> |
|
||||||
|
<a href="javascript:;" id="addAlbumBtn">{{leaMsg . "Add"}}</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- rename or add album -->
|
||||||
|
<div class="form-group" style="display: none" id="addOrUpdateAlbumForm">
|
||||||
|
<input type="text" class="form-control" style="width: 150px" id="albumName">
|
||||||
|
<button class="btn btn-success" type="button" id="addOrUpdateAlbumBtn">{{leaMsg . "Add Album"}}</button>
|
||||||
|
<button class="btn btn-default" type="button" id="cancelAlbumBtn">{{leaMsg . "Cancel"}}</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<span id="msg" class="alert alert-success" style="padding: 3px; display: none"></span>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<form id="upload" method="post" action="/file/uploadImageLeaui" enctype="multipart/form-data" style="margin-top: 5px;">
|
||||||
|
<div id="drop">
|
||||||
|
<a class="btn btn-default">
|
||||||
|
{{leaMsg . "Click to upload images Or Drop images to here"}}
|
||||||
|
</a>
|
||||||
|
<input type="file" name="file" multiple />
|
||||||
|
</div>
|
||||||
|
<ul id="upload-msg">
|
||||||
|
</ul>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="tab-pane fade" id="url">
|
||||||
|
<form class="form-inline" id="imageUrlForm" style="">
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label" for="imageUrl">{{leaMsg . "Image URL"}}:</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<input type="text" class="form-control" id="imageUrl" size="51"/>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<button class="btn btn-success" id="addImageUrlBtn">{{leaMsg . "Add Image"}}</button>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<div class="alert alert-danger" id="msgForUrl"
|
||||||
|
style="display: none; padding: 5px; width: 150px;">
|
||||||
|
{{leaMsg . "Can't load this url"}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<ul id="preview" class="clearfix">
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
<div id="previewAttrs" style="margin-left: 10px">
|
||||||
|
<form class="form-inline" role="form">
|
||||||
|
<div class="form-group">
|
||||||
|
<input class="form-control" id="attrTitle" placeholder="title" size="20" disabled/>
|
||||||
|
<input class="form-control" id="attrWidth" placeholder="width" size="5" disabled/> X
|
||||||
|
<input class="form-control" id="attrHeight" placeholder="height" size="5" disabled/>
|
||||||
|
<label><input type="checkbox" value="1" id="attrConstrain" disabled/> Constrain proportions</label>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
-->
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
// javascript global configration
|
||||||
|
var G = {};
|
||||||
|
G.imageSrcPrefix = 'upload';
|
||||||
|
G.perPageItems = 12;
|
||||||
|
G.maxSelected = 1;
|
||||||
|
var UrlPrefix = '{{.siteUrl}}';
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
<script src="/js/jquery-1.9.0.min.js"></script>
|
||||||
|
<script src="/js/bootstrap-min.js"></script>
|
||||||
|
<script src="/js/plugins/libs-min/fileupload.js"></script>
|
||||||
|
<script src="/js/jquery.pagination.js"></script>
|
||||||
|
<script src="/public/album/js/main.js"></script>
|
||||||
|
-->
|
||||||
|
|
||||||
|
<script src="/public/album/js/main.all.js"></script>
|
||||||
|
|
||||||
|
</html>
|
||||||
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
#drop,#imageList li,#upload{position:relative}#imageMask,#upload-msg{position:absolute;top:0}*{font-family:'Open Sans','Helvetica Neue',Arial,'Hiragino Sans GB','Microsoft YaHei','WenQuanYi Micro Hei',sans-serif}#drop{width:99%;min-height:260px;border:1px dotted #000;z-index:2;text-align:center}#drop.in{border:2px solid #000}#drop a{left:33%;top:105px;z-index:15;position:absolute}#drop input{display:none}#upload-msg{list-style-type:none;padding-left:0;margin-left:0;right:10px;width:300px;max-height:240px;overflow:auto;z-index:3}#imageList li,#preview li,.md{overflow:hidden}.tab-pane{padding:10px}#paginationContainer{text-align:right}#imageList{margin:10px 0 0;padding:0;height:196px}#imageList li{display:inline-block;float:left;padding:0;margin:0 3px 3px 0;height:90px;width:122px;border:1px solid #eee}#imageList li .a-img{line-height:80px;display:block;text-align:center}#imageList li:hover{border:1px solid #FF7300}#imageList li.selected{border:2px solid #FF7300}#imageList li img{max-width:100%;vertical-align:middle}#imageList li .tools{position:absolute;bottom:0;left:0;right:0;background-color:#fff;padding-right:2px;text-align:right;opacity:.7}.tools .file-title{width:100px;height:20px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;text-align:left}#imageList li:hover .tools{display:block;opacity:.9}.alert{padding:5px;margin-bottom:3px}#preview{margin:3px 0 3px 10px;padding:5px 0 0;border-top:1px solid #eee}#preview li{position:relative;display:inline-block;float:left;border:1px solid #E6E5E3;background-color:#FFF;width:64px;height:64px;margin-right:10px;line-height:64px;text-align:center;color:#E1E1E1;font-size:28px;cursor:pointer}#preview li:hover{border:1px solid #FF7300}#preview li.selected{border:2px solid #FF7300}#preview li .tools{position:absolute;bottom:0;right:0;left:0;height:15px;line-height:15px;font-size:14px;text-align:right}#preview li .tools a{color:red}#imagePage{position:relative}#imageMask{background:#fff;left:0;right:0;bottom:20px;font-size:18px;text-align:center;display:none;z-index:2}#previewAttrs .form-control{width:auto}#previewAttrs label{font-weight:400}@media screen and (max-width:700px){#previewAttrs{display:none}#drop{min-height:initial;padding:10px 0}#drop a{position:initial;margin:auto}#url form{margin:0!important}.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{width:auto;display:inline-block}#preview li:nth-child(10),#preview li:nth-child(3n),#preview li:nth-child(4n),#preview li:nth-child(5),#preview li:nth-child(7){display:none}#imageList li{width:90px}}#imageUrlForm{min-height:260px;text-align:center;padding-top:100px}.md{position:relative;height:350px}.md #previewAttrs{display:none}.md #preview{border:none;position:absolute;bottom:0;left:0;z-index:3}.md #drop{min-height:250px}#albumsForUpload{width:150px}
|
||||||
@@ -0,0 +1,243 @@
|
|||||||
|
* {
|
||||||
|
font-family: 'Open Sans', 'Helvetica Neue', Arial, 'Hiragino Sans GB', 'Microsoft YaHei', 'WenQuanYi Micro Hei', sans-serif;
|
||||||
|
}
|
||||||
|
/* upload */
|
||||||
|
#upload {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
#drop {
|
||||||
|
position: relative;
|
||||||
|
width: 99%;
|
||||||
|
min-height: 260px;
|
||||||
|
border: 1px dotted #000000;
|
||||||
|
z-index: 2;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
#drop.in {
|
||||||
|
border: 2px solid #000000;
|
||||||
|
}
|
||||||
|
#drop a {
|
||||||
|
left: 33%;
|
||||||
|
top: 105px;
|
||||||
|
z-index: 15;
|
||||||
|
position: absolute;
|
||||||
|
}
|
||||||
|
#drop input {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
#upload-msg {
|
||||||
|
list-style-type: none;
|
||||||
|
padding-left: 0px;
|
||||||
|
margin-left: 0px;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
right: 10px;
|
||||||
|
width: 300px;
|
||||||
|
max-height: 240px;
|
||||||
|
overflow: auto;
|
||||||
|
z-index: 3;
|
||||||
|
}
|
||||||
|
/**/
|
||||||
|
.tab-pane {
|
||||||
|
padding: 10px;
|
||||||
|
}
|
||||||
|
#paginationContainer {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
#imageList {
|
||||||
|
margin: 0;
|
||||||
|
margin-top: 10px;
|
||||||
|
padding: 0;
|
||||||
|
height: 196px;
|
||||||
|
}
|
||||||
|
#imageList li {
|
||||||
|
display: inline-block;
|
||||||
|
float: left;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0 3px 3px 0;
|
||||||
|
position: relative;
|
||||||
|
height: 90px;
|
||||||
|
width: 122px;
|
||||||
|
overflow: hidden;
|
||||||
|
border: 1px solid #eee;
|
||||||
|
}
|
||||||
|
#imageList li .a-img {
|
||||||
|
line-height: 80px;
|
||||||
|
display: block;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
#imageList li:hover {
|
||||||
|
border: 1px solid #FF7300;
|
||||||
|
}
|
||||||
|
#imageList li.selected {
|
||||||
|
border: solid 2px #FF7300;
|
||||||
|
}
|
||||||
|
#imageList li img {
|
||||||
|
max-width: 100%;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
#imageList li .tools {
|
||||||
|
position: absolute;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
background-color: #fff;
|
||||||
|
padding-right: 2px;
|
||||||
|
text-align: right;
|
||||||
|
opacity: 0.7;
|
||||||
|
}
|
||||||
|
.tools .file-title {
|
||||||
|
width: 100px;
|
||||||
|
height: 20px;
|
||||||
|
white-space: nowrap;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
overflow: hidden;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
#imageList li:hover .tools {
|
||||||
|
display: block;
|
||||||
|
opacity: 0.9;
|
||||||
|
}
|
||||||
|
.alert {
|
||||||
|
padding: 5px;
|
||||||
|
margin-bottom: 3px;
|
||||||
|
}
|
||||||
|
.tabs {
|
||||||
|
/*height: 350px;*/
|
||||||
|
}
|
||||||
|
#preview {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
margin-left: 10px;
|
||||||
|
margin-top: 3px;
|
||||||
|
margin-bottom: 3px;
|
||||||
|
padding-top: 5px;
|
||||||
|
border-top: 1px solid #eee;
|
||||||
|
}
|
||||||
|
#preview li {
|
||||||
|
position: relative;
|
||||||
|
display: inline-block;
|
||||||
|
float: left;
|
||||||
|
border: solid 1px #E6E5E3;
|
||||||
|
background-color: #FFF;
|
||||||
|
width: 64px;
|
||||||
|
height: 64px;
|
||||||
|
overflow: hidden;
|
||||||
|
margin-right: 10px;
|
||||||
|
line-height: 64px;
|
||||||
|
text-align: center;
|
||||||
|
/*font-style: italic;*/
|
||||||
|
color: #E1E1E1;
|
||||||
|
font-size: 28px;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
#preview li:hover {
|
||||||
|
border: 1px solid #FF7300;
|
||||||
|
}
|
||||||
|
#preview li.selected {
|
||||||
|
border: solid 2px #FF7300;
|
||||||
|
}
|
||||||
|
#preview li .tools {
|
||||||
|
position: absolute;
|
||||||
|
bottom: 0;
|
||||||
|
right: 0;
|
||||||
|
left: 0;
|
||||||
|
height: 15px;
|
||||||
|
line-height: 15px;
|
||||||
|
font-size: 14px;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
#preview li .tools a {
|
||||||
|
color: red;
|
||||||
|
}
|
||||||
|
/**/
|
||||||
|
#imagePage {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
#imageMask {
|
||||||
|
position: absolute;
|
||||||
|
background: #fff;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
top: 0;
|
||||||
|
bottom: 20px;
|
||||||
|
font-size: 18px;
|
||||||
|
text-align: center;
|
||||||
|
display: none;
|
||||||
|
z-index: 2;
|
||||||
|
}
|
||||||
|
/**/
|
||||||
|
#previewAttrs .form-control {
|
||||||
|
width: auto;
|
||||||
|
}
|
||||||
|
#previewAttrs label {
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width:700px) {
|
||||||
|
#previewAttrs {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
#drop {
|
||||||
|
min-height: initial;
|
||||||
|
padding: 10px 0;
|
||||||
|
}
|
||||||
|
#drop a {
|
||||||
|
position: initial;
|
||||||
|
margin: auto;
|
||||||
|
}
|
||||||
|
#url form {
|
||||||
|
margin: 0 !important;
|
||||||
|
margin: auto;
|
||||||
|
}
|
||||||
|
.form-inline .form-group {
|
||||||
|
display: inline-block;
|
||||||
|
margin-bottom: 0;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
.form-inline .form-control {
|
||||||
|
width: auto;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
#preview li:nth-child(3n),
|
||||||
|
#preview li:nth-child(4n),
|
||||||
|
#preview li:nth-child(5),
|
||||||
|
#preview li:nth-child(7),
|
||||||
|
#preview li:nth-child(10)
|
||||||
|
{
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
#imageList li {
|
||||||
|
width: 90px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#imageUrlForm {
|
||||||
|
min-height: 260px;
|
||||||
|
text-align: center;
|
||||||
|
padding-top: 100px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md {
|
||||||
|
position: relative;
|
||||||
|
height: 350px;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
.md #previewAttrs {
|
||||||
|
display: none;
|
||||||
|
|
||||||
|
}
|
||||||
|
.md #preview {
|
||||||
|
border: none;
|
||||||
|
position: absolute;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
z-index: 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md #drop {
|
||||||
|
min-height: 250px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#albumsForUpload {
|
||||||
|
width: 150px;
|
||||||
|
}
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 723 B |
@@ -0,0 +1,7 @@
|
|||||||
|
!function(e,t){"use strict";function n(e){var t=e.length,n=st.type(e);return st.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}function r(e){var t=Tt[e]={};return st.each(e.match(lt)||[],function(e,n){t[n]=!0}),t}function i(e,n,r,i){if(st.acceptData(e)){var o,a,s=st.expando,u="string"==typeof n,l=e.nodeType,c=l?st.cache:e,f=l?e[s]:e[s]&&s;if(f&&c[f]&&(i||c[f].data)||!u||r!==t)return f||(l?e[s]=f=K.pop()||st.guid++:f=s),c[f]||(c[f]={},l||(c[f].toJSON=st.noop)),("object"==typeof n||"function"==typeof n)&&(i?c[f]=st.extend(c[f],n):c[f].data=st.extend(c[f].data,n)),o=c[f],i||(o.data||(o.data={}),o=o.data),r!==t&&(o[st.camelCase(n)]=r),u?(a=o[n],null==a&&(a=o[st.camelCase(n)])):a=o,a}}function o(e,t,n){if(st.acceptData(e)){var r,i,o,a=e.nodeType,u=a?st.cache:e,l=a?e[st.expando]:st.expando;if(u[l]){if(t&&(r=n?u[l]:u[l].data)){st.isArray(t)?t=t.concat(st.map(t,st.camelCase)):t in r?t=[t]:(t=st.camelCase(t),t=t in r?[t]:t.split(" "));for(i=0,o=t.length;o>i;i++)delete r[t[i]];if(!(n?s:st.isEmptyObject)(r))return}(n||(delete u[l].data,s(u[l])))&&(a?st.cleanData([e],!0):st.support.deleteExpando||u!=u.window?delete u[l]:u[l]=null)}}}function a(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(Nt,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:wt.test(r)?st.parseJSON(r):r}catch(o){}st.data(e,n,r)}else r=t}return r}function s(e){var t;for(t in e)if(("data"!==t||!st.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}function u(){return!0}function l(){return!1}function c(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}function f(e,t,n){if(t=t||0,st.isFunction(t))return st.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return st.grep(e,function(e){return e===t===n});if("string"==typeof t){var r=st.grep(e,function(e){return 1===e.nodeType});if(Wt.test(t))return st.filter(t,r,!n);t=st.filter(t,r)}return st.grep(e,function(e){return st.inArray(e,t)>=0===n})}function p(e){var t=zt.split("|"),n=e.createDocumentFragment();if(n.createElement)for(;t.length;)n.createElement(t.pop());return n}function d(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function h(e){var t=e.getAttributeNode("type");return e.type=(t&&t.specified)+"/"+e.type,e}function g(e){var t=nn.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function m(e,t){for(var n,r=0;null!=(n=e[r]);r++)st._data(n,"globalEval",!t||st._data(t[r],"globalEval"))}function y(e,t){if(1===t.nodeType&&st.hasData(e)){var n,r,i,o=st._data(e),a=st._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)st.event.add(t,n,s[n][r])}a.data&&(a.data=st.extend({},a.data))}}function v(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!st.support.noCloneEvent&&t[st.expando]){r=st._data(t);for(i in r.events)st.removeEvent(t,i,r.handle);t.removeAttribute(st.expando)}"script"===n&&t.text!==e.text?(h(t).text=e.text,g(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),st.support.html5Clone&&e.innerHTML&&!st.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Zt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}function b(e,n){var r,i,o=0,a=e.getElementsByTagName!==t?e.getElementsByTagName(n||"*"):e.querySelectorAll!==t?e.querySelectorAll(n||"*"):t;if(!a)for(a=[],r=e.childNodes||e;null!=(i=r[o]);o++)!n||st.nodeName(i,n)?a.push(i):st.merge(a,b(i,n));return n===t||n&&st.nodeName(e,n)?st.merge([e],a):a}function x(e){Zt.test(e.type)&&(e.defaultChecked=e.checked)}function T(e,t){if(t in e)return t;for(var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=Nn.length;i--;)if(t=Nn[i]+n,t in e)return t;return r}function w(e,t){return e=t||e,"none"===st.css(e,"display")||!st.contains(e.ownerDocument,e)}function N(e,t){for(var n,r=[],i=0,o=e.length;o>i;i++)n=e[i],n.style&&(r[i]=st._data(n,"olddisplay"),t?(r[i]||"none"!==n.style.display||(n.style.display=""),""===n.style.display&&w(n)&&(r[i]=st._data(n,"olddisplay",S(n.nodeName)))):r[i]||w(n)||st._data(n,"olddisplay",st.css(n,"display")));for(i=0;o>i;i++)n=e[i],n.style&&(t&&"none"!==n.style.display&&""!==n.style.display||(n.style.display=t?r[i]||"":"none"));return e}function C(e,t,n){var r=mn.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function k(e,t,n,r,i){for(var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;4>o;o+=2)"margin"===n&&(a+=st.css(e,n+wn[o],!0,i)),r?("content"===n&&(a-=st.css(e,"padding"+wn[o],!0,i)),"margin"!==n&&(a-=st.css(e,"border"+wn[o]+"Width",!0,i))):(a+=st.css(e,"padding"+wn[o],!0,i),"padding"!==n&&(a+=st.css(e,"border"+wn[o]+"Width",!0,i)));return a}function E(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=ln(e),a=st.support.boxSizing&&"border-box"===st.css(e,"boxSLine truncated
|
||||||
|
},set:function(e,n,r){return st.nodeName(e,"input")?(e.defaultValue=n,t):Ct&&Ct.set(e,n,r)}}),Ht||(Ct=st.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&("id"===n||"name"===n||"coords"===n?""!==r.value:r.specified)?r.value:t},set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},st.attrHooks.contenteditable={get:Ct.get,set:function(e,t,n){Ct.set(e,""===t?!1:t,n)}},st.each(["width","height"],function(e,n){st.attrHooks[n]=st.extend(st.attrHooks[n],{set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}})})),st.support.hrefNormalized||(st.each(["href","src","width","height"],function(e,n){st.attrHooks[n]=st.extend(st.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return null==r?t:r}})}),st.each(["href","src"],function(e,t){st.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}})),st.support.style||(st.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),st.support.optSelected||(st.propHooks.selected=st.extend(st.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),st.support.enctype||(st.propFix.enctype="encoding"),st.support.checkOn||st.each(["radio","checkbox"],function(){st.valHooks[this]={get:function(e){return null===e.getAttribute("value")?"on":e.value}}}),st.each(["radio","checkbox"],function(){st.valHooks[this]=st.extend(st.valHooks[this],{set:function(e,n){return st.isArray(n)?e.checked=st.inArray(st(e).val(),n)>=0:t}})});var qt=/^(?:input|select|textarea)$/i,_t=/^key/,Ft=/^(?:mouse|contextmenu)|click/,Ot=/^(?:focusinfocus|focusoutblur)$/,Bt=/^([^.]*)(?:\.(.+)|)$/;st.event={global:{},add:function(e,n,r,i,o){var a,s,u,l,c,f,p,d,h,g,m,y=3!==e.nodeType&&8!==e.nodeType&&st._data(e);if(y){for(r.handler&&(a=r,r=a.handler,o=a.selector),r.guid||(r.guid=st.guid++),(l=y.events)||(l=y.events={}),(s=y.handle)||(s=y.handle=function(e){return st===t||e&&st.event.triggered===e.type?t:st.event.dispatch.apply(s.elem,arguments)},s.elem=e),n=(n||"").match(lt)||[""],c=n.length;c--;)u=Bt.exec(n[c])||[],h=m=u[1],g=(u[2]||"").split(".").sort(),p=st.event.special[h]||{},h=(o?p.delegateType:p.bindType)||h,p=st.event.special[h]||{},f=st.extend({type:h,origType:m,data:i,handler:r,guid:r.guid,selector:o,needsContext:o&&st.expr.match.needsContext.test(o),namespace:g.join(".")},a),(d=l[h])||(d=l[h]=[],d.delegateCount=0,p.setup&&p.setup.call(e,i,g,s)!==!1||(e.addEventListener?e.addEventListener(h,s,!1):e.attachEvent&&e.attachEvent("on"+h,s))),p.add&&(p.add.call(e,f),f.handler.guid||(f.handler.guid=r.guid)),o?d.splice(d.delegateCount++,0,f):d.push(f),st.event.global[h]=!0;e=null}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,m=st.hasData(e)&&st._data(e);if(m&&(u=m.events)){for(t=(t||"").match(lt)||[""],l=t.length;l--;)if(s=Bt.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){for(f=st.event.special[d]||{},d=(r?f.delegateType:f.bindType)||d,p=u[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;o--;)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&f.teardown.call(e,h,m.handle)!==!1||st.removeEvent(e,d,m.handle),delete u[d])}else for(d in u)st.event.remove(e,d+t[l],n,r,!0);st.isEmptyObject(u)&&(delete m.handle,st._removeData(e,"events"))}},trigger:function(n,r,i,o){var a,s,u,l,c,f,p,d=[i||V],h=n.type||n,g=n.namespace?n.namespace.split("."):[];if(s=u=i=i||V,3!==i.nodeType&&8!==i.nodeType&&!Ot.test(h+st.event.triggered)&&(h.indexOf(".")>=0&&(g=h.split("."),h=g.shift(),g.sort()),c=0>h.indexOf(":")&&"on"+h,n=n[st.expando]?n:new st.Event(h,"object"==typeof n&&n),n.isTrigger=!0,n.namespace=g.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+g.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:st.makeArray(r,[n]),p=st.event.special[h]||{},o||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!o&&!p.noBubble&&!st.isWindow(i)){for(l=p.delegateType||h,Ot.test(l+h)||(s=s.parentNode);s;s=s.parentNode)d.push(s),u=s;u===(i.ownerDocument||V)&&d.push(u.defaultView||u.parentWindow||e)}for(a=0;(s=d[a++])&&!n.isPropagationStopped();)n.type=a>1?l:p.bindType||h,f=(st._data(s,"events")||{})[n.type]&&st._data(s,"handle"),f&&f.apply(s,r),f=c&&s[c],f&&st.acceptData(s)&&f.apply&&f.apply(s,r)===!1&&n.preventDefault();if(n.type=h,!(o||n.isDefaultPrevented()||p._default&&p._default.apply(i.ownerDocument,r)!==!1||"click"===h&&st.nodeName(i,"a")||!st.acceptData(i)||!c||!i[h]||st.isWindow(i))){u=i[c],u&&(i[c]=null),st.event.triggered=h;try{i[h]()}catch(m){}st.event.triggered=t,u&&(i[c]=u)}return n.result}},dispatch:function(e){e=st.event.fix(e);var n,r,i,o,a,s=[],u=nt.call(arguments),l=(st._data(this,"events")||{})[e.type]||[],c=sLine truncated
|
||||||
|
},nextAll:function(e){return st.dir(e,"nextSibling")},prevAll:function(e){return st.dir(e,"previousSibling")},nextUntil:function(e,t,n){return st.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return st.dir(e,"previousSibling",n)},siblings:function(e){return st.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return st.sibling(e.firstChild)},contents:function(e){return st.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:st.merge([],e.childNodes)}},function(e,t){st.fn[e]=function(n,r){var i=st.map(this,t,n);return Pt.test(e)||(r=n),r&&"string"==typeof r&&(i=st.filter(r,i)),i=this.length>1&&!It[e]?st.unique(i):i,this.length>1&&Rt.test(e)&&(i=i.reverse()),this.pushStack(i)}}),st.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),1===t.length?st.find.matchesSelector(t[0],e)?[t[0]]:[]:st.find.matches(e,t)},dir:function(e,n,r){for(var i=[],o=e[n];o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!st(o).is(r));)1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});var zt="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",Xt=/ jQuery\d+="(?:null|\d+)"/g,Ut=RegExp("<(?:"+zt+")[\\s/>]","i"),Vt=/^\s+/,Yt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,Jt=/<([\w:]+)/,Gt=/<tbody/i,Qt=/<|&#?\w+;/,Kt=/<(?:script|style|link)/i,Zt=/^(?:checkbox|radio)$/i,en=/checked\s*(?:[^=]|=\s*.checked.)/i,tn=/^$|\/(?:java|ecma)script/i,nn=/^true\/(.*)/,rn=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,on={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:st.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},an=p(V),sn=an.appendChild(V.createElement("div"));on.optgroup=on.option,on.tbody=on.tfoot=on.colgroup=on.caption=on.thead,on.th=on.td,st.fn.extend({text:function(e){return st.access(this,function(e){return e===t?st.text(this):this.empty().append((this[0]&&this[0].ownerDocument||V).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(st.isFunction(e))return this.each(function(t){st(this).wrapAll(e.call(this,t))});if(this[0]){var t=st(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstChild&&1===e.firstChild.nodeType;)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return this.each(st.isFunction(e)?function(t){st(this).wrapInner(e.call(this,t))}:function(){var t=st(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=st.isFunction(e);return this.each(function(n){st(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){st.nodeName(this,"body")||st(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.insertBefore(e,this.firstChild)})},before:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){for(var n,r=0;null!=(n=this[r]);r++)(!e||st.filter(e,[n]).length>0)&&(t||1!==n.nodeType||st.cleanData(b(n)),n.parentNode&&(t&&st.contains(n.ownerDocument,n)&&m(b(n,"script")),n.parentNode.removeChild(n)));return this},empty:function(){for(var e,t=0;null!=(e=this[t]);t++){for(1===e.nodeType&&st.cleanData(b(e,!1));e.firstChild;)e.removeChild(e.firstChild);e.options&&st.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return st.clone(this,e,t)})},html:function(e){return st.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(Xt,""):t;if(!("string"!=typeof e||Kt.test(e)||!st.support.htmlSerialize&&Ut.test(e)||!st.support.leadingWhitespace&&Vt.test(e)||on[(Jt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(Yt,"<$1></$2>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(st.cleanData(b(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){var t=st.isFunction(e);return t||"string"==typeof e||(e=st(e).not(this).detach()),this.domManip([e],!0,function(e){var t=this.nextSibling,n=this.parentNode;(n&&1===this.nodeType||11===this.nodeType)&&(st(this).remove(),t?t.pareLine truncated
|
||||||
|
if("undefined"==typeof jQuery)throw new Error("Bootstrap requires jQuery");+function(t){"use strict";function e(){var t=document.createElement("bootstrap"),e={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var i in e)if(void 0!==t.style[i])return{end:e[i]}}t.fn.emulateTransitionEnd=function(e){var i=!1,o=this;t(this).one(t.support.transition.end,function(){i=!0});var n=function(){i||t(o).trigger(t.support.transition.end)};return setTimeout(n,e),this},t(function(){t.support.transition=e()})}(jQuery),+function(t){"use strict";var e='[data-dismiss="alert"]',i=function(i){t(i).on("click",e,this.close)};i.prototype.close=function(e){function i(){s.trigger("closed.bs.alert").remove()}var o=t(this),n=o.attr("data-target");n||(n=o.attr("href"),n=n&&n.replace(/.*(?=#[^\s]*$)/,""));var s=t(n);e&&e.preventDefault(),s.length||(s=o.hasClass("alert")?o:o.parent()),s.trigger(e=t.Event("close.bs.alert")),e.isDefaultPrevented()||(s.removeClass("in"),t.support.transition&&s.hasClass("fade")?s.one(t.support.transition.end,i).emulateTransitionEnd(150):i())};var o=t.fn.alert;t.fn.alert=function(e){return this.each(function(){var o=t(this),n=o.data("bs.alert");n||o.data("bs.alert",n=new i(this)),"string"==typeof e&&n[e].call(o)})},t.fn.alert.Constructor=i,t.fn.alert.noConflict=function(){return t.fn.alert=o,this},t(document).on("click.bs.alert.data-api",e,i.prototype.close)}(jQuery),+function(t){"use strict";var e=function(i,o){this.$element=t(i),this.options=t.extend({},e.DEFAULTS,o)};e.DEFAULTS={loadingText:"loading..."},e.prototype.setState=function(t){var e="disabled",i=this.$element,o=i.is("input")?"val":"html",n=i.data();t+="Text",n.resetText||i.data("resetText",i[o]()),i[o](n[t]||this.options[t]),setTimeout(function(){"loadingText"==t?i.addClass(e).attr(e,e):i.removeClass(e).removeAttr(e)},0)},e.prototype.toggle=function(){var t=this.$element.closest('[data-toggle="buttons"]');if(t.length){var e=this.$element.find("input").prop("checked",!this.$element.hasClass("active")).trigger("change");"radio"===e.prop("type")&&t.find(".active").removeClass("active")}this.$element.toggleClass("active")};var i=t.fn.button;t.fn.button=function(i){return this.each(function(){var o=t(this),n=o.data("bs.button"),s="object"==typeof i&&i;n||o.data("bs.button",n=new e(this,s)),"toggle"==i?n.toggle():i&&n.setState(i)})},t.fn.button.Constructor=e,t.fn.button.noConflict=function(){return t.fn.button=i,this},t(document).on("click.bs.button.data-api","[data-toggle^=button]",function(e){var i=t(e.target);i.hasClass("btn")||(i=i.closest(".btn")),i.button("toggle"),e.preventDefault()})}(jQuery),+function(t){"use strict";var e=function(e,i){this.$element=t(e),this.$indicators=this.$element.find(".carousel-indicators"),this.options=i,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter",t.proxy(this.pause,this)).on("mouseleave",t.proxy(this.cycle,this))};e.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},e.prototype.cycle=function(e){return e||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(t.proxy(this.next,this),this.options.interval)),this},e.prototype.getActiveIndex=function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},e.prototype.to=function(e){var i=this,o=this.getActiveIndex();return e>this.$items.length-1||0>e?void 0:this.sliding?this.$element.one("slid",function(){i.to(e)}):o==e?this.pause().cycle():this.slide(e>o?"next":"prev",t(this.$items[e]))},e.prototype.pause=function(e){return e||(this.paused=!0),this.$element.find(".next, .prev").length&&t.support.transition.end&&(this.$element.trigger(t.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},e.prototype.next=function(){return this.sliding?void 0:this.slide("next")},e.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},e.prototype.slide=function(e,i){var o=this.$element.find(".item.active"),n=i||o[e](),s=this.interval,a="next"==e?"left":"right",r="next"==e?"first":"last",l=this;if(!n.length){if(!this.options.wrap)return;n=this.$element.find(".item")[r]()}this.sliding=!0,s&&this.pause();var h=t.Event("slide.bs.carousel",{relatedTarget:n[0],direction:a});if(!n.hasClass("active")){if(this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid",function(){var e=t(l.$indicators.children()[l.getActiveIndex()]);e&&e.addClass("active")})),t.support.transition&&this.$element.hasClass("slide")){if(this.$element.trigger(h),h.isDefaultPrevented())return;n.addClass(e),n[0].offsetWidth,o.addClass(a),n.addClass(a),o.one(t.support.transition.end,function(){n.removeClass([e,a].join(" ")).addClass("active"),o.removeClass(["active",a].join(" ")),l.sliding=!1,setTimeout(functioLine truncated
|
||||||
|
!function(e){"use strict";e(window.jQuery)}(function(e){"use strict";var t=0;e.ajaxTransport("iframe",function(i){if(i.async){var n,r,o;return{send:function(s,a){n=e('<form style="display:none;"></form>'),n.attr("accept-charset",i.formAcceptCharset),o=/\?/.test(i.url)?"&":"?","DELETE"===i.type?(i.url=i.url+o+"_method=DELETE",i.type="POST"):"PUT"===i.type?(i.url=i.url+o+"_method=PUT",i.type="POST"):"PATCH"===i.type&&(i.url=i.url+o+"_method=PATCH",i.type="POST"),r=e('<iframe src="javascript:false;" name="iframe-transport-'+(t+=1)+'"></iframe>').bind("load",function(){var t,o=e.isArray(i.paramName)?i.paramName:[i.paramName];r.unbind("load").bind("load",function(){var t;try{if(t=r.contents(),!t.length||!t[0].firstChild)throw new Error}catch(i){t=void 0}a(200,"success",{iframe:t}),e('<iframe src="javascript:false;"></iframe>').appendTo(n),n.remove()}),n.prop("target",r.prop("name")).prop("action",i.url).prop("method",i.type),i.formData&&e.each(i.formData,function(t,i){e('<input type="hidden"/>').prop("name",i.name).val(i.value).appendTo(n)}),i.fileInput&&i.fileInput.length&&"POST"===i.type&&(t=i.fileInput.clone(),i.fileInput.after(function(e){return t[e]}),i.paramName&&i.fileInput.each(function(t){e(this).prop("name",o[t]||i.paramName)}),n.append(i.fileInput).prop("enctype","multipart/form-data").prop("encoding","multipart/form-data")),n.submit(),t&&t.length&&i.fileInput.each(function(i,n){var r=e(t[i]);e(n).prop("name",r.prop("name")),r.replaceWith(n)})}),n.append(r).appendTo(document.body)},abort:function(){r&&r.unbind("load").prop("src","javascript".concat(":false;")),n&&n.remove()}}}}),e.ajaxSetup({converters:{"iframe text":function(t){return t&&e(t[0].body).text()},"iframe json":function(t){return t&&e.parseJSON(e(t[0].body).text())},"iframe html":function(t){return t&&e(t[0].body).html()},"iframe script":function(t){return t&&e.globalEval(e(t[0].body).text())}}})}),!function(e){e(jQuery)}(function(e,t){var i=0,n=Array.prototype.slice,r=e.cleanData;e.cleanData=function(t){for(var i,n=0;null!=(i=t[n]);n++)try{e(i).triggerHandler("remove")}catch(o){}r(t)},e.widget=function(t,i,n){var r,o,s,a,l={},p=t.split(".")[0];t=t.split(".")[1],r=p+"-"+t,n||(n=i,i=e.Widget),e.expr[":"][r.toLowerCase()]=function(t){return!!e.data(t,r)},e[p]=e[p]||{},o=e[p][t],s=e[p][t]=function(e,t){return this._createWidget?void(arguments.length&&this._createWidget(e,t)):new s(e,t)},e.extend(s,o,{version:n.version,_proto:e.extend({},n),_childConstructors:[]}),a=new i,a.options=e.widget.extend({},a.options),e.each(n,function(t,n){return e.isFunction(n)?void(l[t]=function(){var e=function(){return i.prototype[t].apply(this,arguments)},r=function(e){return i.prototype[t].apply(this,e)};return function(){var t,i=this._super,o=this._superApply;return this._super=e,this._superApply=r,t=n.apply(this,arguments),this._super=i,this._superApply=o,t}}()):void(l[t]=n)}),s.prototype=e.widget.extend(a,{widgetEventPrefix:o?a.widgetEventPrefix:t},l,{constructor:s,namespace:p,widgetName:t,widgetFullName:r}),o?(e.each(o._childConstructors,function(t,i){var n=i.prototype;e.widget(n.namespace+"."+n.widgetName,s,i._proto)}),delete o._childConstructors):i._childConstructors.push(s),e.widget.bridge(t,s)},e.widget.extend=function(i){for(var r,o,s=n.call(arguments,1),a=0,l=s.length;l>a;a++)for(r in s[a])o=s[a][r],s[a].hasOwnProperty(r)&&o!==t&&(i[r]=e.isPlainObject(o)?e.isPlainObject(i[r])?e.widget.extend({},i[r],o):e.widget.extend({},o):o);return i},e.widget.bridge=function(i,r){var o=r.prototype.widgetFullName||i;e.fn[i]=function(s){var a="string"==typeof s,l=n.call(arguments,1),p=this;return s=!a&&l.length?e.widget.extend.apply(null,[s].concat(l)):s,this.each(a?function(){var n,r=e.data(this,o);return r?e.isFunction(r[s])&&"_"!==s.charAt(0)?(n=r[s].apply(r,l),n!==r&&n!==t?(p=n&&n.jquery?p.pushStack(n.get()):n,!1):void 0):e.error("no such method '"+s+"' for "+i+" widget instance"):e.error("cannot call methods on "+i+" prior to initialization; attempted to call method '"+s+"'")}:function(){var t=e.data(this,o);t?t.option(s||{})._init():e.data(this,o,new r(s,this))}),p}},e.Widget=function(){},e.Widget._childConstructors=[],e.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{disabled:!1,create:null},_createWidget:function(t,n){n=e(n||this.defaultElement||this)[0],this.element=e(n),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.options=e.widget.extend({},this.options,this._getCreateOptions(),t),this.bindings=e(),this.hoverable=e(),this.focusable=e(),n!==this&&(e.data(n,this.widgetFullName,this),this._on(!0,this.element,{remove:function(e){e.target===n&&this.destroy()}}),this.document=e(n.style?n.ownerDocument:n.document||n),this.window=e(this.document[0].defaultView||this.document[0].parentWindow)),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:e.noop,_getCreateEventData:e.noop,_create:e.noop,_init:e.noop,destroy:function(){this._destroy(),this.eleLine truncated
|
||||||
|
jQuery.fn.pagination=function(e,t){return t=jQuery.extend({items_per_page:10,num_display_entries:10,current_page:0,num_edge_entries:2,link_to:"#",prev_text:"Prev",next_text:"Next",ellipse_text:"...",prev_show_always:!0,next_show_always:!0,callback:function(){return!1}},t||{}),this.each(function(){function n(){return Math.ceil(e/t.items_per_page)}function a(){var e=Math.ceil(t.num_display_entries/2),a=n(),r=a-t.num_display_entries,s=i>e?Math.max(Math.min(i-e,r),0):0,_=i>e?Math.min(i+e,a):Math.min(t.num_display_entries,a);return[s,_]}function r(e,n){n.preventDefault(),i=e,s();var a=t.callback(e,_);return a||(n.stopPropagation?n.stopPropagation():n.cancelBubble=!0),a}function s(){_.empty();var e=a(),s=n(),p=function(e){return function(t){return r(e,t)}},l=function(e,n){e=0>e?0:s>e?e:s-1,n=jQuery.extend({text:e+1,classes:""},n||{});var a="";if(e==i){var r=jQuery("<span class='current'>"+n.text+"</span>");n.text!=t.prev_text&&n.text!=t.next_text&&(a='class="active"')}else var r=jQuery("<a>"+n.text+"</a>").bind("click",p(e)).attr("href",t.link_to.replace(/__id__/,e));n.classes&&r.addClass(n.classes);var l=$("<li "+a+"></li>").append(r);_.append(l)};if(t.prev_text&&(i>0||t.prev_show_always)&&l(i-1,{text:t.prev_text,classes:"prev"}),e[0]>0&&t.num_edge_entries>0){for(var u=Math.min(t.num_edge_entries,e[0]),c=0;u>c;c++)l(c);t.num_edge_entries<e[0]&&t.ellipse_text&&jQuery("<li><span>"+t.ellipse_text+"</span></li>").appendTo(_)}for(var c=e[0];c<e[1];c++)l(c);if(e[1]<s&&t.num_edge_entries>0){s-t.num_edge_entries>e[1]&&t.ellipse_text&&jQuery("<li><span>"+t.ellipse_text+"</span></li>").appendTo(_);for(var x=Math.max(s-t.num_edge_entries,e[1]),c=x;s>c;c++)l(c)}t.next_text&&(s-1>i||t.next_show_always)&&l(i+1,{text:t.next_text,classes:"next"})}var i=t.current_page;e=!e||0>e?1:e,t.items_per_page=!t.items_per_page||t.items_per_page<0?1:t.items_per_page;var _=jQuery(this);this.selectPage=function(e){r(e)},this.prevPage=function(){return i>0?(r(i-1),!0):!1},this.nextPage=function(){return i<n()-1?(r(i+1),!0):!1},s()})};
|
||||||
|
function log(){}function retIsOk(e){return e&&"object"==typeof e&&1==e.Ok?!0:!1}function getImageSize(e,t){function a(e,a){i.parentNode.removeChild(i),t({width:e,height:a})}var i=document.createElement("img");i.onload=function(){a(i.clientWidth,i.clientHeight)},i.onerror=function(){a()},i.src=e;var s=i.style;s.visibility="hidden",s.position="fixed",s.bottom=s.left=0,s.width=s.height="auto",document.body.appendChild(i)}function mdGetImgSrc(){return o.selectedImages&&o.selectedImages.length?o.selectedImages[0]:""}var urlPrefix=UrlPrefix,getMsg=parent.getMsg;getMsg||(getMsg=function(e){return e});var o={maxSelected:G.maxSelected,selectedZoneO:$("#preview"),previewO:$("#preview"),selectedImages:[],imageAttrs:{},pageNum:1,pagination:function(e){var t=this;$(".pagination").pagination(e,{items_per_page:G.perPageItems,prev_text:getMsg("Prev"),next_text:getMsg("Next"),callback:function(e){t.pageNum=e+1,t.renderImages($("#albumsForList").val(),t.pageNum,!1)}})},showMsg:function(e){$("#msg").html(e).css("display","inline"),setTimeout(function(){$("#msg").fadeOut()},2e3)},pageAddAlbum:function(e){var t='<option value="'+e.AlbumId+'">'+e.Name+"</option>";$("#albumsForUpload").append(t).val(e.AlbumId),$("#albumsForList").append(t)},pageUpdateAlbum:function(e,t){$('option[value="'+e+'"]').html(t)},processAlbum:function(){function e(){$("#addOrUpdateAlbumForm").is(":hidden")?($("#addOrUpdateAlbumForm").show(),$("#albumSelect").hide()):($("#addOrUpdateAlbumForm").hide(),$("#albumSelect").show())}var t=this,a=!0,i="";$("#renameAlbumBtn").click(function(){return(i=$("#albumsForUpload").val())?(e(),$("#addOrUpdateAlbumBtn").html(getMsg("Rename Album")),$("#albumName").val($("#albumsForUpload option:selected").html()).focus(),void(a=!1)):void alert(getMsg("Cannot rename default album"))}),$("#addAlbumBtn").click(function(){e(),$("#addOrUpdateAlbumBtn").html(getMsg("Add Album")),$("#albumName").val("").focus(),a=!0}),$("#cancelAlbumBtn").click(function(){e()}),$("#addOrUpdateAlbumBtn").click(function(){var s=$("#albumName").val();return s?void(a?$.get("/album/addAlbum",{name:s},function(a){"object"==typeof a&&""!=a.AlbumId?($("#albumName").val(""),t.showMsg(getMsg("Add Success!")),t.pageAddAlbum(a),setTimeout(function(){e()},200)):alert(getMsg("error"))}):$.get("/album/updateAlbum",{albumId:i,name:s},function(a){"boolean"==typeof a&&a?($("#albumName").val(""),t.showMsg(getMsg("Rename Success!")),t.pageUpdateAlbum(i,s),setTimeout(function(){e()},200)):alert(getMsg("error!"))})):void $("#albumName").focus()}),$("#deleteAlbumBtn").click(function(){var e=$("#albumsForUpload").val();return e?void $.get("/album/deleteAlbum",{albumId:e},function(a){"object"==typeof a&&1==a.Ok?(t.showMsg(getMsg("Delete Success!")),$("#albumsForUpload option[value='"+e+"']").remove(),$("#albumsForList").val()==e&&(t.needRefresh=!0),$("#albumsForList option[value='"+e+"']").remove()):alert(getMsg("This album has images, please delete it's images at first."))}):void alert(getMsg("Cannot delete default album"))})},renderAlbums:function(){var e=this;$.get("/album/getAlbums",function(t){if(t){var a="";for(var i in t){var s=t[i],r='<option value="'+s.AlbumId+'">'+s.Name+"</option>";a+=r}$("#albumsForUpload").append(a),$("#albumsForList").append(a);var l=$("#albumsForList").val();e.renderImages(l,1,!0)}})},imageMaskO:$("#imageMask"),noImagesO:$("#noImages"),loadingO:$("#loading"),loadingStart:function(){this.imageMaskO.is(":hidden")&&this.imageMaskO.css("opacity",.8).show(),this.noImagesO.hide(),this.loadingO.show()},loadingEnd:function(){this.imageMaskO.hide()},noImages:function(){this.imageMaskO.show().css("opacity",1),this.noImagesO.show(),this.loadingO.hide()},search:function(){var e=this,t=1;$("#key").on("keyup",function(){var a=++t,i=$(this).val(),s=$("#albumsForList").val();e.renderImages(s,1,!0,i,function(){return t==a})})},renderImages:function(e,t,a,i){var s=this;t||(t=1),s.loadingStart(),$.get("/file/getImages",{albumId:e,page:t,key:i},function(e){if(!e||!e.Count)return void s.noImages();s.loadingEnd();var t=e.List,i={};for(var r in s.selectedImages){var l=s.selectedImages[r];i[l]=!0}var n="";for(var r in t){var o=t[r],d="";if(""!=o.Path&&"/"==o.Path[0]&&(o.Path=o.Path.substr(1)),""!=o.Path&&"upload/"==o.Path.substr(0,7))var l=urlPrefix+"/"+o.Path;else var l=urlPrefix+"/file/outputImage?fileId="+o.FileId;i[l]&&(d='class="selected"'),n+="<li "+d+">",n+='<a title="" href="javascript:;" class="a-img"><img alt="" src="'+l+'" data-original="'+l+'" ></a>',n+='<div class="tools clearfix" data-id="'+o.FileId+'"><div class="file-title pull-left">'+o.Title+'</div><div class="pull-right"><a href="javascript:;" class="del" data-id="'+o.FileId+'"><span class="fa fa-trash"></span></a></div></div>',n+="</li>"}$("#imageList").html(n),a&&s.pagination(e.Count)})},initSelectedZones:function(){var e=this;num=this.maxSelected,e.previewO.html("");for(var t=1;num>=t;++t)e.previewO.append("<li>?</li>")},reRenderSelectedImages:function(e,t){for(var a=this,i=this.selectedZoLine truncated
|
||||||
@@ -0,0 +1,865 @@
|
|||||||
|
function log(o) {
|
||||||
|
// console.log(o);
|
||||||
|
}
|
||||||
|
function retIsOk(ret) {
|
||||||
|
if(ret && typeof ret == "object" && ret.Ok == 1) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
var urlPrefix = UrlPrefix;
|
||||||
|
var getMsg = parent.getMsg;
|
||||||
|
if (!getMsg) {
|
||||||
|
getMsg = function(msg) {
|
||||||
|
return msg;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// load image
|
||||||
|
function getImageSize(url, callback) {
|
||||||
|
var img = document.createElement('img');
|
||||||
|
|
||||||
|
function done(width, height) {
|
||||||
|
img.parentNode.removeChild(img);
|
||||||
|
callback({width: width, height: height});
|
||||||
|
}
|
||||||
|
|
||||||
|
img.onload = function() {
|
||||||
|
done(img.clientWidth, img.clientHeight);
|
||||||
|
};
|
||||||
|
|
||||||
|
img.onerror = function() {
|
||||||
|
done();
|
||||||
|
};
|
||||||
|
|
||||||
|
img.src = url;
|
||||||
|
|
||||||
|
var style = img.style;
|
||||||
|
style.visibility = 'hidden';
|
||||||
|
style.position = 'fixed';
|
||||||
|
style.bottom = style.left = 0;
|
||||||
|
style.width = style.height = 'auto';
|
||||||
|
|
||||||
|
document.body.appendChild(img);
|
||||||
|
}
|
||||||
|
|
||||||
|
var o = {
|
||||||
|
maxSelected: G.maxSelected,
|
||||||
|
selectedZoneO:$("#preview"),
|
||||||
|
previewO: $("#preview"),
|
||||||
|
selectedImages:[], // selected urls
|
||||||
|
imageAttrs: {}, // src => {width, height, title}
|
||||||
|
|
||||||
|
pageNum: 1,
|
||||||
|
|
||||||
|
pagination: function(count) {
|
||||||
|
var self = this;
|
||||||
|
$(".pagination").pagination(count, {
|
||||||
|
items_per_page: G.perPageItems,
|
||||||
|
prev_text: getMsg('Prev'),
|
||||||
|
next_text: getMsg('Next'),
|
||||||
|
callback: function(pageNum) {
|
||||||
|
self.pageNum = pageNum+1;
|
||||||
|
self.renderImages($("#albumsForList").val(), self.pageNum, false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
showMsg: function(msg) {
|
||||||
|
$("#msg").html(msg).css("display", "inline");
|
||||||
|
setTimeout(function() {
|
||||||
|
$("#msg").fadeOut();
|
||||||
|
}, 2000);
|
||||||
|
},
|
||||||
|
|
||||||
|
pageAddAlbum: function(ret) {
|
||||||
|
var html = '<option value="' + ret.AlbumId + '">' + ret.Name + '</option>';
|
||||||
|
$("#albumsForUpload").append(html).val(ret.AlbumId);
|
||||||
|
$("#albumsForList").append(html);
|
||||||
|
},
|
||||||
|
pageUpdateAlbum: function(albumId, albumName) {
|
||||||
|
$('option[value="' + albumId + '"]').html(albumName);
|
||||||
|
},
|
||||||
|
// add, delete, update album
|
||||||
|
processAlbum: function() {
|
||||||
|
var self = this;
|
||||||
|
var isAddAlbum = true;
|
||||||
|
var curAlbum = "";
|
||||||
|
function toggleAddAlbum() {
|
||||||
|
if($("#addOrUpdateAlbumForm").is(":hidden")) {
|
||||||
|
$("#addOrUpdateAlbumForm").show();
|
||||||
|
$("#albumSelect").hide();
|
||||||
|
} else {
|
||||||
|
$("#addOrUpdateAlbumForm").hide();
|
||||||
|
$("#albumSelect").show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// rename
|
||||||
|
$("#renameAlbumBtn").click(function(){
|
||||||
|
curAlbum = $("#albumsForUpload").val();
|
||||||
|
if(!curAlbum) {
|
||||||
|
alert(getMsg("Cannot rename default album"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
toggleAddAlbum();
|
||||||
|
$("#addOrUpdateAlbumBtn").html(getMsg("Rename Album"));
|
||||||
|
$("#albumName").val($("#albumsForUpload option:selected").html()).focus();
|
||||||
|
isAddAlbum = false;
|
||||||
|
});
|
||||||
|
// add album
|
||||||
|
$("#addAlbumBtn").click(function() {
|
||||||
|
toggleAddAlbum();
|
||||||
|
$("#addOrUpdateAlbumBtn").html(getMsg("Add Album"));
|
||||||
|
$("#albumName").val("").focus();
|
||||||
|
isAddAlbum = true;
|
||||||
|
});
|
||||||
|
$("#cancelAlbumBtn").click(function() {
|
||||||
|
toggleAddAlbum();
|
||||||
|
});
|
||||||
|
// add or update album
|
||||||
|
$("#addOrUpdateAlbumBtn").click(function() {
|
||||||
|
var albumName = $("#albumName").val();
|
||||||
|
if(!albumName) {
|
||||||
|
$("#albumName").focus();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(isAddAlbum) {
|
||||||
|
$.get("/album/addAlbum", {name: albumName}, function(ret) {
|
||||||
|
if(typeof ret == "object" && ret.AlbumId != "") {
|
||||||
|
$("#albumName").val("");
|
||||||
|
self.showMsg(getMsg("Add Success!"));
|
||||||
|
self.pageAddAlbum(ret);
|
||||||
|
|
||||||
|
setTimeout(function() {
|
||||||
|
toggleAddAlbum();
|
||||||
|
}, 200);
|
||||||
|
} else {
|
||||||
|
alert(getMsg("error"));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
$.get("/album/updateAlbum", {albumId: curAlbum, name: albumName}, function(ret) {
|
||||||
|
if(typeof ret == "boolean" && ret) {
|
||||||
|
$("#albumName").val("");
|
||||||
|
self.showMsg(getMsg("Rename Success!"));
|
||||||
|
self.pageUpdateAlbum(curAlbum, albumName);
|
||||||
|
|
||||||
|
setTimeout(function() {
|
||||||
|
toggleAddAlbum();
|
||||||
|
}, 200);
|
||||||
|
} else {
|
||||||
|
alert(getMsg("error!"));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
})
|
||||||
|
// delete album
|
||||||
|
$("#deleteAlbumBtn").click(function() {
|
||||||
|
var albumId = $("#albumsForUpload").val();
|
||||||
|
if(!albumId) {
|
||||||
|
alert(getMsg("Cannot delete default album"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$.get("/album/deleteAlbum", {albumId: albumId}, function(ret) {
|
||||||
|
if(typeof ret == "object" && ret.Ok == true) {
|
||||||
|
self.showMsg(getMsg("Delete Success!"));
|
||||||
|
// delete this album from select
|
||||||
|
$("#albumsForUpload option[value='" + albumId + "']").remove();
|
||||||
|
|
||||||
|
// if the albumsForList has select this album, it must refresh list after delete it;
|
||||||
|
if($("#albumsForList").val() == albumId) {
|
||||||
|
self.needRefresh = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
$("#albumsForList option[value='" + albumId + "']").remove();
|
||||||
|
|
||||||
|
} else {
|
||||||
|
alert(getMsg("This album has images, please delete it's images at first."));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
renderAlbums: function() {
|
||||||
|
var self = this;
|
||||||
|
$.get("/album/getAlbums", function(ret) {
|
||||||
|
if(!ret) return;
|
||||||
|
var html = "";
|
||||||
|
for(var i in ret) {
|
||||||
|
var each = ret[i];
|
||||||
|
var option = '<option value="' + each.AlbumId + '">' + each.Name+ '</option>';
|
||||||
|
html += option;
|
||||||
|
}
|
||||||
|
|
||||||
|
$("#albumsForUpload").append(html);
|
||||||
|
$("#albumsForList").append(html);
|
||||||
|
|
||||||
|
var albumId = $("#albumsForList").val();
|
||||||
|
self.renderImages(albumId, 1, true);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
imageMaskO: $("#imageMask"),
|
||||||
|
noImagesO: $("#noImages"),
|
||||||
|
loadingO: $("#loading"),
|
||||||
|
|
||||||
|
loadingStart: function() {
|
||||||
|
if(this.imageMaskO.is(":hidden")) {
|
||||||
|
this.imageMaskO.css("opacity", 0.8).show();
|
||||||
|
}
|
||||||
|
this.noImagesO.hide();
|
||||||
|
this.loadingO.show();
|
||||||
|
},
|
||||||
|
loadingEnd: function() {
|
||||||
|
this.imageMaskO.hide();
|
||||||
|
},
|
||||||
|
|
||||||
|
noImages: function () {
|
||||||
|
this.imageMaskO.show().css("opacity", 1);
|
||||||
|
this.noImagesO.show();
|
||||||
|
this.loadingO.hide();
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
search: function() {
|
||||||
|
var self = this;
|
||||||
|
var t1 = 1;
|
||||||
|
$("#key").on("keyup", function() {
|
||||||
|
var t2 = ++t1;
|
||||||
|
var key = $(this).val();
|
||||||
|
var albumId = $("#albumsForList").val();
|
||||||
|
|
||||||
|
self.renderImages(albumId, 1, true, key, function(){
|
||||||
|
return t1 == t2;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
renderImages: function(albumId, page, needRenderPagination, key, needRender) {
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
if(!page) {
|
||||||
|
page = 1;
|
||||||
|
}
|
||||||
|
self.loadingStart();
|
||||||
|
$.get("/file/getImages", {albumId: albumId, page: page, key: key}, function(ret) {
|
||||||
|
if(!ret || !ret.Count) {
|
||||||
|
self.noImages();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
self.loadingEnd();
|
||||||
|
var datas = ret.List;
|
||||||
|
var selectedMap = {};
|
||||||
|
|
||||||
|
for(var i in self.selectedImages) {
|
||||||
|
var src = self.selectedImages[i]; // src include G.imageSrcPrefix
|
||||||
|
selectedMap[src] = true;
|
||||||
|
}
|
||||||
|
// log(self.selectedImages);
|
||||||
|
|
||||||
|
var html = "";
|
||||||
|
for(var i in datas){
|
||||||
|
var each = datas[i];
|
||||||
|
var classes = "";
|
||||||
|
// life edit
|
||||||
|
// 之前的
|
||||||
|
if(each.Path != "" && each.Path[0] == "/") {
|
||||||
|
each.Path = each.Path.substr(1);
|
||||||
|
}
|
||||||
|
if(each.Path != "" && each.Path.substr(0, 7) == "upload/") {
|
||||||
|
var src = urlPrefix + "/" + each.Path;
|
||||||
|
} else {
|
||||||
|
var src = urlPrefix + "/file/outputImage?fileId=" + each.FileId;
|
||||||
|
}
|
||||||
|
// log(src);
|
||||||
|
if(selectedMap[src]) {
|
||||||
|
classes = 'class="selected"';
|
||||||
|
}
|
||||||
|
html += '<li ' + classes + '>';
|
||||||
|
html += '<a title="" href="javascript:;" class="a-img"><img alt="" src="' + src + '" data-original="' + src + '" ></a>';
|
||||||
|
// html += '<div class="tools"><a href="javascript:;" class="del" data-id="' + each.FileId + '"><span class="fa fa-trash"></span></a></div>';
|
||||||
|
html += '<div class="tools clearfix" data-id="' + each.FileId + '"><div class="file-title pull-left">' + each.Title + '</div><div class="pull-right"><a href="javascript:;" class="del" data-id="' + each.FileId + '"><span class="fa fa-trash"></span></a></div></div>';
|
||||||
|
html += "</li>";
|
||||||
|
}
|
||||||
|
|
||||||
|
// var html = $("#tImage").render(datas);
|
||||||
|
$("#imageList").html(html);
|
||||||
|
|
||||||
|
if(needRenderPagination) {
|
||||||
|
self.pagination(ret.Count);
|
||||||
|
}
|
||||||
|
|
||||||
|
// $("#imageList img").lazyload({effect : "fadeIn"});
|
||||||
|
// $("#imageList img").lazyload();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
// 初始化已选择的图片区域
|
||||||
|
initSelectedZones: function() {
|
||||||
|
var self = this;
|
||||||
|
num = this.maxSelected;
|
||||||
|
self.previewO.html("");
|
||||||
|
for(var i = 1; i <= num; ++i) {
|
||||||
|
// self.previewO.append("<li>" + i + "</li>");
|
||||||
|
self.previewO.append("<li>?</li>");
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
reRenderSelectedImages: function(isRemove, addSrc) {
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
var lis = this.selectedZoneO.find("li");
|
||||||
|
var size = this.selectedImages.length-1;
|
||||||
|
for(var i = 0; i < this.maxSelected; ++i) {
|
||||||
|
var target = lis.eq(i);
|
||||||
|
if(i > size) {
|
||||||
|
target.html('?');
|
||||||
|
} else {
|
||||||
|
src = this.selectedImages[i];
|
||||||
|
|
||||||
|
var data = self.imageAttrs[src];
|
||||||
|
var attrs = "";
|
||||||
|
if(data) {
|
||||||
|
if(data.width) attrs += ' data-width="' + data.width + '"';
|
||||||
|
if(data.height) attrs += ' data-height="' + data.height + '"';
|
||||||
|
if(data.title) attrs += ' data-title="' + data.title + '"';
|
||||||
|
}
|
||||||
|
|
||||||
|
target.html('<img ' + attrs + ' src="' + src + '" width="60"/><div class="tools"><a title="' + getMsg('click to remove this image') + '" href="javascript:;" class="del"><span class="fa fa-trash"></span></a></div>');
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove selected
|
||||||
|
if(isRemove) {
|
||||||
|
target.removeClass("selected");
|
||||||
|
} else {
|
||||||
|
// is add
|
||||||
|
// trigger click and set attrs
|
||||||
|
if(addSrc == src) {
|
||||||
|
target.click();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
removeSelectedImage: function($li) {
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
var src = $li.find("img").attr('src');
|
||||||
|
for(var i in this.selectedImages) {
|
||||||
|
if(this.selectedImages[i] == src) {
|
||||||
|
this.selectedImages.splice(i, 1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.reRenderSelectedImages(true);
|
||||||
|
|
||||||
|
// clear attrs and disable it
|
||||||
|
self.clearAttrs();
|
||||||
|
},
|
||||||
|
addSelectedImage: function($li) {
|
||||||
|
if(this.maxSelected > 1 && this.maxSelected <= this.selectedImages.length) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// life 为了图片安全
|
||||||
|
if(typeof $li == "object") {
|
||||||
|
var src = $li.find("img").attr('src');
|
||||||
|
} else {
|
||||||
|
// 也有可能来自url
|
||||||
|
if($li.indexOf("http://") != -1 || $li.indexOf("https://") != -1) {
|
||||||
|
src = $li;
|
||||||
|
} else {
|
||||||
|
// 来自内部
|
||||||
|
src = urlPrefix + "/file/outputImage?fileId=" + $li;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果只允许选1个
|
||||||
|
if(this.maxSelected == 1) {
|
||||||
|
// 先把其它的去掉
|
||||||
|
$("#imageList li").removeClass("selected");
|
||||||
|
this.selectedImages = [src];
|
||||||
|
} else {
|
||||||
|
this.selectedImages.push(src);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.reRenderSelectedImages(false, src);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
initDataFromTinymce: function() {
|
||||||
|
var self = this;
|
||||||
|
var datas = top.LEAUI_DATAS;
|
||||||
|
var lastSrc = "";
|
||||||
|
if(datas && datas.length > 0) {
|
||||||
|
for(var i in datas) {
|
||||||
|
var data = datas[i];
|
||||||
|
data.constrain = true;
|
||||||
|
lastSrc = data.src;
|
||||||
|
self.selectedImages.push(data.src);
|
||||||
|
self.imageAttrs[data.src] = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
self.reRenderSelectedImages(false, lastSrc);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
init: function() {
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
self.processAlbum();
|
||||||
|
|
||||||
|
$("#albumsForList").change(function() {
|
||||||
|
var albumId = $(this).val();
|
||||||
|
self.renderImages(albumId, 1, true);
|
||||||
|
});
|
||||||
|
|
||||||
|
$("#imageList").on("click", 'li', function() {
|
||||||
|
if($(this).hasClass("selected")) {
|
||||||
|
$(this).removeClass("selected");
|
||||||
|
self.removeSelectedImage($(this));
|
||||||
|
} else {
|
||||||
|
if(self.addSelectedImage($(this))){
|
||||||
|
$(this).addClass("selected");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
// delete file
|
||||||
|
$("#imageList").on("click", '.del', function(e) {
|
||||||
|
var t = this;
|
||||||
|
e.stopPropagation();
|
||||||
|
|
||||||
|
if(confirm(getMsg("Are you sure to delete this image ?"))) {
|
||||||
|
var fileId = $(this).data('id');
|
||||||
|
$.get("/file/deleteImage", {fileId: fileId}, function(ret) {
|
||||||
|
if(ret) {
|
||||||
|
var $li = $(t).closest('li');
|
||||||
|
if($li.hasClass("selected")) {
|
||||||
|
self.removeSelectedImage($li);
|
||||||
|
}
|
||||||
|
$(t).closest('li').remove();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
// edit file title
|
||||||
|
$("#imageList").on("click", '.file-title', function(e) {
|
||||||
|
var p = this;
|
||||||
|
var t = this;
|
||||||
|
e.stopPropagation();
|
||||||
|
if($(this).children().eq(0).is("input")){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var fileId = $(p).parent().data('id');
|
||||||
|
var fileTitle = $(this).text();
|
||||||
|
$(this).html('<input type="text" value="' + fileTitle + '" />');
|
||||||
|
|
||||||
|
var $input = $(this).find("input");
|
||||||
|
$input.focus();
|
||||||
|
$input.keydown(function(e){
|
||||||
|
if(e.keyCode==13){
|
||||||
|
$(this).trigger("blur");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
$input.blur(function() {
|
||||||
|
var title = $(this).val();
|
||||||
|
if(!title) {
|
||||||
|
title = fileTitle;
|
||||||
|
} else {
|
||||||
|
$.post("/file/updateImageTitle", {fileId: fileId, title: title});
|
||||||
|
}
|
||||||
|
$(p).html(title);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// remove preview
|
||||||
|
$("#preview").on("click", '.del', function(e) {
|
||||||
|
e.stopPropagation();
|
||||||
|
var $li = $(this).closest("li");
|
||||||
|
var src = $li.find("img").attr("src");
|
||||||
|
self.removeSelectedImage($li);
|
||||||
|
|
||||||
|
// 在当前的imagesList下看是否有
|
||||||
|
$("#imageList img").each(function() {
|
||||||
|
var src2 = $(this).attr('src');
|
||||||
|
if(src == src2) {
|
||||||
|
$(this).parent().parent().removeClass("selected");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
//
|
||||||
|
$("#goAddImageBtn").click(function() {
|
||||||
|
$("#albumsForUpload").val($("#albumsForList").val());
|
||||||
|
$('#myTab li:eq(1) a').tab('show');
|
||||||
|
});
|
||||||
|
|
||||||
|
// toggle tab
|
||||||
|
// refresh
|
||||||
|
$('#myTab a').on('shown.bs.tab', function(e) {
|
||||||
|
e.preventDefault()
|
||||||
|
$(this).tab('show');
|
||||||
|
var href = $(this).attr("href");
|
||||||
|
|
||||||
|
if(self.needRefresh && href == "#images") {
|
||||||
|
setTimeout(function(){
|
||||||
|
var albumId = $("#albumsForList").val();
|
||||||
|
var key = $("#key").val();
|
||||||
|
self.renderImages(albumId, self.pageNum, true, key);
|
||||||
|
}, 200);
|
||||||
|
self.needRefresh = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(href == "#url") {
|
||||||
|
$("#imageUrl").focus();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
$("#refresh").click(function() {
|
||||||
|
var albumId = $("#albumsForList").val();
|
||||||
|
var key = $("#key").val();
|
||||||
|
self.renderImages(albumId, self.pageNum, false, key);
|
||||||
|
});
|
||||||
|
|
||||||
|
// add url
|
||||||
|
$("#addImageUrlBtn").click(function(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
var url = $.trim($("#imageUrl").val());
|
||||||
|
if(!url) {
|
||||||
|
$("#imageUrl").focus();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
getImageSize(url, function(ret) {
|
||||||
|
if(!ret.width || !ret.height){
|
||||||
|
$("#msgForUrl").show();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$("#msgForUrl").hide();
|
||||||
|
$("#imageUrl").val("");
|
||||||
|
self.addSelectedImage(url);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// 设置属性
|
||||||
|
$("#preview").on("click", 'li', function() {
|
||||||
|
if($(this).hasClass("selected")) {
|
||||||
|
// $(this).removeClass("selected");
|
||||||
|
} else {
|
||||||
|
if($(this).find("img").length){
|
||||||
|
$("#preview li").removeClass("selected");
|
||||||
|
$(this).addClass("selected");
|
||||||
|
|
||||||
|
self.initAttr($(this));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$("#attrTitle, #attrWidth, #attrHeight").on("keyup", function(){
|
||||||
|
self.modifyAttr($(this));
|
||||||
|
});
|
||||||
|
$("#attrConstrain").on("click", function(){
|
||||||
|
self.modifyAttr($(this));
|
||||||
|
});
|
||||||
|
|
||||||
|
// file search
|
||||||
|
self.search();
|
||||||
|
|
||||||
|
self.initSelectedZones();
|
||||||
|
|
||||||
|
self.initDataFromTinymce();
|
||||||
|
|
||||||
|
self.renderAlbums();
|
||||||
|
//...
|
||||||
|
self.initUploader();
|
||||||
|
},
|
||||||
|
|
||||||
|
// 设置
|
||||||
|
curSrc: "",
|
||||||
|
curLi: null,
|
||||||
|
attrTitleO: $("#attrTitle"),
|
||||||
|
attrWidthO: $("#attrWidth"),
|
||||||
|
attrHeightO: $("#attrHeight"),
|
||||||
|
attrConstrainO: $("#attrConstrain"),
|
||||||
|
// clear attrs and disable it
|
||||||
|
clearAttrs: function() {
|
||||||
|
var self = this;
|
||||||
|
self.attrTitleO.val("").attr("disabled", true);
|
||||||
|
self.attrHeightO.val("").attr("disabled", true);
|
||||||
|
self.attrWidthO.val("").attr("disabled", true);
|
||||||
|
self.attrConstrainO.prop("checked", false).attr("disabled", true);
|
||||||
|
},
|
||||||
|
scale: function(isWidth) {
|
||||||
|
var self = this;
|
||||||
|
var autoScale = self.attrConstrainO.is(":checked");
|
||||||
|
var width = +self.attrWidthO.val();
|
||||||
|
var height = +self.attrHeightO.val();
|
||||||
|
if(isNaN(width) || isNaN(height)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var curAttrs = self.getCurAttrs();
|
||||||
|
var preWidth = curAttrs.preWidth || curAttrs.width;
|
||||||
|
var preHeight = curAttrs.preHeight || curAttrs.height;
|
||||||
|
|
||||||
|
if(autoScale && preWidth && preHeight) {
|
||||||
|
if(isWidth) {
|
||||||
|
height = parseInt((width/preWidth) * preHeight);
|
||||||
|
self.attrHeightO.val(height);
|
||||||
|
} else {
|
||||||
|
width = parseInt((height/preHeight) * preWidth);
|
||||||
|
self.attrWidthO.val(width);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var ret = {width: width, height: height};
|
||||||
|
return ret;
|
||||||
|
},
|
||||||
|
getCurAttrs: function() {
|
||||||
|
var self = this;
|
||||||
|
return self.imageAttrs[self.curSrc];
|
||||||
|
},
|
||||||
|
setCurDataAttrs: function(attrs) {
|
||||||
|
var self = this;
|
||||||
|
var img = self.curLi.find("img");
|
||||||
|
img.attr("data-width", attrs.width);
|
||||||
|
img.attr("data-height", attrs.height);
|
||||||
|
img.attr("data-title", attrs.title);
|
||||||
|
|
||||||
|
self.imageAttrs[self.curSrc] = attrs;
|
||||||
|
},
|
||||||
|
// 修改属性
|
||||||
|
modifyAttr: function($target){
|
||||||
|
var self = this;
|
||||||
|
var id = $target.attr("id");
|
||||||
|
var val = $target.val();
|
||||||
|
var curAttrs = self.getCurAttrs();
|
||||||
|
if(!curAttrs) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
switch(id) {
|
||||||
|
case "attrConstrain":
|
||||||
|
val = 0;
|
||||||
|
if($target.is(":checked")) {
|
||||||
|
val = 1;
|
||||||
|
}
|
||||||
|
curAttrs['constrain'] = val;
|
||||||
|
break;
|
||||||
|
case "attrTitle":
|
||||||
|
curAttrs['title'] = val;
|
||||||
|
break;
|
||||||
|
case "attrWidth":
|
||||||
|
$.extend(curAttrs, self.scale(true));
|
||||||
|
break;
|
||||||
|
case "attrHeight":
|
||||||
|
$.extend(curAttrs, self.scale(false));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
self.setCurDataAttrs(curAttrs);
|
||||||
|
},
|
||||||
|
// when click preview li
|
||||||
|
initAttr: function($li) {
|
||||||
|
var self = this;
|
||||||
|
if(typeof $li != "object") {
|
||||||
|
$li = $("#preview").find('img[src="' + $li + '"]').parent();
|
||||||
|
};
|
||||||
|
|
||||||
|
var src = $li.find("img").attr("src");
|
||||||
|
self.curSrc = src;
|
||||||
|
self.curLi = $li;
|
||||||
|
|
||||||
|
var attrs = self.imageAttrs[src];
|
||||||
|
function setAttr(attrs) {
|
||||||
|
attrs = attrs || {};
|
||||||
|
self.attrTitleO.val(attrs.title).attr("disabled", false);
|
||||||
|
self.attrWidthO.val(attrs.width).attr("disabled", false);
|
||||||
|
self.attrHeightO.val(attrs.height).attr("disabled", false);
|
||||||
|
self.attrConstrainO.attr("disabled", false);
|
||||||
|
|
||||||
|
if(attrs.constrain) {
|
||||||
|
self.attrConstrainO.prop('checked', true);
|
||||||
|
} else {
|
||||||
|
self.attrConstrainO.prop('checked', false);
|
||||||
|
}
|
||||||
|
|
||||||
|
self.setCurDataAttrs(attrs);
|
||||||
|
}
|
||||||
|
attrs = attrs || {};
|
||||||
|
if(!attrs || !attrs.width || !attrs.height) {
|
||||||
|
getImageSize(src, function(ret) {
|
||||||
|
ret.title = attrs.title || "";
|
||||||
|
ret.constrain = 1;
|
||||||
|
ret.preWidth = ret.width;
|
||||||
|
ret.preHeight = ret.height;
|
||||||
|
if(src != self.curSrc) {
|
||||||
|
self.imageAttrs[src] = ret;
|
||||||
|
// in case user click fast
|
||||||
|
self.setCurDataAttrs(attrs);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// set attrs
|
||||||
|
setAttr(ret);
|
||||||
|
return;
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
setAttr(attrs);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
needRefresh: false,
|
||||||
|
|
||||||
|
uploadRefreshImageList: function() {
|
||||||
|
var self = this;
|
||||||
|
// check albumId
|
||||||
|
var albumId = $("#albumsForList").val();
|
||||||
|
if(albumId == $("#albumsForUpload").val()){
|
||||||
|
self.needRefresh = true;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
initUploader: function() {
|
||||||
|
var self = this;
|
||||||
|
var ul = $('#upload ul');
|
||||||
|
|
||||||
|
$('#drop a').click(function() {
|
||||||
|
// trigger to show file select
|
||||||
|
$(this).parent().find('input').click();
|
||||||
|
});
|
||||||
|
// Initialize the jQuery File Upload plugin
|
||||||
|
$('#upload').fileupload({
|
||||||
|
dataType: 'json',
|
||||||
|
pasteZone: '',
|
||||||
|
acceptFileTypes: /(\.|\/)(gif|jpg|jpeg|png|jpe)$/i,
|
||||||
|
// maxFileSize: 210000,
|
||||||
|
|
||||||
|
// This element will accept file drag/drop uploading
|
||||||
|
dropZone: $('#drop'),
|
||||||
|
formData: function(form) {
|
||||||
|
return [{name: 'albumId', value: $("#albumsForUpload").val()}]
|
||||||
|
},
|
||||||
|
/*
|
||||||
|
urlFunc: function() {
|
||||||
|
return 'server/index.php?action=file:uploadImage&album_id=' + $("#albumsForUpload").val();
|
||||||
|
},
|
||||||
|
*/
|
||||||
|
|
||||||
|
// This function is called when a file is added to the queue;
|
||||||
|
// either via the browse button, or via drag/drop:
|
||||||
|
add: function(e, data) {
|
||||||
|
// 文件大小限制
|
||||||
|
var size = data.files[0].size;
|
||||||
|
var maxFileSize = +parent.GlobalConfigs["uploadImageSize"] || 100;
|
||||||
|
if(typeof size == 'number' && size > 1024 * 1024 * maxFileSize) {
|
||||||
|
var tpl = $('<li><div class="alert alert-danger"><a class="close" data-dismiss="alert">×</a></div></li>');
|
||||||
|
tpl.find('div').append('<b>Warning:</b> ' + data.files[0].name + ' <small>[<i>' + formatFileSize(data.files[0].size) + '</i>] is bigger than ' + maxFileSize + 'M</small> ');
|
||||||
|
tpl.appendTo(ul);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var tpl = $('<li><div class="alert alert-info"><img class="loader" src="/public/album/images/ajax-loader.gif"> <a class="close" data-dismiss="alert">×</a></div></li>');
|
||||||
|
// Append the file name and file size
|
||||||
|
tpl.find('div').append(data.files[0].name + ' <small>[<i>' + formatFileSize(data.files[0].size) + '</i>]</small>');
|
||||||
|
|
||||||
|
// Add the HTML to the UL element
|
||||||
|
data.context = tpl.appendTo(ul);
|
||||||
|
|
||||||
|
// data.form[0].action += "&album_id=" + $("#albumsForUpload").val();
|
||||||
|
|
||||||
|
// Automatically upload the file once it is added to the queue
|
||||||
|
var jqXHR = data.submit();
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
done: function(e, data) {
|
||||||
|
if (data.result.Ok == true) {
|
||||||
|
data.context.remove();
|
||||||
|
|
||||||
|
// add image to preview
|
||||||
|
self.addSelectedImage(data.result.Id);
|
||||||
|
// reresh image list
|
||||||
|
self.uploadRefreshImageList();
|
||||||
|
} else {
|
||||||
|
data.context.empty();
|
||||||
|
var tpl = $('<li><div class="alert alert-danger"><a class="close" data-dismiss="alert">×</a></div></li>');
|
||||||
|
tpl.find('div').append('<b>' + getMsg('Error') + ':</b> ' + data.files[0].name + ' <small>[<i>' + formatFileSize(data.files[0].size) + '</i>]</small> ' + data.result.Msg);
|
||||||
|
data.context.append(tpl);
|
||||||
|
setTimeout((function(tpl) {
|
||||||
|
return function() {
|
||||||
|
tpl.remove();
|
||||||
|
}
|
||||||
|
})(tpl), 3000);
|
||||||
|
}
|
||||||
|
$("#upload-msg").scrollTop(1000);
|
||||||
|
},
|
||||||
|
fail: function(e, data) {
|
||||||
|
data.context.empty();
|
||||||
|
var tpl = $('<li><div class="alert alert-danger"><a class="close" data-dismiss="alert">×</a></div></li>');
|
||||||
|
tpl.find('div').append('<b>Error:</b> ' + data.files[0].name + ' <small>[<i>' + formatFileSize(data.files[0].size) + '</i>]</small> ' + data.errorThrown);
|
||||||
|
data.context.append(tpl);
|
||||||
|
|
||||||
|
$("#upload-msg").scrollTop(1000);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Prevent the default action when a file is dropped on the window
|
||||||
|
$(document).on('drop dragover', function(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Helper function that formats the file sizes
|
||||||
|
function formatFileSize(bytes) {
|
||||||
|
if (typeof bytes !== 'number') {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
if (bytes >= 1000000000) {
|
||||||
|
return (bytes / 1000000000).toFixed(2) + ' GB';
|
||||||
|
}
|
||||||
|
if (bytes >= 1000000) {
|
||||||
|
return (bytes / 1000000).toFixed(2) + ' MB';
|
||||||
|
}
|
||||||
|
return (bytes / 1000).toFixed(2) + ' KB';
|
||||||
|
}
|
||||||
|
|
||||||
|
// drag css
|
||||||
|
$(document).bind('dragover', function (e) {
|
||||||
|
var dropZone = $('#drop'),
|
||||||
|
timeout = window.dropZoneTimeout;
|
||||||
|
if (!timeout) {
|
||||||
|
dropZone.addClass('in');
|
||||||
|
} else {
|
||||||
|
clearTimeout(timeout);
|
||||||
|
}
|
||||||
|
var found = false,
|
||||||
|
node = e.target;
|
||||||
|
do {
|
||||||
|
if (node === dropZone[0]) {
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
node = node.parentNode;
|
||||||
|
} while (node != null);
|
||||||
|
if (found) {
|
||||||
|
dropZone.addClass('hover');
|
||||||
|
} else {
|
||||||
|
dropZone.removeClass('hover');
|
||||||
|
}
|
||||||
|
window.dropZoneTimeout = setTimeout(function () {
|
||||||
|
window.dropZoneTimeout = null;
|
||||||
|
dropZone.removeClass('in hover');
|
||||||
|
}, 100);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$(function() {
|
||||||
|
o.init();
|
||||||
|
});
|
||||||
|
|
||||||
|
// 为md得到图片链接
|
||||||
|
function mdGetImgSrc() {
|
||||||
|
if(o.selectedImages && o.selectedImages.length) {
|
||||||
|
return o.selectedImages[0];
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
@@ -79,6 +79,8 @@ tinymce.addI18n('zh',{
|
|||||||
"Insert\/edit mind map": "新建/编辑思维导图",
|
"Insert\/edit mind map": "新建/编辑思维导图",
|
||||||
"Insert Mind Map": "插入思维导图",
|
"Insert Mind Map": "插入思维导图",
|
||||||
"Mind Map": "思维导图",
|
"Mind Map": "思维导图",
|
||||||
|
"Image": "图片",
|
||||||
|
"Insert Image": "插入",
|
||||||
"General": "\u666e\u901a",
|
"General": "\u666e\u901a",
|
||||||
"Advanced": "\u9ad8\u7ea7",
|
"Advanced": "\u9ad8\u7ea7",
|
||||||
"Source": "\u5730\u5740",
|
"Source": "\u5730\u5740",
|
||||||
|
|||||||
+1
-1
@@ -1 +1 @@
|
|||||||
tinymce.PluginManager.requireLangPack("leanote_code"),tinymce.PluginManager.add("leanote_code",function(a,b){function c(a){return a?("object"==typeof a&&(a=$(a).html()),a.replace(/\<br *\/*\>/gi,"\n").replace(/<\/(p|li|div|ul|ol|hr)>/,"\n").replace(/(<([^>]+)>)/gi,"").replace(/\n\n/g,"\n")):a}function d(a){return a?("object"==typeof a&&(a=$(a).html()),a.replace(/\n/g,"<br />")):a}function e(a){g=tinymce.activeEditor;var b,e=g.selection.getNode(),f=g.selection.getContent(),h=LeaAce.isInAce(e),i=!1,j=!1;h&&(i=h[0],j=h[1]),$("#editorContent .toggle-raw").remove();var k='class="brush:'+a+'"';if(a&&"convert"!=a){if(i&&i.session.setMode("ace/mode/"+a),j||"PRE"!=e.nodeName||(j=$(e)),j){var l=LeaAce.getPreBrush(j);return void j.removeClass(l).addClass("brush:"+a)}}else if(a&&("BODY"==e.nodeName||"editorContent"==$(e).attr("id")))return;if(LeaAce.canAce()){var m=LeaAce.getAceId();if(LeaAce.disableAddHistory(),i){var n=i.getValue();n=n.replace(/</g,"<"),n=n.replace(/>/g,">"),n=n.replace(/\n/g,"<br />"),j.replaceWith("<p>"+n+"</p>"),i.destroy()}else{if("PRE"==e.nodeName){var j=$(e),n=j.html();return n&&(n=n.replace(/\n/g,"<br />")),void j.replaceWith("<p>"+n+"</p>")}var b=f;if(!b&&("BODY"==e.nodeName||"editorContent"==$(e).attr("id")))return;b?(b=c(b),g.insertContent('<pre id="'+m+'" '+k+">"+b+"</pre>")):(b=c(e),$(e).replaceWith("<pre id='"+m+"'"+k+">"+b+"</pre>"));var i=LeaAce.initAce(m);i&&(i.focus(),a&&"convert"!=a&&i.session.setMode("ace/mode/"+a))}LeaAce.resetAddHistory()}else if("PRE"!=e.nodeName&&(e=$(e).closest("pre").get(0)),e&&"PRE"==e.nodeName){var j=$(e),n=j.html();n&&(n=n.replace(/\n/g,"<br />")),j.replaceWith("<p>"+n+"</p>")}else{try{b=$.trim($(f).text())}catch(o){}b||(b=$.trim(f));var p=null,m=LeaAce.getAceId();b?(b=d(b),p='<pre id="'+m+'" '+k+">"+b+"</pre>",g.insertContent(p)):e?(b=d(e),p='<pre id="'+m+'" '+k+">"+b+"</pre>",$(e).replaceWith(p)):(p='<pre id="'+m+'" '+k+">"+b+"</pre>",g.insertContent(p))}}function f(){return function(){var b=this;a.on("nodeChange",function(){var c=null;try{var d=a.selection.getNode();if("PRE"!=d.nodeName&&(d=$(d).closest("pre").get(0)),d){var e=LeaAce.isInAce(d),f=!1,g=!1;if(e||"PRE"==d.nodeName){e?(f=e[0],g=e[1]):g=$(d);var h=LeaAce.getPreBrush(g);c=$.trim(h.split(":")[1]),b.diableValue("convert",!1)}else b.diableValue("convert",!0)}}catch(i){log(i)}"convert"!=c&&b.value(c)})}}var g=a;a.addButton("leanote_code",function(){var a=["Convert Code:convert","CSS:css","HTML:html","Javascript:javascript","C/C++:c_cpp","C#:csharp","Java:java","Objective-c:objectivec","PHP:php","Python:python","Ruby:ruby","Shell:sh","Delphi:delphi","Golang:golang","Erlang:erlang","Groovy:groovy","Latex:latex","Xml:xml","ActionScript:actionScript"],b=[];for(var c in a){var d=a[c].split(":");b.push({text:d[0],value:d[1]})}return{type:"listbox",text:"codeLang",tooltip:"toggleCode",values:b,fixedWidth:!0,onselect:function(a){a.control.settings.value&&e(a.control.settings.value)},onPostRender:f(b)}}),a.addButton("leanote_inline_code",{icon:"code",tooltip:"Inline Code",stateSelector:"code",onclick:function(){a.execCommand("mceToggleFormat",!1,"code")}}),LeaAce.canAce()&&a.addButton("leanote_ace_pre",{icon:"code",image:b+"/img/ace-pre2.png",tooltip:"Toggle ace with raw html",active:LeaAce.isAce===!1,onclick:function(){LeaAce.isAce===!1?(this.active(!1),LeaAce.isAce=!0,LeaAce.initAceFromContent(a)):(this.active(!0),LeaAce.allToPre(a),LeaAce.isAce=!1)}}),g.addCommand("toggleCode",e),g.addShortcut("ctrl+shift+c","","toggleCode"),g.addShortcut("command+shift+c","","toggleCode"),LeaAce.canAce()&&a.on("keydown",function(a){var b=LeaAce.nowIsInAce();return b?(setTimeout(function(){b[0].focus()}),!0):void 0}),g.on("keydown",function(a){var b=a.which?a.which:a.keyCode;return 9==b?(a.shiftKey||g.insertContent(" "),a.preventDefault(),a.stopPropagation(),!1):void 0})});
|
tinymce.PluginManager.requireLangPack("leanote_code"),tinymce.PluginManager.add("leanote_code",function(a,b){function c(a){return a?("object"==typeof a&&(a=$(a).html()),a.replace(/\<br *\/*\>/gi,"\n").replace(/<\/(p|li|div|ul|ol|hr)>/,"\n").replace(/(<([^>]+)>)/gi,"").replace(/\n\n/g,"\n")):a}function d(a){return a?("object"==typeof a&&(a=$(a).html()),a.replace(/\n/g,"<br />")):a}function e(){var a=$("#editorContent").children(),b=a&&a.length>0?a[a.length-1]:null;b&&"P"==b.tagName||$("#editorContent").append('<p><br data-mce-bogus="1"></p>')}function f(a){h=tinymce.activeEditor;var b,f=h.selection.getNode(),g=h.selection.getContent(),i=LeaAce.isInAce(f),j=!1,k=!1;i&&(j=i[0],k=i[1]),$("#editorContent .toggle-raw").remove();var l='class="brush:'+a+'"';if(a&&"convert"!=a){if(j&&j.session.setMode("ace/mode/"+a),k||"PRE"!=f.nodeName||(k=$(f)),k){var m=LeaAce.getPreBrush(k);return void k.removeClass(m).addClass("brush:"+a)}}else if(a&&("BODY"==f.nodeName||"editorContent"==$(f).attr("id")))return;if(LeaAce.canAce()){var n=LeaAce.getAceId();if(LeaAce.disableAddHistory(),j){var o=j.getValue();o=o.replace(/</g,"<"),o=o.replace(/>/g,">"),o=o.replace(/\n/g,"<br />"),k.replaceWith("<p>"+o+"</p>"),j.destroy()}else{if("PRE"==f.nodeName){var k=$(f),o=k.html();return o&&(o=o.replace(/\n/g,"<br />")),void k.replaceWith("<p>"+o+"</p>")}var b=g;if(!b&&("BODY"==f.nodeName||"editorContent"==$(f).attr("id")))return;b?(b=c(b),h.insertContent('<pre id="'+n+'" '+l+">"+b+"</pre>")):(b=c(f),$(f).replaceWith("<pre id='"+n+"'"+l+">"+b+"</pre>"));var j=LeaAce.initAce(n);j&&(j.focus(),a&&"convert"!=a&&j.session.setMode("ace/mode/"+a),e())}LeaAce.resetAddHistory()}else if("PRE"!=f.nodeName&&(f=$(f).closest("pre").get(0)),f&&"PRE"==f.nodeName){var k=$(f),o=k.html();o&&(o=o.replace(/\n/g,"<br />")),k.replaceWith("<p>"+o+"</p>")}else{try{b=$.trim($(g).text())}catch(p){}b||(b=$.trim(g));var q=null,n=LeaAce.getAceId();b?(b=d(b),q='<pre id="'+n+'" '+l+">"+b+"</pre>",h.insertContent(q)):f?(b=d(f),q='<pre id="'+n+'" '+l+">"+b+"</pre>",$(f).replaceWith(q)):(q='<pre id="'+n+'" '+l+">"+b+"</pre>",h.insertContent(q)),q&&e()}}function g(){return function(){var b=this;a.on("nodeChange",function(){var c=null;try{var d=a.selection.getNode();if("PRE"!=d.nodeName&&(d=$(d).closest("pre").get(0)),d){var e=LeaAce.isInAce(d),f=!1,g=!1;if(e||"PRE"==d.nodeName){e?(f=e[0],g=e[1]):g=$(d);var h=LeaAce.getPreBrush(g);c=$.trim(h.split(":")[1]),b.diableValue("convert",!1)}else b.diableValue("convert",!0)}}catch(i){log(i)}"convert"!=c&&b.value(c)})}}var h=a;a.addButton("leanote_code",function(){var a=["Convert Code:convert","CSS:css","HTML:html","Javascript:javascript","C/C++:c_cpp","C#:csharp","Java:java","Objective-c:objectivec","PHP:php","Python:python","Ruby:ruby","Shell:sh","Delphi:delphi","Golang:golang","Erlang:erlang","Groovy:groovy","Latex:latex","Xml:xml","ActionScript:actionScript"],b=[];for(var c in a){var d=a[c].split(":");b.push({text:d[0],value:d[1]})}return{type:"listbox",text:"codeLang",tooltip:"toggleCode",values:b,fixedWidth:!0,onselect:function(a){a.control.settings.value&&f(a.control.settings.value)},onPostRender:g(b)}}),a.addButton("leanote_inline_code",{icon:"code",tooltip:"Inline Code",stateSelector:"code",onclick:function(){a.execCommand("mceToggleFormat",!1,"code")}}),LeaAce.canAce()&&a.addButton("leanote_ace_pre",{icon:"ace-pre",tooltip:"Toggle ace with raw html",active:LeaAce.isAce===!1,onclick:function(){LeaAce.isAce===!1?(this.active(!1),LeaAce.isAce=!0,LeaAce.initAceFromContent(a)):(this.active(!0),LeaAce.allToPre(a),LeaAce.isAce=!1)}}),h.addCommand("toggleCode",f),h.addShortcut("ctrl+shift+c","","toggleCode"),h.addShortcut("command+shift+c","","toggleCode"),LeaAce.canAce()&&a.on("keydown",function(a){var b=LeaAce.nowIsInAce();return b?(setTimeout(function(){b[0].focus()}),!0):void 0}),h.on("keydown",function(a){var b=a.which?a.which:a.keyCode;return 9==b?(a.shiftKey||h.insertContent(" "),a.preventDefault(),a.stopPropagation(),!1):void 0})});
|
||||||
@@ -57,7 +57,7 @@ tinymce.PluginManager.add('leaui_image', function(editor, url) {
|
|||||||
LEAUI_DATAS = datas;
|
LEAUI_DATAS = datas;
|
||||||
|
|
||||||
function GetTheHtml(){
|
function GetTheHtml(){
|
||||||
var html = '<iframe id="leauiIfr" src="'+ url + '/index.html'+ '?' + new Date().getTime() + '" frameborder="0"></iframe>';
|
var html = '<iframe id="leauiIfr" src="/album/index'+ '?' + new Date().getTime() + '" frameborder="0"></iframe>';
|
||||||
return html;
|
return html;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -189,7 +189,7 @@ tinymce.PluginManager.add('leaui_image', function(editor, url) {
|
|||||||
icon: 'image',
|
icon: 'image',
|
||||||
tooltip: 'Insert/edit image',
|
tooltip: 'Insert/edit image',
|
||||||
onclick: showDialog,
|
onclick: showDialog,
|
||||||
stateSelector: 'img:not([data-mce-object])'
|
stateSelector: 'img:not([data-mind-json])'
|
||||||
});
|
});
|
||||||
|
|
||||||
editor.addMenuItem('leaui_image', {
|
editor.addMenuItem('leaui_image', {
|
||||||
|
|||||||
+1
-1
@@ -1 +1 @@
|
|||||||
var LEAUI_DATAS=[];tinymce.PluginManager.add("leaui_image",function(a,b){function c(a,b){function c(a,c){d.parentNode.removeChild(d),b({width:a,height:c})}var d=document.createElement("img");d.onload=function(){c(d.clientWidth,d.clientHeight)},d.onerror=function(){c()},d.src=a;var e=d.style;e.visibility="hidden",e.position="fixed",e.bottom=e.left=0,e.width=e.height="auto",document.body.appendChild(d)}function d(){function d(){var a='<iframe id="leauiIfr" src="'+b+"/index.html?"+(new Date).getTime()+'" frameborder="0"></iframe>';return a}var e=a.dom,f=a.selection.getContent(),g=/<img.*?\/>/g,h=f.match(g),i=document.createElement("p"),j=[];for(var k in h){i.innerHTML=h[k];var l=i.firstChild;if(l&&"IMG"==l.nodeName){var m={};m.src=e.getAttrib(l,"data-src")||e.getAttrib(l,"src"),m.width=e.getAttrib(l,"width"),m.height=e.getAttrib(l,"height"),m.title=e.getAttrib(l,"title"),j.push(m)}}LEAUI_DATAS=j;var n=$(document).width()-10;n>805&&(n=805);var o=$(document).height()-100;o>365&&(o=365),win=a.windowManager.open({title:"Image",width:n,height:o,html:d(),buttons:[{text:"Cancel",onclick:function(){this.parent().parent().close()}},{text:"Insert Image",subtype:"primary",onclick:function(d){for(var f=document.getElementById("leauiIfr").contentWindow,g=f.document.getElementById("preview"),h=g.childNodes,i=[],j=0;j<h.length;++j){var d=h[j];if(d.firstChild&&"IMG"==d.firstChild.nodeName){var k=d.firstChild,l={};l.src=k.getAttribute("src"),l.width=k.getAttribute("data-width"),l.height=k.getAttribute("data-height"),l.title=k.getAttribute("data-title"),i.push(l)}}for(var j in i){var m,n=i[j],o=n.src;m=-1!=o.indexOf("http://")||-1!=o.indexOf("https://")?o:b+"/"+o,n.src=m;var p=function(b){var d=function(b,c){var d,f={};return f.id="__mcenew"+c,f.src="http://leanote.com/images/loading-24.gif",d=e.createHTML("img",f),a.insertContent(d),d=e.get(f.id),function(a){a&&a.width&&(a.width>600&&(a.width=600),b.width=a.width),e.setAttrib(d,"src",b.src),e.setAttrib(d,"title",b.title),e.setAttrib(d,"id",null)}}(b,j);c(b.src,d)},q="";if(fileIds=m.split("fileId="),2==fileIds.length&&fileIds[1].length=="53aecf8a8a039a43c8036282".length&&(q=fileIds[1]),q){var r;Note&&Note.getCurNote&&(r=Note.getCurNote()),r&&r.UserId!=UserInfo.UserId?!function(a){ajaxPost("/file/copyImage",{userId:UserInfo.UserId,fileId:q,toUserId:r.UserId},function(b){if(reIsOk(b)&&b.Id){var c=UrlPrefix;a.src=c+"/file/outputImage?fileId="+b.Id}p(a)})}(n):p(n)}else p(n)}this.parent().parent().close()}}]})}a.addButton("leaui_image",{icon:"image",tooltip:"Insert/edit image",onclick:d,stateSelector:"img:not([data-mind-json])"}),a.addMenuItem("leaui_image",{icon:"image",text:"Insert image",onclick:d,context:"insert",prependToContext:!0});var e=!1;a.on("dragstart",function(a){e=!0}),a.on("dragend",function(a){e=!1}),a.on("dragover",function(a){e||$("body").trigger("dragover")})});
|
var LEAUI_DATAS=[];tinymce.PluginManager.add("leaui_image",function(a,b){function c(a,b){function c(a,c){d.parentNode.removeChild(d),b({width:a,height:c})}var d=document.createElement("img");d.onload=function(){c(d.clientWidth,d.clientHeight)},d.onerror=function(){c()},d.src=a;var e=d.style;e.visibility="hidden",e.position="fixed",e.bottom=e.left=0,e.width=e.height="auto",document.body.appendChild(d)}function d(){function d(){var a='<iframe id="leauiIfr" src="/album/index?'+(new Date).getTime()+'" frameborder="0"></iframe>';return a}var e=a.dom,f=a.selection.getContent(),g=/<img.*?\/>/g,h=f.match(g),i=document.createElement("p"),j=[];for(var k in h){i.innerHTML=h[k];var l=i.firstChild;if(l&&"IMG"==l.nodeName){var m={};m.src=e.getAttrib(l,"data-src")||e.getAttrib(l,"src"),m.width=e.getAttrib(l,"width"),m.height=e.getAttrib(l,"height"),m.title=e.getAttrib(l,"title"),j.push(m)}}LEAUI_DATAS=j;var n=$(document).width()-10;n>805&&(n=805);var o=$(document).height()-100;o>365&&(o=365),win=a.windowManager.open({title:"Image",width:n,height:o,html:d(),buttons:[{text:"Cancel",onclick:function(){this.parent().parent().close()}},{text:"Insert Image",subtype:"primary",onclick:function(d){for(var f=document.getElementById("leauiIfr").contentWindow,g=f.document.getElementById("preview"),h=g.childNodes,i=[],j=0;j<h.length;++j){var d=h[j];if(d.firstChild&&"IMG"==d.firstChild.nodeName){var k=d.firstChild,l={};l.src=k.getAttribute("src"),l.width=k.getAttribute("data-width"),l.height=k.getAttribute("data-height"),l.title=k.getAttribute("data-title"),i.push(l)}}for(var j in i){var m,n=i[j],o=n.src;m=-1!=o.indexOf("http://")||-1!=o.indexOf("https://")?o:b+"/"+o,n.src=m;var p=function(b){var d=function(b,c){var d,f={};return f.id="__mcenew"+c,f.src="http://leanote.com/images/loading-24.gif",d=e.createHTML("img",f),a.insertContent(d),d=e.get(f.id),function(a){a&&a.width&&(a.width>600&&(a.width=600),b.width=a.width),e.setAttrib(d,"src",b.src),e.setAttrib(d,"title",b.title),e.setAttrib(d,"id",null)}}(b,j);c(b.src,d)},q="";if(fileIds=m.split("fileId="),2==fileIds.length&&fileIds[1].length=="53aecf8a8a039a43c8036282".length&&(q=fileIds[1]),q){var r;Note&&Note.getCurNote&&(r=Note.getCurNote()),r&&r.UserId!=UserInfo.UserId?!function(a){ajaxPost("/file/copyImage",{userId:UserInfo.UserId,fileId:q,toUserId:r.UserId},function(b){if(reIsOk(b)&&b.Id){var c=UrlPrefix;a.src=c+"/file/outputImage?fileId="+b.Id}p(a)})}(n):p(n)}else p(n)}this.parent().parent().close()}}]})}a.addButton("leaui_image",{icon:"image",tooltip:"Insert/edit image",onclick:d,stateSelector:"img:not([data-mind-json])"}),a.addMenuItem("leaui_image",{icon:"image",text:"Insert image",onclick:d,context:"insert",prependToContext:!0});var e=!1;a.on("dragstart",function(a){e=!0}),a.on("dragend",function(a){e=!1}),a.on("dragover",function(a){e||$("body").trigger("dragover")})});
|
||||||
@@ -0,0 +1,172 @@
|
|||||||
|
/**
|
||||||
|
* leaui album image manager plugin
|
||||||
|
* copyright leaui
|
||||||
|
* leaui.com
|
||||||
|
*/
|
||||||
|
var LEAUI_MIND = {};
|
||||||
|
tinymce.PluginManager.add('leaui_mind', function(editor, url) {
|
||||||
|
|
||||||
|
function showDialog() {
|
||||||
|
var dom = editor.dom;
|
||||||
|
|
||||||
|
var content = editor.selection.getContent();
|
||||||
|
// get images and attrs
|
||||||
|
var p = /<img.*?\/>/g;
|
||||||
|
var images = content.match(p);
|
||||||
|
var newNode = document.createElement("p");
|
||||||
|
LEAUI_MIND = {};
|
||||||
|
for(var i in images) {
|
||||||
|
newNode.innerHTML = images[i];
|
||||||
|
var imgElm = newNode.firstChild;
|
||||||
|
if(imgElm && imgElm.nodeName == "IMG") {
|
||||||
|
LEAUI_MIND.json = dom.getAttrib(imgElm, 'data-mind-json');
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function GetTheHtml(){
|
||||||
|
var lang = editor.settings.language;
|
||||||
|
var u = '//leanote.com/public/libs/mind/edit.html';
|
||||||
|
// u = 'http://localhost:9000/public/libs/mind/edit.html';
|
||||||
|
var html = '<iframe id="leauiIfr" src="'+ u + '?' + new Date().getTime() + '&lang=' + lang + '" frameborder="0"></iframe>';
|
||||||
|
return html;
|
||||||
|
}
|
||||||
|
|
||||||
|
var w = $(document).width() - 10;
|
||||||
|
var h = $(document).height() - 100;
|
||||||
|
|
||||||
|
win = editor.windowManager.open({
|
||||||
|
title: "Mind Map",
|
||||||
|
width : w,
|
||||||
|
height : h,
|
||||||
|
html: GetTheHtml(),
|
||||||
|
buttons: [
|
||||||
|
{
|
||||||
|
text: 'Cancel',
|
||||||
|
onclick: function() {
|
||||||
|
this.parent().parent().close();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: 'Insert Mind Map',
|
||||||
|
subtype: 'primary',
|
||||||
|
onclick: function(e) {
|
||||||
|
var me = this;
|
||||||
|
var _iframe = document.getElementById('leauiIfr').contentWindow;
|
||||||
|
var km = _iframe.km;
|
||||||
|
km.exportData('png').then(function(data) {
|
||||||
|
var json = JSON.stringify(km.exportJson());
|
||||||
|
// console.log(json);
|
||||||
|
var img = '<img src="' + data + '" data-mce-src="-" data-mind-json=\'' + json + '\'>';
|
||||||
|
editor.insertContent(img);
|
||||||
|
|
||||||
|
me.parent().parent().close();
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
|
||||||
|
var _div =_iframe.document.getElementById('preview');
|
||||||
|
var ii = _div.childNodes;
|
||||||
|
//console.log(ii);
|
||||||
|
var datas = [];
|
||||||
|
for(var i = 0; i < ii.length; ++i) {
|
||||||
|
var e = ii[i];
|
||||||
|
//console.log(e);
|
||||||
|
// 有些没有image
|
||||||
|
if(e.firstChild && e.firstChild.nodeName == "IMG") {
|
||||||
|
var img = e.firstChild;
|
||||||
|
var d = {};
|
||||||
|
d.src = img.getAttribute("src");
|
||||||
|
d.width = img.getAttribute("data-width");
|
||||||
|
d.height = img.getAttribute("data-height");
|
||||||
|
d.title = img.getAttribute("data-title");
|
||||||
|
|
||||||
|
datas.push(d);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
for(var i in datas) {
|
||||||
|
var data = datas[i];
|
||||||
|
var src = data.src;
|
||||||
|
// the network image
|
||||||
|
var trueSrc;
|
||||||
|
if(src.indexOf("http://") != -1 || src.indexOf("https://") != -1) {
|
||||||
|
trueSrc = src;
|
||||||
|
} else {
|
||||||
|
trueSrc = url + "/" + src;
|
||||||
|
}
|
||||||
|
data.src = trueSrc;
|
||||||
|
|
||||||
|
var renderImage = function(data) {
|
||||||
|
// 这里, 如果图片宽度过大, 这里设置成500px
|
||||||
|
var back = (function(data2, i) {
|
||||||
|
var d = {};
|
||||||
|
var imgElm;
|
||||||
|
// 先显示loading...
|
||||||
|
d.id = '__mcenew' + i;
|
||||||
|
d.src = "http://leanote.com/images/loading-24.gif";
|
||||||
|
imgElm = dom.createHTML('img', d);
|
||||||
|
editor.insertContent(imgElm);
|
||||||
|
imgElm = dom.get(d.id);
|
||||||
|
|
||||||
|
return function(wh) {
|
||||||
|
if(wh && wh.width) {
|
||||||
|
if(wh.width > 600) {
|
||||||
|
wh.width = 600;
|
||||||
|
}
|
||||||
|
data2.width = wh.width;
|
||||||
|
}
|
||||||
|
dom.setAttrib(imgElm, 'src', data2.src);
|
||||||
|
// dom.setAttrib(imgElm, 'width', data2.width);
|
||||||
|
dom.setAttrib(imgElm, 'title', data2.title);
|
||||||
|
|
||||||
|
dom.setAttrib(imgElm, 'id', null);
|
||||||
|
}
|
||||||
|
})(data, i);
|
||||||
|
getImageSize(data.src, back);
|
||||||
|
}
|
||||||
|
|
||||||
|
// outputImage?fileId=123232323
|
||||||
|
var fileId = "";
|
||||||
|
fileIds = trueSrc.split("fileId=")
|
||||||
|
if(fileIds.length == 2 && fileIds[1].length == "53aecf8a8a039a43c8036282".length) {
|
||||||
|
fileId = fileIds[1];
|
||||||
|
}
|
||||||
|
if(fileId) {
|
||||||
|
// 得到fileId, 如果这个笔记不是我的, 那么肯定是协作的笔记, 那么需要将图片copy给原note owner
|
||||||
|
// 博客设置中不用没有Note
|
||||||
|
var curNote;
|
||||||
|
if(Note && Note.getCurNote) {
|
||||||
|
curNote = Note.getCurNote();
|
||||||
|
}
|
||||||
|
if(curNote && curNote.UserId != UserInfo.UserId) {
|
||||||
|
(function(data) {
|
||||||
|
ajaxPost("/file/copyImage", {userId: UserInfo.UserId, fileId: fileId, toUserId: curNote.UserId}, function(re) {
|
||||||
|
if(reIsOk(re) && re.Id) {
|
||||||
|
var urlPrefix = UrlPrefix; // window.location.protocol + "//" + window.location.host;
|
||||||
|
data.src = urlPrefix + "/file/outputImage?fileId=" + re.Id;
|
||||||
|
}
|
||||||
|
renderImage(data);
|
||||||
|
});
|
||||||
|
})(data);
|
||||||
|
} else {
|
||||||
|
renderImage(data);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
renderImage(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // end for
|
||||||
|
|
||||||
|
this.parent().parent().close();
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
editor.addButton('leaui_mind', {
|
||||||
|
icon: 'mind',
|
||||||
|
tooltip: 'Insert/edit mind map',
|
||||||
|
onclick: showDialog,
|
||||||
|
stateSelector: 'img[data-mind-json]'
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
var LEAUI_MIND={};tinymce.PluginManager.add("leaui_mind",function(a,b){function c(){function b(){var b=a.settings.language,c="//leanote.com/public/libs/mind/edit.html",d='<iframe id="leauiIfr" src="'+c+"?"+(new Date).getTime()+"&lang="+b+'" frameborder="0"></iframe>';return d}var c=a.dom,d=a.selection.getContent(),e=/<img.*?\/>/g,f=d.match(e),g=document.createElement("p");LEAUI_MIND={};for(var h in f){g.innerHTML=f[h];var i=g.firstChild;if(i&&"IMG"==i.nodeName){LEAUI_MIND.json=c.getAttrib(i,"data-mind-json");break}}var j=$(document).width()-10,k=$(document).height()-100;win=a.windowManager.open({title:"Mind Map",width:j,height:k,html:b(),buttons:[{text:"Cancel",onclick:function(){this.parent().parent().close()}},{text:"Insert Mind Map",subtype:"primary",onclick:function(b){var c=this,d=document.getElementById("leauiIfr").contentWindow,e=d.km;return void e.exportData("png").then(function(b){var d=JSON.stringify(e.exportJson()),f='<img src="'+b+'" data-mce-src="-" data-mind-json=\''+d+"'>";a.insertContent(f),c.parent().parent().close()})}}]})}a.addButton("leaui_mind",{icon:"mind",tooltip:"Insert/edit mind map",onclick:c,stateSelector:"img[data-mind-json]"})});
|
||||||
+611
@@ -0,0 +1,611 @@
|
|||||||
|
/**
|
||||||
|
* Clipboard.js
|
||||||
|
*
|
||||||
|
* Copyright, Moxiecode Systems AB
|
||||||
|
* Released under LGPL License.
|
||||||
|
*
|
||||||
|
* License: http://www.tinymce.com/license
|
||||||
|
* Contributing: http://www.tinymce.com/contributing
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class contains logic for getting HTML contents out of the clipboard.
|
||||||
|
*
|
||||||
|
* We need to make a lot of ugly hacks to get the contents out of the clipboard since
|
||||||
|
* the W3C Clipboard API is broken in all browsers that have it: Gecko/WebKit/Blink.
|
||||||
|
* We might rewrite this the way those API:s stabilize. Browsers doesn't handle pasting
|
||||||
|
* from applications like Word the same way as it does when pasting into a contentEditable area
|
||||||
|
* so we need to do lots of extra work to try to get to this clipboard data.
|
||||||
|
*
|
||||||
|
* Current implementation steps:
|
||||||
|
* 1. On keydown with paste keys Ctrl+V or Shift+Insert create
|
||||||
|
* a paste bin element and move focus to that element.
|
||||||
|
* 2. Wait for the browser to fire a "paste" event and get the contents out of the paste bin.
|
||||||
|
* 3. Check if the paste was successful if true, process the HTML.
|
||||||
|
* (4). If the paste was unsuccessful use IE execCommand, Clipboard API, document.dataTransfer old WebKit API etc.
|
||||||
|
*
|
||||||
|
* @class tinymce.pasteplugin.Clipboard
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
define("tinymce/pasteplugin/Clipboard", [
|
||||||
|
"tinymce/Env",
|
||||||
|
"tinymce/dom/RangeUtils",
|
||||||
|
"tinymce/util/VK",
|
||||||
|
"tinymce/pasteplugin/Utils"
|
||||||
|
], function(Env, RangeUtils, VK, Utils) {
|
||||||
|
return function(editor) {
|
||||||
|
var self = this, pasteBinElm, lastRng, keyboardPasteTimeStamp = 0, draggingInternally = false;
|
||||||
|
var pasteBinDefaultContent = '%MCEPASTEBIN%', keyboardPastePlainTextState;
|
||||||
|
var mceInternalUrlPrefix = 'data:text/mce-internal,';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pastes the specified HTML. This means that the HTML is filtered and then
|
||||||
|
* inserted at the current selection in the editor. It will also fire paste events
|
||||||
|
* for custom user filtering.
|
||||||
|
*
|
||||||
|
* @param {String} html HTML code to paste into the current selection.
|
||||||
|
*/
|
||||||
|
function pasteHtml(html) {
|
||||||
|
var args, dom = editor.dom;
|
||||||
|
|
||||||
|
args = editor.fire('BeforePastePreProcess', {content: html}); // Internal event used by Quirks
|
||||||
|
args = editor.fire('PastePreProcess', args);
|
||||||
|
html = args.content;
|
||||||
|
|
||||||
|
if (!args.isDefaultPrevented()) {
|
||||||
|
// User has bound PastePostProcess events then we need to pass it through a DOM node
|
||||||
|
// This is not ideal but we don't want to let the browser mess up the HTML for example
|
||||||
|
// some browsers add to P tags etc
|
||||||
|
if (editor.hasEventListeners('PastePostProcess') && !args.isDefaultPrevented()) {
|
||||||
|
// We need to attach the element to the DOM so Sizzle selectors work on the contents
|
||||||
|
var tempBody = dom.add(editor.getBody(), 'div', {style: 'display:none'}, html);
|
||||||
|
args = editor.fire('PastePostProcess', {node: tempBody});
|
||||||
|
dom.remove(tempBody);
|
||||||
|
html = args.node.innerHTML;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!args.isDefaultPrevented()) {
|
||||||
|
editor.insertContent(html, {merge: editor.settings.paste_merge_formats !== false});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pastes the specified text. This means that the plain text is processed
|
||||||
|
* and converted into BR and P elements. It will fire paste events for custom filtering.
|
||||||
|
*
|
||||||
|
* @param {String} text Text to paste as the current selection location.
|
||||||
|
*/
|
||||||
|
function pasteText(text) {
|
||||||
|
text = editor.dom.encode(text).replace(/\r\n/g, '\n');
|
||||||
|
|
||||||
|
var startBlock = editor.dom.getParent(editor.selection.getStart(), editor.dom.isBlock);
|
||||||
|
|
||||||
|
// Create start block html for example <p attr="value">
|
||||||
|
var forcedRootBlockName = editor.settings.forced_root_block;
|
||||||
|
var forcedRootBlockStartHtml;
|
||||||
|
if (forcedRootBlockName) {
|
||||||
|
forcedRootBlockStartHtml = editor.dom.createHTML(forcedRootBlockName, editor.settings.forced_root_block_attrs);
|
||||||
|
forcedRootBlockStartHtml = forcedRootBlockStartHtml.substr(0, forcedRootBlockStartHtml.length - 3) + '>';
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((startBlock && /^(PRE|DIV)$/.test(startBlock.nodeName)) || !forcedRootBlockName) {
|
||||||
|
text = Utils.filter(text, [
|
||||||
|
[/\n/g, "<br>"]
|
||||||
|
]);
|
||||||
|
} else {
|
||||||
|
text = Utils.filter(text, [
|
||||||
|
[/\n\n/g, "</p>" + forcedRootBlockStartHtml],
|
||||||
|
[/^(.*<\/p>)(<p>)$/, forcedRootBlockStartHtml + '$1'],
|
||||||
|
[/\n/g, "<br />"]
|
||||||
|
]);
|
||||||
|
|
||||||
|
if (text.indexOf('<p>') != -1) {
|
||||||
|
text = forcedRootBlockStartHtml + text;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pasteHtml(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a paste bin element as close as possible to the current caret location and places the focus inside that element
|
||||||
|
* so that when the real paste event occurs the contents gets inserted into this element
|
||||||
|
* instead of the current editor selection element.
|
||||||
|
*/
|
||||||
|
function createPasteBin() {
|
||||||
|
var dom = editor.dom, body = editor.getBody();
|
||||||
|
var viewport = editor.dom.getViewPort(editor.getWin()), scrollTop = viewport.y, top = 20;
|
||||||
|
var scrollContainer;
|
||||||
|
|
||||||
|
lastRng = editor.selection.getRng();
|
||||||
|
|
||||||
|
if (editor.inline) {
|
||||||
|
scrollContainer = editor.selection.getScrollContainer();
|
||||||
|
|
||||||
|
// Can't always rely on scrollTop returning a useful value.
|
||||||
|
// It returns 0 if the browser doesn't support scrollTop for the element or is non-scrollable
|
||||||
|
if (scrollContainer && scrollContainer.scrollTop > 0) {
|
||||||
|
scrollTop = scrollContainer.scrollTop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the rect of the current caret if the caret is in an empty block before a
|
||||||
|
* BR we insert a temporary invisible character that we get the rect this way we always get a proper rect.
|
||||||
|
*
|
||||||
|
* TODO: This might be useful in core.
|
||||||
|
*/
|
||||||
|
function getCaretRect(rng) {
|
||||||
|
var rects, textNode, node, container = rng.startContainer;
|
||||||
|
|
||||||
|
rects = rng.getClientRects();
|
||||||
|
if (rects.length) {
|
||||||
|
return rects[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!rng.collapsed || container.nodeType != 1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
node = container.childNodes[lastRng.startOffset];
|
||||||
|
|
||||||
|
// Skip empty whitespace nodes
|
||||||
|
while (node && node.nodeType == 3 && !node.data.length) {
|
||||||
|
node = node.nextSibling;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!node) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if the location is |<br>
|
||||||
|
// TODO: Might need to expand this to say |<table>
|
||||||
|
if (node.tagName == 'BR') {
|
||||||
|
textNode = dom.doc.createTextNode('\uFEFF');
|
||||||
|
node.parentNode.insertBefore(textNode, node);
|
||||||
|
|
||||||
|
rng = dom.createRng();
|
||||||
|
rng.setStartBefore(textNode);
|
||||||
|
rng.setEndAfter(textNode);
|
||||||
|
|
||||||
|
rects = rng.getClientRects();
|
||||||
|
dom.remove(textNode);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rects.length) {
|
||||||
|
return rects[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculate top cordinate this is needed to avoid scrolling to top of document
|
||||||
|
// We want the paste bin to be as close to the caret as possible to avoid scrolling
|
||||||
|
if (lastRng.getClientRects) {
|
||||||
|
var rect = getCaretRect(lastRng);
|
||||||
|
|
||||||
|
if (rect) {
|
||||||
|
// Client rects gets us closes to the actual
|
||||||
|
// caret location in for example a wrapped paragraph block
|
||||||
|
top = scrollTop + (rect.top - dom.getPos(body).y);
|
||||||
|
} else {
|
||||||
|
top = scrollTop;
|
||||||
|
|
||||||
|
// Check if we can find a closer location by checking the range element
|
||||||
|
var container = lastRng.startContainer;
|
||||||
|
if (container) {
|
||||||
|
if (container.nodeType == 3 && container.parentNode != body) {
|
||||||
|
container = container.parentNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (container.nodeType == 1) {
|
||||||
|
top = dom.getPos(container, scrollContainer || body).y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a pastebin
|
||||||
|
pasteBinElm = dom.add(editor.getBody(), 'div', {
|
||||||
|
id: "mcepastebin",
|
||||||
|
contentEditable: true,
|
||||||
|
"data-mce-bogus": "all",
|
||||||
|
style: 'position: absolute; top: ' + top + 'px;' +
|
||||||
|
'width: 10px; height: 10px; overflow: hidden; opacity: 0'
|
||||||
|
}, pasteBinDefaultContent);
|
||||||
|
|
||||||
|
// Move paste bin out of sight since the controlSelection rect gets displayed otherwise on IE and Gecko
|
||||||
|
if (Env.ie || Env.gecko) {
|
||||||
|
dom.setStyle(pasteBinElm, 'left', dom.getStyle(body, 'direction', true) == 'rtl' ? 0xFFFF : -0xFFFF);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prevent focus events from bubbeling fixed FocusManager issues
|
||||||
|
dom.bind(pasteBinElm, 'beforedeactivate focusin focusout', function(e) {
|
||||||
|
e.stopPropagation();
|
||||||
|
});
|
||||||
|
|
||||||
|
pasteBinElm.focus();
|
||||||
|
editor.selection.select(pasteBinElm, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes the paste bin if it exists.
|
||||||
|
*/
|
||||||
|
function removePasteBin() {
|
||||||
|
if (pasteBinElm) {
|
||||||
|
var pasteBinClone;
|
||||||
|
|
||||||
|
// WebKit/Blink might clone the div so
|
||||||
|
// lets make sure we remove all clones
|
||||||
|
// TODO: Man o man is this ugly. WebKit is the new IE! Remove this if they ever fix it!
|
||||||
|
while ((pasteBinClone = editor.dom.get('mcepastebin'))) {
|
||||||
|
editor.dom.remove(pasteBinClone);
|
||||||
|
editor.dom.unbind(pasteBinClone);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lastRng) {
|
||||||
|
editor.selection.setRng(lastRng);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pasteBinElm = lastRng = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the contents of the paste bin as a HTML string.
|
||||||
|
*
|
||||||
|
* @return {String} Get the contents of the paste bin.
|
||||||
|
*/
|
||||||
|
function getPasteBinHtml() {
|
||||||
|
var html = '', pasteBinClones, i, clone, cloneHtml;
|
||||||
|
|
||||||
|
// Since WebKit/Chrome might clone the paste bin when pasting
|
||||||
|
// for example: <img style="float: right"> we need to check if any of them contains some useful html.
|
||||||
|
// TODO: Man o man is this ugly. WebKit is the new IE! Remove this if they ever fix it!
|
||||||
|
pasteBinClones = editor.dom.select('div[id=mcepastebin]');
|
||||||
|
for (i = 0; i < pasteBinClones.length; i++) {
|
||||||
|
clone = pasteBinClones[i];
|
||||||
|
|
||||||
|
// Pasting plain text produces pastebins in pastebinds makes sence right!?
|
||||||
|
if (clone.firstChild && clone.firstChild.id == 'mcepastebin') {
|
||||||
|
clone = clone.firstChild;
|
||||||
|
}
|
||||||
|
|
||||||
|
cloneHtml = clone.innerHTML;
|
||||||
|
if (html != pasteBinDefaultContent) {
|
||||||
|
html += cloneHtml;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return html;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets various content types out of a datatransfer object.
|
||||||
|
*
|
||||||
|
* @param {DataTransfer} dataTransfer Event fired on paste.
|
||||||
|
* @return {Object} Object with mime types and data for those mime types.
|
||||||
|
*/
|
||||||
|
function getDataTransferItems(dataTransfer) {
|
||||||
|
var data = {};
|
||||||
|
|
||||||
|
if (dataTransfer) {
|
||||||
|
// Use old WebKit/IE API
|
||||||
|
if (dataTransfer.getData) {
|
||||||
|
var legacyText = dataTransfer.getData('Text');
|
||||||
|
if (legacyText && legacyText.length > 0) {
|
||||||
|
if (legacyText.indexOf(mceInternalUrlPrefix) == -1) {
|
||||||
|
data['text/plain'] = legacyText;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dataTransfer.types) {
|
||||||
|
for (var i = 0; i < dataTransfer.types.length; i++) {
|
||||||
|
var contentType = dataTransfer.types[i];
|
||||||
|
data[contentType] = dataTransfer.getData(contentType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets various content types out of the Clipboard API. It will also get the
|
||||||
|
* plain text using older IE and WebKit API:s.
|
||||||
|
*
|
||||||
|
* @param {ClipboardEvent} clipboardEvent Event fired on paste.
|
||||||
|
* @return {Object} Object with mime types and data for those mime types.
|
||||||
|
*/
|
||||||
|
function getClipboardContent(clipboardEvent) {
|
||||||
|
return getDataTransferItems(clipboardEvent.clipboardData || editor.getDoc().dataTransfer);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if the clipboard contains image data if it does it will take that data
|
||||||
|
* and convert it into a data url image and paste that image at the caret location.
|
||||||
|
*
|
||||||
|
* @param {ClipboardEvent} e Paste/drop event object.
|
||||||
|
* @param {DOMRange} rng Optional rng object to move selection to.
|
||||||
|
* @return {Boolean} true/false if the image data was found or not.
|
||||||
|
*/
|
||||||
|
function pasteImageData(e, rng) {
|
||||||
|
var dataTransfer = e.clipboardData || e.dataTransfer;
|
||||||
|
|
||||||
|
function processItems(items) {
|
||||||
|
var i, item, reader, hadImage = false;
|
||||||
|
|
||||||
|
function pasteImage(reader) {
|
||||||
|
if (rng) {
|
||||||
|
editor.selection.setRng(rng);
|
||||||
|
rng = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
pasteHtml('<img src="' + reader.result + '">');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (items) {
|
||||||
|
for (i = 0; i < items.length; i++) {
|
||||||
|
item = items[i];
|
||||||
|
|
||||||
|
if (/^image\/(jpeg|png|gif|bmp)$/.test(item.type)) {
|
||||||
|
reader = new FileReader();
|
||||||
|
reader.onload = pasteImage.bind(null, reader);
|
||||||
|
reader.readAsDataURL(item.getAsFile ? item.getAsFile() : item);
|
||||||
|
|
||||||
|
e.preventDefault();
|
||||||
|
hadImage = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return hadImage;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (editor.settings.paste_data_images && dataTransfer) {
|
||||||
|
return processItems(dataTransfer.items) || processItems(dataTransfer.files);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Chrome on Android doesn't support proper clipboard access so we have no choice but to allow the browser default behavior.
|
||||||
|
*
|
||||||
|
* @param {Event} e Paste event object to check if it contains any data.
|
||||||
|
* @return {Boolean} true/false if the clipboard is empty or not.
|
||||||
|
*/
|
||||||
|
function isBrokenAndroidClipboardEvent(e) {
|
||||||
|
var clipboardData = e.clipboardData;
|
||||||
|
|
||||||
|
return navigator.userAgent.indexOf('Android') != -1 && clipboardData && clipboardData.items && clipboardData.items.length === 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getCaretRangeFromEvent(e) {
|
||||||
|
return RangeUtils.getCaretRangeFromPoint(e.clientX, e.clientY, editor.getDoc());
|
||||||
|
}
|
||||||
|
|
||||||
|
function hasContentType(clipboardContent, mimeType) {
|
||||||
|
return mimeType in clipboardContent && clipboardContent[mimeType].length > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function isKeyboardPasteEvent(e) {
|
||||||
|
return (VK.metaKeyPressed(e) && e.keyCode == 86) || (e.shiftKey && e.keyCode == 45);
|
||||||
|
}
|
||||||
|
|
||||||
|
function registerEventHandlers() {
|
||||||
|
editor.on('keydown', function(e) {
|
||||||
|
function removePasteBinOnKeyUp(e) {
|
||||||
|
// Ctrl+V or Shift+Insert
|
||||||
|
if (isKeyboardPasteEvent(e) && !e.isDefaultPrevented()) {
|
||||||
|
removePasteBin();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ctrl+V or Shift+Insert
|
||||||
|
if (isKeyboardPasteEvent(e) && !e.isDefaultPrevented()) {
|
||||||
|
keyboardPastePlainTextState = e.shiftKey && e.keyCode == 86;
|
||||||
|
|
||||||
|
// Edge case on Safari on Mac where it doesn't handle Cmd+Shift+V correctly
|
||||||
|
// it fires the keydown but no paste or keyup so we are left with a paste bin
|
||||||
|
if (keyboardPastePlainTextState && Env.webkit && navigator.userAgent.indexOf('Version/') != -1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prevent undoManager keydown handler from making an undo level with the pastebin in it
|
||||||
|
e.stopImmediatePropagation();
|
||||||
|
|
||||||
|
keyboardPasteTimeStamp = new Date().getTime();
|
||||||
|
|
||||||
|
// IE doesn't support Ctrl+Shift+V and it doesn't even produce a paste event
|
||||||
|
// so lets fake a paste event and let IE use the execCommand/dataTransfer methods
|
||||||
|
if (Env.ie && keyboardPastePlainTextState) {
|
||||||
|
e.preventDefault();
|
||||||
|
editor.fire('paste', {ieFake: true});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
removePasteBin();
|
||||||
|
createPasteBin();
|
||||||
|
|
||||||
|
// Remove pastebin if we get a keyup and no paste event
|
||||||
|
// For example pasting a file in IE 11 will not produce a paste event
|
||||||
|
editor.once('keyup', removePasteBinOnKeyUp);
|
||||||
|
editor.once('paste', function() {
|
||||||
|
editor.off('keyup', removePasteBinOnKeyUp);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
editor.on('paste', function(e) {
|
||||||
|
// Getting content from the Clipboard can take some time
|
||||||
|
var clipboardTimer = new Date().getTime();
|
||||||
|
var clipboardContent = getClipboardContent(e);
|
||||||
|
var clipboardDelay = new Date().getTime() - clipboardTimer;
|
||||||
|
|
||||||
|
var isKeyBoardPaste = (new Date().getTime() - keyboardPasteTimeStamp - clipboardDelay) < 1000;
|
||||||
|
var plainTextMode = self.pasteFormat == "text" || keyboardPastePlainTextState;
|
||||||
|
|
||||||
|
keyboardPastePlainTextState = false;
|
||||||
|
|
||||||
|
if (e.isDefaultPrevented() || isBrokenAndroidClipboardEvent(e)) {
|
||||||
|
removePasteBin();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pasteImageData(e)) {
|
||||||
|
removePasteBin();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Not a keyboard paste prevent default paste and try to grab the clipboard contents using different APIs
|
||||||
|
if (!isKeyBoardPaste) {
|
||||||
|
e.preventDefault();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try IE only method if paste isn't a keyboard paste
|
||||||
|
if (Env.ie && (!isKeyBoardPaste || e.ieFake)) {
|
||||||
|
createPasteBin();
|
||||||
|
|
||||||
|
editor.dom.bind(pasteBinElm, 'paste', function(e) {
|
||||||
|
e.stopPropagation();
|
||||||
|
});
|
||||||
|
|
||||||
|
editor.getDoc().execCommand('Paste', false, null);
|
||||||
|
clipboardContent["text/html"] = getPasteBinHtml();
|
||||||
|
}
|
||||||
|
|
||||||
|
setTimeout(function() {
|
||||||
|
var content;
|
||||||
|
|
||||||
|
// Grab HTML from Clipboard API or paste bin as a fallback
|
||||||
|
if (hasContentType(clipboardContent, 'text/html')) {
|
||||||
|
content = clipboardContent['text/html'];
|
||||||
|
} else {
|
||||||
|
content = getPasteBinHtml();
|
||||||
|
|
||||||
|
// If paste bin is empty try using plain text mode
|
||||||
|
// since that is better than nothing right
|
||||||
|
if (content == pasteBinDefaultContent) {
|
||||||
|
plainTextMode = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
content = Utils.trimHtml(content);
|
||||||
|
|
||||||
|
// WebKit has a nice bug where it clones the paste bin if you paste from for example notepad
|
||||||
|
// so we need to force plain text mode in this case
|
||||||
|
if (pasteBinElm && pasteBinElm.firstChild && pasteBinElm.firstChild.id === 'mcepastebin') {
|
||||||
|
plainTextMode = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
removePasteBin();
|
||||||
|
|
||||||
|
// If we got nothing from clipboard API and pastebin then we could try the last resort: plain/text
|
||||||
|
if (!content.length) {
|
||||||
|
plainTextMode = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Grab plain text from Clipboard API or convert existing HTML to plain text
|
||||||
|
if (plainTextMode) {
|
||||||
|
// Use plain text contents from Clipboard API unless the HTML contains paragraphs then
|
||||||
|
// we should convert the HTML to plain text since works better when pasting HTML/Word contents as plain text
|
||||||
|
if (hasContentType(clipboardContent, 'text/plain') && content.indexOf('</p>') == -1) {
|
||||||
|
content = clipboardContent['text/plain'];
|
||||||
|
} else {
|
||||||
|
content = Utils.innerText(content);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the content is the paste bin default HTML then it was
|
||||||
|
// impossible to get the cliboard data out.
|
||||||
|
if (content == pasteBinDefaultContent) {
|
||||||
|
if (!isKeyBoardPaste) {
|
||||||
|
editor.windowManager.alert('Please use Ctrl+V/Cmd+V keyboard shortcuts to paste contents.');
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (plainTextMode) {
|
||||||
|
pasteText(content);
|
||||||
|
} else {
|
||||||
|
pasteHtml(content);
|
||||||
|
}
|
||||||
|
}, 0);
|
||||||
|
});
|
||||||
|
|
||||||
|
editor.on('dragstart dragend', function(e) {
|
||||||
|
draggingInternally = e.type == 'dragstart';
|
||||||
|
});
|
||||||
|
|
||||||
|
editor.on('drop', function(e) {
|
||||||
|
var rng = getCaretRangeFromEvent(e);
|
||||||
|
|
||||||
|
if (e.isDefaultPrevented() || draggingInternally) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pasteImageData(e, rng)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rng && editor.settings.paste_filter_drop !== false) {
|
||||||
|
var dropContent = getDataTransferItems(e.dataTransfer);
|
||||||
|
var content = dropContent['mce-internal'] || dropContent['text/html'] || dropContent['text/plain'];
|
||||||
|
|
||||||
|
if (content) {
|
||||||
|
e.preventDefault();
|
||||||
|
|
||||||
|
editor.undoManager.transact(function() {
|
||||||
|
if (dropContent['mce-internal']) {
|
||||||
|
editor.execCommand('Delete');
|
||||||
|
}
|
||||||
|
|
||||||
|
editor.selection.setRng(rng);
|
||||||
|
|
||||||
|
content = Utils.trimHtml(content);
|
||||||
|
|
||||||
|
if (!dropContent['text/html']) {
|
||||||
|
pasteText(content);
|
||||||
|
} else {
|
||||||
|
pasteHtml(content);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
editor.on('dragover dragend', function(e) {
|
||||||
|
if (editor.settings.paste_data_images) {
|
||||||
|
e.preventDefault();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
self.pasteHtml = pasteHtml;
|
||||||
|
self.pasteText = pasteText;
|
||||||
|
|
||||||
|
editor.on('preInit', function() {
|
||||||
|
registerEventHandlers();
|
||||||
|
|
||||||
|
// Remove all data images from paste for example from Gecko
|
||||||
|
// except internal images like video elements
|
||||||
|
editor.parser.addNodeFilter('img', function(nodes) {
|
||||||
|
if (!editor.settings.paste_data_images) {
|
||||||
|
var i = nodes.length;
|
||||||
|
|
||||||
|
while (i--) {
|
||||||
|
var src = nodes[i].attributes.map.src;
|
||||||
|
|
||||||
|
// Some browsers automatically produce data uris on paste
|
||||||
|
// Safari on Mac produces webkit-fake-url see: https://bugs.webkit.org/show_bug.cgi?id=49141
|
||||||
|
if (src && /^(data:image|webkit\-fake\-url)/.test(src)) {
|
||||||
|
if (!nodes[i].attr('data-mce-object') && src !== Env.transparentSrc) {
|
||||||
|
nodes[i].remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
});
|
||||||
+110
@@ -0,0 +1,110 @@
|
|||||||
|
/**
|
||||||
|
* Plugin.js
|
||||||
|
*
|
||||||
|
* Copyright, Moxiecode Systems AB
|
||||||
|
* Released under LGPL License.
|
||||||
|
*
|
||||||
|
* License: http://www.tinymce.com/license
|
||||||
|
* Contributing: http://www.tinymce.com/contributing
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class contains the tinymce plugin logic for the paste plugin.
|
||||||
|
*
|
||||||
|
* @class tinymce.pasteplugin.Plugin
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
define("tinymce/pasteplugin/Plugin", [
|
||||||
|
"tinymce/PluginManager",
|
||||||
|
"tinymce/pasteplugin/Clipboard",
|
||||||
|
"tinymce/pasteplugin/WordFilter",
|
||||||
|
"tinymce/pasteplugin/Quirks"
|
||||||
|
], function(PluginManager, Clipboard, WordFilter, Quirks) {
|
||||||
|
var userIsInformed;
|
||||||
|
|
||||||
|
PluginManager.add('paste', function(editor) {
|
||||||
|
var self = this, clipboard, settings = editor.settings;
|
||||||
|
|
||||||
|
function togglePlainTextPaste() {
|
||||||
|
if (clipboard.pasteFormat == "text") {
|
||||||
|
this.active(false);
|
||||||
|
clipboard.pasteFormat = "html";
|
||||||
|
} else {
|
||||||
|
clipboard.pasteFormat = "text";
|
||||||
|
this.active(true);
|
||||||
|
|
||||||
|
if (!userIsInformed) {
|
||||||
|
editor.windowManager.alert(
|
||||||
|
'Paste is now in plain text mode. Contents will now ' +
|
||||||
|
'be pasted as plain text until you toggle this option off.'
|
||||||
|
);
|
||||||
|
|
||||||
|
userIsInformed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
self.clipboard = clipboard = new Clipboard(editor);
|
||||||
|
self.quirks = new Quirks(editor);
|
||||||
|
self.wordFilter = new WordFilter(editor);
|
||||||
|
|
||||||
|
if (editor.settings.paste_as_text) {
|
||||||
|
self.clipboard.pasteFormat = "text";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (settings.paste_preprocess) {
|
||||||
|
editor.on('PastePreProcess', function(e) {
|
||||||
|
settings.paste_preprocess.call(self, self, e);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (settings.paste_postprocess) {
|
||||||
|
editor.on('PastePostProcess', function(e) {
|
||||||
|
settings.paste_postprocess.call(self, self, e);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
editor.addCommand('mceInsertClipboardContent', function(ui, value) {
|
||||||
|
if (value.content) {
|
||||||
|
self.clipboard.pasteHtml(value.content);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (value.text) {
|
||||||
|
self.clipboard.pasteText(value.text);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Block all drag/drop events
|
||||||
|
if (editor.paste_block_drop) {
|
||||||
|
editor.on('dragend dragover draggesture dragdrop drop drag', function(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prevent users from dropping data images on Gecko
|
||||||
|
if (!editor.settings.paste_data_images) {
|
||||||
|
editor.on('drop', function(e) {
|
||||||
|
var dataTransfer = e.dataTransfer;
|
||||||
|
|
||||||
|
if (dataTransfer && dataTransfer.files && dataTransfer.files.length > 0) {
|
||||||
|
e.preventDefault();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
editor.addButton('pastetext', {
|
||||||
|
icon: 'pastetext',
|
||||||
|
tooltip: 'Paste as text',
|
||||||
|
onclick: togglePlainTextPaste,
|
||||||
|
active: self.clipboard.pasteFormat == "text"
|
||||||
|
});
|
||||||
|
|
||||||
|
editor.addMenuItem('pastetext', {
|
||||||
|
text: 'Paste as text',
|
||||||
|
selectable: true,
|
||||||
|
active: clipboard.pasteFormat,
|
||||||
|
onclick: togglePlainTextPaste
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
+159
@@ -0,0 +1,159 @@
|
|||||||
|
/**
|
||||||
|
* Quirks.js
|
||||||
|
*
|
||||||
|
* Copyright, Moxiecode Systems AB
|
||||||
|
* Released under LGPL License.
|
||||||
|
*
|
||||||
|
* License: http://www.tinymce.com/license
|
||||||
|
* Contributing: http://www.tinymce.com/contributing
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class contains various fixes for browsers. These issues can not be feature
|
||||||
|
* detected since we have no direct control over the clipboard. However we might be able
|
||||||
|
* to remove some of these fixes once the browsers gets updated/fixed.
|
||||||
|
*
|
||||||
|
* @class tinymce.pasteplugin.Quirks
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
define("tinymce/pasteplugin/Quirks", [
|
||||||
|
"tinymce/Env",
|
||||||
|
"tinymce/util/Tools",
|
||||||
|
"tinymce/pasteplugin/WordFilter",
|
||||||
|
"tinymce/pasteplugin/Utils"
|
||||||
|
], function(Env, Tools, WordFilter, Utils) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
return function(editor) {
|
||||||
|
function addPreProcessFilter(filterFunc) {
|
||||||
|
editor.on('BeforePastePreProcess', function(e) {
|
||||||
|
e.content = filterFunc(e.content);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes BR elements after block elements. IE9 has a nasty bug where it puts a BR element after each
|
||||||
|
* block element when pasting from word. This removes those elements.
|
||||||
|
*
|
||||||
|
* This:
|
||||||
|
* <p>a</p><br><p>b</p>
|
||||||
|
*
|
||||||
|
* Becomes:
|
||||||
|
* <p>a</p><p>b</p>
|
||||||
|
*/
|
||||||
|
function removeExplorerBrElementsAfterBlocks(html) {
|
||||||
|
// Only filter word specific content
|
||||||
|
if (!WordFilter.isWordContent(html)) {
|
||||||
|
return html;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Produce block regexp based on the block elements in schema
|
||||||
|
var blockElements = [];
|
||||||
|
|
||||||
|
Tools.each(editor.schema.getBlockElements(), function(block, blockName) {
|
||||||
|
blockElements.push(blockName);
|
||||||
|
});
|
||||||
|
|
||||||
|
var explorerBlocksRegExp = new RegExp(
|
||||||
|
'(?:<br> [\\s\\r\\n]+|<br>)*(<\\/?(' + blockElements.join('|') + ')[^>]*>)(?:<br> [\\s\\r\\n]+|<br>)*',
|
||||||
|
'g'
|
||||||
|
);
|
||||||
|
|
||||||
|
// Remove BR:s from: <BLOCK>X</BLOCK><BR>
|
||||||
|
html = Utils.filter(html, [
|
||||||
|
[explorerBlocksRegExp, '$1']
|
||||||
|
]);
|
||||||
|
|
||||||
|
// IE9 also adds an extra BR element for each soft-linefeed and it also adds a BR for each word wrap break
|
||||||
|
html = Utils.filter(html, [
|
||||||
|
[/<br><br>/g, '<BR><BR>'], // Replace multiple BR elements with uppercase BR to keep them intact
|
||||||
|
[/<br>/g, ' '], // Replace single br elements with space since they are word wrap BR:s
|
||||||
|
[/<BR><BR>/g, '<br>'] // Replace back the double brs but into a single BR
|
||||||
|
]);
|
||||||
|
|
||||||
|
return html;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* WebKit has a nasty bug where the all computed styles gets added to style attributes when copy/pasting contents.
|
||||||
|
* This fix solves that by simply removing the whole style attribute.
|
||||||
|
*
|
||||||
|
* The paste_webkit_styles option can be set to specify what to keep:
|
||||||
|
* paste_webkit_styles: "none" // Keep no styles
|
||||||
|
* paste_webkit_styles: "all", // Keep all of them
|
||||||
|
* paste_webkit_styles: "font-weight color" // Keep specific ones
|
||||||
|
*
|
||||||
|
* @param {String} content Content that needs to be processed.
|
||||||
|
* @return {String} Processed contents.
|
||||||
|
*/
|
||||||
|
function removeWebKitStyles(content) {
|
||||||
|
// Passthrough all styles from Word and let the WordFilter handle that junk
|
||||||
|
if (WordFilter.isWordContent(content)) {
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Filter away styles that isn't matching the target node
|
||||||
|
var webKitStyles = editor.settings.paste_webkit_styles;
|
||||||
|
|
||||||
|
if (editor.settings.paste_remove_styles_if_webkit === false || webKitStyles == "all") {
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (webKitStyles) {
|
||||||
|
webKitStyles = webKitStyles.split(/[, ]/);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Keep specific styles that doesn't match the current node computed style
|
||||||
|
if (webKitStyles) {
|
||||||
|
var dom = editor.dom, node = editor.selection.getNode();
|
||||||
|
|
||||||
|
content = content.replace(/(<[^>]+) style="([^"]*)"([^>]*>)/gi, function(all, before, value, after) {
|
||||||
|
var inputStyles = dom.parseStyle(value, 'span'), outputStyles = {};
|
||||||
|
|
||||||
|
if (webKitStyles === "none") {
|
||||||
|
return before + after;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = 0; i < webKitStyles.length; i++) {
|
||||||
|
var inputValue = inputStyles[webKitStyles[i]], currentValue = dom.getStyle(node, webKitStyles[i], true);
|
||||||
|
|
||||||
|
if (/color/.test(webKitStyles[i])) {
|
||||||
|
inputValue = dom.toHex(inputValue);
|
||||||
|
currentValue = dom.toHex(currentValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currentValue != inputValue) {
|
||||||
|
outputStyles[webKitStyles[i]] = inputValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
outputStyles = dom.serializeStyle(outputStyles, 'span');
|
||||||
|
if (outputStyles) {
|
||||||
|
return before + ' style="' + outputStyles + '"' + after;
|
||||||
|
}
|
||||||
|
|
||||||
|
return before + after;
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
// Remove all external styles
|
||||||
|
content = content.replace(/(<[^>]+) style="([^"]*)"([^>]*>)/gi, '$1$3');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Keep internal styles
|
||||||
|
content = content.replace(/(<[^>]+) data-mce-style="([^"]+)"([^>]*>)/gi, function(all, before, value, after) {
|
||||||
|
return before + ' style="' + value + '"' + after;
|
||||||
|
});
|
||||||
|
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sniff browsers and apply fixes since we can't feature detect
|
||||||
|
if (Env.webkit) {
|
||||||
|
addPreProcessFilter(removeWebKitStyles);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Env.ie) {
|
||||||
|
addPreProcessFilter(removeExplorerBrElementsAfterBlocks);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
});
|
||||||
+129
@@ -0,0 +1,129 @@
|
|||||||
|
/**
|
||||||
|
* Utils.js
|
||||||
|
*
|
||||||
|
* Copyright, Moxiecode Systems AB
|
||||||
|
* Released under LGPL License.
|
||||||
|
*
|
||||||
|
* License: http://www.tinymce.com/license
|
||||||
|
* Contributing: http://www.tinymce.com/contributing
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class contails various utility functions for the paste plugin.
|
||||||
|
*
|
||||||
|
* @class tinymce.pasteplugin.Utils
|
||||||
|
*/
|
||||||
|
define("tinymce/pasteplugin/Utils", [
|
||||||
|
"tinymce/util/Tools",
|
||||||
|
"tinymce/html/DomParser",
|
||||||
|
"tinymce/html/Schema"
|
||||||
|
], function(Tools, DomParser, Schema) {
|
||||||
|
function filter(content, items) {
|
||||||
|
Tools.each(items, function(v) {
|
||||||
|
if (v.constructor == RegExp) {
|
||||||
|
content = content.replace(v, '');
|
||||||
|
} else {
|
||||||
|
content = content.replace(v[0], v[1]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the innerText of the specified element. It will handle edge cases
|
||||||
|
* and works better than textContent on Gecko.
|
||||||
|
*
|
||||||
|
* @param {String} html HTML string to get text from.
|
||||||
|
* @return {String} String of text with line feeds.
|
||||||
|
*/
|
||||||
|
function innerText(html) {
|
||||||
|
var schema = new Schema(), domParser = new DomParser({}, schema), text = '';
|
||||||
|
var shortEndedElements = schema.getShortEndedElements();
|
||||||
|
var ignoreElements = Tools.makeMap('script noscript style textarea video audio iframe object', ' ');
|
||||||
|
var blockElements = schema.getBlockElements();
|
||||||
|
|
||||||
|
function walk(node) {
|
||||||
|
var name = node.name, currentNode = node;
|
||||||
|
|
||||||
|
if (name === 'br') {
|
||||||
|
text += '\n';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// img/input/hr
|
||||||
|
if (shortEndedElements[name]) {
|
||||||
|
text += ' ';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ingore script, video contents
|
||||||
|
if (ignoreElements[name]) {
|
||||||
|
text += ' ';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (node.type == 3) {
|
||||||
|
text += node.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Walk all children
|
||||||
|
if (!node.shortEnded) {
|
||||||
|
if ((node = node.firstChild)) {
|
||||||
|
do {
|
||||||
|
walk(node);
|
||||||
|
} while ((node = node.next));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add \n or \n\n for blocks or P
|
||||||
|
if (blockElements[name] && currentNode.next) {
|
||||||
|
text += '\n';
|
||||||
|
|
||||||
|
if (name == 'p') {
|
||||||
|
text += '\n';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
html = filter(html, [
|
||||||
|
/<!\[[^\]]+\]>/g // Conditional comments
|
||||||
|
]);
|
||||||
|
|
||||||
|
walk(domParser.parse(html));
|
||||||
|
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Trims the specified HTML by removing all WebKit fragments, all elements wrapping the body trailing BR elements etc.
|
||||||
|
*
|
||||||
|
* @param {String} html Html string to trim contents on.
|
||||||
|
* @return {String} Html contents that got trimmed.
|
||||||
|
*/
|
||||||
|
function trimHtml(html) {
|
||||||
|
function trimSpaces(all, s1, s2) {
|
||||||
|
// WebKit meant to preserve multiple spaces but instead inserted around all inline tags,
|
||||||
|
// including the spans with inline styles created on paste
|
||||||
|
if (!s1 && !s2) {
|
||||||
|
return ' ';
|
||||||
|
}
|
||||||
|
|
||||||
|
return '\u00a0';
|
||||||
|
}
|
||||||
|
|
||||||
|
html = filter(html, [
|
||||||
|
/^[\s\S]*<body[^>]*>\s*|\s*<\/body[^>]*>[\s\S]*$/g, // Remove anything but the contents within the BODY element
|
||||||
|
/<!--StartFragment-->|<!--EndFragment-->/g, // Inner fragments (tables from excel on mac)
|
||||||
|
[/( ?)<span class="Apple-converted-space">\u00a0<\/span>( ?)/g, trimSpaces],
|
||||||
|
/<br>$/i // Trailing BR elements
|
||||||
|
]);
|
||||||
|
|
||||||
|
return html;
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
filter: filter,
|
||||||
|
innerText: innerText,
|
||||||
|
trimHtml: trimHtml
|
||||||
|
};
|
||||||
|
});
|
||||||
+498
@@ -0,0 +1,498 @@
|
|||||||
|
/**
|
||||||
|
* WordFilter.js
|
||||||
|
*
|
||||||
|
* Copyright, Moxiecode Systems AB
|
||||||
|
* Released under LGPL License.
|
||||||
|
*
|
||||||
|
* License: http://www.tinymce.com/license
|
||||||
|
* Contributing: http://www.tinymce.com/contributing
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class parses word HTML into proper TinyMCE markup.
|
||||||
|
*
|
||||||
|
* @class tinymce.pasteplugin.WordFilter
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
define("tinymce/pasteplugin/WordFilter", [
|
||||||
|
"tinymce/util/Tools",
|
||||||
|
"tinymce/html/DomParser",
|
||||||
|
"tinymce/html/Schema",
|
||||||
|
"tinymce/html/Serializer",
|
||||||
|
"tinymce/html/Node",
|
||||||
|
"tinymce/pasteplugin/Utils"
|
||||||
|
], function(Tools, DomParser, Schema, Serializer, Node, Utils) {
|
||||||
|
/**
|
||||||
|
* Checks if the specified content is from any of the following sources: MS Word/Office 365/Google docs.
|
||||||
|
*/
|
||||||
|
function isWordContent(content) {
|
||||||
|
return (
|
||||||
|
(/<font face="Times New Roman"|class="?Mso|style="[^"]*\bmso-|style='[^'']*\bmso-|w:WordDocument/i).test(content) ||
|
||||||
|
(/class="OutlineElement/).test(content) ||
|
||||||
|
(/id="?docs\-internal\-guid\-/.test(content))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if the specified text starts with "1. " or "a. " etc.
|
||||||
|
*/
|
||||||
|
function isNumericList(text) {
|
||||||
|
var found, patterns;
|
||||||
|
|
||||||
|
patterns = [
|
||||||
|
/^[IVXLMCD]{1,2}\.[ \u00a0]/, // Roman upper case
|
||||||
|
/^[ivxlmcd]{1,2}\.[ \u00a0]/, // Roman lower case
|
||||||
|
/^[a-z]{1,2}[\.\)][ \u00a0]/, // Alphabetical a-z
|
||||||
|
/^[A-Z]{1,2}[\.\)][ \u00a0]/, // Alphabetical A-Z
|
||||||
|
/^[0-9]+\.[ \u00a0]/, // Numeric lists
|
||||||
|
/^[\u3007\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d]+\.[ \u00a0]/, // Japanese
|
||||||
|
/^[\u58f1\u5f10\u53c2\u56db\u4f0d\u516d\u4e03\u516b\u4e5d\u62fe]+\.[ \u00a0]/ // Chinese
|
||||||
|
];
|
||||||
|
|
||||||
|
text = text.replace(/^[\u00a0 ]+/, '');
|
||||||
|
|
||||||
|
Tools.each(patterns, function(pattern) {
|
||||||
|
if (pattern.test(text)) {
|
||||||
|
found = true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return found;
|
||||||
|
}
|
||||||
|
|
||||||
|
function isBulletList(text) {
|
||||||
|
return /^[\s\u00a0]*[\u2022\u00b7\u00a7\u25CF]\s*/.test(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
function WordFilter(editor) {
|
||||||
|
var settings = editor.settings;
|
||||||
|
|
||||||
|
editor.on('BeforePastePreProcess', function(e) {
|
||||||
|
var content = e.content, retainStyleProperties, validStyles;
|
||||||
|
|
||||||
|
// Remove google docs internal guid markers
|
||||||
|
content = content.replace(/<b[^>]+id="?docs-internal-[^>]*>/gi, '');
|
||||||
|
content = content.replace(/<br class="?Apple-interchange-newline"?>/gi, '');
|
||||||
|
|
||||||
|
retainStyleProperties = settings.paste_retain_style_properties;
|
||||||
|
if (retainStyleProperties) {
|
||||||
|
validStyles = Tools.makeMap(retainStyleProperties.split(/[, ]/));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts fake bullet and numbered lists to real semantic OL/UL.
|
||||||
|
*
|
||||||
|
* @param {tinymce.html.Node} node Root node to convert children of.
|
||||||
|
*/
|
||||||
|
function convertFakeListsToProperLists(node) {
|
||||||
|
var currentListNode, prevListNode, lastLevel = 1;
|
||||||
|
|
||||||
|
function getText(node) {
|
||||||
|
var txt = '';
|
||||||
|
|
||||||
|
if (node.type === 3) {
|
||||||
|
return node.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((node = node.firstChild)) {
|
||||||
|
do {
|
||||||
|
txt += getText(node);
|
||||||
|
} while ((node = node.next));
|
||||||
|
}
|
||||||
|
|
||||||
|
return txt;
|
||||||
|
}
|
||||||
|
|
||||||
|
function trimListStart(node, regExp) {
|
||||||
|
if (node.type === 3) {
|
||||||
|
if (regExp.test(node.value)) {
|
||||||
|
node.value = node.value.replace(regExp, '');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((node = node.firstChild)) {
|
||||||
|
do {
|
||||||
|
if (!trimListStart(node, regExp)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} while ((node = node.next));
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function removeIgnoredNodes(node) {
|
||||||
|
if (node._listIgnore) {
|
||||||
|
node.remove();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((node = node.firstChild)) {
|
||||||
|
do {
|
||||||
|
removeIgnoredNodes(node);
|
||||||
|
} while ((node = node.next));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function convertParagraphToLi(paragraphNode, listName, start) {
|
||||||
|
var level = paragraphNode._listLevel || lastLevel;
|
||||||
|
|
||||||
|
// Handle list nesting
|
||||||
|
if (level != lastLevel) {
|
||||||
|
if (level < lastLevel) {
|
||||||
|
// Move to parent list
|
||||||
|
if (currentListNode) {
|
||||||
|
currentListNode = currentListNode.parent.parent;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Create new list
|
||||||
|
prevListNode = currentListNode;
|
||||||
|
currentListNode = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!currentListNode || currentListNode.name != listName) {
|
||||||
|
prevListNode = prevListNode || currentListNode;
|
||||||
|
currentListNode = new Node(listName, 1);
|
||||||
|
|
||||||
|
if (start > 1) {
|
||||||
|
currentListNode.attr('start', '' + start);
|
||||||
|
}
|
||||||
|
|
||||||
|
paragraphNode.wrap(currentListNode);
|
||||||
|
} else {
|
||||||
|
currentListNode.append(paragraphNode);
|
||||||
|
}
|
||||||
|
|
||||||
|
paragraphNode.name = 'li';
|
||||||
|
|
||||||
|
// Append list to previous list if it exists
|
||||||
|
if (level > lastLevel && prevListNode) {
|
||||||
|
prevListNode.lastChild.append(currentListNode);
|
||||||
|
}
|
||||||
|
|
||||||
|
lastLevel = level;
|
||||||
|
|
||||||
|
// Remove start of list item "1. " or "· " etc
|
||||||
|
removeIgnoredNodes(paragraphNode);
|
||||||
|
trimListStart(paragraphNode, /^\u00a0+/);
|
||||||
|
trimListStart(paragraphNode, /^\s*([\u2022\u00b7\u00a7\u25CF]|\w+\.)/);
|
||||||
|
trimListStart(paragraphNode, /^\u00a0+/);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build a list of all root level elements before we start
|
||||||
|
// altering them in the loop below.
|
||||||
|
var elements = [], child = node.firstChild;
|
||||||
|
while (typeof child !== 'undefined' && child !== null) {
|
||||||
|
elements.push(child);
|
||||||
|
|
||||||
|
child = child.walk();
|
||||||
|
if (child !== null) {
|
||||||
|
while (typeof child !== 'undefined' && child.parent !== node) {
|
||||||
|
child = child.walk();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = 0; i < elements.length; i++) {
|
||||||
|
node = elements[i];
|
||||||
|
|
||||||
|
if (node.name == 'p' && node.firstChild) {
|
||||||
|
// Find first text node in paragraph
|
||||||
|
var nodeText = getText(node);
|
||||||
|
|
||||||
|
// Detect unordered lists look for bullets
|
||||||
|
if (isBulletList(nodeText)) {
|
||||||
|
convertParagraphToLi(node, 'ul');
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Detect ordered lists 1., a. or ixv.
|
||||||
|
if (isNumericList(nodeText)) {
|
||||||
|
// Parse OL start number
|
||||||
|
var matches = /([0-9]+)\./.exec(nodeText);
|
||||||
|
var start = 1;
|
||||||
|
if (matches) {
|
||||||
|
start = parseInt(matches[1], 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
convertParagraphToLi(node, 'ol', start);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert paragraphs marked as lists but doesn't look like anything
|
||||||
|
if (node._listLevel) {
|
||||||
|
convertParagraphToLi(node, 'ul', 1);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
currentListNode = null;
|
||||||
|
} else {
|
||||||
|
// If the root level element isn't a p tag which can be
|
||||||
|
// processed by convertParagraphToLi, it interrupts the
|
||||||
|
// lists, causing a new list to start instead of having
|
||||||
|
// elements from the next list inserted above this tag.
|
||||||
|
prevListNode = currentListNode;
|
||||||
|
currentListNode = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function filterStyles(node, styleValue) {
|
||||||
|
var outputStyles = {}, matches, styles = editor.dom.parseStyle(styleValue);
|
||||||
|
|
||||||
|
Tools.each(styles, function(value, name) {
|
||||||
|
// Convert various MS styles to W3C styles
|
||||||
|
switch (name) {
|
||||||
|
case 'mso-list':
|
||||||
|
// Parse out list indent level for lists
|
||||||
|
matches = /\w+ \w+([0-9]+)/i.exec(styleValue);
|
||||||
|
if (matches) {
|
||||||
|
node._listLevel = parseInt(matches[1], 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove these nodes <span style="mso-list:Ignore">o</span>
|
||||||
|
// Since the span gets removed we mark the text node and the span
|
||||||
|
if (/Ignore/i.test(value) && node.firstChild) {
|
||||||
|
node._listIgnore = true;
|
||||||
|
node.firstChild._listIgnore = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "horiz-align":
|
||||||
|
name = "text-align";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "vert-align":
|
||||||
|
name = "vertical-align";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "font-color":
|
||||||
|
case "mso-foreground":
|
||||||
|
name = "color";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "mso-background":
|
||||||
|
case "mso-highlight":
|
||||||
|
name = "background";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "font-weight":
|
||||||
|
case "font-style":
|
||||||
|
if (value != "normal") {
|
||||||
|
outputStyles[name] = value;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
|
||||||
|
case "mso-element":
|
||||||
|
// Remove track changes code
|
||||||
|
if (/^(comment|comment-list)$/i.test(value)) {
|
||||||
|
node.remove();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (name.indexOf('mso-comment') === 0) {
|
||||||
|
node.remove();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Never allow mso- prefixed names
|
||||||
|
if (name.indexOf('mso-') === 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output only valid styles
|
||||||
|
if (retainStyleProperties == "all" || (validStyles && validStyles[name])) {
|
||||||
|
outputStyles[name] = value;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Convert bold style to "b" element
|
||||||
|
if (/(bold)/i.test(outputStyles["font-weight"])) {
|
||||||
|
delete outputStyles["font-weight"];
|
||||||
|
node.wrap(new Node("b", 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert italic style to "i" element
|
||||||
|
if (/(italic)/i.test(outputStyles["font-style"])) {
|
||||||
|
delete outputStyles["font-style"];
|
||||||
|
node.wrap(new Node("i", 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Serialize the styles and see if there is something left to keep
|
||||||
|
outputStyles = editor.dom.serializeStyle(outputStyles, node.name);
|
||||||
|
if (outputStyles) {
|
||||||
|
return outputStyles;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (settings.paste_enable_default_filters === false) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Detect is the contents is Word junk HTML
|
||||||
|
if (isWordContent(e.content)) {
|
||||||
|
e.wordContent = true; // Mark it for other processors
|
||||||
|
|
||||||
|
// Remove basic Word junk
|
||||||
|
content = Utils.filter(content, [
|
||||||
|
// Word comments like conditional comments etc
|
||||||
|
/<!--[\s\S]+?-->/gi,
|
||||||
|
|
||||||
|
// Remove comments, scripts (e.g., msoShowComment), XML tag, VML content,
|
||||||
|
// MS Office namespaced tags, and a few other tags
|
||||||
|
/<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|img|meta|link|style|\w:\w+)(?=[\s\/>]))[^>]*>/gi,
|
||||||
|
|
||||||
|
// Convert <s> into <strike> for line-though
|
||||||
|
[/<(\/?)s>/gi, "<$1strike>"],
|
||||||
|
|
||||||
|
// Replace nsbp entites to char since it's easier to handle
|
||||||
|
[/ /gi, "\u00a0"],
|
||||||
|
|
||||||
|
// Convert <span style="mso-spacerun:yes">___</span> to string of alternating
|
||||||
|
// breaking/non-breaking spaces of same length
|
||||||
|
[/<span\s+style\s*=\s*"\s*mso-spacerun\s*:\s*yes\s*;?\s*"\s*>([\s\u00a0]*)<\/span>/gi,
|
||||||
|
function(str, spaces) {
|
||||||
|
return (spaces.length > 0) ?
|
||||||
|
spaces.replace(/./, " ").slice(Math.floor(spaces.length / 2)).split("").join("\u00a0") : "";
|
||||||
|
}
|
||||||
|
]
|
||||||
|
]);
|
||||||
|
|
||||||
|
var validElements = settings.paste_word_valid_elements;
|
||||||
|
if (!validElements) {
|
||||||
|
validElements = (
|
||||||
|
'-strong/b,-em/i,-u,-span,-p,-ol,-ul,-li,-h1,-h2,-h3,-h4,-h5,-h6,' +
|
||||||
|
'-p/div,-a[href|name],sub,sup,strike,br,del,table[width],tr,' +
|
||||||
|
'td[colspan|rowspan|width],th[colspan|rowspan|width],thead,tfoot,tbody'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Setup strict schema
|
||||||
|
var schema = new Schema({
|
||||||
|
valid_elements: validElements,
|
||||||
|
valid_children: '-li[p]'
|
||||||
|
});
|
||||||
|
|
||||||
|
// Add style/class attribute to all element rules since the user might have removed them from
|
||||||
|
// paste_word_valid_elements config option and we need to check them for properties
|
||||||
|
Tools.each(schema.elements, function(rule) {
|
||||||
|
/*eslint dot-notation:0*/
|
||||||
|
if (!rule.attributes["class"]) {
|
||||||
|
rule.attributes["class"] = {};
|
||||||
|
rule.attributesOrder.push("class");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!rule.attributes.style) {
|
||||||
|
rule.attributes.style = {};
|
||||||
|
rule.attributesOrder.push("style");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Parse HTML into DOM structure
|
||||||
|
var domParser = new DomParser({}, schema);
|
||||||
|
|
||||||
|
// Filter styles to remove "mso" specific styles and convert some of them
|
||||||
|
domParser.addAttributeFilter('style', function(nodes) {
|
||||||
|
var i = nodes.length, node;
|
||||||
|
|
||||||
|
while (i--) {
|
||||||
|
node = nodes[i];
|
||||||
|
node.attr('style', filterStyles(node, node.attr('style')));
|
||||||
|
|
||||||
|
// Remove pointess spans
|
||||||
|
if (node.name == 'span' && node.parent && !node.attributes.length) {
|
||||||
|
node.unwrap();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Check the class attribute for comments or del items and remove those
|
||||||
|
domParser.addAttributeFilter('class', function(nodes) {
|
||||||
|
var i = nodes.length, node, className;
|
||||||
|
|
||||||
|
while (i--) {
|
||||||
|
node = nodes[i];
|
||||||
|
|
||||||
|
className = node.attr('class');
|
||||||
|
if (/^(MsoCommentReference|MsoCommentText|msoDel)$/i.test(className)) {
|
||||||
|
node.remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
node.attr('class', null);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Remove all del elements since we don't want the track changes code in the editor
|
||||||
|
domParser.addNodeFilter('del', function(nodes) {
|
||||||
|
var i = nodes.length;
|
||||||
|
|
||||||
|
while (i--) {
|
||||||
|
nodes[i].remove();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Keep some of the links and anchors
|
||||||
|
domParser.addNodeFilter('a', function(nodes) {
|
||||||
|
var i = nodes.length, node, href, name;
|
||||||
|
|
||||||
|
while (i--) {
|
||||||
|
node = nodes[i];
|
||||||
|
href = node.attr('href');
|
||||||
|
name = node.attr('name');
|
||||||
|
|
||||||
|
if (href && href.indexOf('#_msocom_') != -1) {
|
||||||
|
node.remove();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (href && href.indexOf('file://') === 0) {
|
||||||
|
href = href.split('#')[1];
|
||||||
|
if (href) {
|
||||||
|
href = '#' + href;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!href && !name) {
|
||||||
|
node.unwrap();
|
||||||
|
} else {
|
||||||
|
// Remove all named anchors that aren't specific to TOC, Footnotes or Endnotes
|
||||||
|
if (name && !/^_?(?:toc|edn|ftn)/i.test(name)) {
|
||||||
|
node.unwrap();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
node.attr({
|
||||||
|
href: href,
|
||||||
|
name: name
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Parse into DOM structure
|
||||||
|
var rootNode = domParser.parse(content);
|
||||||
|
|
||||||
|
// Process DOM
|
||||||
|
if (settings.paste_convert_word_fake_lists !== false) {
|
||||||
|
convertFakeListsToProperLists(rootNode);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Serialize DOM back to HTML
|
||||||
|
e.content = new Serializer({}, schema).serialize(rootNode);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
WordFilter.isWordContent = isWordContent;
|
||||||
|
|
||||||
|
return WordFilter;
|
||||||
|
});
|
||||||
+120
@@ -0,0 +1,120 @@
|
|||||||
|
/**
|
||||||
|
* Inline development version. Only to be used while developing since it uses document.write to load scripts.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*jshint smarttabs:true, undef:true, latedef:true, curly:true, bitwise:true, camelcase:true */
|
||||||
|
/*globals $code */
|
||||||
|
|
||||||
|
(function(exports) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var html = "", baseDir;
|
||||||
|
var modules = {}, exposedModules = [], moduleCount = 0;
|
||||||
|
|
||||||
|
var scripts = document.getElementsByTagName('script');
|
||||||
|
for (var i = 0; i < scripts.length; i++) {
|
||||||
|
var src = scripts[i].src;
|
||||||
|
|
||||||
|
if (src.indexOf('/plugin.dev.js') != -1) {
|
||||||
|
baseDir = src.substring(0, src.lastIndexOf('/'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function require(ids, callback) {
|
||||||
|
var module, defs = [];
|
||||||
|
|
||||||
|
for (var i = 0; i < ids.length; ++i) {
|
||||||
|
module = modules[ids[i]] || resolve(ids[i]);
|
||||||
|
if (!module) {
|
||||||
|
throw 'module definition dependecy not found: ' + ids[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
defs.push(module);
|
||||||
|
}
|
||||||
|
|
||||||
|
callback.apply(null, defs);
|
||||||
|
}
|
||||||
|
|
||||||
|
function resolve(id) {
|
||||||
|
var target = exports;
|
||||||
|
var fragments = id.split(/[.\/]/);
|
||||||
|
|
||||||
|
for (var fi = 0; fi < fragments.length; ++fi) {
|
||||||
|
if (!target[fragments[fi]]) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
target = target[fragments[fi]];
|
||||||
|
}
|
||||||
|
|
||||||
|
return target;
|
||||||
|
}
|
||||||
|
|
||||||
|
function register(id) {
|
||||||
|
var target = exports;
|
||||||
|
var fragments = id.split(/[.\/]/);
|
||||||
|
|
||||||
|
for (var fi = 0; fi < fragments.length - 1; ++fi) {
|
||||||
|
if (target[fragments[fi]] === undefined) {
|
||||||
|
target[fragments[fi]] = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
target = target[fragments[fi]];
|
||||||
|
}
|
||||||
|
|
||||||
|
target[fragments[fragments.length - 1]] = modules[id];
|
||||||
|
}
|
||||||
|
|
||||||
|
function define(id, dependencies, definition) {
|
||||||
|
if (typeof id !== 'string') {
|
||||||
|
throw 'invalid module definition, module id must be defined and be a string';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dependencies === undefined) {
|
||||||
|
throw 'invalid module definition, dependencies must be specified';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (definition === undefined) {
|
||||||
|
throw 'invalid module definition, definition function must be specified';
|
||||||
|
}
|
||||||
|
|
||||||
|
require(dependencies, function() {
|
||||||
|
modules[id] = definition.apply(null, arguments);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (--moduleCount === 0) {
|
||||||
|
for (var i = 0; i < exposedModules.length; i++) {
|
||||||
|
register(exposedModules[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function expose(ids) {
|
||||||
|
exposedModules = ids;
|
||||||
|
}
|
||||||
|
|
||||||
|
function writeScripts() {
|
||||||
|
document.write(html);
|
||||||
|
}
|
||||||
|
|
||||||
|
function load(path) {
|
||||||
|
html += '<script type="text/javascript" src="' + baseDir + '/' + path + '"></script>\n';
|
||||||
|
moduleCount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Expose globally
|
||||||
|
exports.define = define;
|
||||||
|
exports.require = require;
|
||||||
|
|
||||||
|
expose(["tinymce/pasteplugin/Utils"]);
|
||||||
|
|
||||||
|
load('classes/Utils.js');
|
||||||
|
load('classes/Clipboard.js');
|
||||||
|
load('classes/WordFilter.js');
|
||||||
|
load('classes/Quirks.js');
|
||||||
|
load('classes/Plugin.js');
|
||||||
|
|
||||||
|
writeScripts();
|
||||||
|
})(this);
|
||||||
|
|
||||||
|
// $hash: 81d4a05c04adf0776e1e2ca9a3e818bd
|
||||||
Executable
+1606
File diff suppressed because it is too large.
Load diff
+1
@@ -0,0 +1 @@
|
|||||||
|
!function(a,b){"use strict";function c(a,b){for(var c,d=[],f=0;f<a.length;++f){if(c=g[a[f]]||e(a[f]),!c)throw"module definition dependecy not found: "+a[f];d.push(c)}b.apply(null,d)}function d(a,d,e){if("string"!=typeof a)throw"invalid module definition, module id must be defined and be a string";if(d===b)throw"invalid module definition, dependencies must be specified";if(e===b)throw"invalid module definition, definition function must be specified";c(d,function(){g[a]=e.apply(null,arguments)})}function e(b){for(var c=a,d=b.split(/[.\/]/),e=0;e<d.length;++e){if(!c[d[e]])return;c=c[d[e]]}return c}function f(c){for(var d=0;d<c.length;d++){for(var e=a,f=c[d],h=f.split(/[.\/]/),i=0;i<h.length-1;++i)e[h[i]]===b&&(e[h[i]]={}),e=e[h[i]];e[h[h.length-1]]=g[f]}}var g={};d("tinymce/pasteplugin/Utils",["tinymce/util/Tools","tinymce/html/DomParser","tinymce/html/Schema"],function(a,b,c){function d(b,c){return a.each(c,function(a){b=a.constructor==RegExp?b.replace(a,""):b.replace(a[0],a[1])}),b}function e(e){function f(a){var b=a.name,c=a;if("br"===b)return void(i+="\n");if(j[b]&&(i+=" "),k[b])return void(i+=" ");if(3==a.type&&(i+=a.value),!a.shortEnded&&(a=a.firstChild))do f(a);while(a=a.next);l[b]&&c.next&&(i+="\n","p"==b&&(i+="\n"))}var g=new c,h=new b({},g),i="",j=g.getShortEndedElements(),k=a.makeMap("script noscript style textarea video audio iframe object"," "),l=g.getBlockElements();return e=d(e,[/<!\[[^\]]+\]>/g]),f(h.parse(e)),i}function f(a){function b(a,b,c){return b||c?"\xa0":" "}return a=d(a,[/^[\s\S]*<body[^>]*>\s*|\s*<\/body[^>]*>[\s\S]*$/g,/<!--StartFragment-->|<!--EndFragment-->/g,[/( ?)<span class="Apple-converted-space">\u00a0<\/span>( ?)/g,b],/<br>$/i])}return{filter:d,innerText:e,trimHtml:f}}),d("tinymce/pasteplugin/Clipboard",["tinymce/Env","tinymce/dom/RangeUtils","tinymce/util/VK","tinymce/pasteplugin/Utils"],function(a,b,c,d){return function(e){function f(a){var b,c=e.dom;if(b=e.fire("BeforePastePreProcess",{content:a}),b=e.fire("PastePreProcess",b),a=b.content,!b.isDefaultPrevented()){if(e.hasEventListeners("PastePostProcess")&&!b.isDefaultPrevented()){var d=c.add(e.getBody(),"div",{style:"display:none"},a);b=e.fire("PastePostProcess",{node:d}),c.remove(d),a=b.node.innerHTML}b.isDefaultPrevented()||e.insertContent(a,{merge:e.settings.paste_merge_formats!==!1})}}function g(a){a=e.dom.encode(a).replace(/\r\n/g,"\n");var b,c=e.dom.getParent(e.selection.getStart(),e.dom.isBlock),g=e.settings.forced_root_block;g&&(b=e.dom.createHTML(g,e.settings.forced_root_block_attrs),b=b.substr(0,b.length-3)+">"),c&&/^(PRE|DIV)$/.test(c.nodeName)||!g?a=d.filter(a,[[/\n/g,"<br>"]]):(a=d.filter(a,[[/\n\n/g,"</p>"+b],[/^(.*<\/p>)(<p>)$/,b+"$1"],[/\n/g,"<br />"]]),-1!=a.indexOf("<p>")&&(a=b+a)),f(a)}function h(){function b(a){var b,c,e,f=a.startContainer;if(b=a.getClientRects(),b.length)return b[0];if(a.collapsed&&1==f.nodeType){for(e=f.childNodes[t.startOffset];e&&3==e.nodeType&&!e.data.length;)e=e.nextSibling;if(e)return"BR"==e.tagName&&(c=d.doc.createTextNode("\ufeff"),e.parentNode.insertBefore(c,e),a=d.createRng(),a.setStartBefore(c),a.setEndAfter(c),b=a.getClientRects(),d.remove(c)),b.length?b[0]:void 0}}var c,d=e.dom,f=e.getBody(),g=e.dom.getViewPort(e.getWin()),h=g.y,i=20;if(t=e.selection.getRng(),e.inline&&(c=e.selection.getScrollContainer(),c&&c.scrollTop>0&&(h=c.scrollTop)),t.getClientRects){var j=b(t);if(j)i=h+(j.top-d.getPos(f).y);else{i=h;var k=t.startContainer;k&&(3==k.nodeType&&k.parentNode!=f&&(k=k.parentNode),1==k.nodeType&&(i=d.getPos(k,c||f).y))}}s=d.add(e.getBody(),"div",{id:"mcepastebin",contentEditable:!0,"data-mce-bogus":"all",style:"position: absolute; top: "+i+"px;width: 10px; height: 10px; overflow: hidden; opacity: 0"},y),(a.ie||a.gecko)&&d.setStyle(s,"left","rtl"==d.getStyle(f,"direction",!0)?65535:-65535),d.bind(s,"beforedeactivate focusin focusout",function(a){a.stopPropagation()}),s.focus(),e.selection.select(s,!0)}function i(){if(s){for(var a;a=e.dom.get("mcepastebin");)e.dom.remove(a),e.dom.unbind(a);t&&e.selection.setRng(t)}s=t=null}function j(){var a,b,c,d,f="";for(a=e.dom.select("div[id=mcepastebin]"),b=0;b<a.length;b++)c=a[b],c.firstChild&&"mcepastebin"==c.firstChild.id&&(c=c.firstChild),d=c.innerHTML,f!=y&&(f+=d);return f}function k(a){var b={};if(a){if(a.getData){var c=a.getData("Text");c&&c.length>0&&-1==c.indexOf(z)&&(b["text/plain"]=c)}if(a.types)for(var d=0;d<a.types.length;d++){var e=a.types[d];b[e]=a.getData(e)}}return b}function l(a){return k(a.clipboardData||e.getDoc().dataTransfer)}function m(a,b){function c(c){function d(a){b&&(e.selection.setRng(b),b=null),f('<img src="'+a.result+'">')}var g,h,i,j=!1;if(c)for(g=0;g<c.length;g++)h=c[g],/^image\/(jpeg|png|gif|bmp)$/.test(h.type)&&(i=new FileReader,i.onload=d.bind(null,i),i.readAsDataURL(h.getAsFile?h.getAsFile():h),a.preventDefault(),j=!0);return j}var d=a.clipboardData||a.dataTransfer;return e.settings.paste_data_images&&d?c(d.items)||c(d.files):void 0}function n(a){var b=a.clipboardData;return-1!=navigator.userAgent.Line truncated
|
||||||
@@ -39846,7 +39846,7 @@ tinymce.PluginManager.add('leaui_image', function(editor, url) {
|
|||||||
LEAUI_DATAS = datas;
|
LEAUI_DATAS = datas;
|
||||||
|
|
||||||
function GetTheHtml(){
|
function GetTheHtml(){
|
||||||
var html = '<iframe id="leauiIfr" src="'+ url + '/index.html'+ '?' + new Date().getTime() + '" frameborder="0"></iframe>';
|
var html = '<iframe id="leauiIfr" src="/album/index'+ '?' + new Date().getTime() + '" frameborder="0"></iframe>';
|
||||||
return html;
|
return html;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Vendored
+1
-1
@@ -12,4 +12,4 @@ s=n.offsetHeight,l=r.clientWidth,c=r.clientHeight,"end"==e?(i-=l-a,o-=c-s):"cent
|
|||||||
if(!u(t)&&t.keyCode==e.BACKSPACE&&(n=Q.getRng(),r=n.startContainer,i=n.startOffset,o=J.getRoot(),a=r,n.collapsed&&0===i)){for(;a&&a.parentNode&&a.parentNode.firstChild==a&&a.parentNode!=o;)a=a.parentNode;"BLOCKQUOTE"===a.tagName&&(s.formatter.toggle("blockquote",null,a),n=J.createRng(),n.setStart(r,0),n.setEnd(r,0),Q.setRng(n))}})}function S(){function e(){s._refreshContentEditable(),l("StyleWithCSS",!1),l("enableInlineTableEditing",!1),Z.object_resizing||l("enableObjectResizing",!1)}Z.readonly||s.on("BeforeExecCommand MouseDown",e)}function T(){function e(){K(J.select("a"),function(e){var t=e.parentNode,n=J.getRoot();if(t.lastChild===e){for(;t&&!J.isBlock(t);){if(t.parentNode.lastChild!==t||t===n)return;t=t.parentNode}J.add(t,"br",{"data-mce-bogus":1})}})}s.on("SetContent ExecCommand",function(t){("setcontent"==t.type||"mceInsertLink"===t.command)&&e()})}function R(){Z.forced_root_block&&s.on("init",function(){l("DefaultParagraphSeparator",Z.forced_root_block)})}function A(){s.on("Undo Redo SetContent",function(e){e.initial||s.execCommand("mceRepaint")})}function B(){s.on("keydown",function(e){var t;u(e)||e.keyCode!=G||(t=s.getDoc().selection.createRange(),t&&t.item&&(e.preventDefault(),s.undoManager.beforeChange(),J.remove(t.item(0)),s.undoManager.add()))})}function D(){var e;c()>=10&&(e="",K("p div h1 h2 h3 h4 h5 h6".split(" "),function(t,n){e+=(n>0?",":"")+t+":empty"}),s.contentStyles.push(e+"{padding-right: 1px !important}"))}function L(){c()<9&&(ee.addNodeFilter("noscript",function(e){for(var t=e.length,n,r;t--;)n=e[t],r=n.firstChild,r&&n.attr("data-mce-innertext",r.value)}),te.addNodeFilter("noscript",function(e){for(var t=e.length,n,o,a;t--;)n=e[t],o=e[t].firstChild,o?o.value=i.decode(o.value):(a=n.attributes.map["data-mce-innertext"],a&&(n.attr("data-mce-innertext",null),o=new r("#text",3),o.value=a,o.raw=!0,n.append(o)))}))}function M(){function e(e,t){var n=i.createTextRange();try{n.moveToPoint(e,t)}catch(r){n=null}return n}function t(t){var r;t.button?(r=e(t.x,t.y),r&&(r.compareEndPoints("StartToStart",a)>0?r.setEndPoint("StartToStart",a):r.setEndPoint("EndToEnd",a),r.select())):n()}function n(){var e=r.selection.createRange();a&&!e.item&&0===e.compareEndPoints("StartToEnd",e)&&a.select(),J.unbind(r,"mouseup",n),J.unbind(r,"mousemove",t),a=o=0}var r=J.doc,i=r.body,o,a,s;r.documentElement.unselectable=!0,J.bind(r,"mousedown contextmenu",function(i){if("HTML"===i.target.nodeName){if(o&&n(),s=r.documentElement,s.scrollHeight>s.clientHeight)return;o=1,a=e(i.x,i.y),a&&(J.bind(r,"mouseup",n),J.bind(r,"mousemove",t),J.getRoot().focus(),a.select())}})}function H(){s.on("keyup focusin mouseup",function(t){65==t.keyCode&&e.metaKeyPressed(t)||Q.normalize()},!0)}function P(){s.contentStyles.push("img:-moz-broken {-moz-force-broken-image-icon:1;min-width:24px;min-height:24px}")}function O(){s.inline||s.on("keydown",function(){document.activeElement==document.body&&s.getWin().focus()})}function I(){s.inline||(s.contentStyles.push("body {min-height: 150px}"),s.on("click",function(e){if("HTML"==e.target.nodeName){var t;t=s.selection.getRng(),s.getBody().focus(),s.selection.setRng(t),s.selection.normalize(),s.nodeChanged()}}))}function F(){o.mac&&s.on("keydown",function(t){!e.metaKeyPressed(t)||37!=t.keyCode&&39!=t.keyCode||(t.preventDefault(),s.selection.getSel().modify("move",37==t.keyCode?"backward":"forward","word"))})}function z(){l("AutoUrlDetect",!1)}function W(){s.inline||s.on("focus blur beforegetcontent",function(){var e=s.dom.create("br");s.getBody().appendChild(e),e.parentNode.removeChild(e)},!0)}function V(){s.on("click",function(e){var t=e.target;do if("A"===t.tagName)return void e.preventDefault();while(t=t.parentNode)}),s.contentStyles.push(".mce-content-body {-webkit-touch-callout: none}")}function $(){s.on("touchstart",function(e){var t,n,r,i;t=e.target,n=(new Date).getTime(),i=e.changedTouches,!i||i.length>1||(r=i[0],s.once("touchend",function(e){var i=e.changedTouches[0],o;(new Date).getTime()-n>500||Math.abs(r.clientX-i.clientX)>5||Math.abs(r.clientY-i.clientY)>5||(o={target:t},K("pageX pageY clientX clientY screenX screenY".split(" "),function(e){o[e]=i[e]}),o=s.fire("click",o),o.isDefaultPrevented()||(s.selection.placeCaretAt(i.clientX,i.clientY),s.nodeChanged()))}))})}function U(){s.on("init",function(){s.dom.bind(s.getBody(),"submit",function(e){e.preventDefault()})})}function q(){ee.addNodeFilter("br",function(e){for(var t=e.length;t--;)"Apple-interchange-newline"==e[t].attr("class")&&e[t].remove()})}function j(){s.on("dragstart",function(e){d(e)}),s.on("drop",function(e){if(!u(e)){var n=f(e);if(n){e.preventDefault();var r=t.getCaretRangeFromPoint(e.x,e.y,s.getDoc());Q.setRng(r),p(n)}}})}var K=a.each,Y=s.$,G=e.BACKSPACE,X=e.DELETE,J=s.dom,Q=s.selection,Z=s.settings,ee=s.parser,te=s.serializer,ne=o.gecko,re=o.ie,ie=o.webkit,oe="data:text/mce-internal,",ae=re?"Text":"URL";k(),m(),H(),ie&&(h(),v(),C(),R(),U(),_(),q(),$(),o.iOS?(O(),I(),V()):g()),re&&o.ie<11&&(y(),w(),E(),N(),B(),D(),L(),MLine truncated
|
if(!u(t)&&t.keyCode==e.BACKSPACE&&(n=Q.getRng(),r=n.startContainer,i=n.startOffset,o=J.getRoot(),a=r,n.collapsed&&0===i)){for(;a&&a.parentNode&&a.parentNode.firstChild==a&&a.parentNode!=o;)a=a.parentNode;"BLOCKQUOTE"===a.tagName&&(s.formatter.toggle("blockquote",null,a),n=J.createRng(),n.setStart(r,0),n.setEnd(r,0),Q.setRng(n))}})}function S(){function e(){s._refreshContentEditable(),l("StyleWithCSS",!1),l("enableInlineTableEditing",!1),Z.object_resizing||l("enableObjectResizing",!1)}Z.readonly||s.on("BeforeExecCommand MouseDown",e)}function T(){function e(){K(J.select("a"),function(e){var t=e.parentNode,n=J.getRoot();if(t.lastChild===e){for(;t&&!J.isBlock(t);){if(t.parentNode.lastChild!==t||t===n)return;t=t.parentNode}J.add(t,"br",{"data-mce-bogus":1})}})}s.on("SetContent ExecCommand",function(t){("setcontent"==t.type||"mceInsertLink"===t.command)&&e()})}function R(){Z.forced_root_block&&s.on("init",function(){l("DefaultParagraphSeparator",Z.forced_root_block)})}function A(){s.on("Undo Redo SetContent",function(e){e.initial||s.execCommand("mceRepaint")})}function B(){s.on("keydown",function(e){var t;u(e)||e.keyCode!=G||(t=s.getDoc().selection.createRange(),t&&t.item&&(e.preventDefault(),s.undoManager.beforeChange(),J.remove(t.item(0)),s.undoManager.add()))})}function D(){var e;c()>=10&&(e="",K("p div h1 h2 h3 h4 h5 h6".split(" "),function(t,n){e+=(n>0?",":"")+t+":empty"}),s.contentStyles.push(e+"{padding-right: 1px !important}"))}function L(){c()<9&&(ee.addNodeFilter("noscript",function(e){for(var t=e.length,n,r;t--;)n=e[t],r=n.firstChild,r&&n.attr("data-mce-innertext",r.value)}),te.addNodeFilter("noscript",function(e){for(var t=e.length,n,o,a;t--;)n=e[t],o=e[t].firstChild,o?o.value=i.decode(o.value):(a=n.attributes.map["data-mce-innertext"],a&&(n.attr("data-mce-innertext",null),o=new r("#text",3),o.value=a,o.raw=!0,n.append(o)))}))}function M(){function e(e,t){var n=i.createTextRange();try{n.moveToPoint(e,t)}catch(r){n=null}return n}function t(t){var r;t.button?(r=e(t.x,t.y),r&&(r.compareEndPoints("StartToStart",a)>0?r.setEndPoint("StartToStart",a):r.setEndPoint("EndToEnd",a),r.select())):n()}function n(){var e=r.selection.createRange();a&&!e.item&&0===e.compareEndPoints("StartToEnd",e)&&a.select(),J.unbind(r,"mouseup",n),J.unbind(r,"mousemove",t),a=o=0}var r=J.doc,i=r.body,o,a,s;r.documentElement.unselectable=!0,J.bind(r,"mousedown contextmenu",function(i){if("HTML"===i.target.nodeName){if(o&&n(),s=r.documentElement,s.scrollHeight>s.clientHeight)return;o=1,a=e(i.x,i.y),a&&(J.bind(r,"mouseup",n),J.bind(r,"mousemove",t),J.getRoot().focus(),a.select())}})}function H(){s.on("keyup focusin mouseup",function(t){65==t.keyCode&&e.metaKeyPressed(t)||Q.normalize()},!0)}function P(){s.contentStyles.push("img:-moz-broken {-moz-force-broken-image-icon:1;min-width:24px;min-height:24px}")}function O(){s.inline||s.on("keydown",function(){document.activeElement==document.body&&s.getWin().focus()})}function I(){s.inline||(s.contentStyles.push("body {min-height: 150px}"),s.on("click",function(e){if("HTML"==e.target.nodeName){var t;t=s.selection.getRng(),s.getBody().focus(),s.selection.setRng(t),s.selection.normalize(),s.nodeChanged()}}))}function F(){o.mac&&s.on("keydown",function(t){!e.metaKeyPressed(t)||37!=t.keyCode&&39!=t.keyCode||(t.preventDefault(),s.selection.getSel().modify("move",37==t.keyCode?"backward":"forward","word"))})}function z(){l("AutoUrlDetect",!1)}function W(){s.inline||s.on("focus blur beforegetcontent",function(){var e=s.dom.create("br");s.getBody().appendChild(e),e.parentNode.removeChild(e)},!0)}function V(){s.on("click",function(e){var t=e.target;do if("A"===t.tagName)return void e.preventDefault();while(t=t.parentNode)}),s.contentStyles.push(".mce-content-body {-webkit-touch-callout: none}")}function $(){s.on("touchstart",function(e){var t,n,r,i;t=e.target,n=(new Date).getTime(),i=e.changedTouches,!i||i.length>1||(r=i[0],s.once("touchend",function(e){var i=e.changedTouches[0],o;(new Date).getTime()-n>500||Math.abs(r.clientX-i.clientX)>5||Math.abs(r.clientY-i.clientY)>5||(o={target:t},K("pageX pageY clientX clientY screenX screenY".split(" "),function(e){o[e]=i[e]}),o=s.fire("click",o),o.isDefaultPrevented()||(s.selection.placeCaretAt(i.clientX,i.clientY),s.nodeChanged()))}))})}function U(){s.on("init",function(){s.dom.bind(s.getBody(),"submit",function(e){e.preventDefault()})})}function q(){ee.addNodeFilter("br",function(e){for(var t=e.length;t--;)"Apple-interchange-newline"==e[t].attr("class")&&e[t].remove()})}function j(){s.on("dragstart",function(e){d(e)}),s.on("drop",function(e){if(!u(e)){var n=f(e);if(n){e.preventDefault();var r=t.getCaretRangeFromPoint(e.x,e.y,s.getDoc());Q.setRng(r),p(n)}}})}var K=a.each,Y=s.$,G=e.BACKSPACE,X=e.DELETE,J=s.dom,Q=s.selection,Z=s.settings,ee=s.parser,te=s.serializer,ne=o.gecko,re=o.ie,ie=o.webkit,oe="data:text/mce-internal,",ae=re?"Text":"URL";k(),m(),H(),ie&&(h(),v(),C(),R(),U(),_(),q(),$(),o.iOS?(O(),I(),V()):g()),re&&o.ie<11&&(y(),w(),E(),N(),B(),D(),L(),MLine truncated
|
||||||
var e,s;if(d.unbind(window,"ready",a),i("onpageload"),t.types)return void p(t.types,function(e){p(d.select(e.selector),function(i){r(n(i),h({},t,e),i)})});if(t.selector)return void p(d.select(t.selector),function(e){r(n(e),t,e)});switch(t.target&&r(n(t.target),t),t.mode){case"exact":e=t.elements||"",e.length>0&&p(f(e),function(e){var n;(n=d.get(e))?r(e,t,n):p(document.forms,function(n){p(n.elements,function(n){n.name===e&&(e="mce_editor_"+m++,d.setAttrib(n,"id",e),r(e,t,n))})})});break;case"textareas":case"specific_textareas":p(d.select("textarea"),function(e){t.editor_deselector&&o(e,t.editor_deselector)||(!t.editor_selector||o(e,t.editor_selector))&&r(n(e),t,e)})}t.oninit&&(e=s=0,p(l,function(t){s++,t.initialized?e++:t.on("init",function(){e++,e==s&&i("oninit")}),e==s&&i("oninit")}))}var s=this,l=[];s.settings=t,d.bind(window,"ready",a)},get:function(e){return arguments.length?e in this.editors?this.editors[e]:null:this.editors},add:function(e){var t=this,n=t.editors;return n[e.id]=e,n.push(e),t.activeEditor=e,t.fire("AddEditor",{editor:e}),g||(g=function(){t.fire("BeforeUnload")},d.bind(window,"beforeunload",g)),e},createEditor:function(t,n){return this.add(new e(t,n,this))},remove:function(e){var t=this,n,r=t.editors,i;{if(e)return"string"==typeof e?(e=e.selector||e,void p(d.select(e),function(e){i=r[e.id],i&&t.remove(i)})):(i=e,r[i.id]?(c(i)&&t.fire("RemoveEditor",{editor:i}),r.length||d.unbind(window,"beforeunload",g),i.remove(),i):null);for(n=r.length-1;n>=0;n--)t.remove(r[n])}},execCommand:function(t,n,r){var i=this,o=i.get(r);switch(t){case"mceAddEditor":return i.get(r)||new e(r,i.settings,i).render(),!0;case"mceRemoveEditor":return o&&o.remove(),!0;case"mceToggleEditor":return o?(o.isHidden()?o.show():o.hide(),!0):(i.execCommand("mceAddEditor",0,r),!0)}return i.activeEditor?i.activeEditor.execCommand(t,n,r):!1},triggerSave:function(){p(this.editors,function(e){e.save()})},addI18n:function(e,t){s.add(e,t)},translate:function(e){return s.translate(e)},setActive:function(e){var t=this.activeEditor;this.activeEditor!=e&&(t&&t.fire("deactivate",{relatedTarget:e}),e.fire("activate",{relatedTarget:t})),this.activeEditor=e}},h(v,a),v.setup(),window.tinymce=window.tinyMCE=v,v}),r(ge,[me,d],function(e,t){var n=t.each,r=t.explode;e.on("AddEditor",function(e){var t=e.editor;t.on("preInit",function(){function e(e,t){n(t,function(t,n){t&&s.setStyle(e,n,t)}),s.rename(e,"span")}function i(e){s=t.dom,l.convert_fonts_to_spans&&n(s.select("font,u,strike",e.node),function(e){o[e.nodeName.toLowerCase()](s,e)})}var o,a,s,l=t.settings;l.inline_styles&&(a=r(l.font_size_legacy_values),o={font:function(t,n){e(n,{backgroundColor:n.style.backgroundColor,color:n.color,fontFamily:n.face,fontSize:a[parseInt(n.size,10)-1]})},u:function(n,r){"html4"===t.settings.schema&&e(r,{textDecoration:"underline"})},strike:function(t,n){e(n,{textDecoration:"line-through"})}},t.on("PreProcess SetContent",i))})})}),r(ve,[ce,d],function(e,t){var n={send:function(e){function t(){!e.async||4==r.readyState||i++>1e4?(e.success&&1e4>i&&200==r.status?e.success.call(e.success_scope,""+r.responseText,r,e):e.error&&e.error.call(e.error_scope,i>1e4?"TIMED_OUT":"GENERAL",r,e),r=null):setTimeout(t,10)}var r,i=0;if(e.scope=e.scope||this,e.success_scope=e.success_scope||e.scope,e.error_scope=e.error_scope||e.scope,e.async=e.async===!1?!1:!0,e.data=e.data||"",r=new XMLHttpRequest){if(r.overrideMimeType&&r.overrideMimeType(e.content_type),r.open(e.type||(e.data?"POST":"GET"),e.url,e.async),e.crossDomain&&(r.withCredentials=!0),e.content_type&&r.setRequestHeader("Content-Type",e.content_type),r.setRequestHeader("X-Requested-With","XMLHttpRequest"),r=n.fire("beforeSend",{xhr:r,settings:e}).xhr,r.send(e.data),!e.async)return t();setTimeout(t,10)}}};return t.extend(n,e),n}),r(ye,[],function(){function e(t,n){var r,i,o,a;if(n=n||'"',null===t)return"null";if(o=typeof t,"string"==o)return i="\bb t\nn\ff\rr\"\"''\\\\",n+t.replace(/([\u0080-\uFFFF\x00-\x1f\"\'\\])/g,function(e,t){return'"'===n&&"'"===e?e:(r=i.indexOf(t),r+1?"\\"+i.charAt(r+1):(e=t.charCodeAt().toString(16),"\\u"+"0000".substring(e.length)+e))})+n;if("object"==o){if(t.hasOwnProperty&&"[object Array]"===Object.prototype.toString.call(t)){for(r=0,i="[";r<t.length;r++)i+=(r>0?",":"")+e(t[r],n);return i+"]"}i="{";for(a in t)t.hasOwnProperty(a)&&(i+="function"!=typeof t[a]?(i.length>1?","+n:n)+a+n+":"+e(t[a],n):"");return i+"}"}return""+t}return{serialize:e,parse:function(e){try{return window[String.fromCharCode(101)+"val"]("("+e+")")}catch(t){}}}}),r(be,[ye,ve,d],function(e,t,n){function r(e){this.settings=i({},e),this.count=0}var i=n.extend;return r.sendRPC=function(e){return(new r).send(e)},r.prototype={send:function(n){var r=n.error,o=n.success;n=i(this.settings,n),n.success=function(t,i){t=e.parse(t),"undefined"==typeof t&&(t={error:"JSON Parse error."}),t.error?r.call(n.error_scope||n.scope,t.error,i):o.call(n.success_scope||n.scope,t.result)},n.error=function(e,t){r&&r.call(n.error_scope||n.scope,e,tLine truncated
|
var e,s;if(d.unbind(window,"ready",a),i("onpageload"),t.types)return void p(t.types,function(e){p(d.select(e.selector),function(i){r(n(i),h({},t,e),i)})});if(t.selector)return void p(d.select(t.selector),function(e){r(n(e),t,e)});switch(t.target&&r(n(t.target),t),t.mode){case"exact":e=t.elements||"",e.length>0&&p(f(e),function(e){var n;(n=d.get(e))?r(e,t,n):p(document.forms,function(n){p(n.elements,function(n){n.name===e&&(e="mce_editor_"+m++,d.setAttrib(n,"id",e),r(e,t,n))})})});break;case"textareas":case"specific_textareas":p(d.select("textarea"),function(e){t.editor_deselector&&o(e,t.editor_deselector)||(!t.editor_selector||o(e,t.editor_selector))&&r(n(e),t,e)})}t.oninit&&(e=s=0,p(l,function(t){s++,t.initialized?e++:t.on("init",function(){e++,e==s&&i("oninit")}),e==s&&i("oninit")}))}var s=this,l=[];s.settings=t,d.bind(window,"ready",a)},get:function(e){return arguments.length?e in this.editors?this.editors[e]:null:this.editors},add:function(e){var t=this,n=t.editors;return n[e.id]=e,n.push(e),t.activeEditor=e,t.fire("AddEditor",{editor:e}),g||(g=function(){t.fire("BeforeUnload")},d.bind(window,"beforeunload",g)),e},createEditor:function(t,n){return this.add(new e(t,n,this))},remove:function(e){var t=this,n,r=t.editors,i;{if(e)return"string"==typeof e?(e=e.selector||e,void p(d.select(e),function(e){i=r[e.id],i&&t.remove(i)})):(i=e,r[i.id]?(c(i)&&t.fire("RemoveEditor",{editor:i}),r.length||d.unbind(window,"beforeunload",g),i.remove(),i):null);for(n=r.length-1;n>=0;n--)t.remove(r[n])}},execCommand:function(t,n,r){var i=this,o=i.get(r);switch(t){case"mceAddEditor":return i.get(r)||new e(r,i.settings,i).render(),!0;case"mceRemoveEditor":return o&&o.remove(),!0;case"mceToggleEditor":return o?(o.isHidden()?o.show():o.hide(),!0):(i.execCommand("mceAddEditor",0,r),!0)}return i.activeEditor?i.activeEditor.execCommand(t,n,r):!1},triggerSave:function(){p(this.editors,function(e){e.save()})},addI18n:function(e,t){s.add(e,t)},translate:function(e){return s.translate(e)},setActive:function(e){var t=this.activeEditor;this.activeEditor!=e&&(t&&t.fire("deactivate",{relatedTarget:e}),e.fire("activate",{relatedTarget:t})),this.activeEditor=e}},h(v,a),v.setup(),window.tinymce=window.tinyMCE=v,v}),r(ge,[me,d],function(e,t){var n=t.each,r=t.explode;e.on("AddEditor",function(e){var t=e.editor;t.on("preInit",function(){function e(e,t){n(t,function(t,n){t&&s.setStyle(e,n,t)}),s.rename(e,"span")}function i(e){s=t.dom,l.convert_fonts_to_spans&&n(s.select("font,u,strike",e.node),function(e){o[e.nodeName.toLowerCase()](s,e)})}var o,a,s,l=t.settings;l.inline_styles&&(a=r(l.font_size_legacy_values),o={font:function(t,n){e(n,{backgroundColor:n.style.backgroundColor,color:n.color,fontFamily:n.face,fontSize:a[parseInt(n.size,10)-1]})},u:function(n,r){"html4"===t.settings.schema&&e(r,{textDecoration:"underline"})},strike:function(t,n){e(n,{textDecoration:"line-through"})}},t.on("PreProcess SetContent",i))})})}),r(ve,[ce,d],function(e,t){var n={send:function(e){function t(){!e.async||4==r.readyState||i++>1e4?(e.success&&1e4>i&&200==r.status?e.success.call(e.success_scope,""+r.responseText,r,e):e.error&&e.error.call(e.error_scope,i>1e4?"TIMED_OUT":"GENERAL",r,e),r=null):setTimeout(t,10)}var r,i=0;if(e.scope=e.scope||this,e.success_scope=e.success_scope||e.scope,e.error_scope=e.error_scope||e.scope,e.async=e.async===!1?!1:!0,e.data=e.data||"",r=new XMLHttpRequest){if(r.overrideMimeType&&r.overrideMimeType(e.content_type),r.open(e.type||(e.data?"POST":"GET"),e.url,e.async),e.crossDomain&&(r.withCredentials=!0),e.content_type&&r.setRequestHeader("Content-Type",e.content_type),r.setRequestHeader("X-Requested-With","XMLHttpRequest"),r=n.fire("beforeSend",{xhr:r,settings:e}).xhr,r.send(e.data),!e.async)return t();setTimeout(t,10)}}};return t.extend(n,e),n}),r(ye,[],function(){function e(t,n){var r,i,o,a;if(n=n||'"',null===t)return"null";if(o=typeof t,"string"==o)return i="\bb t\nn\ff\rr\"\"''\\\\",n+t.replace(/([\u0080-\uFFFF\x00-\x1f\"\'\\])/g,function(e,t){return'"'===n&&"'"===e?e:(r=i.indexOf(t),r+1?"\\"+i.charAt(r+1):(e=t.charCodeAt().toString(16),"\\u"+"0000".substring(e.length)+e))})+n;if("object"==o){if(t.hasOwnProperty&&"[object Array]"===Object.prototype.toString.call(t)){for(r=0,i="[";r<t.length;r++)i+=(r>0?",":"")+e(t[r],n);return i+"]"}i="{";for(a in t)t.hasOwnProperty(a)&&(i+="function"!=typeof t[a]?(i.length>1?","+n:n)+a+n+":"+e(t[a],n):"");return i+"}"}return""+t}return{serialize:e,parse:function(e){try{return window[String.fromCharCode(101)+"val"]("("+e+")")}catch(t){}}}}),r(be,[ye,ve,d],function(e,t,n){function r(e){this.settings=i({},e),this.count=0}var i=n.extend;return r.sendRPC=function(e){return(new r).send(e)},r.prototype={send:function(n){var r=n.error,o=n.success;n=i(this.settings,n),n.success=function(t,i){t=e.parse(t),"undefined"==typeof t&&(t={error:"JSON Parse error."}),t.error?r.call(n.error_scope||n.scope,t.error,i):o.call(n.success_scope||n.scope,t.result)},n.error=function(e,t){r&&r.call(n.error_scope||n.scope,e,tLine truncated
|
||||||
|
|
||||||
})})},onclick:function(){l(n)}})}),s({outdent:["Decrease indent","Outdent"],indent:["Increase indent","Indent"],cut:["Cut","Cut"],copy:["Copy","Copy"],paste:["Paste","Paste"],help:["Help","mceHelp"],selectall:["Select all","SelectAll"],removeformat:["Clear formatting","RemoveFormat"],visualaid:["Visual aids","mceToggleVisualAid"],newdocument:["New document","mceNewDocument"]},function(t,n){e.addButton(n,{tooltip:t[0],cmd:t[1]})}),s({blockquote:["Blockquote","mceBlockQuote"],numlist:["Numbered list","InsertOrderedList"],bullist:["Bullet list","InsertUnorderedList"],subscript:["Subscript","Subscript"],superscript:["Superscript","Superscript"],alignleft:["Align left","JustifyLeft"],aligncenter:["Align center","JustifyCenter"],alignright:["Align right","JustifyRight"],alignjustify:["Justify","JustifyFull"]},function(t,n){e.addButton(n,{tooltip:t[0],cmd:t[1],onPostRender:function(){var t=this;e.formatter?e.formatter.formatChanged(n,function(e){t.active(e)}):e.on("init",function(){e.formatter.formatChanged(n,function(e){t.active(e)})})}})}),e.addButton("undo",{tooltip:"Undo",onPostRender:o("undo"),cmd:"undo"}),e.addButton("redo",{tooltip:"Redo",onPostRender:o("redo"),cmd:"redo"}),e.addMenuItem("newdocument",{text:"New document",icon:"newdocument",cmd:"mceNewDocument"}),e.addMenuItem("undo",{text:"Undo",icon:"undo",shortcut:"Meta+Z",onPostRender:o("undo"),cmd:"undo"}),e.addMenuItem("redo",{text:"Redo",icon:"redo",shortcut:"Meta+Y",onPostRender:o("redo"),cmd:"redo"}),e.addMenuItem("visualaid",{text:"Visual aids",selectable:!0,onPostRender:a,cmd:"mceToggleVisualAid"}),s({cut:["Cut","Cut","Meta+X"],copy:["Copy","Copy","Meta+C"],paste:["Paste","Paste","Meta+V"],selectall:["Select all","SelectAll","Meta+A"],bold:["Bold","Bold","Meta+B"],italic:["Italic","Italic","Meta+I"],underline:["Underline","Underline"],strikethrough:["Strikethrough","Strikethrough"],subscript:["Subscript","Subscript"],superscript:["Superscript","Superscript"],removeformat:["Clear formatting","RemoveFormat"]},function(t,n){e.addMenuItem(n,{text:t[0],icon:n,shortcut:t[2],cmd:t[1]})}),e.on("mousedown",function(){n.hideAll()}),e.addButton("styleselect",{type:"menubutton",text:"Formats",menu:c}),e.addButton("formatselect",function(){var n=[],i=r(e.settings.block_formats||"Paragraph=p;Heading 1=h1;Heading 2=h2;Heading 3=h3;Heading 4=h4;Heading 5=h5;Heading 6=h6;Preformatted=pre");return s(i,function(t){n.push({text:t[0],value:t[1],textStyle:function(){return e.formatter.getCssText(t[1])}})}),{type:"listbox",text:i[0][0],values:n,fixedWidth:!0,onselect:l,onPostRender:t(n)}}),e.addButton("fontselect",function(){var n="Andale Mono=andale mono,monospace;Arial=arial,helvetica,sans-serif;Arial Black=arial black,sans-serif;Book Antiqua=book antiqua,palatino,serif;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier,monospace;Georgia=georgia,palatino,serif;Helvetica=helvetica,arial,sans-serif;Impact=impact,sans-serif;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco,monospace;Times New Roman=times new roman,times,serif;Trebuchet MS=trebuchet ms,geneva,sans-serif;Verdana=verdana,geneva,sans-serif;Webdings=webdings;Wingdings=wingdings,zapf dingbats",i=[],o=r(e.settings.font_formats||n);return s(o,function(e){i.push({text:{raw:e[0]},value:e[1],textStyle:-1==e[1].indexOf("dings")?"font-family:"+e[1]:""})}),{type:"listbox",text:"Font Family",tooltip:"Font Family",values:i,fixedWidth:!0,onPostRender:t(i,"fontname"),onselect:function(t){t.control.settings.value&&e.execCommand("FontName",!1,t.control.settings.value)}}}),e.addButton("fontsizeselect",function(){var n=[],r="8pt 10pt 12pt 14pt 18pt 24pt 36pt",i=e.settings.fontsize_formats||r;return s(i.split(" "),function(e){var t=e,r=e,i=e.split("=");i.length>1&&(t=i[0],r=i[1]),n.push({text:t,value:r})}),{type:"listbox",text:"Font Sizes",tooltip:"Font Sizes",values:n,fixedWidth:!0,onPostRender:t(n,"fontsize"),onclick:function(t){t.control.settings.value&&e.execCommand("FontSize",!1,t.control.settings.value)}}}),e.addMenuItem("formats",{text:"Formats",menu:c})}var s=r.each;i.on("AddEditor",function(t){t.editor.rtl&&(e.rtl=!0),a(t.editor)}),e.translate=function(e){return i.translate(e)},t.tooltips=!o.iOS}),r(je,[Ee],function(e){return e.extend({recalc:function(e){var t=e.settings,n,r,i,o,a,s,l,c,u,d,f,p,h,m,g,v,y,b,C,x,w,_,E=[],N=[],k,S,T,R,A,B;t=e.settings,i=e.items().filter(":visible"),o=e.layoutRect(),r=t.columns||Math.ceil(Math.sqrt(i.length)),n=Math.ceil(i.length/r),y=t.spacingH||t.spacing||0,b=t.spacingV||t.spacing||0,C=t.alignH||t.align,x=t.alignV||t.align,g=e._paddingBox,A="reverseRows"in t?t.reverseRows:e.isRtl(),C&&"string"==typeof C&&(C=[C]),x&&"string"==typeof x&&(x=[x]);for(d=0;r>d;d++)E.push(0);for(f=0;n>f;f++)N.push(0);for(f=0;n>f;f++)for(d=0;r>d&&(u=i[f*r+d],u);d++)c=u.layoutRect(),k=c.minW,S=c.minH,E[d]=k>E[d]?k:E[d],N[f]=S>N[f]?S:N[f];for(T=o.innerW-g.left-g.right,w=0,d=0;r>d;d++)w+=E[d]+(d>0?y:0),T-=(d>0?y:0)+E[d];for(R=o.innerH-g.top-g.bottom,_=0,f=0;n>f;fLine truncated
|
})})},onclick:function(){l(n)}})}),s({outdent:["Decrease indent","Outdent"],indent:["Increase indent","Indent"],cut:["Cut","Cut"],copy:["Copy","Copy"],paste:["Paste","Paste"],help:["Help","mceHelp"],selectall:["Select all","SelectAll"],removeformat:["Clear formatting","RemoveFormat"],visualaid:["Visual aids","mceToggleVisualAid"],newdocument:["New document","mceNewDocument"]},function(t,n){e.addButton(n,{tooltip:t[0],cmd:t[1]})}),s({blockquote:["Blockquote","mceBlockQuote"],numlist:["Numbered list","InsertOrderedList"],bullist:["Bullet list","InsertUnorderedList"],subscript:["Subscript","Subscript"],superscript:["Superscript","Superscript"],alignleft:["Align left","JustifyLeft"],aligncenter:["Align center","JustifyCenter"],alignright:["Align right","JustifyRight"],alignjustify:["Justify","JustifyFull"]},function(t,n){e.addButton(n,{tooltip:t[0],cmd:t[1],onPostRender:function(){var t=this;e.formatter?e.formatter.formatChanged(n,function(e){t.active(e)}):e.on("init",function(){e.formatter.formatChanged(n,function(e){t.active(e)})})}})}),e.addButton("undo",{tooltip:"Undo",onPostRender:o("undo"),cmd:"undo"}),e.addButton("redo",{tooltip:"Redo",onPostRender:o("redo"),cmd:"redo"}),e.addMenuItem("newdocument",{text:"New document",icon:"newdocument",cmd:"mceNewDocument"}),e.addMenuItem("undo",{text:"Undo",icon:"undo",shortcut:"Meta+Z",onPostRender:o("undo"),cmd:"undo"}),e.addMenuItem("redo",{text:"Redo",icon:"redo",shortcut:"Meta+Y",onPostRender:o("redo"),cmd:"redo"}),e.addMenuItem("visualaid",{text:"Visual aids",selectable:!0,onPostRender:a,cmd:"mceToggleVisualAid"}),s({cut:["Cut","Cut","Meta+X"],copy:["Copy","Copy","Meta+C"],paste:["Paste","Paste","Meta+V"],selectall:["Select all","SelectAll","Meta+A"],bold:["Bold","Bold","Meta+B"],italic:["Italic","Italic","Meta+I"],underline:["Underline","Underline"],strikethrough:["Strikethrough","Strikethrough"],subscript:["Subscript","Subscript"],superscript:["Superscript","Superscript"],removeformat:["Clear formatting","RemoveFormat"]},function(t,n){e.addMenuItem(n,{text:t[0],icon:n,shortcut:t[2],cmd:t[1]})}),e.on("mousedown",function(){n.hideAll()}),e.addButton("styleselect",{type:"menubutton",text:"Formats",menu:c}),e.addButton("formatselect",function(){var n=[],i=r(e.settings.block_formats||"Paragraph=p;Heading 1=h1;Heading 2=h2;Heading 3=h3;Heading 4=h4;Heading 5=h5;Heading 6=h6;Preformatted=pre");return s(i,function(t){n.push({text:t[0],value:t[1],textStyle:function(){return e.formatter.getCssText(t[1])}})}),{type:"listbox",text:i[0][0],values:n,fixedWidth:!0,onselect:l,onPostRender:t(n)}}),e.addButton("fontselect",function(){var n="Andale Mono=andale mono,monospace;Arial=arial,helvetica,sans-serif;Arial Black=arial black,sans-serif;Book Antiqua=book antiqua,palatino,serif;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier,monospace;Georgia=georgia,palatino,serif;Helvetica=helvetica,arial,sans-serif;Impact=impact,sans-serif;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco,monospace;Times New Roman=times new roman,times,serif;Trebuchet MS=trebuchet ms,geneva,sans-serif;Verdana=verdana,geneva,sans-serif;Webdings=webdings;Wingdings=wingdings,zapf dingbats",i=[],o=r(e.settings.font_formats||n);return s(o,function(e){i.push({text:{raw:e[0]},value:e[1],textStyle:-1==e[1].indexOf("dings")?"font-family:"+e[1]:""})}),{type:"listbox",text:"Font Family",tooltip:"Font Family",values:i,fixedWidth:!0,onPostRender:t(i,"fontname"),onselect:function(t){t.control.settings.value&&e.execCommand("FontName",!1,t.control.settings.value)}}}),e.addButton("fontsizeselect",function(){var n=[],r="8pt 10pt 12pt 14pt 18pt 24pt 36pt",i=e.settings.fontsize_formats||r;return s(i.split(" "),function(e){var t=e,r=e,i=e.split("=");i.length>1&&(t=i[0],r=i[1]),n.push({text:t,value:r})}),{type:"listbox",text:"Font Sizes",tooltip:"Font Sizes",values:n,fixedWidth:!0,onPostRender:t(n,"fontsize"),onclick:function(t){t.control.settings.value&&e.execCommand("FontSize",!1,t.control.settings.value)}}}),e.addMenuItem("formats",{text:"Formats",menu:c})}var s=r.each;i.on("AddEditor",function(t){t.editor.rtl&&(e.rtl=!0),a(t.editor)}),e.translate=function(e){return i.translate(e)},t.tooltips=!o.iOS}),r(je,[Ee],function(e){return e.extend({recalc:function(e){var t=e.settings,n,r,i,o,a,s,l,c,u,d,f,p,h,m,g,v,y,b,C,x,w,_,E=[],N=[],k,S,T,R,A,B;t=e.settings,i=e.items().filter(":visible"),o=e.layoutRect(),r=t.columns||Math.ceil(Math.sqrt(i.length)),n=Math.ceil(i.length/r),y=t.spacingH||t.spacing||0,b=t.spacingV||t.spacing||0,C=t.alignH||t.align,x=t.alignV||t.align,g=e._paddingBox,A="reverseRows"in t?t.reverseRows:e.isRtl(),C&&"string"==typeof C&&(C=[C]),x&&"string"==typeof x&&(x=[x]);for(d=0;r>d;d++)E.push(0);for(f=0;n>f;f++)N.push(0);for(f=0;n>f;f++)for(d=0;r>d&&(u=i[f*r+d],u);d++)c=u.layoutRect(),k=c.minW,S=c.minH,E[d]=k>E[d]?k:E[d],N[f]=S>N[f]?S:N[f];for(T=o.innerW-g.left-g.right,w=0,d=0;r>d;d++)w+=E[d]+(d>0?y:0),T-=(d>0?y:0)+E[d];for(R=o.innerH-g.top-g.bottom,_=0,f=0;n>f;fLine truncated
|
||||||
Reference in new issue
Block a user