-
Notifications
You must be signed in to change notification settings - Fork 27
Attribute Syntax
attribute的语法其实我反复考虑和纠结过。像script和style要加上 ! 也是由于attribute的设计原则导致的。
jade的方式:
E(attr1=xxx, attr2=xxx ...)
我自己的体会,这个设计的主要缺点有:
-
单行时属性间必须用逗号分割,对于习惯HTML的作者来说常常会忘记。 与Jade的其他设计不同,Jade的大多数地方都是在做减法,少写东西其实比较容易适应,而多写东西其实就比较难适应。而且从书写连贯性来说, 通常我会写一大段Jade代码再刷新页面看效果,而这导致逗号一漏通常会漏好多好多,一个一个去补是一件较令人抓狂的事情。
-
多行时可以不用逗号。但这导致我在调整多行到一行时往往漏掉逗号。从一行调整到多行时我又忍不住去删除逗号(这种代码洁癖估计不止我一个人有)。根据code变化而反复调整所带来的繁琐和因此多出的debug导致的烦躁感,对我的心理产生了严重刺激——这并不是说笑,因为我对代码排版格式也是比较讲究的,而Jade的这处设计增大了我调整代码格式的成本(这种成本比想象的大,参考第3点)。尤其是Jade的其他语法设计都很简洁,这更反过来凸显了这个缺陷。
-
属性以括号包裹,如前所述,我常常忘记括号。更准确的说,起始括号通常不会忘记,【但它存在另一问题,就是括号前如果有空格就不作为属性,而是变成了文本,这个问题后续还会提到。】但是结束括号往往容易忘记,尤其在复制黏贴一段属性并一个一个加逗号时,加到最后忘记结束括号了。而Jade的语法决定了闭合括号的缺失并不会在该点报错!!!后续的元素会被作为属性被解析,直到最后无法匹配到结束括号的那个点!而这对于调试来说很痛苦。 其实这个问题相信Jade社区自己也注意到了,因此
另外,即使对上述问题做部分修改,有一个重要的考虑,即归根到底,jade的属性写法其实是在整个基于缩进的语法中开了一个口子,attribute的部分其实并不遵循offside-rule,而是基于括号的匹配。
缩进语法的很大好处之一就是取消了定界符,因此可以做到语法上的简洁。但是现在留了一个例外,其实就必然会造成如第3点的问题,这是一个几乎无法调和的矛盾。
因此,考虑再三后我决心必须保持缩进语法的一致性,也就是不会为属性设置任何定界符。在此基础上,我考虑过三种可能的语法方案:
一种是类CSS的方式:
a
[href='/home'][rel='nofollow']
[target='_blank']
另一种就是现在用@作为属性前缀的方案。 @attr这是XML社区的习惯,也是许多原生支持xml的语言里表达xml属性的语法,如 XPath、E4X(JavaScript的XML原生支持扩展)等。
还有一种是独立的缩进级别:
a
:attributes
href='/home'
rel='nofollow'
我考虑下来,[attr]语法比@attr并没有什么额外优点,且输入比较繁琐。而独立缩进也没有提供什么特别好处,尤其是其实许多情况下属性写在与元素同一行更方便。
因此最终我选择了现在的方式,即用@前缀,然后每个属性可以写在单独一行上,也支持与元素名同一行的紧凑写法。可以自由调整单行或多行格式。