fragment 0.0.2 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -5,14 +5,11 @@ Fragment is an HTML builder heavily based on Gestalt from the Ramaze framework.
5
5
  Its main purpose is to create fragments of HTML (hence the name),
6
6
  but is perfectly suited for building full pages.
7
7
 
8
- In essence, Fragment works more or less like any builder except that the code
9
- is reduce to the minimum. Instead of trying to be universal, I would rather keep the
10
- code as simple as possible and concentrate on small problems I have everyday when trying to
11
- write HTML via Ruby.
8
+ In essence, Fragment works more or less like any builder.
12
9
 
13
10
  First, how to install:
14
11
 
15
- sudo gem install fragment
12
+ gem install fragment
16
13
 
17
14
  Then you can require Fragment and use it that way:
18
15
 
@@ -20,7 +17,7 @@ Then you can require Fragment and use it that way:
20
17
 
21
18
  default = 'HTML'
22
19
 
23
- html = Fragment.please do
20
+ html = Fragment.create do
24
21
  doctype
25
22
  html(:lang=>'en') do
26
23
  head { title { "My Choice" } }
@@ -40,7 +37,7 @@ Then you can require Fragment and use it that way:
40
37
  If you try this example, you might notice a couple of things:
41
38
 
42
39
  First of all, you have a `doctype` helper which only creates an HTML5 doctype.
43
- If you want something else, you can use the `write` function which lets you write directly in place:
40
+ If you want something else, you can use the `write` method which lets you write directly in place:
44
41
 
45
42
  write "<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01//EN'"
46
43
  write " 'http://www.w3.org/TR/html4/strict.dtd'>"
@@ -62,7 +59,13 @@ This is what I did on the long example above for marking the default option.
62
59
 
63
60
  Nothing fancy but quite good to be aware of.
64
61
 
62
+ If you do something and want to keep the scope you are in, you can use `create_here` instead of `here`. You then have access to the methods through the fragment object passed to the block:
63
+
64
+ html = Fragment.create_here do |f|
65
+ f.h1 { "" }
66
+ end
67
+
65
68
  Do not hesitate to fork the project if you want to help me improve it.
66
69
 
67
70
  Thanx
68
- Mig
71
+ Mig
@@ -1,13 +1,13 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'fragment'
3
- s.version = "0.0.2"
3
+ s.version = "1.0.0"
4
4
  s.platform = Gem::Platform::RUBY
5
- s.summary = "Another HTML builder"
5
+ s.summary = "Lightweight HTML builder"
6
6
  s.description = "An HTML builder heavily based on Gestalt from the Ramaze framework. Its main purpose is to create fragments (hence the name), but is perfectly suited for building full pages."
7
7
  s.files = `git ls-files`.split("\n").sort
8
8
  s.require_path = './lib'
9
9
  s.author = "Mickael Riga"
10
- s.email = "mig@campbellhay.com"
10
+ s.email = "mig@mypeplum.com"
11
11
  s.homepage = "https://github.com/mig-hub/fragment"
12
12
  s.add_development_dependency(%q<bacon>, "~> 1.1.0")
13
13
  end
@@ -1,43 +1,52 @@
1
1
  class Fragment
2
- attr_accessor :out
2
+ attr_accessor :to_s
3
3
 
4
- def self.please(&block); self.new(&block).out; end
4
+ def self.create(&block); self.new(false,&block).to_s; end
5
+ def self.create_here(&block); self.new(true,&block).to_s; end
5
6
 
6
- def initialize(&block)
7
- @out = ""
8
- instance_eval(&block) if block_given?
7
+ def initialize outer_scope=false, &block
8
+ @to_s = ""
9
+ return self unless block_given?
10
+ unless outer_scope
11
+ instance_eval(&block)
12
+ else
13
+ block.call(self)
14
+ end
15
+ self
9
16
  end
10
17
 
11
18
  def method_missing(meth, args={}, &block); tag(meth, args, &block); end
12
19
 
13
- def tag(name, attributes={})
14
- @out << "<#{name}"
20
+ def tag name, attributes={}
21
+ @to_s << "<#{name}"
15
22
  if attributes.kind_of?(String)
