UserScript
Violentmonkey など UserScript manager をインストールした状態で次の URL を開くとインストールできます 注意点として UserScript manager で COSENSE_ID という値をセットする必要があります
この Cosense へ投稿する場合、directory という値をセットして下さい
なおこの点から分かるように、この UserScript は他の Cosense でも利用可能ですnyarla.icon
この UserScript は UserScript manager のメニューにページの投稿アイテムを追加します
Bookmark to Cosense と言うメニューアイテムが追加されるはずnyarla.icon
v1.1.0 で Make Cosense data というメニューも追加されましたnyarla.icon
これは window.alert で下記のフォーマットだけを表示するメニューです
window.alertは Firefox だとメッセージをコピーできるので、そこ経由でテキストだけが欲しい時に使えます
この UserScript によって作成されるページは次の通りです:
code:_
{リンク先のタイトル}
Date: {YYYY-MM-DD}
OGPなどからの引用
あとはフリースペース。概要などをかきましょう
この UserScript は同名のタイトルがあるページを投稿した場合、新しくページを作りません
これは主にページやリンクの重複防止のためにこう言った仕様になっています
なぜ UserScript ベースなのかについて
これは Firefox ではContent Security Policy が Bookmarklet にも適用される、という事が直接の切っ掛けです
そのため Firefox では GitHub などで Bookmarklet が動かない!nyarla.icon
あとは UserScript でやっていた方が色々と便利な機能を足せる!とかそう言う面もあります
とは言えこれは副次的な理由です nyarla.icon
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);