zen-coding:使用^提升DOM树的能力

Bil*_*oon 7 javascript regex coffeescript emmet

我分享了优秀的zen编码项目,想要使用^来实现DOM提升 - 所以你可以这样做:

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

最初我用相当粗制的正则表达式方法实现.我现在已经使用@ Jordan的优秀答案实现了.我的叉子在这里

我还想知道什么

有没有我的函数返回错误值的情况?

Jor*_*ray 4

免责声明:我从未使用过 zen-coding,这只是我第二次听说它,所以我不知道可能的陷阱是什么。也就是说,这似乎是一种可行的解决方案,或者至少非常接近于一种可行的解决方案。

我为此使用Zen Coding for textarea v0.7.1 。如果您使用不同版本的代码库,您将需要相应地调整这些说明。

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

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

    function isAllowedChar(ch) {
        ...
        special_chars = '#.>+*:$-_!@[]()|^'; // Added ascension operator "^"
    
    Run Code Online (Sandbox Code Playgroud)
  2. switch在函数语句中处理 new 运算符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;
    
    Run Code Online (Sandbox Code Playgroud)

    以下是新代码功能的逐行细分:

    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;
    
    Run Code Online (Sandbox Code Playgroud)

上面的实现按预期工作,例如:

function isAllowedChar(ch) {
    ...
    special_chars = '#.>+*:$-_!@[]()|^'; // Added ascension operator "^"
Run Code Online (Sandbox Code Playgroud)

毫无疑问,您会想尝试一些更高级的、真实的测试用例。如果您想要启动,这是我修改过的源代码;将您的替换zen_textarea.min.js为这个以进行一些快速而肮脏的测试。

请注意,这只是将 DOM 提升了两个级别,并且不会将前面的元素视为一个组,因此 egdiv>div^*3不会像(div>div)*3. 如果这是您想要的,那么请查看右括号字符的逻辑,它使用前瞻来检查乘法。(就我个人而言,我建议不要这样做,因为即使对于缩写语法来说,它也非常难以阅读。)