2017年3月30日木曜日

miniライブラリをもう少しminiにしつつデバッグ

関数リストと動作確認用サンプルをセットで保存するminiライブラリを先日公開しましたが、これが思いのほか使いやすくて気に入っています。
少し改良しました。

実行画面

アイコンはicooon-monoの素材を使用させていただきました。


以下ソース




プログラムソースを扱うソフトなのでテキストエリアはタブキーの操作に対応させようかとも思いましたが、「miniライブラリ」なのにソースが長くなるのに少し抵抗があったのでやめました。
動作確認用サンプルの一つとしてタブキー操作対応のhtaを保存しておけば用は足りますし、目的ごとにソースが分離できている方が分かり易いですし。


作成途中ですが現在の私のライブラリも公開します。
objMethod = {
"getsETN" : "getsETN=function(elem,name){return elem.getElementsByTagName(name)}",
"getPID" : "getPID=function(){\r\n var f=function(){\r\n // 子プロセスをcscriptにすると黒い画面が一瞬表示されてしまう。\r\n // 「//B」オプションを付けないとwscriptの設定画面が表示されてしまう。\r\n var childPID = (new ActiveXObject('WScript.Shell')).Exec('wscript //B').ProcessID\r\n \r\n // 子の親(自身)のPIDを特定する\r\n var res = new Enumerator(GetObject(\"winmgmts:root\\\\CIMV2\").ExecQuery(\"SELECT * FROM Win32_Process where ProcessID=\"+childPID))\r\n return res.atEnd() ? (void 0) : res.item().ParentProcessID\r\n }\r\n // 1度目で取得に成功すればその値を返し、ダメなら2回目の処理を実行する。\r\n return f() || f()\r\n}\r\n",
"getTime" : "getTime=function(d){return (d || (new Date())).getTime()}\r\n",
"getById" : "getsETN=function(id){return elem.getElementById(name)}",
"短縮(short word)" : "iT='innerText', iH='innerHTML', PA='parentNode', FI='firstChild', CN='childNodes', NE='nextSibling', PR='previousSibling', sI='selectedIndex', iB='insertBefore', OP='options', LEN='length'",
"hta:application" : "<HTA:APPLICATION\r\n APPLICATIONNAME=\"value\"\r\n BORDER=\"thick\" | \"dialog\" | \"none\" | \"thin\"\r\n BORDERSTYLE=\"normal\" | \"complex\" | \"raised\" | \"static\" | \"sunken\"\r\n CAPTION=\"yes\" | \"no\"\r\n CONTEXTMENU=\"yes\" | \"no\"\r\n ICON=\"value\"\r\n ID=\"value\"\r\n INNERBORDER=\"yes\" | \"no\"\r\n MAXIMIZEBUTTON=\"yes\" | \"no\"\r\n MINIMIZEBUTTON=\"yes\" | \"no\"\r\n NAVIGABLE=\"no\" | \"yes\"\r\n SCROLL=\"yes\" | \"no\" | \"auto\"\r\n SCROLLFLAT=\"no\" | \"yes\"\r\n SELECTION=\"yes\" | \"no\"\r\n SHOWINTASKBAR=\"yes\" | \"no\"\r\n SINGLEINSTANCE=\"no\" | \"yes\"\r\n SYSMENU=\"yes\" | \"no\"\r\n VERSION=\"value\"\r\n WINDOWSTATE=\"normal\" | \"maximize\" | \"minimize\" />",
"hta" : "<html>\r\n<head>\r\n <title></title>\r\n <style type=\"text/css\">\r\n .max{width:100%;height:100%}\r\n .w-max{width:100%}\r\n .nowrap{white-space:nowrap}\r\n .ta-c{text-align:center}\r\n .bc{border-collapse:collapse}\r\n .of-auto{overflow:auto}\r\n .of-hidden{overflow:hidden}\r\n .border1{border:solid 1px #000}\r\n </style>\r\n</head>\r\n<body>\r\n</body>\r\n<script>\r\n window.attachEvent('onload',function(){\r\n })\r\n</script>\r\n</html>\r\n",
"wsh" : "<job>\r\n<script>\r\n main = function(){\r\n // 汎用関数などの読み込みまで完了したらこの関数が呼ばれる。\r\n // この関数の終了=このスクリプトファイルの終了\r\n WScript.Echo(WScript.Arguments.length)\r\n }\r\n AXO=function(name){return new ActiveXOBject('Scripting.FileSystemObject')}\r\n main()\r\n</script>\r\n</job>\r\n",
"css" : " <style type=\"text/css\">\r\n .max{width:100%;height:100%}\r\n .w-max{width:100%}\r\n .nowrap{white-space:nowrap}\r\n .ta-c{text-align:center}\r\n .bc{border-collapse:collapse}\r\n .of-auto{overflow:auto}\r\n .of-hidden{overflow:hidden}\r\n .border1{border:solid 1px #000}\r\n </style>\r\n",
"基準フォルダ" : "基準フォルダ = function(){\r\n var path\r\n try{\r\n // HTA, HTMLの場合\r\n path = location.href\r\n }\r\n catch(e){\r\n // WSHの場合\r\n path = WScript.ScriptFullName\r\n }\r\n \r\n return decodeURI(path).replace(/^file:|[\\\\\\/][^\\\\\\/]+$/g,'').replace(/^\\/+([A-Z]:)/i,'$1'))\r\n}()\r\n\r\n↓短縮\r\n\r\n基準フォルダ = function(path){\r\n try{path = location.href}catch(e){path = WScript.ScriptFullName}\r\n return decodeURI(path).replace(/^file:|[\\\\\\/][^\\\\\\/]+$/g,'').replace(/^\\/+([A-Z]:)/i,'$1')\r\n}()\r\n",
"tab入力" : "タブスペース入力可にする=function(elem){\r\n elem.onkeydown=function(){\r\n if(elem.style.imeMode!='active' && event.keyCode!=9){return}\r\n event.cancelBubble = true\r\n var r=document.selection.createRange(), str=r.text\r\n if(event.shiftKey){\r\n if(str){\r\n r.text = str.replace(/\\n\\t|\\n {1,4}/g,'\\n').replace(/^\\t|^ {1,4}/,'')\r\n }else{\r\n r.moveEnd('character',4)\r\n r.text = r.text ? r.text.replace(/\\t| +/,'') : ''\r\n }\r\n }else{\r\n r.text = str ? ('\\t'+str.replace(/\\n/g,'\\n\\t')) : '\\t'\r\n }\r\n return false\r\n }\r\n}",
"getChilds" : "getChilds=function(){\r\n var tagName2接頭辞={button:'btn', input:'inp', select:'sel', a:'lnk', iframe:'ifr', table:'tbl', textarea:'ta'}\r\n var inp接頭辞={checkbox:'chk', radio:'rad', text:'inp', number:'num'}\r\n var arr階層=[], arr階層_i=0\r\n var get名前=function(){\r\n var F=function(prop, v){return {prop:prop, v:v}}\r\n var E, objNames={value:1, title:1, innerText:1}, forIn用=function(name){ return E[name] ? F(name, E[name]) : 0 }\r\n return function(elem){\r\n E = elem\r\n var obj=forIn(objNames, forIn用)\r\n if(obj){return obj}\r\n if(E.src){return F('src', E.src.replace(/[\\\\\\/]([^\\\\\\/]+)$/)[1])}\r\n }\r\n }()\r\n var return用obj, objクリア対象外={btn:1}\r\n var for0L用=function(i, elem){\r\n var name=(elem.tagName || '').toLowerCase()\r\n if(!name){return}\r\n arr階層[arr階層_i] = true\r\n arr階層[++arr階層_i] = false\r\n fun再帰(elem[CN])\r\n arr階層_i--\r\n \r\n // 例えば「<button>開始</button>」なら「btn開始」のような名前で参照できるようにする。\r\n var 接頭辞 = ((name=='input' ? inp接頭辞[elem.type] : '') || tagName2接頭辞[name] || name)\r\n var 名前 = get名前(elem)\r\n \r\n // 名前があってもそれがiT由来で、かつ子要素を持つエレメントの場合は参照の対象外。\r\n if(!名前 || 名前.prop!=iT || !arr階層[arr階層+1]){return用obj[接頭辞 + (名前 ? 名前.v : '')] = elem}\r\n \r\n // 名前.vが「*」から始まる場合は「*」のみ削除する。それ以外の場合は名前.v=''とする。\r\n if(名前 && !objクリア対象外[接頭辞] && (名前.prop!=iT || !arr階層[arr階層_i+1])){ elem[名前.prop] = 名前.v.charAt(0)=='*' ? 名前.v.replace(/^\\*/,'') : '' }\r\n \r\n arr階層.pop()\r\n }\r\n var fun再帰=function(cn){ for0L(cn,for0L用) }\r\n var getKey=function(elem, topElem){\r\n // topElemからelemに辿りつくためのFI, NEの配列を調べて返す。\r\n var arr=[]\r\n while(elem!=topElem && (elem[PR] || (elem[PA] && elem[PA].tagName))){\r\n if(elem[PR]){\r\n arr.unshift(NE); elem=elem[PR]\r\n }else{\r\n arr.unshift(FI); elem=elem[PA]\r\n }\r\n }\r\n return arr\r\n }\r\n var getClone = function(){\r\n // elemとobjChildsの関係性を丸ごと複製したものを作成して返す。\r\n var objModel=this, elemClone=objModel.elem.cloneNode(true), objRet={elem:elemClone}\r\n forIn(objModel, function(name, elem){\r\n // 列挙されるプロパティのうち「elem」は無視する。functionは参照コピーする。\r\n if(name=='elem'){return}\r\n if(typeof(elem)=='function'){objRet[name]=objModel[name]; return}\r\n \r\n var elemC=elemClone\r\n for0L(getKey(elem, objModel.elem), function(i, str){ elemC=elemC[str] })\r\n objRet[name] = elemC\r\n })\r\n return objRet\r\n }\r\n var removeNode = function(targetName){\r\n // 指定されたnameに対応するエレメントをremoveNodeする。\r\n // そのエレメントとそのエレメントに含まれている要素への参照用プロパティをまとめてdeleteする。\r\n \r\n var obj=this, objRet={elem:obj[targetName].removeNode(true)}, arr不正=[]\r\n forIn(obj, function(name,elem){\r\n if(name==targetName){delete obj[name]; return}\r\n if(typeof(elem)=='function'){objRet[name]=obj[name]; return}\r\n \r\n while(elem[PR] || (elem[PA] && elem[PA].tagName)){\r\n if(elem==obj.elem){return}\r\n elem = elem[elem[PR] ? PR : PA]\r\n }\r\n if(elem!=objRet.elem){arr不正.push(name); return alert(elem.tagName)}\r\n \r\n // ここまで継続したnameは参照解除の対象(removeNodeするエレメントの子要素)\r\n objRet[name] = obj[name]\r\n delete obj[name]\r\n })\r\n if(arr不正[LEN]){alert('以下が不正な参照状態になっています。\\nエレメントの削除はgetChildsが返すobjectのremoveNodeメソッドを使用してください。\\n\\n'+arr不正.join('\\n'))}\r\n return objRet\r\n }\r\n return function(elem){\r\n return用obj={elem:elem, getClone:getClone, removeNode:removeNode}\r\n fun再帰(elem[CN])\r\n return return用obj\r\n }\r\n}()\r\n",
"for0L" : "for0L = function(arr,fun){for(var i=0,L=arr[LEN],res;i<L;i++){if(res=fun(i,arr[i])){return res}}}",
"forIn" : "forIn = function(obj,fun){var name,res; for(name in obj){if(res=fun(name, obj[name])){return res}}}",
"試験.hta" : "試験=function(バラツキ確認回数, fun試験, fun試験前, fun試験後, fun全行程終了後){\r\n var 実施回数=0\r\n setTimeout(function(){\r\n setTimeout(function(){ fun試験前() },0)\r\n setTimeout(function(){ fun試験 () },0)\r\n setTimeout(function(){ fun試験後() },0)\r\n \r\n 実施回数++\r\n if(実施回数<バラツキ確認回数){setTimeout(arguments.callee, 0)}else{ fun全行程終了後() }\r\n },0)\r\n}",
"整数化" : "整数化=function(){\r\n var regDot=/\\.(\\d+)/, regE=/\\.(\\d+)e-(\\d+)/, arr, arrL, obj0\r\n var getObj=function(num){\r\n var str=num+'', 桁数=0\r\n while(1){\r\n if(str.match(regE )){ 桁数=RegExp.$2-(-3) ; str=str.replace(regE ,'$1'); break }\r\n if(str.match(regDot)){ 桁数=RegExp.$1.length; str=str.replace(regDot,'$1'); break }\r\n break\r\n }\r\n return {元:num, str:str, 桁数:arr[arrL++]=桁数}\r\n }\r\n return function(obj, func){\r\n arr = []\r\n arrL = 0\r\n obj0 = {}\r\n forIn(obj,function(name, v){ obj0[name] = getObj(v) })\r\n var max=Math.max.apply(null, arr), obj1={}\r\n forIn(obj0,function(name, v){\r\n obj1[name] = (v.str + Array(max-v.桁数+1).join(0)) - 0\r\n \r\n // 言語で扱える数字のサイズを超えてしまった場合は通知する。\r\n if(!isFinite(obj1[name])){ alert('整数化失敗\\nisFinite=false\\n'+obj[name]+'\\nstr:'+str) }\r\n \r\n // 万が一整数化に失敗した場合はどのような値で失敗したのか通知する。\r\n if(0<(''+obj1[name]).indexOf('.') && !(''+obj1[name]).match(/e\\+/)){ WScript.Echo('整数化失敗\\n'+obj1[name]+'\\nstr:'+v.str) }\r\n })\r\n return func(obj1) / (1+Array(max+1).join(0))\r\n }\r\n}()\r\n",
"傾き補正3D" : "傾き補正=function(arr2D){\r\n // 2次元配列内部の左上、右上、左下、右下のうち2箇所以上が0になるように配列全体の値を補正する。\r\n \r\n var lenX=arr2D[0][LEN]-1, lenY=arr2D[LEN]-1\r\n var get四つ角=function(arr){ return {LT:arr[0][0], RT:arr[0][lenX], LB:arr[lenY][0], RB:arr[lenY][lenX]} }\r\n var get補正係数=function(v00, v01, v10, v11, 軸max){\r\n var obj\r\n if(Math.abs(v00-v01) < Math.abs(v10-v11)){ obj={v0:v00, v1:v01} }else{ obj={v0:v10, v1:v11} }\r\n obj.rad=Math.atan2(整数化(obj, function(obj){return obj.v0-obj.v1}), 軸max)\r\n obj.min=Math.min(obj.v0,obj.v1)\r\n return obj\r\n }\r\n \r\n // X軸\r\n with(get四つ角(arr2D)){var obj係数=get補正係数(RT,LT,RB,LB,lenX), newArr0=[]}\r\n for0L(arr2D, function(Y, arrX){\r\n newArr0[Y] = []\r\n for0L(arrX, function(X, v){\r\n newArr0[Y][X] = 整数化({v:v, min:obj係数.min}, function(o){return o.v - o.min}) - X*Math.tan(obj係数.rad)\r\n })\r\n })\r\n \r\n // Y軸\r\n with(get四つ角(newArr0)){var obj係数=get補正係数(RT,RB,LT,LB,lenY), newArr1=[]}\r\n for0L(newArr0, function(Y){newArr1[Y] = []})\r\n for0L(newArr0[0], function(X){\r\n for0L(newArr0, function(Y){\r\n newArr1[Y][X] = 整数化({v:newArr0[Y][X], min:obj係数.min}, function(o){return o.v - o.min}) - Y*Math.tan(-obj係数.rad)\r\n })\r\n })\r\n \r\n // 最小値を0にする\r\n var arrMin=[]\r\n for0L(newArr1, function(Y,arrX){ arrMin[Y] = Math.min.apply(null,arrX) })\r\n var min=Math.min.apply(null, arrMin)\r\n for0L(newArr1,function(Y,arrX){\r\n for0L(arrX,function(X,v){\r\n arrX[X] = 整数化({min:min, v:v}, function(o){return o.v-o.min})\r\n })\r\n })\r\n \r\n return newArr1\r\n}\r\n",
"日時を省略表記" : "str2dat=function(){\r\n var 桁=function(num,桁数){var str0=num+'', str1=Array(桁数+1).join(0)+num; return (桁数 < str0.length) ? str0 : str1.slice(str1.length-桁数,str1.length)}\r\n var nd=function(){\r\n var toStr=function(フォーマット){\r\n // フォーマットは「YY/MM/DD hh:mm:ss」のような文字列\r\n var d=this.dat, obj={Y:d.getFullYear(), M:d.getMonth()+1, D:d.getDate(), h:d.getHours(), m:d.getMinutes(), s:d.getSeconds()}, chr, reg, res\r\n for(chr in obj){\r\n reg = new RegExp(chr+'+')\r\n res = フォーマット.match(reg)\r\n if(!res){continue}\r\n フォーマット = フォーマット.replace(reg, 桁(obj[chr], res[0].length))\r\n }\r\n return フォーマット\r\n }\r\n return function(d){\r\n return { dat:d || (new Date()), toStr:toStr }\r\n }\r\n }()\r\n var R=RegExp\r\n var rY=/^[^\\d]*(\\d{4})\\//, rMD=/(\\d{1,2})\\/(\\d{1,2})/, rHM=/(\\d{1,2}):(\\d{1,2})/, rYMD=/(\\d{4})\\/?(\\d{2})\\/?(\\d{2})/, rFull=/(\\d{4})\\/?(\\d{2})\\/?(\\d{2}) *(\\d{2}):?(\\d{2})/, rD2D2=/(\\d{2})(\\d{2})[^\\d]*?$/\r\n return function(str, datBA, swBefore){\r\n // datBA(Dateオブジェクト)は有っても無くてもOK\r\n // datBAを指定するとdatBAよりも(swBeforeがfalseなら後ろ、trueなら前)の日時を返す。\r\n var str0=str, obj={}, rC=function(){str0=R.rightContext}\r\n if(str0 && str0.match(rFull)){ obj={Y:R.$1, M:R.$2, D:R.$3, h:R.$4, m:R.$5}, str0='' }\r\n if(str0 && str0.match(rY)){ obj.Y=R.$1, rC() }\r\n if(str0 && str0.match(rMD)){ obj.M=R.$1, obj.D=R.$2, rC() }\r\n if(str0 && str0.match(rHM)){ obj.h=R.$1, obj.m=R.$2, rC() }\r\n if(str0 && str0.match(rYMD)){ obj.Y=R.$1, obj.M=R.$2, obj.D=R.$3, rC() }\r\n if(str0 && str0.match(rD2D2)){ obj.h=R.$1, obj.m=R.$2, str0=R.leftContext }\r\n if(str0 && str0.match(rD2D2)){ obj.M=R.$1, obj.D=R.$2, str0=R.leftContext }\r\n var d=nd(), Y=obj.Y || d.toStr('Y'), M=obj.M || d.toStr('M'), D=obj.D || 1, h=obj.h || d.toStr('h'), m=obj.m || d.toStr('m')\r\n var str1 = [Y,M,D].join('/') + (obj.h ? (' '+[h,m].join(':')) : ''), dat=new Date(str1)\r\n if(datBA && !isNaN(dat) && !obj.Y){\r\n var T=datBA.getTime()\r\n while((!swBefore && (dat.getTime() <= T)) || (swBefore && (T <= dat.getTime()))){\r\n if(isFinite(obj.M)){ dat.setFullYear(dat.getFullYear()+(swBefore?-1:1)) }else{ dat.setDate(dat.getDate()+(swBefore?-1:1)) }\r\n }\r\n }\r\n div.innerText = '['+str1+']'\r\n div.innerText += '\\n' + nd(dat).toStr('Y/MM/DD hh:mm:ss')\r\n }\r\n}()\r\n",
"桁" : "桁=function(num,桁数){\r\n var str0=num+'', str1=Array(桁数+1).join(0)+num\r\n return (桁数 < str0.length) ? str0 : str1.slice(str1.length-桁数,str1.length)\r\n}",
"相対日時" : "setDate=function(dat0, str条件, swBefore){\r\n // datより後(swBefore=trueなら前)の日時(str条件と一致するタイミング)を返す。\r\n // obj条件の中身は'M1D2'のような形式。'M1D2'なら「1月2日」の意味。\r\n var dat=new Date(dat0), obj={}, reg=/([^\\d])(\\d+)/, res, objMethod={Y:'setFullYear', M:'setMonth', D:'setDate', h:'setHours', m:'setMinutes'}, chr, T=dat.getTime()\r\n while(res=str条件.match(reg)){\r\n obj[res[1]] = res[2]-0\r\n str条件 = RegExp.rightContext\r\n }\r\n if(obj.Y){\r\n if((swBefore && dat.getFullYear()<obj.Y) || (!swBefore && obj.Y<dat.getFullYear())){\r\n // 条件が矛盾(swBefore=trueなのにdatが2016年、obj.Yは2017とか)の場合は何もしない。\r\n return dat\r\n }\r\n dat.setFullYear(obj.Y, obj.M-1, obj.D)\r\n }\r\n while(1){\r\n for(chr in objMethod){ chr!='Y' && isFinite(obj[chr]) && dat[objMethod[chr]](obj[chr]-(chr=='M'?1:0)) }\r\n if((swBefore && dat.getTime()<T) || (!swBefore && T<dat.getTime())){break}\r\n var 一つ前\r\n for(chr in objMethod){\r\n if(chr=='Y' || !obj[chr]){\r\n 一つ前 = chr\r\n continue\r\n }\r\n dat[objMethod[一つ前]]( dat[objMethod[一つ前].replace(/^set/,'get')]() + (swBefore ? -1:1) )\r\n break\r\n }\r\n }\r\n return dat\r\n}\r\nsetDay=function(dat, 曜日, swBefore){\r\n // 先週月曜、とか来週火曜、のDateオブジェクトを返す。\r\n var num='日月火水木金土'.indexOf(曜日), newD=new Date(dat), num元=newD.getDay()\r\n newD.setDate( newD.getDate() + (swBefore ? (num元<num?-7:0) : (num<num元?7:0)) + (num-num元) )\r\n return newD\r\n}\r\n",
"動作テスト機能付きHTMLソース作成" : "",
"RegExp" : ""
}
objSample = {
"getsETN":{
"sample.hta" : "<html>\r\n<title>getsETN</title>\r\n<body>\r\n <div>1</div>\r\n <div>2</div>\r\n <div>3</div>\r\n</body>\r\n<script>\r\n resizeTo(200,140)\r\n getsETN=function(elem,name){return elem.getElementsByTagName(name)}\r\n onload=function(){\r\n var arrDIV=getsETN(document.body,'div')\r\n arrDIV[0].innerText = 123\r\n }\r\n</script>\r\n</html>\r\n"
},
"getPID":{
"sample.wsf" : "<job>\r\n<script>\r\ngetPID=function(){\r\n var f=function(){\r\n // 子プロセスをcscriptにすると黒い画面が一瞬表示されてしまう。\r\n // 「//B」オプションを付けないとwscriptの設定画面が表示されてしまう。\r\n var childPID = (new ActiveXObject('WScript.Shell')).Exec('wscript //B').ProcessID\r\n \r\n // 子の親(自身)のPIDを特定する\r\n var res = new Enumerator(GetObject(\"winmgmts:root\\\\CIMV2\").ExecQuery(\"SELECT * FROM Win32_Process where ProcessID=\"+childPID))\r\n return res.atEnd() ? (void 0) : res.item().ParentProcessID\r\n }\r\n // 1度目で取得に成功すればその値を返し、ダメなら2回目の処理を実行する。\r\n return f() || f()\r\n}\r\nWScript.Echo(getPID())\r\n</script>\r\n</job>\r\n"
},
"getTime":{
"sample.wsf" : "<job>\r\n<script>\r\ngetTime=function(d){return (d || (new Date())).getTime()}\r\nWScript.Echo(getTime())\r\n</script>\r\n</job>\r\n"
},
"wsh":{
"sample.wsf" : "<job>\r\n<script>\r\n main = function(){\r\n // 汎用関数などの読み込みまで完了したらこの関数が呼ばれる。\r\n // この関数の終了=このスクリプトファイルの終了\r\n WScript.Echo(WScript.Arguments.length)\r\n }\r\n AXO=function(name){return new ActiveXOBject('Scripting.FileSystemObject')}\r\n main()\r\n</script>\r\n</job>\r\n"
},
"基準フォルダ":{
"sample.wsf" : "<job>\r\n<script>\r\n基準フォルダ = function(path){\r\n try{path = location.href}catch(e){path = WScript.ScriptFullName}\r\n return decodeURI(path).replace(/^file:|[\\\\\\/][^\\\\\\/]+$/g,'').replace(/^\\/+([A-Z]:)/i,'$1')\r\n}()\r\nWScript.Echo(基準フォルダ)\r\n</script>\r\n</job>\r\n",
"sample.hta" : "<html>\r\n<script>\r\n基準フォルダ = function(path){\r\n try{path = location.href}catch(e){path = WScript.ScriptFullName}\r\n return decodeURI(path).replace(/^file:|[\\\\\\/][^\\\\\\/]+$/g,'').replace(/^\\/+([A-Z]:)/i,'$1')\r\n}()\r\nconfirm(基準フォルダ)\r\nwindow.close()\r\n</script>\r\n</html>\r\n"
},
"tab入力":{
"sample.hta" : "<html>\r\n<title>tabスペース</title>\r\n<body style=\"overflow:hidden\">\r\n<textarea style=\"width:100%;height:100%\" wrap=off></textarea>\r\n</body>\r\n<script>\r\nresizeTo(300,300)\r\nonload=function(){\r\n タブスペース入力可にする(document.getElementsByTagName('textarea')[0])\r\n}\r\nタブスペース入力可にする=function(elem){\r\n elem.onkeydown=function(){\r\n if(elem.style.imeMode!='active' && event.keyCode!=9){return}\r\n event.cancelBubble = true\r\n var r=document.selection.createRange(), str=r.text\r\n if(event.shiftKey){\r\n if(str){\r\n r.text = str.replace(/\\n\\t|\\n {1,4}/g,'\\n').replace(/^\\t|^ {1,4}/,'')\r\n }else{\r\n r.moveEnd('character',4)\r\n r.text = r.text ? r.text.replace(/\\t| +/,'') : ''\r\n }\r\n }else{\r\n r.text = str ? ('\\t'+str.replace(/\\n/g,'\\n\\t')) : '\\t'\r\n }\r\n return false\r\n }\r\n}\r\n</script>\r\n</html>"
},
"getChilds":{
"sample.hta" : "<html>\r\n<title>getChilds</title>\r\n<body>\r\n <div id=div>\r\n <div>\r\n <div title=123>\r\n <div title=456>\r\n <span>789</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div id=div0 style=\"border:solid 1px #000;\"></div>\r\n</body>\r\n<script>\r\n resizeTo(400,400)\r\n onload = function(){\r\n var obj=getChilds(div[FI]), d456=obj.removeNode('div456')\r\n \r\n // getChildsを利用したエレメントやその子要素に対してremoveNodeしたい場合は\r\n // getChildsが返したオブジェクトに紐づいているremoveNodeメソッドを利用する。\r\n // エレメントに対して直接removeNodeを実行してしまうと、getChildsが返したオブジェクトについているプロパティからの参照が残ってしまう。\r\n // removeNodeしたエレメントを使いまわすにしても参照先が不正という問題もあるので、removeNodeする場合はオブジェクトのメソッドを利用すること。\r\n \r\n var objClone=obj.getClone()\r\n div[iB](objClone.elem)\r\n div[iB](d456.elem)\r\n \r\n d456.span789[iT] = 'obj.div456:'+obj.div456+'\\nobjClone.div456:'+objClone.div456\r\n \r\n div0.innerText = div.innerHTML\r\n }\r\n iT='innerText', iH='innerHTML', PA='parentNode', FI='firstChild', CN='childNodes', NE='nextSibling', PR='previousSibling', sI='selectedIndex', iB='insertBefore', OP='options', LEN='length'\r\n for0L = function(arr,fun){for(var i=0,L=arr[LEN],res;i<L;i++){if(res=fun(i,arr[i])){return res}}}\r\n forIn = function(obj,fun){var name,res; for(name in obj){if(res=fun(name, obj[name])){return res}}}\r\n getChilds=function(){\r\n var tagName2接頭辞={button:'btn', input:'inp', select:'sel', a:'lnk', iframe:'ifr', table:'tbl', textarea:'ta'}\r\n var inp接頭辞={checkbox:'chk', radio:'rad', text:'inp', number:'num'}\r\n var arr階層=[], arr階層_i=0\r\n var get名前=function(){\r\n var F=function(prop, v){return {prop:prop, v:v}}\r\n var E, objNames={value:1, title:1, innerText:1}, forIn用=function(name){ return E[name] ? F(name, E[name]) : 0 }\r\n return function(elem){\r\n E = elem\r\n var obj=forIn(objNames, forIn用)\r\n if(obj){return obj}\r\n if(E.src){return F('src', E.src.replace(/[\\\\\\/]([^\\\\\\/]+)$/)[1])}\r\n }\r\n }()\r\n var return用obj, objクリア対象外={btn:1}\r\n var for0L用=function(i, elem){\r\n var name=(elem.tagName || '').toLowerCase()\r\n if(!name){return}\r\n arr階層[arr階層_i] = true\r\n arr階層[++arr階層_i] = false\r\n fun再帰(elem[CN])\r\n arr階層_i--\r\n \r\n // 例えば「<button>開始</button>」なら「btn開始」のような名前で参照できるようにする。\r\n var 接頭辞 = ((name=='input' ? inp接頭辞[elem.type] : '') || tagName2接頭辞[name] || name)\r\n var 名前 = get名前(elem)\r\n \r\n // 名前があってもそれがiT由来で、かつ子要素を持つエレメントの場合は参照の対象外。\r\n if(!名前 || 名前.prop!=iT || !arr階層[arr階層+1]){return用obj[接頭辞 + (名前 ? 名前.v : '')] = elem}\r\n \r\n // 名前.vが「*」から始まる場合は「*」のみ削除する。それ以外の場合は名前.v=''とする。\r\n if(名前 && !objクリア対象外[接頭辞] && (名前.prop!=iT || !arr階層[arr階層_i+1])){ elem[名前.prop] = 名前.v.charAt(0)=='*' ? 名前.v.replace(/^\\*/,'') : '' }\r\n \r\n arr階層.pop()\r\n }\r\n var fun再帰=function(cn){ for0L(cn,for0L用) }\r\n var getKey=function(elem, topElem){\r\n // topElemからelemに辿りつくためのFI, NEの配列を調べて返す。\r\n var arr=[]\r\n while(elem!=topElem && (elem[PR] || (elem[PA] && elem[PA].tagName))){\r\n if(elem[PR]){\r\n arr.unshift(NE); elem=elem[PR]\r\n }else{\r\n arr.unshift(FI); elem=elem[PA]\r\n }\r\n }\r\n return arr\r\n }\r\n var getClone = function(){\r\n // elemとobjChildsの関係性を丸ごと複製したものを作成して返す。\r\n var objModel=this, elemClone=objModel.elem.cloneNode(true), objRet={elem:elemClone}\r\n forIn(objModel, function(name, elem){\r\n // 列挙されるプロパティのうち「elem」は無視する。functionは参照コピーする。\r\n if(name=='elem'){return}\r\n if(typeof(elem)=='function'){objRet[name]=objModel[name]; return}\r\n \r\n var elemC=elemClone\r\n for0L(getKey(elem, objModel.elem), function(i, str){ elemC=elemC[str] })\r\n objRet[name] = elemC\r\n })\r\n return objRet\r\n }\r\n var removeNode = function(targetName){\r\n // 指定されたnameに対応するエレメントをremoveNodeする。\r\n // そのエレメントとそのエレメントに含まれている要素への参照用プロパティをまとめてdeleteする。\r\n \r\n var obj=this, objRet={elem:obj[targetName].removeNode(true)}, arr不正=[]\r\n forIn(obj, function(name,elem){\r\n if(name==targetName){delete obj[name]; return}\r\n if(typeof(elem)=='function'){objRet[name]=obj[name]; return}\r\n \r\n while(elem[PR] || (elem[PA] && elem[PA].tagName)){\r\n if(elem==obj.elem){return}\r\n elem = elem[elem[PR] ? PR : PA]\r\n }\r\n if(elem!=objRet.elem){arr不正.push(name); return alert(elem.tagName)}\r\n \r\n // ここまで継続したnameは参照解除の対象(removeNodeするエレメントの子要素)\r\n objRet[name] = obj[name]\r\n delete obj[name]\r\n })\r\n if(arr不正[LEN]){alert('以下が不正な参照状態になっています。\\nエレメントの削除はgetChildsが返すobjectのremoveNodeメソッドを使用してください。\\n\\n'+arr不正.join('\\n'))}\r\n return objRet\r\n }\r\n return function(elem){\r\n return用obj={elem:elem, getClone:getClone, removeNode:removeNode}\r\n fun再帰(elem[CN])\r\n return return用obj\r\n }\r\n }()\r\n</script>\r\n</html>\r\n"
},
"試験.hta":{
"sample.hta" : "<html>\r\n<title>試験</title>\r\n<body>\r\n <table id=tbl border=1><tr><td></td><td></td></tr></table>\r\n <input id=inp0>\r\n <input id=inp1>\r\n <input id=inp2>\r\n <input id=inp3>\r\n <div id=div></div>\r\n</body>\r\n<script>\r\n resizeTo(400,300)\r\n onload=function(){\r\n var 試験回数=10000, バラツキ確認回数=100, arrS=[], arrE=[], arr解放後=[], obj試験用={}, obj累積={}\r\n 試験(バラツキ確認回数,function(){\r\n arrS.push(getメモリ使用量())\r\n for(var i=0; i<試験回数 ;i++){obj累積[arrS.length*試験回数+i] = obj試験用[i] = tbl}\r\n arrE.push(getメモリ使用量())\r\n obj試験用 = {}\r\n arr解放後.push(getメモリ使用量())\r\n },\r\n function(){ },\r\n function(){ },\r\n function(){\r\n var arr差ES=[], arr差E解=[], sumES=0, sumE解=0\r\n for(var i=0,L=arrS.length; i<L ;i++){\r\n sumES += arr差ES [i] = arrE[i] - arrS[i]\r\n sumE解 += arr差E解[i] = arrE[i] - arr解放後[i]\r\n }\r\n var obj={\r\n 試験回数:試験回数,\r\n バラツキ確認回数:バラツキ確認回数,\r\n 'arrE[n]-arrS[n].max':Math.max.apply(null,arr差ES),\r\n 'arrE[n]-arrS[n].min':Math.min.apply(null,arr差ES),\r\n 'arrE[n]-arrS[n].average':(sumES/L),\r\n 'arrE[n]-arr解[n].max':Math.max.apply(null,arr差E解),\r\n 'arrE[n]-arr解[n].min':Math.min.apply(null,arr差E解),\r\n 'arrE[n]-arr解[n].average':(sumE解/L)\r\n }\r\n var tbo=tbl.firstChild, tr=tbo.firstChild.removeNode(true), tds, newTR\r\n for(name in obj){\r\n tbo.insertBefore(newTR=tr.cloneNode(true))\r\n tds = newTR.childNodes\r\n tds[0].innerText = name\r\n tds[1].innerText = obj[name]\r\n }\r\n inp0.value = arrS\r\n inp1.value = arrE\r\n inp2.value = arr解放後\r\n inp3.value = ''\r\n setInterval(function(){\r\n inp3.value += getメモリ使用量()+','\r\n },10)\r\n setTimeout(function(){ obj累積=null },5000)\r\n })\r\n }\r\n \r\n// document.body.onclick=function(){ document.title = getメモリ使用量() }\r\n \r\n 試験=function(バラツキ確認回数, fun試験, fun試験前, fun試験後, fun全行程終了後){\r\n var 実施回数=0\r\n setTimeout(function(){\r\n setTimeout(function(){ fun試験前() },0)\r\n setTimeout(function(){ fun試験 () },0)\r\n setTimeout(function(){ fun試験後() },0)\r\n \r\n 実施回数++\r\n if(実施回数<バラツキ確認回数){setTimeout(arguments.callee, 0)}else{ fun全行程終了後() }\r\n },0)\r\n }\r\n \r\n getメモリ使用量=function(){\r\n var res = new Enumerator(GetObject(\"winmgmts:root\\\\CIMV2\").ExecQuery(\"SELECT * FROM Win32_Process where ProcessID=\"+getPID()))\r\n return res.atEnd() ? (void 0) : res.item().PageFileUsage\r\n }\r\n getPID=function(){\r\n var f=function(){\r\n // 子プロセスをcscriptにすると黒い画面が一瞬表示されてしまう。\r\n // 「//B」オプションを付けないとwscriptの設定画面が表示されてしまう。\r\n var childPID = (new ActiveXObject('WScript.Shell')).Exec('wscript //B').ProcessID\r\n \r\n // 子の親(自身)のPIDを特定する\r\n var res = new Enumerator(GetObject(\"winmgmts:root\\\\CIMV2\").ExecQuery(\"SELECT * FROM Win32_Process where ProcessID=\"+childPID))\r\n return res.atEnd() ? (void 0) : res.item().ParentProcessID\r\n }\r\n // 1度目で取得に成功すればその値を返し、ダメなら2回目の処理を実行する。\r\n return f() || f()\r\n }\r\n \r\n gt=function(){return (new Date()).getTime()}\r\n loop試験 = function(回数, fun){\r\n for(var s=gt(),i=0;i<回数;i++){ fun() }\r\n return gt() - s\r\n }\r\n</script>\r\n</html>\r\n"
},
"整数化":{
"sample.wsf" : "<job>\r\n<script>\r\n LEN='length'\r\n forIn = function(obj,fun){var name,res; for(name in obj){if(res=fun(name, obj[name])){return res}}}\r\n \r\n switch(2){\r\n case 0:\r\n // 以下では「66.9+0.01」の結果が「66.89000000000001」になってしまう。\r\n 整数化=function(){\r\n var reg=/\\.(\\d+)/, get桁数=function(num){return (num+'').match(reg) ? RegExp.$1.length : 0}\r\n var obj0, arr0, arr0L, obj1, forIn用=function(name,v){ arr0[arr0L++]=get桁数(v) }, max, x, 反映=function(name,v){ obj1[name] = v * x }\r\n var check=function(name,v){(v+'').match(reg) && WScript.Echo([v,x].join('\\n'))}\r\n return function(obj, fun){\r\n arr0 = []\r\n arr0L= 0\r\n obj1 = {}\r\n forIn(obj0=obj, forIn用)\r\n max=Math.max.apply(null, arr0), x=(1+Array(max+1).join(0))-0\r\n forIn(obj0, 反映)\r\n forIn(obj1, check)\r\n return fun(obj1) / x\r\n }\r\n }()\r\n break\r\n case 1:\r\n // 以下では「1.234e-16」のような値に対応できない。\r\n 整数化=function(){\r\n var reg=/\\.(\\d+)/, arr, arrL, obj0\r\n var getObj=function(num){\r\n var str=num+'', obj={元:num, str:str.replace(reg,'$1'), 桁数:arr[arrL++]=RegExp.$1.length}\r\n return obj\r\n }\r\n return function(obj, func){\r\n arr = []\r\n arrL = 0\r\n obj0 = {}\r\n forIn(obj,function(name, v){ obj0[name] = getObj(v) })\r\n var max=Math.max.apply(null, arr), obj1={}\r\n forIn(obj0,function(name, v){\r\n obj1[name] = (v.str + Array(max-v.桁数+1).join(0)) - 0\r\n \r\n // 万が一整数化に失敗した場合はどのような値で失敗したのか通知する。\r\n if(0<(''+obj1[name]).indexOf('.')){ WScript.Echo('整数化失敗\\n'+obj1[name]+'\\nstr:'+v.str) }\r\n })\r\n return func(obj1) / (1+Array(max+1).join(0))\r\n }\r\n }()\r\n break\r\n case 2:\r\n 整数化=function(){\r\n var regDot=/\\.(\\d+)/, regE=/\\.(\\d+)e-(\\d+)/, arr, arrL, obj0\r\n var getObj=function(num){\r\n var str=num+'', 桁数=0\r\n while(1){\r\n if(str.match(regE )){ 桁数=RegExp.$2-(-3) ; str=str.replace(regE ,'$1'); break }\r\n if(str.match(regDot)){ 桁数=RegExp.$1.length; str=str.replace(regDot,'$1'); break }\r\n break\r\n }\r\n return {元:num, str:str, 桁数:arr[arrL++]=桁数}\r\n }\r\n return function(obj, func){\r\n arr = []\r\n arrL = 0\r\n obj0 = {}\r\n forIn(obj,function(name, v){ obj0[name] = getObj(v) })\r\n var max=Math.max.apply(null, arr), obj1={}\r\n forIn(obj0,function(name, v){\r\n obj1[name] = (v.str + Array(max-v.桁数+1).join(0)) - 0\r\n \r\n // 言語で扱える数字のサイズを超えてしまった場合は通知する。\r\n if(!isFinite(obj1[name])){ alert('整数化失敗\\nisFinite=false\\n'+obj[name]+'\\nstr:'+str) }\r\n \r\n // 万が一整数化に失敗した場合はどのような値で失敗したのか通知する。\r\n if(0<(''+obj1[name]).indexOf('.') && !(''+obj1[name]).match(/e\\+/)){ WScript.Echo('整数化失敗\\n'+obj1[name]+'\\nstr:'+v.str) }\r\n })\r\n return func(obj1) / (1+Array(max+1).join(0))\r\n }\r\n }()\r\n break\r\n }\r\n \r\n a = -20.41\r\n b = -43.3\r\n c = a - b\r\n d = 整数化({a:a, b:b}, function(obj){return obj.a - obj.b})\r\n \r\n e = 66.9\r\n f = 0.01\r\n g = 整数化({e:e, f:f}, function(obj){return obj.e - obj.f})\r\n \r\n h = 90071992547409.92\r\n i = 1.234e-16\r\n j = 整数化([h,i], function(arr){return arr[0] - arr[1]})\r\n \r\n // 22.889999999999997\r\n // 22.89\r\n WScript.Echo([c,d,g,j].join('\\n'))\r\n</script>\r\n</job>\r\n"
},
"傾き補正3D":{
"sample.hta" : "<html>\r\n<title>傾き補正</title>\r\n<body style=\"text-align:center;overflow:hidden\">\r\n<textarea id=ta0 wrap=off style=\"width:100%;height:42%\"></textarea>\r\n<button id=btn style=\"width:100%;height:16%\">↓</button>\r\n<textarea id=ta1 wrap=off style=\"width:100%;height:42%\"></textarea>\r\n</body>\r\n<script>\r\n resizeTo(300,300)\r\n btn.onclick=function(){\r\n var arr2D=ta0.value.split('\\r\\n')\r\n for0L(arr2D, function(i,str){ arr2D[i] = str.split('\\t') })\r\n if(arr2D[arr2D[LEN]-1][LEN]==1){arr2D.pop()}\r\n \r\n var arr2D_ = 傾き補正(arr2D)\r\n for0L(arr2D_, function(i,arr){ arr2D_[i] = arr.join('\\t') })\r\n ta1.value = arr2D_.join('\\r\\n')\r\n }\r\n \r\n 整数化=function(){\r\n var regDot=/\\.(\\d+)/, regE=/\\.(\\d+)e-(\\d+)/, arr, arrL, obj0\r\n var getObj=function(num){\r\n var str=num+'', 桁数=0\r\n while(1){\r\n if(str.match(regE )){ 桁数=RegExp.$2-(-3) ; str=str.replace(regE ,'$1'); break }\r\n if(str.match(regDot)){ 桁数=RegExp.$1.length; str=str.replace(regDot,'$1'); break }\r\n break\r\n }\r\n return {元:num, str:str, 桁数:arr[arrL++]=桁数}\r\n }\r\n return function(obj, func){\r\n arr = []\r\n arrL = 0\r\n obj0 = {}\r\n forIn(obj,function(name, v){ obj0[name] = getObj(v) })\r\n var max=Math.max.apply(null, arr), obj1={}\r\n forIn(obj0,function(name, v){\r\n obj1[name] = (v.str + Array(max-v.桁数+1).join(0)) - 0\r\n \r\n // 言語で扱える数字のサイズを超えてしまった場合は通知する。\r\n if(!isFinite(obj1[name])){ alert('整数化失敗\\nisFinite=false\\n'+obj[name]+'\\nstr:'+str) }\r\n \r\n // 万が一整数化に失敗した場合はどのような値で失敗したのか通知する。\r\n if(0<(''+obj1[name]).indexOf('.') && !(''+obj1[name]).match(/e\\+/)){ alert('整数化失敗\\n'+obj1[name]+'\\nstr:'+v.str) }\r\n })\r\n return func(obj1) / (1+Array(max+1).join(0))\r\n }\r\n }()\r\n me=function(){return arguments.callee.caller}\r\n 傾き補正=function(arr2D){\r\n // 2次元配列内部の左上、右上、左下、右下のうち2箇所以上が0になるように配列全体の値を補正する。\r\n \r\n var lenX=arr2D[0][LEN]-1, lenY=arr2D[LEN]-1\r\n var get四つ角=function(arr){ return {LT:arr[0][0], RT:arr[0][lenX], LB:arr[lenY][0], RB:arr[lenY][lenX]} }\r\n var get補正係数=function(v00, v01, v10, v11, 軸max){\r\n var obj\r\n if(Math.abs(v00-v01) < Math.abs(v10-v11)){ obj={v0:v00, v1:v01} }else{ obj={v0:v10, v1:v11} }\r\n obj.rad=Math.atan2(整数化(obj, function(obj){return obj.v0-obj.v1}), 軸max)\r\n obj.min=Math.min(obj.v0,obj.v1)\r\n return obj\r\n }\r\n \r\n // X軸\r\n with(get四つ角(arr2D)){var obj係数=get補正係数(RT,LT,RB,LB,lenX), newArr0=[]}\r\n for0L(arr2D, function(Y, arrX){\r\n newArr0[Y] = []\r\n for0L(arrX, function(X, v){\r\n newArr0[Y][X] = 整数化({v:v, min:obj係数.min}, function(o){return o.v - o.min}) - X*Math.tan(obj係数.rad)\r\n })\r\n })\r\n \r\n // Y軸\r\n with(get四つ角(newArr0)){var obj係数=get補正係数(RT,RB,LT,LB,lenY), newArr1=[]}\r\n for0L(newArr0, function(Y){newArr1[Y] = []})\r\n for0L(newArr0[0], function(X){\r\n for0L(newArr0, function(Y){\r\n newArr1[Y][X] = 整数化({v:newArr0[Y][X], min:obj係数.min}, function(o){return o.v - o.min}) - Y*Math.tan(-obj係数.rad)\r\n })\r\n })\r\n \r\n // 最小値を0にする\r\n var arrMin=[]\r\n for0L(newArr1, function(Y,arrX){ arrMin[Y] = Math.min.apply(null,arrX) })\r\n var min=Math.min.apply(null, arrMin)\r\n for0L(newArr1,function(Y,arrX){\r\n for0L(arrX,function(X,v){\r\n arrX[X] = 整数化({min:min, v:v}, function(o){return o.v-o.min})\r\n })\r\n })\r\n \r\n return newArr1\r\n }\r\n \r\n LEN='length'\r\n for0L = function(arr,fun){for(var i=0,L=arr[LEN],res;i<L;i++){if(res=fun(i,arr[i])){return res}}}\r\n forIn = function(obj,fun){var name,res; for(name in obj){if(res=fun(name, obj[name])){return res}}}\r\n</script>\r\n</html>\r\n"
},
"日時を省略表記":{
"sample.hta" : "<html>\r\n<title>日時を省略表記</title>\r\n<body>\r\n <input id=inp>\r\n <label><input type=checkbox id=chk>before</label>\r\n <div id=div></div>\r\n</body>\r\n<script>\r\n resizeTo(250,150)\r\n inp.onkeyup=function(){ str2dat(this.value, new Date(), chk.checked) }\r\n str2dat=function(){\r\n var 桁=function(num,桁数){var str0=num+'', str1=Array(桁数+1).join(0)+num; return (桁数 < str0.length) ? str0 : str1.slice(str1.length-桁数,str1.length)}\r\n var nd=function(){\r\n var toStr=function(フォーマット){\r\n // フォーマットは「YY/MM/DD hh:mm:ss」のような文字列\r\n var d=this.dat, obj={Y:d.getFullYear(), M:d.getMonth()+1, D:d.getDate(), h:d.getHours(), m:d.getMinutes(), s:d.getSeconds()}, chr, reg, res\r\n for(chr in obj){\r\n reg = new RegExp(chr+'+')\r\n res = フォーマット.match(reg)\r\n if(!res){continue}\r\n フォーマット = フォーマット.replace(reg, 桁(obj[chr], res[0].length))\r\n }\r\n return フォーマット\r\n }\r\n return function(d){\r\n return { dat:d || (new Date()), toStr:toStr }\r\n }\r\n }()\r\n var R=RegExp\r\n var rY=/^[^\\d]*(\\d{4})\\//, rMD=/(\\d{1,2})\\/(\\d{1,2})/, rHM=/(\\d{1,2}):(\\d{1,2})/, rYMD=/(\\d{4})\\/?(\\d{2})\\/?(\\d{2})/, rFull=/(\\d{4})\\/?(\\d{2})\\/?(\\d{2}) *(\\d{2}):?(\\d{2})/, rD2D2=/(\\d{2})(\\d{2})[^\\d]*?$/\r\n return function(str, datBA, swBefore){\r\n // datBA(Dateオブジェクト)は有っても無くてもOK\r\n // datBAを指定するとdatBAよりも(swBeforeがfalseなら後ろ、trueなら前)の日時を返す。\r\n var str0=str, obj={}, rC=function(){str0=R.rightContext}\r\n if(str0 && str0.match(rFull)){ obj={Y:R.$1, M:R.$2, D:R.$3, h:R.$4, m:R.$5}, str0='' }\r\n if(str0 && str0.match(rY)){ obj.Y=R.$1, rC() }\r\n if(str0 && str0.match(rMD)){ obj.M=R.$1, obj.D=R.$2, rC() }\r\n if(str0 && str0.match(rHM)){ obj.h=R.$1, obj.m=R.$2, rC() }\r\n if(str0 && str0.match(rYMD)){ obj.Y=R.$1, obj.M=R.$2, obj.D=R.$3, rC() }\r\n if(str0 && str0.match(rD2D2)){ obj.h=R.$1, obj.m=R.$2, str0=R.leftContext }\r\n if(str0 && str0.match(rD2D2)){ obj.M=R.$1, obj.D=R.$2, str0=R.leftContext }\r\n var d=nd(), Y=obj.Y || d.toStr('Y'), M=obj.M || d.toStr('M'), D=obj.D || 1, h=obj.h || d.toStr('h'), m=obj.m || d.toStr('m')\r\n var str1 = [Y,M,D].join('/') + (obj.h ? (' '+[h,m].join(':')) : ''), dat=new Date(str1)\r\n if(datBA && !isNaN(dat) && !obj.Y){\r\n var T=datBA.getTime()\r\n while((!swBefore && (dat.getTime() <= T)) || (swBefore && (T <= dat.getTime()))){\r\n if(isFinite(obj.M)){ dat.setFullYear(dat.getFullYear()+(swBefore?-1:1)) }else{ dat.setDate(dat.getDate()+(swBefore?-1:1)) }\r\n }\r\n }\r\n div.innerText = '['+str1+']'\r\n div.innerText += '\\n' + nd(dat).toStr('Y/MM/DD hh:mm:ss')\r\n }\r\n }()\r\n</script>\r\n</html>\r\n"
},
"桁":{
"sample.wsf" : "<job>\r\n<script>\r\nWScript.Echo(isNaN(new Date('2016/1/1 10:10')))\r\n</script>\r\n</job>\r\n"
},
"相対日時":{
"sample.wsf" : "<job>\r\n<script>\r\n setDate=function(dat0, str条件, swBefore){\r\n // datより後(swBefore=trueなら前)の日時(str条件と一致するタイミング)を返す。\r\n // obj条件の中身は'M1D2'のような形式。'M1D2'なら「1月2日」の意味。\r\n var dat=new Date(dat0), obj={}, reg=/([^\\d])(\\d+)/, res, objMethod={Y:'setFullYear', M:'setMonth', D:'setDate', h:'setHours', m:'setMinutes'}, chr, T=dat.getTime()\r\n while(res=str条件.match(reg)){\r\n obj[res[1]] = res[2]-0\r\n str条件 = RegExp.rightContext\r\n }\r\n if(obj.Y){\r\n if((swBefore && dat.getFullYear()<obj.Y) || (!swBefore && obj.Y<dat.getFullYear())){\r\n // 条件が矛盾(swBefore=trueなのにdatが2016年、obj.Yは2017とか)の場合は何もしない。\r\n return dat\r\n }\r\n dat.setFullYear(obj.Y, obj.M-1, obj.D)\r\n }\r\n while(1){\r\n for(chr in objMethod){ chr!='Y' && isFinite(obj[chr]) && dat[objMethod[chr]](obj[chr]-(chr=='M'?1:0)) }\r\n if((swBefore && dat.getTime()<T) || (!swBefore && T<dat.getTime())){break}\r\n var 一つ前\r\n for(chr in objMethod){\r\n if(chr=='Y' || !obj[chr]){\r\n 一つ前 = chr\r\n continue\r\n }\r\n dat[objMethod[一つ前]]( dat[objMethod[一つ前].replace(/^set/,'get')]() + (swBefore ? -1:1) )\r\n break\r\n }\r\n }\r\n return dat\r\n }\r\n setDay=function(dat, 曜日, swBefore){\r\n // 先週月曜、とか来週火曜、のDateオブジェクトを返す。\r\n var num='日月火水木金土'.indexOf(曜日), newD=new Date(dat), num元=newD.getDay()\r\n newD.setDate( newD.getDate() + (swBefore ? (num元<num?-7:0) : (num<num元?7:0)) + (num-num元) )\r\n return newD\r\n }\r\n WScript.Echo(\r\n setDate(new Date(), 'D2', 0)+'\\n'+\r\n setDay(new Date(), '月', 1)\r\n )\r\n</script>\r\n</job>\r\n"
},
"動作テスト機能付きHTMLソース作成":{
"sample.hta" : "<html>\r\n<title>動作テスト機能付きHTMLソース作成</title>\r\n<body>\r\n\r\n<div>\r\n <div style=\"margin-bottom:30px;\">\r\n <b>用途・目的</b>\r\n <textarea style=\"width:100%;height:100px;margin-bottom:30px;padding:0.5em;\" wrap=off onfocus=\"this.select()\"></textarea>\r\n <b>ソース</b>\r\n <textarea style=\"width:100%;height:100px;margin-bottom:30px;padding:0.5em;\" wrap=off onfocus=\"this.select()\"></textarea>\r\n <div>\r\n <b>サンプル</b>\r\n <textarea style=\"width:100%;height:100px;margin-bottom:30px;padding:0.5em;\" wrap=off onfocus=\"this.select()\"></textarea>\r\n <button onclick=\"eval(this.parentNode.getElementsByTagName('textarea')[0].value)\">動作テスト</button>\r\n </div>\r\n </div>\r\n \r\n <button onclick=\"var fun; eval('fun='+this.nextSibling.innerText); fun(this)\">変換</button><pre style=\"display:none;\">\r\n function(btn){\r\n var f=function(elem, name){return elem.getElementsByTagName(name) }\r\n var arrDIV=f(btn.parentNode, 'div'), arrTA=f(arrDIV[0], 'textarea')\r\n for(var i=0,L=arrTA.length;i&lt;L;i++){ arrTA[i].style.height = (arrTA[i].value.split('\\n').length + 3) + 'em' }\r\n \r\n var d=document.createElement('div'), d0=d.cloneNode(true), iH='innerHTML'\r\n d[iH] = arrDIV[0][iH]\r\n d.insertBefore(d0, f(d, 'b')[0].nextSibling)\r\n d0.innerHTML = f(d, 'textarea')[0].innerHTML.replace(/\\n/g,'&lt;br&gt;')\r\n d0.style.marginBottom = '30px'\r\n f(d, 'textarea')[0].removeNode(true)\r\n \r\n f(btn.parentNode, 'textarea')[3].value = d.innerHTML\r\n }\r\n </pre>\r\n \r\n <textarea style=\"width:100%;height:100px;margin-bottom:30px;\" wrap=off onfocus=\"this.select()\"></textarea>\r\n \r\n <button onclick=\"var f=this.parentNode.getElementsByTagName; f('div')[2].innerHTML = f('textarea')[3].value\">表示</button>\r\n \r\n <div style=\"border:solid 5px #000;padding:10px;\"></div>\r\n</div>\r\n\r\n&lt;!--more--&gt;\r\n\r\n</body>\r\n<script>\r\nresizeTo(600,1200)\r\n</script>\r\n</html>\r\n"
},
"RegExp":{
"sample.hta" : "<html>\r\n<title>RegExp</title>\r\n<style>\r\n .max{width:100%;height:100%}\r\n .w-max{width:100%}\r\n .nowrap{white-space:nowrap}\r\n .ta-c{text-align:center}\r\n .bc{border-collapse:collapse}\r\n</style>\r\n<body style=\"overflow:hidden\">\r\n <table class=\"max bc\">\r\n <tr><td><textarea id=ta0 wrap=off class=max></textarea></td></tr>\r\n <tr height=1>\r\n <td>\r\n <table class=\"w-max bc\">\r\n <td width=1><span class=nowrap>RE = new RegExp(</span></td>\r\n <td><input class=w-max id=inpRE></td>\r\n <td width=1>,</td>\r\n <td width=1>\r\n <label><input type=checkbox id=chkG>g</label>\r\n <label><input type=checkbox id=chkI>i</label>\r\n </td>\r\n <td width=1><span class=nowrap>);</span></td>\r\n </table>\r\n </td>\r\n </tr>\r\n <tr height=1><td class=ta-c><button id=btnM>res = textarea.match(RE)</button></td></tr>\r\n <tr id=tr0><td class=ta-c>match箇所無し</td></tr>\r\n <tr id=tr1 height=1>\r\n <td>\r\n <table class=\"w-max bc\" border=1>\r\n <tr>\r\n <td>res</td>\r\n <td><textarea id=taRes class=w-max wrap=off style=\"height:100px\"></textarea></td>\r\n </tr>\r\n <tr>\r\n <td>res[n]</td>\r\n <td><div id=divResN style=\"height:100px;overflow:auto\"></div></td>\r\n </tr>\r\n <tr><td>lastMatch</td><td id=tdLM></td></tr>\r\n <tr><td>lastParen</td><td id=tdLP></td></tr>\r\n <tr>\r\n <td width=1><span class=nowrap>rightContext</span></td>\r\n <td><textarea id=taRC class=w-max style=\"height:100px\" wrap=off></textarea></td>\r\n </tr>\r\n </table>\r\n </td>\r\n </tr>\r\n </table>\r\n</body>\r\n<script>\r\n resizeTo(400,600)\r\n iT='innerText', iH='innerHTML', FI='firstChild', CN='childNodes'\r\n tr0.style.display = tr1.style.display = 'none'\r\n btnM.onclick=function(){\r\n var RE=new RegExp(inpRE.value, (chkG.checked ? 'g' : '') + (chkI.checked ? 'i' : '')), str=ta0.value, res=str.match(RE)\r\n if(!res){\r\n tr0.style.display = 'block'\r\n tr1.style.display = 'none'\r\n return\r\n }\r\n tr0.style.display = 'none'\r\n tr1.style.display = 'block'\r\n \r\n divResN[iH] = '<table class=\"max bc\" border=1><td width=1></td><td></td></table>'\r\n var tbo=divResN[FI][FI], tr=tbo[FI].removeNode(true), i=0, L=res.length, newTR\r\n for(;i<L;i++){\r\n tbo.insertBefore(newTR=tr.cloneNode(true))\r\n newTR[CN][0][iT] = i\r\n newTR[CN][1][iT] = res[i]\r\n }\r\n \r\n setTimeout(function(){\r\n with(RegExp){\r\n taRes.value = res\r\n tdLM[iT] = lastMatch\r\n tdLP[iT] = lastParen\r\n taRC.value = rightContext\r\n }\r\n },1)\r\n }\r\n</script>\r\n</html>\r\n"
},
"hta":{
"sample.hta" : "<html>\r\n<head>\r\n <title>行番号</title>\r\n <style type=\"text/css\">\r\n .max{width:100%;height:100%}\r\n .w-max{width:100%}\r\n .nowrap{white-space:nowrap}\r\n .ta-c{text-align:center}\r\n .bc{border-collapse:collapse}\r\n .of-auto{overflow:auto}\r\n .of-hidden{overflow:hidden}\r\n .border1{border:solid 1px #000}\r\n </style>\r\n</head>\r\n<body class=\"of-hidden\">\r\n <table class=\"bc max\">\r\n <tr><td><textarea id=ta class=max wrap=off></textarea></td></tr>\r\n <tr><td><textarea id=ta1 class=max wrap=off></textarea></td></tr>\r\n <tr height=1><td>行:<input id=inp行> 列:<input id=inp列></td></tr>\r\n </table>\r\n</body>\r\n<script>\r\n resizeTo(400,400)\r\n ta.onkeyup=ta.onkeydown=function(){\r\n var r=document.selection.createRange()\r\n r.moveStart('character', -this.value.length)\r\n r.moveEnd ('character', 1)\r\n var reg=/\\n/g, res=r.text.match(reg), 行, 列\r\n if(res){\r\n 行 = res.length\r\n 列 = RegExp.rightContext.length - 1\r\n }else{\r\n 行 = 0\r\n 列 = r.text.length - 1\r\n }\r\n inp行.value = 行\r\n inp列.value = 列\r\n }\r\n</script>\r\n</html>\r\n",
"tab入力と行番号.hta" : "<html>\r\n<head>\r\n <title>行番号</title>\r\n <style type=\"text/css\">\r\n .max{width:100%;height:100%}\r\n .bc{border-collapse:collapse}\r\n .of-hidden{overflow:hidden}\r\n </style>\r\n</head>\r\n<body class=\"of-hidden\">\r\n <table class=\"bc max\">\r\n <tr><td><textarea id=ta class=max wrap=off></textarea></td></tr>\r\n <tr height=1><td>行:<input id=inp行> 列:<input id=inp列></td></tr>\r\n </table>\r\n</body>\r\n<script>\r\n resizeTo(400,400)\r\n ta.onkeyup=ta.onkeydown=function(){\r\n var obj=getテキストカーソル位置(this), str=this.value.slice(0,obj.start), arr=str.split('\\n')\r\n inp行.value = arr.length\r\n inp列.value = arr[arr.length-1].length + 1\r\n }\r\n ta.onkeydown=function(){\r\n if(event.keyCode!=9){return}\r\n event.cancelBubble = true\r\n \r\n var obj=getテキストカーソル位置(this), rng=document.selection.createRange(), str=this.value.slice(obj.start, obj.end)\r\n if(event.shiftKey){\r\n if(str){\r\n rng.text = str.replace(/\\n\\t|\\n {4}/g,'\\n').replace(/^\\t|^ {4}/g,'')\r\n }else if(obj.end < this.value.length){\r\n var 文字数=Math.min(4,this.value.length-obj.end), reg=/^\\t|^ {1,4}/, res\r\n rng.moveEnd('character', 文字数)\r\n if(res=rng.text.match(reg)){}else{ return false }\r\n rng.text = rng.text.replace(reg,'')\r\n rng.moveEnd('character', -(4-res[0].length))\r\n rng.select()\r\n }\r\n }else{\r\n rng.text = '\\t' + str.replace(/\\n/g,'\\n\\t')\r\n }\r\n \r\n return false\r\n }\r\n getテキストカーソル位置=function(elem){\r\n // 左記URLのページを参照させていただきました。 http://d.hatena.ne.jp/nakazawaken1/20100125/p1\r\n var rngSel=document.selection.createRange(), rngElem=document.body.createTextRange()\r\n rngElem.moveToElementText(elem)\r\n \r\n // rngSelより前の範囲を選択する(rngElemのEndをrngSelのStart位置に合わせる)\r\n rngElem.setEndPoint('EndToStart', rngSel)\r\n \r\n var f=function(rng){\r\n var str=rng.text, str0=str\r\n // 選択文字数が0でない間(前の範囲)\r\n while(rng.compareEndPoints('StartToEnd', rng) != 0){\r\n // 一文字ずつ範囲終了位置を前にずらしていく\r\n rng.moveEnd('character', -1)\r\n \r\n // ずらす前と後の文字列が異なる状態ならbreak\r\n if(str0 != rng.text){break}\r\n \r\n // ずらす前と後の値が同じ状態の間は改行を付け足していく。\r\n str += '\\r\\n'\r\n }\r\n return str\r\n }\r\n \r\n var str前=f(rngElem), str選択=f(rngSel), start=str前.length, end=start + str選択.length\r\n return {start:start, end:end}\r\n \r\n // 以下の方法では選択範囲の末尾に改行文字がある場合、意図した通りの動作にならない。\r\n /*\r\n rngSel.moveStart('character', -this.value.length)\r\n rngSel.moveEnd ('character', 1)\r\n var reg=/\\n/g, res=rSel.text.match(reg), 行, 列\r\n if(res){\r\n 行 = res.length\r\n 列 = RegExp.rightContext.length - 1\r\n }else{\r\n 行 = 0\r\n 列 = rSel.text.length - 1\r\n }\r\n inp行.value = 行\r\n inp列.value = 列\r\n */\r\n }\r\n inp行.onchange = inp列.onchange = function(){ setカーソル位置(ta, inp行.value, inp列.value) }\r\n setカーソル位置=function(elem, 行,列){\r\n var arr=ta.value.split('\\r\\n'), rng=document.body.createTextRange()\r\n 行 = isFinite(行) ? 行 : 1\r\n 列 = isFinite(列) ? 列 : 1\r\n rng.moveToElementText(elem)\r\n rng.moveStart('character', arr.slice(0,行).join('\\r\\n').length - (行-1))\r\n rng.moveStart('character', 列 - arr[行-1].length - 1)\r\n while(rng.compareEndPoints('StartToEnd', rng) != 0){ rng.moveEnd('character',-1) }\r\n rng.select()\r\n }\r\n</script>\r\n</html>\r\n"
}
}
view raw method.obj hosted with ❤ by GitHub

0 件のコメント:

コメントを投稿