GyazoのUIで複数選択したURLを漫画の形式でコピーするUserScript
GyazoのUIで複数選択したURLを漫画の形式(右とじ見開き)でコピーするUserScript
漫画の形式?
Gyazo上でこういう複数選択をしたとき
4
3
2
1
クリップボードにこれをコピーする
[[2]][[1]]
[[4]][[3]]
インストール
使い方
https://gyazo.com/44be9c73a8e18d9034cd20052610f2fb
2022/5/7 Gyazoの仕様変更で利用できなくなっていたので修正
2022/3/28 React内部にアクセスしなくても情報が露出するようになっていた
code:script.js
// ==UserScript==
// @name Copy to Scrapbox in Manga style
// @version 0.3
// @description Copy URLs of selected items from Gyazo to paste Scrapbox in Manga style
// @author motoso
// @run-at context-menu
// @grant GM_setClipboard
// @icon <$ICON$>
// ==/UserScript==
(function () {
'use strict';
function makeNthPageSpread(arr, n) {
let pages = [];
while (0 < arr.length) {
pages.push(arr.splice(0, n));
}
return pages;
}
const checkedCards = document.querySelectorAll(".card.checked");
let urls = [];
for (const card of checkedCards) {
urls.push(card.childNodes2.childNodes0.href); }
// 下の方が先頭ページなので逆順にしてページに分割
const pages = makeNthPageSpread(urls.reverse(), 2);
// 見開きに分割したら左とじに変換
const rightBindingPages = pages.map(p => p.reverse())
// 分割された配列を結合
GM_setClipboard(rightBindingPages.map(i => i
.map((i) => [[${i}]]).join('')) // 見開きを結合
.join("\n")); // 見開きごとに改行
})();
ライセンス
code:LICENCE
Copyright 2022 Motoso Inami
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
--
code:script_0.2.js
// ==UserScript==
// @name Copy to Scrapbox in Manga style
// @version 0.2
// @description Copy URLs of selected items from Gyazo to paste Scrapbox in Manga style
// @author motoso
// @run-at context-menu
// @grant GM_setClipboard
// @icon <$ICON$>
// ==/UserScript==
(function () {
'use strict';
function makeNthPageSpread(arr, n) {
let pages = [];
while (0 < arr.length) {
pages.push(arr.splice(0, n));
}
return pages;
}
const checkedCards = document.querySelectorAll(".card.checked");
let urls = [];
for (const card of Array.from(checkedCards)) {
const span = card.lastElementChild;
const url = card.querySelector(".view-operation").href;
urls.push(url);
}
// 下の方が先頭ページなので逆順にしてページに分割
const pages = makeNthPageSpread(urls.reverse(), 2);
// 見開きに分割したら左とじに変換
const rightBindingPages = pages.map(p => p.reverse())
// 分割された配列を結合
GM_setClipboard(rightBindingPages.map(i => i
.map((i) => [[${i}]]).join('')) // 見開きを結合
.join("\n")); // 見開きごとに改行
})();
code:script.js-old
// ==UserScript==
// @name Copy to Scrapbox in Manga style
// @version 0.1
// @description Copy URLs of selected items from Gyazo to paste Scrapbox in Manga style
// @author motoso
// @run-at context-menu
// @grant GM_setClipboard
// @icon <$ICON$>
// ==/UserScript==
(function () {
'use strict';
function makeNthPageSpread(arr, n) {
let pages = [];
while (0 < arr.length) {
pages.push(arr.splice(0, n));
}
return pages;
}
const checkedCards = document.querySelectorAll(".card.checked");
let urls = [];
for (const card of Array.from(checkedCards)) {
const span = card.lastElementChild;
if (!(span instanceof HTMLSpanElement)) throw Error("Can't find a copy button");
const reactKey = Object.keys(span).find(key => key.startsWith("__reactFiber"));
urls.push(spanreactKey.return.stateNode.props.text); }
// 下の方が先頭ページなので逆順にしてページに分割
const pages = makeNthPageSpread(urls.reverse(), 2);
// 見開きに分割したら左とじに変換
const rightBindingPages = pages.map(p => p.reverse())
// 分割された配列を結合
GM_setClipboard(rightBindingPages.map(i => i
.map((i) => [[${i}]]).join('')) // 見開きを結合
.join("\n")); // 見開きごとに改行
})();