HandyFlowyからTextwellにテキスト転送する機能拡張スクリプト

前回と反対

TextwellからHandyFlowyにテキストを渡す3つの方法
3つと言いながら4つのメニュー。アクションを探すのが面倒なので、HandyFlowyへの転送をまとめてみました。とりあえずこれを呼び出せばいい。メニューで切り替える方法です。Import Textwe...

前回はTextwellからHandyFlowyへの転送。今回はHandyFlowyからTextwellに文章を送ります。これで双方向のやり取りができます。やはり4つのパターンを用意してみました。メニューがポップアップするので、ご希望のフォーマットを選んでください。

登録リンク(MemoFlowy経由)はこちら→ http://tinyurl.com/h6lyzmx


使い方

拡張スクリプトを起動するとメニューが出ます。キャンセルするときは、一番上の【Textwell】をタップしてください。TextwellのNoteFlowyアクションを転用しました。なので、性格の違う4つの読み込みが出てきます。以下の通りになります。

Replace  段差を省いて箇条書きします。
Markdown 一段目を見出し、二段目を本文、三段目以降をリストにします。
List 引用形式のリストにします。
Notes ノートの部分だけマージします。


まとめ

「書く」という行為は4段階になっています。キーワードの羅列を集め、短文の箇条書きに書き換える。短文の箇条書きを並べ替え、段落に仕立てる。段落ごとを組み換えると、原稿の大筋が出来る。これを推敲すれば、比較的大きなストーリーも作りやすい。
キーワード→短文→段落→原稿の順にテキストは成長する。パーツから組み立てる作業という意味では、プラモデルに似ています。いきなり頭から書くのではなく、エンジン部分やタイヤ周りといったグループ分けをしながら、それぞれを作りこんでいく。パーツが出来上がったら、組み合わせてモックアップを作る。モックアップを整えると作品が仕上がります。
今回のメニューはその作業順に並べてあります。Replace→Markdown→Notesの段階でHandyFlowyとTextwellを行き来する。長い文章でも迷子にならない。


スクリプト本体

HandyFlowy用ポップアップメニューのテンプレートはこんな感じか。listとJump()を書き換えれば、似たようなメニューを量産できます。

list=["","Replace","Markdown","List","Notes"];

listwidth=260;
listleft=(window.innerWidth-listwidth)/2;
html="<div onclick=Jump(0) style=\"color:black;font-weight:bold;padding:12px;\">【 Textwell 】</div>";
for(i=1;i<list.length;i++) html+="<hr><div onclick=Jump("+i+") style=\"padding:12px;\">"+list[i]+"</div>";
e=document.createElement("div");
e.innerHTML=html;
e.style.cssText="position:fixed;font-size:large;text-align:center;color:blue;background:white;top:20%;left:"+listleft+"px;width:"+listwidth+"px;z-index:99;border:1px gray solid;border-radius:5px;box-shadow:5px 5px 5px 5px rgba(0,0,0,0.3);";
document.body.appendChild(e);

function Jump(key){
document.body.removeChild(e);
p=pageContainer.innerHTML;
p=p.replace(/<span class=\"contentUnderline(.+?)>(.+?)<\/span>/g,"<u>$2</u>");
p=p.replace(/<span class=\"contentBold(.+?)>(.+?)<\/span>/g,"**$2**");
p=p.replace(/<span class=\"contentItalic(.+?)>(.+?)<\/span>/g,"_$2_");
p=p.replace(/<span class=\"contentTagText(.+?)>(.+?)<\/span>/g,"$2");
p=p.replace(/<span class=\"contentTag(.+?)>(.+?)<\/span>/g,"$2");
p=p.replace(/<a class=\"contentLink(.+?)>(.+?)<\/a>/g,"$2");
p=p.replace(/<\/div>/g,"").replace(/<span .+?>/g,"").replace(/<\/span>/g,"\n");
p=p.replace(/<div class=\"(.+?)\">/g,"\t$1\n").replace(/<div>/g,"").replace(/\n+/g,"\n");
p=p.replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&amp;/g,"&");
s="";b=n=0;
switch(key){
case 0:return;
case 1:
p=pageContainer.getElementsByClassName("project selected ")||pageContainer.getElementsByClassName("project selected noted");
s=p[0].innerText;
break;
case 2:
line=p.split("\n");
for(i=0;i<line.length;i++){
c=line[i];
switch(true){
case /^\t(.+?)selected/.test(c):s="";b=1;n=0;break;
case /^\tnotes/.test(c):n=1;break;
case /^\tchildrenEnd/.test(c):b--;break;
case /^\tchildren/.test(c):b++;n=0;
case /^\t/.test(c):
case b<1:break;
default:
if(n){
s+="> ";
}else{
switch(b){
case 1:s+="### ";break;
case 2:s+="\n#### ";break;
case 3:s+="\n";break;
default:for(j=4;j<b;j++)s+=" ";s+="* ";
}
}
s+=c+"\n";
}
}
s=s.replace(/\n([#\*])(.+?)\ n([^\s\*])/g,"\n$1$2\n\n$3");
break;
case 3:
line=p.split("\n");
for(i=0;i<line.length;i++){
c=line[i];
switch(true){
case /^\t(.+?)selected/.test(c):
s="";b=n=1;break;
case /^\tnotes/.test(c):n=1;break;
case /^\tchildrenEnd/.test(c):b--;break;
case /^\tchildren/.test(c):b++;n=0;
case /^\t/.test(c):
case b<1:break;
default: for(k=1;k<b;k++) s+=" ";
s+=(n)? ">":"-";
s+=" "+c+"\n";
}
}
s+="["+document.title+"]("+location.href+")\n";
break;
case 4:
p=pageContainer.getElementsByClassName("notes ");
for(i=0;i<p.length;i++) if(p[i].innerText!="\n") s+=p[i].innerText;
}
url="textwell://replace?text=" + encodeURIComponent(s);
window.open(url);
}