Advertisement
Romul81

GoldenDict Enhancer src v0.7

Dec 1st, 2016
229
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ver. 0.7
  2. (function() {
  3.     function run(gdArticle) {
  4.         var gdDictname = gdArticle.getElementsByClassName('gddictname'),
  5.         gdDictContentArr = [];
  6.         gdDictContentArr.push(new Array(gdDictname[0], getSiblings(gdDictname[0])));
  7.         gdDictContentArr.forEach(function(item, i) {
  8.             item[0].classList.add('gd_dictname', 'gd_article_exp');
  9.             item[0].addEventListener('click', function(event) {
  10.                 toggleContent(item[0], item[1]);
  11.                 event.stopPropagation();
  12.             });
  13.         });
  14.         var dslArticle = gdArticle.getElementsByClassName('dsl_article'),
  15.         dslWithOptArr = [];
  16.         for (var i = 0; i < dslArticle.length; i++) {
  17.             var dslArticleEl = dslArticle[i];
  18.             var dslHeadword;
  19.             if (dslArticleEl.querySelector('.dsl_opt')) {
  20.                 dslHeadword = getElement(getElement(dslArticleEl, 'gddefinition', 'parentElement'), 'gdheadword', 'previousElementSibling');
  21.                 dslWithOptArr.push(new Array(dslHeadword, dslArticleEl));
  22.             }
  23.         }
  24.         dslWithOptArr.forEach(function(item, i) {
  25.             item[0].classList.add('dsl_headword_plus');
  26.             item[0].addEventListener('click', function(event) {
  27.                 toggleOpt(item[0], item[1]);
  28.                 event.stopPropagation();
  29.             });
  30.         });
  31.     }
  32.  
  33.     function getElement(elem, cls, method) {
  34.         while ((elem = elem[method]) && !elem.classList.contains(cls));
  35.         return elem;
  36.     }
  37.  
  38.     function getSiblings(node) {
  39.         var nodeArr = [];
  40.         while (node = node.nextElementSibling) {
  41.             nodeArr.push(node);
  42.         }
  43.         return nodeArr;
  44.     }
  45.  
  46.     function toggleOpt(headword, definition) {
  47.         var optContent = definition.getElementsByClassName('dsl_opt');
  48.         for (var i = optContent.length - 1; i >= 0; i--) {
  49.             optContent[i].classList.toggle('dsl_opt_visible');
  50.         }
  51.         headword.classList.toggle('dsl_headword_plus');
  52.         headword.classList.toggle('dsl_headword_minus');
  53.     }
  54.  
  55.     function toggleContent(dictname, article) {
  56.         article.forEach(function(item, i) {
  57.             article[i].classList.toggle('content_hidden');
  58.         });
  59.         dictname.classList.toggle('gd_article_exp');
  60.         dictname.classList.toggle('gd_article_hidden');
  61.     }
  62.     // Start
  63.     var scr = document.getElementsByTagName('script');
  64.     scr = scr[scr.length - 1];
  65.     var selfDict = getElement(scr, 'gdarticle', 'parentElement');
  66.     selfDict.style.display = 'none';
  67.     selfDict.previousElementSibling.style.display = 'none';
  68.     if (!document.getElementById('optCss')) {
  69.         var gdArticles = document.body.getElementsByClassName('gdarticle');
  70.         // console.log(gdArticles.length);
  71.         if (gdArticles.length > 1) {
  72.             for (var i = 0; i < gdArticles.length - 1; i++) {
  73.                 gdArticles[i].ready = true;
  74.                 run(gdArticles[i]);
  75.             }
  76.         }
  77.         ///////////////////
  78.         var ready, check, observer,
  79.         listeners = [],
  80.         MutationObserver = window.MutationObserver || window.WebKitMutationObserver;
  81.         ready = function ready(fn) {
  82.             listeners.push({
  83.                 fn: fn
  84.             });
  85.             if (!observer) {
  86.                 observer = new MutationObserver(check);
  87.                 observer.observe(document.body, {
  88.                     childList: true,
  89.                     subtree: false
  90.                 });
  91.             }
  92.         };
  93.         check = function check(mutationRecords) {
  94.             var mutationScriptArr = [];
  95.             mutationRecords.map(function(mutation) {
  96.                 if ((mutation.type === 'childList') && (mutation.addedNodes[0].localName === 'script')) {
  97.                     mutationScriptArr.push(mutation.addedNodes[0]);
  98.                     return;
  99.                 }
  100.             });
  101.             var element, listener = listeners[0];
  102.             mutationScriptArr.forEach(function(item, i) {
  103.                 element = getElement(item, 'gdarticle', 'previousElementSibling');
  104.                 if (!element.ready) {
  105.                     element.ready = true;
  106.                     listener.fn.call(element, element);
  107.                 }
  108.             });
  109.         };
  110.         ///////////////////
  111.         var style = document.createElement('style');
  112.         var cssString = (function() {/*
  113.                                     .dsl_headword_plus::after{content:"+";border:1px solid #ccc;border-radius:3px;color:red;font-size:0.8em;font-weight:normal;margin-left:0.5em;padding:0 0.15em;}
  114.                                     .dsl_headword_minus::after{content:"-";border:1px solid #ccc;border-radius:3px;color:gray;font-size:0.8em;font-weight:normal;margin-left:0.5em;padding:0 0.15em;}
  115.                                     .dsl_opt, .content_hidden{display:none;}
  116.                                     .dsl_opt_visible, .gdheadword>p{display:inline;}
  117.                                     .gd_dictname{border-top:0;margin-top:8px;margin-bottom:5px;clear:right;}
  118.                                     .gd_article_exp::after{margin-left:0.5em;content:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHdpZHRoPSIyMCIgaGVpZ2h0PSIxMSIgdmlld0JveD0iMCAwIDIwIDExIj48cGF0aCBmaWxsPSIjODA4MDgwIiBkPSJtMC41IDFjMC0wLjEzIDAuMDUtMC4yNiAwLjE1LTAuMzUgMC4yLTAuMTkgMC41MS0wLjE5IDAuNzEgMGw4LjY1IDguNjUgOC42NS04LjY1YzAuMi0wLjE5IDAuNTEtMC4xOSAwLjcxIDBzMC4yIDAuNTEgMCAwLjcxbC05IDljLTAuMTkgMC4yLTAuNTEgMC4yLTAuNzEgMGwtOS05Yy0wLjEtMC4xLTAuMTUtMC4yMy0wLjE1LTAuMzVsMCAweiI+PC9wYXRoPjwvc3ZnPg==')}
  119.                                     .gd_article_hidden::after{margin-left:0.5em;content:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHdpZHRoPSIyMCIgaGVpZ2h0PSIxMSIgdmlld0JveD0iMCAwIDIwIDExIj48cGF0aCB0cmFuc2Zvcm09InJvdGF0ZSgxODAgMTAuMDEwMDAwMjI4ODgxODM2LDUuNTA4NzUwNDM4NjkwMTg2KSIgZmlsbD0icmVkIiBkPSJtMC41IDFjMC0wLjEzIDAuMDUtMC4yNiAwLjE1LTAuMzUgMC4yLTAuMTkgMC41MS0wLjE5IDAuNzEgMGw4LjY1IDguNjUgOC42NS04LjY1YzAuMi0wLjE5IDAuNTEtMC4xOSAwLjcxIDBzMC4yIDAuNTEgMCAwLjcxbC05IDljLTAuMTkgMC4yLTAuNTEgMC4yLTAuNzEgMGwtOS05Yy0wLjEtMC4xLTAuMTUtMC4yMy0wLjE1LTAuMzVsMCAweiI+PC9wYXRoPjwvc3ZnPg==')}
  120.                                     */}).toString().split('\n').slice(1, -1).join('\n');
  121.         style.id = 'optCss';
  122.         style.innerHTML = cssString;
  123.         document.getElementsByTagName('head')[0].appendChild(style);
  124.         ready(function(element) {
  125.             run(element);
  126.         });
  127.     }
  128. }());
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement