自分的には今年最初のヒット作かもしれない。
Textwellに「ファイル保存」を実装する ShotSaver
とはいえ、「ファイル」概念を持たないのがTextwellの魅力。ClipPadを使いながら思いました。「行単位でクリップするアクションがあるなら、文章全体もあっていいじゃないか」と。テキストのスナップ...
書き掛けのテキストを一時保存しておくアクションです。サーバー側の変更なので、アクション自体はそのままで動きます。従来より分岐点が3つほど増えました。
登録リンクはこちら→ http://tinyurl.com/lmzfqcq
まず、保存するとき質問するようにした。「OK」を選べば、そのままリストに追加します。これは従来通り。「キャンセル」のとき、保存済みの一覧を表示するのが新しいポイント。読み込みのとき、わざわざ今あるテキストをクリアする必要がなくなりました。
リスト表示でスナップショットを選ぶと、置き換えるか尋ねます。「OK」で、すでにあるテキストを消してから読み込み。「キャンセル」だとカーソル位置への挿入になります。長文を部分的に推敲し、後からレゴのように組み立てるケースを想定しています。
それとアクションを立ち上げるとき。範囲選択していると、その部分だけをスナップショットすることにしました。つまり、ClipPadと同等のことが出来ます。定型文を準備し、それをカーソル位置に埋めていく。保管作業を全部ShotSaverにまかせようという作戦です。
関節の数が増えれば柔軟性となる。テキストが生き物になり、生ものになります。活性化した状態のまま、本文の裏に控え、表に飛び出す機会を伺っている。「保存」は墓標のようなもの。レクイエムが流れる霊園。そうしたテキストはTextwellに似つかわしくない。ShotSaverに並ぶのは実弾。使われるのを待っているフレーズの塊たち。
【資料】サーバー側のss.htmlは下記ファイル。
<meta name=viewport content=initial-scale=1> <title>ShotSaver</title> <style> table { width:100%; table-layout:fixed; word-wrap:break-word; white-space:pre; } td { color:black; background:#eee; font-size:medium; padding:10px; } td.num { color:white; background:darkred; width:60px; } hr { border:0; } </style> <body id=wine></body> <script> var old; cb=new Array(); document.ontouchmove=Clear; function main(){ t=localStorage.shot || ""; old=T.text; s=T.whole; if(s && confirm("保存しますか?")){ d=new Date(); day=Zero(d.getFullYear())+"/"+Zero(d.getMonth()+1)+"/"+Zero(d.getDate())+"\n"; t=day+s+"\t"+t; localStorage.shot=t; } cb=t.split("\t"); Disp(); T.translucent(false); } function Disp(){ link="<hr>"; for (i=0; i<cb.length-1; i++){ s=cb[i].split("\n"); link+="<table><td class=num onclick=Remove("+i+")>"+s[0]+"</td><td onclick=Load("+i+")>"+s[1]+"</td></table><hr>\n"; } wine.innerHTML=link; } function Load(x){ text=cb[x].substr(9); command=(!old || confirm("置き換えますか?"))? "replace":"insert"; T(command,{text:text}); } function Remove(x){ if(confirm("削除しますか?")){ cb.splice(x,1); localStorage.shot=cb.join("\t"); Disp(x) } } function Zero(x){ return ("00"+x).slice(-2); } function Clear(e){ if(e.touches.length>1){ if(confirm("全部クリアしますか?")){ localStorage.shot=""; T("done"); } } } location="textwell:///webdelegate?init=main"; </script>