Wunderbar を使用すると、有効な HTML5、整形式の XHTML、Unicode (utf-8)、一貫してインデントされた読みやすいアプリケーションを簡単に作成できます。
Wunderbar は Jim Weirich の Builder からインスピレーションを受けており、Markaby の実装に基づいて要素 ID とクラス ID の構文を提供します。
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
Enumerable に対して任意の反復を実行できます。
_dl.colors red: '#F00', green: '#0F0', blue: '#00F' do |color, hex|
_dt color.to_s
_dd hex
end
一般的なメイン プログラムは、1 つ以上の HTML、JSON、またはプレーン テキスト出力を生成します。これは、次の 1 つ以上を提供することで実現されます。
_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 タグが生成されます。このライブラリのベースとなる builder と同様に、これらのタグにはテキストのコンテンツと属性を含めることができます。タグはネストすることもできます。ロジックは自由に組み合わせることができます。
Wunderbar は、どの HTML タグを個別の終了タグで明示的に閉じる必要があるか (例: textarea
)、どの HTML タグを個別の終了タグで閉じるべきではないか (例: br
) を認識します。また、引数とテキストの HTML の引用とエスケープも処理します。
タグ名の後のサフィックスは処理を変更します。
!
: インデントを含むすべての特別な処理をオフにします。?
: 例外をレスキューし、トレースバックを生成するコードを追加します。_
: このタグと兄弟の間に余分な空白行を追加します。 「 _
」メソッドはさまざまな目的に役立ちます。単一の引数を指定して呼び出すと、インデントを考慮してマークアップが挿入されます。インデントに関係なくマークアップを挿入するには、「 _ << text
」を使用します。他にもいくつかの便利なメソッドが定義されています。
_
: 現在の出力と一致するインデントでテキストを挿入します。_!
: インデントせずにテキストを挿入します_.post?
-- これは HTTP POST 経由で呼び出されましたか?_.system
-- シェル コマンドを呼び出し、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 と異なります。ユーザー エージェントが HTTP Accept ヘッダーを介して XHTML をサポートしていることを示さない限り、XHTML は HTML 出力に戻ります。
要素、テキスト、属性のデフォルトの処理に加えて、Wunderdar は次の追加処理を定義します。
_head
: メタ文字セット utf-8 を挿入します_svg
: SVG 名前空間を挿入_math
: math 名前空間を挿入します。_coffeescript
: Coffeescript を JS に変換し、script タグを挿入しますタグ名の末尾に感嘆符を追加すると、この動作が無効になることに注意してください。
_html
宣言で渡される属性の 1 つが:_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
任意のコマンドを実行します。出力行は、次の 2 つの値を持つ JSON エンコードされたハッシュとして受信されると、WebSocket 経由で送信されます。 type
stdin
、 stdout
、またはstderr
のいずれかです。および行自体を含むline
。コマンドが配列の場合、配列の要素はシェル コマンド引数としてエスケープされます。入れ子になった配列を使用して、標準入力へのコマンドのエコーから要素を隠すことができます。 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 が必要になります。
em-websocket
wunderbar/websocket
で必要ですkramdown
wunderbar/markdown
で必要ですruby2js
ブロックとして書かれたスクリプトのサポートを追加しますwunderbar/opal
ではsourcify
が必要です次の gem は、同じ名前の拡張機能に必要です。
coderay
- 構文の強調表示opal
- Ruby から JavaScript へのコンパイラrack
- Webサーバーインターフェイスsinatra
- Web アプリケーション作成用の DSL次の gem がインストールされている場合、よりクリーンできれいな出力が生成されます。
nokogiri
<<
と_{}
を介して挿入された HTML フラグメントをクリーンアップします。nokogumbo
<<
と_{}
を介して挿入された HTML フラグメントもクリーンアップします。この gem が利用可能な場合は、 nokogiri
を直接使用するよりも優先されます。system
コマンドのより適切な引用符escape