Browse Source

added builder script written in nodejs

Signed-off-by: Gerald <[email protected]>
Gerald 11 years ago
parent
commit
aa3098d4ea
50 changed files with 207 additions and 16 deletions
  1. 3 0
      .gitignore
  2. 1 1
      README.md
  3. 187 0
      build.js
  4. 0 0
      src/_locales/cs/messages.json
  5. 0 0
      src/_locales/de/messages.json
  6. 0 0
      src/_locales/en/messages.json
  7. 0 0
      src/_locales/pl/messages.json
  8. 0 0
      src/_locales/ru/messages.json
  9. 0 0
      src/_locales/zh/messages.json
  10. 0 0
      src/background.html
  11. 0 0
      src/background.js
  12. 0 0
      src/common.js
  13. 0 0
      src/confirm.html
  14. 0 0
      src/confirm.js
  15. 0 1
      src/editor.js
  16. 0 0
      src/images/icon128.png
  17. 0 0
      src/images/icon16.png
  18. 0 0
      src/images/icon19.png
  19. 0 0
      src/images/icon19w.png
  20. 0 0
      src/images/icon48.png
  21. 0 0
      src/injected.js
  22. 0 0
      src/lib/CodeMirror/addon/comment/continuecomment.js
  23. 0 0
      src/lib/CodeMirror/addon/edit/closebrackets.js
  24. 0 0
      src/lib/CodeMirror/addon/edit/matchbrackets.js
  25. 0 0
      src/lib/CodeMirror/addon/fold/brace-fold.js
  26. 0 0
      src/lib/CodeMirror/addon/fold/comment-fold.js
  27. 0 0
      src/lib/CodeMirror/addon/fold/foldcode.js
  28. 0 0
      src/lib/CodeMirror/addon/fold/foldgutter.js
  29. 0 0
      src/lib/CodeMirror/addon/search/match-highlighter.js
  30. 0 0
      src/lib/CodeMirror/addon/search/searchcursor.js
  31. 0 0
      src/lib/CodeMirror/addon/selection/active-line.js
  32. 0 0
      src/lib/CodeMirror/lib/codemirror.css
  33. 0 0
      src/lib/CodeMirror/lib/codemirror.js
  34. 0 0
      src/lib/CodeMirror/mode/javascript/javascript.js
  35. 0 0
      src/lib/font-awesome/font-awesome.min.css
  36. 0 0
      src/lib/font-awesome/fontawesome-webfont.woff
  37. 0 0
      src/lib/zip.js/deflate.js
  38. 0 0
      src/lib/zip.js/inflate.js
  39. 0 0
      src/lib/zip.js/zip.js
  40. 0 0
      src/load.js
  41. 0 0
      src/manifest.json
  42. 0 0
      src/mylib/CodeMirror/fold.css
  43. 0 0
      src/mylib/CodeMirror/search.css
  44. 0 0
      src/mylib/CodeMirror/search.js
  45. 0 0
      src/options.html
  46. 13 14
      src/options.js
  47. 0 0
      src/popup.html
  48. 0 0
      src/popup.js
  49. 3 0
      src/style.less
  50. 0 0
      src/style.min.css

+ 3 - 0
.gitignore

@@ -0,0 +1,3 @@
+dist/
+node_modules/
+*.bat

+ 1 - 1
README.md

@@ -9,4 +9,4 @@ Multiple language
 There are two ways to help with the translations:
 
 1. *(Recommended)* Go to <http://cotrans.geraldl.net>, and translate the desired language.
-1. You may also download `_locales/en/messages.json` and translate it into your own language, and then make a pull request.
+1. You may also download `src/_locales/en/messages.json` and translate it into your own language, and then make a pull request.

+ 187 - 0
build.js

