Add audio file link of dictionary pages
// ==UserScript== // @name Dictionary audio link revealer // @name:zh-TW 網路字典發音下載 // @namespace https://github.com/solomonhuang/dictionary-audio-link-revealer // @version 0.20220112.0 // @description Add audio file link of dictionary pages // @description:zh-TW 在網路字典的發音按鈕旁邊新增聲音檔下載。 // @author Solomon Huang // @license MIT // @match https://dictionary.cambridge.org/* // @match https://tw.dictionary.search.yahoo.com/* // @match https://www.oxfordlearnersdictionaries.com/definition/* // @match https://www.dictionary.com/browse/* // @grant none // @supportURL https://github.com/solomonhuang/dictionary-audio-link-revealer/issues // ==/UserScript== (function() { 'use strict'; var currentDict = location.hostname function createICON(fontSZ) { let icon = document.createElementNS('http://www.w3.org/2000/svg','svg') // SVG icon alighment style // Elliot Dahl ( https://twitter.com/Elliotdahl ) // https://blog.prototypr.io/align-svg-icons-to-text-and-say-goodbye-to-font-icons-d44b3d7b26b4 icon.setAttribute('style','height:1em;width:1em;top: .125em;position: relative;display: inline-flex;align-self: center;') icon.setAttribute('width', '24') icon.setAttribute('height', '24') icon.setAttribute('stroke-width', '1.5') icon.setAttribute('stroke-width', '1.5') icon.setAttribute('viewBox', '0 0 24 24') icon.setAttribute('fill', 'none') let p3 = document.createElementNS('http://www.w3.org/2000/svg','path') p3.setAttribute('d', 'M12 22C17.5228 22 22 17.5228 22 12C22 6.47715 17.5228 2 12 2C6.47715 2 2 6.47715 2 12C2 17.5228 6.47715 22 12 22Z') p3.setAttribute('stroke', 'green') p3.setAttribute('stroke-linecap', 'round') p3.setAttribute('stroke-linejoin', 'round') p3.setAttribute('fill', 'yellow') icon.appendChild(p3) let p1 = document.createElementNS('http://www.w3.org/2000/svg','path') p1.setAttribute('d', 'M9 17L15 17') p1.setAttribute('stroke', 'green') p1.setAttribute('stroke-linecap', 'round') p1.setAttribute('stroke-linejoin', 'round') icon.appendChild(p1) let p2 = document.createElementNS('http://www.w3.org/2000/svg','path') p2.setAttribute('d', 'M12 6V13M12 13L15.5 9.5M12 13L8.5 9.5') p2.setAttribute('stroke', 'green') p2.setAttribute('stroke-linecap', 'round') p2.setAttribute('stroke-linejoin', 'round') icon.appendChild(p2) return icon } function createLink(src) { let link = document.createElement('a') link.href = src link.style = 'text-decoration:none' return link } function appendICON(el, src) { let fontSZ = parseFloat(getComputedStyle(el).fontSize) let link = createLink(src) link.appendChild(createICON(fontSZ)) el.append(link) } setTimeout(() => { /* all dictionary sites begin here */ if (/dictionary\.cambridge\.org/.test(currentDict)) { let daud = document.querySelectorAll('.daud') for (var i = 0; i < daud.length; i++) { let a = daud[i].getElementsByTagName('audio') let src = a[0].children[0].src appendICON(daud[i].children[1], src) } } if (/tw\.dictionary\.search\.yahoo\.com/.test(currentDict)) { let dict_sound = document.querySelectorAll('.dict-sound') // TODO: fix with MutationObserver // https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver for (let i = 0; i < dict_sound.length; i++) { let src = dict_sound[i].children[0].src appendICON(dict_sound[i].parentElement, src) } } if (/www\.oxfordlearnersdictionaries\.com/.test(currentDict)) { let icon_audio = document.querySelectorAll('.icon-audio') for (let i = 0; i < icon_audio.length; i++) { let src = icon_audio[i].attributes["data-src-mp3"].value appendICON(icon_audio[i].parentElement, src) } } if (/www\.dictionary\.com/.test(currentDict)) { let audio_wrapper = document.querySelectorAll('.audio-wrapper') for (let i = 0; i < audio_wrapper.length; i++) { let src = audio_wrapper[i].children[1].children[1].src appendICON(audio_wrapper[i], src) } } /* all dictionary sites end here */ }, 500) })();