Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Escaper - микробиблиотека для "экранирования" литералов (https://javascript.ru/forum/project/47593-escaper-mikrobiblioteka-dlya-ehkranirovaniya-literalov.html)

kobezzza 30.05.2014 11:20

Escaper - микробиблиотека для "экранирования" литералов
 
Всем привет!

Хочу представить вам свою микролибу для экранирования литералов и комментариев в JavaScript. Либа поддерживает все виды строк (включая строки шаблоны), литералы регулярных выражений, а также комментарии.

Что собственно она делает: ищет в указанной строке конструкции вида

' ... '
" ... "
` ... `, ` ... ${...} `
/ ... /gim
/* ... */
// ...


И возвращает новую строку, где эти конструкции заменены на __ESCAPER_QUOT__номер_ и разумеется есть обратная операция.

Всего два метода:

Escaper.replace // замена
Escaper.paste // обратная замена


Эта либа полезная при написании микро-парсеров, где построение AST будет излишне. Она работает в один проход с помощью посимвольного анализа без использования регулярных выражений.

сама либа

nerv_ 30.05.2014 13:52

kobezzza, а зачем это? (любопытно)
Что-то вроде String Templates in ES6?

Я почему спрашиваю: ты говорил, что пишешь на es6. В es6 это встроенный функционал.

kobezzza 30.05.2014 14:07

Цитата:

Сообщение от nerv_ (Сообщение 314042)
kobezzza, а зачем это? (любопытно)
Что-то вроде String Templates in ES6?

Я почему спрашиваю: ты говорил, что пишешь на es6. В es6 это встроенный функционал.

Ты не понял что делает либа :)

Попробую объяснить на примере:

// Допустим есть функция
function foo() {
    var a = 'this'; /* this */
    var b = /this/;
}


Внутри Collection для оптимизации я изучаю тело функции на наличие this, т.е. делаю поиск по регулярке для foo.toString(), но перед тем как это делать нужно "заэкранировать" все литералы и комментарии, чтобы пример выше вернул, что this внутри функции не используется.

Задача на первый взгляд простая, но это обман:) Т.к. могут быть очень хитрые литералы, а строить AST для такой вещи - это гемор, да и работать это будет медленней.

Вот я делаю

Escaper.replace(foo.toString(), true)


И функция мне вернёт что-то вроде (строку):

"function foo() {\
    var a = __ESCAPER_QUOT__0_; __ESCAPER_QUOT__1_\
    var b = __ESCAPER_QUOT__2_;\
}"


Т.е. всё содержимое литералов было заменено на специальные константы и дальше я уже спокойно работаю со строкой. Ну и разумеется есть обратная replace операция - paste, которая принимает экранированную строку и возвращает её к прежнему виду (если это нужно).

Эту либу я юзаю вместе с Collection и Snakeskin, а также в других своих разработках.

Цитата:

Сообщение от nerv_ (Сообщение 314042)
Я почему спрашиваю: ты говорил, что пишешь на es6. В es6 это встроенный функционал.

Юзаю, поэтому сегодня как раз добавил поддержку строк-шаблонов :)

'`this ${this}`'


=>

'__ESCAPER_QUOT__0_this__ESCAPER_QUOT__1_;'

kobezzza 30.05.2014 16:12

Ещё пример использования:
когда ещё не было более-менее нормальных трансляторов ES6, то я за вечерок с пивом на регулярках написал:
https://github.com/kobezzza/NeJS и он служил мне довольно долго в реальных проектах :)

Это костыль, но всё же :)


Часовой пояс GMT +3, время: 09:51.