Отказ от ответственности: Я никогда не использовал дзен-кодирование, и это только второй раз, когда я слышал об этом, поэтому я понятия не имею, каковы вероятные ошибки.Тем не менее, это кажется рабочим решением или, по крайней мере, очень близко к нему.
Я использую Zen Coding для textarea v0.7.1 для этого.Если вы используете другую версию кодовой базы, вам необходимо соответствующим образом адаптировать эти инструкции.
Несколько комментаторов предположили, что это не работа для регулярных выражений, и я согласен.К счастью, у zen-coding есть своя собственная реализация синтаксического анализатора, и ее действительно легко построить!Есть два места, где вам нужно добавить код для этой работы:
Добавьте символ ^ к переменной special_chars
в функции isAllowedChar
(начинается около строки 1694):
function isAllowedChar(ch) {
...
special_chars = '#.>+*:$-_!@[]()|^'; // Added ascension operator "^"
Обрабатывать новый оператор в операторе 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
.Если это то, что вам нужно, посмотрите на логику для символа закрывающей скобки, которая использует упреждения для проверки на умножение.(Лично я предлагаю не делать этого, поскольку даже для сокращенного синтаксиса это ужасно нечитаемо.)