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");
}

問題点:漢字コードを含む場合に挙動がおかしい。