NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name Lernu English HTML5 Audio // @namespace http://www.ontbee.com/gmscripts // @description Alter en.lernu.net to use HTML5 sound instead of Flash // @license MIT // @version 0.1 // @include http://en.lernu.net/* // @grant none // @noframes // ==/UserScript== // This script finds 'click to play this sound' links and changes the // onclick function to use a HTML5 Audio object instead of their // flash player. // // An example of a link is: // <a href="javascript:void(0);" onclick="sendiAlFlash('/sonoj/prononcoj/alfabeto/a.mp3');" class="SuperBibl LARGHO 20" title="Listen to the sound with the sound player.">A</a> // // We first grab all elements of that class. The 'click to download' // links have the same class though so we then filter based on the // 'enhavo' property. For some reason the title for all these // elements is '' in javascript but the enhavo property has the title. // // Once we have all the click-to-play links, we get the sound file // URL for each link and set its onclick function to play that URL. var SOUND_LINK_CLASS_NAME = 'SuperBibl LARGHO 20'; var PLAY_LINK_ENHAVO = 'Listen to the sound with the sound player.'; var SOUND_LINK_RE = /sendiAlFlash\((?:'(.+\.mp3)'|"(.+\.mp3)")/; // For some reason calling [].filter.call(arr, etc.) gives an error: // this.each is not a function. So we have to write our own filter. function filterArray(arr, condFunc) { var results = []; // arr won't be an array in this script, but an array-like object, // so we can't just call arr.forEach. Array.prototype.forEach.call(arr, function(element) { if (condFunc(element)) { results.push(element); } }); return results; } function getSoundLinks() { var links = document.getElementsByClassName(SOUND_LINK_CLASS_NAME); return filterArray(links, function(link) { return link.enhavo === PLAY_LINK_ENHAVO; }); } function getSoundUrl(link) { var onclickText = link.onclick.toString(); return SOUND_LINK_RE.exec(onclickText)[1]; } function buildPlayFunc(url) { var audio = new Audio(url); return function() { audio.pause(); audio.currentTime = 0; audio.play(); }; } function fixLinks() { getSoundLinks().forEach(function(link) { link.onclick = buildPlayFunc(getSoundUrl(link)); }); } window.addEventListener('load', function() { fixLinks(); });