09 October 2014

备注: 文章中的内容需要进一步修改和整理,最后,才能成文。

人活着怎么能够没有爱,erb就是没有爱的标签语言。而Haml,满满的都是爱。

Haml的官方网站: http://haml.info/ ; github代码库: https://github.com/haml/haml

照着手册改erb为haml,遇到的第一个问题是:

  1. Ruby代码中的end不是必须的,使用缩进解决问题
  2. syntax error, unexpected keyword_class, expecting keyword_do or '{' or '(' 这样的错误是因为括号没有闭合的原因。
  3. 由于使用缩进作为标签闭合的方式,所以,存在TAB和空格的区别的问题,这种问题会导致编译错误。具体的就是,空格和制表混用的时候,会出错。解决方法:g/\t/s// /g
  4. 由于render部分视图的原因,所以会出现一些在index中的语法错误,现在所能想到的方法是,使用haml对那个部分视图进行编译,然后,找到其错误的行号。

一些全局替换(由erb到haml)的命令:

g/<%/s///g
g/%>/s///g
g/<t/s//%t/g
g/\t/s//  /g
g/<\/t[h|d]>/s///g
g/>=/s//=/g
g/<\/.*/s///g
g/">/s//")/g

特定文件的导航文件的替换命令:

g/<u/s//%u/g
g/<l/s//%l/g
g/<i/s//%i/g
g/">/s//")/g
g/<span>/s//%span /g
g/= ' active/s//#{' active/g

每次都使用vim的ex-mode进行替换,文件有非常的多,并相当的繁琐。决定使用sed批量的进行文件的替换(试用了一下,效果好可以):

sed -i 's/<%//' **/*.haml ; sed -i 's/%>//' **/*.haml ; sed -i 's/\t/  /' **/*.haml
sed -i 's/">/")/' **/*.haml

index特定的文件的替换:

sed -i ‘s/<t/%t/’ **/index.html.haml ; sed -i ‘s/>=/=/’ **/index.html.haml

nav文件的替换

sed -i 's/<u/%u/' **/_nav.html.haml ; sed -i 's/<l/%l/' **/_nav.html.haml ; sed -i 's/<i/%i/' **/_nav.html.haml ; sed -i 's/<span>/%span /' **/_nav.html.haml ; sed -i 's/= ' active/#{' active/' **/_nav.html.haml
sed -i "s/= " active/#{' active/" **/_nav.html.haml
sed -i "s/' \"/'}\"/" **/_nav.html.haml
sed -i "s/^ cpanel/- cpanel/" **/*.haml
sed -i "s/<\/i> %span/%span/" **/_nav.html.haml
sed -i "s/<\/.*//" **/*.haml

g/<%/s///g
g/%>/s///g
g/<t/s//%t/g
g/\t/s//  /g
g/<\/t[h|d]>/s///g
g/>=/s//=/g
g/<\/.*/s///g
g/">/s//")/g
g/>$/s///g
## 针对常见的_nav中建立的替换命令
g/<u/s//%u/g
g/<l/s//%l/g
g/<i/s//%i/g
g/">/s//")/g
g/<span>/s//%span /g
g/= ' active/s//#{' active/g
g/' "/s//'}"/g
g/i /s//i(/g
g/<\/i> /s//\r/g
g/^ *$/,d
g/<div\ class="/s//\./g
g/")$/s///g

想要删除空白行,尝试命令:

sed -i “s/^ $//” **/.haml sed -i “s/th class="menu_actions"/th(class="menu_actions")/” **/index.html.haml

执行之后,发现这是个替换命令,没有得到想要的结果,查找了一下sed删除行的方法。

sed -i "/^ *$/d"  **/*.haml
sed -i "/^ *end *$/d"  **/*.haml

syntax error, unexpected ‘)’ 往往是因为缩进不合理,不能解析。

多条sed命令执行之间会存在一定问题。

使用单引号(‘‘)将替换表达式包裹起来时,如果替换表达式中也包含单引号,就会出错,此时,需要使用双引号(“”),双引号表达式中包含双引号时,需要用\转义。

缩进不合理就会报错。

vim中删除空行: g/^ *$/,d

由于需要批量的执行这些ex命令,所以想知道是否存在批量执行这些命令的方式。结果,找到了ex-mode的这个方法,可以不用每次输入:, 进入该模式的方法的命令为gQ

觉得VIM中的正则匹配稍微有点怪,可能我对正则表达式的掌握也是有些问题的,匹配</td>这样的文本需要<\/.*这样的表达式,\w+好像都不太管用。

爱是盲目的,不产生任何价值的。后台用erb写也没什么太大的问题,要改成haml,就要进行各种复杂的文本替换。

干啥事都会存在倦怠期,尤其是在处理erb转换为haml的半山腰上。

盲目的追求新的东西不见得好,将erb切换为haml,替换了542个文件,中间又包含了排除一些明显的bug,确实花费了相当长的时间。繁琐的事情的自动化处理,强大且繁琐的需求面前,使用的工具的急剧的变化,凡是逼一逼自己,或许会有好的结果。




傲娇的使用Disqus