バイナリ画像をDataURIに変換
2009/09/21(月) 28:07 Javascript親記事へこのエントリーをはてなブックマークに追加

XHRで取得したものをDataURIにする。というのを目指してただけで動いてないはず。
function Baseka(url , callback){
        var parseHTTPHeader=function(responseHeader){
            var headers=responseHeader.split("\n");
            var len=headers.length;
            var parsing=[];
            for(var i=0;i<len;i++){
                if(/^$/.test(headers[i])){
                }else if(/^[\x09\x20]/.test(headers[i])){
                    if(parsing.length==0){
                        throw "SyntaxError:HTTPHeader (first line) "+headers[i];
                    }
                    parsing[parsing.length-1]+="\n"+headers[i];
                }else{
                    parsing.push(headers[i]);
                }
            }
            var len=parsing.length;
            var parsed={};
            for(var i=0;i<len;i++){
                var pair=parsing[i].split(": ",2);
                if(pair.length!=2){
                    throw "SyntaxError:HTTPHeader (format) "+parsing[i];
                }
                if(pair[0] in parsed){
                    throw "SyntaxError:HTTPHeader (repetition) "+pair[0];
                }
                parsed[pair[0]]=pair[1];
            }
            return parsed;
        }

        var loadDataMethod=function(res){
            var headers=parseHTTPHeader(res.responseHeaders);
            if(res.status!=200){
                throw "RequestError"+
                    ":status="+res.status+
                    ":statusText="+res.statusText+
                    ":responseHeaders="+res.responseHeaders;
            }
            var contentType=("Content-Type" in headers)?
                headers["Content-Type"]:
                "application/octet−stream";
            var dataScheme="data:"+contentType+
                ";base64,"+btoa(
                    res.responseText.replace(
                        /[\u0100-\uffff]/g,
                        function(c){
                            return String.fromCharCode(c.charCodeAt(0)&0xff);
                        }
                    )
                );
            data.callback(dataScheme);
        }

        var getData=function(url){
        		console.log(url)
            data.url=url;
            GM_xmlhttpRequest(
                {
                    "method":"GET",
                    "url":data.url,
                    "onload":loadDataMethod,
                    "onerror":loadDataMethod,
                    "overrideMimeType":"text/plain; charset=x-user-defined"
                }
            );
        }

        var data={};

        var getFileByDataScheme=function(url,callback){
            data.callback=callback;
            getData(url);
        }
        
         var handler=function(url,callback){
             (function(){
                 getFileByDataScheme(url,callback);
             })();
         }
         handler(url,callback); 
 }
画像化してみる
function Baseka(url , callback){

        var parseHTTPHeader=function(responseHeader){
            var headers=responseHeader.split("\n");
            var len=headers.length;
            var parsing=[];
            for(var i=0;i<len;i++){
                if(/^$/.test(headers[i])){
                }else if(/^[\x09\x20]/.test(headers[i])){
                    if(parsing.length==0){
                        throw "SyntaxError:HTTPHeader (first line) "+headers[i];
                    }
                    parsing[parsing.length-1]+="\n"+headers[i];
                }else{
                    parsing.push(headers[i]);
                }
            }
            var len=parsing.length;
            var parsed={};
            for(var i=0;i<len;i++){
                var pair=parsing[i].split(": ",2);
                if(pair.length!=2){
                    throw "SyntaxError:HTTPHeader (format) "+parsing[i];
                }
                if(pair[0] in parsed){
                    throw "SyntaxError:HTTPHeader (repetition) "+pair[0];
                }
                parsed[pair[0]]=pair[1];
            }
            return parsed;
        }

        var loadDataMethod=function(res){
            var headers=parseHTTPHeader(res.responseHeaders);
            if(res.status!=200){
                throw "RequestError"+
                    ":status="+res.status+
                    ":statusText="+res.statusText+
                    ":responseHeaders="+res.responseHeaders;
            }
            var contentType=("Content-Type" in headers)?
                headers["Content-Type"]:
                "application/octet−stream";
            var dataScheme="data:"+contentType+
                ";base64,"+btoa(
                    res.responseText.replace(
                        /[\u0100-\uffff]/g,
                        function(c){
                            return String.fromCharCode(c.charCodeAt(0)&0xff);
                        }
                    )
                );
            getCanvas(dataScheme);
        }

        var getData=function(url){
            console.log(url)
            data.url=url;
            GM_xmlhttpRequest(
                {
                    "method":"GET",
                    "url":data.url,
                    "onload":loadDataMethod,
                    "onerror":loadDataMethod,
                    "overrideMimeType":"text/plain; charset=x-user-defined"
                }
            );
        }

        var data={};

        var getFileByDataScheme=function(url,callback){
            data.callback=callback;
            getData(url);
        }
        
         var handler=function(url,callback){
             (function(){
                 getFileByDataScheme(url,callback);
             })();
         }
         function getCanvas(resScheme){
              //Canvas要素を準備
              var canvas=document.createElement("canvas");
              //画像オブジェクトの準備
              var img=new Image();
              img.src=resScheme;
               //画像の描画
              var cx=canvas.getContext("2d");
              cx.drawImage(img,0,0);

              //画像データの取得とボディへの挿入
              var dataScheme=canvas.toDataURL("image/png");
              data.callback(dataScheme);
            }
         handler(url,callback); 
 }
