Advertisement
KosIvantsov

translit

Dec 18th, 2015
405
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //:name=Utils - Translit :description=Transliterate current target or selection
  2. /*******************************************************************************
  3. * @Name   : "translit(a, b)"                         // Имя
  4. * @Params :   str  - транслитерируемая строка        // Параметры запуска
  5.               typ  - [123456]
  6.                    system A = 1-диакритика
  7.                    system B =(2-Беларусь;3-Болгария;4-Македония;5-Россия;6-Украина)
  8.                    Если typ отрицательное - обратная транслитерация
  9. * @Descrp : Прямая и обратная транслитерация         // Описание
  10.             по стандарту ISO 9 или ISO 9:1995 или ГОСТ 7.79-2000 системы А и Б
  11. * @ExtURL : ru.wikipedia.org/wiki/ISO_9              // Внешний URL
  12. * #Guid   : {E7088033-479F-47EF-A573-BBF3520F493C}   // GUID
  13. * @Exampl : "example()"                              // Пример использования
  14. * GPL applies. No warranties XGuest[11.02.2015/03:44:01] translit [ver.1.0.1]
  15. *******************************************************************************/
  16. var dia = false;
  17. //var loc = java.util.Locale.getDefault().getLanguage();
  18. var prop = project.getProjectProperties();
  19. var ste = editor.currentEntry;
  20. if (editor.selectedText){
  21.     var target = editor.selectedText;
  22.     }else{
  23.     var target = editor.getCurrentTranslation();
  24.     }
  25.  
  26. var tlcode = prop.getTargetLanguage().getLanguageCode();
  27. var suplang = ["BE", "BG", "MK", "RU", "UK"];
  28.  
  29. if ((/[\u0400-\u04ff]+/ig).test(target)){
  30.     transcode = suplang.indexOf(tlcode) ? suplang.indexOf(tlcode) + 2 : 0 ;
  31.     transcode = dia ? 1 : transcode ;
  32.     }else{
  33.     transcode = suplang.indexOf(tlcode) ? -(suplang.indexOf(tlcode) + 2) : 0 ;
  34.     transcode = dia ? -1 : transcode ;
  35.     }
  36.  
  37. exports = function (str, typ) {
  38.  var func = function (typ) {
  39.  /* Function Expression
  40.   * Вспомогательная функция.
  41.   *
  42.   * В ней и хотелось навести порядок.
  43.   *
  44.   * Проверяет направление транслитерации.
  45.   * Предобработка строки (правила из ГОСТ).
  46.   * Возвращает массив из 2 функций:
  47.   *  построения таблиц транслитерации.
  48.   *  и пост-обработки строки (правила из ГОСТ).
  49.   *
  50.   * @param  {Number} typ
  51.   * @return {Array}
  52.   */
  53.   var abs = Math.abs(typ);             // Абсолютное значение транслитерации
  54.   if(typ === abs) {                    // Прямая транслитерация(кирилица в латиницу)
  55.    // Правила транслитерации (из ГОСТ).
  56.    // "i`" только перед согласными в ст. рус. и болг.
  57.    //  str = str.replace(/(i(?=.[^аеиоуъ\s]+))/ig, "$1`");
  58.    str = str.replace(/(\u0456(?=.[^\u0430\u0435\u0438\u043E\u0443\u044A\s]+))/ig, "$1`");
  59.    return [                            // Возвращаем массив функций
  60.     function (col, row) {              // создаем таблицу и RegExp
  61.      var chr;                          // Символ
  62.      if(chr = col[0] || col[abs]) {    // Если символ есть
  63.       trantab[row] = chr;              // Добавляем символ в объект преобразования
  64.       regarr.push(row);                // Добавляем в массив RegExp
  65.      }
  66.     },
  67.     // функция пост-обработки
  68.     function (str) {                   // str - транслируемая строка.
  69.     // Правила транслитерации (из ГОСТ).
  70.     return str.replace(/i``/ig, "i`"). // "i`" только перед согласными в ст. рус. и болг.
  71.     replace(/((c)z)(?=[ieyj])/ig, "$2");// "cz" в символ "c"
  72.     }];
  73.   } else {                             // Обратная транслитерация (латиница в кирилицу)
  74.    str = str.replace(/(c)(?=[ieyj])/ig, "$1z"); // Правило сочетания "cz"
  75.    return [                            // Возвращаем массив функций
  76.     function (col, row) {              // Создаем таблицу и RegExp
  77.      var chr;                          // Символа
  78.      if(chr = col[0] || col[abs]) {    // Если символ есть
  79.       trantab[chr] = row;              // Добавляем символ в объект преобразования
  80.       regarr.push(chr);                // Добавляем в массив RegExp
  81.      }
  82.     },
  83.    // функция пост-обработки
  84.    function (str) {return str;}];      // nop - пустая функция.
  85.   }
  86.  }(typ);
  87.  var iso9 = {                          // Объект описания стандарта
  88.    // Имя - кириллица
  89.    //   0 - общие для всех
  90.    //   1 - диакритика         4 - MK|MKD - Македония
  91.    //   2 - BY|BLR - Беларусь  5 - RU|RUS - Россия
  92.    //   3 - BG|BGR - Болгария  6 - UA|UKR - Украина
  93.    /*-Имя---------0-,-------1--,---2-,---3-,---4-,----5-,---6-*/
  94.  "\u0449": [   "", "\u015D",   "","sth",   "", "shh","shh"], // "щ"
  95.  "\u044F": [   "", "\u00E2", "ya", "ya",   "",  "ya", "ya"], // "я"
  96.  "\u0454": [   "", "\u00EA",   "",   "",   "",    "", "ye"], // "є"
  97.  "\u0463": [   "", "\u011B",   "", "ye",   "",  "ye",   ""], //  ять
  98.  "\u0456": [   "", "\u00EC",  "i", "i`",   "",  "i`",  "i"], // "і" йота
  99.  "\u0457": [   "", "\u00EF",   "",   "",   "",    "", "yi"], // "ї"
  100.  "\u0451": [   "", "\u00EB", "yo",   "",   "",  "yo",   ""], // "ё"
  101.  "\u044E": [   "", "\u00FB", "yu", "yu",   "",  "yu", "yu"], // "ю"
  102.  "\u0436": [ "zh", "\u017E"],                                // "ж"
  103.  "\u0447": [ "ch", "\u010D"],                                // "ч"
  104.  "\u0448": [ "sh", "\u0161"],                                // "ш"
  105.  "\u0473": [   "","f\u0300",   "", "fh",   "",  "fh",   ""], //  фита
  106.  "\u045F": [   "","d\u0302",   "",   "", "dh",    "",   ""], // "џ"
  107.  "\u0491": [   "","g\u0300",   "",   "",   "",    "", "g`"], // "ґ"
  108.  "\u0453": [   "", "\u01F5",   "",   "", "g`",    "",   ""], // "ѓ"
  109.  "\u0455": [   "", "\u1E91",   "",   "", "z`",    "",   ""], // "ѕ"
  110.  "\u045C": [   "", "\u1E31",   "",   "", "k`",    "",   ""], // "ќ"
  111.  "\u0459": [   "","l\u0302",   "",   "", "l`",    "",   ""], // "љ"
  112.  "\u045A": [   "","n\u0302",   "",   "", "n`",    "",   ""], // "њ"
  113.  "\u044D": [   "", "\u00E8", "e`",   "",   "",  "e`",   ""], // "э"
  114.  "\u044A": [   "", "\u02BA",   "", "a`",   "",  "``",   ""], // "ъ"
  115.  "\u044B": [   "",      "y", "y`",   "",   "",  "y`",   ""], // "ы"
  116.  "\u045E": [   "", "\u01D4", "u`",   "",   "",    "",   ""], // "ў"
  117.  "\u046B": [   "", "\u01CE",   "", "o`",   "",    "",   ""], //  юс
  118.  "\u0475": [   "", "\u1EF3",   "", "yh",   "",  "yh",   ""], //  ижица
  119.  "\u0446": [ "cz",      "c"],                                // "ц"
  120.  "\u0430": [  "a"],                                          // "а"
  121.  "\u0431": [  "b"],                                          // "б"
  122.  "\u0432": [  "v"],                                          // "в"
  123.  "\u0433": [  "g"],                                          // "г"
  124.  "\u0434": [  "d"],                                          // "д"
  125.  "\u0435": [  "e"],                                          // "е"
  126.  "\u0437": [  "z"],                                          // "з"
  127.  "\u0438": [   "",      "i",   "",  "i",  "i",   "i", "y`"], // "и"
  128.  "\u0439": [   "",      "j",  "j",  "j",   "",   "j",  "j"], // "й"
  129.  "\u043A": [  "k"],                                          // "к"
  130.  "\u043B": [  "l"],                                          // "л"
  131.  "\u043C": [  "m"],                                          // "м"
  132.  "\u043D": [  "n"],                                          // "н"
  133.  "\u043E": [  "o"],                                          // "о"
  134.  "\u043F": [  "p"],                                          // "п"
  135.  "\u0440": [  "r"],                                          // "р"
  136.  "\u0441": [  "s"],                                          // "с"
  137.  "\u0442": [  "t"],                                          // "т"
  138.  "\u0443": [  "u"],                                          // "у"
  139.  "\u0444": [  "f"],                                          // "ф"
  140.  "\u0445": [  "x",      "h"],                                // "х"
  141.  "\u044C": [   "", "\u02B9",  "`",  "`",   "",   "`",  "`"], // "ь"
  142.  "\u0458": [   "","j\u030C",   "",   "",  "j",    "",   ""], // "ј"
  143.  "\u2019": [  "'", "\u02BC"],                                // "’"
  144.  "\u2116": [  "#"]                                           // "№"
  145.   }, regarr = [], trantab = {};
  146.  for(var row in iso9) {func[0](iso9[row], row);} // Создание таблицы и массива RegExp
  147.  return func[1](                       // функция пост-обработки строки (правила и т.д.)
  148.   str.replace(                         // Транслитерация
  149.   new RegExp(regarr.join("|"), "gi"),  // Создаем RegExp из массива
  150.   function (R) {                       // CallBack Функция RegExp
  151.    if(                                 // Обработка строки с учетом регистра
  152.     R.toLowerCase() === R) {
  153.     return trantab[R];
  154.    } else {
  155.     return trantab[R.toLowerCase()].toUpperCase();
  156.    }
  157.   }));
  158. };
  159.  
  160.  
  161. if (! target){
  162.     console.println("Target is empty");
  163.     } else {
  164.     var newtarget = exports(target, transcode)
  165.     if (newtarget == target){
  166.         console.println("Could not transliterate");
  167.         }else{
  168.         if (editor.selectedText){
  169.             editor.insertText(newtarget);
  170.             }else{
  171.             editor.replaceEditText(newtarget);
  172.             }
  173.         console.clear();
  174.         console.println(target + "\n\n" + newtarget);
  175.         }
  176.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement