バイナリ画像をDataURIに変換
XHRで取得したものをDataURIにする。というのを目指してただけで動いてないはず。
画像を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);
})();
コメント(0件)
- TB-URL http://efcl.info/adiary/011/tb/
replaceChildの注意点
FirefoxはreplaceNodeはないので、replaceChildを使用する。
replaceChildはある子ノードを置換するものですが、forなどで回していくときに注意する必要がル。
普段のように上から走査してreplaceChildでノードを書き換えていくと、一つ飛んだ形で置換が行われてしまいます。奇数目のノードしか置換されない。
これを回避するにはforを後ろから回して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自動補完を強化する
Emeditorの標準プラグインに[単語補完] (Word Complete) がありますが、デフォルトでもある程度の単語は補完してくれますが、ちょっと足りない気がするので。
javascriptとDOM関係の用語も補完できるように辞書ファイルを追加して使います。
辞書ファイルを適当なところに保存して、[単語補完] (Word Complete)のプロパティからこの辞書ファイルを参照するようにすれば補完候補として追加されます。

以下のような動作になります。
元ネタとなってるファイル
javascriptとDOM関係の用語も補完できるように辞書ファイルを追加して使います。
辞書ファイルを適当なところに保存して、[単語補完] (Word Complete)のプロパティからこの辞書ファイルを参照するようにすれば補完候補として追加されます。
以下のような動作になります。
元ネタとなってるファイル
- 拡張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構文解析
FunctionList プラグインとCtagsを使ってjavascriptの関数を解析する。
EmeditorにもデフォルトでCtagsが入っているけど少し古いので最新のを
Exuberant Ctags(日本語版)
http://hp.vector.co.jp/authors/VA025040/ctags/
からダウンロードする。
基本的にctagsを使えるソフトなら以下のことをやるとjavascriptの解析ができる。
ctags.exeがあるフォルダと同じところに.ctagsというファイルを作成して、
以下のように関数が抽出される。

- 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/と中身に記述する。
以下のように関数が抽出される。
- TB-URL http://efcl.info/adiary/07/tb/
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_]+ *:[^#!]*)こんな感じに設定する。
もう少し柔軟に設定できるとおもしろそうなんだけどな。
参考
- 秀丸でJavaScriptのアウトライン解析する定義ファイル - てっく煮ブログ
- http://d.hatena.ne.jp/nitoyon/20070410/hidemaru_outline
- TB-URL http://efcl.info/adiary/06/tb/