UserScript
とは?
Webブラウザ で動かすことの出来る任意の JavaScript のこと この Cosense への投稿で使うUserScriptについて
この Cosense への投稿で使う UserScript は下記のリンクからインストールできます
上記のリンクを機能させるためには UserScript Manager をブラウザにインストールする必要があります
上記スクリプトを使い始める前に、UserScript の変数として COSENSE_ID という値をセットする必要があります
この Cosense へ投稿する場合 directory という値をセットしてください
なおこの点から分かるように他の Cosense でも使えるようになっています nyarla.icon
この UserScript は UserScript manager のメニューとして次の項目を追加します
Bookmark to Cosense
指定された Cosense へブックマークを追加します
この時 Cosense に同じページ名がある 場合、そのページは新規に追加されません
これはページの重複防止のために意図した挙動となっています nyarla.icon
Make Cosene data
window.alert を用いてこの Cosense へ投稿するデータを表示します
この UserScript が生成するページフォーマットは下記の通りです
code:_
{リンク先のタイトル}
Date: {YYYY-MM-DD}
OGPなどからの引用
あとはフリースペース。概要などをかきましょう
なぜ投稿スクリプトが UserScript なのかについて
これは Firefox で Content Security Policy が Bookmarklet にも適用される、と言った辺りが作成の理由です
この影響のため Firefox では GitHub などで Bookmarklet が動きません nyarla.icon
また UserScript でやっていた方が色々と便利な機能を足せる、と言う側面もあります
とは言えこれは副次的な理由です nyarla.icon
投稿用 UserScript
UserScript を編集する場合について
ちょっとしたバグ修正などはちゃちゃっとやってしまって問題なし
ただガッツリと変更を加える場合には 掲示板 などで相談してください いきなり中身がガラっと変っていると誰もがビックリするので…… nyarla.icon
更新履歴
1.1.x
1.1.1 - 投稿データに余分なスペースが入っていた件を修正nyarla.icon
1.1.0 - Cosense への投稿データを window.alert で popup するメニューを追加 nyarla.icon
1.0.x
1.0.9 - コマンドメニューからタイトルと本文データの生成を分離 nyarla.icon
1.0.8 - タイトルに [\r\n] が入っていると挙動が壊れる件を修正nyarla.icon
1.0.7 - css セレクタに誤りがあった点を修正 nyarla.icon
1.0.6 - bodyの置換に //g を追加 nyarla.icon
1.0.5 - @grant が壊れていたのを修正 nyarla.icon
1.0.4 - 既にページがある場合において、本文の追記をしないように調整 nyarla.icon
1.0.3 - 概要が無い場合にタイトルを使うよう修正 nyarla.icon
1.0.2 - タイトル周りが微妙になっていた件を修正 nyarla.icon
1.0.1 - 引用構文内の改行コード周りを改善 nyarla.icon
1.0.0 - 初版 nyarla.icon
code:cosense-bookmark.user.js
// ==UserScript==
// @name Bookmark to Cosense
// @match *://*/**
// @version 1.1.1
// @author OKAMURA Naoki aka nyarla <nyarla@kalaclista.com>
// @description The UserScript for bookmark all website to Cosense (formaly known Scrapbox)
// @grant GM_getValue
// @grant GM_registerMenuCommand
// @grant GM_xmlhttpRequest
// ==/UserScript==
const cosenseId = GM_getValue('COSENSE_ID');
const getProperty = (getters) => {
for (const getter of getters) {
const el = document.querySelector(selector);
const text = el ? access(el) : '';
if (text) {
return text;
}
}
return '';
};
const makeCosenseData = () => {
const content = el => el.getAttribute('content');
const text = el => el.textContent;
const title = getProperty([
// by Open Graph Protocol
['metaname="og:title"', content], // this is mistake in website, but supported. // by Twitter Card
// by Microformat v2
// by Microformat v1
// by title
'title', text, // finally, fallback to getting from title element const summary = getProperty([
// by Open Graph Protocol
// by Twitter card
// by Microformat v2
// by Microformat v1
]);
const website = getProperty([
]);
const href = getProperty([
['metaname="og:url"', content], // this is mistake in website, but supported. ['linkrel="canonical"', el => el.getAttribute('href')], // use rel="canonial" href. ]) || location.href; // finally, use location.href.
// get favicon from hidden api by google
const icon = https://t3.gstatic.com/faviconV2?client=SOCIAL&type=FAVICON&fallback_opts=TYPE,SIZE,URL&url=${encodeURIComponent(href)}&size=128#.png;
const date = new Date().toISOString().split(/T/)0; const favicon = [!<> [${icon}]];
const link = [${title} ${href}];
const quote = > ${summary ? summary : title}\n[> [${decodeURIComponent(href)}]] ;
const body =
`
Date: ${date}
${quote.replace(/\n/g, "\n> ")}
${favicon}
`;
};
const bookmarkToCosense = () => {
if (! cosenseId) {
window.alert('The value of COSENSE_ID is not set. Please set COSENSE_ID to your UserScript manager');
return;
}
GM_xmlhttpRequest({
method: 'GET',
url: https://scrapbox.io/api/pages/${cosenseId}/${encodeURIComponent(title)},
onload: (res) => {
const json = JSON.parse(res.responseText);
if (json.lines.length > 1) {
location.href = https://scrapbox.io/${cosenseId}/${encodeURIComponent(title)};
return;
}
location.href = https://scrapbox.io/${cosenseId}/${encodeURIComponent(title)}?body=${encodeURIComponent(body)};
},
});
};
const popupCosenseData = () => {
window.alert(makeCosenseData().join("\n"));
};
GM_registerMenuCommand('Bookmark to Cosense', bookmarkToCosense);
GM_registerMenuCommand('Make Cosense data', popupCosenseData);