根据nicEdit 源码组织结构
中所讲的组织方法,和打包注释,其实可以做一个通用的,nicEdit代码风格的模块打包器.
这里用JavaScript实现一个(没有全部完成,有些地方如何做更好,还在考虑中),
对于一个打包器来说,数据的来源我并不考虑,因为这和使用方法有关,你可以从后台程序输出,也可以通过web服务器支持目录列表自动获取,就是因为方法很多,所以这才不是打包器考虑的内容.
/**
* nicEdit 风格 模块打包器说明
*/
var modulePacker={
/**
* 初始化,输入是一个nicEdit 风格的 src 目录结构的对象,最终js文件直接附加原始文件文本
* 例如:
{
nicCore:{
nicCore.js:'source code',
bkLib.js:'source code'
},
nicCode:{
nicCode.js:'source code'
}
}
* 生成一个按模块分的依赖关系对象 this.Dep
* 生成一个按依赖关系的模块打包次序数组 this.Order
*/
init:function(src,license){
function find(str){
var s = module.indexOf(str);
if (s<0) return false;
s=s+str.length;
var e = module.indexOf('\n',s);
if (e<0) return false;
return module.slice(s,e).split(',');
}
this.Src=src;
this.Dep={};
this.Pk={};
this.Remove={};
for (var i in src) {
if (typeof src[i]=='string' || typeof src[i][i+'.js']!='string') continue;
this.Dep[i]={};
var module = src[i][i+'.js'];
var dep=find('@requires:');//分析依赖请求
if (dep)
for (var j = 0; j < dep.length; j++) {
dep[j]=(dep[j] || "").replace( /^\s+|\s+$/g, "" );
this.Dep[i][dep[j]]=true;
}
this.Pk[i]={};//[];
dep=find('@order:');//模块文件调入次序
if (dep){
for (var j = 0; j < dep.length; j++) {
dep[j]=(dep[j] || "").replace( /^\s+|\s+$/g, "" );
this.Pk[i][dep[j]+'.js']=this.config(src[i][dep[j]+'.js']);
}
}else{
this.Pk[i][i+'.js']=this.config(module);
}
}
this.sort();
if (license) return this.packer(license);
return this;
},
/*把 源文件根据配置分段存储与Pk,以便后续处理*/
config:function(module){
function slice(tn,b1,p,max){//把string第2段分成2段
var begin=tn.begin;
var end=tn.end;
var e1,b2,e2;
e1=module.indexOf(begin,b1);
if (e1<0 || e1>=max) return false;
b2=e1+begin.length;
if (b2<0 || b2>=max) return false;
e2=module.indexOf(end,b2);
if (e2<0 || e2>=max) return false;
p[0]=b1;p[1]=e1;
p[2]=b2;p[3]=e2;
p[4]=e2+end.length;
return true;
}
function toobj(str){
str=str.replace( /^\s+|\s+$/g, "" );
if(str.indexOf(',')==0) str=str.slice(1);
return Function('return {'+str+'};')();
}
function push(p){
if(0==obj.length){
obj.push(p);
return ;
}
var pos=false;
for(var i = 0;i < obj.length; ++i)
if (p.begin>obj[i].begin) pos=i+1;
if(pos==false)
obj=[].concat([p],obj);
else
obj = obj.slice(0,pos).concat([p],obj.slice(pos));
}
var obj=[];
/*config分析*/
var p=[0,0,0,0,0];
if(slice(this.Config.config,0,p,module.length)){
module=module.slice(p[0],p[1])+module.slice(p[2],p[3])+module.slice(p[4]);
if(slice(this.Config.remove,0,p,module.length)){
var remove=toobj(module.slice(p[2],p[3]));
if (typeof remove=='object')
for (var prop in remove){
if (typeof remove[prop] =='object'){
if (this.Remove[prop]==undefined)
this.Remove[prop]={};
for(var s in remove[prop])
this.Remove[prop][s]=remove[prop][s];
}else
this.Remove[prop]=remove[prop];
}
module=module.slice(p[0],p[1])+module.slice(p[4]);
}
for (var i in this.Config.tag) {
if(slice(this.Config.tag[i],0,p,module.length))
push({begin:p[1],end:p[4],name:i});
}
}
var pk=[];
var pos=0;
obj.push({begin:module.length,end:module.length});
for (var i = 0; i < obj.length;i++) {
pk.push({src:module.slice(pos,obj[i].begin),name:obj[i].name||''});
pos=obj[i].end;
}
return pk;
},
/**
* 根据依赖关系生成 module 打包次序
*/
sort:function(){
function find(str){
for (var i=0;i<order.length;i++) {
if (order[i]==str) return i;
}
return null;
}
var order=this.Order=[];
var pos;
for (var i in this.Dep) {
pos=find(i);
if(pos!=null) {
for (var j in this.Dep[i]) {
if (typeof this.Dep[i][j] !='boolean') continue;
var pos2=find(j);
if (pos2<pos) continue;
var str=order[pos];
order[pos]=order[pos2];
order[pos2]=str;
}
continue;
}
for (var j in this.Dep[i]) {
if (typeof this.Dep[i][j] !='boolean') continue;
pos=find(j);
if(pos!=null) continue;
order.push(j);
}
order.push(i);
}
return;
},
/**
* 多粒度获取依赖关系 this.Dep 的信息
* this.Dep 整个依赖关系
* this.Dep[module] 某个 module 的依赖关系
* this.Dep[module][dep] 检查某个 module 是否依赖于 dep
*/
getdep:function(module,dep){
if(undefined==module && undefined==dep) return this.Dep;
if(dep && this.Dep[module])
return this.Dep[module][dep];
return this.Dep[module];
},
/**
* 多粒度获取 this.Remove 的信息
*/
getremove:function(key){
if (undefined==key)
return this.Remove;
return this.Remove[key];
},
/**
* 生成打包前的数据
* modules:[]
*/
prePacker:function(modules){
var pack={};
for (var i =0 ;i<modules.length;i++) {
pack[modules[i]]=[];
for (var j in this.Dep[modules[i]]) {
pack[j]=[];
}
}
var prepack=this.Data.prePack={};
for (var i = 0; i < this.Order.length; i++) {
var m=this.Order[i];
if(pack[m]){
for(var j in this.Pk[m])
pack[m]=pack[m].concat(this.Pk[m][j]);
prepack[m]=pack[m];
}
}
return this;
},
/*给不同的需求留下的自定义处理数据处理对象*/
Data:{},
nicEdit:function(pre,iconsPath){
if(!pre) pre='';
if(iconsPath)
iconsPath='"'+iconsPath+'"';
else
iconsPath='nicEditIconsPath';
var prePack=this.Data.prePack;
var pack=[];
if(typeof pre=='string') pack.push(pre);
var pos=0;
var iconList=[];
/*偷懒的图片全部打包*/
for (var i in this.Remove.iconFiles)
iconList.push('"'+i+'":'+(++pos));
iconList = '{'+iconList.join()+'}';
for(var i in prePack)
for(var j=0;j<prePack[i].length;j++){
pack.push(prePack[i][j].src);
if(''==prePack[i][j].name) continue;
switch(prePack[i][j].name){
case 'iconsPath':
pack.push(iconsPath);
break;
case 'iconList':
pack.push(iconList);
break;
}
}
this.Data.pack=pack.join('');
},
/**
* 配置语法
*/
Config:{
/*配置文件*/
configfile:'nicConfig.js',
/*配置开始和结束*/
config:{
begin:'/* START CONFIG */',
end:'/* END CONFIG */'},
/*需要删除的代码*/
remove:{
begin:'/* NICEDIT_REMOVE_START */',
end:'/* NICEDIT_REMOVE_END */'},
tag:{/*需要替换的配置*/
/*合并图标文件的URL路径*/
iconsPath:{
begin:'/* NICEDIT_ICONSPATH_START */',
end:'/* NICEDIT_ICONSPATH_END */'},
/*图标和标号列表*/
iconList:{
begin:'/* NICEDIT_ICONLIST_START */',
end:'/* NICEDIT_ICONLIST_END */'}
}
}
}
分享到:
相关推荐
使用nicEdit非常简单,只需要在网页中引入`nicEditor.js`,然后通过JavaScript调用`nicEditors.allTextAreas()`或`nicEditors.replaceTextarea()`方法,将文本区域转换为富文本编辑器。此外,还可以通过传递选项...
它只需要引入一个名为`nicEdit.js`的JavaScript文件和一个用于图标显示的GIF文件,大大减少了页面的加载时间。 2. **易用性**:nicEdit的API简单直观,开发者可以轻松地将其集成到现有的HTML页面中,通过几行代码...
在“nicEdit.js”这个核心文件中,包含了nicEdit的主要代码实现。这是一个JavaScript库,通过在网页中引入这个脚本,就能在任何HTML元素上添加一个富文本编辑器。nicEdit的灵活性在于其插件系统,允许开发者根据需求...
5. **自定义扩展**:nicEdit允许开发者根据需求添加自定义按钮或工具栏项,通过扩展其核心功能来满足特定的编辑需求。 6. **兼容性**:nicEdit兼容大多数现代浏览器,包括Firefox、Chrome、Safari、Opera以及...
5. **易于集成**:只需一行JavaScript代码,就可以将nicEdit添加到任何HTML页面上,大大降低了开发者的集成成本。 二、 nicEdit 的基本使用 1. **安装与引入**:在HTML文件中,通过 `<script>` 标签引入 nicEdit....
3. **样式表(CSS)**:nicEdit允许开发者自定义编辑器的外观和风格,通过修改或扩展默认的CSS样式表,可以满足个性化需求。 4. **API**:nicEdit提供了全面的API接口,开发者可以利用这些接口与编辑器进行交互,...
2. **易于集成**:nicEdit通过简单的JavaScript代码即可被添加到任何HTML页面中,只需要引入nicEdit.js文件,然后调用相应的初始化函数,就能立即启用编辑器功能。 3. **丰富的编辑功能**:尽管小巧,但nicEdit提供...
### NicEdit编辑器API文档知识点概述 #### 一、关于NicEdit NicEdit是一款轻量级、跨平台的内联内容编辑器,旨在使网站内容能够轻松地在浏览器中进行即时编辑。它的小巧易用使得任何网页元素或div都可以变成可编辑...
2. **易于集成**: nicEdit提供简单的API接口,通过几行JavaScript代码就能快速实现编辑器的初始化和配置,使得开发者能够快速将编辑器功能整合进网页。 3. **丰富的编辑功能**: 虽然体积小巧,但nicEdit提供了诸如...
NicEdit就是这样的一个工具,用户在浏览器中可以直接进行文字格式化、插入图片、链接等操作,所见即所得,使得非技术人员也能轻松进行内容编辑。 **3. NicEdit的特性** - **跨浏览器兼容性**:NicEdit支持主流的...
另外,"nicEdit.js"是NicEdit的主要JavaScript文件,包含了编辑器的所有功能。通过在HTML页面中引入这个脚本,并调用适当的函数,就能轻松地添加编辑器到任何文本输入区域。 此外,"demo02.html"、"demo03.html"、...
1. **JavaScript文件**:主要包含NicEdit的主库(nicCore.js)和其他模块,如按钮定义(nicButtons.js)、图片上传(nicImageManager.js)等。开发者可以通过修改这些文件,实现自定义功能或扩展。 2. **CSS样式表**...
富文本编辑器是网页开发中常见的一种工具,它允许用户在网页上进行类似Word的文本编辑操作,如插入图片、格式化文字等。NicEdit就是这样一款JavaScript实现的轻量级富文本编辑器插件,特别适合对性能和体积有较高...
demo1中的方法是给页面中所有textarea增加编辑器 demo2中的这个方法是给...<script src="nicEdit.js" type="text/javascript">该方法加载编辑器js js文件中iconsPath : 'nicEditorIcons.gif'语句设置编辑器图片路径
《JS插件NicEdit富文本编辑器特效源码详解》 在网页开发中,富文本编辑器是不可或缺的一部分,它允许用户在浏览器中直接编辑文本并格式化内容,类似于Word等桌面应用程序。其中,NicEdit是一款轻量级、易于集成且...
nicEdit是一款轻量级的JavaScript富文本编辑器,它以其简洁的设计和全面的功能集而受到广大Web开发者的喜爱。在网页设计和内容管理系统(CMS)中,富文本编辑器是必不可少的工具,它们允许用户以类似Word的方式在...
这是一个相当轻量级的 所见即所得编辑器, 跨平台的Inline Content Editor。NicEdit能够让任何 ...NicEdit是我见过最轻量级的富文本编辑器,总共就一个JS文件和一张图片,经过我在项目里的使用情况来看,相当好用。
3. **易于集成**:NicEdit可以通过简单的JavaScript代码快速地嵌入到网页中,提供了一种简单的方式来添加文本编辑功能,对于不熟悉复杂前端技术的开发者也十分友好。 4. **基本编辑功能**:NicEdit提供了一系列常见...
2. **快速集成**:作为一个JavaScript库,nicEdit 可以轻松地通过几行代码集成到任何HTML页面中,为开发者提供了极大的便利。 3. **基本编辑功能**:尽管简洁,但nicEdit 包含了基本的文本格式化选项,如加粗、斜体...