-
Notifications
You must be signed in to change notification settings - Fork 1
/
builder3.js
1 lines (1 loc) · 11.3 KB
/
builder3.js
1
var Builder3=function(){function e(e,n,r,t,o,s,a,c){function f(e){function s(c){if(m[c])var f=p.basename(m[c],p.extname(m[c])),g=p.extname(m[c]).substr(1),O=p.basename(m[c]);else var f="",g="",O="";var x="./"+t+"/",v=!0,h=!0,j=!1;if(""==f||""==g)v=h=!1;if(u[f]&&r.indexOf("extname")>r.indexOf(p.extname(u[f]))&&(v=!1),u[O]&&(h=!1),h&&("sound"==t?g==w.SOUND[0]?a||-1!=y.indexOf(f+"."+w.SOUND[1])||(i.warn("ビルド元に"+O+"に対応するサウンドファイル"+f+"."+w.SOUND[1]+"が見つかりません"),h=!1,exitFlg=!0):g==w.SOUND[1]&&(a||-1!=y.indexOf(f+"."+w.SOUND[0])?o.push(O):y.indexOf(f+"."+w.VIDEO[1])+y.indexOf(f+"."+w.VIDEO[2])==-2?(i.warn("ビルド元に"+O+"に対応するwebm/ogvビデオファイル "+f+"."+w.VIDEO[1]+" / "+f+"."+w.VIDEO[2]+" か、oggサウンドファイル"+f+"."+w.SOUND[0]+"が見つかりません"),h=!1,exitFlg=!0,o.push(O)):j=!0):"video"==t?g==w.VIDEO[0]?a||-1!=o.indexOf(O)?j=!0:(-1==y.indexOf(f+"."+w.VIDEO[1])&&(i.warn("ビルド元に"+O+"に対応するogvビデオファイル"+f+"."+w.VIDEO[1]+"が見つかりません"),h=!1,exitFlg=!0),-1==y.indexOf(f+"."+w.VIDEO[2])&&(i.warn("ビルド元に"+O+"に対応するwebmビデオファイル"+f+"."+w.VIDEO[2]+"が見つかりません"),h=!1,exitFlg=!0)):g==w.VIDEO[1]?(a||-1!=y.indexOf(f+"."+w.VIDEO[0])||(i.warn("ビルド元に"+O+"に対応するmp4ビデオファイル"+f+"."+w.VIDEO[0]+"が見つかりません"),h=!1,exitFlg=!0),a||-1!=y.indexOf(f+"."+w.VIDEO[2])||(i.warn("ビルド元に"+O+"に対応するwebmビデオファイル"+f+"."+w.VIDEO[2]+"が見つかりません"),h=!1,exitFlg=!0)):g==w.VIDEO[2]&&(a||-1!=y.indexOf(f+"."+w.VIDEO[0])||(i.warn("ビルド元に"+O+"に対応するmp4ビデオファイル"+f+"."+w.VIDEO[0]+"が見つかりません"),h=!1,exitFlg=!0),a||-1!=y.indexOf(f+"."+w.VIDEO[1])||(i.warn("ビルド元に"+O+"に対応するwebmビデオファイル"+f+"."+w.VIDEO[1]+"が見つかりません"),h=!1,exitFlg=!0)):"font"==t&&(g==w.FONT[0]?a||-1!=y.indexOf(f+"."+w.FONT[1])||(i.warn("ビルド元に"+O+"に対応するttfフォントファイル"+f+"."+w.FONT[1]+"が見つかりません"),h=!1,exitFlg=!0):g==w.FONT[1]&&(a||-1!=y.indexOf(f+"."+w.FONT[0])||(i.warn("ビルド元に"+O+"に対応するwoffフォントファイル"+f+"."+w.FONT[0]+"が見つかりません"),h=!1,exitFlg=!0)))),v&&"image"==t&&(v&&(u[f.toLowerCase()]=x+O.toLowerCase()),h&&(u[O.toLowerCase()]=x+O.toLowerCase())),h&&"sound"==t&&h&&!j&&(u[f.toLowerCase()]=x+f.toLowerCase()),"video"==t&&h&&!j&&(u[f.toLowerCase()]=x+f.toLowerCase()),"font"==t&&h&&(u[f.toLowerCase()]=x+f.toLowerCase()),j)c<m.length?s(c+1):e(u);else if(h){var D=p.normalize(m[c]),E=p.join(n,t,O.toLowerCase());l.existsSync(E)?d.inspect(l.statSync(m[c])).mtime>d.inspect(l.statSync(m[c])).mtime?S.copy(D,E,function(){i.message("上書コピー:"+D),c<m.length?s(c+1):e(u)}):setTimeout(function(){i.message("コピー省略:"+D),c<m.length?s(c+1):e(u)},0):S.copy(D,E,function(){i.message("新規コピー:"+D),c<m.length?s(c+1):e(u)})}else e(u)}0<m.length?s(0):e(u)}var u={},g=S.readdirRSync(e),m=[],O=S.readdirRSync(p.join(e,"data")),y=[],x=new RegExp(".*\\.("+r.join("|")+")$","i");g.filter(function(e){return l.statSync(e).isFile()&&x.test(e)}).forEach(function(e){m.push(e)});for(var v in O)y.push(p.basename(O[v]));setTimeout(function(){f(c)},0)}function n(e,n,r,t,o){var s=e;for(var c in n)s[c]=n[c];var f=m.nfc(JSON.stringify(s));if(t){var u=f,g="$(function(){getScripts('./script.json')})",d="script.js";l.writeFileSync(p.join(r,"script.json"),u),l.writeFileSync(p.join(r,d),g)}else{var g="$(function(){initScripts("+f+")})",d="script.js";try{l.writeFileSync(p.join(r,d),g)}catch(e){if(i.error("ビルド先フォルダへのスクリプトの書き出しに失敗しました"),a)return}}}this.log;var r,i,t,o,s,a,c,f,u,g,l=require("fs"),p=require("path"),d=require("util"),m=require("unorm"),O=require("adm-zip"),y=require("./nodejs/builder/builder.js"),x=require("./package.json"),S=require("./fsex.js"),v="./engines",w={IMAGE:["png","jpeg","jpg","gif"],SOUND:["ogg","mp4"],VIDEO:["mp4","ogv","webm"],FONT:["woff","ttf"]};this.run=function(e,n,t){return a="undefined"==typeof module||require.main!==module,n?(i=n,r=e):(i=require("./log.js"),(r=require("commander")).option("-s, --splitfiles","splitfilesモードでビルド").option("-k, --kag3","KAG3互換文法モードでビルド").option("-r, --release","リリースモードでビルド").option("-x, --o2server","O₂ Serverモードでビルド").option("-e, --engine [version]","指定したバージョンのO₂ Engineでビルド").option("-E, --engines [path]","O₂ Engineの格納されたフォルダを指定").option("-V, --version","バージョン情報を表示").option("-f, --force","ファイル整合性チェックを行わないでビルド").option("-p, --package","ノベルスフィア向けにパッケージング").option("-w, --wrapper [version]","指定したバージョンのO₂ Wrapperでビルド").option("-W, --wrappers [path]","O₂ Wrapperの格納されたフォルダを指定").parse(process.argv)),!!this.setupValidation(r.args,a)&&(r.package?!!this.execPackage():!!this.buildSetup()&&(!!this.execCompile()&&!!this.execCopyAssets(t)))},this.version=function(){return x.version},this.execGetNovelchan=function(){i.message("のべるちゃんロード")},this.setupValidation=function(e,n){if((2<e.length||e.length<2)&&(i.error("引数の数に誤りがあります"),n))return!1;if(!r.package){if(r.engines)if(l.existsSync(r.engines)&&l.statSync(r.engines).isDirectory())v=r.engines;else if(i.error("指定されたenginesフォルダがありません"),n)return!1;if((!l.existsSync(v)||!l.statSync(v).isDirectory())&&(i.error("enginesフォルダがありません"),n))return!1;if(r.engine)s=r.engine;else if(i.error("エンジンのバージョン指定がありません"),n)return!1;if(o=p.join(v,s),(!l.existsSync(o)||!l.statSync(o).isDirectory())&&(i.error("指定されたバージョンのエンジンがありません"),n))return!1;r.wrapper&&(u=r.wrapper)}if(f=p.normalize(r.args[0]+"/"),t=r.package?p.normalize(r.args[1]):p.normalize(r.args[1]+"/"),!l.existsSync(f)&&(i.error("ビルド元フォルダがありません"),n))return!1;if(!l.statSync(f).isDirectory()&&(i.error("指定されたビルド元がフォルダでありません"),n))return!1;if(f==t&&(i.error("ビルド元とビルド先が同じフォルダです"),n))return!1;if(-1!=f.indexOf(t)&&(i.error("ビルド元フォルダがビルド先フォルダの内部です"),n))return!1;if(-1!=t.indexOf(f)&&(i.error("ビルド先フォルダがビルド元フォルダの内部です"),n))return!1;c=l.readdirSync(f);var a=[];for(var g in c)a.push(c[g].toLowerCase());return!((-1==a.indexOf("config.json")||!l.statSync(p.join(f,"config.json")).isFile())&&(i.error("ビルド元フォルダにconfig.jsonがありません"),n))&&!((-1==a.indexOf("data")||!l.statSync(p.join(f,"data")).isDirectory())&&(i.error("ビルド元フォルダにdataフォルダがありません"),n))},this.execPackage=function(){i.message("パッケージング中です");var e=new O;e.addLocalFolder(f);e.toBuffer(function(e){i.message("ZIPファイルの書き出し中です"),l.writeFile(t,e,function(){i.end("パッケージングを完了しました"),callback&&callback(null)})},function(e){if(i.error("パッケージングに失敗しました"),a)return!1},function(e){},function(e){i.message("圧縮:"+e)});return!0},this.buildSetup=function(){if(!l.existsSync(t))try{return l.mkdirSync(t),i.message("ビルド先フォルダを作成しました"),!0}catch(e){if(i.error("ビルド先フォルダの作成に失敗しました"),a)return!1}if(!l.statSync(t).isDirectory())return i.error("指定されたビルド先にファイルが存在します"),!a;var e=l.readdirSync(t),n=[];for(var r in e)n.push(e[r].toLowerCase());return-1!=n.indexOf("script.js")||(i.error("指定されたビルド先にすでに無関係なフォルダが存在します"),!a)},this.execCopyAssets=function(s){var c=["image","sound","video","font"];for(var u in c){var d=p.join(t,c[u]);if(l.existsSync(d)){if(l.statSync(d).isFile()&&(i.error("ビルド先フォルダの構造が予期されたものと異なります"),a))return!1}else try{l.mkdirSync(d)}catch(e){if(i.error("ビルド先フォルダに必要なフォルダの作成に失敗しました"),a)return!1}}i.message("ビルド先フォルダに必要なフォルダを作成しました");p.join(f,"data");var m=[];e(f,t,w.IMAGE,"image",m,0,r.force,function(c){e(f,t,w.SOUND,"sound",m,0,r.force,function(u){e(f,t,w.VIDEO,"video",m,0,r.force,function(d){e(f,t,w.FONT,"font",m,0,r.force,function(e){i.message("ストレージのコピーとストレージ一覧の生成が完了しました");var m=["script.js","script.json","index.html"];for(var O in m){var y=p.join(t,m[O]);l.existsSync(y)&&l.statSync(y).isFile()&&l.unlinkSync(y)}i.message("ビルド先フォルダの不要ファイルを削除しました");var x=p.join(t,"engine"),v=p.join(t,"plugin");if(l.existsSync(x))try{S.rmdirRSync(x),i.message("ビルド先フォルダ内の古いO₂ Engineを削除しました")}catch(e){i.message("ビルド先フォルダ内の古いO₂ Engineの削除に失敗しました")}if(l.existsSync(v))try{S.rmdirRSync(v),i.message("ビルド先フォルダ内の古いプラグインを削除しました")}catch(e){i.message("ビルド先フォルダ内の古いプラグインの削除に失敗しました")}n(g,{imagelist:c,soundlist:u,videolist:d,fontlist:e},t,r.o2server,r.splitfiles),i.message("ビルド先フォルダにスクリプトを書き出しました");try{S.copyRSync(o,p.join(t,"engine")),l.renameSync(p.join(t,"engine","index.html"),p.join(t,"index.html")),i.message("ビルド先フォルダにO₂ Engineを設置しました")}catch(e){if(i.error("ビルド先フォルダへのO₂ Engineの設置に失敗しました"),a)return!1}var w=p.join(f,"plugin");if(l.existsSync(w))try{S.copyRSync(w,v),i.message("ビルド先フォルダにプラグインを設置しました")}catch(e){if(i.error("ビルド先フォルダへのプラグインの設置に失敗しました"),a)return!1}i.end("ビルドを完了しました"),s&&s(null)})})})})},this.execCompile=function(){var e=S.readdirRSync(p.join(f,"data")),n=[],t=new RegExp(".*\\.(ks|asd)$","i");e.filter(function(e){return l.statSync(e).isFile()&&t.test(e)}).forEach(function(e){n.push(e)});var o=p.join(f,"config.json"),s=l.readFileSync(o);try{var c=JSON.parse(s.toString("utf8").replace(/^\uFEFF/,"").replace(/\/\*[\s\S]+?\*\//g,"").replace(/\/\/.*/g,""))}catch(e){if(i.error("config.jsonの書式が正しくありません:\n"+e),a)return!1}y.configure({legacy:!!r.kag3,release:!!r.release});try{var u=y.parseFiles(n)}catch(e){if(i.error("スクリプトのコンパイル中にエラーが発生しました:\n"+e),a)return!1}if(u.warnings.length>0){i.warn("スクリプトのコンパイル中に警告が発生しました:");for(var d in u.warnings)i.warn(u.warnings[d])}return g={scripts:u.scripts,config:c},i.message("スクリプトのコンパイルを完了しました"),!0}},builder3=new Builder3;"undefined"!=typeof module&&require.main===module?builder3.run():(exports.build=function(e,n,r){var i={message:function(e){n(e,"normal",!1)},warn:function(e){n(e,"warn",!1)},error:function(e){n(e,"error",!0),r(e)},end:function(e){n(e,"normal",!0)}};setTimeout(function(){builder3.run(e,i,r)},300)},exports.getVersion=function(){return builder3.version()});