genit 1.0.1 → 2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. data/NEWS +12 -28
  2. data/README.markdown +6 -2
  3. data/Rakefile +1 -1
  4. data/TODO +177 -12
  5. data/VERSION +1 -1
  6. data/bin/genit +18 -20
  7. data/data/styles/screen.css +5 -9
  8. data/data/templates/main.html +0 -1
  9. data/lib/genit.rb +9 -4
  10. data/lib/genit/builders/body_link_builder.rb +8 -8
  11. data/lib/genit/builders/builder_base.rb +11 -11
  12. data/lib/genit/builders/head_link_builder.rb +8 -8
  13. data/lib/genit/builders/relativizer.rb +12 -12
  14. data/lib/genit/builders/script_builder.rb +7 -7
  15. data/lib/genit/documents/document_writer.rb +14 -14
  16. data/lib/genit/documents/fragment.rb +23 -22
  17. data/lib/genit/documents/xml_document.rb +5 -1
  18. data/lib/genit/project.rb +1 -0
  19. data/lib/genit/project/compiler.rb +54 -73
  20. data/lib/genit/project/page_compiler.rb +41 -41
  21. data/lib/genit/project/pages_finder.rb +6 -6
  22. data/lib/genit/project/project_creator.rb +116 -111
  23. data/lib/genit/project/root_cleaner.rb +31 -0
  24. data/lib/genit/project/rss_feed.rb +14 -14
  25. data/lib/genit/server.rb +2 -0
  26. data/lib/genit/server/server.rb +33 -0
  27. data/lib/genit/tags/class_fragment_tag.rb +2 -2
  28. data/lib/genit/tags/class_menu_tag.rb +2 -1
  29. data/lib/genit/tags/class_news_tag.rb +24 -24
  30. data/lib/genit/tags/class_pages_tag.rb +1 -1
  31. data/lib/genit/tags/here_tag.rb +22 -18
  32. data/lib/genit/utils/news_utils.rb +3 -3
  33. data/spec/class_news_tag_spec.rb +5 -5
  34. data/spec/compiler_spec.rb +51 -60
  35. data/spec/fragment_spec.rb +19 -19
  36. data/spec/html_document_spec.rb +10 -10
  37. data/spec/page_compiler_spec.rb +13 -9
  38. data/spec/pages_finder_spec.rb +11 -11
  39. data/spec/project_creator_spec.rb +53 -102
  40. data/spec/test-files/malformed.html +5 -0
  41. data/spec/xml_document_spec.rb +5 -0
  42. metadata +6 -9
  43. data/data/styles/alsa/all.css +0 -130
  44. data/data/styles/yui/all.css +0 -3
  45. data/data/styles/yui/base.css +0 -80
  46. data/data/styles/yui/fonts.css +0 -47
  47. data/data/styles/yui/reset.css +0 -126
  48. data/data/templates/xhtml_1.0_strict +0 -5
  49. data/data/templates/xhtml_1.0_transitional +0 -5
@@ -0,0 +1,2 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require 'genit/server/server'
@@ -0,0 +1,33 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'webrick'
4
+
5
+ module Genit
6
+
7
+ # I use WEBrick to serve the html from the root directory.
8
+ class Server
9
+
10
+ # Public: Constructor.
11
+ #
12
+ # wd - The String working directory, where live the project.
13
+ def initialize wd
14
+ @server = WEBrick::HTTPServer.new(:Port => 3000, :DocumentRoot => wd)
15
+ ['INT', 'TERM'].each {|signal| trap_this signal }
16
+ end
17
+
18
+ # Start the web server.
19
+ #
20
+ # Returns nothing.
21
+ def start
22
+ puts "Press Ctrl-C to close."
23
+ @server.start
24
+ end
25
+
26
+ private
27
+
28
+ def trap_this signal
29
+ trap(signal) { @server.shutdown }
30
+ end
31
+ end
32
+
33
+ end
@@ -14,8 +14,8 @@ module Genit
14
14
  def initialize working_dir, template, filename, tag
15
15
  super working_dir, template, filename, tag
16
16
  @file = @tag['file']
17
- error "Incomplete #{@tag}" if @file.nil?
18
- @full_path = File.join(@working_dir, 'fragments', @file)
17
+ error "Incomplete #{@tag}" unless @tag.key?('file')
18
+ @full_path = File.join(@working_dir, FRAGMENTS_DIR, @file)
19
19
  error "No such file #{@tag}" unless File.exists?(@full_path)
