提交 3110d4ff 编写于 作者: C campaign

by zhanyi

上级 06485b8b
Ueditor Change List
Version 1.2.4
新增功能
. 官网新增API文档
. CSS按照UI结构进行了模块化拆分
. 新增皮肤切换功能,并提供一套新皮肤(可通过配置项theme来设置)
. 新增编辑器容器拖动缩放功能
. 新增音乐插件
. 增加了源码模式下,全屏按钮可以使用
. 添加了UE.getEditor工厂方法
. 添加了针对jquery配合使用的demo
. 添加了针对jqueryValidation配合使用的demo
优化修复
. 修复涂鸦路径在配置时,添加参数时请求报错
. 修复涂鸦opera下缩放不能使用
. 修复编辑器全屏功能失效问题
. codemirror版本升级到最新版
. 对opera/safari的支持进行了进一步的优化
. 优化了部分demo页的代码
Version 1.2.3
新增功能
. 新增国际化支持
. 新增涂鸦功能
. 新增大小写功能
. 新增getAllHtml方法,可以将整个页面的内容打出来,可以在editor_config.js里通过配置allHtmlEnabled,来配置在提交时是否使用getAllHtml来得到内容
. 新增插入模板的功能
. 新增背景功能
. 新增UE.instants全局对象,下边挂接了所有实例化的编辑器对象
. Editor下新增ready方法,当编辑器ready后执行传入的fn,如果编辑器已经ready好了,就马上执行fn
. 新增topOffset配置参数,用于设置AutoFloat时工具栏距离顶部的高度
. 新增sourceEditorFirst配置参数,用于控制编辑器初始化时是否显示成源码模式,默认为否
. 新增在表格内实例化编辑器的demo
. 新增getDialog(dialogName)接口,可以获取dialog对象。
优化修复
. chrome下会出现alt+tab切换时,导致选区位置不对
. focus方法添加参数可以指向到内容末尾
. 完全支持opera浏览器
. 修复了表格中实例化编辑器时工具栏浮动错位问题
. 优化了后台处理文件代码,文件夹按照日期自动生成
Version 1.2.2
1.编辑器不可编辑时,可以配置哪些功能可以使用,例如全屏
2.table的边框为0时,采用虚线显示
3.修复firefox下插入大量代码时,代码格式显示不正确的问题
4.附件上传成功后显示初始文件名
5.自定制下载优化
6.当图片上传超时时,增加提示信息
7.修复自动排版对H1不生效的问题
8.修复插入超链接,超链接地址包含script标签,预览时会执行script语句的问题
Version 1.2.1
1.插入表情时,按住CTRL键可连续插入多个表情
2.按住CTRL+Enter提交表单
3.增加readonly属性在editor_config.js,编辑器实例上增加setEnabled,setDisabled方法,设置编辑区域是否可以编辑
4.Editor上添加了getPlainTxt方法,得到编辑器的纯文本内容,但会保留段落格式
5.修正了initialContent赋值失效的问题,赋值顺序以标签内容为先,如果没有再看initialContent内容。
6.为insertHtml命令添加了过滤机制
7.getContent将“ ”转成空格,连续2个空格则以“  ”表示
8.当选区在一个超链接中,就可以在弹出层中直接修改这个超链接中的文本
9.与后台交互的路径整体进行了调整
10.超链接窗口可以修改超链接显示的文字
11.增加插入百度应用的功能
12.为每个plugin的在代码中添加了配置项的容错代码,若配置项不存在,不会报错
13.提供后台的jsp版本
14.重写了ui和和编辑器的交互层,dialog改为显示时创建,整体代码减少22k
15.修正了代码高亮跟jquery冲突的问题
16.改进了多个编辑器实例,使用一个name做为form提交,后台都可以取到
17.添加是否删除空的inlineElement节点(包括嵌套的情况)的配置项:autoClearEmptyNode
18.修正了chrome下粘贴文本带有white-space样式, 导致编辑器内容不能折行的问题
19.在配置项中增加isShow设置初始化时是否显示编辑器,在编辑器实例上增加setShow,setHide方法设置编辑器的显示/隐藏
20.修正在jquery中实例化编辑器时与UE自带的domready冲突的问题
21.修正代码高亮中的行号与代码内容不能对齐的问题
22.新增了图片上传对话框中可自定义配置默认Tab的功能
23.修正.net源码包中gbk版本的乱码以及demo中使用了php路径的问题
Version 1.2.0
1.远程图片抓取
3.源码模式下css进行了简写
4.增加了baidu图片搜索功能,搜索图片然后直接插入到编辑器中
5.重写了浮动工具栏,支持混乱模式下的工具栏滚动
6.服务器图片在线管理
7.word的本地图片取得寛高
8.附件上传
9.自动排版
10.优化了状态反射的方式,改为编辑器获得焦点才会触发,失去焦点不在触发状态查询
11.添加了上来就可以全屏的配置项哦去焦点之前的选区
13.优化了查询状态反射的性能
14.添加了contentchagne事件
15.重写了autoheight插件,去掉setInterval的方式,并且长高时不在跳动
16.插入视频,可以预览,并且界面加入了视屏搜索功能,并且可以插入视屏预览图到编辑器中
17.单元格属性编辑
18.ie下的截屏功能
19.加强了table的dialog功能
20.改进了autolink的效果,例如: dddhttp://www.baidu.com 回车,http://www.baidu.com也可以被匹配到了
21.文件上传提供flash源码
22.修改了行间距的展示方式
23.段间距变为段前距和段后距
24.提供了.net的事例代码
25.首页提供了功能选择生成下载的新功能
26.首页文档进行了改进
27.分页符可以删除
28.增强了表格的编辑功能
Version 1.1.8
1.避免了重复加载源码高亮的核心代码
2.修复了word粘贴table过滤出错问题
3.修复插入地图会出现style="undefined"的问题
4.优化了list,多个相邻的属性一直的list会合并
5.可以在列表中的一行里产生多行的效果(通过回车再回退操作),类似office的效果
6.添加自定义样式功能
7.修了在chrome下右键删除td里的图片会把整个td删除的问题
8.改进了不同的页面调用一个editor,URL问题
9.增加了颜色选择器的颜色
10.改进了提供的后台程序的安全性
11.代码高亮支持折行
12.改进了源码编辑模式下的性能(ie下),并且支持自动换行
13.修改了在destroy之后会在ie下报错的问题
14.给初始化容器name值,那么在后台取值的键值就是name给定的值,方便多实例在一个form下提交
15.支持插入script/style这样的标签
16.修复了列表里插入浮动图片,图片不占位问题
17.源码模式下,去掉了pre中的 
18.完善了_example下的demo例子
19.base64的图片被过滤掉了
Version 1.1.7.3
1.支持图片相对路径模式
2.word粘贴首行缩进问题
3.添加了图片边距
4.提供了图片等比压缩时基准边选择配置的功能
5.dialog在某些页面不显示问题
6.添加了行内间距的调整
7.在editor实例下添加了destroy方法
8.全屏按钮位置不对的问题
9.iframe.css支持相对和绝对路径
10.修正了focus方法在ff下失效的问题
11.提供了对FF3.6的支持
12.添加了Shift+Enter软回车功能
10.统一了颜色rgb转成#
version 1.1.7.2
1.去掉了iframe.css 改为在editor_config.js中配置,避免css文件找不到的问题
2.给下拉菜单添加了默认的文字说明
3.Ueditor.css去掉了对外部页面css的影响
4.修正了ie9下,编辑器的高度不随着内容缩短的问题
5.修正了粘贴有时会出现粘贴失败的情况
6.修正了在ie下点击图片会出现js错误的问题
7.修正了在ie下选全部替换,回退,再替换会出现替换失败的问题
8.增加表情本地化模式,可在config中配置是否开启本地化
9.flash的多图片上传
10.支持了源码模式的下的代码高亮
11.增加插入代码支持的语言,改进了插入代码的展示效果
12.增加了字数统计
13.增加了对图片的排版操作
14.解决ie6和ie7下工具栏浮动时cpu占用过高的bug
15.优化了文本模式粘贴的效果
16.优化了word粘贴的效果
17.在word粘贴本地图片时添加引导上传功能
18.更好的ie9支持
19.优化首行缩进效果
20.使用script标签代替textarea标签作为编辑器容器,简化前后端转码的配置。
21.优化了路径配置,修正了1.1.7.1中需要修改多处路径的问题
22.增加了图片操作浮层的开关配置
23.同时支持网络图片和本地图片的等比缩放
24.优化了源码模式下的代码格式
version 1.1.6.1
1.去掉了iframe.css 改为在editor_config.js中配置,避免css文件找不到的问题
2.给下拉菜单添加了默认的文字说明
3.Ueditor.css去掉了对外部页面css的影响
4.修正了ie9下,编辑器的高度不随着内容缩短的问题
5.修正了粘贴有时会出现粘贴失败的情况
6.修正了在ie下点击图片会出现js错误的问题
7.修正了在ie下选全部替换,回退,再替换会出现替换失败的问题
version 1.1.6
1. 插入日期按钮现在使用tangram日历控件
2. table可再编辑
3. 粘贴excel表格的问题
4. ff下最大化和切换源码出现光标不能跟着键盘改变和不能切出输入法的问题
5. tab按键功能
6. 支持多级列表
7. 超链接可以在非ie下去除下划线
8. 字体,字号,在editor-config.js中可配置
version 1.1.5
1.右键的策略,只显示选区内可操作的条目
2.禁止elementpath还会留下边框问题
3.字体改为了px
4.插入分页符
5.整合浮动toolbar为autofloat插件
6.初始化的值会在第一次操作前清除,而且不在有延迟感
7.配置项都放到了editor-config.js中
8.修正了多实例的问题
9.插入iframe功能
10.粘贴过滤掉内容会有提示,没过滤任何内容不会出现提示
11.修正代码高亮的显示效果
12.list放弃原生改为手动实现,修正一系列原生的bug
13.初始给个textarea会把内容取出作为初始值
14.去掉了源码状态下冗余的table/td/pre的style属性
15.fixed剪切出去会带start/end
16.fixex源码模式下getContent内容不是新的
17.table加入了设置背景颜色和边框颜色
Version 1.1.4
1. 锚点
2. 首行缩进
3. 行间距
4. 右键菜单
5. 插入代码
6. 文件上传(php版本)
7. 修复一些bug
Version 1.1.3
1. 修复chrome下粘贴的bug
2. 自动转换office粘入的有序列表和无序列表
3. 插入图片不再等比缩放,显示原始大小
Version 1.1.2
1. 修正IE9下autoHeight插件会一直长高的问题
2. 增加对IE6下大写style属性的转换处理(现统一转换成小写)
3. 格式刷
4. 上下标互斥
5. form提交的支持
6. 增加了focus属性,可以初始化时,设置是否编辑器获得焦点
7. 增加了下滑线,删除线按钮,去掉了原来的下拉框
8. autolink支持,使非ie在输入链接时能自动加上a标签
9. google地图支持
10. 修正了一些bug
Version 1.1
1. 修改了删除链接的机制,允许一次性删除多个超链接
2. 改变了目录结构,方便部署(大大减少了开发代码过程中需要引入的js数量)
3. 修正部分bug
Version 1.0 (2011-7-8)
1. 完成功能的开发
ueditor
=======
rich text
UEditor is developed by Baidu Co.ltd. It is lightweight, customizable , focusing on user experience and etc. ,
UEditor is based on open source BSD license , allowing free use and redistribution.
email:ueditor@baidu.com
\ No newline at end of file
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<!--<meta http-equiv="X-UA-Compatible" content="IE=8">-->
<title>完整demo</title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<script type="text/javascript" charset="utf-8" src="../editor_config.js"></script>
<!--使用版-->
<!--<script type="text/javascript" charset="utf-8" src="../editor_all.js"></script>-->
<!--开发版-->
<script type="text/javascript" charset="utf-8" src="editor_api.js">
</script>
<style type="text/css">
.clear {
clear: both;
}
</style>
</head>
<body>
<div>
<script id="editor" type="text/plain" style="width:1076px;" >这里可以书写编辑器的初始内容</script>
</div>
<div class="clear"></div>
<div id="btns">
<div >
<input type="button" value="获得整个html的内容" onclick="getAllHtml()">
<input type="button" value="获得内容" onclick="getContent()">
<input type="button" value="写入内容" onclick="setContent()">
<input type="button" value="获得纯文本" onclick="getContentTxt()">
<input type="button" value="获得带格式的纯文本" onclick="getPlainTxt()">
<input type="button" value="判断是否有内容" onclick="hasContent()">
<input type="button" value="使编辑器获得焦点" onclick="setFocus()">
</div>
<div >
<input type="button" value="获得当前选中的文本" onclick="getText()"/>
<input type="button" value="删除编辑器" onclick="deleteEditor()"/>
<input id="enable" type="button" value="可以编辑" onclick="setEnabled()"/>
<input type="button" value="不可编辑" onclick="setDisabled()"/>
<input type="button" value="隐藏编辑器" onclick=" UE.getEditor('editor').setHide()"/>
<input type="button" value="显示编辑器" onclick=" UE.getEditor('editor').setShow()"/>
</div>
</div>
<div >
<input type="button" value="创建编辑器" onclick="createEditor()"/>
<input type="button" value="删除编辑器" onclick="deleteEditor()"/>
</div>
</body>
<script type="text/javascript">
//实例化编辑器
UE.getEditor('editor');
function createEditor(){
enableBtn();
UE.getEditor('editor')
}
function getAllHtml() {
alert( UE.getEditor('editor').getAllHtml() )
}
function getContent() {
var arr = [];
arr.push( "使用editor.getContent()方法可以获得编辑器的内容" );
arr.push( "内容为:" );
arr.push( UE.getEditor('editor').getContent() );
alert( arr.join( "\n" ) );
}
function getPlainTxt() {
var arr = [];
arr.push( "使用editor.getPlainTxt()方法可以获得编辑器的带格式的纯文本内容" );
arr.push( "内容为:" );
arr.push( UE.getEditor('editor').getPlainTxt() );
alert( arr.join( '\n' ) )
}
function setContent() {
var arr = [];
arr.push( "使用editor.setContent('欢迎使用ueditor')方法可以设置编辑器的内容" );
UE.getEditor('editor').setContent( '欢迎使用ueditor' );
alert( arr.join( "\n" ) );
}
function setDisabled() {
UE.getEditor('editor').setDisabled( 'fullscreen' );
disableBtn( "enable" );
}
function setEnabled() {
UE.getEditor('editor').setEnabled();
enableBtn();
}
function getText() {
//当你点击按钮时编辑区域已经失去了焦点,如果直接用getText将不会得到内容,所以要在选回来,然后取得内容
var range = UE.getEditor('editor').selection.getRange();
range.select();
var txt = UE.getEditor('editor').selection.getText();
alert( txt )
}
function getContentTxt() {
var arr = [];
arr.push( "使用editor.getContentTxt()方法可以获得编辑器的纯文本内容" );
arr.push( "编辑器的纯文本内容为:" );
arr.push( UE.getEditor('editor').getContentTxt() );
alert( arr.join( "\n" ) );
}
function hasContent() {
var arr = [];
arr.push( "使用editor.hasContents()方法判断编辑器里是否有内容" );
arr.push( "判断结果为:" );
arr.push( UE.getEditor('editor').hasContents() );
alert( arr.join( "\n" ) );
}
function setFocus() {
UE.getEditor('editor').focus();
}
function deleteEditor() {
disableBtn();
UE.getEditor('editor').destroy();
}
function disableBtn( str ) {
var div = document.getElementById( 'btns' );
var btns = domUtils.getElementsByTagName( div, "input" );
for ( var i = 0, btn; btn = btns[i++]; ) {
if ( btn.id == str ) {
domUtils.removeAttributes( btn, ["disabled"] );
} else {
btn.setAttribute( "disabled", "true" );
}
}
}
function enableBtn() {
var div = document.getElementById( 'btns' );
var btns = domUtils.getElementsByTagName( div, "input" );
for ( var i = 0, btn; btn = btns[i++]; ) {
domUtils.removeAttributes( btn, ["disabled"] );
}
}
</script>
</html>
\ No newline at end of file
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<title></title>
<script type="text/javascript" charset="utf-8" src="../editor_config.js"></script>
<!--使用版-->
<!--<script type="text/javascript" charset="utf-8" src="../editor_all.js"></script>-->
<!--开发版-->
<script type="text/javascript" charset="utf-8" src="editor_api.js"></script>
</head>
<body>
<h1>UEditor自定义插件</h1>
<!--style给定宽度可以影响编辑器的最终宽度-->
<script type="text/plain" id="myEditor">
<p><img src="http://ueditor.baidu.com/website/images/banner-dl.png" alt=""></p>
<p>插件描述选中图片在其上单击会改变图片的边框</p>
</script>
<script type="text/javascript">
//创建一个在选中的图片单击时添加边框的插件,其实质就是在baidu.editor.plugins塞进一个闭包
UE.plugins["addborder"] = function () {
var me = this;
//创建一个改变图片边框的命令
me.commands["addborder"] = {
execCommand:function () {
//获取当前选区
var range = me.selection.getRange();
//选区没闭合的情况下操作
if ( !range.collapsed ) {
//图片判断
var img = range.getClosedNode();
if ( img && img.tagName == "IMG" ) {
if(img.style.borderWidth == "5px" ){
img.style.borderWidth = "1px";
}else{
img.style.border = "5px solid red";
}
}
}
}
};
//注册一个触发命令的事件,同学们可以在任意地放绑定触发此命令的事件
me.addListener( 'click', function () {
me.execCommand( "addborder" );
} );
};
var editor_a = new UE.ui.Editor();
editor_a.render( 'myEditor' );
</script>
</body>
</html>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<title></title>
<script type="text/javascript" charset="utf-8" src="../editor_config.js"></script>
<!--使用版-->
<!--<script type="text/javascript" charset="utf-8" src="../editor_all.js"></script>-->
<!--开发版-->
<script type="text/javascript" charset="utf-8" src="editor_api.js"></script>
<style type="text/css">
#editor {
border: 1px solid #CCC;
width: 1000px
}
#editor_toolbar_box {
background: #F0F0EE;
padding: 2px;
}
#editor_iframe_holder {
border-top: 1px solid #CCC;
border-bottom: 1px solid #CCC;
}
</style>
</head>
<body>
<h1>UEditor自定义toolbar</h1>
<div id="editor">
<div id="editor_toolbar_box">
<div id="editor_toolbar">
<input id="bold" type="button" value="加粗" onclick="myeditor.execCommand('bold')" style="height:24px;line-height:20px"/>
<input id="italic" type="button" value="加斜" onclick="myeditor.execCommand('italic')" style="height:24px;line-height:20px"/>
<select id="fontfamily" onchange="myeditor.execCommand('fontfamily',this.value)">
<option value="宋体,simsun">宋体</option>
<option value="楷体,楷体_gb2312,simkai">楷体</option>
<option value="隶书,simli">隶书</option>
<option value="黑体,simhei">黑体</option>
<option value="andale mono,times">andale mono</option>
<option value="arial,helvetica,sans-serif">arial</option>
<option value="arial black,avant garde">arial black</option>
<option value="comic sans ms,sans-serif">comic sans ms</option>
</select>
<select id="fontsize" onchange="myeditor.execCommand('fontsize',this.value)">
<option value="10pt">10pt</option>
<option value="11pt">11pt</option>
<option value="12pt">12pt</option>
<option value="14pt">14pt</option>
<option value="16pt">16pt</option>
<option value="18pt">18pt</option>
<option value="20pt">20pt</option>
<option value="22pt">22pt</option>
<option value="24pt">24pt</option>
<option value="36pt">36pt</option>
</select>
<input type="button" value="插入html" onclick="insert()" style="height:24px;line-height:20px"/>
<input type="button" value="清除格式" onclick="myeditor.execCommand('removeformat')" style="height:24px;line-height:20px"/>
<input type="button" value="获得编辑器内容" onclick="alert(myeditor.getContent())" style="height:24px;line-height:20px"/>
<input type="button" value="获得编辑器纯文本内容" onclick="alert(myeditor.getContentTxt())" style="height:24px;line-height:20px"/>
</div>
</div>
<div id="editor_iframe_holder" style="height:400px;"></div>
</div>
<script type="text/javascript" charset="utf-8">
//editor的属性
var option = {
initialContent: '初始化内容',//初始化编辑器的内容
minFrameHeight: 200
};
//实例化一个不带ui的编辑器,注意此处的实例化对象是baidu.editor下的Editor,而非baidu.editor.ui下的Editor
var myeditor = new baidu.editor.Editor(option);
//给编辑器增加一个选中改变的事件,用来判断所选内容以及状态
myeditor.addListener('selectionchange', function (){
var cmdName = ['bold','italic'],//命令列表
fontName = ['fontfamily','fontsize'];//字体设置下拉框列表,此处选择其中两个
//查询每个命令当前的状态,并设置对应状态样式
var i =-1;
while(i++ < cmdName.length-1){
var state = myeditor.queryCommandState(cmdName[i]);
if(state == 1){ //高亮
document.getElementById(cmdName[i]).style.color = "red";
}else{
document.getElementById(cmdName[i]).style.color = "";
}
}
//依据当前光标所在的字体改变下拉列表的选中值
i = -1;
while(i++<fontName.length-1){
var fstate = myeditor.queryCommandValue(fontName[i]).toLowerCase();
var fselect = document.getElementById(fontName[i]);
for(var j= 0;j<fselect.options.length;j++){
if(fselect.options[j].value.toLowerCase().indexOf(fstate.split(",")[0])!=-1){
fselect.options[j].selected = "true";
}
}
}
});
//渲染编辑器
myeditor.render('editor_iframe_holder');
//插入文本
function insert(){
var insertTxt = "插入的文本";
insertTxt = prompt("插入的内容",insertTxt);
if(insertTxt){
myeditor.execCommand("inserthtml",insertTxt);
}
}
function execUnderline(cmd){
myeditor.execCommand(cmd);
}
</script>
</body>
</html>
\ No newline at end of file
/**
* 开发版本的文件导入
*/
(function (){
var paths = [
'editor.js',
'core/browser.js',
'core/utils.js',
'core/EventBase.js',
'core/dom/dtd.js',
'core/dom/domUtils.js',
'core/dom/Range.js',
'core/dom/Selection.js',
'core/Editor.js',
'core/ajax.js',
'core/filterword.js',
'plugins/inserthtml.js',
'plugins/autotypeset.js',
'plugins/autosubmit.js',
'plugins/background.js',
'plugins/image.js',
'plugins/justify.js',
'plugins/font.js',
'plugins/link.js',
'plugins/map.js',
'plugins/iframe.js',
'plugins/scrawl.js',
'plugins/removeformat.js',
'plugins/blockquote.js',
'plugins/convertcase.js',
'plugins/indent.js',
'plugins/print.js',
'plugins/preview.js',
'plugins/spechars.js',
'plugins/emotion.js',
'plugins/selectall.js',
'plugins/paragraph.js',
'plugins/directionality.js',
'plugins/horizontal.js',
'plugins/time.js',
'plugins/rowspacing.js',
'plugins/lineheight.js',
'plugins/cleardoc.js',
'plugins/anchor.js',
'plugins/delete.js',
'plugins/wordcount.js',
'plugins/pagebreak.js',
'plugins/wordimage.js',
'plugins/undo.js',
'plugins/paste.js', //粘贴时候的提示依赖了UI
'plugins/list.js',
'plugins/source.js',
'plugins/shortcutkeys.js',
'plugins/enterkey.js',
'plugins/keystrokes.js',
'plugins/fiximgclick.js',
'plugins/autolink.js',
'plugins/autoheight.js',
'plugins/autofloat.js', //依赖UEditor UI,在IE6中,会覆盖掉body的背景图属性
'plugins/highlightcode.js',
'plugins/serialize.js',
'plugins/video.js',
'plugins/table.js',
'plugins/contextmenu.js',
'plugins/basestyle.js',
'plugins/elementpath.js',
'plugins/formatmatch.js',
'plugins/searchreplace.js',
'plugins/customstyle.js',
'plugins/catchremoteimage.js',
'plugins/snapscreen.js',
'plugins/attachment.js',
'plugins/webapp.js',
'plugins/template.js',
'plugins/music.js',
'ui/ui.js',
'ui/uiutils.js',
'ui/uibase.js',
'ui/separator.js',
'ui/mask.js',
'ui/popup.js',
'ui/colorpicker.js',
'ui/tablepicker.js',
'ui/stateful.js',
'ui/button.js',
'ui/splitbutton.js',
'ui/colorbutton.js',
'ui/tablebutton.js',
'ui/autotypesetpicker.js',
'ui/autotypesetbutton.js',
'ui/toolbar.js',
'ui/menu.js',
'ui/combox.js',
'ui/dialog.js',
'ui/menubutton.js',
'ui/editorui.js',
'ui/editor.js',
'ui/multiMenu.js'
],
baseURL = '../_src/';
for (var i=0,pi;pi = paths[i++];) {
document.write('<script type="text/javascript" src="'+ baseURL + pi +'"></script>');
}
})();
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<title></title>
<script type="text/javascript" charset="utf-8" src="../editor_config.js"></script>
<!--加入高亮的js和css文件,如果你的编辑器和展示也是一个页面那么高亮的js可以不加载-->
<script type="text/javascript" charset="utf-8" src="../third-party/SyntaxHighlighter/shCore.js"></script>
<link rel="stylesheet" type="text/css" href="../third-party/SyntaxHighlighter/shCoreDefault.css"/>
<!--使用版-->
<!--<script type="text/javascript" charset="utf-8" src="../editor_all.js"></script>-->
<!--开发版-->
<script type="text/javascript" charset="utf-8" src="editor_api.js"></script>
</head>
<body>
<h1>代码高亮演示</h1>
<h2>页面上已经有的代码</h2>
<div style="width:200px">
<pre class="brush:js;toolbar:false;">
var editor_a = new baidu.editor.ui.Editor();
editor_a.render( 'myEditor' );
</pre>
<pre class="brush:js;toolbar:false;">
function adjustList(list,tag,style){
var nextList = list.nextSibling;
if(nextList && nextList.nodeType == 1 && nextList.tagName.toLowerCase() == tag && (domUtils.getStyle(nextList,'list-style-type')||(tag == 'ol'?'decimal' : 'disc')) == style){
domUtils.moveChild(nextList,list);
if(nextList.childNodes.length == 0){
domUtils.remove(nextList);
}
}
var preList = list.previousSibling;
}
</pre>
</div>
<!--style给定宽度可以影响编辑器的最终宽度-->
<script type="text/plain" id="myEditor" style="width:500px">
<pre class="brush:js;toolbar:false;">
function adjustList(list,tag,style){
var nextList = list.nextSibling;
if(nextList && nextList.nodeType == 1 && nextList.tagName.toLowerCase() == tag && (domUtils.getStyle(nextList,'list-style-type')||(tag == 'ol'?'decimal' : 'disc')) == style){
domUtils.moveChild(nextList,list);
if(nextList.childNodes.length == 0){
domUtils.remove(nextList);
}
}
}
</pre>
</script>
<script type="text/javascript">
//为了在编辑器之外能展示高亮代码
SyntaxHighlighter.highlight();
//调整左右对齐
for(var i=0,di;di=SyntaxHighlighter.highlightContainers[i++];){
var tds = di.getElementsByTagName('td');
for(var j=0,li,ri;li=tds[0].childNodes[j];j++){
ri = tds[1].firstChild.childNodes[j];
ri.style.height = li.style.height = ri.offsetHeight + 'px';
}
}
var editor_a = new baidu.editor.ui.Editor();
editor_a.render( 'myEditor' );
</script>
</body>
</html>
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<style type="text/css">
h3{
color:#630000;
}
ul li{
margin: 10px;
}
a:link,a:active,a:visited{
color: #0000EE;
}
</style>
</head>
<body>
<h2>UEditor各种实例演示</h2>
<h3>基础示例</h3>
<ul>
<li>
<a href="simpleDemo.html" target="_self">简单示例</a><br/>
使用基础的按钮实现简单的功能
</li>
</ul>
<h3>应用展示</h3>
<ul>
<li>
<a href="customPluginDemo.html" target="_self">自定义插件</a><br/>
在编辑器的基础上开发自己的插件
</li>
<li>
<a href="submitFormDemo.html" target="_self">表单应用</a><br/>
编辑器的内容通过表单提交到后台
</li>
<li>
<a href="resetDemo.html" target="_self">重置编辑器</a><br/>
将编辑器的内部变量清空,重置。
</li>
<li>
<a href="textareaDemo.html" target="_self">文本域渲染编辑器</a><br/>
将编辑器渲染到文本域,并且将文本域的内容放到编辑器的初始化内容里
</li>
</ul>
<h3>高级案例</h3>
<ul>
<li>
<a href="completeDemo.html" target="_self">完整示例</a><br/>
编辑器的完整功能
</li>
<li>
<a href="multiDemo.html" target="_self">多编辑器实例</a><br/>
一个页面实例化多个编辑器,互不影响
</li>
<li>
<a href="customToolbarDemo.html" target="_self">自定义Toolbar</a><br/>
用自己的皮肤,设计自己的编辑器
</li>
<li>
<a href="highlightDemo.html" target="_self">代码高亮</a><br/>
代码高亮展示及其编辑
</li>
<li>
<a href="renderInTable.html" target="_self">在表格中渲染编辑器</a><br/>
表格中渲染编辑器
</li>
<li>
<a href="jqueryCompleteDemo.html" target="_self">jquery</a><br/>
jquery中使用编辑器
</li>
<li>
<a href="jqueryValidation.html" target="_self">jqueryValidation</a><br/>
编辑器在jqueryValidation中验证
</li>
<li>
<a href="ios5demo.html" target="_self">ipad.ios.5.0+</a><br/>
编辑器在ios5+中的使用
</li>
</ul>
<script type="text/javascript">
var href = location.href;
if(href.indexOf("http") != 0 ){
alert("您当前尚未将UEditor部署到服务器环境,部分浏览器下所有弹出框功能的使用会受到限制!");
}
</script>
</body>
</html>
\ No newline at end of file
<!doctype html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=0">
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<script type="text/javascript" charset="utf-8" src="../editor_config.js"></script>
<!--使用版-->
<!--<script type="text/javascript" charset="utf-8" src="../editor_all.js"></script>-->
<!--开发版-->
<script type="text/javascript" charset="utf-8" src="editor_api.js">
</script>
<style type="text/css">
.clear {
clear: both;
}
</style>
</head>
<body>
<script id="editor" type="text/plain" style="width:1076px;" >编辑器你的内容</script>
</body>
<script type="text/javascript">
UE.getEditor('editor',{
theme:'gorgeous',
autoFloatEnabled:false,
initialFrameHeight:480,
toolbars:[
['fullscreen', 'source', '|', 'undo', 'redo', '|',
'bold', 'italic', 'underline', 'strikethrough', 'superscript', 'subscript', 'removeformat', 'formatmatch','autotypeset', '|',
'blockquote', '|', 'forecolor', 'backcolor', 'insertorderedlist', 'insertunorderedlist','selectall', 'cleardoc', '|', 'customstyle',
'paragraph', '|','rowspacingtop', 'rowspacingbottom','lineheight', '|','fontfamily', 'fontsize', '|',
'directionalityltr', 'directionalityrtl', '|', '', 'indent', '|',
'justifyleft', 'justifycenter', 'justifyright', 'justifyjustify', '|','touppercase','tolowercase','|',
'link', 'unlink', 'anchor', '|', 'imagenone', 'imageleft', 'imageright',
'imagecenter', '|', 'emotion','scrawl', 'insertvideo','music','map', 'gmap', 'insertframe','highlightcode','webapp','pagebreak','template','background', '|',
'horizontal', 'date', 'time', 'spechars','snapscreen', 'wordimage', '|',
'inserttable', 'deletetable', 'insertparagraphbeforetable', 'insertrow', 'deleterow', 'insertcol', 'deletecol', 'mergecells', 'mergeright', 'mergedown', 'splittocells', 'splittorows', 'splittocols', '|',
'print', 'preview', 'searchreplace','help']
]
});
</script>
</html>
\ No newline at end of file
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>使用jquery的完整demo</title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.8.3.min.js" charset=""></script>
<script type="text/javascript" charset="utf-8" src="../editor_config.js"></script>
<script type="text/javascript" charset="utf-8" src="editor_api.js"></script>
<script>
$(function(){
UE.getEditor('myEditor');
$('#btn').click(function(){
//手动提交需要手动同步编辑器数据
UE.getEditor('myEditor').sync();
$('#form')[0].submit();
})
//--自动切换提交地址----
var version = UE.getEditor('myEditor').options.imageUrl||"php",
form=$('#form')[0];
if(version.match(/php/)){
form.action="../php/getContent.php";
}else if(version.match(/net/)){
form.action="../net/getContent.ashx";
}else if(version.match(/jsp/)){
form.action="../jsp/getContent.jsp";
}
})
</script>
</head>
<body>
<form id="form" method="post" target="_blank">
<script type="text/plain" id="myEditor" name="myEditor">
<p>欢迎使用UEditor</p>
</script>
<input type="button" id="btn" value="提交数据">
</form>
</body>
</html>
\ No newline at end of file
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<title>Ueditor在jquery validation下的验证</title>
<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.8.3.min.js"></script>
<script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jquery.validate/1.10.0/jquery.validate.min.js"></script>
<script type="text/javascript" charset="utf-8" src="../editor_config.js"></script>
<!--开发版-->
<script type="text/javascript" charset="utf-8" src="editor_api.js"></script>
<script>
$(function(){
UE.getEditor('content').addListener('contentchange',function(){
this.sync();
//1.2.4+以后可以直接给textarea的id名字就行了
$('textarea').valid();
});
var validator = $("#myform").submit(function() {
UE.getEditor('content').sync();
}).validate({
ignore: "",
rules: {
title: "required",
content: "required"
},
errorPlacement: function(label, element) {
// position error label after generated textarea
if (element.is("textarea")) {
label.insertAfter(element.next());
} else {
label.insertAfter(element)
}
}
});
validator.focusInvalid = function() {
// put focus on tinymce on submit validation
if( this.settings.focusInvalid ) {
try {
var toFocus = $(this.findLastActive() || this.errorList.length && this.errorList[0].element || []);
if (toFocus.is("textarea")) {
UE.getEditor('content').focus()
} else {
toFocus.filter(":visible").focus();
}
} catch(e) {
// ignore IE throwing errors when focusing hidden elements
}
}
}
})
</script>
</head>
<body>
<form id="myform" action="">
<h3>Ueditor在jquery validation下的验证</h3>
<label>其他内容</label>
<input name="title" />
<br/>
<label>编辑器</label>
<textarea id="content" name="content" rows="15" cols="80" style="width: 80%"></textarea>
<br />
<input type="submit" name="save" value="Submit" />
</form>
</body>
</html>
\ No newline at end of file
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<title></title>
<script type="text/javascript" charset="utf-8" src="../editor_config.js"></script>
<!--使用版-->
<!--<script type="text/javascript" charset="utf-8" src="../editor_all.js"></script>-->
<!--开发版-->
<script type="text/javascript" charset="utf-8" src="editor_api.js"></script>
</head>
<body>
<h1>UEditor多实例</h1>
<!--style给定宽度可以影响编辑器的最终宽度-->
<script type="text/plain" id="myEditor1" style="margin-bottom:100px;">
</script>
<script type="text/plain" id="myEditor2" style="margin-bottom:100px;">
<p>这里我可以写一些输入提示</p>
</script>
<script type="text/plain" id="myEditor3" style="margin-bottom:100px;">
</script>
<script type="text/javascript">
UE.getEditor('myEditor1', {
theme:"default", //皮肤
lang:'zh-cn' //语言
});
UE.getEditor('myEditor2', {
autoClearinitialContent:true, //focus时自动清空初始化时的内容
theme:"gorgeous",
wordCount:true, //关闭字数统计
elementPathEnabled:false//关闭elementPath
});
UE.getEditor('myEditor3', {
//toolbars:[['FullScreen', 'Source', 'Undo', 'Redo','Bold']],//这里可以选择自己需要的工具按钮名称,此处仅选择如下五个
lang:"en",
theme:"modern"
//更多其他参数,请参考editor_config.js中的配置项
});
</script>
</body>
</html>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<script type="text/javascript" charset="utf-8" src="../editor_config.js"></script>
<!--使用版-->
<!--<script type="text/javascript" charset="utf-8" src="../editor_all.js"></script>-->
<!--开发版-->
<script type="text/javascript" charset="utf-8" src="editor_api.js"></script>
<title>表格内实例化编辑器实例</title>
</head>
<body>
<div style="height: 100px"></div>
<div id="div" style="border: 1px solid #fff">
<table border="1">
<caption>表格标题</caption>
<tr><th>标题</th><th>内容</th></tr>
<!--编辑器实例化到表格内部时,请在对应的单元格上明确标注宽度值(百分数或者直接数均可),否则有可能在工具栏浮动等功能状态下出现移位-->
<tr>
<td>中国</td><td width="100%"><textarea id="editor"></textarea></td>
</tr>
</table>
</div>
<script type="text/javascript">
var ue = new UE.ui.Editor();
ue.render('editor');
</script>
</body>
</html>
\ No newline at end of file
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=8">
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<title>重置编辑器</title>
<script type="text/javascript" charset="utf-8" src="../editor_config.js"></script>
<!--使用版-->
<!--<script type="text/javascript" charset="utf-8" src="../editor_all.js"></script>-->
<!--开发版-->
<script type="text/javascript" charset="utf-8" src="editor_api.js"></script>
<style type="text/css">
#simple {
width: 1000px;
border: 1px solid #ddd;
}
</style>
</head>
<body>
<h2>重置编辑器和销毁编辑器示例</h2>
<div class="content" id="simple"></div>
<p><input type="button" onclick="simple()" value="重置编辑器内部参数"><span id="txt"></span></p>
<p><input id="destroy" type="button" onclick="destroy()" value="销毁编辑器"></p>
<script type="text/javascript" charset="utf-8">
var editor = new baidu.editor.ui.Editor();
editor.render( "simple" );
function simple() {
if(editor){
editor.setContent("编辑器内部变量已经被重置!");
editor.reset();
}
}
function destroy(){
editor.destroy();
editor = null;
clearInterval(timer);
var button = document.getElementById("destroy");
button.value = "重新渲染";
button.onclick = function(){
editor = new baidu.editor.ui.Editor();
editor.render( "simple" );
this.value="销毁编辑器";
this.onclick = destroy;
}
}
function setMsg() {
if(editor && editor.undoManger){
document.getElementById( "txt" ).innerHTML = "编辑器当前保存了 <span style='color: red'> " + editor.undoManger.list.length + " </span>次操作";
}
}
var timer = setInterval( setMsg, 100 );
</script>
</body>
</html>
\ No newline at end of file
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<title></title>
<script type="text/javascript" charset="utf-8" src="../editor_config.js"></script>
<!--使用版-->
<!--<script type="text/javascript" charset="utf-8" src="../editor_all.js"></script>-->
<!--开发版-->
<script type="text/javascript" charset="utf-8" src="editor_api.js"></script>
</head>
<body>
<h1>UEditor简单功能</h1>
<!--style给定宽度可以影响编辑器的最终宽度-->
<script type="text/plain" id="myEditor">
<p>这里我可以写一些输入提示</p>
</script>
<script type="text/javascript">
// 自定义的编辑器配置项,此处定义的配置项将覆盖editor_config.js中的同名配置
var editorOption = {
//这里可以选择自己需要的工具按钮名称,此处仅选择如下五个
toolbars:[['FullScreen', 'Source', 'Undo', 'Redo','Bold']],
//focus时自动清空初始化时的内容
autoClearinitialContent:true,
//关闭字数统计
wordCount:false,
//关闭elementPath
elementPathEnabled:false
//更多其他参数,请参考editor_config.js中的配置项
};
var editor_a = new baidu.editor.ui.Editor(editorOption);
editor_a.render( 'myEditor' );
</script>
</body>
</html>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<title></title>
<script type="text/javascript" charset="utf-8" src="../editor_config.js"></script>
<!--使用版-->
<!--<script type="text/javascript" charset="utf-8" src="../editor_all.js"></script>-->
<!--开发版-->
<script type="text/javascript" charset="utf-8" src="editor_api.js"></script>
<style type="text/css">
body{
font-size:14px;
}
</style>
</head>
<body>
<h2>UEditor提交示例</h2>
<form id="form" method="post">
<script type="text/plain" id="myEditor" name="myEditor">
<p>欢迎使用UEditor</p>
</script>
<input type="submit" value="Form内部可以直接提交">
</form>
<button onclick="document.getElementById('form').submit()">Form外部直接提交会失败</button>
<input type="button" value="先点我一下同步内容,左边的哥们才能生效" onclick="editor_a.sync()" />
<p>=====================================华丽的分隔线=====================================</p>
<form id="form1" method="post">
<textarea id="myEditor1" name="myEditor1">这里的内容将会和html,body等标签一块提交</textarea>
</form>
<button onclick="editor_a1.sync();document.getElementById('form1').submit()">Form外部提交</button>
<script type="text/javascript">
var editor_a = UE.getEditor('myEditor',{
minFrameHeight:150
});
var editor_a1 = UE.getEditor('myEditor1',{
allHtmlEnabled:true,
minFrameHeight:150
});
//--自动切换提交地址----
var doc=document,
version=editor_a.options.imageUrl||"php",
form=doc.getElementById("form"),
form1=doc.getElementById("form1");
if(version.match(/php/)){
form1.action=form.action="../php/getContent.php";
}else if(version.match(/net/)){
form1.action=form.action="../net/getContent.ashx";
}else if(version.match(/jsp/)){
form1.action=form.action="../jsp/getContent.jsp";
}
//-----
</script>
</body>
</html>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<title></title>
<script type="text/javascript" charset="utf-8" src="../editor_config.js"></script>
<!--使用版-->
<!--<script type="text/javascript" charset="utf-8" src="../editor_all.js"></script>-->
<!--开发版-->
<script type="text/javascript" charset="utf-8" src="editor_api.js"></script>
<style type="text/css">
#myEditor{
width: 500px;
height: 300px;
}
</style>
</head>
<body>
<h1>UEditor简单功能</h1>
<!--style给定宽度可以影响编辑器的最终宽度-->
<textarea id="myEditor">这里是原始的textarea中的内容,可以从数据中读取</textarea>
<br/>
<input type="button" onclick="render()" value="渲染编辑器">
<script type="text/javascript">
var editor_a = new baidu.editor.ui.Editor();
//渲染编辑器
function render(){
editor_a.render('myEditor');
}
</script>
</body>
</html>
//本文件非编辑器核心文件,仅适用于生成对应的命令接口文档
/**
* @file
* @name 编辑器命令接口
* @short Commands
* @desc
*
* UEditor中执行命令的统一调用格式为
* <code>editor.execCommand("cmdName"[,opt]);</code>
*
*
* 检测当前命令是否可用的方法是
* <code>editor.queryCommandState("cmdName");</code>
*
*
* 部分命令可以返回命令值,其格式为
* <code>editor.queryCommandValue("cmdName");</code>
*/
/**
* 插入锚点
* @name anchor
* @grammar editor.execCommand("anchor","name"); //锚点的名字
*/
/**
* 为当前选中文字添加粗体效果
* @name bold
* @grammar editor.execCommand("bold");
*/
/**
* 为当前选中文字添加斜体效果
* @name italic
* @grammar editor.execCommand("italic");
*/
/**
* 为当前选中文字添加下划线效果
* @name underline
* @grammar editor.execCommand("underline");
*/
/**
* 为当前选中文字添加删除线效果
* @name strikethrough
* @grammar editor.execCommand("strikethrough");
*/
/**
* 将当前选中文字转换成上标
* @name superscript
* @grammar editor.execCommand("superscript");
*/
/**
* 将当前选中文字转换成下标
* @name subscript
* @grammar editor.execCommand("subscript");
*/
/**
* 为当前选中文字添加颜色
* @name foreColor
* @grammar editor.execCommand("foreColor","#ffffff");
*/
/**
* 为当前选中文字添加背景颜色
* @name backColor
* @grammar editor.execCommand("backColor","#dddddd");
*/
/**
* 设置当前选中文字的字体
* @name fontFamily
* @grammar editor.execCommand("fontFamily","微软雅黑,Microsoft YaHei");
*/
/**
* 设置当前选中文字的字号
* @name fontSize
* @grammar editor.execCommand("fontSize","32px");
*/
/**
* 设置当前选区的段落格式,如p,h1,h2,h3,...
* @name paragraph
* @grammar editor.execCommand("paragraph","h1");
*/
/**
* 将当前选区变换成有序或者无序列表
* @name insert(Un)OrderedList
* @grammar editor.execCommand("insertOrderedList");
*/
/**
* 设置当前选区的行间距
* @name lineHeight
* @grammar editor.execCommand("lineHeight");
*/
/**
* 设置当前选区中的字体对齐方式
* @name justify
* @grammar editor.execCommand("justify",align); //align可为Left,Right,Center,Justify
*/
/**
* 将当前选中文字中的字母转换成大写
* @name toUppercase
* @grammar editor.execCommand("toUppercase");
*/
/**
* 将当前选中文字中的字母转换成小写
* @name toLowercase
* @grammar editor.execCommand("toLowercase");
*/
/**
* 为当前选区所在的块级元素添加引用标记
* @name blockquote
* @grammar editor.execCommand("blockquote");
*/
/**
* 设置当前选区所在块级元素的文字输入方向
* @name directionality
* @grammar editor.execCommand("directionality",dir); //dir可为LTR,RTL
*/
/**
* 清除当前选中文字上的所有样式或者指定样式
* @name removeFormat
* @grammar editor.execCommand("removeFormat") //根据editor_config.js里的removeFormatTags,removeFormatAttributes两个属性作为规则
* @grammar editor.execCommand("removeFormat",tags,style); //清除指定tags上的指定style
* @example
* editor.execCommand("removeFormat",'span,a','color,background-color')
*/
/**
* 切换纯文本粘贴模式
* @name pastePlain
* @grammar ue.execCommand("pastePlain");
*/
/**
* 开启格式刷功能
* @name formatMatch
* @grammar editor.execCommand("formatMatch");
*/
/**
* 清空文档
* @name clearDoc
* @grammar editor.execCommand("clearDoc");
*/
/**
* 删除当前选中文本
* @name delete
* @grammar editor.execCommand("delete");
*/
/**
* 全部选择
* @name selectAll
* @grammar editor.execCommand("selectAll");
*/
/**
* 撤销操作
* @name undo
* @grammar editor.execCommand("undo");
*/
/**
* 恢复操作
* @name redo
* @grammar editor.execCommand("redo");
*/
/**
* 对整个编辑文档进行自动排版
* @name autoTypeset
* @grammar editor.execCommand("autoTypeset");
*/
/**
* 在当前选区位置插入一段html代码,最基本功能。大部分其他插入命令都会调用此命令完成最后的插入
* @name insertHtml
* @grammar editor.execCommand("insertHtml","欢迎使用UEditor!")
*/
/**
* 在当前选区位置插入一个超链接
* @name link
* @grammar editor.execCommand("link",linkObj);
* @example
* editor.execCommand("link",{
* href: "http://ueditor.baidu.com", //超链地址,必选
* data_ue_src: "http://ueditor.baidu.com", //UE内部使用参数,与href保持一致即可,可选
* target: "_self", //目标窗口,可选
* textValue: "UEditor", //链接显示文本,可选
* title: "百度开源富文本编辑器UEditor官网" //标题,可选
* })
*/
/**
* 在当前选区位置插入一个图片
* @name insertImage
* @grammar editor.execCommand("insertImage",imageObj);
* @example
* editor.execCommand("insertImage",{
* src: "http://ueditor.baidu.com/logo.jpg", //图片链接地址,必选
* data_ue_src: "http://ueditor.baidu.com/logo.jpg", //UE内部使用参数,与src保持一致即可,可选
* width: 300, //图片显示宽度,可选
* height: 400, //图片显示高度,可选
* border: 2, //图片边框,可选
* hspace: 5, //图片左右边距,可选
* vspace: 2, //图片上下边距,可选
* alt: 'UEditor-logo', //图片替换文字,可选
* title: "百度开源富文本编辑器UEditor官网" //图片标题,可选
* })
*/
/**
* 在当前选区位置插入一个视频
* @name insertVideo
* @grammar editor.execCommand("insertVideo",videoObj);
* @example
* editor.execCommand("insertVideo",{
* url: "http://youku.com/id?id=1233122", //视频地址,必选
* width: 420, //视频宽度,可选
* height: 280, //视频高度,可选
* align: "none" //对齐方式,支持right,left,center,none ,可选
* })
*/
/**
* 在当前选区位置插入一个日期或者时间
* @name date|time
* @grammar editor.execCommand("date");
*/
/**
* 在当前选区位置插入一个分页符标记
* @name pageBreak
* @grammar editor.execCommand("pageBreak");
*/
/**
* 切换源码编辑模式和富文本编辑模式
* @name source
* @grammar editor.execCommand("source");
*/
/**
* IE下进入截屏模式
* @name snapScreen
* @grammar editor.execCommand("snapScreen");
*/
/**
* 插入表格
* @name insertTable
* @grammar editor.execCommand("insertTable",rows,cols);
*/
/**
* 查找替换
* @name searchreplace
* @grammar editor.execCommand("searchreplace",opt);
* @desc
* opt是个json对象,属性如下
* * ''all'' true表示查找整个文档,false表示从上次的位置开始查找,默认是false
* * ''casesensitive'' 大小写铭感,true是铭感,默认是false
* * ''dir'' 1表示从前往后查,-1表示从后往前
* * ''searchStr'' 查找的字符串
* * ''replaceStr'' 替换用的字符串
*/
此差异已折叠。
/**
* @file
* @name UE.EventBase
* @short EventBase
* @import editor.js,core/utils.js
* @desc UE采用的事件基类,继承此类的对应类将获取addListener,removeListener,fireEvent方法。
* 在UE中,Editor以及所有ui实例都继承了该类,故可以在对应的ui对象以及editor对象上使用上述方法。
*/
var EventBase = UE.EventBase = function () {};
EventBase.prototype = {
/**
* 注册事件监听器
* @name addListener
* @grammar editor.addListener(types,fn) //types为事件名称,多个可用空格分隔
* @example
* editor.addListener('selectionchange',function(){
* console.log("选区已经变化!");
* })
* editor.addListener('beforegetcontent aftergetcontent',function(type){
* if(type == 'beforegetcontent'){
* //do something
* }else{
* //do something
* }
* console.log(this.getContent) // this是注册的事件的编辑器实例
* })
*/
addListener:function (types, listener) {
types = utils.trim(types).split(' ');
for (var i = 0, ti; ti = types[i++];) {
getListener(this, ti, true).push(listener);
}
},
/**
* 移除事件监听器
* @name removeListener
* @grammar editor.removeListener(types,fn) //types为事件名称,多个可用空格分隔
* @example
* //changeCallback为方法体
* editor.removeListener("selectionchange",changeCallback);
*/
removeListener:function (types, listener) {
types = utils.trim(types).split(' ');
for (var i = 0, ti; ti = types[i++];) {
utils.removeItem(getListener(this, ti) || [], listener);
}
},
/**
* 触发事件
* @name fireEvent
* @grammar editor.fireEvent(types) //types为事件名称,多个可用空格分隔
* @example
* editor.fireEvent("selectionchange");
*/
fireEvent:function (types) {
types = utils.trim(types).split(' ');
for (var i = 0, ti; ti = types[i++];) {
var listeners = getListener(this, ti),
r, t, k;
if (listeners) {
k = listeners.length;
while (k--) {
t = listeners[k].apply(this, arguments);
if (t !== undefined) {
r = t;
}
}
}
if (t = this['on' + ti.toLowerCase()]) {
r = t.apply(this, arguments);
}
}
return r;
}
};
/**
* 获得对象所拥有监听类型的所有监听器
* @public
* @function
* @param {Object} obj 查询监听器的对象
* @param {String} type 事件类型
* @param {Boolean} force 为true且当前所有type类型的侦听器不存在时,创建一个空监听器数组
* @returns {Array} 监听器数组
*/
function getListener(obj, type, force) {
var allListeners;
type = type.toLowerCase();
return ( ( allListeners = ( obj.__allListeners || force && ( obj.__allListeners = {} ) ) )
&& ( allListeners[type] || force && ( allListeners[type] = [] ) ) );
}
/**
* @file
* @name UE.ajax
* @short Ajax
* @desc UEditor内置的ajax请求模块
* @import core/utils.js
* @user: taoqili
* @date: 11-8-18
* @time: 下午3:18
*/
UE.ajax = function() {
/**
* 创建一个ajaxRequest对象
*/
var fnStr = 'XMLHttpRequest()';
try {
new ActiveXObject("Msxml2.XMLHTTP");
fnStr = 'ActiveXObject(\'Msxml2.XMLHTTP\')';
} catch (e) {
try {
new ActiveXObject("Microsoft.XMLHTTP");
fnStr = 'ActiveXObject(\'Microsoft.XMLHTTP\')'
} catch (e) {
}
}
var creatAjaxRequest = new Function('return new ' + fnStr);
/**
* 将json参数转化成适合ajax提交的参数列表
* @param json
*/
function json2str(json) {
var strArr = [];
for (var i in json) {
//忽略默认的几个参数
if(i=="method" || i=="timeout" || i=="async") continue;
//传递过来的对象和函数不在提交之列
if (!((typeof json[i]).toLowerCase() == "function" || (typeof json[i]).toLowerCase() == "object")) {
strArr.push( encodeURIComponent(i) + "="+encodeURIComponent(json[i]) );
}
}
return strArr.join("&");
}
return {
/**
* @name request
* @desc 发出ajax请求,ajaxOpt中默认包含method,timeout,async,data,onsuccess以及onerror等六个,支持自定义添加参数
* @grammar UE.ajax.request(url,ajaxOpt);
* @example
* UE.ajax.request('http://www.xxxx.com/test.php',{
* //可省略,默认POST
* method:'POST',
* //可以自定义参数
* content:'这里是提交的内容',
* //也可以直接传json,但是只能命名为data,否则当做一般字符串处理
* data:{
* name:'UEditor',
* age:'1'
* }
* onsuccess:function(xhr){
* console.log(xhr.responseText);
* },
* onerror:function(xhr){
* console.log(xhr.responseText);
* }
* })
* @param ajaxOptions
*/
request:function(url, ajaxOptions) {
var ajaxRequest = creatAjaxRequest(),
//是否超时
timeIsOut = false,
//默认参数
defaultAjaxOptions = {
method:"POST",
timeout:5000,
async:true,
data:{},//需要传递对象的话只能覆盖
onsuccess:function() {
},
onerror:function() {
}
};
if (typeof url === "object") {
ajaxOptions = url;
url = ajaxOptions.url;
}
if (!ajaxRequest || !url) return;
var ajaxOpts = ajaxOptions ? utils.extend(defaultAjaxOptions,ajaxOptions) : defaultAjaxOptions;
var submitStr = json2str(ajaxOpts); // { name:"Jim",city:"Beijing" } --> "name=Jim&city=Beijing"
//如果用户直接通过data参数传递json对象过来,则也要将此json对象转化为字符串
if (!utils.isEmptyObject(ajaxOpts.data)){
submitStr += (submitStr? "&":"") + json2str(ajaxOpts.data);
}
//超时检测
var timerID = setTimeout(function() {
if (ajaxRequest.readyState != 4) {
timeIsOut = true;
ajaxRequest.abort();
clearTimeout(timerID);
}
}, ajaxOpts.timeout);
var method = ajaxOpts.method.toUpperCase();
var str = url + (url.indexOf("?")==-1?"?":"&") + (method=="POST"?"":submitStr+ "&noCache=" + +new Date);
ajaxRequest.open(method, str, ajaxOpts.async);
ajaxRequest.onreadystatechange = function() {
if (ajaxRequest.readyState == 4) {
if (!timeIsOut && ajaxRequest.status == 200) {
ajaxOpts.onsuccess(ajaxRequest);
} else {
ajaxOpts.onerror(ajaxRequest);
}
}
};
if (method == "POST") {
ajaxRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
ajaxRequest.send(submitStr);
} else {
ajaxRequest.send(null);
}
}
};
}();
/**
* @file
* @name UE.browser
* @short Browser
* @desc UEditor中采用的浏览器判断模块
*/
var browser = UE.browser = function(){
var agent = navigator.userAgent.toLowerCase(),
opera = window.opera,
browser = {
/**
* 检测浏览器是否为IE
* @name ie
* @grammar UE.browser.ie => true|false
*/
ie : !!window.ActiveXObject,
/**
* 检测浏览器是否为Opera
* @name opera
* @grammar UE.browser.opera => true|false
*/
opera : ( !!opera && opera.version ),
/**
* 检测浏览器是否为webkit内核
* @name webkit
* @grammar UE.browser.webkit => true|false
*/
webkit : ( agent.indexOf( ' applewebkit/' ) > -1 ),
/**
* 检测浏览器是否为mac系统下的浏览器
* @name mac
* @grammar UE.browser.mac => true|false
*/
mac : ( agent.indexOf( 'macintosh' ) > -1 ),
/**
* 检测浏览器是否处于怪异模式
* @name quirks
* @grammar UE.browser.quirks => true|false
*/
quirks : ( document.compatMode == 'BackCompat' )
};
/**
* 检测浏览器是否处为gecko内核
* @name gecko
* @grammar UE.browser.gecko => true|false
*/
browser.gecko =( navigator.product == 'Gecko' && !browser.webkit && !browser.opera );
var version = 0;
// Internet Explorer 6.0+
if ( browser.ie ){
version = parseFloat( agent.match( /msie (\d+)/ )[1] );
/**
* 检测浏览器是否为 IE9 模式
* @name ie9Compat
* @grammar UE.browser.ie9Compat => true|false
*/
browser.ie9Compat = document.documentMode == 9;
/**
* 检测浏览器是否为 IE8 浏览器
* @name ie8
* @grammar UE.browser.ie8 => true|false
*/
browser.ie8 = !!document.documentMode;
/**
* 检测浏览器是否为 IE8 模式
* @name ie8Compat
* @grammar UE.browser.ie8Compat => true|false
*/
browser.ie8Compat = document.documentMode == 8;
/**
* 检测浏览器是否运行在 兼容IE7模式
* @name ie7Compat
* @grammar UE.browser.ie7Compat => true|false
*/
browser.ie7Compat = ( ( version == 7 && !document.documentMode )
|| document.documentMode == 7 );
/**
* 检测浏览器是否IE6模式或怪异模式
* @name ie6Compat
* @grammar UE.browser.ie6Compat => true|false
*/
browser.ie6Compat = ( version < 7 || browser.quirks );
}
// Gecko.
if ( browser.gecko ){
var geckoRelease = agent.match( /rv:([\d\.]+)/ );
if ( geckoRelease )
{
geckoRelease = geckoRelease[1].split( '.' );
version = geckoRelease[0] * 10000 + ( geckoRelease[1] || 0 ) * 100 + ( geckoRelease[2] || 0 ) * 1;
}
}
/**
* 检测浏览器是否为chrome
* @name chrome
* @grammar UE.browser.chrome => true|false
*/
if (/chrome\/(\d+\.\d)/i.test(agent)) {
browser.chrome = + RegExp['\x241'];
}
/**
* 检测浏览器是否为safari
* @name safari
* @grammar UE.browser.safari => true|false
*/
if(/(\d+\.\d)?(?:\.\d)?\s+safari\/?(\d+\.\d+)?/i.test(agent) && !/chrome/i.test(agent)){
browser.safari = + (RegExp['\x241'] || RegExp['\x242']);
}
// Opera 9.50+
if ( browser.opera )
version = parseFloat( opera.version() );
// WebKit 522+ (Safari 3+)
if ( browser.webkit )
version = parseFloat( agent.match( / applewebkit\/(\d+)/ )[1] );
/**
* 浏览器版本判断
* IE系列返回值为5,6,7,8,9,10等
* gecko系列会返回10900,158900等.
* webkit系列会返回其build号 (如 522等).
* @name version
* @grammar UE.browser.version => number
* @example
* if ( UE.browser.ie && UE.browser.version == 6 ){
* alert( "Ouch!居然是万恶的IE6!" );
* }
*/
browser.version = version;
/**
* 是否是兼容模式的浏览器
* @name isCompatible
* @grammar UE.browser.isCompatible => true|false
* @example
* if ( UE.browser.isCompatible ){
* alert( "你的浏览器相当不错哦!" );
* }
*/
browser.isCompatible =
!browser.mobile && (
( browser.ie && version >= 6 ) ||
( browser.gecko && version >= 10801 ) ||
( browser.opera && version >= 9.5 ) ||
( browser.air && version >= 1 ) ||
( browser.webkit && version >= 522 ) ||
false );
return browser;
}();
//快捷方式
var ie = browser.ie,
webkit = browser.webkit,
gecko = browser.gecko,
opera = browser.opera;
\ No newline at end of file
此差异已折叠。
///import editor.js
///import core/browser.js
///import core/dom/dom.js
///import core/dom/dtd.js
///import core/dom/domUtils.js
///import core/dom/Range.js
/**
* @class baidu.editor.dom.Selection Selection类
*/
(function () {
function getBoundaryInformation( range, start ) {
var getIndex = domUtils.getNodeIndex;
range = range.duplicate();
range.collapse( start );
var parent = range.parentElement();
//如果节点里没有子节点,直接退出
if ( !parent.hasChildNodes() ) {
return {container:parent, offset:0};
}
var siblings = parent.children,
child,
testRange = range.duplicate(),
startIndex = 0, endIndex = siblings.length - 1, index = -1,
distance;
while ( startIndex <= endIndex ) {
index = Math.floor( (startIndex + endIndex) / 2 );
child = siblings[index];
testRange.moveToElementText( child );
var position = testRange.compareEndPoints( 'StartToStart', range );
if ( position > 0 ) {
endIndex = index - 1;
} else if ( position < 0 ) {
startIndex = index + 1;
} else {
//trace:1043
return {container:parent, offset:getIndex( child )};
}
}
if ( index == -1 ) {
testRange.moveToElementText( parent );
testRange.setEndPoint( 'StartToStart', range );
distance = testRange.text.replace( /(\r\n|\r)/g, '\n' ).length;
siblings = parent.childNodes;
if ( !distance ) {
child = siblings[siblings.length - 1];
return {container:child, offset:child.nodeValue.length};
}
var i = siblings.length;
while ( distance > 0 ){
distance -= siblings[ --i ].nodeValue.length;
}
return {container:siblings[i], offset:-distance};
}
testRange.collapse( position > 0 );
testRange.setEndPoint( position > 0 ? 'StartToStart' : 'EndToStart', range );
distance = testRange.text.replace( /(\r\n|\r)/g, '\n' ).length;
if ( !distance ) {
return dtd.$empty[child.tagName] || dtd.$nonChild[child.tagName] ?
{container:parent, offset:getIndex( child ) + (position > 0 ? 0 : 1)} :
{container:child, offset:position > 0 ? 0 : child.childNodes.length}
}
while ( distance > 0 ) {
try {
var pre = child;
child = child[position > 0 ? 'previousSibling' : 'nextSibling'];
distance -= child.nodeValue.length;
} catch ( e ) {
return {container:parent, offset:getIndex( pre )};
}
}
return {container:child, offset:position > 0 ? -distance : child.nodeValue.length + distance}
}
/**
* 将ieRange转换为Range对象
* @param {Range} ieRange ieRange对象
* @param {Range} range Range对象
* @return {Range} range 返回转换后的Range对象
*/
function transformIERangeToRange( ieRange, range ) {
if ( ieRange.item ) {
range.selectNode( ieRange.item( 0 ) );
} else {
var bi = getBoundaryInformation( ieRange, true );
range.setStart( bi.container, bi.offset );
if ( ieRange.compareEndPoints( 'StartToEnd', ieRange ) != 0 ) {
bi = getBoundaryInformation( ieRange, false );
range.setEnd( bi.container, bi.offset );
}
}
return range;
}
/**
* 获得ieRange
* @param {Selection} sel Selection对象
* @return {ieRange} 得到ieRange
*/
function _getIERange( sel ) {
var ieRange;
//ie下有可能报错
try {
ieRange = sel.getNative().createRange();
} catch ( e ) {
return null;
}
var el = ieRange.item ? ieRange.item( 0 ) : ieRange.parentElement();
if ( ( el.ownerDocument || el ) === sel.document ) {
return ieRange;
}
return null;
}
var Selection = dom.Selection = function ( doc ) {
var me = this, iframe;
me.document = doc;
if ( ie ) {
iframe = domUtils.getWindow( doc ).frameElement;
domUtils.on( iframe, 'beforedeactivate', function () {
me._bakIERange = me.getIERange();
} );
domUtils.on( iframe, 'activate', function () {
try {
if ( !_getIERange( me ) && me._bakIERange ) {
me._bakIERange.select();
}
} catch ( ex ) {
}
me._bakIERange = null;
} );
}
iframe = doc = null;
};
Selection.prototype = {
/**
* 获取原生seleciton对象
* @public
* @function
* @name baidu.editor.dom.Selection.getNative
* @return {Selection} 获得selection对象
*/
getNative:function () {
var doc = this.document;
try {
return !doc ? null : ie ? doc.selection : domUtils.getWindow( doc ).getSelection();
} catch ( e ) {
return null;
}
},
/**
* 获得ieRange
* @public
* @function
* @name baidu.editor.dom.Selection.getIERange
* @return {ieRange} 返回ie原生的Range
*/
getIERange:function () {
var ieRange = _getIERange( this );
if ( !ieRange ) {
if ( this._bakIERange ) {
return this._bakIERange;
}
}
return ieRange;
},
/**
* 缓存当前选区的range和选区的开始节点
* @public
* @function
* @name baidu.editor.dom.Selection.cache
*/
cache:function () {
this.clear();
this._cachedRange = this.getRange();
this._cachedStartElement = this.getStart();
this._cachedStartElementPath = this.getStartElementPath();
},
getStartElementPath:function () {
if ( this._cachedStartElementPath ) {
return this._cachedStartElementPath;
}
var start = this.getStart();
if ( start ) {
return domUtils.findParents( start, true, null, true )
}
return [];
},
/**
* 清空缓存
* @public
* @function
* @name baidu.editor.dom.Selection.clear
*/
clear:function () {
this._cachedStartElementPath = this._cachedRange = this._cachedStartElement = null;
},
/**
* 编辑器是否得到了选区
*/
isFocus:function () {
try {
return browser.ie && _getIERange( this ) || !browser.ie && this.getNative().rangeCount ? true : false;
} catch ( e ) {
return false;
}
},
/**
* 获取选区对应的Range
* @public
* @function
* @name baidu.editor.dom.Selection.getRange
* @returns {baidu.editor.dom.Range} 得到Range对象
*/
getRange:function () {
var me = this;
function optimze( range ) {
var child = me.document.body.firstChild,
collapsed = range.collapsed;
while ( child && child.firstChild ) {
range.setStart( child, 0 );
child = child.firstChild;
}
if ( !range.startContainer ) {
range.setStart( me.document.body, 0 )
}
if ( collapsed ) {
range.collapse( true );
}
}
if ( me._cachedRange != null ) {
return this._cachedRange;
}
var range = new baidu.editor.dom.Range( me.document );
if ( ie ) {
var nativeRange = me.getIERange();
if ( nativeRange ) {
transformIERangeToRange( nativeRange, range );
} else {
optimze( range );
}
} else {
var sel = me.getNative();
if ( sel && sel.rangeCount ) {
var firstRange = sel.getRangeAt( 0 );
var lastRange = sel.getRangeAt( sel.rangeCount - 1 );
range.setStart( firstRange.startContainer, firstRange.startOffset ).setEnd( lastRange.endContainer, lastRange.endOffset );
if ( range.collapsed && domUtils.isBody( range.startContainer ) && !range.startOffset ) {
optimze( range );
}
} else {
//trace:1734 有可能已经不在dom树上了,标识的节点
if ( this._bakRange && domUtils.inDoc( this._bakRange.startContainer, this.document ) ){
return this._bakRange;
}
optimze( range );
}
}
return this._bakRange = range;
},
/**
* 获取开始元素,用于状态反射
* @public
* @function
* @name baidu.editor.dom.Selection.getStart
* @return {Element} 获得开始元素
*/
getStart:function () {
if ( this._cachedStartElement ) {
return this._cachedStartElement;
}
var range = ie ? this.getIERange() : this.getRange(),
tmpRange,
start, tmp, parent;
if ( ie ) {
if ( !range ) {
//todo 给第一个值可能会有问题
return this.document.body.firstChild;
}
//control元素
if ( range.item ){
return range.item( 0 );
}
tmpRange = range.duplicate();
//修正ie下<b>x</b>[xx] 闭合后 <b>x|</b>xx
tmpRange.text.length > 0 && tmpRange.moveStart( 'character', 1 );
tmpRange.collapse( 1 );
start = tmpRange.parentElement();
parent = tmp = range.parentElement();
while ( tmp = tmp.parentNode ) {
if ( tmp == start ) {
start = parent;
break;
}
}
} else {
range.shrinkBoundary();
start = range.startContainer;
if ( start.nodeType == 1 && start.hasChildNodes() ){
start = start.childNodes[Math.min( start.childNodes.length - 1, range.startOffset )];
}
if ( start.nodeType == 3 ){
return start.parentNode;
}
}
return start;
},
/**
* 得到选区中的文本
* @public
* @function
* @name baidu.editor.dom.Selection.getText
* @return {String} 选区中包含的文本
*/
getText:function () {
var nativeSel, nativeRange;
if ( this.isFocus() && (nativeSel = this.getNative()) ) {
nativeRange = browser.ie ? nativeSel.createRange() : nativeSel.getRangeAt( 0 );
return browser.ie ? nativeRange.text : nativeRange.toString();
}
return '';
}
};
})();
\ No newline at end of file
此差异已折叠。
///import editor.js
///import core/dom/dom.js
/**
* dtd html语义化的体现类
* @constructor
* @namespace dtd
*/
var dtd = dom.dtd = (function() {
function _( s ) {
for (var k in s) {
s[k.toUpperCase()] = s[k];
}
return s;
}
function X( t ) {
var a = arguments;
for ( var i=1; i<a.length; i++ ) {
var x = a[i];
for ( var k in x ) {
if (!t.hasOwnProperty(k)) {
t[k] = x[k];
}
}
}
return t;
}
var A = _({isindex:1,fieldset:1}),
B = _({input:1,button:1,select:1,textarea:1,label:1}),
C = X( _({a:1}), B ),
D = X( {iframe:1}, C ),
E = _({hr:1,ul:1,menu:1,div:1,blockquote:1,noscript:1,table:1,center:1,address:1,dir:1,pre:1,h5:1,dl:1,h4:1,noframes:1,h6:1,ol:1,h1:1,h3:1,h2:1}),
F = _({ins:1,del:1,script:1,style:1}),
G = X( _({b:1,acronym:1,bdo:1,'var':1,'#':1,abbr:1,code:1,br:1,i:1,cite:1,kbd:1,u:1,strike:1,s:1,tt:1,strong:1,q:1,samp:1,em:1,dfn:1,span:1}), F ),
H = X( _({sub:1,img:1,embed:1,object:1,sup:1,basefont:1,map:1,applet:1,font:1,big:1,small:1}), G ),
I = X( _({p:1}), H ),
J = X( _({iframe:1}), H, B ),
K = _({img:1,embed:1,noscript:1,br:1,kbd:1,center:1,button:1,basefont:1,h5:1,h4:1,samp:1,h6:1,ol:1,h1:1,h3:1,h2:1,form:1,font:1,'#':1,select:1,menu:1,ins:1,abbr:1,label:1,code:1,table:1,script:1,cite:1,input:1,iframe:1,strong:1,textarea:1,noframes:1,big:1,small:1,span:1,hr:1,sub:1,bdo:1,'var':1,div:1,object:1,sup:1,strike:1,dir:1,map:1,dl:1,applet:1,del:1,isindex:1,fieldset:1,ul:1,b:1,acronym:1,a:1,blockquote:1,i:1,u:1,s:1,tt:1,address:1,q:1,pre:1,p:1,em:1,dfn:1}),
L = X( _({a:0}), J ),//a不能被切开,所以把他
M = _({tr:1}),
N = _({'#':1}),
O = X( _({param:1}), K ),
P = X( _({form:1}), A, D, E, I ),
Q = _({li:1}),
R = _({style:1,script:1}),
S = _({base:1,link:1,meta:1,title:1}),
T = X( S, R ),
U = _({head:1,body:1}),
V = _({html:1});
var block = _({address:1,blockquote:1,center:1,dir:1,div:1,dl:1,fieldset:1,form:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,hr:1,isindex:1,menu:1,noframes:1,ol:1,p:1,pre:1,table:1,ul:1}),
//针对优酷的embed他添加了结束标识,导致粘贴进来会变成两个,暂时去掉 ,embed:1
empty = _({area:1,base:1,br:1,col:1,hr:1,img:1,input:1,link:1,meta:1,param:1,embed:1});
return _({
// $ 表示自定的属性
// body外的元素列表.
$nonBodyContent: X( V, U, S ),
//块结构元素列表
$block : block,
//内联元素列表
$inline : L,
$body : X( _({script:1,style:1}), block ),
$cdata : _({script:1,style:1}),
//自闭和元素
$empty : empty,
//不是自闭合,但不能让range选中里边
$nonChild : _({iframe:1,textarea:1}),
//列表元素列表
$listItem : _({dd:1,dt:1,li:1}),
//列表根元素列表
$list: _({ul:1,ol:1,dl:1}),
//不能认为是空的元素
$isNotEmpty : _({table:1,ul:1,ol:1,dl:1,iframe:1,area:1,base:1,col:1,hr:1,img:1,embed:1,input:1,link:1,meta:1,param:1}),
//如果没有子节点就可以删除的元素列表,像span,a
$removeEmpty : _({a:1,abbr:1,acronym:1,address:1,b:1,bdo:1,big:1,cite:1,code:1,del:1,dfn:1,em:1,font:1,i:1,ins:1,label:1,kbd:1,q:1,s:1,samp:1,small:1,span:1,strike:1,strong:1,sub:1,sup:1,tt:1,u:1,'var':1}),
$removeEmptyBlock : _({'p':1,'div':1}),
//在table元素里的元素列表
$tableContent : _({caption:1,col:1,colgroup:1,tbody:1,td:1,tfoot:1,th:1,thead:1,tr:1,table:1}),
//不转换的标签
$notTransContent : _({pre:1,script:1,style:1,textarea:1}),
html: U,
head: T,
style: N,
script: N,
body: P,
base: {},
link: {},
meta: {},
title: N,
col : {},
tr : _({td:1,th:1}),
img : {},
embed: {},
colgroup : _({thead:1,col:1,tbody:1,tr:1,tfoot:1}),
noscript : P,
td : P,
br : {},
th : P,
center : P,
kbd : L,
button : X( I, E ),
basefont : {},
h5 : L,
h4 : L,
samp : L,
h6 : L,
ol : Q,
h1 : L,
h3 : L,
option : N,
h2 : L,
form : X( A, D, E, I ),
select : _({optgroup:1,option:1}),
font : L,
ins : L,
menu : Q,
abbr : L,
label : L,
table : _({thead:1,col:1,tbody:1,tr:1,colgroup:1,caption:1,tfoot:1}),
code : L,
tfoot : M,
cite : L,
li : P,
input : {},
iframe : P,
strong : L,
textarea : N,
noframes : P,
big : L,
small : L,
span :_({'#':1,br:1}),
hr : L,
dt : L,
sub : L,
optgroup : _({option:1}),
param : {},
bdo : L,
'var' : L,
div : P,
object : O,
sup : L,
dd : P,
strike : L,
area : {},
dir : Q,
map : X( _({area:1,form:1,p:1}), A, F, E ),
applet : O,
dl : _({dt:1,dd:1}),
del : L,
isindex : {},
fieldset : X( _({legend:1}), K ),
thead : M,
ul : Q,
acronym : L,
b : L,
a : X( _({a:1}), J ),
blockquote :X(_({td:1,tr:1,tbody:1,li:1}),P),
caption : L,
i : L,
u : L,
tbody : M,
s : L,
address : X( D, I ),
tt : L,
legend : L,
q : L,
pre : X( G, C ),
p : X(_({'a':1}),L),
em :L,
dfn : L
});
})();
/**
* @file
* @name UE.filterWord
* @short filterWord
* @desc 用来过滤word粘贴过来的字符串
* @import editor.js,core/utils.js
* @anthor zhanyi
*/
var filterWord = UE.filterWord = function () {
//是否是word过来的内容
function isWordDocument( str ) {
return /(class="?Mso|style="[^"]*\bmso\-|w:WordDocument|<v:)/ig.test( str );
}
//去掉小数
function transUnit( v ) {
v = v.replace( /[\d.]+\w+/g, function ( m ) {
return utils.transUnitToPx(m);
} );
return v;
}
function filterPasteWord( str ) {
return str.replace( /[\t\r\n]+/g, "" )
.replace( /<!--[\s\S]*?-->/ig, "" )
//转换图片
.replace(/<v:shape [^>]*>[\s\S]*?.<\/v:shape>/gi,function(str){
//opera能自己解析出image所这里直接返回空
if(browser.opera){
return '';
}
try{
var width = str.match(/width:([ \d.]*p[tx])/i)[1],
height = str.match(/height:([ \d.]*p[tx])/i)[1],
src = str.match(/src=\s*"([^"]*)"/i)[1];
return '<img width="'+ transUnit(width) +'" height="'+transUnit(height) +'" src="' + src + '" />';
} catch(e){
return '';
}
})
//针对wps添加的多余标签处理
.replace(/<\/?div[^>]*>/g,'')
//去掉多余的属性
.replace( /v:\w+=(["']?)[^'"]+\1/g, '' )
.replace( /<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|xml|meta|link|style|\w+:\w+)(?=[\s\/>]))[^>]*>/gi, "" )
.replace( /<p [^>]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi, "<p><strong>$1</strong></p>" )
//去掉多余的属性
.replace( /\s+(class|lang|align)\s*=\s*(['"]?)[\w-]+\2/ig, "" )
//清除多余的font/span不能匹配&nbsp;有可能是空格
.replace( /<(font|span)[^>]*>\s*<\/\1>/gi, '' )
//处理style的问题
.replace( /(<[a-z][^>]*)\sstyle=(["'])([^\2]*?)\2/gi, function( str, tag, tmp, style ) {
var n = [],
s = style.replace( /^\s+|\s+$/, '' )
.replace(/&#39;/g,'\'')
.replace( /&quot;/gi, "'" )
.split( /;\s*/g );
for ( var i = 0,v; v = s[i];i++ ) {
var name, value,
parts = v.split( ":" );
if ( parts.length == 2 ) {
name = parts[0].toLowerCase();
value = parts[1].toLowerCase();
if(/^(background)\w*/.test(name) && value.replace(/(initial|\s)/g,'').length == 0
||
/^(margin)\w*/.test(name) && /^0\w+$/.test(value)
){
continue;
}
switch ( name ) {
case "mso-padding-alt":
case "mso-padding-top-alt":
case "mso-padding-right-alt":
case "mso-padding-bottom-alt":
case "mso-padding-left-alt":
case "mso-margin-alt":
case "mso-margin-top-alt":
case "mso-margin-right-alt":
case "mso-margin-bottom-alt":
case "mso-margin-left-alt":
//ie下会出现挤到一起的情况
//case "mso-table-layout-alt":
case "mso-height":
case "mso-width":
case "mso-vertical-align-alt":
//trace:1819 ff下会解析出padding在table上
if(!/<table/.test(tag))
n[i] = name.replace( /^mso-|-alt$/g, "" ) + ":" + transUnit( value );
continue;
case "horiz-align":
n[i] = "text-align:" + value;
continue;
case "vert-align":
n[i] = "vertical-align:" + value;
continue;
case "font-color":
case "mso-foreground":
n[i] = "color:" + value;
continue;
case "mso-background":
case "mso-highlight":
n[i] = "background:" + value;
continue;
case "mso-default-height":
n[i] = "min-height:" + transUnit( value );
continue;
case "mso-default-width":
n[i] = "min-width:" + transUnit( value );
continue;
case "mso-padding-between-alt":
n[i] = "border-collapse:separate;border-spacing:" + transUnit( value );
continue;
case "text-line-through":
if ( (value == "single") || (value == "double") ) {
n[i] = "text-decoration:line-through";
}
continue;
case "mso-zero-height":
if ( value == "yes" ) {
n[i] = "display:none";
}
continue;
case 'background':
if(value == 'initial'){
}
break;
case 'margin':
if ( !/[1-9]/.test( value ) ) {
continue;
}
}
if ( /^(mso|column|font-emph|lang|layout|line-break|list-image|nav|panose|punct|row|ruby|sep|size|src|tab-|table-border|text-(?:decor|trans)|top-bar|version|vnd|word-break)/.test( name )
||
/text\-indent|padding|margin/.test(name) && /\-[\d.]+/.test(value)
) {
continue;
}
n[i] = name + ":" + parts[1];
}
}
return tag + (n.length ? ' style="' + n.join( ';').replace(/;{2,}/g,';') + '"' : '');
})
.replace(/[\d.]+(cm|pt)/g,function(str){
return utils.transUnitToPx(str)
})
}
return function ( html ) {
return (isWordDocument( html ) ? filterPasteWord( html ) : html).replace( />[ \t\r\n]*</g, '><' );
};
}();
\ No newline at end of file
此差异已折叠。
/**
* @file
* @name 编辑器事件接口
* @short Custom events
* @des 本文件非编辑器核心文件,仅适用于生成对应的事件接口文档
* UEditor编辑器中的所有事件监听和触发都统一采用
* ''editor''是编辑器实例
* editor.addListener("eventName",handler) 和 editor.fireEvent("eventName")方式调用,支持浏览器原生事件,如keydown,keyup,mousedown,mouseup等
*/
/**
* 编辑器加载完成事件(核心),在编辑器准备好所有运行条件时触发,大部分场景可以使用editor.ready(fn)取代。
* @name ready
* @grammar editor.addListener("ready",fn)
* @example
* editor.addListener("ready",function(){
* //this为editor实例
* this.setContent("欢迎使用UEditor!");
* })
* //同如下接口方式调用
* editor.ready(function(){
* this.setContent("欢迎使用UEditor!");
* })
*/
/**
* 选区变化事件(核心),当选区出现变化时触发。
* 在UEditor中,任何涉及到光标改变的操作都会触发选区变化事件,该事件主要用来实现工具栏状态反射。
* @name selectionChange
* @grammar editor.addListener("selectionChange",fn)
* @grammar editor.fireEvent("selectionChange")
* @example
* editor.addListener("selectionChange",function(){
* //this为editor实例
* })
*/
/**
* 内容变化事件(核心),当编辑区域中的文本内容出现变化时触发
* @name contentChange
* @grammar editor.addListener("contentChange",fn)
* @grammar editor.fireEvent("contentChange")
*/
/**
* 粘贴事件(核心),当使用ctr+v快捷键粘贴(包括Chrome、FF浏览器的右键粘贴)时会触发本事件
* @name (before|after)Paste
* @grammar editor.addListener("beforePaste",fn)
* @desc
* * beforePaste 在将粘贴的内容写到编辑器之前触发,这个事件触发时,粘贴的内容还未在编辑器内显示
* * afterPaste 粘贴的内容已经写到编辑器里边后触发
* @example
* editor.addListener("beforePaste",function(type,data){
* //beforePaste事件监听区别于afterPaste事件监听最主要的一个方面是存在一个data参数,
* //该data参数是一个对象,包含属性html。
* //若用户在此处更改该html的值时,将会影响粘贴到编辑器中的内容,主要用于粘贴时需要特殊处理的一些场景。
* console.log(this.getContent) //this都是当前编辑器的实例
* //before事件才用这个参数,用来在写出编辑器之前对粘贴进来的内容进行最后的修改
* data.html = "我把粘贴内容改成了这句话";
* })
*/
/**
* 设置内容事件(核心),当调用setContent方法时触发
* @name (before|after)SetContent
* @grammar editor.addListener("beforeSetContent",fn)
* @desc
* * beforeSetContent 在内容写到编辑器之前触发
* * afterSetContent 内容已经写到编辑器里边后触发
* @example
* editor.addListener("beforeSetContent",function(type,data){
* //beforeSetContent事件监听区别于afterSetContent事件监听最主要的一个方面是存在一个data参数,
* //该data参数是一个对象,包含属性html。
* //若用户在此处更改该html的值时,将会影响设置到编辑器中的内容,主要用于设置内容时需要特殊处理的一些场景。
* data.html = "我把设置内容改成了这句话";
* })
*/
/**
* getAllHtml事件,当调用getAllHtml方法时触发
* @name getAllHtml
* @grammar editor.addListener("getAllHtml",fn)
* @desc
* * 主要用来对于生成的整个html代码中的head内容进行定制,比如你想插入你自己的样式,script标签等,用来在展示时使用
* @example
* editor.addListener("getAllHtml",function(type,data){
* //data是document中head部分html的封装,可通过data.html来获取对应字符串。
* //需要修改的话得重新赋值data.html = '<style type="text/css"> body{margin:0;}</style>';
* })
*/
/**
* 内容提交事件(插件),当内容提交插件加载并调用了autosubmit命令时触发,多用于提交之前的验证
* @name beforeSubmit
* @grammar editor.addListener("beforeSubmit",fn) //若fn返回false,则阻止本次提交
* @example
* editor.addListener("beforeSubmit",function(){
* if(!editor.hasContents()){
* return false;
* }
* })
*/
/**
* 如果抓取远程的图片失败了,就触发
* @name catchRemoteError
* @grammar editor.addListener("catchRemoteError",fn)
* @example
* editor.addListener("catchRemoteError",function(){
* console.log("抓取失败了!")
* })
*/
/**
* 当抓取远程的图片成功并会返回生成图片的链接时触发
* @name catchRemoterSuccess
* @grammar editor.addListener("catchRemoterSuccess",fn)
* @example
* editor.addListener("catchRemoterSuccess",function(){
* console.log("抓取成功")
* })
*/
/**
* 编辑模式切换事件(插件),当源码模式和富文本模式发生切换时触发事件
* @name sourceModeChanged
* @grammar editor.addListener("sourceModeChanged",fn)
* @example
* editor.addListener("sourceModeChanged",function(type,mode){
* //mode代表了当前的编辑模式,true代表切换到了源码模式,false代表切换到了富文本模式
* })
*/
/**
* 全屏切换事件(插件),当执行全屏切换的时候触发事件
* @name fullScreenChanged
* @grammar editor.addListener("fullScreenChanged",fn)
* @example
* editor.addListener("fullScreenChanged",function(type,mode){
* //mode代表当前是否全屏,true代表切换到了全屏模式,false代表切换到了普通模式
* })
*/
/**
* 字数超出限制事件(插件),当输入的字符数超出配置项配置时触发
* @name wordCountOverflow
* @grammar editor.addListener("wordCountOverflow",fn)
* @example
* editor.addListener("wordCountOverflow",function(type,length){
* console.log(length)
* })
*/
UEDITOR_CONFIG = window.UEDITOR_CONFIG || {};
var baidu = window.baidu || {};
window.baidu = baidu;
window.UE = baidu.editor = {};
UE.plugins = {};
UE.commands = {};
UE.instants = {};
UE.I18N = {};
UE.version = "1.2.4.0";
var dom = UE.dom = {};
\ No newline at end of file
///import core
///commands 锚点
///commandsName Anchor
///commandsTitle 锚点
///commandsDialog dialogs\anchor\anchor.html
/**
* 锚点
* @function
* @name baidu.editor.execCommands
* @param {String} cmdName cmdName="anchor"插入锚点
*/
UE.plugins['anchor'] = function (){
var me = this;
me.ready(function(){
utils.cssRule('anchor',
'.anchorclass{background: url(\'' + me.options.UEDITOR_HOME_URL + 'themes/default/images/anchor.gif\') no-repeat scroll left center transparent;border: 1px dotted #0000FF;cursor: auto;display: inline-block;height: 16px;width: 15px;}',me.document)
});
me.commands['anchor'] = {
execCommand:function (cmd, name) {
var range = this.selection.getRange(),img = range.getClosedNode();
if (img && img.getAttribute('anchorname')) {
if (name) {
img.setAttribute('anchorname', name);
} else {
range.setStartBefore(img).setCursor();
domUtils.remove(img);
}
} else {
if (name) {
//只在选区的开始插入
var anchor = this.document.createElement('img');
range.collapse(true);
domUtils.setAttributes(anchor,{
'anchorname':name,
'class':'anchorclass'
});
range.insertNode(anchor).setStartAfter(anchor).setCursor(false,true);
}
}
},
queryCommandState:function () {
return this.highlight ? -1 : 0;
}
};
};
///import core
///commandsName attachment
///commandsTitle 附件上传
UE.commands["attachment"] = {
queryCommandState:function(){
return this.highlight ? -1 :0;
}
};
\ No newline at end of file
此差异已折叠。
此差异已折叠。
此差异已折叠。
UE.commands['autosubmit'] = {
execCommand:function () {
var me=this,
form = domUtils.findParentByTagName(me.iframe,"form", false);
if (form) {
if(me.fireEvent("beforesubmit")===false){
return;
}
me.sync();
form.submit();
}
}
};
\ No newline at end of file
此差异已折叠。
(function() {
UE.plugins['background'] = function(){
var me = this;
UE.commands['background'] = {
queryCommandState : function(){
return this.highlight ? -1 : 0;
}
};
me.addListener("getAllHtml",function(type,headHtml){
var body = this.body,
su = domUtils.getComputedStyle(body,"background-image"),
url="";
if(su.indexOf(me.options.imagePath)>0){
url = su.substring(su.indexOf(me.options.imagePath),su.length-1).replace(/"|\(|\)/ig,"");
}else{
url = su!="none" ? su.replace(/url\("?|"?\)/ig,""):"";
}
headHtml.html += '<style type="text/css">body{';
var bgObj = {
"background-color" : domUtils.getComputedStyle(body,"background-color")||"#ffffff",
'background-image' : url ? 'url('+url+')' : '',
'background-repeat':domUtils.getComputedStyle(body,"background-repeat")||"",
'background-position': browser.ie?(domUtils.getComputedStyle(body,"background-position-x")+" "+domUtils.getComputedStyle(body,"background-position-y")):domUtils.getComputedStyle(body,"background-position"),
'height':domUtils.getComputedStyle(body,"height")
};
for ( var name in bgObj ) {
if ( bgObj.hasOwnProperty( name ) ) {
headHtml.html += name+":"+bgObj[name]+";";
}
}
headHtml.html += '}</style> ';
});
}
})();
\ No newline at end of file
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
///import core
///import plugins\image.js
///commands 插入表情
///commandsName Emotion
///commandsTitle 表情
///commandsDialog dialogs\emotion\emotion.html
UE.commands['emotion'] = {
queryCommandState : function(){
return this.highlight ? -1 :0;
}
};
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册