O Wunderbar facilita a produção de aplicativos HTML5 válidos, XHTML bem formados, Unicode (utf-8), consistentemente recuados e legíveis.
Wunderbar foi inspirado no Builder de Jim Weirich e fornece a sintaxe de id de elemento e id de classe e com base na implementação de Markaby.
O suporte JSON do Wunderbar é inspirado no jbuilder de David Heinemeier Hansson.
Um tutorial está em desenvolvimento.
Funcionalidades adicionais são fornecidas por extensões.
A premissa do Wunderbar é que a saída de vários tipos é normalmente formada pelo acréscimo de uma série de pares chave/valor ou de valores simples, e essas operações devem ser otimizadas. Anexar um par chave/valor é feito por meio de:
_key value
... e anexar um valor simples é feito assim:
_ value
Para HTML, chave/valor é usado para nós de elemento e valores simples são usados para nós de texto. Para JSON, chave/valor é usado para Hashes e valores simples são usados para matrizes. Para texto, valores simples são gerados por meio de opções de venda e pares chave/valor não são usados.
O aninhamento é realizado por meio de blocos.
O método sublinhado, quando não recebe argumentos, retorna um objeto que pode ser usado para executar diversas funções especiais. Algumas dessas funções são exclusivas do método de saída. Outros métodos de registro são comuns.
O método sublinhado, quando passado por vários argumentos ou uma combinação de argumentos e um bloco, pode executar outras funções comuns, dependendo dos tipos de argumentos passados.
Sufixos de ponto de interrogação, ponto de exclamação e sublinhado no nome do método podem modificar os resultados.
Elemento simples:
_br
Elementos aninhados:
_div do
_hr
end
Elemento com texto:
_h1 "My weblog"
Elemento com atributos:
_img src: '/img/logo.jpg', alt: 'site logo'
Elemento com texto e atributos:
_a 'search', href: 'http://google.com'
Elemento com atributos booleanos:
_input 'Cheese', type: 'checkbox', name: 'cheese', checked: true
Elemento com atributos booleanos (forma alternativa):
_input 'Cheese', :checked, type: 'checkbox', name: 'cheese'
Elemento com atributos opcionais (omitidos):
_tr class: nil
Texto (os caracteres de marcação têm escape):
_ "<3"
Texto (pode conter marcação):
_{"<em>hello</em>!!!"}
Importação de HTML/XML:
_[Nokogiri::XML "<em>hello</em>"]
Conteúdo misto (espaçamento automático):
_p do
_ 'It is a'
_em 'very'
_ 'nice day.'
end
Conteúdo misto (espaço controlado):
_p! do
_ 'Source is on '
_a 'github', href: 'https://github.com/'
_ '.'
end
Insira linhas em branco entre as linhas no HTML produzido:
_tbody do
_tr_ do
_td 1
end
_tr_ do
_td 2
end
_tr_ do
_td 3
end
end
Exceções de captura:
_body? do
raise NotImplementedError.new('page')
end
Atalho do atributo de classe (equivalente a class="front"):
_div.front do
end
Atalho de atributos de id (equivalente a id="search"):
_div.search! do
end
Listas/linhas completas podem ser definidas usando arrays:
_ul %w(apple orange pear)
_ol %w(apple orange pear)
_table do
_tr %w(apple orange pear)
end
A iteração arbitrária pode ser feita em Enumeráveis:
_dl.colors red: '#F00', green: '#0F0', blue: '#00F' do |color, hex|
_dt color.to_s
_dd hex
end
Um programa principal típico produz uma ou mais saídas HTML, JSON ou texto simples. Isso é conseguido fornecendo um ou mais dos seguintes:
_html do
code
end
_xhtml do
code
end
_json do
code
end
_text do
code
end
_websocket do
code
end
Código Ruby arbitrário pode ser colocado em cada um. Os parâmetros do formulário são disponibilizados como variáveis de instância (por exemplo, @name
). Os valores do ambiente host (CGI, Rack, Sinatra) são acessíveis como métodos do objeto _
: por exemplo _.headers
(CGI), _.set_cookie
(Rack), _.redirect
(Sinatra).
Para anexar à saída produzida, use os métodos _
descritos abaixo. Exemplos de aplicativos estão no tutorial.
Invocar métodos que começam com um caractere de linha baixa Unicode ("_") gerará uma tag HTML. Tal como acontece com o construtor, no qual esta biblioteca se baseia, essas tags podem ter conteúdo e atributos de texto. As tags também podem ser aninhadas. A lógica pode ser livremente misturada.
Wunderbar sabe quais tags HTML precisam ser fechadas explicitamente com tags finais separadas (exemplo: textarea
) e quais nunca devem ser fechadas com tags finais separadas (exemplo: br
). Ele também cuida da citação HTML e do escape de argumentos e texto.
Sufixos após o nome da tag modificarão o processamento.
!
: desativa todo o processamento especial, incluindo recuo?
: adiciona código para resgatar exceções e produzir tracebacks_
: adiciona linhas extras em branco entre esta tag e irmãos O método " _
" serve a vários propósitos. Chamá-lo com um único argumento insere marcação, respeitando o recuo. A inserção de marcação sem levar em conta o recuo é feita usando " _ << text
". Vários outros métodos de conveniência são definidos:
_
: insere texto com recuo correspondente à saída atual_!
: insira texto sem recuo_.post?
- isso foi invocado via HTTP POST?_.system
– invoca um comando shell, captura stdin, stdout e stderr_.submit
- executa o comando (ou bloco) como um processo deamon_.xhtml?
-- saída como XHTML? O método _.system
usa um hash opcional como último parâmetro. Isso pode ser usado para fornecer configurações para o método Process.spawn subjacente. Por exemplo: ._system('pwd',{ system_opts: { chdir: dir } , system_env: { 'FOO' => 'BAR' } })
Observe que os nomes das variáveis de ambiente devem ser fornecidos como strings, não como símbolos. Opções adicionais que podem ser usadas com _.system
incluem:
:tag
- a tag HTML a ser usada para entrada/saída; o padrão é pre
:bundlelines
- se deve processar todas as linhas para um determinado tipo de saída (stderr, stdout, etc) como parte de uma única tag. Se não for especificado, o padrão é true
para pre
-tags e false
caso contrário. Se false
, cada linha de saída será processada separadamente.O acesso a todos os métodos definidos pelo construtor (normalmente terminam com um ponto de exclamação) e todos os métodos do módulo Wunderbar podem ser acessados desta forma. Exemplos:
_.tag! :foo
: insere elementos onde o nome pode ser dinâmico_.comment! "text"
: adicione um comentário_.error 'Log message'
: escreve uma mensagem no log do servidor Os sublinhados nos nomes dos elementos e atributos são convertidos em travessões. Para desabilitar esse comportamento, expresse os nomes dos atributos como strings e use o _.tag!
método para nomes de elementos.
XHTML difere do HTML no escape do estilo embutido e dos elementos de script. XHTML também retornará à saída HTML, a menos que o agente do usuário indique que suporta XHTML por meio do cabeçalho HTTP Accept.
Além do processamento padrão de elementos, texto e atributos, o Wunderdar define processamento adicional para o seguinte:
_head
: insira o meta charset utf-8_svg
: insira o namespace svg_math
: insira o namespace matemático_coffeescript
: converta coffeescript em JS e insira a tag de scriptObserve que adicionar um ponto de exclamação ao final do nome da tag desativa esse comportamento.
Se um dos atributos passados na declaração _html
for :_width
, será feita uma tentativa de refluir o texto para não exceder esta largura de linha. Isso não será feito se afetar o que realmente é exibido.
Se nenhum dos elementos filhos do elemento html
for head
ou body
, essas tags serão criadas para você e os filhos relevantes serão movidos para a seção apropriada. Se o body contiver um elemento h1
e o head
não contiver um title
, um elemento title será criado com base no texto fornecido ao primeiro elemento h1
.
As operações comuns são retornar um Hash ou um Array de valores. Hashes são uma série de pares nome/valor e Arrays são uma série de valores.
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
Invocar métodos que começam com um caractere de linha baixa Unicode ("_") adicionará um par chave/valor a esse hash. Hashes também podem ser aninhados. A lógica pode ser livremente misturada.
O método " _
" serve a vários propósitos.
chamá-lo com vários argumentos fará com que o primeiro argumento seja tratado como o objeto e o restante como os atributos a serem extraídos
_ File.stat('foo'), :mtime, :size, :mode
chamá-lo com um único objeto Enumerable e um bloco fará com que um array seja retornado com base no mapeamento de cada objeção da enumeração em relação ao bloco
_([1,2,3]) {|n| n*n}
arrays também podem ser construídos usando o método _
:
_ 1
_ 2
O método _
retorna um proxy para o objeto que está sendo construído. Isso geralmente é útil quando chamado sem argumentos. Exemplos:
_.sort!
_['foo'] = 'bar'
A anexação ao fluxo de saída é feita usando o método _
, que é equivalente a puts
. O método _
retorna um objeto que faz proxy do fluxo de saída, que fornece acesso a outros métodos úteis, por exemplo:
_.print 'foo'
_.printf "Hello %s!n", 'world'
O suporte WebSocket requer a instalação em-websocket
.
Um web socket é um canal bidirecional. _.send
ou _.push
podem ser usados para enviar strings arbitrárias. Mais comumente, todos os métodos de array JSON descritos acima podem ser usados, a diferença importante é que as entradas individuais são enviadas individualmente e à medida que são produzidas.
_.recv
ou _.pop
podem ser usados para receber strings arbitrárias. Mais comumente, _.subscribe
é usado para registrar um bloco que é usado como retorno de chamada.
_.system
executará um comando arbitrário. As linhas de saída são enviadas pelo websocket à medida que são recebidas como hashes codificados em JSON com dois valores: type
é stdin
, stdout
ou stderr
; e line
que contém a própria linha. Se o comando for uma matriz, os elementos da matriz serão escapados como argumentos de comando do Shell. Matrizes aninhadas podem ser usadas para ocultar elementos do eco do comando para stdin. Valores nulos são omitidos.
As opções para _websocket
são fornecidas como um hash:
:port
escolherá um número de porta, sendo o padrão que um número disponível seja escolhido para você.:sync
definido como false
fará com que o servidor WebSocket seja executado como um processo daemon. O padrão é true
quando executado a partir da linha de comando e false
quando executado como CGI.buffer_limit
limitará a quantidade de entradas retidas e enviadas a novos clientes em solicitações abertas. O padrão é 1
. Um valor zero desabilitará o buffer. Um valor nil
resultará em buffer ilimitado. Observação: o buffer é efetivamente ilimitado até que o primeiro cliente se conecte. O Wunderbar escapará adequadamente de todas as saídas HTML e JSON, eliminando problemas de injeção de HTML ou JavaScript. Isso inclui chamadas para _
para inserir texto diretamente. A menos que nokogiri
tenha sido exigido anteriormente (veja as dependências opcionais abaixo), as chamadas para inserir marcação ( _{...}
) escaparão da marcação.
$USER
– ID do usuário do host$PASSWORD
- Senha do host (se CGI e HTTP_AUTHORIZATION forem transmitidos)$HOME
- Diretório inicial$SERVER
- Nome do servidor$HOME
– diretório inicial do usuário$HOST
– host do servidorAlém disso, as seguintes variáveis de ambiente serão definidas, caso ainda não estejam:
HOME
HTTP_HOST
LANG
REMOTE_USER
Finalmente, as codificações externas e internas padrão são definidas como UTF-8.
_.debug
: mensagens de depuração_.info
: mensagens informativas_.warn
: mensagens de aviso_.error
: mensagens de erro_.fatal
: mensagens de erro fatais_.log_level
=: definir o nível de registro (padrão: :warn
)_.default_log_level
=: define, mas não substitui, nível de log_.logger
: retorna instância do Logger Quando executado a partir da linha de comando, os pares nome=valor CGI podem ser especificados. Além disso, as seguintes opções são suportadas:
--get
: a saída HTML (HTTP GET) é esperada--post
: a saída HTML (HTTP POST) é esperada--json
: a saída JSON (solicitação XML HTTP) é esperada--html
: força a saída HTML--prompt
ou --offline
: solicita pares chave/valor usando stdin--debug
, --info
, --warn
, --error
, --fatal
: define o nível do log--install=
caminho: produz um script wrapper que pode ser chamado por suexec--rescue
ou --backtrace
fazem com que o script wrapper capture erros As seguintes gemas são necessárias com base nas funções que você usa:
em-websocket
é exigido pelo wunderbar/websocket
kramdown
é exigido por wunderbar/markdown
ruby2js
adiciona suporte para scripts escritos como blocossourcify
é exigido por wunderbar/opal
As seguintes gemas são exigidas por extensões de mesmo nome:
coderay
- destaque de sintaxeopal
- compilador Ruby para javascriptrack
- interface do servidor websinatra
- DSL para criação de aplicações webAs seguintes gemas, se instaladas, produzirão resultados mais limpos e bonitos:
nokogiri
limpa fragmentos HTML inseridos via <<
e _{}
.nokogumbo
também limpa fragmentos HTML inseridos via <<
e _{}
. Se esta joia estiver disponível, ela será preferida ao uso direto de nokogiri
.escape
de citações mais bonitas de comandos system