// ==UserScript==
// @name Ctrl+CでタイトルとURLをコピー
// @description Shift+C:除去文字列設定 Shift+T:後回しタイトル設定 (YouTube)Alt+C:列挙
// @match *://*/*
// @version 0.6.13
// @run-at document-idle
// @grant GM.setClipboard
// @grant GM_setValue
// @grant GM_getValue
// @grant GM_deleteValue
// @namespace https://greasyfork.org/users/181558
// @require https://code.jquery.com/jquery-3.4.1.min.js
// ==/UserScript==
(function() {
const cleanUrlFirst = 0; // 1:ページ読み込み時にURLのゴミを除去Lv1(推奨) 2:Lv2(さらに除去)
const DISPLAY_TITLE_URL = 0; // 1:Ctrl+C(Alt+C)時にタイトルとURLの詳細をポップアップで表示(推奨)
const DISPLAY_ENUM = 0; // 1:Ctrl+C(Alt+C)時にタイトルとURLの列挙の詳細をポップアップで表示(推奨)
const ADD_OPEN_MULTIPLE_URL_GUIDE = 0; // 1:URL列挙した時末尾にopepn multiple urlアドオンの検索を追加
const YOUTUBE_WATCH_CTRLC_URL_VARIATIONS = 1; // YouTube動画視聴画面でCtrl+Cの機能を何番目まで使うか 1:パラメータ除去(推奨) 2:再生リストを残す 3:キューリストをURL化 4:キューにある動画IDの列挙
const YOUTUBE_APPEND_PLAYLIST_URL = 0; // 1:YouTube検索結果でAlt+CでURL列挙の末尾に連続再生するURLを追加
const ALT_C_SITES = /youtube\.com\/$|youtube\.com\/channel\/.+\/videos|youtube\.com\/user\/.+\/videos|youtube\.com\/c\/.+\/videos|youtube\.com\/playlist|www\.youtube\.com\/results|\/\/www.youtube.com\/c\/.+\/search\?query=|https:\/\/www\.nicovideo\.jp\/search\/|\/\/www.nicovideo.jp\/user\/[^/]+\/video|\/\/www.nicovideo.jp\/my\/watchlater|\/\/www.nicovideo.jp\/my\/mylist|\/\/www.nicovideo.jp\/user\/\d+\/mylist\/\d+/;
String.prototype.match0 = function(re) { let tmp = this.match(re); if (!tmp) { return null } else if (tmp.length > 1) { return tmp[1] } else return tmp[0] }
if (window != parent) return;
var mllID;
var sakujoRE = pref("ctrlcsakujoRE") || "";
var kaisuu = 0;
var sakujoTitleRE = pref("ctrlcsakujoTitleRE") || "";
var ret = (navigator.platform.indexOf("Win") != -1) ? "\r\n" : "\n";
if (cleanUrlFirst) {
var cuf = () => { let newurl = modUrl(cleanUrlFirst); if (newurl != location.href) window.history.pushState(null, null, newurl); }
cuf();
setTimeout(cuf, 2000)
}
// Shift+T ページタイトル部分後回し
sakujotitle(sakujoTitleRE);
function sakujotitle(sakujoTitleRE) {
if (sakujoTitleRE) {
try {
var hit = document.title.match(RegExp(sakujoTitleRE, "g"));
if (hit) document.title = document.title.replace(RegExp(sakujoTitleRE, "g"), "") + " " + hit;
} catch (e) { alert("Shift+T:\n文法エラーのようです\n\n設定値:\n" + sakujoTitleRE); }
}
}
// 検索ワードをページタイトルの最初に付ける
addtitle(/^https?:\/\/calil.jp\/local\/search/, "", '//form[@class="search"]/div/input|//input[@id="query"]'); // calil検索
addtitle(/^https?:\/\/tv\.yahoo\.co\.jp\/search\/\?q=/, "", '//input[@class="generic_inputText floatl"]'); // yahooテレビ検索
addtitle(/^https?:\/\/www\.nicovideo\.jp\/mylist_search\//, "", '//input[@id="search_united"]', "", "", " - マイリスト検索 "); // ニコ動マイリスト検索
addtitle(/^https?:\/\/www\.jstage\.jst\.go\.jp\/result/, "", '//span[@class="search-parameter"]'); // J-STAGE詳細検索結果
setTimeout(() => { addtitle(/^https?:\/\/www\.pinterest\.jp\/search\/pins\/.*q=/, "", '//input[@role="combobox"]') }, 2500); // Pinterest詳細検索結果
if (document.title.indexOf("|") === -1) addtitle(/^https?:\/\/www\.suruga-ya\.jp\/search\?/, "", '//input[@id="searchText"]', '//div[@id="topicPath"]', /駿河屋TOP.≫.|駿河屋TOP/gi); // 駿河屋検索
document.addEventListener("keydown", function(e) { //キー入力
if (e.target.tagName == 'INPUT' || e.target.tagName == 'TEXTAREA' || e.target.getAttribute('contenteditable') == 'true') return;
var key = (e.shiftKey ? "Shift+" : "") + (e.altKey ? "Alt+" : "") + (e.ctrlKey ? "Ctrl+" : "") + e.key;
if (e.shiftKey && !e.altKey && !e.ctrlKey && e.which == 84) { // shift+T ページタイトル部分後回し文字列設定
var sample = "ありません";
if (location.href.indexOf("://www.nicovideo.jp") !== -1) sample = "キーワードで動画検索 |キーワードで|」動画|人気の「";
if (location.href.indexOf("://www.amazon.co.jp") !== -1) sample = "Amazon.co.jp\\s?: |Amazon.co.jp: |Amazon \\|\\s|Amazon||Amazon.co.jp:カスタマーレビュー: ";
if (location.href.indexOf("auctions.yahoo.co.jp") !== -1) sample = "ヤフオク! -";
if (location.href.indexOf("kakaku.com/") !== -1) sample = "価格.com - ";
if (location.href.indexOf("//www.yodobashi.com/") !== -1) sample = "ヨドバシ.com - ";
if (location.href.indexOf("//www.sukima.me/book/title/") !== -1) sample = "^\\[.*\\]";
var str = prompt("shift+T:\r\n\"" + document.domain + "\" でページタイトルの中で後ろに移動したい文字列を正規表現で入力してください\r\n\r\nこのサイトでのお薦め設定例:\r\n" + sample + "\r\n\r\n現在値:" + (sakujoTitleRE || "なし") + "\n\n", sakujoTitleRE || "");
sakujoTitleRE = str === null ? sakujoTitleRE : str;
if (sakujoTitleRE != "") {
pref("ctrlcsakujoTitleRE", sakujoTitleRE);
sakujotitle(sakujoTitleRE);
} else {
pref("ctrlcsakujoTitleRE", "");
}
return;
}
if (e.shiftKey && !e.altKey && !e.ctrlKey && e.which == 67) { // shift+C 除去文字列設定
var str = prompt("shift+C:\r\n\"" + document.domain + "\" で Ctrl+C 押下時タイトルやURLや選択文字列から除去したい文字列を正規表現で入力してください\r\n\r\n現在値:" + sakujoRE + "\r\n", sakujoRE);
sakujoRE = str === null ? sakujoRE : str;
if (sakujoRE != "") {
pref("ctrlcsakujoRE", sakujoRE);
} else {
pref("ctrlcsakujoRE", "");
}
return;
}
// if (!e.shiftKey && !e.altKey && e.ctrlKey && e.which == 67) { // ctrl+c
if (key === "Ctrl+c" || (key === "Alt+c" && ALT_C_SITES.test(location.href))) { // ctrl+c
if (window.getSelection() != "") {
// 選択文字列がある
var selection = window.getSelection().toString();
if (sakujoRE) { // 除去文字列があれば除去してコピーも自前(なければブラウザにさせる)
selection = tryReplace(selection, sakujoRE, "Shift+C");
if (window.getSelection().toString() !== selection) {
copy2cb(selection);
e.preventDefault();
}
}
} else {
// 選択文字列がない
var doc = location.href;
var txt1 = doc;
var txt2 = txt1;
var opt = "";
var idEnum = [];
var txt2 = modUrl(2, kaisuu);
//if (txt1 != txt2) opt += "(パラメータ除去)";
if (/www\.youtube\.com\/embed\//.test(txt1)) txt2 = txt1.replace(/\?.*/, "").replace(/embed\//, "watch?v="); // youtube埋め込みを正規のページに
var ret = (navigator.platform.indexOf("Win") != -1) ? "\r\n" : "\n";
var title = document.title.replace(/ https?:.*/, "");
title = tryReplace(title, sakujoRE, "Shift+C");
if (kaisuu % 1 == 0) {
var txt = title + ret + txt2 + ret;
// var bal = "" + title + "\n" + txt2;
var bal = title + "\n" + txt2;
}
var sort = "";
// YouTube動画視聴画面なら
elegeta("#link4bm").forEach(e => e.remove())
if (location.href.match(/^https?:\/\/www\.youtube\.com\/watch\?v\=/)) {
kaisuu = (kaisuu % YOUTUBE_WATCH_CTRLC_URL_VARIATIONS) + 1;
let eles = elegeta('//ytd-playlist-panel-video-renderer[@id="playlist-items"]/a');
let eles2 = [...new Set(eles.map(c => c.href.match0(/\?v=([^&]+)/)))].slice(0, 50); // 重複削除
if (eles.length) {
var indexEle = eleget0('//yt-formatted-string[@class="index-message style-scope ytd-playlist-panel-renderer"]/span[1]|//div/div[@id="secondary-inner" and @class="style-scope ytd-watch-flexy"]/ytd-playlist-panel-renderer[@id="playlist" and @class="style-scope ytd-watch-flexy" and @js-panel-height="" and @collapsible="" and @playlist-type="TLPQ"]/div/div[1]/div[@id="header-contents"]/div[@id="header-top-row" and contains(@class,"style-scope ytd-playlist-panel-renderer")]/div[@id="header-description"]/div/div/span');
var indexNo = indexEle && indexEle.textContent ? indexEle.textContent.match0(/(\d+)/mi) - 1 : 0;
var indexUrlQP = indexNo > 0 ? `&index=${indexNo}` : "";
}
if (kaisuu == 2) {
let cb = document.title + "\n" + deleteParam(["start_radio=", "index="], location.href)
popup(DISPLAY_TITLE_URL ? cb : "タイトルとURL(パラメータを残す)")
GM.setClipboard(cb + "\n");
} else if (kaisuu == 3 && eles.length) {
let cb = true ? "https://www.youtube.com/watch_videos?video_ids=" + eles2.join(",") + indexUrlQP : `https://www.youtube.com/embed/${eles2[0]}?playlist=${ eles2.join(",")}`;
var embedHTML = `<iframe referrerpolicy="no-referrer" src="${cb}" id="ytplayer" type="text/html" width=320 height=180 frameborder=0 allowfullscreen>`
let cb2 = cb
let cbEsc = (cb2).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"').replace(/'/g, ''')
let title = `▶ ${indexNo+1}/${eles2.length} ${document.title}`
popup(document.title + "\n" + cb)
GM.setClipboard(document.title + "\n" + cb2 + "\n");
$(`<div id="link4bm">${kaisuu%2!=2?"ブックマーク":"埋め込み"}用リンク(${eles2.length})\n<a href=${cb}>${title}</a></div>`).hide(0).insertBefore($(elegeta('//div/ytd-playlist-panel-renderer'))).show(150).delay(9999).hide(250, function() { $(this).remove() })
popup(DISPLAY_TITLE_URL ? document.title + "\n" + cb : "タイトルと限定公開再生リスト")
} else if (kaisuu == 4 && eles.length) {
let list = "," + eles2.join(",")
popup(DISPLAY_TITLE_URL ? list : "動画ID列挙")
GM.setClipboard(list + "\n");
} else {
let cb = document.title + "\n" + deleteParam(["list=", "t=", "index=", "start_radio="], location.href)
popup(DISPLAY_TITLE_URL ? cb : "タイトルとURL(パラメータ削除)")
GM.setClipboard(cb + "\n");
}
return false;
}
// 列挙するタイプのサイトなら
if (kaisuu % 5 != 4 && /seiga\.nicovideo\.jp\/my\/manga\/favorite|webcomics\.jp\/mylist|webcomics\.jp\/$|webcomics.jp\/total$|webcomics\.jp\/bookmark|webcomics\.jp\/ranking|www.nicovideo.jp\/my\/watchlater|www\.nicovideo\.jp\/my\/mylist|seiga\.nicovideo\.jp\/my\/clip|www\.nicovideo\.jp\/my\/fav\/|www\.nicovideo\.jp\/my\/channel|www\.nicovideo\.jp\/my\/community|www\.nicovideo\.jp\/my\/top\/all|\/\/www\.nicovideo\.jp\/my\/\?ref=pc_mypage_menu|\/\/www\.nicovideo\.jp\/my\/$|https:\/\/www\.nicovideo\.jp\/my\/nicorepo\/|\/\/www\.netoff\.co\.jp\/cart_param|\/\/.*\.5ch\.net\/\w*\/$|twicomi\.com\/author\//.test(txt1) ||
key === "Alt+c" && ALT_C_SITES.test(txt1)) {
var rekkyo = [
'//span[@class="VideoMediaObject-bodyTitle"]/../..',
'//div[@class="title"]/a',
'//div[@class="entry-title"]/a[1]',
'//div[@class="mylistVideo"]/h5/a',
'//div[@class="illust_box_li cfix"]/div/div[@class="text_ttl"]/a',
'//div[@class="outer"]/div/h5/a', '//div[@class="outer"]/h5/a',
'//div[@class="log-target-info"]/a',
'//div[@class="mylistVideo MylistItem-videoDetail"]/h5/a|//div[@id="mainWrap"]/div[@id="main"]/ul[contains(@class,"itemList")]/li[@class="clearfix"]/dl/dd/p/a',
'//div[@id="thread-list-box"]/table[@id="thread-list"]/tbody/tr/td/a',
//'//div/span[@class="NicorepoItem-contentDetailTitle"]/../..', // ニコレポ
'//span[@class="NicorepoItem-contentDetailTitle"]', // ニコレポ
// '//a[@class="NC-Link NC-MediaObject-contents"]', // ニコ動あとでみる hrefのあるリンクで大枠
'//a[@id="video-title"]', // youtube search
'//a[@id="video-title-link"]', // youtube top
'//a[@class="manga-image"]', // twicomi
'//li[@class="item nrn-thumb-info-done"]/div/p[@class="itemTitle"]/a', // ニコ動検索
'//h2[@class="NC-MediaObjectTitle NC-VideoMediaObject-title NC-MediaObjectTitle_fixed2Line"]', // ニコ動user,あとでみる動画
];
txt = ""; //title+ret;
txt2 = "";
var num = 0;
for (let target of rekkyo) {
var ele = elegeta(target, "visible");
ele.forEach((a, i) => {
if (!a.href) { // ニコ動マイリストだけの取り込み方(名前順ソート不可
a.innerTextZ = a.innerText.replace(/\n/gm, " ")
a.href = a.closest("a").href;
} else if (location.href.match(/\/\/twicomi\.com/)) { // twicomiだけの取り込み方
let titleEle = eleget0('.//div[@class="tweet-text"]|.//div[@class="tweet-data"]', a.parentNode.parentNode.parentNode)
if (titleEle && titleEle.textContent) a.innerTextZ = titleEle.textContent.replace(/\n/gm, " ") || "";
} else {
a.innerTextZ = a.innerText;
}
})
if (kaisuu % 5 == 1) {
sort = " 名前↓";
ele.sort(function(a, b) { return (a.innerTextZ > b.innerTextZ) ? 1 : -1; });
}
if (kaisuu % 5 == 2) {
sort = " URL↓";
ele.sort(function(a, b) { return (a.href.split(/\/\//g)[1]) > (b.href.split(/\/\//g)[1]) ? 1 : -1; });
}
if (kaisuu % 5 == 3) {
sort = " URL↑";
ele.sort(function(a, b) { return (a.href.split(/\/\//g)[1]) < (b.href.split(/\/\//g)[1]) ? 1 : -1; });
}
for (let a of ele) {
if (a.offsetHeight) { // 非表示じゃないやつだけ
var cleanurl = a.href.replace(/\?track=.*|\?_topic=.*|\?ref=.*/g, "")
if (location.href.match(/\/\/www.nicovideo.jp\/my\//)) { // ニコ動マイリストだけの取り込み方
cleanurl = a.href.replace(/\?.*/g, "")
}
if (cleanurl.match0(/\?v=(.+)$/)) { idEnum.push(cleanurl.match0(/\?v=(.+)$/)) }
if (DISPLAY_ENUM) {
// txt2 += "" + a.innerTextZ + "\n" + cleanurl + "\n";
txt2 += a.innerTextZ + "\n" + cleanurl + "\n";
}
txt += a.innerTextZ.replace(/\n/gm, " ") + ret + cleanurl + ret;
num++;
}
}
if (location.href.match0("youtube.com")) { var enumText = "https://www.youtube.com/watch_videos?video_ids=" + (idEnum.slice(0, 50).join(",")) }
}
title += " " + num + "件" + sort;
txt = title + ret + txt;
if (YOUTUBE_APPEND_PLAYLIST_URL) {
txt = txt + (enumText ? document.title + ret + enumText + ret : "");
txt2 += (enumText ? document.title + "\n" + enumText : "");
}
if (ADD_OPEN_MULTIPLE_URL_GUIDE) {
txt += "\nOpen Multiple URLs - Google 検索\nhttps://www.google.co.jp/search?q=Open%20Multiple%20URLs&lr=lang_ja\n";
txt2 += `\nOpen Multiple URLs - Google 検索\nhttps://www.google.co.jp/search?q=Open%20Multiple%20URLs&lr=lang_ja\n`;
}
// var bal = "" + title + "\n" + txt2;
var bal = `${title}\n${txt2}`
if (DISPLAY_TITLE_URL && DISPLAY_ENUM) popup("項目の列挙\n" + bal);
if (DISPLAY_TITLE_URL && !DISPLAY_ENUM) popup("項目の列挙\n" + title + "\n");
if (!DISPLAY_TITLE_URL && DISPLAY_ENUM) popup("項目の列挙 " + "" + num + "件" + "" + sort + "\n" + txt2);
if (!DISPLAY_TITLE_URL && !DISPLAY_ENUM) popup("項目の列挙 " + "" + num + "件" + "" + sort);
} else {
if (DISPLAY_TITLE_URL) {
popup(bal + opt);
} else {
popup("タイトルとURL\n" + opt);
}
}
// クリップボードにコピー
copy2cb(txt);
e.preventDefault();
}
kaisuu++;
return;
}
},
false);
return;
function elegeta(xpath, command = "") {
if (!/^\.?\/\//.test(xpath)) return document.querySelectorAll(xpath);
var ele = document.evaluate(xpath, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
var array = [];
for (var i = 0; i < ele.snapshotLength; i++) {
// array.push( ele.snapshotItem(i));
// if(! (ele.snapshotItem(i).offsetHeight)) array.pop();
//array.push( ele.snapshotItem(i));
let e = ele.snapshotItem(i);
if (command === "" || (command == "visible" && e.offsetHeight)) array.push(e);
}
return array;
}
function eleget0(xpath, node = document) {
if (!xpath) return null;
try {
var ele = document.evaluate(xpath, node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
return ele.snapshotLength > 0 ? ele.snapshotItem(0) : "";
} catch (e) { return null; }
}
// タイトルに足す
function addtitle(url, txt1, xpath, optionxpath = "", optionReplaceRE = /$^/, separator = " - ") {
if (!url.test(location.href)) return;
var ele = eleget0(xpath);
if (!ele) return;
ele = ele.value || ele.innerText;
var ret = ele.trim() > "" ? ele.trim() + separator : "";
if (optionxpath && eleget0(optionxpath)) {
ret += "" + (eleget0(optionxpath).innerText.trim().replace(optionReplaceRE, "")) + " ";
}
document.title = ret + document.title;
return;
}
// クリップボードにコピー
function copy2cb(txt) {
GM.setClipboard(txt);
}
function deleteParam(cutREs, txt1) { //余計なパラメータを除去
var para = txt1.split(/[&?#]/);
var txt2 = para[0] + "?";
var j = 0;
for (var i = 1; i < para.length; i++) {
for (let reptxt of cutREs) {
para[i] = para[i].replace(new RegExp("^" + reptxt + ".*"), "");
}
if (para[i] !== "") {
txt2 += (j++ > 0 ? "&" : "") + para[i];
}
}
return txt2.replace(/\?$/, ""); //行末が?なら削除
}
function modUrl(forceLevel = 2, kaisuu = 0) {
var txt1 = location.href;
var txt2 = txt1;
if (/^https?:\/\/www\.amazon\.co\.jp\/|^https?:\/\/www\.amazon\.com\//.test(txt1) && (txt1.indexOf("/dp/product/") != -1)) // Amazonのパラメータ除去
txt2 = "https://" + document.domain + "/dp/" + txt1.substr(txt1.indexOf("/dp/product/") + 12, 10);
else if (/^https?:\/\/www\.amazon\.co\.jp\/|^https?:\/\/www\.amazon\.com\//.test(txt1) && (txt1.indexOf("/dp/") != -1)) // Amazonのパラメータ除去
txt2 = "https://" + document.domain + "/dp/" + txt1.substr(txt1.indexOf("/dp/") + 4, 10);
if (/^https?:\/\/www\.amazon\.co\.jp\/|^https?:\/\/www\.amazon\.com\//.test(txt1) && (txt1.indexOf("/ASIN/") != -1)) // Amazonのパラメータ除去
txt2 = "https://www.amazon.co.jp/dp/" + txt1.substr(txt1.indexOf("/ASIN/") + 6, 10);
if (/^https?:\/\/www\.amazon\.co\.jp\/|^https?:\/\/www\.amazon\.com\//.test(txt1) && (txt1.indexOf("/gp/product/") != -1)) // Amazonのパラメータ除去
txt2 = "https://www.amazon.co.jp/dp/" + txt1.substr(txt1.indexOf("/gp/product/") + 12, 10);
if (/^https?:\/\/www\.amazon\.co\.jp\/gp\/customer-reviews\//.test(txt1)) // Amazonのカスタマーレビューのパラメータ除去
txt2 = deleteParam(["ref=", "ie=", "ASIN="], txt1).replace(/\/ref=.*/, "");
txt1 = txt1.replace(/(^https?:\/\/www\.amazon\.co\.jp\/)(.*)(product-reviews\/)/, "$1$3");
if (txt1.match(/^https?:\/\/www\.amazon\.co\.jp\/.*product-reviews\//)) // Amazonのカスタマーレビューのパラメータ除去
txt2 = deleteParam(["ref=", "ie=", "ASIN="], txt1).replace(/\/ref=.*/, "");
if (/^https?:\/\/www\.google\.co\.jp\/search\?|^https?:\/\/www\.google\.com\/search\?/.test(txt1)) // google検索結果のパラメータ除去
txt2 = deleteParam(["ei=", "oq=", "gs_l=", "hl=", "source=", "sa=", "ved=", "biw=", "bih=", "dpr=", "ie=", "oe=", "client=", "aqs=", "sourceid=", "btgG=", "gs_lcp=", "sclient=", "uact=", "iflsig=", "ictx=", "fir=", "vet=", "usg=", "imgrc="], txt1);
if (/^https?:\/\/books\.google\.co\.jp\/books\?/.test(txt1)) // Googleブックス検索のパラメータ除去
txt2 = deleteParam(["souce=", "ots=", "sig=", "hl=", "sa=", "ved=", "f=", "lpg=", "dq=", "source=", "f=", "v=", kaisuu % 2 == 0 ? "$^" : "q="], txt1); // q=を残すと検索ワードは残る
if (/^https?:\/\/www\.ted\.com\/talks/.test(txt1)) // TEDのパラメータ除去
txt2 = deleteParam(["awesm=", "utm_medium=", "share=", "utm_source=", "utm_campaign=", "utm_content=", "source=", "embed=", "t-", "frm_id=", "device_id=", "fb_action_ids=", "action_type_map=", "action_object_map=", "fb_source=", "fb_action_types", "action_ref_map=", "ref=", "refid=", "_ft_=", "guid="], txt1);
if (/^https?:\/\/translate\.google\.com\/translate|^https?:\/\/translate\.googleusercontent\.com\/translate_c/.test(txt2)) { // google翻訳のパラメータ除去
txt2 = (txt2.match(/^https?:\/\/translate\.google\.com\/translate|^https?:\/\/translate\.googleusercontent\.com\/translate_c/)[0] + txt2.match(/[\?&]u=[^&]*/)).replace(/&/, "?");
}
if (/^https?:\/\/www\.nicovideo\.jp\//.test(txt1)) {
txt2 = deleteParam(["ref=", "ss_id=", "cmnhd_ref="], txt2); // ニコ動のパラメータ除去
if (forceLevel >= 2) txt2 = deleteParam(["playlist="], txt2); // ニコ動のパラメータ除去
if (kaisuu % 2 == 0) txt2 = deleteParam(["ss_pos=", "continuous=", "sort=", "order="], txt2); // ニコ動のパラメータ除去
}
if (/^https?:\/\/seiga\.nicovideo\.jp\//.test(txt1)) txt2 = deleteParam(["ref=", "cmnhd_ref=", "track="], txt2); // ニコ動のパラメータ除去
if (/^https?:\/\/www\.ebay\.com\/itm\/.*\?hash=/.test(txt1)) txt2 = txt1.replace(/\?hash=.*$/, ""); // eBayのパラメータ除去
if (/^https?:\/\/ja.aliexpress.com\/item\/.*?.html\?spm=/.test(txt1)) txt2 = txt1.replace(/\?spm=.*$/, ""); // AliExpressのパラメータ除去
if (/^https?:\/\/www.mercari.com\/jp\/items\/m51992587701\/\?_s=/.test(txt1)) txt2 = txt1.replace(/\/\?_s=.*$/, ""); // メルカリのパラメータ除去
if (/^https?:\/\/www.reddit.com\/r\/.*\?sort=confidence/.test(txt1)) txt2 = txt1.replace(/\?sort=confidence/, ""); // redditのパラメータ除去
if (/^https?:\/\/www.pinterest.jp\/search\/pins\/\?q=/.test(txt1)) txt2 = txt1.replace(/\&rs=typed.*$/, ""); // pinterestのパラメータ除去
if (/^https:\/\/www\.ebay\.com\/itm\//.test(txt1)) txt2 = txt1.replace(/\?.*$/, ""); // eBayのパラメータ除去
if (/^https:\/\/onlinelibrary\.wiley\.com\/doi\/full\//.test(txt1)) txt2 = txt1.replace(/\?casa_token=.*$/, ""); // ollのパラメータ除去
if (/^https:\/\/www\.tiktok\.com\//.test(txt1)) txt2 = txt1.replace(/\?referer_url=.*$/, ""); // tiktokのパラメータ除去
//if (/^https:\/\/www.uniqlo.com\/jp\/ja\/products\//.test(txt1)) txt2 = txt1.replace(/\?.*$/, ""); // ユニクロオンラインストアのパラメータ除去
return txt2;
}
function tryReplace(str, re, title) {
try {
str = str.replace(RegExp(re, "gm"), "");
} catch (e) { alert(title + ":\n文法エラーのようです\n\n設定値:\n" + re); }
return str;
}
function pref(name, store = undefined) { // pref(name,data)で書き込み(数値でも文字列でも配列でもオブジェクトでも可)、pref(name)で読み出し
var domain = (location.href.match(/^https?:\/{2,}(.*?)(?:\/|\?|#|$)/)[1] || location.href);
if (store === undefined) { // 読み出し
let data = GM_getValue(domain + " ::: " + name)
if (data == undefined) return store; // 値がないなら終わり
if (data.substr(0, 1) === "[") { // 配列なのでJSONで返す
try { return JSON.parse(data || '[]'); } catch (e) {
console.log("データベースがバグってるのでクリアします\n" + e);
pref(name, []);
return;
}
} else return data;
}
if (store === "" || store === [] || store === null) { // 書き込み、削除
GM_deleteValue(domain + " ::: " + name);
return store;
} else if (typeof store === "string") { // 書き込み、文字列
GM_setValue(domain + " ::: " + name, store);
return store;
} else { // 書き込み、配列
try { GM_setValue(domain + " ::: " + name, JSON.stringify(store)); } catch (e) {
console.log("データベースがバグってるのでクリアします\n" + e);
pref(name, "");
}
return store;
}
}
function popup(text) {
var e = document.getElementById("cccbox");
if (e) { e.remove(); }
if (mllID) { clearTimeout(mllID); }
var ele = document.body.appendChild(document.createElement("span"));
text = text.replace(/&/g, "&").replace(/"/g, """).replace(/'/g, "'").replace(/`/g, '`').replace(/</g, "<").replace(/>/g, ">").replace(/\n/gm, "<br>")
let bgcolor = /www\.translatetheweb\.com|\.translate\.goog\/|translate\.google\.com|\/embed\//gmi.test(location.href + " " + text) ? "#d06050" : "#6080ff";
ele.innerHTML = `<span id="cccbox" title="クリックでこれを再度コピー" style="all:initial; ${text.match(/<br>/gmi)&&text.match(/<br>/gmi).length>5?"max-width:50%;":""} word-break:break-all; position: fixed; right:0em; top:0em; z-index:2147483647; opacity:1; font-size:15px; font-weight:bold; margin:0px 1px; text-decoration:none !important; text-align:none; padding:1px 6px 1px 6px; border-radius:12px; background-color:${bgcolor }; color:white; ">${text}</span>`;
mllID = setTimeout(function() { var ele = document.getElementById("cccbox"); if (ele) ele.remove(); }, 5000);
ele.onclick = () => { copy2cb(ele.innerText + "\r\n"); var e = document.getElementById("cccbox"); if (e) { e.remove(); } if (mllID) { clearTimeout(mllID); } }
}
})();