// ==UserScript==
// @name Bunpro: Example Sentence Audio
// @namespace http://tampermonkey.net/
// @version 0.1.6
// @description Adds Google Translate audio to all the sentences that do not yet have audio.
// @author Kumirei
// @include *bunpro.jp/*
// @exclude *community.bunpro.jp*
// @require https://greasyfork.org/scripts/432418-wait-for-selector/code/Wait%20For%20Selector.js?version=974318
// @grant none
// @downloadURL none
// ==/UserScript==
(function($, wfs) {
// Need to remove the referrer; otherwise returns 404s
var remRef = document.createElement('meta');
remRef.name = 'referrer';
remRef.content = 'same-origin';
document.querySelector('head').append(remRef);
// CSS stuff
$('head').append('');
// The player element
var first = "
";
// Detect context sentences
wfs.wait('.japanese-example-sentence', function(e) {
// Do nothing if there is already audio provided
if (e[0].nextElementSibling.className != "audio-holder" || e[0].nextElementSibling.innerText.includes('coming soon')) {
// Get sentence in plain text and add the player
var sentence = parseSentence(e[0]);
e.after(first + sentence + last);
}
});
// Extract the sentence from the element
function parseSentence(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 url
//sentence += elem.children[0].children[1].innerText; // with kana in url
}
else {
sentence += elem.innerText;
}
}
else if (name == "RUBY") {
sentence += elem.childNodes[0].data; // with kanji in url
//sentence += elem.children[1].innerText; // with kana in url
}
});
return sentence;
}
})(window.jQuery, window.wfs);