laydown 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.rspec +3 -0
- data/README.md +45 -0
- data/Rakefile +20 -3
- data/VERSION +1 -1
- data/laydown.gemspec +10 -11
- data/lib/laydown.rb +109 -29
- data/spec/laydown_spec.rb +36 -0
- metadata +9 -10
- data/README +0 -48
- data/lib/templates/default_layout.rb +0 -30
- data/templates/default_layout.tenjin.html +0 -29
- data/test/rough.rb +0 -19
data/.rspec
ADDED
data/README.md
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
#
|
2
|
+
# «=»
|
3
|
+
# ^
|
4
|
+
# $ «« ^¨^ »» $
|
5
|
+
# '' ''
|
6
|
+
# .
|
7
|
+
# «=»
|
8
|
+
# ^
|
9
|
+
# «« ^¨^ »»
|
10
|
+
# LAYDOWN
|
11
|
+
# ''|'|''
|
12
|
+
# | | |>
|
13
|
+
# | | ______|_
|
14
|
+
# | | | oo |
|
15
|
+
#'''''''''''''''''''''''''''''******
|
16
|
+
|
17
|
+
# $ gem install laydown
|
18
|
+
|
19
|
+
Laydown is a simple template language for defining quick HTML5 layouts in Ruby. Never write the same old boilerplate again.
|
20
|
+
|
21
|
+
require 'laydown'
|
22
|
+
|
23
|
+
layout = Laydown.new do |_|
|
24
|
+
_.charset 'some crazy charset'
|
25
|
+
_.title 'A man in a cave'
|
26
|
+
_.description 'A man is sitting in a cave.'
|
27
|
+
_.keywords 'man, cave, mystery', @keywords
|
28
|
+
_.favicon '/maninacave.png'
|
29
|
+
_.css '/maninacave/style.css'
|
30
|
+
_.css @css, '/site.css'
|
31
|
+
_.js @js
|
32
|
+
_.inline_js 'alert("Grrr");'
|
33
|
+
_.head '<meta generator="FlushFlox Super Deluxe">'
|
34
|
+
_.ga_code 'UA-8079526-5' # google analytics
|
35
|
+
_.body_class @body_class
|
36
|
+
end
|
37
|
+
|
38
|
+
@css = 'somesheet.css'
|
39
|
+
@body_class = 'front'
|
40
|
+
|
41
|
+
layout.render(self) { '<p>this comes in the body</p>' }
|
42
|
+
# => your html5 layout
|
43
|
+
|
44
|
+
The block given to `Laydown.new` will be evaluated in the context passed to the `render` method.
|
45
|
+
|
data/Rakefile
CHANGED
@@ -10,7 +10,7 @@ begin
|
|
10
10
|
gem.email = "post@jostein.be"
|
11
11
|
gem.homepage = "http://github.com/jbe/laydown"
|
12
12
|
gem.authors = ["jbe"]
|
13
|
-
gem.add_dependency "
|
13
|
+
gem.add_dependency "backports" #, ">= 0"
|
14
14
|
gem.add_development_dependency "tenjin", ">= 0"
|
15
15
|
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
16
16
|
end
|
@@ -21,7 +21,24 @@ end
|
|
21
21
|
|
22
22
|
namespace :build do
|
23
23
|
desc 'Builds Tenjin templates'
|
24
|
-
task :
|
25
|
-
|
24
|
+
task :template do
|
25
|
+
|
26
|
+
require 'haml'
|
27
|
+
src = File.read('template/default.haml')
|
28
|
+
compiled = Haml::Engine.new(src).precompiled
|
29
|
+
File.open('lib/laydown/template.rb', 'w') do |f|
|
30
|
+
f.write <<-RUBY
|
31
|
+
require 'haml'
|
32
|
+
#require 'haml/helpers'
|
33
|
+
#require 'haml/util'
|
34
|
+
#require 'haml/buffer'
|
35
|
+
extend Haml::Helpers
|
36
|
+
_hamlout = @haml_buffer = Haml::Buffer.new(@haml_buffer)
|
37
|
+
RUBY
|
38
|
+
f.write(compiled)
|
39
|
+
f.write "@haml_buffer = @haml_buffer.upper"
|
40
|
+
end
|
41
|
+
|
42
|
+
#sh 'rbtenjin -s templates/default_layout.tenjin.html > lib/templates/default_layout.rb'
|
26
43
|
end
|
27
44
|
end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.4.0
|
data/laydown.gemspec
CHANGED
@@ -5,35 +5,34 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{laydown}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.4.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["jbe"]
|
12
|
-
s.date = %q{2011-02-
|
12
|
+
s.date = %q{2011-02-03}
|
13
13
|
s.description = %q{Provides a simple Ruby DSL for defining HTML5 layouts for web apps. For those of us who has written basically the same html head 200 times and feels like minimalism.}
|
14
14
|
s.email = %q{post@jostein.be}
|
15
15
|
s.extra_rdoc_files = [
|
16
16
|
"LICENSE",
|
17
|
-
"README"
|
17
|
+
"README.md"
|
18
18
|
]
|
19
19
|
s.files = [
|
20
20
|
".document",
|
21
|
+
".rspec",
|
21
22
|
"LICENSE",
|
22
|
-
"README",
|
23
|
+
"README.md",
|
23
24
|
"Rakefile",
|
24
25
|
"VERSION",
|
25
26
|
"laydown.gemspec",
|
26
27
|
"lib/laydown.rb",
|
27
|
-
"
|
28
|
-
"templates/default_layout.tenjin.html",
|
29
|
-
"test/rough.rb"
|
28
|
+
"spec/laydown_spec.rb"
|
30
29
|
]
|
31
30
|
s.homepage = %q{http://github.com/jbe/laydown}
|
32
31
|
s.require_paths = ["lib"]
|
33
32
|
s.rubygems_version = %q{1.3.7}
|
34
33
|
s.summary = %q{Pure Ruby HTML5 layout DSL for microframeworks.}
|
35
34
|
s.test_files = [
|
36
|
-
"
|
35
|
+
"spec/laydown_spec.rb"
|
37
36
|
]
|
38
37
|
|
39
38
|
if s.respond_to? :specification_version then
|
@@ -41,14 +40,14 @@ Gem::Specification.new do |s|
|
|
41
40
|
s.specification_version = 3
|
42
41
|
|
43
42
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
44
|
-
s.add_runtime_dependency(%q<
|
43
|
+
s.add_runtime_dependency(%q<backports>, [">= 0"])
|
45
44
|
s.add_development_dependency(%q<tenjin>, [">= 0"])
|
46
45
|
else
|
47
|
-
s.add_dependency(%q<
|
46
|
+
s.add_dependency(%q<backports>, [">= 0"])
|
48
47
|
s.add_dependency(%q<tenjin>, [">= 0"])
|
49
48
|
end
|
50
49
|
else
|
51
|
-
s.add_dependency(%q<
|
50
|
+
s.add_dependency(%q<backports>, [">= 0"])
|
52
51
|
s.add_dependency(%q<tenjin>, [">= 0"])
|
53
52
|
end
|
54
53
|
end
|
data/lib/laydown.rb
CHANGED
@@ -1,51 +1,131 @@
|
|
1
1
|
|
2
|
-
require '
|
2
|
+
require 'backports'
|
3
|
+
|
3
4
|
|
4
5
|
module Laydown
|
6
|
+
TOPOBJECT = defined?(BasicObject) ? BasicObject : Object
|
5
7
|
|
6
|
-
|
7
|
-
|
8
|
+
def self.new(&blk)
|
9
|
+
Template.new(&blk)
|
10
|
+
end
|
8
11
|
|
9
|
-
class
|
12
|
+
class Template
|
13
|
+
def initialize(&blk)
|
14
|
+
@layout = blk
|
15
|
+
end
|
10
16
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
@favicon = v[:favicon].first
|
16
|
-
@keywords = v[:keywords].join(', ')
|
17
|
-
@stylesheets = v[:css].compact
|
18
|
-
@javascripts = v[:js].compact
|
19
|
-
@head = v[:head].join("\n")
|
20
|
-
@body = v[:body].join("\n")
|
17
|
+
def render(scope=Object.new, &blk)
|
18
|
+
dsl = ::Laydown::DSL.new
|
19
|
+
scope.instance_exec(dsl, &@layout)
|
20
|
+
Renderer.new(dsl._captured_values, &blk).render
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
|
-
|
25
|
-
|
26
|
-
|
24
|
+
class DSL
|
25
|
+
TARGETS = %w{
|
26
|
+
charset lang title description favicon keywords css js
|
27
|
+
inline_js head body ga_code body_class
|
28
|
+
}
|
27
29
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
@
|
32
|
-
|
30
|
+
attr_reader :_captured_values
|
31
|
+
|
32
|
+
def initialize
|
33
|
+
@_captured_values = Hash.new { [] }
|
34
|
+
end
|
35
|
+
|
36
|
+
def _laydown(name, *values)
|
37
|
+
@_captured_values[name] += values
|
33
38
|
end
|
34
39
|
|
35
|
-
|
36
|
-
|
40
|
+
TARGETS.each do |name|
|
41
|
+
class_eval <<-RUBY
|
42
|
+
def #{name}(*a); _laydown('#{name}', *a); end
|
43
|
+
RUBY
|
44
|
+
end
|
45
|
+
end
|
37
46
|
|
38
|
-
|
47
|
+
class Renderer
|
39
48
|
|
40
|
-
|
41
|
-
|
49
|
+
def initialize(v)
|
50
|
+
|
51
|
+
@charset = v['charset'].first || 'utf-8'
|
52
|
+
@lang = v['lang'].first
|
53
|
+
@title = v['title'].compact.join(' – ')
|
54
|
+
@favicon = v['favicon'].first
|
55
|
+
@description = v['description'].compact.join(' ') if v['description']
|
56
|
+
@keywords = v['keywords'].compact.join(', ') if v['keywords']
|
57
|
+
@css = v['css'].compact
|
58
|
+
@js = v['js'].compact
|
59
|
+
@inline_js = v['inline_js'].compact
|
60
|
+
@head = v['head'].compact.join("\n")
|
61
|
+
@ga_code = v['ga_code'].first
|
62
|
+
@body_class = v['body_class'].compact.join(' ') if v['body_class']
|
63
|
+
@body = [block_given? ? yield : nil, v['body']].
|
64
|
+
flatten.compact.join("\n")
|
42
65
|
end
|
43
66
|
|
44
|
-
|
67
|
+
def render
|
68
|
+
"<!DOCTYPE html>\n" +
|
69
|
+
_(:html, {:lang => @lang},
|
70
|
+
_(:head, {},
|
71
|
+
_(:meta, {:charset => @charset}) +
|
72
|
+
_(:title, {}, @title) +
|
73
|
+
(@favicon ?
|
74
|
+
_(:link, {:rel => 'shortcut icon', :href => @favicon}) : '') +
|
75
|
+
(@description ?
|
76
|
+
_(:meta, {:description => @description}) : '') +
|
77
|
+
(@keywords ?
|
78
|
+
_(:meta, {:keywords => @keywords}) : '') +
|
79
|
+
@css.map do |url|
|
80
|
+
_(:link, {:rel => :stylesheet, :type => 'text/css', :href => url})
|
81
|
+
end.join +
|
82
|
+
@js.map do |url|
|
83
|
+
_(:script, {:type => 'text/javascript', :src => url}, '')
|
84
|
+
end.join +
|
85
|
+
@inline_js.map do |code|
|
86
|
+
_(:script, {:type => 'text/javascript'}, code)
|
87
|
+
end.join +
|
88
|
+
(@ga_code ? google_analytics_js : '') +
|
89
|
+
@head
|
90
|
+
) +
|
91
|
+
_(:body, {:class => @body_class},
|
92
|
+
@body
|
93
|
+
)
|
94
|
+
)
|
95
|
+
end
|
45
96
|
|
46
|
-
end
|
47
97
|
|
98
|
+
# html helpers
|
48
99
|
|
100
|
+
def _(name, props={}, contents=nil)
|
101
|
+
tag_str = name.to_s + prop_str(props)
|
102
|
+
if contents
|
103
|
+
"<#{tag_str}>\n#{contents}\n</#{name}>\n"
|
104
|
+
else
|
105
|
+
"<#{tag_str}/>\n"
|
106
|
+
end
|
107
|
+
end
|
49
108
|
|
109
|
+
def prop_str(hsh)
|
110
|
+
return '' if hsh.values.compact.empty?
|
111
|
+
' ' + hsh.map do |k,v|
|
112
|
+
"#{k.to_s}='#{v.to_s}'" if v
|
113
|
+
end.compact.join(' ')
|
114
|
+
end
|
115
|
+
|
116
|
+
def google_analytics_js
|
117
|
+
<<-JS
|
118
|
+
var _gaq = _gaq || [];
|
119
|
+
_gaq.push(['_setAccount', '#{@ga_code}']);
|
120
|
+
_gaq.push(['_trackPageview']);
|
121
|
+
(function() {
|
122
|
+
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
|
123
|
+
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
|
124
|
+
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
|
125
|
+
})();
|
126
|
+
JS
|
127
|
+
end
|
50
128
|
|
129
|
+
end
|
130
|
+
end
|
51
131
|
|
@@ -0,0 +1,36 @@
|
|
1
|
+
|
2
|
+
require 'laydown'
|
3
|
+
|
4
|
+
|
5
|
+
describe Laydown do
|
6
|
+
|
7
|
+
subject do
|
8
|
+
Laydown.new do |_|
|
9
|
+
_.charset 'iso-piso'
|
10
|
+
_.title 'Apple sucks'
|
11
|
+
_.description 'Yes, it does. And so do their fans.'
|
12
|
+
_.favicon 'applesuck.png'
|
13
|
+
_.keywords 'apple suck lol'
|
14
|
+
_.css 'applesuck.css'
|
15
|
+
_.js 'applesuck.js'
|
16
|
+
_.inline_js "alert('#{@msg}');"
|
17
|
+
_.head '<meta generator="Ubuntu">'
|
18
|
+
_.body @body
|
19
|
+
_.ga_code 'GA-UGGABUGGA'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'generates properly' do
|
24
|
+
@msg = 'lol @ iPhone'
|
25
|
+
@body = '<p>Seriously.</p>'
|
26
|
+
str = subject.render(self)
|
27
|
+
str.should == nil
|
28
|
+
|
29
|
+
#str.match(/lang="en"/).should
|
30
|
+
#str.match(/charset="iso-piso"/)
|
31
|
+
#str.match(/GA-UGGABUGGA/)
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
7
|
+
- 4
|
8
8
|
- 0
|
9
|
-
version: 0.
|
9
|
+
version: 0.4.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- jbe
|
@@ -14,11 +14,11 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2011-02-
|
17
|
+
date: 2011-02-03 00:00:00 +01:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
|
-
name:
|
21
|
+
name: backports
|
22
22
|
prerelease: false
|
23
23
|
requirement: &id001 !ruby/object:Gem::Requirement
|
24
24
|
none: false
|
@@ -51,18 +51,17 @@ extensions: []
|
|
51
51
|
|
52
52
|
extra_rdoc_files:
|
53
53
|
- LICENSE
|
54
|
-
- README
|
54
|
+
- README.md
|
55
55
|
files:
|
56
56
|
- .document
|
57
|
+
- .rspec
|
57
58
|
- LICENSE
|
58
|
-
- README
|
59
|
+
- README.md
|
59
60
|
- Rakefile
|
60
61
|
- VERSION
|
61
62
|
- laydown.gemspec
|
62
63
|
- lib/laydown.rb
|
63
|
-
-
|
64
|
-
- templates/default_layout.tenjin.html
|
65
|
-
- test/rough.rb
|
64
|
+
- spec/laydown_spec.rb
|
66
65
|
has_rdoc: true
|
67
66
|
homepage: http://github.com/jbe/laydown
|
68
67
|
licenses: []
|
@@ -96,4 +95,4 @@ signing_key:
|
|
96
95
|
specification_version: 3
|
97
96
|
summary: Pure Ruby HTML5 layout DSL for microframeworks.
|
98
97
|
test_files:
|
99
|
-
-
|
98
|
+
- spec/laydown_spec.rb
|
data/README
DELETED
@@ -1,48 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# .
|
3
|
-
# «=» ☺
|
4
|
-
# ^
|
5
|
-
# «« ^¨^ »»
|
6
|
-
# LAYDOWN
|
7
|
-
# ''|'|''
|
8
|
-
# | |
|
9
|
-
# | |
|
10
|
-
# | |
|
11
|
-
#'''''''''''''''''''''''''''''
|
12
|
-
# $ gem install laydown
|
13
|
-
# «=»
|
14
|
-
# ^
|
15
|
-
# $ «« ^¨^ »» $
|
16
|
-
# http://jostein.be
|
17
|
-
# '' ''
|
18
|
-
#
|
19
|
-
# Provides a simple Ruby DSL for defining HTML5 layouts
|
20
|
-
# for web apps. For those of us who has written basically
|
21
|
-
# the same html head 200 times and want to streamline it.
|
22
|
-
|
23
|
-
require 'laydown'
|
24
|
-
|
25
|
-
layout = Laydown.layout do
|
26
|
-
title 'A man in a cave'
|
27
|
-
description 'A man is sitting in a cave. What will he do?'
|
28
|
-
keywords 'man, cave, mystery', @keywords
|
29
|
-
favicon '/maninacave.png'
|
30
|
-
css '/maninacave/style.css'
|
31
|
-
css @css
|
32
|
-
js '/maninacave/site.js'
|
33
|
-
js @js
|
34
|
-
|
35
|
-
body @body || '<p>Empty</p>'
|
36
|
-
end
|
37
|
-
|
38
|
-
|
39
|
-
@css = 'somesheet.css'
|
40
|
-
@body = '<h1>A man in a cave</h1>'
|
41
|
-
|
42
|
-
puts layout.render(self) # => beautiful html5
|
43
|
-
|
44
|
-
# Note the binding passed to render (in this case self)
|
45
|
-
# -- its instance variables are made accessible to the
|
46
|
-
# layout block.
|
47
|
-
|
48
|
-
|
@@ -1,30 +0,0 @@
|
|
1
|
-
_buf = ''; _buf << %Q`<!DOCTYPE html>
|
2
|
-
<html>
|
3
|
-
<head>
|
4
|
-
<meta charset="utf-8">
|
5
|
-
<title>#{@title}</title>\n`
|
6
|
-
if @description
|
7
|
-
_buf << %Q` <meta name="description" content="#{@description}">\n`
|
8
|
-
end
|
9
|
-
if @keywords
|
10
|
-
_buf << %Q` <meta name="keywords" content="#{@keywords}">\n`
|
11
|
-
end
|
12
|
-
if @favicon
|
13
|
-
_buf << %Q` <link rel="shortcun icon" href="#{@favicon}">\n`
|
14
|
-
end
|
15
|
-
_buf << %Q`\n`
|
16
|
-
@stylesheets.each do |sheet|
|
17
|
-
_buf << %Q` <link rel="stylesheet" type="text/css" href="#{sheet}">\n`
|
18
|
-
end
|
19
|
-
_buf << %Q`\n`
|
20
|
-
@javascripts.each do |script|
|
21
|
-
_buf << %Q` <script src="#{script}" ></script>\n`
|
22
|
-
end
|
23
|
-
_buf << %Q` #{ @head }
|
24
|
-
</head>
|
25
|
-
|
26
|
-
<body>
|
27
|
-
#{ @body }
|
28
|
-
</body>
|
29
|
-
</html>\n`
|
30
|
-
_buf.to_s
|
@@ -1,29 +0,0 @@
|
|
1
|
-
<!DOCTYPE html>
|
2
|
-
<html>
|
3
|
-
<head>
|
4
|
-
<meta charset="utf-8">
|
5
|
-
<title>#{@title}</title>
|
6
|
-
<?rb if @description ?>
|
7
|
-
<meta name="description" content="#{@description}">
|
8
|
-
<?rb end ?>
|
9
|
-
<?rb if @keywords ?>
|
10
|
-
<meta name="keywords" content="#{@keywords}">
|
11
|
-
<?rb end ?>
|
12
|
-
<?rb if @favicon ?>
|
13
|
-
<link rel="shortcun icon" href="#{@favicon}">
|
14
|
-
<?rb end ?>
|
15
|
-
|
16
|
-
<?rb @stylesheets.each do |sheet| ?>
|
17
|
-
<link rel="stylesheet" type="text/css" href="#{sheet}">
|
18
|
-
<?rb end ?>
|
19
|
-
|
20
|
-
<?rb @javascripts.each do |script| ?>
|
21
|
-
<script src="#{script}" ></script>
|
22
|
-
<?rb end ?>
|
23
|
-
#{ @head }
|
24
|
-
</head>
|
25
|
-
|
26
|
-
<body>
|
27
|
-
#{ @body }
|
28
|
-
</body>
|
29
|
-
</html>
|
data/test/rough.rb
DELETED
@@ -1,19 +0,0 @@
|
|
1
|
-
require './lib/laydown'
|
2
|
-
|
3
|
-
|
4
|
-
Layout = Laydown.layout do
|
5
|
-
title 'A man in a cave'
|
6
|
-
description 'A man is sitting in a cave. What will he do?'
|
7
|
-
keywords 'man, cave, mystery'
|
8
|
-
favicon 'maninacave.png'
|
9
|
-
css '/maninacave/style.css'
|
10
|
-
css @css
|
11
|
-
js '/maninacave/site.js'
|
12
|
-
js @js
|
13
|
-
|
14
|
-
body "<h1>A man in\na cave</h1>"
|
15
|
-
end
|
16
|
-
|
17
|
-
@css = 'somesheet.css'
|
18
|
-
|
19
|
-
puts Layout.render(self)
|