`
achun
  • 浏览: 315269 次
  • 性别: Icon_minigender_1
  • 来自: 河南郑州
社区版块
存档分类
最新评论

根据nicEdit代码风格制作的js模块打包工具

阅读更多

根据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 */'}
		}
  }
}

 

0
0
分享到:
评论
2 楼 minglelui 2010-03-08  
请教下楼主,类似JQuery.pack.js文件是否也是通过类似的工具生成的,可有其他的工具介绍下?想了解对js和css文件打包的工具
1 楼 radovi 2009-10-25  
学习了……

相关推荐

    nicEdit源代码

    使用nicEdit非常简单,只需要在网页中引入`nicEditor.js`,然后通过JavaScript调用`nicEditors.allTextAreas()`或`nicEditors.replaceTextarea()`方法,将文本区域转换为富文本编辑器。此外,还可以通过传递选项...

    nicEdit 编辑器

    它只需要引入一个名为`nicEdit.js`的JavaScript文件和一个用于图标显示的GIF文件,大大减少了页面的加载时间。 2. **易用性**:nicEdit的API简单直观,开发者可以轻松地将其集成到现有的HTML页面中,通过几行代码...

    nicedit

    在“nicEdit.js”这个核心文件中,包含了nicEdit的主要代码实现。这是一个JavaScript库,通过在网页中引入这个脚本,就能在任何HTML元素上添加一个富文本编辑器。nicEdit的灵活性在于其插件系统,允许开发者根据需求...

    html文本编辑器(nicEdit)

    5. **自定义扩展**:nicEdit允许开发者根据需求添加自定义按钮或工具栏项,通过扩展其核心功能来满足特定的编辑需求。 6. **兼容性**:nicEdit兼容大多数现代浏览器,包括Firefox、Chrome、Safari、Opera以及...

    nicEdit_脚本实例_

    5. **易于集成**:只需一行JavaScript代码,就可以将nicEdit添加到任何HTML页面上,大大降低了开发者的集成成本。 二、 nicEdit 的基本使用 1. **安装与引入**:在HTML文件中,通过 `&lt;script&gt;` 标签引入 nicEdit....

    nicEdit富文本编辑器

    3. **样式表(CSS)**:nicEdit允许开发者自定义编辑器的外观和风格,通过修改或扩展默认的CSS样式表,可以满足个性化需求。 4. **API**:nicEdit提供了全面的API接口,开发者可以利用这些接口与编辑器进行交互,...

    nicEdit轻量级文本编辑器

    2. **易于集成**:nicEdit通过简单的JavaScript代码即可被添加到任何HTML页面中,只需要引入nicEdit.js文件,然后调用相应的初始化函数,就能立即启用编辑器功能。 3. **丰富的编辑功能**:尽管小巧,但nicEdit提供...

    NicEdit编辑器API文档

    ### NicEdit编辑器API文档知识点概述 #### 一、关于NicEdit NicEdit是一款轻量级、跨平台的内联内容编辑器,旨在使网站内容能够轻松地在浏览器中进行即时编辑。它的小巧易用使得任何网页元素或div都可以变成可编辑...

    nicEdit轻量级网页富文本编辑器

    2. **易于集成**: nicEdit提供简单的API接口,通过几行JavaScript代码就能快速实现编辑器的初始化和配置,使得开发者能够快速将编辑器功能整合进网页。 3. **丰富的编辑功能**: 虽然体积小巧,但nicEdit提供了诸如...

    NicEdit基于AJAX 技术的WYSIWYG 在线编辑器

    NicEdit就是这样的一个工具,用户在浏览器中可以直接进行文字格式化、插入图片、链接等操作,所见即所得,使得非技术人员也能轻松进行内容编辑。 **3. NicEdit的特性** - **跨浏览器兼容性**:NicEdit支持主流的...

    简洁的富文本编辑器NicEdit插件

    另外,"nicEdit.js"是NicEdit的主要JavaScript文件,包含了编辑器的所有功能。通过在HTML页面中引入这个脚本,并调用适当的函数,就能轻松地添加编辑器到任何文本输入区域。 此外,"demo02.html"、"demo03.html"、...

    JS 插件NicEdit富文本编辑器特效源码.zip

    1. **JavaScript文件**:主要包含NicEdit的主库(nicCore.js)和其他模块,如按钮定义(nicButtons.js)、图片上传(nicImageManager.js)等。开发者可以通过修改这些文件,实现自定义功能或扩展。 2. **CSS样式表**...

    JS富文本编辑器插件NicEdit.zip

    富文本编辑器是网页开发中常见的一种工具,它允许用户在网页上进行类似Word的文本编辑操作,如插入图片、格式化文字等。NicEdit就是这样一款JavaScript实现的轻量级富文本编辑器插件,特别适合对性能和体积有较高...

    nicEdit中文以及官方demo(自己汉化的)

    demo1中的方法是给页面中所有textarea增加编辑器 demo2中的这个方法是给...&lt;script src="nicEdit.js" type="text/javascript"&gt;该方法加载编辑器js js文件中iconsPath : 'nicEditorIcons.gif'语句设置编辑器图片路径

    JS 插件NicEdit富文本编辑器特效源码.rar

    《JS插件NicEdit富文本编辑器特效源码详解》 在网页开发中,富文本编辑器是不可或缺的一部分,它允许用户在浏览器中直接编辑文本并格式化内容,类似于Word等桌面应用程序。其中,NicEdit是一款轻量级、易于集成且...

    nicEdit简单小巧编辑器

    nicEdit是一款轻量级的JavaScript富文本编辑器,它以其简洁的设计和全面的功能集而受到广大Web开发者的喜爱。在网页设计和内容管理系统(CMS)中,富文本编辑器是必不可少的工具,它们允许用户以类似Word的方式在...

    NicEdit-Textarea编辑器

    这是一个相当轻量级的 所见即所得编辑器, 跨平台的Inline Content Editor。NicEdit能够让任何 ...NicEdit是我见过最轻量级的富文本编辑器,总共就一个JS文件和一张图片,经过我在项目里的使用情况来看,相当好用。

    NicEdit富文本编辑器

    3. **易于集成**:NicEdit可以通过简单的JavaScript代码快速地嵌入到网页中,提供了一种简单的方式来添加文本编辑功能,对于不熟悉复杂前端技术的开发者也十分友好。 4. **基本编辑功能**:NicEdit提供了一系列常见...

    简单的在线文本编辑器nicEdit,中文版

    2. **快速集成**:作为一个JavaScript库,nicEdit 可以轻松地通过几行代码集成到任何HTML页面中,为开发者提供了极大的便利。 3. **基本编辑功能**:尽管简洁,但nicEdit 包含了基本的文本格式化选项,如加粗、斜体...

Global site tag (gtag.js) - Google Analytics