XMLHttpRequestでファイルをDataSchemeで取得する実験 その3 (Kanasansoft Web Lab.)
http://www.kanasansoft.com/weblab/2009/04/xmlhttprequestdatascheme_3.html


画像をDataURIに変換するブックマークレット
javascript: (function () {
    var elem = document.images[0];
    var canvas = document.createElement('canvas');
    canvas.width = elem.width;
    canvas.height = elem.height;
    elem.parentNode.insertBefore(canvas, elem);
    var ctx = canvas.getContext("2d");
    ctx.drawImage(elem, 0, 0);
    elem.parentNode.replaceChild(document.createTextNode(canvas.toDataURL("image/png")), elem);
    canvas.parentNode.removeChild(canvas);
})();

名前:  非公開コメント   

  • TB-URL  http://efcl.info/adiary/011/tb/

replaceChildの注意点
2009/09/21(月) 21:16 Javascript親記事へこのエントリーをはてなブックマークに追加

FirefoxはreplaceNodeはないので、replaceChildを使用する。
element.replaceChild - MDC
https://developer.mozilla.org/ja/DOM/element.replaceChild

replaceChildはある子ノードを置換するものですが、forなどで回していくときに注意する必要がル。
普段のように上から走査してreplaceChildでノードを書き換えていくと、一つ飛んだ形で置換が行われてしまいます。奇数目のノードしか置換されない。
var iframes = document.getElementsByTagName("iframe");
for (var i = 0; i < iframes.length; i++) {
	if (iframes[i].hasAttribute("src")) {
		var iframeURL = iframes[i].getAttribute("src");
		if (/nicovideo\.jp\/thumb(\/|\?v=)(\w+)/.test(iframeURL)) {
			var mId = RegExp.$2;
			var imgTag = document.createElement("img");
			imgTag.src = "http://niconail.info/" + mId;
			var aNode = document.createElement("a");
			aNode.href = "http://www.nicovideo.jp/watch/" + mId;
			aNode.appendChild(imgTag);
			var parentIframe = iframes[i].parentNode;
			parentIframe.replaceChild(aNode, iframes[i]);
		}
	}
}
あんまり詳しく調べてませんが、これはreplaceChildで書き換えをしたときにノードにずれができてしまうため、望んだ結果が起こらなくなっている。
これを回避するにはforを後ろから回してreplaceChildで置換していくと回避できる。
var iframes = document.getElementsByTagName("iframe");
for (var i = iframes.length - 1; i >= 0; i--) {
	if (iframes[i].hasAttribute("src")) {
		var iframeURL = iframes[i].getAttribute("src");
		if (/nicovideo\.jp\/thumb(\/|\?v=)(\w+)/.test(iframeURL)) {
			var mId = RegExp.$2;
			var imgTag = document.createElement("img");
			imgTag.src = "http://niconail.info/" + mId;
			var aNode = document.createElement("a");
			aNode.href = "http://www.nicovideo.jp/watch/" + mId;
			aNode.appendChild(imgTag);
			var parentIframe = iframes[i].parentNode;
			parentIframe.replaceChild(aNode, iframes[i]);
		}
	}
}

