Repository navigation
Expand file tree
/
Copy pathwuLib.js
More file actions
122 lines (122 loc) · 3.56 KB
/
Copy pathwuLib.js
File metadata and controls
122 lines (122 loc) · 3.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
const fs=require("fs");
const path=require("path");
class CntEvent{
constructor(){
this.cnt=0;
this.emptyEvent=[];
this.encount=this.encount.bind(this);
this.decount=this.decount.bind(this);
this.add=this.add.bind(this);
}
encount(delta=1){
this.cnt+=delta;
}
decount(){
if(this.cnt>0)--this.cnt;
if(this.cnt==0){
for(let info of this.emptyEvent)info[0](...info[1]);
this.emptyEvent=[];
}
}
add(cb,...attach){
this.emptyEvent.push([cb,attach]);
}
check(cb,...attach){
if(this.cnt==0)cb(...attach);
else this.add(cb,...attach);
}
}
let ioEvent=new CntEvent;
function mkdirs(dir,cb){
fs.stat(dir,(err,stats)=>{
if(err)mkdirs(path.dirname(dir),()=>fs.mkdir(dir,cb));
else if(stats.isFile())throw Error(dir+" was created as a file, so we cannot put file into it.");
else cb();
});
}
function save(name,content){
ioEvent.encount();
mkdirs(path.dirname(name),()=>fs.writeFile(name,content,err=>{
if(err)throw Error("Save file error: "+err);
ioEvent.decount();
}));
}
function get(name,cb,opt={encoding:'utf8'}){
ioEvent.encount();
fs.readFile(name,opt,(err,data)=>{
if(err)throw Error("Read file error: "+err);
else cb(data);
ioEvent.decount();
});
}
function del(name){
ioEvent.encount();
fs.unlink(name,ioEvent.decount);
}
function changeExt(name,ext=""){
return name.slice(0,name.lastIndexOf("."))+ext;
}
function scanDirByExt(dir,ext,cb){
let result=[],scanEvent=new CntEvent;
function helper(dir){
scanEvent.encount();
fs.readdir(dir,(err,files)=>{
if(err)throw Error("Scan dir error: "+err);
for(let file of files){
scanEvent.encount();
let name=path.resolve(dir,file);
fs.stat(name,(err,stats)=>{
if(err)throw Error("Scan dir error: "+err);
if(stats.isDirectory())helper(name);
else if(stats.isFile()&&name.endsWith(ext))result.push(name);
scanEvent.decount();
});
}
scanEvent.decount();
});
}
scanEvent.add(cb,result);
helper(dir,ext,scanEvent);
}
function toDir(to,from){//get relative path without posix/win32 problem
if(from[0]==".")from=from.slice(1);
if(to[0]==".")to=to.slice(1);
from=from.replace(/\\/g,'/');to=to.replace(/\\/g,'/');
let a=Math.min(to.length,from.length);
for(let i=1,m=Math.min(to.length,from.length);i<=m;i++)if(!to.startsWith(from.slice(0,i))){a=i-1;break;}
let pub=from.slice(0,a);
let len=pub.lastIndexOf("/")+1;
let k=from.slice(len);
let ret="";
for(let i=0;i<k.length;i++)if(k[i]=='/')ret+='../';
return ret+to.slice(len);
}
function commandExecute(cb,helper){
console.time("Total use");
function endTime(){
ioEvent.check(()=>console.timeEnd("Total use"));
}
let orders=[];
for(let order of process.argv)if(order.startsWith("-"))orders.push(order.slice(1));
let iter=process.argv[Symbol.iterator](),nxt=iter.next(),called=false,faster=orders.includes("f"),fastCnt;
if(faster){
fastCnt=new CntEvent;
fastCnt.add(endTime);
}
function doNext(){
let nxt=iter.next();
while(!nxt.done&&nxt.value.startsWith("-"))nxt=iter.next();
if(nxt.done){
if(!called)console.log("Command Line Helper:\n\n"+helper);
else if(!faster)endTime();
}else{
called=true;
if(faster)fastCnt.encount(),cb(nxt.value,fastCnt.decount,orders),doNext();
else cb(nxt.value,doNext,orders);
}
}
while(!nxt.done&&!nxt.value.endsWith(".js"))nxt=iter.next();
doNext();
}
module.exports={mkdirs:mkdirs,get:get,save:save,toDir:toDir,del:del,commandExecute:commandExecute,
addIO:ioEvent.add,changeExt:changeExt,CntEvent:CntEvent,scanDirByExt:scanDirByExt};