aboutsummaryrefslogtreecommitdiff
path: root/yomichan-user/conf.d
diff options
context:
space:
mode:
authorlonkaars <loek@pipeframe.xyz>2023-01-29 22:29:48 +0100
committerlonkaars <loek@pipeframe.xyz>2023-01-29 22:29:48 +0100
commit97b6e373ba2f654dadd9c299c09098879de964fc (patch)
treee0af41a66b133470394e34085dda61a21268ef1f /yomichan-user/conf.d
parent2f74b3659b3aac4bd9bccee705f1b972a5332f4d (diff)
add copy button for copying word to custom card template
Diffstat (limited to 'yomichan-user/conf.d')
-rw-r--r--yomichan-user/conf.d/lib.js44
-rw-r--r--yomichan-user/conf.d/sentence-export.js38
-rw-r--r--yomichan-user/conf.d/word-export.css2
-rw-r--r--yomichan-user/conf.d/word-export.css.m42
-rw-r--r--yomichan-user/conf.d/word-export.js68
5 files changed, 119 insertions, 35 deletions
diff --git a/yomichan-user/conf.d/lib.js b/yomichan-user/conf.d/lib.js
new file mode 100644
index 0000000..6cb231e
--- /dev/null
+++ b/yomichan-user/conf.d/lib.js
@@ -0,0 +1,44 @@
+async function getClipboardSettings() {
+ return (await yomichan.api.getSettings([{
+ scope: "profile",
+ optionsContext: { current: true },
+ path: 'clipboard'
+ }]))[0].result;
+}
+
+async function setClipboardSettings(settings) {
+ await yomichan.api.modifySettings([{
+ scope: "profile",
+ optionsContext: { current: true },
+ path: 'clipboard',
+ action: 'set',
+ value: settings
+ }]);
+}
+
+async function escapeYomichanCopy(text) {
+ var userClipboardSettings = await getClipboardSettings();
+ var tempSettings = {
+ enableBackgroundMonitor: false,
+ enableSearchPageMonitor: false,
+ autoSearchContent: false,
+ maximumSearchLength: userClipboardSettings.maximumSearchLength,
+ };
+ await setClipboardSettings(tempSettings);
+
+ navigator.clipboard.writeText(text);
+
+ // execute on next JS event loop
+ setTimeout(async () => await setClipboardSettings(userClipboardSettings), 0);
+}
+
+function rubyHelper(element, reading) {
+ var out = "";
+ for (var child of element.childNodes) {
+ if (reading && child.nodeName != "RT") continue;
+ if (!reading && child.nodeName == "RT") continue;
+ out += child.innerText;
+ }
+ return out;
+}
+
diff --git a/yomichan-user/conf.d/sentence-export.js b/yomichan-user/conf.d/sentence-export.js
index f15d890..176cdcd 100644
--- a/yomichan-user/conf.d/sentence-export.js
+++ b/yomichan-user/conf.d/sentence-export.js
@@ -1,21 +1,3 @@
-async function getClipboardSettings() {
- return (await yomichan.api.getSettings([{
- scope: "profile",
- optionsContext: { current: true },
- path: 'clipboard'
- }]))[0].result;
-}
-
-async function setClipboardSettings(settings) {
- await yomichan.api.modifySettings([{
- scope: "profile",
- optionsContext: { current: true },
- path: 'clipboard',
- action: 'set',
- value: settings
- }]);
-}
-
async function exportSentence() {
var inputHTML = document.getElementById("query-parser-content");
var output = "";
@@ -42,19 +24,7 @@ async function exportSentence() {
}
}
- var userClipboardSettings = await getClipboardSettings();
- var tempSettings = {
- enableBackgroundMonitor: false,
- enableSearchPageMonitor: false,
- autoSearchContent: false,
- maximumSearchLength: userClipboardSettings.maximumSearchLength,
- };
- await setClipboardSettings(tempSettings);
-
- navigator.clipboard.writeText(output);
-
- // execute on next JS event loop
- setTimeout(async () => await setClipboardSettings(userClipboardSettings), 0);
+ escapeYomichanCopy(output);
return output;
}
@@ -72,13 +42,11 @@ function patchSearchBar() {
searchBarOuter.insertBefore(button, searchBarOuter.childNodes[2]);
}
-function run() {
+(() => {
if (document.body.classList.contains("patched")) return;
patchSearchBar();
document.body.classList.add("patched");
-}
-
-run();
+})();
diff --git a/yomichan-user/conf.d/word-export.css b/yomichan-user/conf.d/word-export.css
new file mode 100644
index 0000000..0ae2eea
--- /dev/null
+++ b/yomichan-user/conf.d/word-export.css
@@ -0,0 +1,2 @@
+.icon[data-icon=copy-bmp] { --icon-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzFfMjE4KSI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMV8xXzIxOCkiPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTEyIDRIN1Y3VjE1SDEySDE1VjdIMTJWNFpNMTMgNUgxNFY2SDEzVjVaIiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfMV8yMTgpIi8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNNyAzSDEySDEzVjRIMTRWNUgxNVY2SDE2VjdWMTVWMTZIMTVMNyAxNkg2VjE1VjRWM0g3Wk03IDE1VjRIMTJWNlY3SDEzSDE1VjE1SDdaTTE0IDVIMTNMMTMgNkgxNFY1WiIgZmlsbD0iYmxhY2siLz4KPC9nPgo8ZyBvcGFjaXR5PSIwLjUiIGNsaXAtcGF0aD0idXJsKCNjbGlwMl8xXzIxOCkiPgo8cGF0aCBkPSJNMyAxVjExSDJWMTNIMVYxNUg5VjE0SDExVjEzSDEyVjEySDEzVjVIMTJWNEgxMVYzSDEwVjJIOVYxSDNaIiBmaWxsPSJibGFjayIvPgo8L2c+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwM18xXzIxOCkiPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTcgMUgzVjVIMlYxMUgxVjEzSDNINEg3VjExSDExVjVIN1YxWk05IDJIOFYzVjRIOUgxMFYzSDlWMloiIGZpbGw9InVybCgjcGFpbnQxX2xpbmVhcl8xXzIxOCkiLz4KPHBhdGggZD0iTTEwIDEwSDZWMTNIMTBWMTBaIiBmaWxsPSJ1cmwoI3BhaW50Ml9saW5lYXJfMV8yMTgpIi8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNNyAwSDNIMlYxVjEwSDNWMUg3VjRWNUg4SDExVjEwSDEwVjEySDExVjExSDEyVjVWNEgxMVYzSDEwVjRIOEw4IDJIOVYxSDhWMEg3Wk05IDJIMTBWM0g5VjJaTTggMTNWMTJIMTBWMTNIOFpNOCAxM1YxNEg0VjEzSDhaTTEgMTJIMlYxMEgxVjEyWk0xIDEySDBWMTRIMVYxMloiIGZpbGw9InVybCgjcGFpbnQzX2xpbmVhcl8xXzIxOCkiLz4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik03IDlIOFYxMEg3VjExVjEySDZWMTNINVYxNEgxVjEzSDRWMTJINVYxMUg2VjEwVjlIN1pNOCAxMEgxMFYxMUg4VjEwWiIgZmlsbD0iIzA2MDcwQSIvPgo8cmVjdCB4PSI0IiB5PSIyIiB3aWR0aD0iMyIgaGVpZ2h0PSIxIiBmaWxsPSIjMDYwNzBBIi8+CjxyZWN0IHg9IjQiIHk9IjQiIHdpZHRoPSIzIiBoZWlnaHQ9IjEiIGZpbGw9IiMwNjA3MEEiLz4KPHJlY3QgeD0iNCIgeT0iNiIgd2lkdGg9IjUiIGhlaWdodD0iMSIgZmlsbD0iIzA2MDcwQSIvPgo8L2c+CjwvZz4KPGRlZnM+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhcl8xXzIxOCIgeDE9IjExIiB5MT0iNCIgeDI9IjExIiB5Mj0iMTUiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iIzdCODE4RCIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiM0ODRBNTgiLz4KPC9saW5lYXJHcmFkaWVudD4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDFfbGluZWFyXzFfMjE4IiB4MT0iNiIgeTE9IjEiIHgyPSI2IiB5Mj0iMTMiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iI0NDRDFGOSIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNCMkI0QkUiLz4KPC9saW5lYXJHcmFkaWVudD4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDJfbGluZWFyXzFfMjE4IiB4MT0iOCIgeTE9IjEwIiB4Mj0iOCIgeTI9IjEzIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiM3QTgwOEMiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjNEE0QzVBIi8+CjwvbGluZWFyR3JhZGllbnQ+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQzX2xpbmVhcl8xXzIxOCIgeDE9IjYiIHkxPSIwIiB4Mj0iNiIgeTI9IjE0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiM5ODlDQjciLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjNUM1QzVDIi8+CjwvbGluZWFyR3JhZGllbnQ+CjxjbGlwUGF0aCBpZD0iY2xpcDBfMV8yMTgiPgo8cmVjdCB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIGZpbGw9IndoaXRlIi8+CjwvY2xpcFBhdGg+CjxjbGlwUGF0aCBpZD0iY2xpcDFfMV8yMTgiPgo8cmVjdCB3aWR0aD0iMTAiIGhlaWdodD0iMTMiIGZpbGw9IndoaXRlIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg2IDMpIi8+CjwvY2xpcFBhdGg+CjxjbGlwUGF0aCBpZD0iY2xpcDJfMV8yMTgiPgo8cmVjdCB3aWR0aD0iMTIiIGhlaWdodD0iMTQiIGZpbGw9IndoaXRlIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxIDEpIi8+CjwvY2xpcFBhdGg+CjxjbGlwUGF0aCBpZD0iY2xpcDNfMV8yMTgiPgo8cmVjdCB3aWR0aD0iMTIiIGhlaWdodD0iMTQiIGZpbGw9IndoaXRlIi8+CjwvY2xpcFBhdGg+CjwvZGVmcz4KPC9zdmc+Cg==); }
+button.action-button[hidden] { display: none; }
diff --git a/yomichan-user/conf.d/word-export.css.m4 b/yomichan-user/conf.d/word-export.css.m4
new file mode 100644
index 0000000..b4bd026
--- /dev/null
+++ b/yomichan-user/conf.d/word-export.css.m4
@@ -0,0 +1,2 @@
+.icon[data-icon=copy-bmp] { --icon-image: url`(data:image/svg+xml;base64,'undivert(copy-bitmap.svg.b64)`)'; }
+button.action-button[hidden] { display: none; }
diff --git a/yomichan-user/conf.d/word-export.js b/yomichan-user/conf.d/word-export.js
new file mode 100644
index 0000000..fce1b48
--- /dev/null
+++ b/yomichan-user/conf.d/word-export.js
@@ -0,0 +1,68 @@
+function exportWord() {
+ var entry = this.parentNode.parentNode.parentNode;
+ var wordElement = entry.getElementsByClassName("headword-term")[0];
+ var hasKanji = false;
+
+ function addWord(reading) {
+ var out = "";
+ for (var child of wordElement.childNodes) {
+ if (child.nodeName == "#text") out += child.textContent;
+ if (child.nodeName == "RUBY") {
+ hasKanji = true;
+ if (reading && out.length != 0) out += "\u30fb";
+ out += rubyHelper(child, reading);
+ }
+ }
+ return out;
+ }
+ var kanji = addWord(false);
+ var reading = addWord(true)
+ var result = `${kanji}`
+ if (hasKanji) result += `\u3010${reading}\u3011`;
+ else result += " ";
+
+ var tags = [];
+
+ var pitchAccent = "";
+ for (var tag of entry.getElementsByClassName("pronunciation-downstep-notation-number")) {
+ pitchAccent = tag.innerText.trim()
+ break;
+ }
+ if (pitchAccent) tags.push(`[${pitchAccent}]`);
+
+ var usuallyKana = false;
+ for (var tag of entry.getElementsByClassName("tag-label-content"))
+ if (tag.innerText.trim() == "uk")
+ usuallyKana = true;
+ if (usuallyKana) tags.push("(uk)");
+
+ result += tags.join(" ");
+
+ escapeYomichanCopy(result);
+}
+
+function addWordCopyButtons() {
+ var definitions = document.getElementById("dictionary-entries").getElementsByClassName("entry");
+ for (var definition of definitions) {
+ var actions = definition.getElementsByClassName("actions")[0];
+
+ var button = document.createElement("button");
+ button.classList.add("action-button");
+ button.onclick = exportWord;
+ var icon = document.createElement("span");
+ icon.classList.add("icon");
+ icon.classList.add("color-icon");
+ icon.classList.add("action-icon");
+ icon.setAttribute("data-icon", "copy-bmp");
+ button.appendChild(icon);
+ actions.insertBefore(button, actions.childNodes[0]);
+ }
+}
+
+(() => {
+ window.addEventListener("message", ev => {
+ // gets fired on search results render complete
+ if (ev.data.action == "renderMulti.response")
+ addWordCopyButtons();
+ });
+})();