@@ -0,0 +1,187 @@
+#!node
+var fs=require('fs'),path=require('path'),
+		uglifyjs=require('uglify-js'),less=require('less');
+function parseRule(s){
+	if(s.substr(0,2)=='R:')
+		return new RegExp('^'+s.substr(2)+'$');
+	return s;
+}
+function getRules(p){
+	var d=fs.readFileSync(p),
+			jrules=JSON.parse(d),rules={},i,k,v;
+	for(i in jrules) {
+		k=parseRule(i);
+		v=jrules[i];
+		if(typeof v=='string') d=[parseRule(v)];
+		else {
+			d=[];v.forEach(function(i){d.push(parseRule(i));});
+		}
+		rules[i]=d;
+	}
+	return rules;
+}
+function getFileList(dir) {
+	function walk(root) {
+		var arr=fs.readdirSync(path.join(dir,root));
+		arr.forEach(function(i){
+			var p=path.join(root,i).replace(/\\/g,'/'),
+					s=fs.statSync(path.join(dir,p));
+			if(s.isDirectory()) walk(p);
+			else files.push(p);
+		});
+	}
+	var files=[];walk('');
+	return files;
+}
+function Distributor(uncompressed,source){
+	if(uncompressed.substr(-1)!='/') uncompressed+='/';
+	this.uncompressed=uncompressed;
+	this.source=source;
+	this.mkdirs(uncompressed);
+	this.streams={};
+	this.processing=0;
+}
+Distributor.prototype={
+	distribute:function(dest,src,srcdir){
+		var t=this,i=-1;
+		if(!src) src=dest;
+		dest=t.uncompressed+dest;
+		if(!srcdir) srcdir=t.source;
+		t.mkdirs(path.dirname(dest));
+		if(typeof src=='string') src=[src];
+		src.forEach(function(i){
+			i=path.join(srcdir,i);
+			if(t.isTextFile(i)) t.packTextFile(i,dest);
+			else t.copyFile(i,dest);
+		});
+	},
+	isTextFile:function(p){
+		return ['.html','.js','.css','.json'].indexOf(path.extname(p))>=0;
+	},
+	processStart:function(){
+		this.processing++;
+	},
+	processFinish:function(){
+		this.processing--;
+		if(!this.processing) {
+			if(this.onFinish) this.onFinish();
+		}
+	},
+	getStream:function(p,callback){
+		var s=this.streams[p];
+		if(!s) s=this.streams[p]={
+			stream:fs.createWriteStream(p,{encoding:'utf-8'}),
+			using:false,
+			callbacks:[],
+		};
+		if(s.using) s.callbacks.push(callback);
+		else {
+			this.processStart();
+			s.using=true;callback.call(this,s.stream);
+		}
+	},
+	finishStream:function(p){
+		var s=this.streams[p],c;
+		if(s.callbacks.length) {
+			c=s.callbacks.splice(0,1)[0];
+			c.call(this,s.stream);
+		} else {
+			s.using=false;this.processFinish();
+		}
+	},
+	compressText:function(src){
+		var r=fs.readFileSync(src,{encoding:'utf8'}),e=path.extname(src);
+		if(e=='.html') [
+			[/<!--.*?-->/g,''],
+			[/<\s+/g,'<'],
+			[/\s+>/g,'>'],
+		].forEach(function(i){r=r.replace(i[0],i[1]);});
+		return r;
+	},
+	packTextFile:function(src,dest){
+		var r,t=this;
+		function finish(){t.finishStream(dest);}
+		t.getStream(dest,function(f){
+			if(/\.js$/.test(src)) {
+				r=uglifyjs.minify(src,{mangle:false});
+				f.write(r.code,'utf-8',finish);
+			} else if(/\.css$/.test(src)) {
+				less.render(fs.readFileSync(src,{encoding:'utf8'}),{
+					compress:true,
+				},function(e,r){
+					f.write(r.css,'utf-8',finish);
+				});
+			} else {
+				f.write(t.compressText(src),'utf-8',finish);
+			}
+		});
+	},
+	copyFile:function(src,dest){
+		var t=this;
+		t.processStart();
+		var r=fs.createReadStream(src),
+				w=fs.createWriteStream(dest);
+		r.pipe(w);
+		w.on('close',function(){t.processFinish();});
+	},
+	mkdirs:function(dir){
+		if(!dir) return;
+		if(dir.substr(-1)=='/') dir=dir.substr(0,dir.length-1);
+		var p=dir.split(/[\\/]/),i,s='';
+		for(i=0;i<p.length;i++) {
+			s=path.join(s,p[i]);
+			if(!fs.existsSync(s)) fs.mkdirSync(s);
+		}
+	},
+	finish:function(callback){
+		function finish(){
+			if(!--count) callback();
+		}
+		function closeStreams(){
+			for(var i in t.streams) {
+				count++;
+				t.streams[i].stream.end('',null,finish);
+			}
+		}
+		var t=this,count=0;
+		if(!t.processing) closeStreams();
+		else t.onFinish=closeStreams;
+	},
+};
+function main(){
+	var src='src',rules=getRules('pack/mappings.json'),
+			filelist=getFileList(src),i,d,dis;
+	console.log('Distibutor for Opera NEX addons - written in NodeJS by Gerald')
+	d=JSON.parse(fs.readFileSync(path.join(src,'manifest.json'),{encoding:'utf8'}));
+	console.log('Package loaded: '+d.name+' version '+d.version);
+	dis=new Distributor(path.join('dist',d.name),src);
+	for(i in rules) {
+		d=[];
+		rules[i].forEach(function(r){
+			var i;
+			if(typeof r=='string') {
+				i=filelist.indexOf(r);
+				if(i>=0) {
+					d.push(r);
+					filelist.splice(i,1);
+				}
+			} else for(i=0;i<filelist.length;i++)
+				if(filelist[i].match(r)) {
+					d.push(filelist[i]);
+					filelist.splice(i,1);
+					i--;
+				}
+		});
+		if(d.length) {
+			if(i=='P:') d.forEach(function(i){
+				dis.distribute(i,null,'pack');
+			}); else if(i!='D:')
+				dis.distribute(i,d);
+		}
+	}
+	filelist.forEach(function(i){
+		dis.distribute(i);
+	});
+	dis.finish(function(){console.log('Finished.');});
+}
+main();

