20 февраля 2015 в 15:01

Translit для JavaScript и ГОСТ-7.79-2000 из песочницы


Переводы как женщины: если красивы — неверны, если верны то некрасивы.
Мориц Готлиб
Ссылки
Информация: Wiki,
PDF ГОСТа
Репозиторий: GitHub,
NpmJs
Исходный код
/* jshint -W100 */
/**
* @name      translit.js
* @author    XGuest <xguest@list.ru>
* @link      https://github.com/xguest/iso_9_js
* @version   1.0.4
* @copyright GPL applies.
*            No warranties XGuest[28.03.2016/07:59:18] translit [ver.1.0.4]
* #guid      {E7088033-479F-47EF-A573-BBF3520F493C}
*
* @description Прямая и обратная транслитерация
*              Соответствует ISO 9:1995 и ГОСТ 7.79-2000 системы А и Б
*
* @param {String}  str транслитерируемая строка
* @param {Number}  typ ± направление (тип) транслитерации
*                      + прямая с латиницы в кириллицу
*                      - обратная
*                      system A = 1-диакритика;
*                      system B = 2-Беларусь;3-Болгария;4-Македония;5-Россия;6-Украина;
* @example
* function example() {
*  var a, b = [
*     [],
*     ["Диакритика", "Съешь ещё этих мягких французских булок, да выпей же чаю!"],
*     ["Беларускую", "З'ясі яшчэ гэтых мяккіх французскіх булак, ды выпі ж чаю!"],
*     ["Български",  "Яжте повече от тези меки кифлички, но също така се пие чай!"],
*     ["Македонски", "Јадат повеќе од овие меки францускиот ролни, па пијат чај!"],
*     ["Русский",    "Съешь ещё этих мягких французских булок, да выпей же чаю!"],
*     ["Українська", "З'їж ще цих м'яких французьких булок, та випий же чаю!"]
*  ], c, d;
*  for(a = 1; a < b.length - 1; a++) {
*   c = b[a][0];                                       // Language
*   d = b[a][1];                                       // Source
*   e = translit(d, a);                                // Forward
*   console.log(
*    "%s - %s\nSource  : %s\nTranslit: %s\nReverse : %s\n",
*    c,                                                // Language
*    translit(c, a),                                   // Transliterated language
*    d,                                                // Source
*    e,                                                // Forward
*    translit(e, -1 * a)                               // Reverse
*   );
*  }
* };
**/
function translit(str, typ) {
  var func = (function(typ) {
  /** Function Expression
  * Вспомогательная функция.
  *
  * FINISHED TESTED!
  * В ней и хотелось навести порядок.
  *
  * Проверяет направление транслитерации.
  * Возвращает массив из 2 функций:
  *  построения таблиц транслитерации.
  *  и пост-обработки строки (правила из ГОСТ).
  *
  * @param  {Number} typ
  * @return {Array}  Массив функций пред и пост обработки.
  **/
    function prep (a) {
      var write = !a ? function(chr, row) {trantab[row] = chr;regarr.push(row);} :
      function(row, chr) {trantab[row] = chr;regarr.push(row);};
      return function(col, row) {        // создаем таблицу и RegExp
        var chr = col[abs] || col[0];    // Символ
        if (chr) write(chr, row);        // Если символ есть
        }
    }
    var abs = Math.abs(typ);             // Абсолютное значение транслитерации
    if (typ === abs) {                   // Прямая транслитерация в латиницу
      str = str.replace(/(i(?=.[^аеиоуъ\s]+))/ig, '$1`'); // "i`" ГОСТ ст. рус. и болг.
      return [prep(),                    // Возвращаем массив функций
        function(str) {                  // str - транслируемая строка.
          return str.replace(/i``/ig, 'i`').    // "i`" в ГОСТ ст. рус. и болг.
           replace(/((c)z)(?=[ieyj])/ig, '$1'); // "cz" в символ "c"
        }];
    } else {                             // Обратная транслитерация в кириллицу
      str = str.replace(/(c)(?=[ieyj])/ig, '$1z'); // Правило сочетания "cz"
      return [prep(1),function(str) {return str;}];// nop - пустая функция.
    }
  }(typ));
  var iso9 = {                           // Объект описания стандарта
    // Имя - кириллица
    //   0 - общие для всех
    //   1 - диакритика         4 - MK|MKD - Македония
    //   2 - BY|BLR - Беларусь  5 - RU|RUS - Россия
    //   3 - BG|BGR - Болгария  6 - UA|UKR - Украина
   /*-Имя---------0-,-------1-,---2-,---3-,---4-,----5-,---6-*/
    '\u0449': [   '', '\u015D',   '','sth',   '', 'shh','shh'], // 'щ'
    '\u044F': [   '', '\u00E2', 'ya', 'ya',   '',  'ya', 'ya'], // 'я'
    '\u0454': [   '', '\u00EA',   '',   '',   '',    '', 'ye'], // 'є'
    '\u0463': [   '', '\u011B',   '', 'ye',   '',  'ye',   ''], //  ять
    '\u0456': [   '', '\u00EC',  'i', 'i`',   '',  'i`',  'i'], // 'і' йота
    '\u0457': [   '', '\u00EF',   '',   '',   '',    '', 'yi'], // 'ї'
    '\u0451': [   '', '\u00EB', 'yo',   '',   '',  'yo',   ''], // 'ё'
    '\u044E': [   '', '\u00FB', 'yu', 'yu',   '',  'yu', 'yu'], // 'ю'
    '\u0436': [ 'zh','\u017E'],                                 // 'ж'
    '\u0447': [ 'ch','\u010D'],                                 // 'ч'
    '\u0448': [ 'sh', '\u0161',   '',   '',   '',    '',   ''], // 'ш'
    '\u0473': [   '','f\u0300',   '', 'fh',   '',  'fh',   ''], //  фита
    '\u045F': [   '','d\u0302',   '',   '', 'dh',    '',   ''], // 'џ'
    '\u0491': [   '','g\u0300',   '',   '',   '',    '', 'g`'], // 'ґ'
    '\u0453': [   '', '\u01F5',   '',   '', 'g`',    '',   ''], // 'ѓ'
    '\u0455': [   '', '\u1E91',   '',   '', 'z`',    '',   ''], // 'ѕ'
    '\u045C': [   '', '\u1E31',   '',   '', 'k`',    '',   ''], // 'ќ'
    '\u0459': [   '','l\u0302',   '',   '', 'l`',    '',   ''], // 'љ'
    '\u045A': [   '','n\u0302',   '',   '', 'n`',    '',   ''], // 'њ'
    '\u044D': [   '', '\u00E8', 'e`',   '',   '',  'e`',   ''], // 'э'
    '\u044A': [   '', '\u02BA',   '', 'a`',   '',  '``',   ''], // 'ъ'
    '\u044B': [   '',      'y', 'y`',   '',   '',  'y`',   ''], // 'ы'
    '\u045E': [   '', '\u01D4', 'u`',   '',   '',    '',   ''], // 'ў'
    '\u046B': [   '', '\u01CE',   '', 'o`',   '',    '',   ''], //  юс
    '\u0475': [   '', '\u1EF3',   '', 'yh',   '',  'yh',   ''], //  ижица
    '\u0446': [ 'cz',     'c'],                                 // 'ц'
    '\u0430': [ 'a'],                                           // 'а'
    '\u0431': [ 'b'],                                           // 'б'
    '\u0432': [ 'v'],                                           // 'в'
    '\u0433': [ 'g'],                                           // 'г'
    '\u0434': [ 'd'],                                           // 'д'
    '\u0435': [ 'e'],                                           // 'е'
    '\u0437': [ 'z'],                                           // 'з'
    '\u0438': [   '',      'i',   '',  'i',  'i',   'i', 'y`'], // 'и'
    '\u0439': [   '',      'j',  'j',  'j',   '',   'j',  'j'], // 'й'
    '\u043A': [ 'k'],                                           // 'к'
    '\u043B': [ 'l'],                                           // 'л'
    '\u043C': [ 'm'],                                           // 'м'
    '\u043D': [ 'n'],                                           // 'н'
    '\u043E': [ 'o'],                                           // 'о'
    '\u043F': [ 'p'],                                           // 'п'
    '\u0440': [ 'r'],                                           // 'р'
    '\u0441': [ 's'],                                           // 'с'
    '\u0442': [ 't'],                                           // 'т'
    '\u0443': [ 'u'],                                           // 'у'
    '\u0444': [ 'f'],                                           // 'ф'
    '\u0445': [  'x',     'h'],                                 // 'х'
    '\u044C': [   '', '\u02B9',  '`',  '`',   '',   '`',  '`'], // 'ь'
    '\u0458': [   '','j\u030C',   '',   '',  'j',    '',   ''], // 'ј'
    '\u2019': [ '\'','\u02BC'],                                 // '’'
    '\u2116': [  '#']                                           // '№'
   /*-Имя---------0-,-------1-,---2-,---3-,---4-,----5-,---6-*/
  }, regarr = [], trantab = {};
  /* jshint -W030 */                     // Создание таблицы и массива RegExp
  for (var row in iso9) {if (Object.hasOwnProperty.call(iso9, row)) {func[0](iso9[row], row);}}
  /* jshint +W030 */
  return func[1](                        // функция пост-обработки строки (правила и т.д.)
      str.replace(                       // Транслитерация
      new RegExp(regarr.join('|'), 'gi'),// Создаем RegExp из массива
      function(R) {                      // CallBack Функция RegExp
        if (R.toLowerCase() === R) {     // Обработка строки с учетом регистра
          return trantab[R];
        } else {
          return trantab[R.toLowerCase()].toUpperCase();
        }
      }));
}
module.exports = translit;
Про транслитерацию в интернете написано много, но Хабрахабр'е не нашел.
Решил написать код прямой и обратной транслитерации соответствующий стандарту ISO 9:1995 7.79-2000 системы А и Б на JavaScript.
Поддерживает Русский, Белорусский, Украинский, Болгарский, Македонский языки.
Используется в России, Армении, Азербайджане, Белоруссии, Казахстане, Киргизии, Таджикистане, Туркмении, Узбекистане.

