-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtwins-insert-article-url-button.user.js
113 lines (99 loc) · 3.81 KB
/
twins-insert-article-url-button.user.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
// ==UserScript==
// @name 筑波大学のtwinsに「記事リンク」ボタンを追加するスクリプト
// @namespace https://github.com/shuuji3/userscript-twins-insert-article-url-button
// @version 0.2
// @description 📋 筑波大学のtwinsに「個別のお知らせページを開くボタン」と「他人と共有できるURLをコピーするボタン」を追加します。
// @author TAKAHASHI Shuuji <[email protected]>
// @match https://twins.tsukuba.ac.jp/campusweb/*
// @grant none
// ==/UserScript==
(async function() {
'use strict';
// const
const buttonStyle = 'padding: 0.5rem 0.75rem; margin: 0.5rem; margin-right: 0; background: #e6ee9c /* material light green */; border: none; border-radius: 0.25rem; cursor: pointer;';
const articleIframeID = '#main-frame-if';
/**
* sleepのPromiseを生成する関数
*/
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
/**
* ニュース記事へのURLを取得します。
* 記事名をクリックしたときに初めてiframeが非同期に読み込まれるため、pollingを行っています。
*/
async function getArticleURL() {
let buttonInserted = false;
while (!buttonInserted) {
const iframe = document.querySelector(articleIframeID);
if (iframe == null || iframe.src == '') {
await sleep(100);
continue
}
return iframe.src;
}
}
/**
* 単独の記事へのURLが設定された「記事リンク」ボタンを追加します。
* ボタンをクリックして遷移するとURLは書き換えられてしまうため、URLを取得したい場合はクリップボードにコピーするボタンを使用します。
*/
function createLinkButton(url) {
const a = document.createElement('a');
a.href = url;
a.target = '_blank';
a.rel = 'noopener noreferrer';
a.classList.add('tabcell');
const button = document.createElement('button');
button.textContent = '記事リンク';
button.style = buttonStyle;
a.appendChild(button);
return a;
}
/**
* 記事のURLをクリップボードにコピーするボタンを追加します。
*/
function createCopyButton(url) {
const button = document.createElement('button');
button.classList.add('btn');
button.textContent = '📋';
button.alt = 'Copy URL'
button.title = 'Copy URL'
button.style = buttonStyle;
button.dataset.clipboardText = url;
return button
}
function isClipboardJSLoaded() {
try {
// Before loaded clipboard.js, instantiate Clipboard should be failed.
new Clipboard();
} catch (e) {
if (e.name === 'TypeError') {
return false;
}
}
return true;
}
/**
* clipboard.jsを読み込んで初期化します。
*/
async function initClipboardJS() {
const script = document.createElement('script');
script.src = 'https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/1.4.0/clipboard.min.js';
document.body.appendChild(script);
while (!isClipboardJSLoaded()) {
await sleep(100);
}
new Clipboard('.btn');
}
// main
async function main() {
const url = await getArticleURL();
const linkButton = createLinkButton(url);
const copyButton = createCopyButton(url);
const target = document.querySelector(articleIframeID);
target.parentNode.insertBefore(linkButton, target);
target.parentNode.insertBefore(copyButton, target);
initClipboardJS();
}
await main();
})();