20
20
  end
21
21
 
@@ -26,7 +26,8 @@ module Genit
26
26
  private
27
27
 
28
28
  def build_menu
29
- menu = XmlDocument.open(File.join(@working_dir, "templates/menu.html"))
29
+ file = File.join(@working_dir, TEMPLATES_DIR, "menu.html")
30
+ menu = XmlDocument.open(file)
30
31
  builder = MenuBuilder.new(menu)
31
32
  @menu = builder.build_for_page(@filename)
32
33
  end
@@ -14,36 +14,36 @@ module Genit
14
14
  def initialize working_dir, template, filename, tag
15
15
  super working_dir, template, filename, tag
16
16
  end
17
-
17
+
18
18
  # Public: Do the replacement.
19
19
  #
20
20
  # Returns the template as a Nokogiri::XML::Document
21
21
  def process
22
22
  replace_tag_into_template! 'genit.news', news_content
23
23
  end
24
-
24
+
25
25
  private
26
-
27
- def news_content
28
- news_string = ''
29
- news_files.each { |file| news_string += process_the_news(file) }
30
- news_string
31
- end
32
-
33
- def news_files
34
- files = Dir.glob(File.join(@working_dir, 'news', '*')).sort.reverse
35
- number = @tag['number']
36
- return files[0...(number).to_i] if number
37
- files
38
- end
39
-
40
- def process_the_news file
41
- doc_as_string = HtmlDocument.open_as_string(file).to_s
42
- wrapper = @tag['wrapper']
43
- return "<div class='#{wrapper}'>" + doc_as_string + '</div>' if wrapper
44
- doc_as_string
45
- end
46
-
26
+
27
+ def news_content
28
+ news_string = ''
29
+ news_files.each { |file| news_string += process_the_news(file) }
30
+ news_string
31
+ end
32
+
33
+ def news_files
34
+ files = Dir.glob(File.join(@working_dir, NEWS_DIR, '*')).sort.reverse
35
+ number = @tag['number']
36
+ return files[0...(number).to_i] if number
37
+ files
38
+ end
39
+
40
+ def process_the_news file
41
+ doc_as_string = HtmlDocument.open_as_string(file).to_s
42
+ wrapper = @tag['wrapper']
43
+ return "<div class='#{wrapper}'>" + doc_as_string + '</div>' if wrapper
44
+ doc_as_string
45
+ end
46
+
47
47
  end
48
-
48
+
49
49
  end
@@ -25,7 +25,7 @@ module Genit
25
25
  private
26
26
 
27
27
  def page_content
28
- filename = File.join(@working_dir, 'pages', @filename)
28
+ filename = File.join(@working_dir, PAGES_DIR, @filename)
29
29
  HtmlDocument.build_page_content filename, @working_dir
30
30
  end
31
31
 
@@ -16,7 +16,7 @@ module Genit
16
16
  def initialize working_dir, template, filename, tag
17
17
  super working_dir, template, filename, tag
18
18
  end
19
-
19
+
20
20
  # Public: Replace a variable in the template. The variable content is found
21
21
  # in the tag in the page.
22
22
  #
@@ -25,25 +25,29 @@ module Genit
25
25
  replace_tag_into_template! get_css_rule, get_variable_value
26
26
  @template
27
27
  end
28
-
28
+
29
29
  private
30
-
31
- def get_css_rule
32
- var_name = @tag['here']
33
- "genit[here='#{var_name}']"
34
- end
35
-
36
- def get_variable_value
37
- doc = HtmlDocument.open_fragment File.join(@working_dir, 'pages', @filename)
38
- elem = doc.at_css "genit[what='#{@tag['here']}']"
39
- if elem.nil?
40
- warning "here without what #{@tag}"
41
- ""
42
- else
43
- elem.inner_html
30
+
31
+ def get_css_rule
32
+ var_name = @tag['here']
33
+ "genit[here='#{var_name}']"
44
34
  end
