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
命令的更漂亮的引用