Escaper - микробиблиотека для "экранирования" литералов
Всем привет!
Хочу представить вам свою микролибу для экранирования литералов и комментариев в JavaScript. Либа поддерживает все виды строк (включая строки шаблоны), литералы регулярных выражений, а также комментарии. Что собственно она делает: ищет в указанной строке конструкции вида ' ... ' " ... " ` ... `, ` ... ${...} ` / ... /gim /* ... */ // ... И возвращает новую строку, где эти конструкции заменены на __ESCAPER_QUOT__номер_ и разумеется есть обратная операция. Всего два метода: Escaper.replace // замена Escaper.paste // обратная замена Эта либа полезная при написании микро-парсеров, где построение AST будет излишне. Она работает в один проход с помощью посимвольного анализа без использования регулярных выражений. сама либа |
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, а также в других своих разработках. Цитата:
'`this ${this}`' => '__ESCAPER_QUOT__0_this__ESCAPER_QUOT__1_;' |
Ещё пример использования:
когда ещё не было более-менее нормальных трансляторов ES6, то я за вечерок с пивом на регулярках написал: https://github.com/kobezzza/NeJS и он служил мне довольно долго в реальных проектах :) Это костыль, но всё же :) |
Часовой пояс GMT +3, время: 09:51. |