编码:使用^来提升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