Greasy Fork is available in English.
Allows you to click Japanese sentences and their translations to copy them to clipboard.
当前为
// ==UserScript==
// @name Bunpro: Copy Sentences
// @namespace http://tampermonkey.net/
// @version 0.2.2
// @description Allows you to click Japanese sentences and their translations to copy them to clipboard.
// @author Kumirei
// @include https://bunpro.jp/*
// @require http://greasyfork.icu/scripts/5392-waitforkeyelements/code/WaitForKeyElements.js?version=115012
// @grant none
// ==/UserScript==
(function() {
waitForKeyElements('body', function(e) {
e.on('click', function(e) {
//reviews
if ($(e.target).closest('div')[0] == null) copyText($('div[class^="study-question-english"] > span')[0].innerText); //english in review is a special case
else if ($(e.target.closest('div'))[0].className == "study-question-japanese") copyText(parseSentence($(e.target.closest('div > span'))[0])); //japanese in reviews
//english example sentences
else if (["english-example-sentence", "example-sentence-english"].includes(e.target.className)) copyText(e.target.innerText); //while studying
else if (e.target.className == "example-sentence-english hide-english") copyText(e.target.innerText); //grammar page
else if (["english-example-sentence", "example-sentence-english"].includes(e.target.parentNode.className)) copyText(e.target.parentNode.innerText);
//japanese example sentences
else if (e.target.className == "japanese-example-sentence") copyText(parseSentence(e.target));
else if ($(e.target).closest('li')[0] != undefined && $(e.target).closest('li')[0].className == "japanese-example-sentence") copyText(parseSentence($(e.target).closest('li')[0]));
});
});
//add buttons
waitForKeyElements('#check-grammar', function(e) {
if (!$('#buttonsBar').length) {
$('#check-grammar').before('<div id="buttonsBar"><div class="flexWrapper"</div></div>');
$('head').append('<style id="ButtonBarStyle">'+
'@media (max-width: 480px) {'+
'#buttonsBar .barButton {'+
'height: 30px;'+
'font-size: 12px;'+
'}'+
'}'+
'#buttonsBar {'+
'margin-top: 2.5px;'+
'}'+
'#buttonsBar .flexWrapper {'+
'height: 40px;'+
'display: flex;'+
'flex-wrap: wrap;'+
'margin: 0 -2.5px;'+
'}'+
'#buttonsBar .barButton {'+
'flex: 1;'+
'margin: 2.5px;'+
'}'+
'#buttonsBar .barButton input {'+
'background: rgba(25,34,49,0.8);'+
'height: 100% !important;'+
'color: white;'+
'border: 0;'+
'}'+
'#buttonsBar .barButton input:hover {'+
'color: rgb(103, 114, 124);'+
'}'+
'</style>');
}
$('#buttonsBar .flexWrapper').append('<div class="barButton"><input id="copyJP" type="button" value="Copy JP" onclick="copyText(parseSentence($(\'.study-question-japanese > span\')[0]));"></div>');
$('#buttonsBar .flexWrapper').append('<div class="barButton"><input id="copyEN" type="button" value="Copy EN" onclick="copyText($(\'.study-question-english-hint > span\')[0].innerText);"></div>');
});
})();
//Extracts the sentence from the sentence element
parseSentence = function(sentenceElem) {
var sentence = "";
sentenceElem.childNodes.forEach(function(elem) {
// find the text in each kind of element and append it to the sentence string
var name = elem.nodeName;
if (name == "#text") {
sentence += elem.data;
}
else if (name == "STRONG" || name == "SPAN") {
if (name == "STRONG" && elem.children.length) {
sentence += elem.children[0].childNodes[0].data; // with kanji in string
//sentence += elem.children[0].children[1].innerText; // with kana in string
}
else {
sentence += elem.innerText;
}
}
else if (name == "RUBY") {
sentence += elem.childNodes[0].data; // with kanji in string
//sentence += elem.children[1].innerText; // with kana in string
}
});
return sentence;
}
//copies the text
copyText = function(text) {
var textArea = document.createElement("textarea");
textArea.style.position = 'fixed';
textArea.style.top = 0;
textArea.style.left = 0;
textArea.style.width = '2em';
textArea.style.height = '2em';
textArea.style.padding = 0;
textArea.style.border = 'none';
textArea.style.outline = 'none';
textArea.style.boxShadow = 'none';
textArea.style.background = 'transparent';
textArea.value = text;
document.body.appendChild(textArea);
textArea.focus();
textArea.select();
try {
var successful = document.execCommand('copy');
var msg = successful ? 'successful' : 'unsuccessful';
console.log('Copying text command was ' + msg);
console.log('Copied Sentence:', text);
} catch (err) {
console.log('Oops, unable to copy');
}
document.body.removeChild(textArea);
}