laydown 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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)
|