编码:使用^来提升DOM树的能力

我分享了优秀的禅宗编码项目,并提出了使用^实现DOM提升的想法 - 所以你可以这样做:

html>head>title^body>h1而不是html>(head>title)+body>h1

最初我用相当低劣的正则表达式来实现。 我现在已经实施了@乔丹的出色答案。 我的叉子在这里

我仍然想知道的

有什么情况下我的函数返回错误的值?


免责声明:我从来没有使用过禅宗编码,这只是我第二次听说它,所以我不知道可能的问题是什么。 也就是说,这似乎是一个工作解决方案,或者至少非常接近于一个。

我正在使用Zen Coding for textarea v0.7.1。 如果您使用不同版本的代码库,则需要相应地修改这些指令。

一些评论者认为这不是正则表达式的工作,我同意。 幸运的是,zen-coding具有自己的解析器实现,并且构建起来非常简单! 有两个地方需要添加代码才能完成这项工作:

  • 将^字符添加到isAllowedChar函数中的special_chars变量(大约在第1694行开始):

    function isAllowedChar(ch) {
        ...
        special_chars = '#.>+*:$-_!@[]()|^'; // Added ascension operator "^"
    
  • parse函数的switch语句中处理新的运算符(从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 。 如果这是你想要的东西,然后看看闭合圆括号字符的逻辑,它使用向前检查乘法。 (个人而言,我建议不要这样做,因为即使是缩写语法也是非常难以理解的。)


    你应该用你正在使用的语言寻找Perl的Text :: Balanced选项。

    链接地址: http://www.djcxy.com/p/6021.html

    上一篇: coding: ability to ascend the DOM tree using ^

    下一篇: Unexpected Validate behavior with Moq