Greasy Fork

Greasy Fork is available in English.

Sanskrit Tools - Toolbar

Sanskrit Language Tools

当前为 2014-09-17 提交的版本,查看 最新版本

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name           Sanskrit Tools - Toolbar
// @namespace      stgeorge
// @description    Sanskrit Language Tools
// @require        http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js
// @grant          GM_setValue
// @grant          GM_getValue
// @version        2.3.1
// ==/UserScript==

(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">' +
        '<div style="float:left; display:inline-block">' +
          '<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;"/>' +
        '</div>' +
        '<div style="float:left; display:inline-block">' +
          '<span class="spaced"></span>' +
          '<span class="spaced"></span>' +
          '<span class="spaced"></span>' +
          '<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 (in KH)"/>' +
          '<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 (in KH)"/>' +
          '<input id="st_action" type="submit" class="st_button bold spaced" value="&#2360;&#2370;&#2330;&#2351;&#2340;&#2369;"/>' +
        '</div>' +
        '<div style="float:right">' +
          '<span class="spaced">Open in new window </span>' +
          '<input type="checkbox" style="margin-right: 10px" class="st_input" id="tbNewWindow" value="false"/>' +
        '</div>' +
      '</form>' +
      '<a href="" style="display:none" id="tbLink"></a>'
    );
    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:'35px',
      cursor: 'pointer',
    });
    $('.st_select').css({
      verticalAlign:'middle',
      fontSize:'16px',
      height:'30px',
      padding:'3px 0'
    });
    $('.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) {
      var x = $(this).attr('id');
      show(x, LINKS[x]);
    });
    $('#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);
    // TODO: Devanagari input doesn't work
    // for inria.fr, since their backend doesn't
    // understand DN natively (the infria.fr client
    // converts from DN to Velthius when sending to their
    // backend. Until then, force KH.
    // var c = word.charCodeAt(0);
    // var enc = (c >= 0x0900 && c <= 0x097f) ? 'DN' : 'KH';
    var enc = 'KH';
    show(action, 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(action, url) {
    var u = 'http://' + url;
    var a = $('#tbLink');
    a.on('click', function(e) {
      a.attr('href', u);
      if ($('#tbNewWindow').prop('checked'))
        a.attr('target', '_'+action);
      else
        a.removeAttr('target');
    });
    a.get(0).click();
  }

  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);
    }
  }
})();