// ==UserScript== // @name Youdao Dictionary Enhancer // @namespace http://tampermonkey.net/ // @homepage https://github.com/creamidea/YoudaoDictionaryEnhancer // @version 1.2.0 // @description Search words in Celerity // @author creamidea // @match http://*.youdao.com/* // @require http://cdn.bootcss.com/jquery/3.1.0/jquery.min.js // @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 // @connect www.google.com // @downloadURL none // ==/UserScript== // changelog: // version 1.2 add record of google define // version 1.1 add translation function in etymoline area // version 1.0 initial release GM_addStyle(GM_getResourceText("nprogress_css")); GM_addStyle('body{font-famile:"Hiragino Sans GB",STHeiti,"Microsoft YaHei","Wenquanyi Micro Hei","WenQuanYi Micro Hei Mono","WenQuanYi Zen Hei","WenQuanYi Zen Hei Mono",LiGothicMed}'); 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;}'); GM_addStyle('#container{background: #f6f4ec;border-radius: 6px;box-shadow: 2px 2px 9px 1px gray;padding-left: 16px;padding-right: 16px;padding-bottom: 26px;margin-top: 16px;}'); GM_addStyle('.keyword{font-family: Georgia,"Lucida Grande","Lucida Sans Unicode","Lucida Sans",Geneva,Arial,sans-serif; font-size: 39px;border-bottom: 2px gray dotted;}'); GM_addStyle('#phrsListTab .trans-container>ul{font-size: 16px;} #phrsListTab .trans-container>ul>li{margin: 4px auto;}'); GM_addStyle('li .collinsMajorTrans{background: gainsboro !important;}'); GM_addStyle('.c-topbar-wrapper{box-shadow: 0 0 0 #fcfcfe;}'); (function () { 'use strict'; if (NProgress === undefined) NProgress = { set: function () { }, start: function () { }, inc: function () { }, done: function () { }, configure: function () { }, }; var ETYMONLINEHTTP = 'http://www.etymonline.com'; var GOOGLEHTTP = 'https://www.google.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); var googleFrameId = 'googleResult' + makeId(9); // remove the ad $topImgAd.remove(); $('#baidu-adv').remove(); $('#follow').remove(); // 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, callback) { var xhr = new GM_xmlhttpRequest({ method: 'GET', url: url, // anonymous: true, onreadystatechange: function (resp) { onreadystatechange(resp, callback); } }); } function onreadystatechange(resp, callback) { 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); callback(resp.responseText); break; default: GM_log(['Ger Error: ', '\nState: ', resp.readyState, '\nMessage: ', resp.responseText].join('')); } } } 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: '240px' }); $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); }) .on('keydown', function (event) { globalKeydown(event); }) .on('keyup', function (event) { globalKeyup(event); }); } $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; }); }); NProgress.done(); } function googleHandler(text) { // console.log(text); var googleDefinationHTML = parseJEAPI(text); var domParser = new DOMParser(); var $doc = domParser.parseFromString(googleDefinationHTML, 'text/html'); if (!$doc.querySelectorAll('.g.tpo.mod')) return; // has no defination var $googleFrame = $('#' + googleFrameId); if ($googleFrame.length === 0) $googleFrame = $('').css({ border: 0, width: '616px' }).appendTo('body'); // trim doc // $doc.querySelector('.srg').remove(); $doc.querySelector('.hd').remove(); $doc.querySelector('hr').remove(); $googleFrame.contents().find('head').html($doc.head.innerHTML); $googleFrame.contents().find('body').html('