Wunderbar memudahkan pembuatan HTML5 yang valid, XHTML dengan format yang baik, Unicode (utf-8), aplikasi yang menjorok ke dalam secara konsisten, dan dapat dibaca.
Wunderbar terinspirasi oleh Builder Jim Weirich, dan menyediakan sintaks id elemen dan id kelas serta berdasarkan implementasi dari Markaby.
Dukungan JSON Wunderbar terinspirasi oleh jbuilder David Heinemeier Hansson.
Tutorial sedang dalam pengembangan.
Fungsionalitas tambahan disediakan oleh ekstensi.
Premis Wunderbar adalah bahwa berbagai jenis keluaran biasanya dibentuk dengan menambahkan serangkaian pasangan kunci/nilai atau nilai sederhana, dan operasi tersebut harus dioptimalkan. Menambahkan pasangan kunci/nilai dilakukan melalui:
_key value
... dan menambahkan nilai sederhana dilakukan sebagai berikut:
_ value
Untuk HTML, kunci/nilai digunakan untuk node elemen, dan nilai sederhana digunakan untuk node teks. Untuk JSON, kunci/nilai digunakan untuk Hash dan nilai sederhana digunakan untuk array. Untuk teks, nilai sederhana dikeluarkan melalui put, dan pasangan kunci/nilai tidak digunakan.
Nesting dilakukan dengan menggunakan blok.
Metode garis bawah, jika tidak ada argumen yang diberikan, akan mengembalikan objek yang dapat digunakan untuk melakukan sejumlah fungsi khusus. Beberapa fungsi tersebut unik untuk metode keluaran. Metode logging lainnya adalah hal yang umum.
Metode garis bawah ketika meneruskan beberapa argumen atau kombinasi argumen dan sebuah blok dapat menjalankan fungsi umum lainnya, bergantung pada jenis argumen yang diteruskan.
Tanda tanya, tanda seru, dan akhiran garis bawah pada nama metode dapat mengubah hasil.
Elemen sederhana:
_br
Elemen bersarang:
_div do
_hr
end
Elemen dengan teks:
_h1 "My weblog"
Elemen dengan atribut:
_img src: '/img/logo.jpg', alt: 'site logo'
Elemen dengan teks dan atribut:
_a 'search', href: 'http://google.com'
Elemen dengan atribut boolean:
_input 'Cheese', type: 'checkbox', name: 'cheese', checked: true
Elemen dengan atribut boolean (bentuk alternatif):
_input 'Cheese', :checked, type: 'checkbox', name: 'cheese'
Elemen dengan atribut opsional (dihilangkan):
_tr class: nil
Teks (karakter markup di-escape):
_ "<3"
Teks (mungkin berisi markup):
_{"<em>hello</em>!!!"}
Impor HTML/XML:
_[Nokogiri::XML "<em>hello</em>"]
Konten campuran (spasi otomatis):
_p do
_ 'It is a'
_em 'very'
_ 'nice day.'
end
Konten campuran (ruang dikontrol):
_p! do
_ 'Source is on '
_a 'github', href: 'https://github.com/'
_ '.'
end
Sisipkan baris kosong di antara baris dalam HTML yang dihasilkan:
_tbody do
_tr_ do
_td 1
end
_tr_ do
_td 2
end
_tr_ do
_td 3
end
end
Pengecualian pengambilan:
_body? do
raise NotImplementedError.new('page')
end
Pintasan atribut kelas (setara dengan class="front"):
_div.front do
end
Pintasan atribut id (setara dengan id = "pencarian"):
_div.search! do
end
Daftar/baris lengkap dapat ditentukan menggunakan array:
_ul %w(apple orange pear)
_ol %w(apple orange pear)
_table do
_tr %w(apple orange pear)
end
Iterasi sewenang-wenang dapat dilakukan pada Enumerables:
_dl.colors red: '#F00', green: '#0F0', blue: '#00F' do |color, hex|
_dt color.to_s
_dd hex
end
Program utama pada umumnya menghasilkan satu atau lebih keluaran HTML, JSON, atau teks biasa. Hal ini dicapai dengan menyediakan satu atau lebih hal berikut:
_html do
code
end
_xhtml do
code
end
_json do
code
end
_text do
code
end
_websocket do
code
end
Kode Ruby sewenang-wenang dapat ditempatkan di masing-masing. Parameter formulir tersedia sebagai variabel instan (misalnya, @name
). Nilai lingkungan host (CGI, Rack, Sinatra) dapat diakses sebagai metode objek _
: misalnya _.headers
(CGI), _.set_cookie
(Rack), _.redirect
(Sinatra).
Untuk menambahkan output yang dihasilkan, gunakan metode _
yang dijelaskan di bawah. Contoh aplikasi ada di tutorial.
Memanggil metode yang dimulai dengan karakter baris rendah Unicode ("_") akan menghasilkan tag HTML. Seperti halnya pembuat, yang menjadi dasar perpustakaan ini, tag ini dapat memiliki konten teks dan atribut. Tag juga bisa disarangkan. Logika dapat dicampur secara bebas.
Wunderbar mengetahui tag HTML mana yang perlu ditutup secara eksplisit dengan tag akhir terpisah (contoh: textarea
), dan mana yang tidak boleh ditutup dengan tag akhir terpisah (contoh: br
). Ini juga menangani kutipan HTML dan keluar dari argumen dan teks.
Akhiran setelah nama tag akan mengubah pemrosesan.
!
: mematikan semua pemrosesan khusus, termasuk indentasi?
: menambahkan kode untuk menyelamatkan pengecualian dan menghasilkan penelusuran balik_
: menambahkan baris kosong tambahan antara tag ini dan saudaranya Metode " _
" mempunyai beberapa tujuan. Menyebutnya dengan argumen tunggal akan menyisipkan markup, dengan menghormati indendasi. Memasukkan markup tanpa memperhatikan lekukan dilakukan dengan menggunakan " _ << text
". Sejumlah metode kemudahan lainnya didefinisikan:
_
: menyisipkan teks dengan lekukan yang cocok dengan keluaran saat ini_!
: menyisipkan teks tanpa membuat indentasi_.post?
-- apakah ini dipanggil melalui HTTP POST?_.system
-- memanggil perintah shell, menangkap stdin, stdout, dan stderr_.submit
-- menjalankan perintah (atau memblokir) sebagai proses deamon_.xhtml?
-- keluaran sebagai XHTML? Metode _.system
mengambil hash opsional sebagai parameter terakhirnya. Ini dapat digunakan untuk menyediakan pengaturan untuk metode Process.spawn yang mendasarinya. Misalnya: ._system('pwd',{ system_opts: { chdir: dir } , system_env: { 'FOO' => 'BAR' } })
Perhatikan bahwa nama variabel lingkungan harus diberikan dalam bentuk string, bukan simbol. Opsi tambahan yang dapat digunakan dengan _.system
meliputi:
:tag
- tag HTML yang akan digunakan untuk input/output; default ke pre
:bundlelines
- apakah akan memproses semua baris untuk jenis keluaran tertentu (stderr, stdout, dll) sebagai bagian dari tag tunggal. Jika tidak ditentukan, defaultnya adalah true
untuk tag pre
dan false
untuk sebaliknya. Jika false
, setiap baris keluaran diproses secara terpisah.Akses ke semua metode yang ditentukan pembuat (biasanya diakhiri dengan tanda seru) dan semua metode modul Wunderbar dapat diakses dengan cara ini. Contoh:
_.tag! :foo
: menyisipkan elemen yang namanya bisa dinamis_.comment! "text"
: tambahkan komentar_.error 'Log message'
: menulis pesan ke log server Garis bawah pada nama elemen dan atribut diubah menjadi tanda hubung. Untuk menonaktifkan perilaku ini, nyatakan nama atribut sebagai string dan gunakan _.tag!
metode untuk nama elemen.
XHTML berbeda dari HTML dalam pelepasan gaya inline dan elemen skrip. XHTML juga akan kembali ke output HTML kecuali agen pengguna menunjukkan bahwa ia mendukung XHTML melalui header HTTP Accept.
Selain pemrosesan default elemen, teks, dan atribut, Wunderdar mendefinisikan pemrosesan tambahan sebagai berikut:
_head
: masukkan meta charset utf-8_svg
: masukkan namespace svg_math
: masukkan namespace matematika_coffeescript
: ubah coffeescript ke JS dan masukkan tag skripPerhatikan bahwa menambahkan tanda seru di akhir nama tag akan menonaktifkan perilaku ini.
Jika salah satu atribut yang diteruskan pada deklarasi _html
adalah :_width
, upaya akan dilakukan untuk mengubah posisi teks agar tidak melebihi lebar baris ini. Hal ini tidak akan dilakukan jika akan mempengaruhi apa yang sebenarnya ditampilkan.
Jika tidak ada elemen turunan untuk elemen html
yang berupa head
atau body
, maka tag ini akan dibuat untuk Anda, dan turunan yang relevan akan dipindahkan ke bagian yang sesuai. Jika body berisi elemen h1
, dan head
tidak berisi title
, elemen title akan dibuat berdasarkan teks yang diberikan ke elemen h1
pertama.
Operasi umum adalah mengembalikan Hash atau Array nilai. Hash adalah serangkaian pasangan nama/nilai, dan Array adalah serangkaian nilai.
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
Memanggil metode yang dimulai dengan karakter baris rendah Unicode ("_") akan menambahkan pasangan kunci/nilai ke hash tersebut. Hash juga bisa disarangkan. Logika dapat dicampur secara bebas.
Metode " _
" mempunyai beberapa tujuan.
memanggilnya dengan banyak argumen akan menyebabkan argumen pertama diperlakukan sebagai objek, dan sisanya sebagai atribut yang akan diekstraksi
_ File.stat('foo'), :mtime, :size, :mode
memanggilnya dengan satu objek Enumerable dan sebuah blok akan menyebabkan array dikembalikan berdasarkan pemetaan setiap keberatan dari enumerasi terhadap blok tersebut
_([1,2,3]) {|n| n*n}
array juga dapat dibangun menggunakan metode _
:
_ 1
_ 2
Metode _
mengembalikan proxy ke objek yang sedang dibangun. Ini sering kali berguna ketika dipanggil tanpa argumen. Contoh:
_.sort!
_['foo'] = 'bar'
Menambahkan ke aliran keluaran dilakukan menggunakan metode _
, yang setara dengan puts
. Metode _
mengembalikan objek yang mewakili aliran keluaran, yang menyediakan akses ke metode berguna lainnya, misalnya:
_.print 'foo'
_.printf "Hello %s!n", 'world'
Dukungan WebSocket memerlukan em-websocket
untuk diinstal.
Soket web adalah saluran dua arah. _.send
atau _.push
dapat digunakan untuk mengirim string arbitrer. Lebih umum lagi, metode array JSON yang dijelaskan di atas dapat digunakan semuanya, perbedaan pentingnya adalah bahwa masing-masing entri dikirim satu per satu dan saat diproduksi.
_.recv
atau _.pop
dapat digunakan untuk menerima string arbitrer. Lebih umum, _.subscribe
digunakan untuk mendaftarkan blok yang digunakan sebagai panggilan balik.
_.system
akan menjalankan perintah sewenang-wenang. Baris keluaran dikirim melalui soket web saat diterima sebagai hash yang dikodekan JSON dengan dua nilai: type
adalah salah satu dari stdin
, stdout
atau stderr
; dan line
yang berisi baris itu sendiri. Jika perintahnya berupa array, elemen array akan di-escape sebagai argumen perintah Shell. Array bersarang dapat digunakan untuk menyembunyikan elemen dari perintah yang bergema ke stdin. Nilai nihil dihilangkan.
Opsi untuk _websocket
disediakan sebagai hash:
:port
akan memilih nomor port, dengan defaultnya adalah nomor yang tersedia dipilihkan untuk Anda.:sync
yang disetel ke false
akan menyebabkan server WebSocket dijalankan sebagai proses daemon. Defaultnya adalah true
ketika dijalankan dari baris perintah dan menjadi false
ketika dijalankan sebagai CGI.buffer_limit
akan membatasi jumlah entri yang disimpan dan dikirim ke klien baru berdasarkan permintaan terbuka. Standarnya adalah 1
. Nilai nol akan menonaktifkan buffering. Nilai nil
akan menghasilkan buffering yang tidak terbatas. Catatan: buffering secara efektif tidak terbatas hingga klien pertama terhubung. Wunderbar akan keluar dari semua keluaran HTML dan JSON dengan benar, sehingga menghilangkan masalah injeksi HTML atau JavaScript. Ini termasuk panggilan ke _
untuk menyisipkan teks secara langsung. Kecuali nokogiri
diperlukan sebelumnya (lihat dependensi opsional di bawah), panggilan untuk menyisipkan markup ( _{...}
) akan lolos dari markup.
$USER
- ID pengguna host$PASSWORD
- Kata sandi host (jika CGI dan HTTP_AUTHORIZATION dilewati)$HOME
- Direktori beranda$SERVER
- Nama server$HOME
- direktori home pengguna$HOST
- tuan rumah serverSelain itu, variabel lingkungan berikut disetel jika belum disetel:
HOME
HTTP_HOST
LANG
REMOTE_USER
Terakhir, pengkodean eksternal dan internal default diatur ke UTF-8.
_.debug
: pesan debug_.info
: pesan informasi_.warn
: pesan peringatan_.error
: pesan kesalahan_.fatal
: pesan kesalahan fatal_.log_level
=: mengatur level pencatatan (default: :warn
)_.default_log_level
=: setel, tapi jangan override, level log_.logger
: mengembalikan contoh Logger Saat dijalankan dari baris perintah, pasangan nama=nilai CGI dapat ditentukan. Selain itu, opsi berikut ini didukung:
--get
: Output HTML (HTTP GET) diharapkan--post
: Output HTML (HTTP POST) diharapkan--json
: Output JSON (Permintaan HTTP XML) diharapkan--html
: memaksa keluaran HTML--prompt
atau --offline
: meminta pasangan kunci/nilai menggunakan stdin--debug
, --info
, --warn
, --error
, --fatal
: menyetel level log--install=
path: menghasilkan skrip pembungkus suexec-callable--rescue
atau --backtrace
menyebabkan skrip pembungkus menangkap kesalahan Permata berikut diperlukan berdasarkan fungsi yang Anda gunakan:
em-websocket
diperlukan oleh wunderbar/websocket
kramdown
diperlukan oleh wunderbar/markdown
ruby2js
menambahkan dukungan untuk skrip yang ditulis sebagai bloksourcify
diperlukan oleh wunderbar/opal
Permata berikut diperlukan oleh ekstensi dengan nama yang sama:
coderay
- penyorotan sintaksisopal
- ruby ke kompiler javascriptrack
- antarmuka server websinatra
- DSL untuk membuat aplikasi webPermata berikut, jika dipasang, akan menghasilkan keluaran yang lebih bersih dan indah:
nokogiri
membersihkan fragmen HTML yang disisipkan melalui <<
dan _{}
.nokogumbo
juga membersihkan fragmen HTML yang disisipkan melalui <<
dan _{}
. Jika permata ini tersedia, maka akan lebih disukai daripada penggunaan langsung nokogiri
.escape
dari kutipan perintah system
yang lebih cantik