zen-coding: способность подниматься по дереву DOM, используя ^ - PullRequest
7 голосов
/ 01 апреля 2011

Я разработал отличный проект дзен-кодирования с идеей реализовать восхождение DOM с помощью ^ - так что вы можете сделать:

html>head>title^body>h1 вместо html>(head>title)+body>h1

Изначально я реализовал довольно неаккуратные методы регулярных выражений.Теперь я реализовал, используя отличный ответ @ Jordan.Мой ответвление здесь

Что я еще хочу знать

Есть ли сценарии, в которых моя функция возвращает неправильное значение?

Ответы [ 2 ]

4 голосов
/ 09 февраля 2012

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

Я использую Zen Coding для textarea v0.7.1 для этого.Если вы используете другую версию кодовой базы, вам необходимо соответствующим образом адаптировать эти инструкции.

Несколько комментаторов предположили, что это не работа для регулярных выражений, и я согласен.К счастью, у zen-coding есть своя собственная реализация синтаксического анализатора, и ее действительно легко построить!Есть два места, где вам нужно добавить код для этой работы:

  1. Добавьте символ ^ к переменной special_chars в функции isAllowedChar (начинается около строки 1694):

    function isAllowedChar(ch) {
        ...
        special_chars = '#.>+*:$-_!@[]()|^'; // Added ascension operator "^"
    
  2. Обрабатывать новый оператор в операторе switch функции parse (начинается около строки 1541):

    parse: function(abbr) {
        ...
        while (i < il) {
            ch = abbr.charAt(i);
            prev_ch = i ? abbr.charAt(i - 1) : '';
            switch (ch) {
                ...
                // YOUR CODE BELOW
                case '^': // Ascension operator
                    if (!text_lvl && !attr_lvl) {
                        dumpToken();
                        context = context.parent.parent.addChild();
                    } else {
                        token += ch;
                    }
                    break;
    

    Вот построчная разбивка того, что делает новый код:

    case '^':                         // Current character is ascension operator.
        if (!text_lvl && !attr_lvl) { // Don't apply in text/attributes.
            dumpToken();              // Operator signifies end of current token.
    
                                      // Shift context up two levels.
            context = context.parent.parent.addChild();
    
        } else {
            token += ch;              // Add char to token in text/attribute.
        }
        break;
    

Вышеприведенная реализация работает, как и ожидалось, например:

html>head>title^body
html:5>div#first>div.inner^div#second>div.inner
html:5>div>(div>div>div^div)^div*2
html:5>div>div>div^^div

Вы, несомненно, захотите попробовать несколько более сложных, реальных тестовых примеров. Вот мой модифицированный источник , если вы хотите начать с начала;замените ваш zen_textarea.min.js на это для некоторого быстрого и грязного тестирования.

Обратите внимание, что это просто поднимает DOM на два уровня и не рассматривает предыдущие элементы как группу, поэтому, например, div>div^*3 не будетработать как (div>div)*3.Если это то, что вам нужно, посмотрите на логику для символа закрывающей скобки, которая использует упреждения для проверки на умножение.(Лично я предлагаю не делать этого, поскольку даже для сокращенного синтаксиса это ужасно нечитаемо.)

0 голосов
/ 05 июня 2011

Вам следует искать альтернативу Perl Text :: Balanced на языке, который вы используете.

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