Discordに垂れ流す用のStream検索UserScript
使い方
自分のユーザーページにこのスクリプトをimportする
任意のページ上で任意の単語を選択する
ポップアップメニューに下記2つが追加されている
「Stream検索」:選択文字列でStreamを検索して、その結果をクリップボードにコピーする
「Stream検索爆弾」:選択文字列でStreamを検索して、その結果をクリップボードにコピーする(Discordに貼り付けた結果、プレビューが表示される)
どれかを実行したら、クリップボードにコピーされているのでDiscordの任意のチャンネルにペーストする。
Q.こちらはスマホでも使えるスクリプトですか?(スマホでメニューが出てこないので念のため確認)
Chromeなら使えるみたいです!Firefoxは無理でした。。
ありがとうございます、なるほどです(Safariの民より)。
なるほど!情報ご提供ありがとうございます!スマホの民には厳しいScrapbox。
Porterでは使えました
おお!良かったです
ChromeのPWAはダメだった。Chromeでは大丈夫だったのに。。ナゼ。
あれ?いま試したらChromeでもできなくなってる。
ええええ、解せぬ…。
script.jsscrapbox.PopupMenu.addButton({
title: 'Stream検索',
onClick: function (text) {
main(text)
}
});
scrapbox.PopupMenu.addButton({
title: 'Stream検索爆弾',
onClick: function (text) {
main(text, true)
}
});
export function main(word, bomb=false) {
const project_url = 'https://scrapbox.io/arpla/'
const api_url = 'https://scrapbox.io/api/stream/arpla/'
const search_word = word === '' ? '哲学' : word
const stream = JSON.parse(httpGet(api_url))
const filtered_stream = filterStream(search_word, stream)
const result = filtered_stream.slice(0,10).map(page => {
let url = `${project_url}${page.title}#${page.line.id}`
url = bomb ? `● ${url}` : `● <${url}>`
return url + ' 【' + page.line.text.replace(new RegExp(search_word,"g"), `**__${search_word}__**`).replace(/^ +/g,'') + '】'
})
const message = filtered_stream.length > 0
? `✨✨✨アープラノートの最近の記事で「 ${search_word} 」 が${filtered_stream.length}件ヒットしました(内${result.length}件を表示します):✨✨✨`
: `😳😳😳アープラノートの最近の記事で「 ${search_word} 」はヒットしませんでした。記事を書いてみましょう。😳😳😳`
if( copyText(message + '\n\n' + '>>> ' + result.join('\n')) ){
alert('クリップボードにコピーしました。Discordに貼り付けてね')
}
}
function httpGet(theUrl) {
var xmlHttp = new XMLHttpRequest();
xmlHttp.open( 'GET', theUrl, false ); // false for synchronous request
xmlHttp.send( null );
return xmlHttp.responseText;
}
function filterStream(word, stream) {
// streamの各ページで検索ワードに該当する行を抽出する
let filtered_pages = stream['pages'].map(page => {
let texts = page['lines'].map(line => line['text'])
return {
'title': page['title'],
'lines': page['lines'].filter(line => line['text'].includes(word))
}
})
filtered_pages = filtered_pages.filter(x => x['lines'].length > 0)
// 最新履歴の行だけ抽出する
filtered_pages = filtered_pages.map(page => {
return {
'title': page['title'],
'line': page['lines'].reduce((a,b) => a['updated']>b['updated'] ? a : b)
}
})
return filtered_pages
}
function copyText(target_str) {
// Clipboard APIが使えるかの確認
if(navigator.clipboard){
// 対象となる要素のテキストをコピー
navigator.clipboard.writeText(target_str);
return true;
} else {
return false;
}
}