45
- end
46
-
35
+
36
+ def get_variable_value
37
+ file = File.join(@working_dir, PAGES_DIR, @filename)
38
+ doc = HtmlDocument.open_fragment file
39
+ html_or_nothing_from(doc.at_css("genit[what='#{@tag['here']}']"))
40
+ end
41
+
42
+ def html_or_nothing_from element
43
+ if element.nil?
44
+ warning "here without what #{@tag}"
45
+ ""
46
+ else
47
+ element.inner_html
48
+ end
49
+ end
50
+
47
51
  end
48
52
 
49
53
  end
@@ -4,11 +4,11 @@ module Genit
4
4
 
5
5
  # Utily methods for a news (an article).
6
6
  class NewsUtils
7
-
7
+
8
8
  def self.get_date_from_filename filename
9
9
  File.basename(filename).gsub(/\..*$/, '')
10
10
  end
11
-
11
+
12
12
  end
13
-
13
+
14
14
  end
@@ -7,11 +7,11 @@ describe ClassNewsTag do
7
7
  after :all do
8
8
  clean_test_repository
9
9
  end
10
-
10
+
11
11
  def create_sample_project
12
- FileUtils.makedirs('spec/project-name/news')
13
- File.open('spec/project-name/news/2011-01-01.html', "w") {|out| out.puts '<h1>2011-01-01</h1>' }
14
- File.open('spec/project-name/news/2011-02-02.html', "w") {|out| out.puts '<h1>2011-02-02</h1>' }
12
+ FileUtils.makedirs('spec/project-name/src/news')
13
+ File.open('spec/project-name/src/news/2011-01-01.html', "w") {|out| out.puts '<h1>2011-01-01</h1>' }
14
+ File.open('spec/project-name/src/news/2011-02-02.html', "w") {|out| out.puts '<h1>2011-02-02</h1>' }
15
15
  end
16
16
 
17
17
  it "should replace all news" do
@@ -22,7 +22,7 @@ describe ClassNewsTag do
22
22
  doc = cnt.process
23
23
  doc.css('h1').size.should == 2
24
24
  end
25
-
25
+
26
26
  it "should replace X news" do
27
27
  create_sample_project
28
28
  template = Nokogiri::XML.fragment '<genit class="news" number="1"/>'
@@ -5,41 +5,36 @@ require './spec/helper'
5
5
  describe Compiler do
6
6
 
7
7
  before :each do
8
- @project = ProjectCreator.new('spec/project-name', 'html_5', false)
8
+ @project = ProjectCreator.new('spec/project-name', false)
9
9
  @project.create
10
10
  @compiler = Compiler.new test_project_path
11
11
  end
12
-
12
+
13
13
  after :each do
14
14
  clean_test_repository
15
15
  end
16
-
16
+
17
17
  def write_file name, content
18
18
  File.open(File.join('spec/project-name', name), "w") do |file|
19
19
  file.puts content
20
20
  end
21
21
  end
22
-
23
- it "should build an index.html page in www" do
22
+
23
+ it "should build an index.html page" do
24
24
  @compiler.compile
25
- File.exist?('spec/project-name/www/index.html').should be_true
25
+ File.exist?('spec/project-name/index.html').should be_true
26
26
  end
27
-
27
+
28
28
  it "should build two pages" do
29
- write_file 'pages/doc.html', '<h1>documentation</h1>'
30
- @compiler.compile
31
- File.exist?('spec/project-name/www/index.html').should be_true
32
- File.exist?('spec/project-name/www/doc.html').should be_true
33
- end
34
-
35
- it "should copy the styles/ into www/" do
29
+ write_file 'src/pages/doc.html', '<h1>documentation</h1>'
36
30
  @compiler.compile
37
- File.exist?('spec/project-name/www/styles/screen.css').should be_true
31
+ File.exist?('spec/project-name/index.html').should be_true
32
+ File.exist?('spec/project-name/doc.html').should be_true
38
33
  end
39
-
34
+
40
35
  it "should set the menu in index page" do
41
36
  @compiler.compile
42
- doc = Nokogiri::HTML(File.open("spec/project-name/www/index.html"))
37
+ doc = Nokogiri::HTML(File.open("spec/project-name/index.html"))
43
38
  doc.at_css("ul#menu a#selected")['href'].should == 'index.html'
44
39
  end
45
40
 
@@ -50,10 +45,10 @@ describe Compiler do
50
45
  end
51
46
  end
52
47
 
53
- context "with no '.config' file" do
48
+ context "with no 'config' file" do
54
49
  it "should exit" do
