// ==UserScript== // @name Youdao Dictionary Enhancer // @namespace http://tampermonkey.net/ // @homepage https://github.com/creamidea/YoudaoDictionaryEnhancer // @version 1.1.6 // @description Search words in Celerity // @author creamidea // @match http://*.youdao.com/* // @require http://cdn.bootcss.com/nprogress/0.2.0/nprogress.min.js // @resource nprogress_css http://cdn.bootcss.com/nprogress/0.2.0/nprogress.min.css // @resource etymoline_css http://www.etymonline.com/style.css // @resource etymoline_font http://fonts.googleapis.com/css?family=Slabo+27px:400&lang=en // @grant GM_setValue // @grant GM_getValue // @grant GM_addStyle // @grant GM_getResourceText // @grant GM_xmlhttpRequest // @connect www.etymonline.com // @downloadURL none // ==/UserScript== // changelog: // version 1.1 add translation function in etymoline area // version 1.0 initial release GM_addStyle (GM_getResourceText("nprogress_css")); GM_addStyle (".youdao-trans-icon {position: absolute;border-radius: 5px;padding: 3px; background-color: rgb(245, 245, 245);box-sizing: content-box;cursor: pointer;height: 18px;width: 18px;z-index: 2147483647;border: 1px solid rgb(220, 220, 220);color: rgb(51, 51, 51);}"); GM_addStyle (".etymoline .hint {text-align: center;font-size: 24px;margin: 24px 0;color: rebeccapurple;}"); (function() { 'use strict'; if (NProgress === undefined) NProgress = { set: function (){}, start: function (){}, inc: function (){}, done: function (){}, configure: function (){}, }; var ETYMONLINEHTTP = 'http://www.etymonline.com'; var YOUDAOHTTP = $(location).attr('protocol')+'//'+$(location).attr('hostname'); var $scontainer = $('#scontainer'); var $query = $('#query'); var $topImgAd = $('#topImgAd'); var $webTrans = $('#webTrans'); var injectEtymolineName = 'creamidea' + makeId(9); // make the name of injecting function is unique var openURLFunName = 'openurl' + makeId(9); var proxySelection = 'proxySelection' + makeId(9); var sltContainerName = 'selectionContainer' + makeId(9); var youdaoSearchButtonId = 'youdaoSearchButton' + makeId(9); // window global function. It is the callback in the iframe window[injectEtymolineName] = function (event) { // open the next page in the etymoline.com iframe event.preventDefault(); var target = event.target; request(ETYMONLINEHTTP+target.attributes.href.value); }; window[openURLFunName] = function (event) { event.preventDefault(); location.href = event.target.attributes.href.value; }; window[proxySelection] = function (event) { var sel = window.getSelection(); var range = document.createRange(); var targetSel = this.getSelection(); var $sltContainer = $('#'+sltContainerName); var selectionText = encodeURIComponent(targetSel.toString()); var $youdaoSearchButton = $('#'+youdaoSearchButtonId); if ($sltContainer.length === 0) $sltContainer = $('
').appendTo('body'); if ($youdaoSearchButton.length === 0) $youdaoSearchButton = $(''+transformToggle[index]+'
').next().css({marginTop: "8px"}); $clone.appendTo('#ads'); });//.end().parent().remove(); $('#doc>.c-topbar-wrapper').css({height: "81px", top: "-42px"}).find('.c-subtopbar').remove(); $scontainer.css({marginTop: "42px"}); function request (url) { NProgress.start(); var xhr = new GM_xmlhttpRequest({ method: 'GET', url: url, // anonymous: true, onreadystatechange: onreadystatechange, }); } function onreadystatechange (resp) { var readyState = resp.readyState; if (readyState === 0) { // Client has been created. open() not called yet. } else if (readyState === 1) { // open() has been called. } else if (readyState === 2) { // send() has been called, and headers and status are available. } else if (readyState === 3) { // Downloading; responseText holds partial data. } else if (readyState === 4) { switch(resp.status) { case 200: etymolineHandler(resp.responseText); break; default: GM_log(['Ger Error: ', '\nState: ', resp.readyState, '\nMessage: ', resp.responseText].join('')); } NProgress.done(); } } function etymolineHandler (responseText) { var domParser = new DOMParser(); var doc = domParser.parseFromString(responseText, 'text/html'); var $dictionary = doc.querySelector('#dictionary'); $dictionary.style.border = 0; $dictionary.style.marginBottom = 0; var $frame = $('#'+injectEtymolineName); if ($frame.length === 0) { $frame = $('').css({border:0, width: '100%', maxHeight: '600px'}); $frameWrapper.append($frame); $frameWrapper.find('.hint').remove(); // remove the hint. $frame.contents().find("head") .append('') .append('') .append(''); // $frame.contents().on('selectionchange', function () {debugger}); $frame.contents() .on('selectionchange', parent[proxySelection]) .on('mousemove', function (event) { $frame.data('click-x', $frame.offset().left + event.pageX); $frame.data('click-y', $frame.offset().top + event.pageY - 30); }); } $frame.contents().find("body") .html($dictionary) .append(''); // Some fix $frame.ready(function () { $frame.css({height: $frame.contents().find("html").height() }); $frame.contents().find("body img").map(function (index, img) { // the resource path of dictionary png img.src = ETYMONLINEHTTP+'/graphics/dictionary.gif'; return img; }); $frame.contents().find("body a.dictionary").map(function (index, link) { // click the png link.target = '_blank'; return link; }); $frame.contents().find("body #dictionary dl a").not('.dictionary').map(function (index, link) { // click the word // link.onclick = parent[injectEtymolineName]; var oLink = new URL(link.href); var term = oLink.search.slice(1).split('&').map(function(v){var _v = v.split('=');return {key: _v[0], value: _v[1]};}).filter(function(v){if(v.key==='term')return v;})[0]; link.href = YOUDAOHTTP+'/w/'+term.value+'/'; link.onclick = parent[openURLFunName]; //link.href = link.href.replace(new RegExp(YOUDAOHTTP), ETYMONLINEHTTP); //link.target = '_blank'; // link.href = 'javascript:void(0);'; // link.style.cursor = 'default'; return link; }); $frame.contents().find("body .paging a").map(function (index, link) { // The code below is just for fun :P // var oLink = new URL(link.href); // var p = oLink.search.slice(1).split('&').map(function(v){var _v = v.split('=');return {key: _v[0], value: _v[1]}}).filter(function(v){if(v.key==='p')return v;})[0].value link.onclick = parent[injectEtymolineName]; return link; }); }); } function makeId(len) { if(isNaN(parseInt(len))) len = 8; var text = ""; var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; for( var i=0; i < len; i++ ) text += possible.charAt(Math.floor(Math.random() * possible.length)); return text; } function toggleHelp () { console.log('Message for help. Comming soon...'); } })();