検索窓からテンプレートを直接ロードする
更新履歴
2019/4/11
公開
2019/4/14
別のプロジェクトに移動すると処理を終了するようにした
----------
1. テンプレートとして事前にページを作っておいて
2. QuickSearchで検索して
3. 上下キーで選んでEnterを押す(モバイルではタップする)
という手順でテンプレートを利用できるようになります。
https://gyazo.com/013681bbb47806dbfd98e79920e47e69
表示される選択肢をキャンセルすると新規ページとして作成されます。つまり
ページを作った後にテンプレを流し込む
テンプレをbodyとして新規ページを作る
のどちらもできるようになっています。
テンプレートのページをQuickSearchから直接開けなくなりますので、編集する時は通常の検索を実行して検索結果からページを開いて下さい。
ページ名が変わってしまうと機能しなくなるため、複数人で管理するプロジェクトには向かないと思います。
スクリプト内のtempListを編集してご利用ください。ページ名の一部に共通の英字を振っておくと呼び出しやすくなると思います。
例 : template レシピ
そこそこ長くしておくと絞り込みやすい
code:script.js
(function() {
// テンプレートとして使用するページのリスト
const encodedList = tempList.map(value => encodeURIComponent(value.replace(/ /g, '_')));
const targetProject = scrapbox.Project.name;
const events = click.loadTemp_${targetProject} keydown.loadTemp_${targetProject};
const selector = '.search-form .dropdown-menu a';
$('.navbar').off(events, selector);
$('.navbar').on(events, selector, async event => {
if (scrapbox.Project.name !== targetProject) {
$(event.delegateTarget).off(events, selector);
return;
}
if (event.type === 'keydown' && event.key !== 'Enter') {
return;
}
const targetTitle = event.target.href.split('/').pop();
if (!encodedList.includes(targetTitle)) return;
event.preventDefault();
event.stopPropagation();
try {
const text = await fetchPageText(targetTitle);
const lines = text.split('\n');
if (lines.length <= 1) {
throw new Error('No page body.');
}
lines.shift();
const body = lines.join('\n');
if (scrapbox.Page.lines) { // 個別ページが開かれている時
const isOk = confirm('現在のページに適用しますか?');
if (isOk) {
appendText(body);
document.activeElement.blur();
document.getElementsByClassName('mobile-search-toggle')0.click(); document.getElementById('text-input').focus();
return;
}
}
event.target.href = https://scrapbox.io/${scrapbox.Project.name}/new?body=${encodeURIComponent(body)};
event.target.click();
document.getElementsByClassName('mobile-search-toggle')0.click(); } catch (error) {
console.error(error);
alert(error.message);
}
});
async function fetchPageText(encodedPageTitle) {
const url = https://scrapbox.io/api/pages/${scrapbox.Project.name}/${encodedPageTitle}/text;
const response = await fetch(url);
if (!response.ok) {
throw new Error(${response.status} ${response.statusText});
}
const text = await response.text();
return text;
}
function appendText(text) {
const textArea = document.getElementById('text-input');
const keydownEvent = {
event: document.createEvent('UIEvent'),
dispatch: function(keyCode) {
this.event.keyCode = keyCode;
textArea.dispatchEvent(this.event);
}
};
keydownEvent.event.initEvent('keydown', true, true);
const titleLineLengh = Array.from(scrapbox.Page.lines0.text).length; for (let i = 0; i < titleLineLengh; i++) {
keydownEvent.dispatch(39); // →
}
keydownEvent.dispatch(13); // Enter
textArea.value = text;
textArea.dispatchEvent(new InputEvent('input', { bubbles: true, cancelable: true }));
}
})();
UserScript.icon