首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >链式html标记

链式html标记
EN

Stack Overflow用户
提问于 2011-06-10 07:43:58
回答 1查看 310关注 0票数 2

动机与问题

有几个库用于使用ruby生成html标记字符串(erb、haml、builder、markaby、tagz、.),但我对其中任何一个都不满意。原因是,除了erb之外,它们采用的是嵌套方式而不是链式风格。erb是一种将ruby嵌入到html中的方法,而不是用ruby生成html。

据我所知,红宝石的一个美丽之处在于鼓励使用链式风格:

代码语言:javascript
复制
receiver.method1(args1).method2(args2). ... method_n(args_n)

而不是采用嵌套的方式:

代码语言:javascript
复制
method_n(...method2(method1(receiver, args1), args2), ... args_n)

但是上面提到的库(除了erb)采用嵌套风格(有时借助块参数)。

我的想法

为了我自己的目的,我编写了一个方法dom,这样我就可以用链式进行html标记。当应用于字符串时,此示例

代码语言:javascript
复制
"This is a link to SO".dom(:a, href: "http://stackoverflow.com").dom(:body).dom(:html)

将产生:

代码语言:javascript
复制
<html><body><a href="http://stackoverflow.com";>This is a link to SO</a></body></html>

当应用于数组时,如下所示:

代码语言:javascript
复制
[
  ["a".dom(:td), "b".dom(:td)].dom(:tr),
  ["c".dom(:td), "d".dom(:td)].dom(:tr)
].dom(:table, border: 1)

会产生

代码语言:javascript
复制
<table border="1";>
  <tr>
    <td>"a"</td>
    <td>"b"</td>
  </tr>
  <tr>
    <td>"c"</td>
    <td>"d"</td>
  </tr>
<table>

如果应用时没有显式接收器(在字符串和数组域之外),

代码语言:javascript
复制
dom(:img, src: "picture.jpg", width: 48, height: 48)

会产生

代码语言:javascript
复制
<img src="picture.jpg";width="48";height="48";/>

请注意,所有这些都是通过一个方法dom完成的。这比使用其他库要简单得多。它也是灵活的,因为它不受html标签库存变化的影响;您只需使用符号参数来指定它。在其他库中,每个标记都有类和/或方法。此外,不像erb,它是纯红宝石。需要转换的不是DSL。

我的实现

执行情况如下:

代码语言:javascript
复制
class Hash
    def attribute
        map{|k, v| %Q{#{k}#{
            case v
            when TrueClass; ''
            when Hash;       %Q{="#{v.subattribute}"}
            else             %Q{="#{v}"}
            end
        ;}}}.join
    end
    def subattribute
        map{|k, v| %Q{#{k}:#{v};}}.join
    end
end

class Array
    def dom type, hash = {}
        "<#{type} #{hash.attribute}>\n#{join("\n").gsub(/^/, "  ")}\n</#{type}>"
    end
end

class String
    def dom type, hash = {}
        "<#{type} #{hash.attribute}>#{self}</#{type}>"
    end
end

class Object
    def dom type, hash = {}
        "<#{type} #{hash.attribute}/>"
    end
end

问题

已经有稳定的库可以做类似的事情了吗? approach)?

  • Some

  • 这种方法的潜在问题是什么(特别是我的实现或者在链式属性中这样做)--取布尔值,这些值经常被忽略。例如,<input type="text";readonly>而不是<input type="text";readonly="true">。在我目前的实现中,我可以通过将true (最终不会被使用)作为类似dom(:input, type: "text", readonly: true)这样的属性的值来实现这一点,但这似乎是多余的,也是代码中有case语句的原因之一,这使得它变得更慢。有更好的方法吗? implementation?有什么可能的改进吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-06-10 07:54:55

haml和大多数其他嵌套内容的主要原因是,基本上可以很容易地查看HTML是如何嵌套的。我假设是这样的,但是您实际上是编写HTML代码,还是做更多的后端工作?这样做的原因是,在嵌套样式中,您将看到元素是如何嵌套的(如果您也在编写样式,这对您很重要)。

虽然写起来很容易

代码语言:javascript
复制
 .dom(:body).dom(:html)

对于一个设计人员来说,如果不映射并尝试在他的头脑中可视化,就很难看到HTML是如何流动的,然而:

代码语言:javascript
复制
 %html
   %body

我只看了一眼就知道了。

不要以更长的例子为例:

代码语言:javascript
复制
 "This is a link to SO".dom(:a, href: "http://stackoverflow.com").dom(:body).dom(:html)

如果客户端或者您需要在链接中添加一个可点击的图像,您会更容易吗?你会怎么做呢?在哈梅尔,这是很容易的,因为:

代码语言:javascript
复制
 %html
   %body
     %a{:href => "blah"}
       = image_tag("image.png")

而且,IMHO为每个html标记编写dom(:)就像为它编写结束标记一样繁琐( HAML和其他标记是固定的)。

同样,这些只是我从XHTML/CSS程序员(而不是ruby程序员的角度)的观点。

最后,我也认为这可以转化为一个社区wiki或者什么的,因为这不值得一个确切的答案,而且可能会产生很多像这个这样的主观问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6303400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档