• 这种帖子,还是等楼主真正了解了 Rails 以及 Ruby 之后再发比较好。

  • 我觉得这个问题到此为止吧。等我将来有空,详细分析 erb 代码,并测试后,我会单独开个帖子重新讨论这个问题。

  • #47 楼 @huacnlee

    呵呵,好吧,我知道你肯定有理由给我回复。 我暂时无法测试,除了 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>标签写错了。好在这是一个内联元素,如果是一个块元素,包含其他元素,这肯定又是代码缩进的罪魁祸首了。

  • #45 楼 @dotnil

    原本不打算回复,看你对我这么不满,还是解释下。

    标题,内容不符的确是事实,不过,虽然主题混乱,不过归根结底,讨论的中心其实都是一个问题:代码风格是否规范,只不过在此表现出来的副作用是输出乱成一团糟,但是良好的代码风格,应该不仅仅是格式化输出好看这一个好处吧?

    自以为是地认为排版 erb 输出的 HTML 就是编辑器里 html format 一下这么简单
    

    你不要把别人的想的那么肤浅好不好?没有人是笨蛋,不过这个事情上,还就这么简单。就这么编辑器 format 一下,问题已经很确定了。而且我越来越肯定,你只要满足以下两点,缩进就不会有问题!

    • 所有的空元素自闭合,块元素一定要包含配对的闭合标签。
    • 具有多个参数或复杂哈希参数的 helper 方法,所有参数使用括号括起来 (不要学 Agile 中 Dave Thoms 的风格) , erb 输出可没有浏览器那么宽容,大度。
  • 我现在真的开始担心起来了。

    咱社区有没有人,之前有后来好起来的案例??

  • #17 楼 @googya

    我的解释没有问题你的。没有 print 怎么输出偶数行的内容啊?

    你再想想吧,我真的觉得可能是我的代码把你们搞晕了...

  • #4 楼 @robin

    说实话~ Thinkpad 应该好点,我有个 T43p, 现在用的就是,除了散热,啥毛病没有出过。

    我现在出问题的是 HP 2530p . 现在我都不敢用,就在那里晾着呢。

  • #14 楼 @hooopo

    汗~ 可惜你公布的是错误的答案,我觉得你一定是被我这段代码给误导了. 具体问题你自己找。给你个提示: 找 Ruby 的男人,问他有关-p 的事情

  • #3 楼 @hooopo #4 楼 @chinacheng
    #11 楼 @jjym #12 楼 @cantin

    公布标准答案,以上代码等价于:

    while gets    # =>  第一次读
      gets          # =>  第二次读
      print $_      # => 输出第二次读取的结果. 外围循环以及这个print就是-p干的事情.
    end 
    
  • 不敢用了。换了一个电脑,鼠标键盘和抽风一样乱点,再用下去 不定作出什么傻事儿来

  • #13 楼 @jimrokliu +1 #36 楼 @anklos +1

    重复造轮子,长远来看,好处远远大于坏处,尤其是在中国,牛人众多,程序员人口数量也应该是世界第一吧。可为什么没有 Ruby, 没有自己的操作系统?根本层次的原因就是,没有人愿意造轮子!! 殊不知,轮子造着造着,就能造出更好的轮子,如果大家都不造,轮子永远是原来的轮子,而且你永远学不会造如何造轮子

    中国人,说实话,就错在太聪明了,太聪明的人,往往就自以为是,不喜欢与人协作,聪明反被聪明误啊。聪明人不喜欢造轮子,所以我们落后,老外习惯搞开源,没完没了的造轮子,在咱们看来,那真是资源的极大浪费,殊不知,人家 100 个当中,就算失败了 90 个,也成功了 10 个,咱呢,一个也没去做,整天花心思搞内讧上了。空有一个庞大的人口基数,可是中国人对世界开源的贡献,连九牛一毛都算不上。

    每次看到这种争论,以及现在盛行的普遍想法,或者说,这些想法对新人的误导 (或者说消极作用), 真的觉得很无奈,只要这种风气占主流,中国软件难有出头之日啊~

  • 我支持楼主~

  • #37 楼 @Rei

    可以考虑以下方案:

    • 搜集整理所有可能出错的标签,编写个 Ruby 脚本,直接针对所有的 erb gsub 一遍就完了,不过可能会考虑不周的问题。

    • 找个支持标签语法缩进的编辑器,针对所有的 erb 文件运行下自动缩进,凡是排不整齐的,都有类似问题。找出来,修改之,并单独测试,这样的话比较稳妥。

    我有心自己去弄,不过 rails 水平 还太初级,怕引起其他不必要的错误,再过几个月时间经验丰富了,我也期望能给咱社区贡献代码。

  • 我觉得类似问题,肯定不只是这几个元素,如果把这些小问题 都揪出来的话,最终输出效果应该会有改观,erb 解析代码的方式,可没有浏览器那么智能对吧?(事先声明:我只是站在一个 rails 小白的角度考虑问题,所以可能和各位不太一样,哈哈)

  • #30 楼 @Rei #34 楼 @huacnlee

    好啦,你们知道,我其是不是那个意思的。什么群嘲之类的。只是发帖有些随意。下回我注意就是了。

    我还发现一个小问题:

    <fieldset>
    

    这个标签也没有闭合。

  • #25 楼 @Rei

    我承认我偏题了,呵呵,因为我常常讨论偏题。代码格式化排列问题,我的确没看源码,我只是推测,如果标签能够正常匹配的话,应该只有空元素 或 多余的空白行,会出现缩进问题,块元素 至少是一个同一个模板内生成的块元素,缩进应该是严格匹配的。但事实上并不是这样。

    说起编辑器,现在觉得,其实讨论的是另一个话题,就算跟 erb 输出缩进无关,不过跟 布局模板 中 漏掉了一个 闭合标签 多少还有点关系,对吧?毕竟,如果常常格式化代码 (甚至编辑器自动格式化代码), 这个问题早就该发现的。

  • #23 楼 @huacnlee

    是的,我的确没有看 erb 源码,不过既然能看到 HTML 输出,我一样知道问题在那里。

    我刚开始是说缩进问题,没错,你说你只要保证源代码里整齐就好了,但是就算我不看 erb 源码,我也可以下结论,你的布局模板肯定缩进有问题。就算你排的再整齐,也是你纯手工排列的,绝对不是类似于 Emacs这样, 根据语法解析自动缩进 , 后者和浏览器以及 erb 文件的解析方式是一致的。

    换个说法:因为 `布局模板' 一个很小的错误,即使看起来源码是对齐的 (你用手工对齐), 但是对于浏览器来说,始终是不对齐的。(如果是严格的标记语言,应该会把缺少闭合标签的那个 meta 和下面紧跟着的另一个 meta 元素的闭合标签算作一个元素).

    说白了,就是你看着整齐,不代表浏览器看着整齐,你那个布局模板,放到 Emacs 的 html-mode 下自动格式化,肯定照样最下面的</html>会多一个缩进。

  • #15 楼 @huacnlee

    这怎么成了无关紧要的事情,上下总共五六个 meta 标签,唯独一个少了个闭合标签,并由此,让每一个访问 Ruby-china 的浏览器都需要额外的来处理下这个 `非常规情况' , 只需要代码风格统一一点 (增加闭合标签), 浏览器会少做了很多费力不讨好的工作,格式化输出结果也应该比原来要好很多。

  • #10 楼 @Juanito

    XD, 严格不是错,相反是好事情,而且,XHTML 太严格,我想绝对不是从 XHTML 过渡到 HTML5 的原因吧?难道 HTML5 又要回归 HTML4 之前的自由主义,无约束的风格状态?

    @zhangyuan

    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 的意义所在吗? 我觉得上面的错误就是生成的代码很凌乱的原因之一。因为从那一行之后的所有行的缩进,和之前都无法匹配。

  • 公开开源项目,编码风格,缩进风格,真是一个很大的问题,对于别人参与进来,甚至只是简单的阅读,学习,造成很大的不便。

  • 应该提前至少三天通知才是啊~

  • #9 楼 @hooopo

    我觉得 hooopo 说的很对,难点不在于编写正则表达式,在于确定规则。

    #5 楼 @quakewang #6 楼 @saberma

    我觉得你们实现都有个前提:非要把复杂的逻辑通过一个`正则'来实现,为什么不能单独实现呢?

    #8 楼 @huacnlee 华顺,我给个不错的建议,你可以通过执行多次 gsub 操作,然后把他们串成一串,就类似于设计模式中的组合模式一样,没必要一次就非要把最复杂的逻辑搞定吧...

    我下面给个 shell 下的脚本实现,仅作参考:

    command ruby -ip \
    -e 'gsub(/([a-zA-Z])(?=\p{han})/, "\\1 ")' \    # => 如果汉字前面是英文, 在汉字前面加空格.
    -e 'gsub(/(?<=\p{han})([a-zA-Z])/, " \\1")' \   # => 如果汉字后面是英文, 在汉字后面加空格.
    "$@"        
    

    只要你制定出规则,你可以通过-e 添加任意多的逻辑。对吧?

  • #32 楼 @hlcfan

    不过装的系统是 linux.

  • #7 楼 @chinacheng

    很细心啊~ 不过 print nil 是不显示任何字符的。

  • 关注帖子功能上线 at 2012年05月14日

    我靠~ @huacnlee 我爱死你了!

    这是我最期待的功能了。

  • Ruby One-Liners at 2012年05月13日

    #6 楼 @hooopo

    期待学习你的帖子。

  • Ruby One-Liners at 2012年05月13日

    #5 楼 @camel

    还有就是,很多人一提起$?之类的符号,都会说:这些是从 Perl 那里集成过来的丑陋的部分,应该被抛弃。 事实上,有没有考虑过为什么 Perl 这门优秀的字符串处理语言,定义这么多奇怪的符号?因为 Perl 来自于 linux(我猜的,其实我根本没用过 Perl), 好吧,我承认,从 Windows 过来的程序员,肯定会觉得这些符号不可理喻,丑陋,不过还是那句话,之所以有这种感觉不怪 Perl, 因为 Perl 也是来源自 Linux, 只能怪你不了解 linux, 这才是本质原因。

    不过我不排除个人习惯问题。呵呵,你既然熟悉 awk, sed. 还觉得这些符号丑陋,那就是习惯问题。

  • Ruby One-Liners at 2012年05月13日

    #5 楼 @camel

    awk 不熟,只会最简单的用法,sed 因为编辑器的缘故专门研究过,不过说实话,听丑陋,不过我还挺喜欢用。哈哈 , 正如 hooopo 所说,你觉得 Ruby 里面的$之流很丑陋,我觉得可能是你用 linux 少一些。事实上因为我使用 Ruby 之前,有专门学习 linux 的经历,所以 Ruby 中的所有$类型变量,给我的感觉就是俩字亲切_, 而且,几乎记住所有的这些特殊符号,对我来说完全没有任何压力,你有没有想过为什么后面偏偏要是那个字符?而不是其他字符?只有了解 linux 之后,你绝对会有自己的答案。而且使用这些特殊符号,也会让你编写的代码简练很多。