フィルタやソートを選択すると、それらを指定した時のYouTube検索URLが下部に表示されます。*1
*1:モバイル版ではフィルタの内容を表示してくれませんが、アップロード日と並び替え以外は検索結果に反映されると思います。
WorkFlowyは基本的に一対多の親子関係を表現します。
多対多の関係を表現したいときは、テーブルの方が適しているでしょう。
また、WorkFlowyでは画像を表示可能。
Get WorkFlowy Inline Images out of your System in 2016 – Workflowy
であれば、テーブルだって表示できるはずです。
と考えてHandyFlowyスクリプトを作りました。
"@table"が1行目に記述されているノートに対し、2行目以降をテーブルに変換してノートの直上に描画します。
区切り文字は","で。変換はリアルタイムに行われます。
Conv2tableをMemoFlowy経由で登録
function do_parseTbl() { $(this).prevAll(".content-tbl").remove(); var lines = $(this).text().split("\n"); if ( !/@table/.test(lines[0]) ) return; var tbl = ''; for (var i = 1; i < lines.length; i++) { var line = lines[i]; if (line == '') continue; var td = i==1 ? 'th' : 'td'; tbl += '<tr><' + td + '>'; tbl += line.split(',').join('</' + td + '><' + td + '>'); tbl += '</' + td + '></tr>'; } tbl = '<table class="content-tbl">' + tbl + '</table>'; $(this).before(tbl); } function parseTbl() { $("div.notes div.content").bind("DOMSubtreeModified", do_parseTbl); $("div.notes div.content").each(do_parseTbl); $("#expandButton,parentArrow").live("click", function() { $("div.notes div.content").each(do_parseTbl); }); }; $(window).bind("load hashchange", parseTbl); var stylesheet = document.styleSheets.item(0); stylesheet.insertRule(" .content-tbl td,.content-tbl th { border:1px #777 solid;padding:5px; font-size:13px; } ", stylesheet.cssRules.length); parseTbl();
※2016.05.28 スマホ版の折り畳みボタンタップ時も表示されるように修正
こちらのTagListスクリプトのカスタマイズ版です。
d.hatena.ne.jp
TagListUniではTagListから以下の箇所を変更しました。
・日本語(含むUnicode)タグも表示されるようにした
・縦方向のリストでなく羅列する形式にした
・文字の大きさのlarge指定をなくし普通の文字サイズにした
使い方はTagListと同じですのでTagListの記事を参照ください。
TagListUniをMemoFlowy経由で登録
url="https://workflowy.com/get_initialization_data"; q=new XMLHttpRequest(); q.open("get",url,false); q.send(null); data=q.responseText; data = data.replace(/((?:\\\\)*)\\(u[0-9a-f]{4})/g, function(arg0,arg1,arg2){return arg1+"%"+arg2}); data=unescape(data); list=new Array(); tag="@"; for(k=0;k<2;k++){ d=data.split(tag); for(i=1;i<d.length;i++){ s=d[i].split(" ")[0].split("\"")[0].split("\\")[0]; if(s && !/[;{)\/\+]/.test(s) && list.indexOf(tag+s)==-1) list.push(tag+s); } tag="#"; } list.sort(); listwidth=320; listleft=(window.innerWidth-listwidth)/2; html=""; for(i=0;i<list.length;i++){ html+="<div onclick=Select("+i+") style=padding:5px;overflow:hidden;white-space:nowrap;display:inline-block;>"+list[i]+"</div>"; } e=document.createElement("div"); e.innerHTML=html; e.style.cssText="color:black;background:beige;font-family:Hiragino Sans;font-weight:bold;position:fixed;overflow:scroll;text-align:left;height:72%;top:14%;left:"+listleft+"px;width:"+listwidth+"px;z-index:99;border:1px white solid;box-shadow:5px 5px 5px 5px rgba(0,0,0,0.2);"; document.body.appendChild(e); function Select(x){ document.body.removeChild(e); location="https://workflowy.com/#/?q="+list[x].replace(/#/,"%23"); }
XMLHttpRequestを使わずdocument_view.js内で使われている関数などを使って実装すれば、タグの正確な抽出と高速化ができそうですが、処理の流れを追いきれませんでした。
機能拡張スクリプトライブラリ作成計画、良さそうですね。
スクリプトのインポート自体にリスクがある上、MemoFlowy経由のインポートは敷居が高かったり手間取ったりするので、審査済みのスクリプトライブラリからワンタップインポートできたら安全性も利便性も高まりそうです。
ライブラリへの掲載や記事へのリンクの許可については、今のところwineroses氏のコバンザメスクリプトしか作れていないので、右に倣います。
wineroses氏のScriptMakerとStylenoteに触発されまして。
HandyFlowyの機能拡張スクリプトをiPhoneでぽちぽち作成しようとすると、登録するまで挙動がわからず作成中のテストスクリプトをいくつも登録する事態に陥ります。
Testerはテストスクリプトとして登録することなくJavaScriptやCSSの挙動を確認できる機能拡張スクリプトです。
window.onerror = function(mes, src, line, col, err) { alert('['+line+'] '+mes); }; (function(){ var p = pageContainer.getElementsByClassName("project selected noted")[0]; if(!p){ alert("No script in Note."); return; } var s = p.getElementsByClassName("notes")[0].innerText; var t = /\}\s*$/.test(s) ? "style" : "script"; var e = document.createElement(t); e.innerHTML = s; document.body.appendChild(e); })();
TesterをMemoFlowy経由でインポート
ノートにCSS*1を書いてTesterを実行するとスタイルが反映されます。
ノートにJavaScriptを書いてTesterを実行するとJavaScriptが実行されます。
JavaScriptの変数を初期化したりCSSを適用前に戻したりするには右ペインのリロードボタンで。
ついでにJavaScriptで文法ミスなどエラーがあった場合は行番号とエラー内容を表示するようにしました。Workflowy自体のエラーも拾うので必要なくなったらリロードして解除してください。
Testerで色々試した後にScriptMakerやStylenoteで登録、の流れはいかがでしょう。
iTunes Search APIで取得できるアプリアイコンのURL形式がいつの間にか変わっていたのでテストしてみました。いつの間にか使えなくなるかもしれませんが、現状の記録ということで。
iTunes Uのidをlookupして得られるartworkUrl60
のファイル名「60x60bb.jpg」を元に説明します。
ファイル名の●x●の部分を変えることで1ピクセル刻みの正方形で大きさを指定して取得できます。
わざと誤った文字を指定したとき(例:aa)に表示されるメッセージによるとImage Resize Styleというパラメータのようです。
やや拡大して元の大きさで切り取ったような画像を取得できます。
指定するアルファベットは何でもよいわけでなく、取得できたものは
bb, bf, cc, cx, fa, fb, fc, fe, ff, fg, fh, ss
でした。bbからfhまでの画像は以下の通り(左上から右方向の順)です。
またssは●x●の指定によらず1024ピクセルの画像を返します。
拡張子の文字列を変更すると、一般的な画像形式を含めかなりの数のファイル形式に変換できます。
3文字の拡張子*1のうち取得できた(ステータスコードが200である)ものを列挙しておきます。
art, arw, avi, avs, bmp, cgm, cin, crw, dcm, dcr, dcx, dib, dng, dot, dpx, emf, epi, eps, ept, exr, fax, fig, fpx, gif, hrz, ico, jng, jpc, jpg, man, mat, mng, mpc, mpr, mrw, msl, mtv, mvg, nef, orf, otb, pam, pbm, pcd, pcl, pcx, pdb, pdf, pef, pfa, pfb, pfm, pgm, pix, png, pnm, ppm, psd, pwp, rad, raf, rgb, rla, sct, sfw, sgi, sid, svg, tga, tif, tim, ttf, txt, wmf, wpg, xbm, xcf, xpm, xwd
1つ目。以前、bold italic underlineやその他諸々の書式をクリアする方法としてMyScriptsを使った手法を取り上げました。
iOSメモアプリへコピペする時にサクッと書式クリアする - aitatena
https://itunes.apple.com/jp/app/myscripts/id492086539?mt=8&uo=4&at=11lqq9
MyScriptsはURLスキームでスクリプトを呼び出せます。書式クリアの場合、呼び出しURLは次の形です。*1
myscripts://run?title=%E6%9B%B8%E5%BC%8F%E3%82%AF%E3%83%AA%E3%82%A2
これをS Launcherなどのウィジェットランチャーアプリに登録すると、いつでも呼び出せます。
対象文字列をカットして、ウィジェットから呼び出して、iOS9で搭載された左上のGo Backで戻ってペースト。
これで書式クリアされます。
2つ目。Workflowを使います。
インポートはこちら:https://workflow.is/workflows/136b146afb1e4424bbbfb2f427aa42e7
対象文字列をカットして、ウィジェットをタップして、ウィジェットを閉じてペースト。アプリを起動することなく完結します。
お好きな方法でどうぞ。
日本語情報が少なかったのでまとめました。
https://itunes.apple.com/jp/app/textexpander-3-+-custom-keyboard/id917416298?mt=8&uo=4&at=11lqq9
基本的には最後に書いた文が展開されます。
"Java" + "Script" + " result"; // JavaScript result
TextExpander.appendOutput()を使うと複数回に分けて出力結果に追加できます。
TextExpander.appendOutput("Java"); TextExpander.appendOutput("Script"); TextExpander.appendOutput(" result"); // JavaScript result
JavaScriptの実行結果にマクロ(%を使ったスニペット)が含まれていればマクロも実行されます。
'%Y.%m.%d'; // 2015.01.01(※展開した時点の日付)
日時に関するマクロの参考:https://smilesoftware.com/help/TextExpander/datetime.html
JavaScriptとfill-inを併用した場合、展開した際に入力欄を伴ったソースコードが表示されます。
入力欄に値を入力してOKボタンを押すと入力後の状態のソースコードが実行されます。
(後述のTextExpander.filledValuesも参照)
a = '%filltext:name=hoge%'; // 「a = '入力欄に入力した値';」が実行される
発展的なマクロ(クリップボード、fill-in、カーソル位置、カーソル操作、展開時デリミタ要否設定、タブキーなど)の参考:https://smilesoftware.com/help/TextExpander/specials.html
TextExpanderオブジェクトにはappendOutputの他にもプロパティがあります。*1
参考:Working With AppleScript and Shell Script Snippets – TextExpander
先述の通り、出力結果に追加します。
出力結果に何も出力したくない場合trueを設定します(初期値はfalse)。
例えば時刻を設定するだけのスニペットを作りたい場合などに使えます。
TextExpander.ignoreOutput = true // 出力結果なし
Abbreviation(スニペット名、スニペット編集画面の上側に入力する展開元文字列)を取得します。
TextExpander.triggeringAbbreviation; // Abbreviationで指定した文字列
展開した時点での日時を取得します。
TextExpander.baseDate; // Thu Jan 01 2015 12:34:56 GMT+0900 (JST)
またDate型のメソッドが使えます。
TextExpander.baseDate.getFullYear(); // 2015
マクロの日時を設定します(初期値はbaseDate)
TextExpander.adjustedDate = (new Date()).setDate(TextExpander.baseDate.getDate() + 3); // 日付を3日進める '%Y.%m.%d'; // 2015.01.04
またスニペットのネストを利用すると他のスニペットで利用できます。
// スニペット名:3Dadd TextExpander.adjustedDate = (new Date()).setDate(TextExpander.baseDate.getDate() + 3); // 日付を3日進める TextExpander.ignoreOutput = true; // 出力結果なし
として他のスニペットで
%snippet:3Dadd% %Y.%m.%d
を登録すると展開結果が2015.01.04となります。
ペーストボードの文字列を取得します。
TextExpander.pasteboardText; // ペーストボードの文字列
スニペットが展開されたアプリケーションのbundle identifierを取得します。
TextExpander.expansionContext; // スニペットプレビュー画面で展開した場合、com.textexpander.preview // 他のアプリ上でTextExpanderキーボードで展開した場合、group.com.smileonmymac.tetouch
fill-inで入力された値を取得します。
a = '%filltext:name=hoge%'; TextExpander.filledValues['hoge']; // hogeの入力欄に入力した値
Working With AppleScript and Shell Script Snippets – TextExpanderによると、OS XではJavaScriptを拡張したJavaScript for Automation (JSA)が使えますが、iOSではPlain old JavaScriptだけだそうです。
具体的にどんなオブジェクトが使えるか判然としなかった調べました。
Object.getOwnPropertyNames(this).sort();
Array,ArrayBuffer,Boolean,DataView,Date,Error,EvalError,Float32Array,Float64Array,Function,Infinity,Int16Array,Int32Array,Int8Array,JSON,Map,Math,NaN,Number,Object,Promise,RangeError,ReferenceError,RegExp,Set,String,SyntaxError,TextExpander,TypeError,URIError,Uint16Array,Uint32Array,Uint8Array,Uint8ClampedArray,WeakMap,console,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,escape,eval,isFinite,isNaN,parseFloat,parseInt,undefined,unescape
文字列操作、数学関数、正規表現、URLエンコードなどローカルで行いたい処理はおおよそ可能です。
一方、windowやXMLHttpRequestなどWEB系のオブジェクトは使えないので外部との通信を行うのは無理そうです。
Sample JavaScripts for TextExpander 5.0 / TextExpander touch 3.5 - Smileでは
の流れのサンプル(BMI計算、給料計算、簡易計算機、PHQ-9うつ病テスト)が紹介されています。
この他にペーストボードを使えることを利用して
の流れも考えられますね。
ただキーボード切り替えが日本語環境ではかなり面倒なので対応アプリと標準キーボードの組み合わせが良さそうです。
参考:TextExpander-Enhanced Apps – TextExpander
*1:紹介されているもの以外で隠しプロパティがあるんじゃないかと探ってみましたが特に見つかりませんでした。参考:JavaScript のオブジェクトのプロパティ一覧を取得する方法とオブジェクトが指定の名前のプロパティをもっているか検査する方法 - ひだまりソケットは壊れない