当ブログでは、以下のとおり、WorkFlowy アプリ「HandyFlowy」でブログの下書きを書く記事を何度も公開してきました。
- WorkFlowy(HandyFlowy)でのブログのネタの育て方
- 1日の流れの中で「HandyFlowy」(WorkFlowy)を実際にどう使っているかを紹介
- WorkFlowyでブログを書く5つの魅力
- HandyFlowyで複数のトピックをインデントする方法を考えてみる
- WorkFlowyを使ったモブログの実例
- WorkFlowyとEvernoteの使い分けの具体例(2016年6月)
- HandyFlowyでブログを書くときに不便なリストタグを簡単につける方法
- WorkFlowyを使っていつどこでどうやってブログを書いているか
- 『WorkFlowyの使い方レシピ』#5「レシピ2 ブログの下書」
その記事の中で、HandyFlowyで書いた下書きを、ブログ用のHTMLに変換するHandyFlowyのスクリプトの便利さを取り上げてきました。
HandyFlowyでスクリプトを起動させると、HandyFlowyの下書きの内容に自動でブログ用のHTMLが付加された状態でiOSアプリ「PressSync」が起動しするものです。
ただ、このスクリプトですが、専門的なことはわかりませんが、2017年9月にWorkFlowyの仕様が一部変更になったことにより使えなくなっていました。
ところが、HandyFlowyの開発者@marumi_appさんのご好意により、同趣旨のスクリプトを作っていただきました。
詳しくは、@marumi_appさんの以下の記事参照いただくとして、本記事では概要を紹介したいと思います。
WorkFlowy→ブログエディタ転送スクリプト(デラックス版)
1. スクリプトの内容
前述したとおり、HandyFlowyでスクリプトを発動させるとPressSyncが起動します。
PressSyncの下書き画面のタイトル欄と本文欄には、HandyFlowyで書いた内容にブログ用のHTMLが自動で付加されたデータが入力された状態になっています。
あとは、投稿ボタンを押すだけですので、HandyFlowyでブログを書くには、大変便利なスクリプトです。
このスクリプトは、PressSync用だけではなく、「SLPROX」用もあります。
また、クリップボードに出力するだけのものもありますので、「PressSync」と「SLPRO X」以外のブログアプリを使っている場合は、こちらを利用することになります。
2. スクリプトの挙動
HandyFlowyで書いた内容には、どのようにHTMLが付加されるのか。
先の@marumi_appさんの記事「WorkFlowy→ブログエディタ転送スクリプト(デラックス版)」から以下に抜粋させていただきます。
- Zoomしているトピック名がタイトルになります。「SLPRO X版」と「クリップボード版」は< h1 >が付きますが、「PressSync版」は < h1 >は付きません。
- 子トピックがあるトピックは階層に合わせた見出し< h数字 >になります。
- 子トピックがないトピックは場合は本文< p >になります。
- 「bq」とだけ書いたトピックはその子孫トピック全体を< blockquote >タグで囲んで出力します。
- 「ul」とだけ書いたトピックはその子孫トピックを< li >タグにして、全体を< ul >タグで囲んで出力します。
- 「ol」とだけ書いたトピックはその子孫トピックを< li >タグにして、全体を< ol >タグで囲んで出力します。
- < li >タグになったトピックの子トピックは出力されますが、孫トピック以降は無視します。(出力しません)
- 文字修飾(太字・*斜体*・下線)はそのまま< B > < I > < U >タグ付きで出力されます。
- ノートは無視します(出力しません)。
- 折りたたまれていて、見えていないトピックも無視します(出力しません)。また、見出しにもなりません。
- 本文になった場合、トピックごとに< p >タグ付きで出力されます。
- 本文に書かれたHTMLタグはそのまま出力します。そのため、本文に < は & amp;lt;、&は & amp;amp;という風に書く必要があります。【2017-10-19追加】
3. スクリプトの登録
WorkFlowyに以下のURLスキームをコピーして、コピーしたトピックをHandyFlowyでタップするとHandyFlowyに機能拡張スクリプトとしてインストールすることができます。
PressSync用「WF2BlogEDeluxe4PressSync」
handyflowy://import?name=WF2BlogEDeluxe4PressSync&script=!function()%7Bfunction%20e(e)%7Breturn%20e.replace(%2F%26lt%3B%2Fg%2C%22%3C%22).replace(%2F%26gt%3B%2Fg%2C%22%3E%22).replace(%2F%26quot%3B%2Fg%2C'%22').replace(%2F%26amp%3B%2Fg%2C%22%26%22)%7Dfunction%20t(t%2Cn)%7Bvar%20l%3Dt%3F%22%3C%22%2Bt%2B%22%3E%22%3A%22%3Cp%3E%22%2Cr%3Dt%3F%22%3C%2F%22%2Bt%2B%22%3E%22%3A%22%3C%2Fp%3E%22%3Breturn%20n.getName().getContentText().trim().length%3Fl%2Be(n.getName().getContentText())%2Br%2B%22%5Cn%22%3A%22%22%7Dfunction%20n(e)%7Bfor(var%20n%3D%22%3Cblockquote%3E%5Cn%22%2Cl%3De.getVisibleChildren()%2Cr%3Dl.length%2Co%3D0%3Bo%3Cr%3Bo%2B%2B)0%3D%3D%3D(e%3Dl.eq(o)).getVisibleChildren().length%3Fn%2B%3Dt(%22%22%2Ce)%3An%2B%3Di(%22%22%2Ce)%3Breturn%20n%2B%3D%22%3C%2Fblockquote%3E%5Cn%22%7Dfunction%20l(e)%7Bvar%20l%3D%22%3Cli%3E%5Cn%22%2Ci%3De.getName().getContentText().trim().toLowerCase()%3Bif(%22ul%22%3D%3Di)l%2B%3Dr(%22ul%22%2Ce)%3Belse%20if(%22ol%22%3D%3Di)l%2B%3Dr(%22ol%22%2Ce)%3Belse%20if(%22bq%22%3D%3Di)l%2B%3Dn(e)%3Belse%7Bl%2B%3Dt(%22%22%2Ce)%3Bfor(var%20o%3De.getVisibleChildren()%2Cg%3Do.length%2Ca%3D0%3Ba%3Cg%3Ba%2B%2B)l%2B%3Dt(%22%22%2Co.eq(a))%7Dreturn%20l%2B%3D%22%3C%2Fli%3E%5Cn%22%7Dfunction%20r(e%2Ct)%7Bfor(var%20n%3D%22%3C%22%2Be%2B%22%3E%5Cn%22%2Cr%3Dt.getVisibleChildren()%2Ci%3Dr.length%2Co%3D0%3Bo%3Ci%3Bo%2B%2B)n%2B%3Dl(r.eq(o))%3Breturn%20n%2B%3D%22%3C%2F%22%2Be%2B%22%3E%5Cn%22%7Dfunction%20i(e%2Cl)%7Bvar%20o%3D%22%22%2Cg%3D%22h%22%2Be%2Ca%3Dl.getName().getContentText().trim().toLowerCase()%3Bif(%22ul%22%3D%3Da)o%2B%3Dr(%22ul%22%2Cl)%3Belse%20if(%22ol%22%3D%3Da)o%2B%3Dr(%22ol%22%2Cl)%3Belse%20if(%22bq%22%3D%3Da)o%2B%3Dn(l)%3Belse%7Bo%2B%3Dt(g%2Cl)%3Bfor(var%20s%3Dl.getVisibleChildren()%2Cu%3Ds.length%2Cc%3D0%3Bc%3Cu%3Bc%2B%2B)%7Bvar%20f%3Ds.eq(c)%3B0%3D%3D%3Df.getVisibleChildren().length%3Fo%2B%3Dt(%22%22%2Cf)%3Ao%2B%3Di(%22%22%3D%3De%3F%22%22%3Ae%2B1%2Cf)%7D%7Dreturn%20o%7Dvar%20o%3Di(1%2C%24(%22.selected%22))%3Bo%3D%24(%22.selected%22).getName().getContentText()%2Bo.replace(%2F%3Ch1%3E.*%3C%5C%2Fh1%3E%2F%2C%22%22)%2Cwindow.open(%22presssync%3A%2F%2F%2FnewPost%3Fcontent%3D%22%2BencodeURIComponent(o))%7D()%3B%0A
SLPRO X用「WF2BlogEDeluxe4SlproX」
handyflowy://import?name=WF2BlogEDeluxe4SlproX&script=!function()%7Bfunction%20e(e)%7Breturn%20e.replace(%2F%26lt%3B%2Fg%2C%22%3C%22).replace(%2F%26gt%3B%2Fg%2C%22%3E%22).replace(%2F%26quot%3B%2Fg%2C'%22').replace(%2F%26amp%3B%2Fg%2C%22%26%22)%7Dfunction%20t(t%2Cn)%7Bvar%20l%3Dt%3F%22%3C%22%2Bt%2B%22%3E%22%3A%22%3Cp%3E%22%2Co%3Dt%3F%22%3C%2F%22%2Bt%2B%22%3E%22%3A%22%3C%2Fp%3E%22%3Breturn%20console.log(%22A%3A%22%2Cn.getName().getContentText())%2Cconsole.log(%22B%3A%22%2CdecodeURIComponent(n.getName().getContentText()))%2Cn.getName().getContentText().trim().length%3Fl%2Be(n.getName().getContentText())%2Bo%2B%22%5Cn%22%3A%22%22%7Dfunction%20n(e)%7Bfor(var%20n%3D%22%3Cblockquote%3E%5Cn%22%2Cl%3De.getVisibleChildren()%2Co%3Dl.length%2Ci%3D0%3Bi%3Co%3Bi%2B%2B)0%3D%3D%3D(e%3Dl.eq(i)).getVisibleChildren().length%3Fn%2B%3Dt(%22%22%2Ce)%3An%2B%3Dr(%22%22%2Ce)%3Breturn%20n%2B%3D%22%3C%2Fblockquote%3E%5Cn%22%7Dfunction%20l(e)%7Bvar%20l%3D%22%3Cli%3E%5Cn%22%2Cr%3De.getName().getContentText().trim().toLowerCase()%3Bif(%22ul%22%3D%3Dr)l%2B%3Do(%22ul%22%2Ce)%3Belse%20if(%22ol%22%3D%3Dr)l%2B%3Do(%22ol%22%2Ce)%3Belse%20if(%22bq%22%3D%3Dr)l%2B%3Dn(e)%3Belse%7Bl%2B%3Dt(%22%22%2Ce)%3Bfor(var%20i%3De.getVisibleChildren()%2Cg%3Di.length%2Ca%3D0%3Ba%3Cg%3Ba%2B%2B)l%2B%3Dt(%22%22%2Ci.eq(a))%7Dreturn%20l%2B%3D%22%3C%2Fli%3E%5Cn%22%7Dfunction%20o(e%2Ct)%7Bfor(var%20n%3D%22%3C%22%2Be%2B%22%3E%5Cn%22%2Co%3Dt.getVisibleChildren()%2Cr%3Do.length%2Ci%3D0%3Bi%3Cr%3Bi%2B%2B)n%2B%3Dl(o.eq(i))%3Breturn%20n%2B%3D%22%3C%2F%22%2Be%2B%22%3E%5Cn%22%7Dfunction%20r(e%2Cl)%7Bvar%20i%3D%22%22%2Cg%3D%22h%22%2Be%2Ca%3Dl.getName().getContentText().trim().toLowerCase()%3Bif(%22ul%22%3D%3Da)i%2B%3Do(%22ul%22%2Cl)%3Belse%20if(%22ol%22%3D%3Da)i%2B%3Do(%22ol%22%2Cl)%3Belse%20if(%22bq%22%3D%3Da)i%2B%3Dn(l)%3Belse%7Bi%2B%3Dt(g%2Cl)%3Bfor(var%20u%3Dl.getVisibleChildren()%2Cc%3Du.length%2Cs%3D0%3Bs%3Cc%3Bs%2B%2B)%7Bvar%20f%3Du.eq(s)%3B0%3D%3D%3Df.getVisibleChildren().length%3Fi%2B%3Dt(%22%22%2Cf)%3Ai%2B%3Dr(%22%22%3D%3De%3F%22%22%3Ae%2B1%2Cf)%7D%7Dreturn%20i%7Dvar%20i%3Dr(1%2C%24(%22.selected%22))%3Bwindow.open(%22slpro-x%3A%2F%2F%3Fq%3D%22%2BencodeURIComponent(i))%7D()%3B%0A
クリップボードに出力
handyflowy://import?name=WF2BlogEDeluxe4CopyToClipboard&script=!function()%7Bfunction%20e(e)%7Breturn%20e.replace(%2F%26lt%3B%2Fg%2C%22%3C%22).replace(%2F%26gt%3B%2Fg%2C%22%3E%22).replace(%2F%26quot%3B%2Fg%2C'%22').replace(%2F%26amp%3B%2Fg%2C%22%26%22)%7Dfunction%20t(t%2Cn)%7Bvar%20l%3Dt%3F%22%3C%22%2Bt%2B%22%3E%22%3A%22%3Cp%3E%22%2Co%3Dt%3F%22%3C%2F%22%2Bt%2B%22%3E%22%3A%22%3C%2Fp%3E%22%3Breturn%20console.log(%22A%3A%22%2Cn.getName().getContentText())%2Cconsole.log(%22B%3A%22%2CdecodeURIComponent(n.getName().getContentText()))%2Cn.getName().getContentText().trim().length%3Fl%2Be(n.getName().getContentText())%2Bo%2B%22%5Cn%22%3A%22%22%7Dfunction%20n(e)%7Bfor(var%20n%3D%22%3Cblockquote%3E%5Cn%22%2Cl%3De.getVisibleChildren()%2Co%3Dl.length%2Ci%3D0%3Bi%3Co%3Bi%2B%2B)0%3D%3D%3D(e%3Dl.eq(i)).getVisibleChildren().length%3Fn%2B%3Dt(%22%22%2Ce)%3An%2B%3Dr(%22%22%2Ce)%3Breturn%20n%2B%3D%22%3C%2Fblockquote%3E%5Cn%22%7Dfunction%20l(e)%7Bvar%20l%3D%22%3Cli%3E%5Cn%22%2Cr%3De.getName().getContentText().trim().toLowerCase()%3Bif(%22ul%22%3D%3Dr)l%2B%3Do(%22ul%22%2Ce)%3Belse%20if(%22ol%22%3D%3Dr)l%2B%3Do(%22ol%22%2Ce)%3Belse%20if(%22bq%22%3D%3Dr)l%2B%3Dn(e)%3Belse%7Bl%2B%3Dt(%22%22%2Ce)%3Bfor(var%20i%3De.getVisibleChildren()%2Cg%3Di.length%2Ca%3D0%3Ba%3Cg%3Ba%2B%2B)l%2B%3Dt(%22%22%2Ci.eq(a))%7Dreturn%20l%2B%3D%22%3C%2Fli%3E%5Cn%22%7Dfunction%20o(e%2Ct)%7Bfor(var%20n%3D%22%3C%22%2Be%2B%22%3E%5Cn%22%2Co%3Dt.getVisibleChildren()%2Cr%3Do.length%2Ci%3D0%3Bi%3Cr%3Bi%2B%2B)n%2B%3Dl(o.eq(i))%3Breturn%20n%2B%3D%22%3C%2F%22%2Be%2B%22%3E%5Cn%22%7Dfunction%20r(e%2Cl)%7Bvar%20i%3D%22%22%2Cg%3D%22h%22%2Be%2Ca%3Dl.getName().getContentText().trim().toLowerCase()%3Bif(%22ul%22%3D%3Da)i%2B%3Do(%22ul%22%2Cl)%3Belse%20if(%22ol%22%3D%3Da)i%2B%3Do(%22ol%22%2Cl)%3Belse%20if(%22bq%22%3D%3Da)i%2B%3Dn(l)%3Belse%7Bi%2B%3Dt(g%2Cl)%3Bfor(var%20s%3Dl.getVisibleChildren()%2Cu%3Ds.length%2CC%3D0%3BC%3Cu%3BC%2B%2B)%7Bvar%20c%3Ds.eq(C)%3B0%3D%3D%3Dc.getVisibleChildren().length%3Fi%2B%3Dt(%22%22%2Cc)%3Ai%2B%3Dr(%22%22%3D%3De%3F%22%22%3Ae%2B1%2Cc)%7D%7Dreturn%20i%7Dvar%20i%3Dr(1%2C%24(%22.selected%22))%3Bwebkit.messageHandlers.CopyToClipboard.postMessage(i)%2Calert(%22Copied%20to%20Clipboard%22)%7D()%3B%0A
4. おわりに
今回ご紹介したスクリプトは、HandyFlowyを使ってブログを書いている方には、ぜひ使っていただきたい大変便利なスクリプトです。
また、ブログを書くなら、階層化や文章の前後の入れ替えなどが簡単にできるHandyFlowyはオススメです。
当ブログでは、HandyFlowy(WorkFlowy)でブログを書くことにについて、以下のとおりいろいろ書いてきましたので、もし、ご興味のある内容がありましたら、ぜひご参考にしてください。
- WorkFlowy(HandyFlowy)でのブログのネタの育て方
- 1日の流れの中で「HandyFlowy」(WorkFlowy)を実際にどう使っているかを紹介
- WorkFlowyでブログを書く5つの魅力
- HandyFlowyで複数のトピックをインデントする方法を考えてみる
- WorkFlowyを使ったモブログの実例
- WorkFlowyとEvernoteの使い分けの具体例(2016年6月)
- HandyFlowyでブログを書くときに不便なリストタグを簡単につける方法
- WorkFlowyを使っていつどこでどうやってブログを書いているか
- 『WorkFlowy」の使い方レシピ』#5「レシピ2 ブログの下書」