Wunderbar를 사용하면 유효한 HTML5, 올바른 형식의 XHTML, 유니코드(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
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)).
생성된 출력에 추가하려면 아래 설명된 _
메서드를 사용하세요. 예제 애플리케이션은 튜토리얼에 있습니다.
유니코드 낮은 줄 문자("_")로 시작하는 메서드를 호출하면 HTML 태그가 생성됩니다. 이 라이브러리의 기반이 되는 빌더와 마찬가지로 이러한 태그에는 텍스트 콘텐츠와 속성이 있을 수 있습니다. 태그는 중첩될 수도 있습니다. 논리는 자유롭게 혼합될 수 있습니다.
Wunderbar는 별도의 종료 태그(예: textarea
)로 명시적으로 닫아야 하는 HTML 태그와 별도의 종료 태그(예: br
)로 닫아서는 안 되는 HTML 태그를 알고 있습니다. 또한 인수와 텍스트의 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과 다릅니다. XHTML은 사용자 에이전트가 HTTP Accept 헤더를 통해 XHTML을 지원한다고 나타내지 않는 한 HTML 출력으로 대체됩니다.
요소, 텍스트 및 속성의 기본 처리 외에도 Wunderdar는 다음에 대한 추가 처리를 정의합니다.
_head
: 메타 문자셋 utf-8 삽입_svg
: svg 네임스페이스 삽입_math
: 수학 네임스페이스 삽입_coffeescript
: 커피스크립트를 JS로 변환하고 스크립트 태그를 삽입합니다.태그 이름 끝에 느낌표를 추가하면 이 동작이 비활성화됩니다.
_html
선언에 전달된 속성 중 하나가 :_width
인 경우 이 줄 너비를 초과하지 않기 위해 텍스트를 리플로우하려고 시도합니다. 실제로 표시되는 내용에 영향을 미치는 경우에는 이 작업이 수행되지 않습니다.
html
요소의 하위 요소 중 head
또는 body
가 없으면 이러한 태그가 자동으로 생성되고 관련 하위 요소가 적절한 섹션으로 이동됩니다. 본문에 h1
요소가 포함되어 있고 head
title
포함되어 있지 않으면 첫 번째 h1
요소에 제공된 텍스트를 기반으로 제목 요소가 생성됩니다.
일반적인 작업은 해시 또는 값 배열을 반환하는 것입니다. 해시는 일련의 이름/값 쌍이고 배열은 일련의 값입니다.
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
유니코드 낮은 줄 문자("_")로 시작하는 메서드를 호출하면 해당 해시에 키/값 쌍이 추가됩니다. 해시는 중첩될 수도 있습니다. 논리는 자유롭게 혼합될 수 있습니다.
" _
" 메소드는 다양한 용도로 사용됩니다.
여러 인수를 사용하여 호출하면 첫 번째 인수가 객체로 처리되고 나머지는 추출되는 속성으로 처리됩니다.
_ 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
설치해야 합니다.
웹 소켓은 양방향 채널입니다. _.send
또는 _.push
사용하여 임의의 문자열을 보낼 수 있습니다. 보다 일반적으로 위에 설명된 JSON 배열 방법을 모두 사용할 수 있습니다. 중요한 차이점은 개별 항목이 생성될 때 개별적으로 전송된다는 것입니다.
_.recv
또는 _.pop
사용하여 임의의 문자열을 수신할 수 있습니다. 보다 일반적으로 _.subscribe
콜백으로 사용되는 블록을 등록하는 데 사용됩니다.
_.system
임의의 명령을 실행합니다. 출력 라인은 두 가지 값을 가진 JSON 인코딩 해시로 수신될 때 웹소켓을 통해 전송됩니다. type
stdin
, stdout
또는 stderr
중 하나입니다. 그리고 라인 자체를 포함하는 line
. 명령이 배열인 경우 배열 요소는 셸 명령 인수로 이스케이프됩니다. 중첩된 배열을 사용하면 명령이 stdin으로 반향되지 않도록 요소를 숨길 수 있습니다. Nil 값은 생략됩니다.
_websocket
에 대한 옵션은 해시로 제공됩니다.
:port
포트 번호를 선택하며, 기본값은 사용 가능한 포트 번호를 선택하는 것입니다.:sync
false
로 설정하면 WebSocket 서버가 데몬 프로세스로 실행됩니다. 명령줄에서 실행하면 기본값은 true
이고 CGI로 실행하면 false
입니다.buffer_limit
열려 있는 요청 시 유지되고 새 클라이언트로 전송되는 항목의 양을 제한합니다. 기본값은 1
입니다. 값이 0이면 버퍼링이 비활성화됩니다. 값이 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
: stdin을 사용하여 키/값 쌍에 대한 프롬프트--debug
, --info
, --warn
, --error
, --fatal
: 로그 수준 설정--install=
path: suexec 호출 가능 래퍼 스크립트 생성--rescue
또는 --backtrace
로 인해 래퍼 스크립트가 오류를 캡처하게 됩니다. 사용하는 기능에 따라 다음 보석이 필요합니다.
wunderbar/websocket
에는 em-websocket
필요합니다.kramdown
wunderbar/markdown
에 필요합니다.ruby2js
블록으로 작성된 스크립트에 대한 지원을 추가합니다.wunderbar/opal
에는 sourcify
필요합니다.동일한 이름의 확장에는 다음 보석이 필요합니다.
coderay
- 구문 강조opal
- 루비에서 자바스크립트 컴파일러로rack
- 웹서버 인터페이스sinatra
- 웹 애플리케이션 생성을 위한 DSL다음 gem을 설치하면 더 깨끗하고 예쁜 출력이 생성됩니다.
nokogiri
<<
및 _{}
통해 삽입된 HTML 조각을 정리합니다.nokogumbo
<<
및 _{}
를 통해 삽입된 HTML 조각도 정리합니다. 이 보석을 사용할 수 있는 경우 nokogiri
를 직접 사용하는 것보다 선호됩니다.system
명령을 더 예쁘게 인용 escape