Впечатление от использования: код упростить, конечно, можно, не хватает фонетических правил, но приходится придерживаться стандарта.

Жду комментарии, замечания и предложения.

P.S.
21.02.2015 — Прокомментировал код.
22.02.2015 — Собрал первую версию пакета, всем спасибо за помощь.
23.02.2015 — Переименовал переменные.
18.05.2015 — Добавил JSDoc.
@XGuest
карма
0,0
рейтинг 0,0
The user only
Самое читаемое Разработка

Комментарии (30)

  • +8
    return [function (c, d) {var a;if(a = c[d][0] || c[d][b]) {f[d] = a;e.push(d);}}, function (a) {a = a.replace(/i``/ig, «i`»);return a.replace(/(©z)(?=[ieyj])/ig, "$2");}];

    Зачем вы берете на себя функции минификатора? Вы думаете, что он справится хуже?
    Зачем вы пишете комменты какбэ в JsDoc, но на самом деле нет?
    Вы не слышали, что код надо иногда сопровождать — фиксить баги, расширять, оптимизировать, портировать, понятие читабельного кода вам не знакомо?
    • +1
      да уж, чего стоит именование переменных. Может это просто слегка деобфусцированный код?
    • 0
      И Вам, доброго времени.
      Спасибо за ваше мнение.
      Постараюсь ответить по порядку.
      1) Логику стараюсь упростить до минимума, только чтобы не перегружать код, и если что-то останется для минимизатора, пусть Crockford или Closure трудятся.
      2) Мой шаблон для Far Manager гораздо старше JsDoc, а переписывать лень, так и оставил, не знаю, до этого всем все было понятно, или я ошибаюсь?
      3) Насчет читабельности, описание логики алгоритма, храню отдельно, опять-таки, чтобы не перегружать код. Но там нет ничего, что стоило бы внимания, хотя здесь вы наверное правы, у меня привычки астматика (еще с masm 2).
      В зависимости от значения параметров.
      Собираю таблицу преобразования символов, по ней RegExp, ну и функцию обработки.
      Позже прокомментирую код, обещаю;)

      • +5
        1) Простите, ничего не понял. Как связаны сложность кода и то, что он у вас написан так, будто вы его уже прогнали через минификатор. И при чем тут Дуглас Крокфорд?
        2) Все понятно, только из JsDoc можно сгенерить отдельную страничку с документацией и он поддерживается в некоторых IDE, а это ваше неизвестно что существует только в виде шаблона для Far.
        3) Тащить привычки из одного языка в другой надо осмотрительно:) В любом случае, необязательно комментировать каждую строчку, чтобы код был читабелен. Для начала было бы неплохо, если бы на каждой строке была только одна операция и функции и переменные носили осмысленные имена, а не a, b, c, d.
      • +1
        1) Все уже используют свои минификаторы на проектах, включая нормальные сурсы библиотек в сборку — это, как минимум, помогает в отладке. Ну и приятно, когда код библиотеки можно просто прочесть, не продираясь через лес оптимизаций
        2) JSDoc — промышленный стандарт, если хотите, чтобы простынка была именно библиотекой, и везде работало автодополнение.
        Ну и для библиотеки js хороший тон быть в bower/npm — один package.json скажет больше, чем вот эта шапка комментов.
        3) Логику алогритма можно понять, если следить за неймингом и логикой. И писать по какому-нибудь кодстайлу.

        +) JS прекрасно работает с UTF-8, нет? Зачем \u?
        +) Зачем кому-то тащить ненужный ему македонский? Плюс это усложняет текущий код. Если взять в пример какой-нибудь numeral, вполне можно выделить таблицы локализации в отдельный файл. (что приведет к большей поддерживаемости и возможности заюзать, например, по выбору ГОСТ или ISO)
        • 0
          Спасибо
          +) Чтоб хранить в базе данных весь код.
          +)
          Если взять в пример какой-нибудь numeral, вполне можно выделить таблицы локализации в отдельный файл. (что приведет к большей поддерживаемости и возможности заюзать, например, по выбору ГОСТ или ISO)

          Удалите и не используйте македонский (поддержка стандарта) и код это не затронет, таблица кодов в одной переменной используйте хоть с другого сервера и кстати код уже поддерживает выбору ГОСТ и ISO

      • 0
        Ну вот, например, чтобы это было норм статьей, можно было бы сравнить с уже существующими и инфраструктурно встраиваемыми решениями (которые, кстати, покрыты тестами, но не указывают, какую оф.версию транслита они реализуют)

        www.npmjs.com/package/transliterate
        www.npmjs.com/packages/translit-ru-ua
        www.npmjs.com/package/translitit-engine
        и еще www.npmjs.com/search?q=translit
  • +5
    Страница кода — это не публикация. Чтобы превратить это в статью должна быть тема (уже есть: транслит), описание задачи, которую решаем, какое-то исследование и решение. Код можно положить на GitHub и дать ссылку на него. Если мы говорим о JavaScript, то сейчас, де-факто, код следует оформлять в виде npm-пакета.
    • –1
      А как же bower?
      • 0
        Транслит это не исключительно задача клиента. Я за CommonJS модули на сервере и клиенте.
        • 0
          Дык в bower и CJS модули можно класть, без разницы. Лучше, конечно, класть универсальные.
      • +3
        Вспомнил шутку
        — Что такое bower?
        — Менеджер пакетов
        — А как его поставить?
        — Через npm
        — А что такое npm?
        — Менеджер пакетов…

        Мне кажется, уже давно все используют npm + browserify / webpack
    • –1
      Спасибо
      Насчет оформления исправлюсь.
      Задача и была написать оптимизированный по времени и размеру код для транслитерации по стандарту.
      Можно положить и на Git но я предполагал что код и его оптимизация и есть тема обсуждения.
      Насчет NPM, я не использовал в функции сторонний код поэтому так и оставил, код под ECMA 3,
      а если писать под 'нод' или что то еще можно было бы использовать 'Object.keys' и тому подобное я же старался придерживаться ECMA, да и еще, а как быть Googl и mozilla SDK.
      • 0
        код и его оптимизация и есть тема обсуждения
        Не совсем. Намного лучше было бы, если бы статья представляла целостное повествование, от идеи до реализации, с элементами кода. В духе «здесь я использовал такое решение JS», «здесь пригодилась такая фишка Unicode» и так далее. Обсуждение строится уже на этом повествовании. В конце можно дать ссылку на репозиторий. Кстати, репозиторий необходим не для выпендрёжа, а для коллаборации: чтобы другие могли воспользоваться тем, что вы достигли, либо прислать вам дополнения.

        оставил, код под ECMA 3
        Это нормально и адекватно в условиях совместимости, и это не противоречит созданию пакета. Пакет нужен не для того, чтобы заточиться под конкретную платформу (ноду, в данном случае), а чтобы формализовать ваши наработки в виде некоторого юнита, у которого будут описаны версия, описание, лицензия, точка входа, что с ним можно сделать, зависимости (если есть). npm, кстати, позиционируется, как пакетный менеджер для всего. И он не прибит гвоздями к ноде, в нём есть поле engines, которое позволяет указать на каких движках пакет работает или не работает. Пакет можно потом преобразовать для браузера.

        Кстати, я вчера поискал в npm registry пакет для транслита и не нашёл: два очень старых, неподдерживаемых пакета. Так что ваша работа может оказаться очень полезной, если доведёте до ума.
        • 0
          Спасибо
          1) Ну тогда, стоит начать сначала, JavaScript считаю наименее мной изученным языком, да и себя не позиционирую как программиста скорей как сисадмина, но просмотрев избранное своего браузера оказалось, что по MASM, C++, C#, JS, VBS, VB, Linux, железу и т.д. и т.п больше всего ссылок на Хабрахабр.
          Почитав хабр и учитывая свои возможности, решил быть хоть чем то полезным, это и была задача.

          2) C npm столкнулся только в Node и то для изучения чужого кода. Придется почитать.

          Ощущение как у школьника, но буду стараться.
          Спасибо, за советы это уже похоже на дискуссию.

          • 0
            Начните отсюда:
            docs.npmjs.com/files/package.json

            Если возьмётесь, могу помочь с оформлением пакета и возникающими вопросами (вопросы сюда в лс).
            • 0
              Спасибо
              == > Начните отсюда:
              Как раз сейчас пытаюсь осмыслить.

              == > (вопросы сюда в лс)
              Я так понимаю
              package.json:
              {
              «name»: «translit»,
              «version»: «0.0.4»,
              «description»: «Forward and reverse transliteration according to ISO 9 or ISO 9: 1995 or GOST 7.79-2000 system of A and B»,
              «main»: «translit.js»,
              «scripts»: {
              «test»: "??? — пока не понимаю что туда"
              },
              «author»: «xguest <xguest@list.ru>»,
              «license»: «GPL»
              }
  • +1
    Сам использую такой вариант, нашёл где-то в интернете
    var toTranslit = function (text) {
                return text.replace(/([а-яё])|([\s_-])|([^a-z\d])/gi,
                    function (all, ch, space, words, i) {
                        if (space || words) {
                            return space ? '-' : '';
                        }
                        var code = ch.charCodeAt(0),
                            index = code == 1025 || code == 1105 ? 0 :
                                code > 1071 ? code - 1071 : code - 1039,
                            t = ['yo', 'a', 'b', 'v', 'g', 'd', 'e', 'zh',
                                'z', 'i', 'y', 'k', 'l', 'm', 'n', 'o', 'p',
                                'r', 's', 't', 'u', 'f', 'h', 'c', 'ch', 'sh',
                                'shch', '', 'y', '', 'e', 'yu', 'ya'
                            ];
                        return t[index];
                    });
            };
    

    • 0
      Спасибо.
      Не видел.
      Примерно тоже, но без учета правил и стандарта, я когда то так от нечего делать, писал для Брайля и морзянки.


  • –2
    Спасибо за ваше внимание.
    На 20 февраля 2015 23:24 проголосовало 17 человек из них 7 нравиться и 10 не нравиться, в избранное добавили 17.
    Насчет замечаний, все конечно в тему, и постараюсь исправить но:
    Не хватает комментариев — я не претендовал на обучающий материал — допишу.
    Оптимизация, не есть минимизация.
    Все остальное есть дело вкуса.
    k12th
    1) Код потому и простой, что оптимизирован руками. Дуглас Крокфорд и Closure ни причем. Имя Дугласа Крокфорда — упомянул как автора первого минимизатора, с которым столкнулся: github.com/douglascrockford/JSMin.git.
    2) JSDoc наверное интересная вещь, но я не переписывал шаблоны так как не хватало описания стандарта. А насчет страницы с документацией, у меня все мои наработки лежат в отдельном MDB и мне все равно, что из него делать: .js; .html или что-то еще. «JSDoc… в некоторых IDE» — Не пользуюсь, мне в фаре комфортней, но это дело вкуса я не осуждаю. Тоже самое насчет привычек.
    3) Оптимизация, не есть минимизация.
    В этой функции используется максимум 10 ECMA 3 функций, штук 5-6 переменных, не использует сторонних инструкций и функций тем более из NodeJS, а как быть Googl и mozilla SDK. И ещё, что вы подразумеваете под «если бы на каждой строке была только одна операция»
    В этой функции используется максимум 10 ECMA функций, штук 5-6 переменных, синтаксис соответствует ECMA 3 и не использует NodeJS, а как быть Googl и mozilla SDK,. И ещё,
    что вы подразумеваете под «если бы на каждой строке была только одна операция»

    Например тот фрагмент кода который вы привели:
    return [ // Возвращаем массив функций
    function (c, d) { // c — таблица, d — символ (создаем таблицу и RegExp)
    var a; // Создаем временную переменную для хранения символа
    if(a = c[d][0] || c[d][b]) { // Если символ есть
    f[d] = a; // Добавляем символ в объект преобразования
    e.push(d); // Добавляем в массив RegExp
    }
    }, function (a) { // a — строка (функция пост-обработки)
    a = a.replace(/i``/ig, «i`»); // для старославянского и болгарского
    return a.replace(/(©z)(?=[ieyj])/ig, "$2"); // правило использования символа «c»
    }];
    кстати оптимизатор переписал бы последнюю функцию как минимум так,
    return a.replace(/i``/ig, «i`»).replace(/(©z)(?=[ieyj])/ig, "$2");
    а я пропустил.
    Вы предполагали эти комментарии?

    P.S. Если есть ссылка на описание стандарта JsDoc, бросьте в меня пожалуйста.

    • +6
      проголосовало 17 человек из них 7 нравиться и 10 не нравиться

      Потому что все содержимое топика — неподдерживаемый, сложный код,

      Код потому и простой

      Код не простой, он короткий. И сложный. Даже я со своего опыта не сразу в нем разобрался. А простой код — когда глянешь одним глазком и сразу всё понятно.

      Все остальное есть дело вкуса.

      Не дело вкуса, а правила хорошего тона. Или пердеть на всю комнату и дурно с такого хихикать — тоже дело вкуса?

      Не пользуюсь, мне в фаре комфортней, но это дело вкуса я не осуждаю.

      Тогда зачем выкладывали? Вам комфортнее — пользуйтесь. Выкладываете — приведите к общему стандарту.

      Оптимизация, не есть минимизация

      Не подменяйте понятия, ничего общего с оптимизацией ваш код не имеет. Минимизация — да. Оптимизация — даже близко нет.

      В этой функции используется максимум 10 ECMA 3 функций, штук 5-6 переменных

      И что? Можно вообще не использовать функции и использовать только четыре переменные, чтобы создать квадратическую сложность алгоритма. Но у вас дело даже не в алгоритме

      new RegExp(e.join("|")

      Вы весь код запускаете при каждом вызове функции. Более того, прям в коде создаете регулярку. Зачем? Все пред-созданные регулярки браузер компилит заранее и потом просто переиспользует.

      var a; // Создаем временную переменную для хранения символа
      e.push(d); // Добавляем в массив RegExp

      Почему a — символ, e — массив, а d — регексп? Что за извращенная логика? Или вы в первом классе и сдаете знание алфавита? Вам надо не комментировать код, а написать его так, чтобы вопросов не возникало.

      что вы подразумеваете под «если бы на каждой строке была только одна операция»

      А то, что код не пишется в одну строчку. Тот код для машины, а не для человека:

      return [function (c, d) {var a;if(a = c[d][0] || c[d][b]) {f[d] = a;e.push(d);}}, function (a) {a = a.replace(/i``/ig, «i`»);return a.replace(/(©z)(?=[ieyj])/ig, "$2");}];


      Мне пришлось пропустить ваш код через jsbeautifier.org/, чтобы хоть как-то его читать.

      Подумайте над всем сказанным и перед тем как снова выставлять такое — приведите его в порядок, а не вываливайте кашу.
      • –4
        Спасибо
        Меня на такой, комментарий не хватило бы.
        Постараюсь, сначала аргументировать ваши замечания, а потом займусь кодом.

        1) Насчет проголосовавших, я хотел сказать, что не зависимо от голосования, кто то посчитал его для себя полезным.

        2) О простоте кода — это уже философия, считаю в лесу проще заблудится, чем в трех деревьях. Сложный? чем — повторным использованием переменных, отсутствием лишних
        проверок, но согласен кое что в коде проработать можно. Мой папа тоже всегда упоминал о своем возрасте и опыте, а когда мне исполнилось примерно столько же, понял, что тогда нужно было согласится независимо от того прав он был или нет. Говорят, это наживное, возможно кому-то и лога отладчика хватает и я им завидую.

        3) Насчет вкусов вы по моему передёрнули, или не поняли я имел ввиду, что говорю о функции, а не о том где ее использовать.

        4) Насчет, зачем выкладывал, искал более простой вариант, наверное хотел выслушать чье то мнение, я уже пообещал прокомментировать. Может укажите стандарт?

        5) Об оптимизации и минимизации, для этого и писал искал более оптимальный вариант, о чем и написано в шапке.

        6) ==> Но у вас дело даже не в алгоритме \n RegExp(e.join("|")
        А что вас здесь смущает, преобразовать массив в строку с разделителем "|", что в свою очередь для RegExp является символом или. Кстати вы писали почему не выровнены имена переменных по алфавиту, и как раз про 'e' она там внешняя, и при совмещении двух рядов с учетом видимости и алфавита она вышла буквой 'e'.

        7) ==> Все пред-созданные регулярки браузер компилит заранее и потом просто переиспользует.

        Насколько я помню добиться увеличения скорости можно кэшируя большие данные, мой же код имея в ГОСТ восемь полей и 14 вариантов таблиц не кэширует ничего просто проверяет направление и создает таблицу и RegExp. И это как раз то что хотелось оптимизировать но там только одна проверка, сомневаюсь но думаю что заранее создавать все регулярки уже будет накладно.

        8) ==> Почему a — символ,…
        а — потому что это единственная локальная переменная в этой функции.
        все остальные переменные для нее внешние.

        9) ==> А то, что код не пишется в одну строчку.
        Тут мой косяк, уже сказал исправлюсь, эти функции пощипал не интересными, и свернул но в принципе то там ни чего и нет.
        Еще раз спасибо.
        • +1
          Прокомментирую пункт 8.
          Абстрактно.
          Сравните код:
          Раз
          var a = /(#[0-9a-f]{6})|(#[0-9a-f]{3})|(rgba?\((\d{1,3})\,\s*(\d{1,3})\,\s*(\d{1,3})(\,\s*([0-9\.]{1,4}))?\))|(rgba?\((\d{1,3})\%?\,\s*(\d{1,3})\%?\,\s*(\d{1,3})\%?(\,\s*([0-9\.]{1,4}))?\))/;
          var b = c.match(a);
          for(var d = 0; d < e; d++){
           z[f][v] = b[d];
          }
          


          Понятно что-нибудь?
          Два
          var distanceRegexp = /(#[0-9a-f]{6})|(#[0-9a-f]{3})|(rgba?\((\d{1,3})\,\s*(\d{1,3})\,\s*(\d{1,3})(\,\s*([0-9\.]{1,4}))?\))|(rgba?\((\d{1,3})\%?\,\s*(\d{1,3})\%?\,\s*(\d{1,3})\%?(\,\s*([0-9\.]{1,4}))?\))/;
          
          var matches = value.match( distanceRegexp );
          
          for(var i = 0; i < count; i++){
           result[index0][index1] = matches[i];
          }
          

          тут не стоило использовать регулярки, конечно


          Какой понятнее?

          «Пишите код так, как будто читать его будет сексуальный маньяк с садистскими наклонностями, и он знает адрес где вы живёте.» (с)
          • 0
            Спасибо
            Согласен с вами.
            Не привязывал переменные логически к названию, чтоб не терять возможности повторного использования.
            К именованию переменных у меня БЫЛО два подхода.
            • При изучения чужого кода и отладке собственного — использую маркеры из "$", "_" и буквы верхнего регистра.

            var $A="Marker'$A'";
            var _A="Marker'_A'";
            var _$A="Marker'_$A'";
            

            • При оптимизации кода — минимальное имя переменной и отсутствие логической привязки названия к значению для временных %TMP% переменных, и их логическая последовательность

            • 0
              Иногда всё же стоит жертвовать повторным использованием в пользу читаемости кода. Ну если вам так критично — попробуйте написать что-нибудь, чтобы такой код:
              var first = 0;
              // ...
              var second = 'abc'; // reuse first
              alert(second);
              

              Превращался в такой:
              var first = 0;
              // ...
              first = 'abc';
              alert(first);
              

              И читаемо, и переменные повторно используются.

              P.S.
              Если не секрет, зачем всё сообщение писать в спойлере?
              • 0
                Спасибо
                Keyten
                Если не секрет, зачем всё сообщение писать в спойлере?

                В спойлере, чтоб не захламлять топик, и ответы были за вопросами.

                var first = 0;   // Предположим, что эта переменная действительно 'first'
                                 // со значением типа Number
                // ...           // здесь что-то происходит возможно, что с 'first'
                first = 'abc';   // Меняем тип переменной, и она уже не может быть 'first' скорее 'tmp'
                                 // Это и есть разрыв логической привязки.
                alert(first);    // Я бы сразу написал alert('abc');
                // Не удачный пример, я бы выбрал, что то об обмене значений переменных, и описал бы классический стек.
                //
                // В моем понимании оптимизация это разумное соотношение размера кода к количеству 
                // выполненных операций для получения определенной цели. Я стараюсь не использовать 
                // переменных, которые использоваться однократно, проще интегрировать эти значения в код. 
                // После того как понимаешь что все переменные на своих местах, начинаю разбираться, а все 
                // ли переменные и операции мне нужны - это как упростить уравнение, если упрощать нечего, 
                // начинаю сортировать переменные в порядке использования, а последним шагом сокращаю имена 
                // переменных и функций.
                //
                // Постарался полно ответить на ваши вопросы.
                

    • 0
  • 0
    k12th Спасибо, С JSDoc пока разбираюсь.

    Прокомментировал код, как смог.

    Прошу сильно не пинать, это моя первая публикация, и я стараюсь.

    Хочу переименовать переменные.

    Не привязывал их логически к названию, чтоб не терять возможности повторного использования.

    У меня вопрос, а если вы в середине кода понимаете, что переменная больше не нужна, разве ее нельзя использовать повторно?

    • 0
      Я не уверен, что даже в ассемблере стоит повторно использовать переменные.

      Во-первых, это сильно затрудняет понимание кода, а время человека стоит дороже, чем время компьютера, потраченное на выделение памяти. Во-вторых, это экономия на спичках — современные компиляторы/интерпретаторы сами неплохо оптимизируют, особенно если речь о таких высокоуровневых вещах, как JS.
      • 0
        Спасибо
        Нет для тех задач, что решают в ASM, память стараются экономить.
        Завтра переименую переменные.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.