Wunderbar 可以轻松生成有效的 HTML5、格式良好的 XHTML、Unicode (utf-8)、一致缩进、可读的应用程序。
Wunderbar 受到 Jim Weirich 的 Builder 的启发,提供了元素 id 和类 id 语法,并基于 Markaby 的实现。
Wunderbar 的 JSON 支持受到 David Heinemeier Hansson 的 jbuilder 的启发。
教程正在开发中。
附加功能由扩展提供。
Wunderbar 的前提是,各种类型的输出通常是通过附加一系列键/值对或简单值形成的,并且应该针对这些操作进行优化。附加键/值对是通过以下方式完成的:
_key value
...并附加一个简单的值是这样完成的:
_ value
对于 HTML,元素节点使用键/值,文本节点使用简单值。对于 JSON,键/值用于哈希,简单值用于数组。对于文本,通过 put 输出简单值,并且不使用键/值对。
嵌套是使用块执行的。
下划线方法在不传递任何参数时返回一个可用于执行许多特殊功能的对象。其中一些功能是输出方法所独有的。其他诸如日志记录方法也很常见。
当传递多个参数或参数和块的组合时,下划线方法可以执行其他常见功能,具体取决于传递的参数的类型。
方法名称中的问号、感叹号和下划线后缀可能会修改结果。
简单元素:
_br
嵌套元素:
_div do
_hr
end
带有文本的元素:
_h1 "My weblog"
具有属性的元素:
_img src: '/img/logo.jpg', alt: 'site logo'
具有文本和属性的元素:
_a 'search', href: 'http://google.com'
具有布尔属性的元素:
_input 'Cheese', type: 'checkbox', name: 'cheese', checked: true
具有布尔属性的元素(替代形式):
_input 'Cheese', :checked, type: 'checkbox', name: 'cheese'
具有可选(省略)属性的元素:
_tr class: nil
文本(标记字符被转义):
_ "<3"
文本(可能包含标记):
_{"<em>hello</em>!!!"}
导入 HTML/XML:
_[Nokogiri::XML "<em>hello</em>"]
混合内容(自动调整间距):
_p do
_ 'It is a'
_em 'very'
_ 'nice day.'
end
混合内容(空间控制):
_p! do
_ 'Source is on '
_a 'github', href: 'https://github.com/'
_ '.'
end
在生成的 HTML 中的行之间插入空行:
_tbody do
_tr_ do
_td 1
end
_tr_ do
_td 2
end
_tr_ do
_td 3
end
end
捕获异常:
_body? do
raise NotImplementedError.new('page')
end
类属性快捷方式(相当于class="front"):
_div.front do
end
Id 属性快捷方式(相当于 id="search"):
_div.search! do
end
可以使用数组定义完整的列表/行:
_ul %w(apple orange pear)
_ol %w(apple orange pear)
_table do
_tr %w(apple orange pear)
end
可以对 Enumerables 进行任意迭代:
_dl.colors red: '#F00', green: '#0F0', blue: '#00F' do |color, hex|
_dt color.to_s
_dd hex
end
典型的主程序会生成 HTML、JSON 或纯文本输出中的一项或多项。这是通过提供以下一项或多项来完成的:
_html do
code
end
_xhtml do
code
end
_json do
code
end
_text do
code
end
_websocket do
code
end
每个中都可以放置任意 Ruby 代码。表单参数可用作实例变量(例如, @name
)。主机环境(CGI、Rack、Sinatra)值可作为_
对象的方法进行访问:例如_.headers
(CGI)、 _.set_cookie
(Rack)、 _.redirect
(Sinatra)。
要附加到生成的输出,请使用下面描述的_
方法。教程中提供了示例应用程序。
调用以 Unicode 低行字符(“_”)开头的方法将生成 HTML 标记。与该库所基于的构建器一样,这些标签可以具有文本内容和属性。标签也可以嵌套。逻辑可以自由混合。
Wunderbar 知道哪些 HTML 标签需要使用单独的结束标签显式关闭(例如: textarea
),以及哪些 HTML 标签永远不应该使用单独的结束标签关闭(例如: br
)。它还负责 HTML 引用以及参数和文本的转义。
标签名称后面的后缀将修改处理。
!
:关闭所有特殊处理,包括缩进?
:添加代码以挽救异常并生成回溯_
:在此标签和同级标签之间添加额外的空行“ _
”方法有多种用途。使用单个参数调用它会插入标记,尊重缩进。使用“ _ << text
”插入标记而不考虑缩进。定义了许多其他便利方法:
_
:插入缩进与当前输出匹配的文本_!
:插入文本而不缩进_.post?
-- 这是通过 HTTP POST 调用的吗?_.system
-- 调用 shell 命令,捕获 stdin、stdout 和 stderr_.submit
作为守护进程运行命令(或块)_.xhtml?
-- 输出为 XHTML? _.system
方法采用可选的哈希作为其最后一个参数。这可用于为底层 Process.spawn 方法提供设置。例如: ._system('pwd',{ system_opts: { chdir: dir } , system_env: { 'FOO' => 'BAR' } })
请注意,环境变量名称必须以字符串形式提供,而不是符号。可以与_.system
一起使用的其他选项包括:
:tag
- 用于输入/输出的 HTML 标签;默认为pre
:bundlelines
- 是否将给定输出类型(stderr、stdout 等)的所有行作为单个标记的一部分进行处理。如果未指定,则pre
标记默认为true
,否则默认false
。如果为false
,则单独处理每一行输出。可以通过这种方式访问所有构建器定义的方法(通常以感叹号结尾)和所有 Wunderbar 模块方法。示例:
_.tag! :foo
:插入名称可以是动态的元素_.comment! "text"
:添加评论_.error 'Log message'
: 将消息写入服务器日志元素和属性名称中的下划线将转换为破折号。要禁用此行为,请将属性名称表示为字符串并使用_.tag!
元素名称的方法。
XHTML 与 HTML 的不同之处在于内联样式和脚本元素的转义。 XHTML 也将回退到 HTML 输出,除非用户代理通过 HTTP Accept 标头指示它支持 XHTML。
除了元素、文本和属性的默认处理之外,Wunderdar 还定义了以下附加处理:
_head
: 插入元字符集 utf-8_svg
: 插入 svg 命名空间_math
:插入数学命名空间_coffeescript
: 将coffeescript转换为JS并插入script标签请注意,在标记名称末尾添加感叹号会禁用此行为。
如果_html
声明中传递的属性之一是:_width
,则将尝试重排文本以不超过此行宽。如果这会影响实际显示的内容,则不会这样做。
如果html
元素的子元素都不是head
或body
,那么将为您创建这些标签,并且相关子元素将移动到适当的部分。如果 body 包含h1
元素,并且head
不包含title
,则将根据提供给第一个h1
元素的文本创建 title 元素。
常见的操作是返回一个哈希值或一个值数组。哈希是一系列名称/值对,数组是一系列值。
Wunderbar . json do
_content format_content ( @message . content )
_ @message , :created_at , :updated_at
_author do
_name @message . creator . name . familiar
_email_address @message . creator . email_address_with_name
_url url_for ( @message . creator , format : :json )
end
if current_user . admin?
_visitors calculate_visitors ( @message )
end
_comments @message . comments , :content , :created_at
_attachments @message . attachments do | attachment |
_filename attachment . filename
_url url_for ( attachment )
end
end
调用以 Unicode 低行字符(“_”)开头的方法会将键/值对添加到该哈希中。哈希值也可以嵌套。逻辑可以自由混合。
“ _
”方法有多种用途。
使用多个参数调用它将导致第一个参数被视为对象,其余参数被视为要提取的属性
_ File.stat('foo'), :mtime, :size, :mode
使用单个 Enumerable 对象和块调用它将导致根据将枚举中的每个对象映射到块来返回一个数组
_([1,2,3]) {|n| n*n}
也可以使用_
方法构建数组:
_ 1
_ 2
_
方法返回正在构造的对象的代理。当不带参数调用时,这通常很方便。示例:
_.sort!
_['foo'] = 'bar'
使用_
方法追加到输出流,该方法相当于puts
。 _
方法返回一个代理输出流的对象,该对象提供对其他有用方法的访问,例如:
_.print 'foo'
_.printf "Hello %s!n", 'world'
WebSocket 支持需要安装em-websocket
。
Web 套接字是双向通道。 _.send
或_.push
可用于发送任意字符串。更常见的是,上述 JSON 数组方法都可以使用,重要的区别在于各个条目是在生成时单独发送的。
_.recv
或_.pop
可用于接收任意字符串。更常见的是, _.subscribe
用于注册用作回调的块。
_.system
将运行任意命令。输出行通过 websocket 发送,因为它们作为 JSON 编码的哈希值接收,具有两个值: type
是stdin
、 stdout
或stderr
之一;和包含该行本身的line
。如果命令是数组,则数组的元素将转义为 Shell 命令参数。嵌套数组可用于隐藏命令回显到标准输入的元素。省略 Nil 值。
_websocket
的选项以哈希形式提供:
:port
将选择一个端口号,默认情况下会为您选择一个可用的端口号。:sync
设置为false
将导致 WebSocket 服务器作为守护进程运行。从命令行运行时默认为true
,作为 CGI 运行时默认为false
。buffer_limit
将限制在开放请求中保留并发送到新客户端的条目数量。默认值为1
。值为零将禁用缓冲。值为nil
将导致无限缓冲。注意:在第一个客户端连接之前,缓冲实际上是不受限制的。 Wunderbar 将正确转义所有 HTML 和 JSON 输出,消除 HTML 或 JavaScript 注入问题。这包括调用_
来直接插入文本。除非之前需要nokogiri
(请参阅下面的可选依赖项),否则调用插入标记 ( _{...}
) 将转义标记。
$USER
- 主机用户 ID$PASSWORD
- 主机密码(如果通过了 CGI 和 HTTP_AUTHORIZATION)$HOME
- 主目录$SERVER
- 服务器名称$HOME
- 用户的主目录$HOST
- 服务器主机此外,如果尚未设置以下环境变量,则将其设置:
HOME
HTTP_HOST
LANG
REMOTE_USER
最后,默认的外部和内部编码设置为UTF-8。
_.debug
: 调试消息_.info
:信息性消息_.warn
: 警告消息_.error
: 错误消息_.fatal
: 致命错误消息_.log_level
=:设置日志记录级别(默认: :warn
)_.default_log_level
=:设置但不覆盖日志级别_.logger
: 返回 Logger 实例从命令行运行时,可以指定 CGI 名称=值对。此外,还支持以下选项:
--get
:预期 HTML (HTTP GET) 输出--post
:预期 HTML (HTTP POST) 输出--json
:期望 JSON(XML HTTP 请求)输出--html
: 强制 HTML 输出--prompt
或--offline
:使用标准输入提示输入键/值对--debug
、 --info
、 --warn
、 --error
、 --fatal
:设置日志级别--install=
path:生成一个可调用 suexec 的包装脚本--rescue
或--backtrace
导致包装器脚本捕获错误根据您使用的功能,需要以下 gem:
wunderbar/websocket
需要em-websocket
wunderbar/markdown
需要kramdown
ruby2js
添加了对以块形式编写的脚本的支持wunderbar/opal
需要sourcify
同名扩展需要以下 gem:
coderay
- 语法高亮opal
- ruby 到 javascript 编译器rack
- 网络服务器接口sinatra
- 用于创建 Web 应用程序的 DSL如果安装了以下 gem,将产生更干净、更漂亮的输出:
nokogiri
清理通过<<
和_{}
插入的 HTML 片段。nokogumbo
还清理通过<<
和_{}
插入的 HTML 片段。如果这个 gem 可用,它将优于直接使用nokogiri
。escape
system
命令的更漂亮的引用