Textwellの進化するテキスト保管庫アクション ShotSaver(多分岐版)

自分的には今年最初のヒット作かもしれない。


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>