diff --git a/_src/api.js b/_src/api.js
new file mode 100644
index 000000000..bb206ca62
--- /dev/null
+++ b/_src/api.js
@@ -0,0 +1,62 @@
+/**
+ * 该文件定义了API文档所使用到的本地函数的说明
+ * @file
+ * @module Native
+ */
+
+/**
+ * 辅助接口说明
+ * @module Native
+ * @unfile
+ */
+
+/**
+ * 原生String对象, 字符串
+ * @class String
+ */
+
+/**
+ * 原生Function对象, 函数
+ * @class Function
+ */
+
+/**
+ * 原生Object对象, 普通对象
+ * @remind 如果某一方法的参数类型为Object时, 表示该参数应该接受一个key-value集合
+ * @class Object
+ */
+
+/**
+ * 原生Boolean对象, 布尔值
+ * @class Boolean
+ */
+
+/**
+ * 原生Number对象, 数值
+ * @class Number
+ */
+
+/**
+ * 原生NULL对象, 空
+ * @class NULL
+ */
+
+/**
+ * 原生Array对象, 数组
+ * @class Array
+ */
+
+/**
+ * 浏览器Node, dom节点
+ * @class Node
+ */
+
+/**
+ * 浏览器Element, dom元素
+ * @class Element
+ */
+
+/**
+ * UEditor模拟dom节点对象
+ * @class uNode
+ */
\ No newline at end of file
diff --git a/_src/commands.js b/_src/commands.js
deleted file mode 100755
index ffd77a966..000000000
--- a/_src/commands.js
+++ /dev/null
@@ -1,257 +0,0 @@
-//本文件非编辑器核心文件,仅适用于生成对应的命令接口文档
-/**
- * @file
- * @name 编辑器命令接口
- * @short Commands
- * @desc
- *
- * UEditor中执行命令的统一调用格式为
- * editor.execCommand("cmdName"[,opt]);
- *
- *
- * 检测当前命令是否可用的方法是
- * editor.queryCommandState("cmdName");
- *
- *
- * 部分命令可以返回命令值,其格式为
- * editor.queryCommandValue("cmdName");
- */
-/**
- * 插入锚点
- * @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") //根据ueditor.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", //超链地址,必选
- * _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", //图片链接地址,必选
- * _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'' 替换用的字符串
- */
-
-
-
-
-
-
-
-
-
diff --git a/_src/core/Editor.js b/_src/core/Editor.js
index 2cc367d7e..687e919eb 100644
--- a/_src/core/Editor.js
+++ b/_src/core/Editor.js
@@ -1,18 +1,33 @@
/**
+ * 编辑器主类,包含编辑器提供的大部分公用接口
* @file
- * @name UE.Editor
- * @short Editor
- * @import editor.js,core/utils.js,core/EventBase.js,core/browser.js,core/dom/dtd.js,core/dom/domUtils.js,core/dom/Range.js,core/dom/Selection.js,plugins/serialize.js
- * @desc 编辑器主类,包含编辑器提供的大部分公用接口
+ * @module UE
+ * @class Editor
+ * @since 1.2.6.1
*/
+
+/**
+ * UEditor公用空间,UEditor所有的功能都挂载在该空间下
+ * @unfile
+ * @module UE
+ */
+
+/**
+ * UEditor的核心类,为用户提供与编辑器交互的接口。
+ * @unfile
+ * @module UE
+ * @class Editor
+ */
+
(function () {
var uid = 0, _selectionChangeTimer;
+
/**
+ * 获取编辑器的html内容,赋值到编辑器所在表单的textarea文本域里面
* @private
- * @ignore
- * @param form 编辑器所在的form元素
- * @param editor 编辑器实例对象
+ * @method setValue
+ * @param { UE.Editor } editor 编辑器事例
*/
function setValue(form, editor) {
var textarea;
@@ -41,7 +56,14 @@
(editor.options.allHtmlEnabled ? editor.getAllHtml() : editor.getContent(null, null, true)) :
''
}
- function loadPlugins(me){
+
+ /**
+ * 初始化插件
+ * @private
+ * @method loadPlugins
+ * @param { UE.Editor } editor 编辑器事例
+ */
+ function loadPlugins(me) {
//初始化插件
for (var pi in UE.plugins) {
UE.plugins[pi].call(me);
@@ -50,21 +72,168 @@
me.fireEvent("langReady");
}
- function checkCurLang(I18N){
- for(var lang in I18N){
+
+ /**
+ * 获取语言包列里面的第一种语言
+ * @private
+ * @method checkCurLang
+ * @param { Object } I18N 编辑器事例
+ */
+ function checkCurLang(I18N) {
+ for (var lang in I18N) {
return lang
}
}
+
+ /**
+ * 编辑器准备就绪后会触发该事件
+ * @module UE
+ * @class Editor
+ * @event ready
+ * @remind render方法执行完成之后,会触发该事件
+ * @remind
+ * @example
+ * ```javascript
+ * editor.addListener( 'ready', function( editor ) {
+ * editor.execCommand( 'focus' ); //编辑器家在完成后,让编辑器拿到焦点
+ * } );
+ * ```
+ */
+ /**
+ * 执行destroy方法,会触发该事件
+ * @module UE
+ * @class Editor
+ * @event destroy
+ * @see UE.Editor:destroy()
+ */
+ /**
+ * 执行reset方法,会触发该事件
+ * @module UE
+ * @class Editor
+ * @event reset
+ * @see UE.Editor:reset()
+ */
+ /**
+ * 执行focus方法,会触发该事件
+ * @module UE
+ * @class Editor
+ * @event focus
+ * @see UE.Editor:focus(Boolean)
+ */
+ /**
+ * 语言加载完成会触发该事件
+ * @module UE
+ * @class Editor
+ * @event langReady
+ */
+ /**
+ * 运行命令之后会触发该命令
+ * @module UE
+ * @class Editor
+ * @event beforeExecCommand
+ */
+ /**
+ * 运行命令之后会触发该命令
+ * @module UE
+ * @class Editor
+ * @event afterExecCommand
+ */
+ /**
+ * 运行命令之前会触发该命令
+ * @module UE
+ * @class Editor
+ * @event firstBeforeExecCommand
+ */
+ /**
+ * 在getContent方法执行之前会触发该事件
+ * @module UE
+ * @class Editor
+ * @event beforeGetContent
+ * @see UE.Editor:getContent()
+ */
+ /**
+ * 在getContent方法执行之后会触发该事件
+ * @module UE
+ * @class Editor
+ * @event afterGetContent
+ * @see UE.Editor:getContent()
+ */
+ /**
+ * 在getAllHtml方法执行时会触发该事件
+ * @module UE
+ * @class Editor
+ * @event getAllHtml
+ * @see UE.Editor:getAllHtml()
+ */
+ /**
+ * 在setContent方法执行之前会触发该事件
+ * @module UE
+ * @class Editor
+ * @event beforeSetContent
+ * @see UE.Editor:setContent(String)
+ */
+ /**
+ * 在setContent方法执行之后会触发该事件
+ * @module UE
+ * @class Editor
+ * @event afterSetContent
+ * @see UE.Editor:setContent(String)
+ */
+ /**
+ * 每当编辑器内部选区发生改变时,将触发该事件
+ * @event selectionchange
+ * @warning 该事件的触发非常频繁,不建议在该事件的处理过程中做重量级的处理
+ * @example
+ * ```javascript
+ * editor.addListener( 'selectionchange', function( editor ) {
+ * console.log('选区发生改变');
+ * }
+ */
+ /**
+ * 在所有selectionchange的监听函数执行之前,会触发该事件
+ * @module UE
+ * @class Editor
+ * @event beforeSelectionChange
+ * @see UE.Editor:selectionchange
+ */
/**
- * UEditor编辑器类
- * @name Editor
- * @desc 创建一个跟编辑器实例
- * - ***container*** 编辑器容器对象
- * - ***iframe*** 编辑区域所在的iframe对象
- * - ***window*** 编辑区域所在的window
- * - ***document*** 编辑区域所在的document对象
- * - ***body*** 编辑区域所在的body对象
- * - ***selection*** 编辑区域的选区对象
+ * 在所有selectionchange的监听函数执行完之后,会触发该事件
+ * @module UE
+ * @class Editor
+ * @event afterSelectionChange
+ * @see UE.Editor:selectionchange
+ */
+ /**
+ * 编辑器内容发生改变时会触发该事件
+ * @module UE
+ * @class Editor
+ * @event contentChange
+ */
+
+
+ /**
+ * 以默认参数构建一个编辑器实例
+ * @constructor
+ * @remind 通过 改构造方法实例化的编辑器,不带ui层.需要render到一个容器,编辑器实例才能正常渲染到页面
+ * @example
+ * ```javascript
+ * var editor = new UE.Editor();
+ * editor.execCommand('blod');
+ * ```
+ * @see UE.Config
+ */
+
+ /**
+ * 以给定的参数集合创建一个编辑器实例,对于未指定的参数,将应用默认参数。
+ * @constructor
+ * @remind 通过 改构造方法实例化的编辑器,不带ui层.需要render到一个容器,编辑器实例才能正常渲染到页面
+ * @param { Object } setting 创建编辑器的参数
+ * @example
+ * ```javascript
+ * var editor = new UE.Editor();
+ * editor.execCommand('blod');
+ * ```
+ * @see UE.Config
*/
var Editor = UE.Editor = function (options) {
var me = this;
@@ -79,7 +248,7 @@
me.setOpt({
isShow: true,
initialContent: '',
- initialStyle:'',
+ initialStyle: '',
autoClearinitialContent: false,
iframeCssUrl: me.options.UEDITOR_HOME_URL + 'themes/iframe.css',
textarea: 'editorValue',
@@ -99,14 +268,14 @@
allHtmlEnabled: false,
scaleEnabled: false,
tableNativeEditInFF: false,
- autoSyncData : true
+ autoSyncData: true
});
- if(!utils.isEmptyObject(UE.I18N)){
+ if (!utils.isEmptyObject(UE.I18N)) {
//修改默认的语言类型
me.options.lang = checkCurLang(UE.I18N);
loadPlugins(me)
- }else{
+ } else {
utils.loadFile(document, {
src: me.options.langPath + me.options.lang + "/" + me.options.lang + ".js",
tag: "script",
@@ -120,17 +289,21 @@
UE.instants['ueditorInstant' + me.uid] = me;
};
Editor.prototype = {
+
+
/**
- * 当编辑器ready后执行传入的fn,如果编辑器已经完成ready,就马上执行fn,fn的中的this是编辑器实例。
- * 大部分的实例接口都需要放在该方法内部执行,否则在IE下可能会报错。
- * @name ready
- * @grammar editor.ready(fn) fn是当编辑器渲染好后执行的function
+ * 编辑器对外提供的监听ready事件的接口, 通过调用该方法,达到的效果与监听ready事件是一致的
+ * @method ready
+ * @param { Function } fn 编辑器ready之后所执行的回调, 如果在注册事件之前编辑器已经ready,将会
+ * 立即触发该回调。
+ * @remind 需要等待编辑器加载完成后才能执行的代码,可以使用该方法传入
* @example
- * var editor = new UE.ui.Editor();
- * editor.render("myEditor");
- * editor.ready(function(){
- * editor.setContent("欢迎使用UEditor!");
- * })
+ * ```javascript
+ * editor.ready( function( editor ) {
+ * editor.setContent('初始化完毕');
+ * } );
+ * ```
+ * @see UE.Editor.event:ready
*/
ready: function (fn) {
var me = this;
@@ -138,10 +311,33 @@
me.isReady ? fn.apply(me) : me.addListener('ready', fn);
}
},
+
+
+ /**
+ * 该方法是提供给插件里面使用,设置配置项默认值
+ * @method setOpt
+ * @warning 三处设置配置项的优先级: 实例化时传入参数 > setOpt()设置 > config文件里设置
+ * @warning 该方法仅供编辑器插件内部和编辑器初始化时调用,其他地方不能调用。
+ * @param { String } key 编辑器的可接受的选项名称
+ * @param { * } val 该选项可接受的值
+ * @example
+ * ```javascript
+ * editor.setOpt( 'initContent', '欢迎使用编辑器' );
+ * ```
+ */
+
/**
- * 为编辑器设置默认参数值。若用户配置为空,则以默认配置为准
- * @grammar editor.setOpt(key,value); //传入一个键、值对
- * @grammar editor.setOpt({ key:value}); //传入一个json对象
+ * 该方法是提供给插件里面使用,以{key:value}集合的方式设置插件内用到的配置项默认值
+ * @method setOpt
+ * @warning 三处设置配置项的优先级: 实例化时传入参数 > setOpt()设置 > config文件里设置
+ * @warning 该方法仅供编辑器插件内部和编辑器初始化时调用,其他地方不能调用。
+ * @param { Object } options 将要设置的选项的键值对对象
+ * @example
+ * ```javascript
+ * editor.setOpt( {
+ * 'initContent': '欢迎使用编辑器'
+ * } );
+ * ```
*/
setOpt: function (key, val) {
var obj = {};
@@ -152,10 +348,15 @@
}
utils.extend(this.options, obj, true);
},
+
+
/**
- * 销毁编辑器实例对象
- * @name destroy
- * @grammar editor.destroy();
+ * 销毁编辑器实例,使用textarea代替
+ * @method destroy
+ * @example
+ * ```javascript
+ * editor.destroy();
+ * ```
*/
destroy: function () {
@@ -185,83 +386,94 @@
}
UE.delEditor(key);
},
+
/**
- * 渲染编辑器的DOM到指定容器,必须且只能调用一次
- * @name render
- * @grammar editor.render(containerId); //可以指定一个容器ID
- * @grammar editor.render(containerDom); //也可以直接指定容器对象
+ * 渲染编辑器的DOM到指定容器
+ * @method render
+ * @param { String } containerId 指定一个容器ID
+ * @remind 执行该方法,会触发ready事件
+ * @warning 必须且只能调用一次
+ */
+
+ /**
+ * 渲染编辑器的DOM到指定容器
+ * @method render
+ * @param { Element } containerDom 直接指定容器对象
+ * @remind 执行该方法,会触发ready事件
+ * @warning 必须且只能调用一次
*/
render: function (container) {
var me = this,
options = me.options,
- getStyleValue=function(attr){
- return parseInt(domUtils.getComputedStyle(container,attr));
+ getStyleValue = function (attr) {
+ return parseInt(domUtils.getComputedStyle(container, attr));
};
if (utils.isString(container)) {
container = document.getElementById(container);
}
if (container) {
- if(options.initialFrameWidth){
+ if (options.initialFrameWidth) {
options.minFrameWidth = options.initialFrameWidth
- }else{
+ } else {
options.minFrameWidth = options.initialFrameWidth = container.offsetWidth;
}
- if(options.initialFrameHeight){
+ if (options.initialFrameHeight) {
options.minFrameHeight = options.initialFrameHeight
- }else{
+ } else {
options.initialFrameHeight = options.minFrameHeight = container.offsetHeight;
}
- container.style.width = /%$/.test(options.initialFrameWidth) ? '100%' : options.initialFrameWidth-
- getStyleValue("padding-left")- getStyleValue("padding-right") +'px';
- container.style.height = /%$/.test(options.initialFrameHeight) ? '100%' : options.initialFrameHeight -
- getStyleValue("padding-top")- getStyleValue("padding-bottom") +'px';
+ container.style.width = /%$/.test(options.initialFrameWidth) ? '100%' : options.initialFrameWidth -
+ getStyleValue("padding-left") - getStyleValue("padding-right") + 'px';
+ container.style.height = /%$/.test(options.initialFrameHeight) ? '100%' : options.initialFrameHeight -
+ getStyleValue("padding-top") - getStyleValue("padding-bottom") + 'px';
container.style.zIndex = options.zIndex;
- var html = ( ie && browser.version < 9 ? '' : '') +
- '
123456
+ * var content = editor.getContent(); //返回值:123456
+ * ``` */ - getContent: function (cmd, fn,notSetCursor,ignoreBlank,formatter) { + + /** + * 获取编辑器的内容。 可以通过参数定义编辑器内置的判空规则 + * @method getContent + * @param { Function } fn 自定的判空规则, 要求该方法返回一个boolean类型的值, + * 代表当前编辑器的内容是否空, + * 如果返回true, 则该方法将直接返回空字符串;如果返回false,则编辑器将返回 + * 经过内置过滤规则处理后的内容。 + * @remind 该方法在处理包含有初始化内容的时候能起到很好的作用。 + * @warning 该方法获取到的是经过编辑器内置的过滤规则进行过滤后得到的内容 + * @return { String } 编辑器的内容字符串 + * @example + * ```javascript + * // editor 是一个编辑器的实例 + * var content = editor.getContent( function ( editor ) { + * return editor.body.innerHTML === '欢迎使用UEditor'; //返回空字符串 + * } ); + * ``` + */ + getContent: function (cmd, fn, notSetCursor, ignoreBlank, formatter) { var me = this; if (cmd && utils.isFunction(cmd)) { fn = cmd; @@ -479,15 +752,20 @@ return ''; } me.fireEvent('beforegetcontent'); - var root = UE.htmlparser(me.body.innerHTML,ignoreBlank); + var root = UE.htmlparser(me.body.innerHTML, ignoreBlank); me.filterOutputRule(root); me.fireEvent('aftergetcontent', cmd); return root.toHtml(formatter); }, + /** * 取得完整的html代码,可以直接显示成完整的html文档 - * @name getAllHtml - * @grammar editor.getAllHtml() => String + * @method getAllHtml + * @return { String } 编辑器的内容html文档字符串 + * @eaxmple + * ```javascript + * editor.getAllHtml(); //返回格式大致是: ...... + * ``` */ getAllHtml: function () { var me = this, @@ -508,10 +786,16 @@ + (headHtmlForIE9 || me.document.getElementsByTagName('head')[0].innerHTML) + headHtml.join('\n') + '' + '' + me.getContent(null, null, true) + '