55
50
  $stdout.should_receive(:puts).with(/Missing config file/i)
56
- FileUtils.rm 'spec/project-name/.config'
51
+ FileUtils.rm 'spec/project-name/config'
57
52
  lambda{Compiler.new test_project_path}.should raise_error(SystemExit)
58
53
  end
59
54
  end
@@ -61,21 +56,21 @@ describe Compiler do
61
56
  describe "RSS feed" do
62
57
  it "should build the rss.xml file" do
63
58
  @compiler.compile
64
- File.exist?('spec/project-name/www/rss.xml').should be_true
59
+ File.exist?('spec/project-name/rss.xml').should be_true
65
60
  end
66
61
  end
67
62
 
68
63
  describe "Sitemap XML" do
69
64
  it "should build the 'sitemap.xml'" do
70
65
  a_news = %q{<h1>title</h1>}
71
- File.open('spec/project-name/news/2011-10-01.html', "w") do |out|
66
+ File.open('spec/project-name/src/news/2011-10-01.html', "w") do |out|
72
67
  out.puts a_news
73
68
  end
74
69
  @compiler.compile
75
- File.exist?('spec/project-name/www/sitemap.xml').should be_true
70
+ File.exist?('spec/project-name/sitemap.xml').should be_true
76
71
  end
77
72
  end
78
-
73
+
79
74
  context "with bad tag syntax" do
80
75
  context "with unknown class into template" do
81
76
  it "should exit" do
@@ -87,7 +82,7 @@ describe Compiler do
87
82
  </body>
88
83
  </html>
89
84
  }
90
- File.open('spec/project-name/templates/main.html', "w") do |out|
85
+ File.open('spec/project-name/src/templates/main.html', "w") do |out|
91
86
  out.puts main
92
87
  end
93
88
 
@@ -97,22 +92,22 @@ describe Compiler do
97
92
  end.should raise_error(SystemExit)
98
93
  end
99
94
  end
100
-
95
+
101
96
  context "with unknown class into page" do
102
97
  it "should exit" do
103
98
  # replace index.html
104
99
  index = %q{<genit class="foo"/>}
105
- File.open('spec/project-name/pages/index.html', "w") do |out|
100
+ File.open('spec/project-name/src/pages/index.html', "w") do |out|
106
101
  out.puts index
107
102
  end
108
-
103
+
109
104
  $stdout.should_receive(:puts).with(/Unknown tag <genit class="foo"/i)
110
105
  lambda do
111
106
  Compiler.new(test_project_path).compile
112
107
  end.should raise_error(SystemExit)
113
108
  end
114
109
  end
115
-
110
+
116
111
  context "with incomplete fragment tag into template" do
117
112
  it "should exit" do
118
113
  # replace main.html
@@ -123,22 +118,22 @@ describe Compiler do
123
118
  </body>
124
119
  </html>
125
120
  }
126
- File.open('spec/project-name/templates/main.html', "w") do |out|
121
+ File.open('spec/project-name/src/templates/main.html', "w") do |out|
127
122
  out.puts main
128
123
  end
129
-
124
+
130
125
  $stdout.should_receive(:puts).with(/Incomplete <genit class="fragment"/i)
131
126
  lambda do
132
127
  Compiler.new(test_project_path).compile
133
128
  end.should raise_error(SystemExit)
134
129
  end
135
130
  end
136
-
131
+
137
132
  context "with incomplete fragment tag into page" do
138
133
  it "should exit" do
139
134
  # replace index.html
140
135
  index = %q{<genit class="fragment"/>}
141
- File.open('spec/project-name/pages/index.html', "w") do |out|
136
+ File.open('spec/project-name/src/pages/index.html', "w") do |out|
142
137
  out.puts index
143
138
  end
144
139
 
@@ -148,7 +143,7 @@ describe Compiler do
148
143
  end.should raise_error(SystemExit)
149
144
  end
150
145
  end
151
-
146
+
152
147
  context "with unknown file in fragment tag into template" do
153
148
  it "should exit" do
154
149
  # replace main.html
@@ -159,10 +154,10 @@ describe Compiler do
159
154
  </body>
160
155
  </html>
161
156
  }
162
- File.open('spec/project-name/templates/main.html', "w") do |out|
157
+ File.open('spec/project-name/src/templates/main.html', "w") do |out|
163
158
  out.puts main
164
159
  end
