C言語によるjavascript開発テンプレート
ブックマークレットは開発時に一行で書かなくてはならず、見通しが悪い。
そこで、インデントおよび改行をゆるし、ファイルによりブックマークレットを開発及び管理するために開発されたプログラムがこれ。
- 使用方法
- 先頭にmkbkmkを記述したnow.cgiを作成する。
now.cgi
#!/usr/local/bin/mkbkmk s=(t=document.getElementsByTagName('textarea')[0]).selectionStart; e=t.selectionEnd; v=t.value; p=t.scrollTop; t.value=(v.substr(0,s)+(f=v.substr(s,e-s).replace(/([0-9a-zA-Z])/g,function (match_str){return String.fromCharC\ ode(match_str.charCodeAt(0) - 65248);}))+v.substr(e,v.length)); t.scrollTop=p; t.setSelectionRange(s,s+f.length);
実行後に出力されるhtml
<html><head><title>bookmarklet</title></head><body><h2>bookmarklet</h2> <a href="javascript:(function(){n=(t=document.getElementsByTagName('textarea')[0]).selectionStart;v=t.value;s=t.scrollTop;t.value=(v.substr(0,n)+(f=[(d=new Date()).getHours(),d.getMinutes(),d.getSeconds()].map(function(x){return ('0'+x).substr(-2)}).join(':'))+v.substr(n,v.length));t.scrollTop=s;t.setSelectionRange((p=n+f.length),p)})()">now.cgi</a> <h2>test form</h2><form><textarea style='width:100%;height:10%'></textarea></form></body></html>
このようにcgiとしてブックマークレットを管理することができる。
着陸しまくっているが以下がソース。mkbkmk.cとして保存し、gcc -o mkbkmk mkbkmk.c としてコンパイルした後 /usr/local/binにでもコピーする。
#include <stdio.h> #include <string.h> int main(int argc,char **argv){ FILE *fp; char s[256],cmd[2048],title[256]; int i,j,f; printf("Content-type: text/html\n\n<html><head><title>bookmarklet</title></head><body><h2>bookmarklet</h2>\n"); if (argc>1 && (fp=fopen(argv[1],"r"))!=NULL) { j=0; fgets(s,256,fp); while (fgets(s,256,fp)!=NULL){ f=0; for(i=0;i<strlen(s);++i){ if (f!=1&&s[i]!=' '&&s[i]!='\t') { f=1; } if (f==1&&s[i]!='\n') { cmd[j++]=s[i]; } } } cmd[j]='\0'; printf("<a href=\"javascript:(function(){%s})()\">%s</a>\n",cmd,argv[1]); } printf("<h2>test form</h2><form><textarea style='width:100%;height:10%'></textarea></form></body></html>\n"); }
問題点:漢字コードを含む場合に挙動がおかしい。