+ 0 - 0
_locales/cs/messages.json → src/_locales/cs/messages.json


+ 0 - 0
_locales/de/messages.json → src/_locales/de/messages.json


+ 0 - 0
_locales/en/messages.json → src/_locales/en/messages.json


+ 0 - 0
_locales/pl/messages.json → src/_locales/pl/messages.json


+ 0 - 0
_locales/ru/messages.json → src/_locales/ru/messages.json


+ 0 - 0
_locales/zh/messages.json → src/_locales/zh/messages.json


+ 0 - 0
background.html → src/background.html


+ 0 - 0
background.js → src/background.js


+ 0 - 0
common.js → src/common.js


+ 0 - 0
confirm.html → src/confirm.html


+ 0 - 0
confirm.js → src/confirm.js


+ 0 - 1
editor.js → src/editor.js

@@ -46,7 +46,6 @@ function initEditor(callback,data){
 		});
 		T.clearHistory=function(){T.getDoc().clearHistory();};
 		T.setValueAndFocus=function(v){T.setValue(v);T.focus();};
-		T.getWrapperElement().setAttribute('style','position:absolute;height:100%;width:100%;');
 		if(data.onchange) T.on('change',data.onchange);
 		if(data.readonly) T.setOption('readOnly',data.readonly);
 		callback(T);

+ 0 - 0
images/icon128.png → src/images/icon128.png


+ 0 - 0
images/icon16.png → src/images/icon16.png


+ 0 - 0
images/icon19.png → src/images/icon19.png


+ 0 - 0
images/icon19w.png → src/images/icon19w.png


+ 0 - 0
images/icon48.png → src/images/icon48.png


+ 0 - 0
injected.js → src/injected.js


+ 0 - 0
lib/CodeMirror/addon/comment/continuecomment.js → src/lib/CodeMirror/addon/comment/continuecomment.js


+ 0 - 0
lib/CodeMirror/addon/edit/closebrackets.js → src/lib/CodeMirror/addon/edit/closebrackets.js


+ 0 - 0
lib/CodeMirror/addon/edit/matchbrackets.js → src/lib/CodeMirror/addon/edit/matchbrackets.js


+ 0 - 0
lib/CodeMirror/addon/fold/brace-fold.js → src/lib/CodeMirror/addon/fold/brace-fold.js


+ 0 - 0
lib/CodeMirror/addon/fold/comment-fold.js → src/lib/CodeMirror/addon/fold/comment-fold.js


