这种帖子,还是等楼主真正了解了 Rails 以及 Ruby 之后再发比较好。
我觉得这个问题到此为止吧。等我将来有空,详细分析 erb 代码,并测试后,我会单独开个帖子重新讨论这个问题。
呵呵,好吧,我知道你肯定有理由给我回复。 我暂时无法测试,除了 erb 中混了大量的逻辑之外,我承认也许还有其他潜在问题会影响输出缩进。 模板文件太多,我暂时也搞不清楚之间关系,也不确定模板中间是否有 (不应该有的) 耦合。我可以举个例子:
https://github.com/ruby-china/ruby-china/blob/master/app/views/common/_user_nav.html.erb
上面的代码来自 ruby-china, 我并不了解这个 erb 实现的具体功能,但是我诧异的是,这个 erb 代码中,凭空多出来两个混杂了大量逻辑代码的<%= end %>标签 , 在我看来,end 之应该是 条件 或 循环 或 do ... end 的结束标签才对,不是吗?现在凭空造出来两个 end 标签 (分别是:第 12 行到第 21 行,第 25 行到第 28 行), 我不确定这是一个 trick, 又或者和其他 erb 文件相呼应?又或者之前有方法隐式的生成起始标签?
无论那种情况,问题在于,这是 erb 文件,而不是 ruby 源码, erb 则会按照标签的闭合情况来来生成最终的 HTML 代码, 因此,缩进问题就产生了。
顺便提下,呵呵,这个 erb 文件中,还有一个<spanc>
标签写错了。好在这是一个内联元素,如果是一个块元素,包含其他元素,这肯定又是代码缩进的罪魁祸首了。
原本不打算回复,看你对我这么不满,还是解释下。
标题,内容不符的确是事实,不过,虽然主题混乱,不过归根结底,讨论的中心其实都是一个问题:代码风格是否规范,只不过在此表现出来的副作用是输出乱成一团糟,但是良好的代码风格,应该不仅仅是格式化输出好看这一个好处吧?
自以为是地认为排版 erb 输出的 HTML 就是编辑器里 html format 一下这么简单
你不要把别人的想的那么肤浅好不好?没有人是笨蛋,不过这个事情上,还就这么简单。就这么编辑器 format 一下,问题已经很确定了。而且我越来越肯定,你只要满足以下两点,缩进就不会有问题!
我现在真的开始担心起来了。
咱社区有没有人,之前有后来好起来的案例??
不敢用了。换了一个电脑,鼠标键盘和抽风一样乱点,再用下去 不定作出什么傻事儿来
#13 楼 @jimrokliu +1 #36 楼 @anklos +1
重复造轮子,长远来看,好处远远大于坏处,尤其是在中国,牛人众多,程序员人口数量也应该是世界第一吧。可为什么没有 Ruby, 没有自己的操作系统?根本层次的原因就是,没有人愿意造轮子!! 殊不知,轮子造着造着,就能造出更好的轮子,如果大家都不造,轮子永远是原来的轮子,而且你永远学不会造如何造轮子
中国人,说实话,就错在太聪明了,太聪明的人,往往就自以为是,不喜欢与人协作,聪明反被聪明误啊。聪明人不喜欢造轮子,所以我们落后,老外习惯搞开源,没完没了的造轮子,在咱们看来,那真是资源的极大浪费,殊不知,人家 100 个当中,就算失败了 90 个,也成功了 10 个,咱呢,一个也没去做,整天花心思搞内讧上了。空有一个庞大的人口基数,可是中国人对世界开源的贡献,连九牛一毛都算不上。
每次看到这种争论,以及现在盛行的普遍想法,或者说,这些想法对新人的误导 (或者说消极作用), 真的觉得很无奈,只要这种风气占主流,中国软件难有出头之日啊~
我支持楼主~
我觉得类似问题,肯定不只是这几个元素,如果把这些小问题
都揪出来的话,最终输出效果应该会有改观,erb 解析代码的方式,可没有浏览器那么智能对吧?(事先声明:我只是站在一个 rails 小白的角度考虑问题,所以可能和各位不太一样,哈哈)
是的,我的确没有看 erb 源码,不过既然能看到 HTML 输出,我一样知道问题在那里。
我刚开始是说缩进问题,没错,你说你只要保证源代码里整齐就好了,但是就算我不看 erb 源码,我也可以下结论,你的布局模板肯定缩进有问题。就算你排的再整齐,也是你纯手工排列的,绝对不是类似于 Emacs这样, 根据语法解析自动缩进
, 后者和浏览器以及 erb 文件的解析方式是一致的。
换个说法:因为 `布局模板' 一个很小的错误,即使看起来源码是对齐的 (你用手工对齐), 但是对于浏览器来说,始终是不对齐的。(如果是严格的标记语言,应该会把缺少闭合标签的那个 meta 和下面紧跟着的另一个 meta 元素的闭合标签算作一个元素).
说白了,就是你看着整齐,不代表浏览器看着整齐,你那个布局模板,放到 Emacs 的 html-mode 下自动格式化,肯定照样最下面的</html>
会多一个缩进。
XD, 严格不是错,相反是好事情,而且,XHTML 太严格,我想绝对不是从 XHTML 过渡到 HTML5 的原因吧?难道 HTML5 又要回归 HTML4 之前的自由主义,无约束的风格状态?
HTML5 要求同样是严格的。(看起来,咱社区使用 HTML5 DOCTYPE ? )
现在问题是:使用了那么多 META 标签,唯独有一个不闭合,代码解析能正确才怪。浏览器干了太多的这种费力不讨好的事情。
#3 楼 @huacnlee 没错,的确是在浏览器右键,直接查看的。我还没看过咱社区的 erb 源码。
#7 楼 @ntyangxd 如果问题真是你说的 each 或这 for -%>造成的,我认为定制编辑器就可以解决的。(我也的确是这么干的)
#8 楼 @willmouse Chrome 有你说的工具,只是不太习惯使用。另外,我看代码的初衷只是验证自己的一个小小想法,并不是要分析什么代码结构,我想总是还会遇到直接查看源码的情况吧。
我很纳闷,为什么 Agile 书里的示例,生成的 HTML 缩进非常整齐?我觉得可能还是跟有些不好的习惯有关 (我现在还不清楚), 又或者跟太多的 partial 混在一起有关?发这个帖子之后,我特地的查看个 github 生成的 HTML 源码,相当整齐,虽然也存在多余的空行的问题,但至少,对称的元素起始标签和闭合标签,缩进是相同的。
但是咱 Ruby-china 的源码,没有开发工具,完全读不下去。我尝试着复制 HTML 源码到 Emacs 的一 buffer 里面,并自动格式化了一下,稍微好看点了,不过最让我吃惊的是:标签并非完全对称,最后一个</html>
竟然和最初的<html>
缩进竟然不匹配!这幸好是 HTML , 如果是 XML , 出现了这种问题,能解析正确才怪!
我查看了下代码,发现问题出在:
<meta charset='utf-8' > # => 这里的标签没有闭合, 每个页面都如此! 模板问题.
也许你们觉得这不是问题,不过在我看来,这不就是从 HTML 过渡到 XHTML 的意义所在吗? 我觉得上面的错误就是生成的代码很凌乱的原因之一。因为从那一行之后的所有行的缩进,和之前都无法匹配。
公开开源项目,编码风格,缩进风格,真是一个很大的问题,对于别人参与进来,甚至只是简单的阅读,学习,造成很大的不便。
应该提前至少三天通知才是啊~
我觉得 hooopo 说的很对,难点不在于编写正则表达式,在于确定规则。
我觉得你们实现都有个前提:非要把复杂的逻辑通过一个`正则'来实现,为什么不能单独实现呢?
#8 楼 @huacnlee 华顺,我给个不错的建议,你可以通过执行多次 gsub 操作,然后把他们串成一串,就类似于设计模式中的组合模式一样,没必要一次就非要把最复杂的逻辑搞定吧...
我下面给个 shell 下的脚本实现,仅作参考:
command ruby -ip \
-e 'gsub(/([a-zA-Z])(?=\p{han})/, "\\1 ")' \ # => 如果汉字前面是英文, 在汉字前面加空格.
-e 'gsub(/(?<=\p{han})([a-zA-Z])/, " \\1")' \ # => 如果汉字后面是英文, 在汉字后面加空格.
"$@"
只要你制定出规则,你可以通过-e 添加任意多的逻辑。对吧?
很细心啊~ 不过 print nil 是不显示任何字符的。
我靠~ @huacnlee 我爱死你了!
这是我最期待的功能了。
还有就是,很多人一提起$?之类的符号,都会说:这些是从 Perl 那里集成过来的丑陋的部分,应该被抛弃。 事实上,有没有考虑过为什么 Perl 这门优秀的字符串处理语言,定义这么多奇怪的符号?因为 Perl 来自于 linux(我猜的,其实我根本没用过 Perl), 好吧,我承认,从 Windows 过来的程序员,肯定会觉得这些符号不可理喻,丑陋,不过还是那句话,之所以有这种感觉不怪 Perl, 因为 Perl 也是来源自 Linux, 只能怪你不了解 linux, 这才是本质原因。
不过我不排除个人习惯问题。呵呵,你既然熟悉 awk, sed. 还觉得这些符号丑陋,那就是习惯问题。