• RegExp Unicode Property Escapes в JavaScript: штрихи к портрету

      RegExp Unicode Property Escapes перешли на 4-ю ступень и будут включены в ES2018.


      В V8 они доступны без флага начиная с v6.4, поэтому готовы к использованию во всех текущих каналах Google Chrome от стабильного до Canary.


      В Node.js они будут доступны без флага уже в v10 (выходит в апреле). В других версиях требуется флаг --harmony_regexp_property (Node.js v6–v9) или --harmony (Node.js v8–v9). Сейчас без флага их можно испробовать или в ночных сборках, или в ветке v8-canary.


      При этом нужно иметь в виду, что сборки Node.js, скомпилированные без поддержки ICU, будут лишены возможности использовать этот класс регулярных выражений (подробнее см. Internationalization Support). Например, это касается популярной сборки под Android от сообщества Termux.


      Подробнее о поддержке в других движках и средах см. в известной таблице (после перехода проскрольте чуть выше).


      Я не буду повторять описания этой долгожданной возможности, лишь сошлюсь на несколько статей известных специалистов:

      Читать дальше →
    • Номенклатура JavaScript (в контексте Node.js и Web API)

        I. Предыстория


        Я много лет использую UltraEdit как редактор на самые разные случаи жизни. Одна из основных причин — быстрая работа с гигабайтными файлами без загрузки их в память. Для программирования на JavaScript он тоже достаточно удобен, вот только с одним существенным недостатком: автодополнение в нём основывается на достаточно бедном, жёстко заданном списке ключевых слов и глобальных переменных, вдобавок отстающем от развития языка. Как-то я задался вопросом, можно ли пополнить этот список полным перечнем всех готовых свойств и методов, какие только можно ввести в контексте Node.js и Web API (браузера). Где бы такой список можно раздобыть? Мне приходили в голову такие варианты:


        1. Готовый перечень, кем-то составляемый и обновляемый для всеобщего пользования, вроде библиотеки globals, но полнее.


        2. Парсинг документации (спецификация ECMAScript, сайты MDN и Node.js и т.п.), вручную или программно.


        3. Получение списка метапрограммированием.

        Читать дальше →
      • Ко дню рождения Далай-ламы

          Вчера я шёл куда-то по городу и вдруг задумался, как можно реализовать на JavaScript деление строки по символам при помощи регулярного выражения и с полным учётом Юникода.

          После перехода от Perl к JavaScript много лет тому назад, я всё испытывал за свой новый язык некоторый комплекс неполноценности из-за недостаточной поддержки Юникода. За всё то время, пока JavaScript совершал в этом направлении свой большой скачок (при переходе от ES5 к ES6), у меня в закладках осталось несколько хороших статей.

          The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)
          JavaScript has a Unicode problem
          Unicode-aware regular expressions in ECMAScript 6
          ES6 Strings (and Unicode, ) in Depth

          В последней из них предлагался рецепт разбиения строки на символы с учётом Юникода при помощи нового оператора ...
          Читать дальше →
        • String.raw: некоторые возможности и ограничения

            I. Возможности


            Когда я прочитал на MDN: «The static String.raw() method is a tag function of template literals, similar to the r prefix in Python or the @ prefix in C# for string literals» — я здорово обрадовался, потому что мне часто не хватало в JavaScript чего-то вроде одиночных кавычек в Perl.

            Я сразу придумал несколько видов использования и стал активно применять их в скриптах.

            1. Определение путей к файлам Windows без двойного экранирования.

            const r = String.raw;
            
            const test_module = require(r`e:\DOC\prg\js\node\-lib\test.js`);
            

            2. Определение путей к ключам реестра Windows.

            const r = String.raw;
            
            const Winreg = require('winreg');
            
            const regKey = new Winreg({
              hive: Winreg.HKCU,
              key: r`\Software\MPC-HC\MPC-HC\Settings`
            });
            

            3. Создание сложных регулярных выражений из составных литералов.

            См. пример кода в одной из недавних статей.

            II. Ограничения


            Однако со временем я стал натыкаться на неожиданные ограничения. Написав об одном из них в багтрекер V8, я получил отрезвляющее объяснение. Оказывается, хоть String.raw и выдаёт строку без интерпретации экранированных литералов, на стадии парсинга кода анализатор всё равно требует, чтобы литералы соответствовали правилам. Из этого следуют неочевидные ограничения для упомянутых случаев применения.
            Читать дальше →
          • Один из способов поиска неэкранированных символов с помощью новых средств JavaScript

              1. C чего всё началось


              Недавно у меня возникла необходимость написать очередную утилиту, обрабатывающую текстовый файл в формате, похожем на упрощённый BBCode, а именно в формате исходников для словарей ABBYY Lingvo — DSL (Dictionary Specification Language). (Не путать с другим DSL (Domain-specific language) — интересный случай, когда гипоним является омонимом к гиперониму).

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

              Одной из задач утилиты было как раз нахождение этих тегов с исключением экранированных сочетаний.

              Поскольку в регулярных выражениях JavaScript с недавнего времени можно пользоваться lookbehind assertions (в личных целях), я подумал, нельзя ли реализовать поиск при помощи этого средства, — тем более что в данной разновидности lookbehind можно использовать выражения переменной длины.
              Читать дальше →
            • Unicode character properties в регулярных выражениях V8

                Регулярные выражения в JavaScript понемногу догоняют PCRE.

                Недавно упомянутая возможность lookbehind перешла на стадию флага --es_staging.

                Разработчики V8 также начали добавлять в регулярные выражения свойства Юникода (см. общее описание и спецификацию этой характеристики символов).

                В продвижении lookbehind и character properties, на мой взгляд, есть две разницы: первая возможность вводит совсем немного нового синтаксиса по сравнению со второй, зато вторая меньше изменяет поведение всего процесса (сравните количество затрагиваемых изменениями файлов в исходниках V8 по двум упомянутым ссылкам). По сути, свойства Юникода — всего лишь удобные сокращения, синонимы для разных групп codepoint-ов, поэтому от них можно ожидать минимум подвохов при интеграции в систему.

                Конечно, обе возможности не советуют применять в продукции (кроме Google Chrome, они нигде в браузерах не реализованы, а Node.js только-только переходит на соответствующую им версию V8, в которой они всё равно пока под флагами).

                Но для личных нужд (утилиты по обработке текста и т.д.), мне кажется, они вполне применимы. Возможно, коду разработчиков V8, даже экспериментальному, можно порой доверять с ничуть не большим риском, чем разнообразным библиотекам на npmjs или GitHub.
                Читать дальше →
              • Lookbehind assertions в регулярных выражениях V8

                  Кажется, прошла незамеченной хорошая новость.

                  Разработчики V8 активно взялись за добавление lookbehind assertions в регулярные выражения JavaScript.

                  В Google Chrome Canary уже можно потестировать при помощи флага:

                  chrome.exe --js-flags="--harmony-regexp-lookbehind"

                  В этом месяце выходит шестая версия Node.js, основанная на V8 5.0, и в ней тоже можно включить поддержку lookbehind:

                  node --harmony_regexp_lookbehind

                  Если совсем не терпится, можно потестировать на уже появляющихся RC:

                  nodejs.org/download/rc

                  Читать дальше →
                • Удобная вставка многострочных шаблонных литералов в код на JavaScript

                    Описание проблемы


                    Появившиеся в ES6 шаблонные литералы (или шаблонные строки — template literals, template strings) помимо долгожданной интерполяции переменных и выражений принесли возможность вставки многострочного текста без дополнительных ухищрений, усложняющих вид кода.

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

                    Впрочем, проблемы видны, даже если присмотреться к примерам. Возьмём замечательную статью об этом нововведении из известной серии «ES6 In Depth».

                    Видите досадные «оспинки»? Лёгкие перекосы в симметрии и стройности?

                    Маленький пример
                    var text = (
                    `foo
                    bar
                    baz`)
                    

                    Большой пример
                    var html = `<article>
                      <header>
                        <h1>${title}</h1>
                      </header>
                      <section>
                        <div>${teaser}</div>
                        <div>${body}</div>
                      </section>
                      <footer>
                        <ul>
                          ${tags.map(tag => `<li>${tag}</li>`).join('\n      ')}
                        </ul>
                      </footer>
                    </article>`
                    

                    Возьмём какой-нибудь простой случай и посмотрим на проблемы внимательнее.
                    Читать дальше →
                  • Рип сетевых словарей при помощи Node.js, ч. 2: динамические страницы; подключение NW.js

                    • Tutorial
                    В предыдущей части были описаны базовые операции и сопутствующие задачи при копировании сетевых словарей при помощи Node.js. В этой части описывается использование важного дополнительного инструмента для конвертирования веб-источников особого уровня сложности.

                    I. Зачем нам NW.js?


                    1. Чем сложнее структура веб-страниц словаря, тем больше оснований опереться на весь спектр возможностей, предоставляемый отточенным браузерным движком. JSDOM — довольно развитая библиотека, но даже она не сравнится с полным набором средств из Chromium.

                    2. Люди, занимающиеся созданием и конвертированием цифровых словарей, — в значительной мере гуманитарии, которых волей судьбы занесло в сферу IT. Иногда им комфортнее работать с GUI, чем с интерфейсом командной строки, особенно если они не пишут утилиты сами, а пользуются готовыми разработками коллег. NW.js предоставляет простые способы создания GUI к тривиальным приложениям для анализа, обработки и конвертирования веб-страниц.

                    Как пример для краткого описания этого инструмента я выбрал сайт www.wordspy.com.
                    Читать дальше →
                  • Рип сетевых словарей при помощи Node.js, ч. 1: статические страницы; CLI; DSL -> TXT, PDF, DjVu; сопутствующие задачи

                    • Tutorial
                    Компания ABBYY создала хорошую программную оболочку для работы со словарями, однако не меньшим её вкладом в цифровую лексикографию стал побочный продукт разработки ABBYY Lingvo — язык словарной разметки DSL. Он давно уже вышел за границы Lingvo, стал самостоятельным стандартом и форматом для других словарных оболочек, в том числе одной из самых известных в своём роде — GoldenDict.

                    Но сама по себе компания ABBYY не достигла бы таких успехов без помощи многочисленной армии энтузиастов-лексикографов, маниакально год за годом оцифровывавших бумажные словари и конвертировавших словари цифровые — от миниатюрных специальных до огромных общего назначения.

                    Одна из самых известных и плодотворных групп давно уже работает на сайте forum.ru-board.com. Со временем там накопилась как обширнейшая коллекция словарей, так и основательнейшая база знаний и инструментов в помощь их создателям и редакторам. Было написано множество скриптов и программ, набор которых отражает историю и изменения популярности языков программирования, более или менее приспособленных для обработки текста. Тут и Perl с Python, и языки пакетных файлов для оболочек, и макросы MS Word и Excel, и компилируемые программы на языках общего назначения.

                    Однако до последнего времени один из языков почти не был представлен в данной сфере. Хотелось бы восполнить этот пробел и отдать должное стремительному росту мощности, функциональности и популярности языка JavaScript. Думается, он может оказать большую помощь современным программистам-лексикографам, особенно на границе сетевой и локальной лексикографии.
                    Читать дальше →
                  • Скорость локального форматирования чисел

                      I. Задача



                      В одном из скриптов столкнулся с необходимостью отформатировать вывод больших чисел для удобства чтения. Нашёл несколько рецептов, как разделить число на группы по разряду, но в обсуждениях высказывались сомнения в производительности. Решил провести несколько тестов.
                      Читать дальше →
                    • За что Microsoft Edge ненавидит закладки?

                        Недавно я написал ряд заметок, так или иначе касавшихся работе с букмарклетами в браузерах, и почти в каждой упомянул о какой-то проблеме с IE, высказывая надежду, что придёт MS Edge и всё исправит.

                        Поэтому не смог пропустить появление виртуальных машин с Windows 10 и решил проверить, как теперь обстоят дела с коллекцией досадного опыта.

                        На машине оказалась версия MS Edge 11.00.10240.16397 от 7.22.2015 (по версии файла), она же 20.10240.16384.0 (по информации в настройках браузера)…
                        Читать дальше →
                      • Эмуляция CORS на стороне клиента: кроссбраузерное решение некоторых пользовательских задач без расширений

                        • Tutorial

                        I. В чём проблема



                        Расширения для браузеров — мощный инструмент продвинутого веб-сёрфинга, самая доступная, развитая и распространённая часть целого ряда инструментов. Однако расширения имеют и слабые стороны: каждый браузер требует знания и применения своих правил и форматов, а это дополнительная сложность для создателя. Расширения не кроссбраузерны, что сразу ограничивает их адресат. Есть попытки обобщить создание расширений, но они могут добавлять уже свою дополнительную прослойку форматов и правил.

                        Когда расширение улучшает специфические стороны браузерного интерфейса, без него не обойтись. Но некоторые задачи универсальны, не связаны с частными средствами браузера и, тем не менее, без расширения их тоже не выполнить. Одна из таких задач — кроссдоменные XMLHttpRequest запросы, нарушающие политику одного источника.
                        Читать дальше →
                      • Теги в социальных сетях и синтетические (флективные) языки

                        • Tutorial

                        I. В чём проблема


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

                        Например, поиск с учётом морфологии в английских и русских текстах требует разного уровня сложности. Разветвлённость русского словоизменения уже давно стала предметом расхожих шуток о мучениях иностранцев, изучающих русскую грамматику со всеми нормами и исключениями.

                        Один из примеров того, как технология натыкается на разницу языков, являют теги в английских и русских блогах и социальных сетях. Пока теги выделяются в отдельный блок (как это реализовано на Хабрахабре или в ЖЖ), проблем нет: в обоих языках используются начальные формы слов, иногда множественное число (и тут даже английский язык являет остатки былого синтетизма). Но как только теги попадают в текст, разница обостряется. И порой кажется, что, например, хештеги Твиттера становятся мощным фактором усиливающегося аналитизма в русском языке. То и дело натыкаешься на фразы вроде:

                        Мы с #муж в ресторане.

                        С завтрашнего дня в #Москва.

                        Вернулись с #море.

                        Возникает очень странное чувство, некоторое языковое головокружение и раздвоение.
                        Читать дальше →
                      • Букмарклеты в Internet Explorer 11: формат хранения, лимиты и негласные правила, коварный баг

                          После того, как сразу два букмарклета, работавшие в Google Chrome и Firefox, отказались работать в Internet Explorer 11, причём не выдавали в консоль никаких сообщений об ошибках и вообще не подавали признаков жизни, я стал разбираться, в чём же дело.

                          Сначала я решил, что дело в лимите на длину URL и тем самым на длину букмарклета. В IE 7 ограничение было в 2083 символа, в IE 11, по уверениям экспериментировавших пользователей, лимит увеличили. Нужно было выяснить опытным путём, какова теперь эта граница.

                          Но сперва небольшое предисловие.

                          Google Chrome хранит закладки в JSON, Firefox — в базе данных sqlite. Поэтому названия у закладок могут быть произвольные. IE хранит каждую закладку как отдельный файл, например, в папке %userprofile%\Favorites\Links. Поэтому браузер будет корректировать названия закладок, чтобы они подходили под нормы файловой системы (заменять знаки вопроса, например). Поэтому же в IE не могут быть в одной папке две закладки с одинаковым именем, а в Google Chrome и Firefox — могут (закладки в них могут быть даже вообще без имени, только со значком сайта или стандартным заменителем).
                          Читать дальше →
                        • Анонсы переводов

                            Сегодня на Хабре почти одновременно появились два перевода одной и той же статьи:

                            habrahabr.ru/post/263169
                            habrahabr.ru/post/262783

                            Если читателям вреда от этого почти нет (секундная заминка и незначительное раздражение), а порой даже польза бывает (каждый перевод может обладать своими достоинствами и недостатками), то авторы страдают куда больше: ощущение впустую потраченного времени лишает вдохновения на будущее. В конце концов страдают все: ведь за то же время можно было бы перевести что-то другое, что, возможно, уже никогда не будет переведено.

                            На трекерах обычно бывает раздел анонсов, где люди объявляют, например, о планах рипнуть какой-то HD-фильм, чтобы другие не тратили время на то же. Хорошо было бы создать такой же раздел на Хабре, чтобы переводчики могли узнавать, не взял ли уже кто-то в перевод статью. В заголовок можно выносить имя автора и название статьи в оригинале, чтобы легче было пользоваться поиском.

                            Предлагаю голосовать.
                          • Букмарклеты: если XPath недоступен, а селекторов и методов навигации по DOM не хватает

                              Недавно я пытался написать несколько условно кроссбраузерных букмарклетов с выборками и навигацией средней сложности. Решил ограничиться последними версиями Google Chrome, Firefox и Internet Explorer. Приступив к проверке в последнем браузере, с грустью обнаружил, что даже в IE 11 всё ещё нет поддержки XPath.

                              Вроде бы полная поддержка обещана в Edge: «Microsoft Edge supports the XML Path Language Version 1.0 with no variations or extensions». И уже даже, кажется, реализация добавлена в Internet Explorer Developer Channel (никто не проверял?). Но это пока недостаточное утешение.

                              (P.S. Проверка через виртуальную машину подтверждает реализацию XPath в MS Edge версии 11.00.10240.16397 от 7.22.2015 (по версии файла), она же 20.10240.16384.0 (по информации в настройках)).

                              Следующим шагом стало обнаружение библиотеки от Google. Я даже для очистки совести проверил способ с вживлением библиотеки на странички в IE 11 (по описанному здесь методу) — всё замечательно работает даже на параноидальных сайтах вроде Твиттера (к слову, если вы вдруг не знали, в Firefox всё ещё нельзя запустить букмарклет в Твиттере или, например, в Гитхабе, из-за до сих пор не исправленного бага). Но метод этот очень громоздкий. Он хорошо подходит для разработки сайтов, но маленькие пользовательские букмарклеты он отягощает лишней асинхронностью, усложнением логики и дополнительным временем на загрузку файла.

                              Пришлось искать более простые замены для некоторых не хватавших мне инструментов XPath.
                              Читать дальше →
                            • Надёжный localStorage для букмарклетов

                                В отличие от расширений, букмарклеты хороши простотой и кроссбраузерностью. Конечно, они ограничены контекстом окна (содержимого страницы), но часто этого достаточно. А с возникновением механизма localStorage у них появился простой способ сохранять и запрашивать данные на стороне клиента.
                                Читать дальше →
                                • +17
                                • 11,2k
                                • 2
                              • Пометить как прочитанное: Twitter, VK, LiveJournal, Facebook…

                                  I. В чём проблема.


                                  Почтовые ящики, «Входящие» личных сообщений, RSS — всё это объединяет одно удобство: чёткое разделение прочитанных и непрочитанных сообщений. Однако в блогах и социальных сетях, по крайней мере самых распространённых, такая возможность чаще всего не предусмотрена. И по досадному совпадению именно эти ресурсы не предоставляют пользователям потоки RSS.

                                  Вроде бы не так сложно помнить, что ты прочитал, а что ещё нет. Но если следишь за очень динамичной лентой или за активным обсуждением одной темы, порой не так уж просто сразу разобраться. Да и постоянно прочитывать одно-два первых предложений вхолостую, чтобы только понять, что ты это уже читал, — не такое уж приятное и безвредное занятие.

                                  Читать дальше →
                                • Зачёркивание и подчёркивание символьными средствами ( ̶т̶а̶к̶ ̶, т̱а̱к̱ или т̲а̲к̲)

                                    I. В чём проблема



                                    Если социальная сеть, платформа для блогов или форум предоставляют возможность размечать текст при помощи HTML или BBCode, перечёркивать или подчёркивать текст не составляет труда: можно пользоваться тегами s и u обеих разметок или назначать стили в HTML. Но что делать, если у нас есть только голый текст? Или, например, нам нужно зачеркнуть/подчеркнуть слово в заголовке страницы, отображаемом в заголовке вкладки или всего браузера, или оформить слово в заголовке форумного поста — короче говоря, всюду, где не работает разметка?

                                    Можно рискнуть и воспользоваться средствами Юникода.

                                    Читать дальше →