Sanskrit Tools - Toolbar

Sanskrit Language Tools

Fra 05.10.2014. Se den seneste versjonen.

// ==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.2
// ==/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, then provide appropriate input(s)" 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);
    }
  }
})();
长期地址
遇到问题?请前往 GitHub 提 Issues。