+ 0 - 0
lib/CodeMirror/addon/fold/foldcode.js → src/lib/CodeMirror/addon/fold/foldcode.js


+ 0 - 0
lib/CodeMirror/addon/fold/foldgutter.js → src/lib/CodeMirror/addon/fold/foldgutter.js


+ 0 - 0
lib/CodeMirror/addon/search/match-highlighter.js → src/lib/CodeMirror/addon/search/match-highlighter.js


+ 0 - 0
lib/CodeMirror/addon/search/searchcursor.js → src/lib/CodeMirror/addon/search/searchcursor.js


+ 0 - 0
lib/CodeMirror/addon/selection/active-line.js → src/lib/CodeMirror/addon/selection/active-line.js


+ 0 - 0
lib/CodeMirror/lib/codemirror.css → src/lib/CodeMirror/lib/codemirror.css


+ 0 - 0
lib/CodeMirror/lib/codemirror.js → src/lib/CodeMirror/lib/codemirror.js


+ 0 - 0
lib/CodeMirror/mode/javascript/javascript.js → src/lib/CodeMirror/mode/javascript/javascript.js


+ 0 - 0
lib/font-awesome/font-awesome.min.css → src/lib/font-awesome/font-awesome.min.css


+ 0 - 0
lib/font-awesome/fontawesome-webfont.woff → src/lib/font-awesome/fontawesome-webfont.woff


+ 0 - 0
lib/zip.js/deflate.js → src/lib/zip.js/deflate.js


+ 0 - 0
lib/zip.js/inflate.js → src/lib/zip.js/inflate.js


+ 0 - 0
lib/zip.js/zip.js → src/lib/zip.js/zip.js


+ 0 - 0
load.js → src/load.js


+ 0 - 0
manifest.json → src/manifest.json


+ 0 - 0
mylib/CodeMirror/fold.css → src/mylib/CodeMirror/fold.css


+ 0 - 0
mylib/CodeMirror/search.css → src/mylib/CodeMirror/search.css


+ 0 - 0
mylib/CodeMirror/search.js → src/mylib/CodeMirror/search.js


+ 0 - 0
options.html → src/options.html


+ 13 - 14
options.js → src/options.js

@@ -172,20 +172,19 @@ $('#cUpdate').onchange=function(){chrome.runtime.sendMessage({cmd:'AutoUpdate',d
 H.onchange=function(e){
 	zip.createReader(new zip.BlobReader(e.target.files[0]),function(r){
 		r.getEntries(function(e){
-			function getFiles(){
-				var i=e.shift();
-				if(i) i.getData(writer,function(t){
-					var c={code:t};
-					if(vm.scripts&&(v=vm.scripts[i.filename.slice(0,-8)])) {
-						delete v.id;c.more=v;
-					}
-					chrome.runtime.sendMessage({cmd:'ParseScript',data:c});
-					count++;
-					getFiles();
-				}); else {
-					alert(_('msgImported',[count]));
-					location.reload();
-				}
+			function getFiles(i){
+				while(i=e.shift()) if(/\.user\.js$/.test(i.filename))
+					return i.getData(writer,function(t){
+						var c={code:t};
+						if(vm.scripts&&(v=vm.scripts[i.filename.slice(0,-8)])) {
+							delete v.id;c.more=v;
+						}
+						chrome.runtime.sendMessage({cmd:'ParseScript',data:c});
+						count++;
+						getFiles();
+					});
+				alert(_('msgImported',[count]));
+				location.reload();
 			}
 			var i,vm={},writer=new zip.TextWriter(),count=0;
 			for(i=0;i<e.length;i++) if(e[i].filename=='ViolentMonkey') break;

+ 0 - 0
popup.html → src/popup.html


+ 0 - 0
popup.js → src/popup.js


+ 3 - 0
style.less → src/style.less

@@ -274,6 +274,9 @@ label>*{
 // Editor
 @editor-header-height: 5em;
 @editor-footer-height: 3em;
+#eCode,#eCode .CodeMirror{
+	height: 100%;
+}
 #eMeta{
 	max-width: 450px;
 	max-height: 100%;

File diff suppressed because it is too large
+ 0 - 0
src/style.min.css


Some files were not shown because too many files changed in this diff