名前:  非公開コメント   

  • TB-URL  http://efcl.info/adiary/010/tb/

Emeditorのjavascript自動補完を強化する
2009/09/21(月) 14:06 Emeditorこのエントリーをはてなブックマークに追加

Emeditorの標準プラグインに[単語補完] (Word Complete) がありますが、デフォルトでもある程度の単語は補完してくれますが、ちょっと足りない気がするので。
javascriptとDOM関係の用語も補完できるように辞書ファイルを追加して使います。
辞書ファイルを適当なところに保存して、[単語補完] (Word Complete)のプロパティからこの辞書ファイルを参照するようにすれば補完候補として追加されます。
ss-2009-09-21-13-51-29.png

以下のような動作になります。


元ネタとなってるファイル
拡張lisp/javascript-mode - XyzzyWiki
http://xyzzy.s53.xrea.com/wiki/index.php?%B3%C8%C4%A5lisp%2F...

1: てれぱんだ 2011年06月08日(水) 午後9時32分

補完が便利になりました!ありがとうございます。
ところで、辞書ファイルのリンク先が404を返します。
https://raw.github.com/gist/190074/javascript.txt
にすると見ることが出来ました。


名前:  非公開コメント   

  • TB-URL  http://efcl.info/adiary/09/tb/

EmeditorでCtagsを使ったjavascript構文解析
2009/09/21(月) 13:01 Emeditorこのエントリーをはてなブックマークに追加

FunctionList プラグインとCtagsを使ってjavascriptの関数を解析する。
EmEditor テキスト エディタ - ライブラリ
http://jp.emeditor.com/modules/mydownloads/singlefile.php?cid=26&lid=222


EmeditorにもデフォルトでCtagsが入っているけど少し古いので最新のを
Exuberant Ctags(日本語版)
http://hp.vector.co.jp/authors/VA025040/ctags/
からダウンロードする。

基本的にctagsを使えるソフトなら以下のことをやるとjavascriptの解析ができる。
ctags.exeがあるフォルダと同じところに.ctagsというファイルを作成して、
--jcode=utf8
--langmap=javascript:.js
--regex-javascript=/^(.*).prototype *= *(.*)/\1/o,object/
--regex-javascript=/^[\s\t]*(.*) *: *function/\1/o,object/
と中身に記述する。

以下のように関数が抽出される。
ss-2009-09-21-12-59-15.png

名前:  非公開コメント   

  • TB-URL  http://efcl.info/adiary/07/tb/

Emeditorのアウトライン設定
2009/09/21(月) 12:48 Emeditorこのエントリーをはてなブックマークに追加

Emeditorのアウトラインプラグインの設定

Javascriptの関数をアウトライン表示する
レベル1
(^(var +)?([\$\.a-z_0-9A-Z]+) *= .*)|(^(var +)?[\$\.a-zA-Z0-9_]+ *= *Class\.create.*)|([\$a-zA-Z_0-9]+\.prototype *= .*)|([\s\t]*function +[a-zA-Z0-9_]+ *\([^\)]*\).*)|(^/\*.*)
レベル2
(^[ \t]*[\$a-zA-Z0-9_]+ *: *function *\([^\)]*\).*)|(^[ \t]*[\$a-zA-Z0-9_]+ *:[^#!]*)
こんな感じに設定する。
sshot-2009-09-21-12-44-00.png

もう少し柔軟に設定できるとおもしろそうなんだけどな。

参考
秀丸でJavaScriptのアウトライン解析する定義ファイル - てっく煮ブログ
http://d.hatena.ne.jp/nitoyon/20070410/hidemaru_outline


名前:  非公開コメント   

  • TB-URL  http://efcl.info/adiary/06/tb/