16
- @out << ' ' << attributes
23
+ @to_s << ' ' << attributes
17
24
  else
18
- @out << attributes.delete_if{|k,v| v.nil? or v==false }.map{|(k,v)| " #{k}='#{_fragment_escape_entities(v)}'" }.join
25
+ @to_s << attributes.delete_if{|k,v| v.nil? or v==false }.map{|(k,v)| " #{k}='#{_fragment_escape_html(v)}'" }.join
19
26
  end
20
27
  if block_given?
21
- @out << ">"
28
+ @to_s << ">"
22
29
  text = yield
23
- @out << text.to_str if text != @out and text.respond_to?(:to_str)
24
- @out << "</#{name}>"
30
+ @to_s << text.to_str if text != @to_s and text.respond_to?(:to_str)
31
+ @to_s << "</#{name}>"
25
32
  else
26
- @out << ' />'
33
+ @to_s << ' />'
27
34
  end
28
35
  end
29
36
 
30
- def _fragment_escape_entities(s)
31
- s.to_s.gsub(/&/, '&amp;').gsub(/"/, '&quot;').gsub(/'/, '&apos;').gsub(/</, '&lt;').gsub(/>/, '&gt;')
32
- end
33
-
34
37
  # Override Kernel methods
38
+
35
39
  def p(args={}, &block); tag(:p, args, &block); end
36
40
  def select(args={}, &block); tag(:select, args, &block); end
37
41
 
38
- # More
39
- def write(s=''); @out << s; end
42
+ # Helpers
43
+
44
+ def write(s=''); @to_s << s; end
40
45
  def doctype; write "<!DOCTYPE html>\n"; end
41
46
  def comment(s=''); write "\n<!-- #{s} -->\n"; end
47
+ def _fragment_escape_html(s)
48
+ s.to_s.gsub(/&/, '&amp;').gsub(/"/, '&quot;').gsub(/'/, '&apos;').gsub(/</, '&lt;').gsub(/>/, '&gt;')
49
+ end
50
+
51
+ end
42
52
 
43
- end
@@ -1,31 +1,28 @@
1
- require 'rubygems'
2
- require 'bacon'
1
+ # encoding: utf-8
3
2
 
4
- ROOT = ::File.dirname(__FILE__)+'/..'
5
- $:.unshift ROOT+'/lib'
6
- require 'fragment'
3
+ require 'bacon'
4
+ $:.unshift File.expand_path('../../lib', __FILE__)
5
+ require "fragment"
7
6
 
8
- describe "Fragment" do
7
+ describe 'Fragment' do
9
8
 
10
- def fragment &block
11
- Fragment.please(&block)
12
- end
9
+ def fragment(&block); Fragment.new(&block).to_s; end
13
10
 
14
- it "simple tag" do
11
+ it "Builds simple tags" do
15
12
  fragment{ br }.should == '<br />'
16
13
  fragment{ p }.should == '<p />'
17
14
  end
18
15
 
19
- it "open close tags" do
16
+ it "Opens and closes tags" do
20
17
  fragment{ p{} }.should == '<p></p>'
21
18
  fragment{ div{} }.should == '<div></div>'
22
19
  end
23
20
 
24
- it "nested tags" do
21
+ it "Nests tags" do
25
22
  fragment{ p{ br } }.should == '<p><br /></p>'
26
23
  end
27
24
 
28
- it "deep nested tags" do
25
+ it "Builds deeply nested tags" do
29
26
  fragment do
30
27
  p do
31
28
  div do
@@ -37,7 +34,7 @@ describe "Fragment" do
37
34
  end.should == '<p><div><ol><li /></ol></div></p>'
38
35
  end
39
36
 
40
- it "deep nested tags with repetition" do
37
+ it "Builds deeply nested tags with repetition" do
41
38
  fragment do
42
39
  p do
43
40
  div do
@@ -54,7 +51,7 @@ describe "Fragment" do
54
51
  end.should == '<p><div><ol><li /><li /></ol><ol><li /><li /></ol></div></p>'
55
52
  end
56
53
 
57
- it "deep nested tags with strings" do
54
+ it "Builds deeply nested tags with strings" do
58
55
  fragment do
59
56
  p do
60
57
  div {'Hello, World'}
@@ -62,13 +59,13 @@ describe "Fragment" do
62
59
  end.should == '<p><div>Hello, World</div></p>'
63
60
  end
64
61
 
65
- it "allows to write directly if needed" do
62
+ it "Allows to write directly if needed" do
66
63
  fragment do
67
64
  write "<!DOCTYPE html>"
68
65
  end.should == '<!DOCTYPE html>'
69
66
  end
70
67
 
71
- it "some simple example" do
68
+ it "Builds a full HTML page" do
72
69
  fragment do
73
70
  doctype
74
71
  html do
@@ -82,7 +79,7 @@ describe "Fragment" do
82
79
  end.should == "<!DOCTYPE html>\n<html><head><title>Hello World</title></head><body><h1>Hello World</h1></body></html>"
83
80
  end
84
81
 
85
- it "some ruby inside" do
82
+ it "Builds with some ruby inside" do
86
83
  fragment do
87
84
  table do
88
85
  tr do
@@ -94,7 +91,7 @@ describe "Fragment" do
94
91
  end.should == '<table><tr><td>one</td><td>two</td><td>three</td></tr></table>'
95
92
  end
96
93
 
97
- it "escapeable attributes" do
94
+ it "Builds escapeable attributes" do
98
95
  fragment {
99
96
  a(:href => "http://example.org/?a=one&b=two") {
100
97
  "Click here"
@@ -102,29 +99,29 @@ describe "Fragment" do
102
99
  }.should == "<a href='http://example.org/?a=one&amp;b=two'>Click here</a>"
103
100
  end
104
101
 
105
- it "should accept attributes in a string" do
102
+ it "Should accept attributes in a string" do
106
103
  fragment{ input("type='text'") }.should == "<input type='text' />"
107
104
  end
108
105
 
109
- it 'should accept symbols as attributes' do
106
+ it 'Should accept symbols as attributes' do
110
107
  input = fragment{ input(:type => :text, :value => :one) }
111
108
 
112
109
  input.should =~ /type='text'/
113
110
  input.should =~ /value='one'/
114
111
  end
115
112
 
116
- it 'tags with prefix' do
113
+ it 'Builds tags with prefix' do
117
114
  fragment{ tag "prefix:local" }.should == '<prefix:local />'
118
115
  end
119
116
 
120
- it 'tags with a variety of characters' do
117
+ it 'Builds tags with a variety of characters' do
121
118
  # with "-"
122
119
  fragment{ tag "hello-world" }.should == '<hello-world />'
123
120
  # with Hiragana
124
121
  fragment{ tag "あいうえお" }.should == '<あいうえお />'
125
122
  end
126
123
 
127
- it "has a practicle way to add attributes like 'selected' based on boolean" do
124
+ it "Has a practicle way to add attributes like 'selected' based on boolean" do
128
125
  @selected = false
129
126
  fragment do
130
127
  option({:name => 'opt', :selected => @selected})
@@ -133,11 +130,11 @@ describe "Fragment" do
133
130
  end.should == "<option name='opt' /><option name='opt' selected='true' /><option name='opt' />"
134
131
  end
135
132
 
136
- it "Pass the Readme example" do
133
+ it "Builds a more complex HTML page with a variable in the outer scope" do
137
134
 
138
135
  default = 'HTML'
139
136
 
140
- html = Fragment.please do
137
+ html = Fragment.new do
141
138
  doctype
142
139
  html(:lang=>'en') do
143
140
  head { title { "My Choice" } }
@@ -152,9 +149,45 @@ describe "Fragment" do
152
149
  write "\n<!-- like Google Analytics or including another fragment -->\n"
153
150
  end
154
151
  end
155
- end
152
+ end.to_s
156
153
 
157
154
  html.should == "<!DOCTYPE html>\n<html lang='en'><head><title>My Choice</title></head><body>\n<!-- Here starts the body -->\n<select name='language'><option value='JS'>JS</option><option value='HTML' selected='true'>HTML</option><option value='CSS'>CSS</option></select>\n<!-- This allows to write HTML directly when using a snippet -->\n\n<!-- like Google Analytics or including another fragment -->\n</body></html>"
158
155
 
159
156
  end
160
- end
157
+
158
+ it 'Can be used inside the scope of an object' do
159
+ class Stranger
160
+ attr_accessor :name, :comment
161
+ def show_comment
162
+ Fragment.new(true) do |b|
163
+ b.p{ self.comment }
164
+ end.to_s
165
+ end
166
+ def show_summary
167
+ Fragment.create_here do |b|
168
+ b.article do
169
+ b.h1{ self.name }
170
+ b.p{ self.comment }
171
+ end
172
+ end
173
+ end
174
+ def fail_summary
175
+ Fragment.create do
176
+ article do
177
+ h1{ self.name }
178
+ p{ self.comment }
179
+ end
180
+ end
181
+ end
182
+ end
183
+
184
+ s = Stranger.new
185
+ s.name = 'The Doors'
186
+ s.comment = 'Strange days'
187
+ s.show_comment.should=='<p>Strange days</p>'
188
+ s.show_summary.should=='<article><h1>The Doors</h1><p>Strange days</p></article>'
189
+ s.fail_summary.should=="<article><h1><name /></h1><p>\n<!-- -->\n</p></article>"
190
+ end
191
+
192
+ end
193
+
metadata CHANGED
@@ -1,87 +1,68 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: fragment
3
- version: !ruby/object:Gem::Version
4
- hash: 27
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 0
9
- - 2
10
- version: 0.0.2
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Mickael Riga
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2011-12-15 00:00:00 +00:00
19
- default_executable:
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
12
+ date: 2014-10-29 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
22
15
  name: bacon
23
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
25
17
  none: false
26
- requirements:
18
+ requirements:
27
19
  - - ~>
28
- - !ruby/object:Gem::Version
29
- hash: 19
30
- segments:
31
- - 1
32
- - 1
33
- - 0
20
+ - !ruby/object:Gem::Version
34
21
  version: 1.1.0
35
22
  type: :development
36
- version_requirements: *id001
37
- description: An HTML builder heavily based on Gestalt from the Ramaze framework. Its main purpose is to create fragments (hence the name), but is perfectly suited for building full pages.
38
- email: mig@campbellhay.com
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 1.1.0
30
+ description: An HTML builder heavily based on Gestalt from the Ramaze framework. Its
31
+ main purpose is to create fragments (hence the name), but is perfectly suited for
32
+ building full pages.
33
+ email: mig@mypeplum.com
39
34
  executables: []
40
-
41
35
  extensions: []
42
-
43
36
  extra_rdoc_files: []
44
-
45
- files:
37
+ files:
46
38
  - .gitignore
47
39
  - MIT_LICENCE
48
40
  - README.md
49
41
  - fragment.gemspec
50
42
  - lib/fragment.rb
51
43
  - test/spec_fragment.rb
52
- has_rdoc: true
53
44
  homepage: https://github.com/mig-hub/fragment
54
45
  licenses: []
55
-
56
46
  post_install_message:
57
47
  rdoc_options: []
58
-
59
- require_paths:
48
+ require_paths:
60
49
  - ./lib
61
- required_ruby_version: !ruby/object:Gem::Requirement
50
+ required_ruby_version: !ruby/object:Gem::Requirement
62
51
  none: false
63
- requirements:
64
- - - ">="
65
- - !ruby/object:Gem::Version
66
- hash: 3
67
- segments:
68
- - 0
69
- version: "0"
70
- required_rubygems_version: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ! '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ required_rubygems_version: !ruby/object:Gem::Requirement
71
57
  none: false
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- hash: 3
76
- segments:
77
- - 0
78
- version: "0"
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
79
62
  requirements: []
80
-
81
63
  rubyforge_project:
82
- rubygems_version: 1.4.2
64
+ rubygems_version: 1.8.23
83
65
  signing_key:
84
66
  specification_version: 3
85
- summary: Another HTML builder
67
+ summary: Lightweight HTML builder
86
68
  test_files: []
87
-