Greasy Fork

Greasy Fork is available in English.

Sanskrit Tools - Toolbar

Sanskrit Language Tools

当前为 2014-07-29 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name           Sanskrit Tools - Toolbar
// @namespace      sanskritToolsToolbar
// @description    Sanskrit Language Tools
// @require        http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js
// @version        2.0
// ==/UserScript==

// TODO:
// Decide about mini dictionary.

(function() {
  const IGNORES = [
    'yahoo.com',
    // 'spokensanskrit.de',
    // 'sanskrit.inria.fr',
    // 'sambhashanasandesha.in',
    // 'youtube.com/user/sanskritanews'
  ];
  const ACTIONS = {
    verb: 'sanskrit.inria.fr/cgi-bin/SKT/sktconjug?lex=SH&q=%Q%&t=%E%&c=%C%&font=deva',
    noun: 'sanskrit.inria.fr/cgi-bin/SKT/sktdeclin?lex=SH&q=%Q%&t=%E%&g=%G%&font=deva',
    dict: 'spokensanskrit.de/index.php?trans=Translate&tinput=%Q%',
    join: 'sanskrit.inria.fr/cgi-bin/SKT/sktsandhier?lex=SH&l=%Q%&r=%R%&t=%E%&k=external'
  };
  const LINKS = {
    mag: 'www.sambhashanasandesha.in/',
    books: 'www.sanskrit.nic.in/ebook.htm',
    news: 'www.youtube.com/user/sanskritanews/videos',
    wiki: 'sa.wikipedia.org',
    alpha: 'en.wikipedia.org/wiki/Siva_Sutra#Text',
  };
  const WIN_NAME = "SanskritTools";

  var numClicks = 0;

  function toolbar() {
    // Create widgets.
    var tbHTML = $(
      '<form id="toolbar" style="overflow:hidden; float:left">' +
        '<input id="mag" type="button" title="&#2360;&#2350;&#2381;&#2349;&#2366;&#2359;&#2339; &#2360;&#2344;&#2381;&#2342;&#2375;&#2358;&#2350;&#2381; (Sambhashana Sandesha Magazine)" class="st_button st_link bold spaced" value="&#2346;&#2340;&#2381;&#2352;&#2367;&#2325;&#2366;"/>' +
        '<input id="books" type="button" title="&#2346;&#2369;&#2360;&#2381;&#2340;&#2325;&#2366;&#2344;&#2367; (Books)" class="st_button st_link bold spaced" value="&#2346;&#2369;&#2360;&#2381;&#2340;&#2325;&#2366;&#2344;&#2367;"/>' +
        '<input id="news" type="button" title="&#2349;&#2366;&#2352;&#2340;&#2368;&#2351; &#2342;&#2370;&#2352;&#2342;&#2352;&#2381;&#2358;&#2344; &#2357;&#2366;&#2352;&#2381;&#2340;&#2366;: (Sanskrit Doordarshan News Channel on YouTube)" class="st_button st_link bold spaced" value="&#2357;&#2366;&#2352;&#2381;&#2340;&#2366;:"/>' +
        '<input id="wiki" type="button" title="&#2357;&#2367;&#2325;&#2367;&#2346;&#2368;&#2337;&#2367;&#2351;&#2366 (Sanskrit Wikipedia)" class="st_button st_link bold spaced" value="&#2357;&#2367;&#2325;&#2367;&#2346;&#2368;&#2337;&#2367;&#2351;&#2366"/>' +
        '<input id="alpha" type="button" title="&#2350;&#2366;&#2361;&#2375;&#2358;&#2381;&#2357;&#2352;&#2360;&#2370;&#2340;&#2381;&#2352;&#2350;&#2381; (Panini\'s Maheshwara Sutram)" class="st_button st_link bold spaced" value="&#2350;&#2366;&#2361;&#2375;&#2358;&#2381;&#2357;&#2352;&#2360;&#2370;&#2340;&#2381;&#2352;&#2350;&#2381;"/>' +
        '<span class="spaced"></span>' +
        '<span class="spaced"></span>' +
        '<span class="spaced"></span>' +
        '<div style="display:inline-block">' +
        '<span title="Select a tool from the menu, provide appropriate input(s), then click the \'Go!\' button" class="bold act noun verb dict join spaced">Tools:</span>' +
        '<select class="st_select spaced" id="tbMenu">' +
          '<option value="dict" class="bold" selected="selected">&#2358;&#2348;&#2381;&#2340;&#2325;&#2379;&#2358;:</option>' +
          '<option class="bold" value="noun">&#2360;&#2369;&#2348;&#2344;&#2381;&#2340;&#2352;&#2370;&#2346;&#2350;&#2381;</option>' +
          '<option class="bold" value="verb">&#2340;&#2367;&#2329;&#2344;&#2381;&#2340;&#2352;&#2370;&#2346;&#2350;&#2381;</option>' +
          '<option class="bold" value="join">&#2360;&#2306;&#2343;&#2367;&#2307;</option>' +
        '</select>'+
        '<span class="spaced act noun verb dict">&#2346;&#2342;&#2350;&#2381;</span>' +
        '<span class="spaced act join">&#2346;&#2342;&#2375;</span>' +
        '<input class="st_input spaced act noun verb dict join" id="st_word" size="20"' +
          'placeHolder="Type word"/>' +
        '<span class="spaced act noun">&#2354;&#2367;&#2329;&#2381;&#2327;&#2350;&#2381; </span>' +
        '<select class="st_select act noun" id="st_linga">' +
          '<option value=""></option>' +
          '<option value="Fem">&#2360;&#2381;&#2340;&#2381;&#2352;&#2368;&#2354;&#2367;&#2329;&#2327;&#2350;&#2381;</option>' +
          '<option value="Mas">&#2346;&#2369;&#2350;&#2381;&#2354;&#2367;&#2329;&#2327;&#2350;&#2381;</option>' +
          '<option value="Neu">&#2344;&#2346;&#2369;&#2350;&#2381;&#2360;&#2325;&#2354;&#2367;&#2329;&#2327;&#2350;&#2381;</option>' +
          '<option value="Any">&#2309;&#2344;&#2381;&#2351;</option>' +
        '</select>' +
        '<span class="act verb spaced">&#2327;&#2339;: </span>' +
        '<select class="st_select act verb" id="st_gana">' +
          '<option value=""></option>' +
          '<option value="1">1</option>' +
          '<option value="2">2</option>' +
          '<option value="3">3</option>' +
          '<option value="4">4</option>' +
          '<option value="5">5</option>' +
          '<option value="6">6</option>' +
          '<option value="7">7</option>' +
          '<option value="8">8</option>' +
          '<option value="9">9</option>' +
          '<option value="10">10</option>' +
        '</select>' +
        '<input class="st_input spaced act join" id="st_word2" size="20"' +
          'placeHolder="Type word 2"/>' +
        '<input id="st_action" type="submit" class="st_button spaced" value="Go!"/>' +
        '</div>' +
      '</form>'
    );
    var tbToggleHTML = '<div id="tbToggle" title="Click to show/hide Sanskrit Toolbar">\u0938</div>';

    // Place them on the screen.
    place('toolbar', tbHTML, {
      position: 'fixed',
      'top': 0,
      margin: 0,
      height: '40px',
      width: '100%',
      zIndex: 2999999999,
      paddingTop: '5px',
      backgroundColor: '#eeeeee',
      borderBottom: '1px solid orange',
      display:'none'
    });
    place('tbToggle', tbToggleHTML, {
      cursor:'pointer',
      'float':'right',
      fontSize:'large',
      padding: '0px 15px 18px',
      fontWeight:'bold',
      backgroundColor: 'white',
      color:'green',
      position:'fixed',
      right:0,
      bottom: 0,
      height:'10px',
      width:'10px',
      zIndex:9999
    });
    $('.spaced').css({
      marginLeft:'10px',
      verticalAlign:'middle',
      fontSize:'16px',
    });
    $('.st_button').css({
      paddingRight:'10px !important',
      padding:'0px',
      fontSize:'16px',
      verticalAlign:'middle',
      height:'30px',
      cursor: 'pointer',
    });
    $('.st_select').css({
      verticalAlign:'middle',
      fontSize:'16px',
      height:'30px',
      padding:'0px'
    });
    $('.st_input').css({
      verticalAlign:'middle',
      padding:'0px',
      height:'30px',
      fontSize:'16px',
      verticalAlign:'middle'
    });
    $('.bold').css('fontWeight', 'bold');
    $('option').css({
      paddingRight: '3px',
      paddingLeft: '3px',
    });

    // Set initial state.
    $('#st_word').val(GM_getValue('word', ''));
    $('#st_word2').val(GM_getValue('word2', ''));
    $('#st_linga').val(GM_getValue('linga', ''));
    $('#st_gana').val(GM_getValue('gana', ''));
    var opt = GM_getValue('opt', 'dict');
    $('#tbMenu').val(opt);
    hilite(opt);
    if (GM_getValue('status', 0)) showTb();
    else hideTb();

    // Set event handlers.
    $('#tbToggle').on('click', toggleTb);
    $('#tbMenu').on('change', function(e) {
      hilite($('#tbMenu option:selected').val());
    });
    $('.st_link').on('click', function(e) {
      show(LINKS[$(this).attr('id')]);
    });
    $('#st_action').on('click', action);
    $('#toolbar').on('submit', action);
  }

  function action(e) {
    e.preventDefault();
    var action = $('#tbMenu :selected').val()
    GM_setValue('opt', action);
    var word = $('#st_word').val();
    var word2 = $('#st_word2').val();
    var linga = $('#st_linga').val();
    var gana = $('#st_gana').val();
    GM_setValue('word', word);
    GM_setValue('word2', word2);
    GM_setValue('linga', linga);
    GM_setValue('gana', gana);
    var c = word.charCodeAt(0);
    var enc = (c >= 0x0900 && c <= 0x097f) ? 'DN' : 'KH';
    // TODO: Pass correct input encoding.
    show(ACTIONS[action].
      replace('%Q%', word).
      replace('%R%', word2).
      replace('%G%', linga).
      replace('%C%', gana).
      replace('%E%', enc)
    );
  }

  function toggleTb() {
    if (GM_getValue('status', 0) == 0) {
      showTb();
    } else {
      hideTb();
    }
  }

  function showTb() {
    $('#toolbar').css({
      'display':'block',
    });
    $('#tbToggle').css('color', 'green');
    $('body').css('marginTop', '50px');
    GM_setValue('status', 1);
  }

  function hideTb() {
    $('#toolbar').css({
      'display':'none',
    });
    $('#tbToggle').css('color', 'red');
    $('body').css('marginTop', 0);
    GM_setValue('status', 0);
  }

  function place(id, html, css) {
    $('body').prepend(html);
    $('#'+id).css(css);
  }

  function hilite(x) {
    $('#toolbar .act').hide();
    $('#toolbar .'+x).show();
    return $('#toolbar :visible').size();
  }

  function handleClick(e) {
    var node = (e.target || e.srcElement);
    if (e.button != 0)
      return;
    if (node.nodeName == 'A')
      return;
    var n = node;
    while (n) {
      if (n.getAttribute) {
        var ce = n.getAttribute('contenteditable');
        if (ce) 
          return;
      }
      n = n.parentNode;
    }
    if (++numClicks == 1) {
      window.setTimeout(function() {
        var selectedText = getSelectedText(true);
        if (selectedText != null) {
          var i = selectedText.indexOf(' ');
          if (i >= 0) {
            selectedText = selectedText.slice(0,i);
          }
          if (selectedText.length > 0) {
            $('#st_word').val(selectedText);
            GM_setValue('word', selectedText);
          }
        }
        numClicks = 0;
      }, 300);
    }
  }

  function getSelectedText(trim) {
    var text =
      (window.getSelection) ? window.getSelection().toString() :
      (document.getSelection) ? document.getSelection().toString() :
      (document.selection) ? document.selection.createRange().text : null;
    if (trim && text != null)
      text = text.trim();
    return text;
  }

  function show(url) {
    window.location.href = 'http://' + url;
  }

  if (window.top == window.self) {
    var ok = true;
    for (var i in IGNORES) {
      if (document.URL.indexOf(IGNORES[i]) != -1) {
        ok = false;
        break;
      }
    }
    if (ok) {
      toolbar();
      document.addEventListener('mouseup', handleClick, false);
    }
  }
})();