165
-
160
+
166
161
  rx = /No such file <genit class="fragment" file=/i
167
162
  $stdout.should_receive(:puts).with(rx)
168
163
  lambda do
@@ -170,15 +165,15 @@ describe Compiler do
170
165
  end.should raise_error(SystemExit)
171
166
  end
172
167
  end
173
-
168
+
174
169
  context "with unknown file in fragment tag into page" do
175
170
  it "should exit" do
176
171
  # replace index.html
177
172
  index = %q{<genit class="fragment" file="unknown.html"/>}
178
- File.open('spec/project-name/pages/index.html', "w") do |out|
173
+ File.open('spec/project-name/src/pages/index.html', "w") do |out|
179
174
  out.puts index
180
175
  end
181
-
176
+
182
177
  rx = /No such file <genit class="fragment" file=/i
183
178
  $stdout.should_receive(:puts).with(rx)
184
179
  lambda do
@@ -186,7 +181,7 @@ describe Compiler do
186
181
  end.should raise_error(SystemExit)
187
182
  end
188
183
  end
189
-
184
+
190
185
  context "with here tag without what tag" do
191
186
  it "should warn" do
192
187
  # replace main.html
@@ -199,19 +194,19 @@ describe Compiler do
199
194
  </body>
200
195
  </html>
201
196
  }
202
- File.open('spec/project-name/templates/main.html', "w") do |out|
197
+ File.open('spec/project-name/src/templates/main.html', "w") do |out|
203
198
  out.puts main
204
199
  end
205
200
  $stdout.should_receive(:puts).with(/here without what/i)
206
201
  Compiler.new(test_project_path).compile
207
202
  end
208
203
  end
209
-
204
+
210
205
  end
211
-
212
- context "with bad '.config' syntax" do
206
+
207
+ context "with bad 'config' syntax" do
213
208
  it "should exit" do
214
- # replace .config
209
+ # replace config
215
210
  main =
216
211
  %q{---
217
212
  :address: http://www.example.com
@@ -219,38 +214,34 @@ describe Compiler do
219
214
  :rss_title: RSS TITLE
220
215
  :rss_description: RSS DESCRIPTION
221
216
  }
222
- File.open('spec/project-name/.config', "w") {|out| out.puts main }
223
-
224
- $stdout.should_receive(:puts).with(/in .config file/i)
217
+ File.open('spec/project-name/config', "w") {|out| out.puts main }
218
+
219
+ $stdout.should_receive(:puts).with(/in config file/i)
225
220
  lambda do
226
221
  Compiler.new(test_project_path).compile
227
222
  end.should raise_error(SystemExit)
228
223
  end
229
224
  end
230
-
225
+
231
226
  describe "BUGS" do
232
227
 
233
228
  it "should compile to valid HTML5" do
234
229
  @compiler.compile
235
- file = File.open("spec/project-name/www/index.html", "r")
230
+ file = File.open("spec/project-name/index.html", "r")
236
231
  contents = file.read
237
- puts "*************"
238
- puts contents
239
232
  expected = '<!DOCTYPE html>'
240
233
  contents.start_with?(expected).should be_true
241
234
  end
242
-
235
+
243
236
  it "should allow template to include a fragment (Bug#37)" do
244
237
  # add a fragment
245
- File.open('spec/project-name/fragments/footer.html', "w") do |out|
238
+ File.open('spec/project-name/src/fragments/footer.html', "w") do |out|
246
239
  out.puts '<p>footer</p>'
247
240
  end
248
241
  # replace main.html
249
242
  main = %q{
250
- <?xml version="1.0" encoding="UTF-8"?>
251
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
252
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
253
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
243
+ <!DOCTYPE html>
244
+ <html lang="en">
254
245
  <head>
255
246
  <title>Genit - Static web site framework</title>
256
247
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
@@ -267,12 +258,12 @@ describe Compiler do
267
258
  <genit class="fragment" file="footer.html"/>
268
259
  </body>
269
260
  </html>}
270
- File.open('spec/project-name/templates/main.html', "w") do |out|
261
+ File.open('spec/project-name/src/templates/main.html', "w") do |out|
271
262
  out.puts main
272
263
  end
273
264
  lambda {@compiler.compile}.should_not raise_error
274
265
  end
275
-
266
+
276
267
  end
277
-
268
+
278
269
  end