genit 0.5 → 0.9
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/NEWS +20 -0
- data/TODO +40 -4
- data/VERSION +1 -1
- data/bin/genit +10 -2
- data/data/pages/index.html +10 -11
- data/data/pages/index2.html +1 -0
- data/data/styles/screen.css +12 -3
- data/data/templates/html_5 +5 -0
- data/data/templates/main.html +0 -6
- data/data/templates/xhtml_1.0_strict +5 -0
- data/data/templates/xhtml_1.0_transitional +5 -0
- data/lib/genit.rb +5 -18
- data/lib/genit/builders.rb +8 -0
- data/lib/genit/{body_link_builder.rb → builders/body_link_builder.rb} +7 -3
- data/lib/genit/{builder.rb → builders/builder.rb} +0 -0
- data/lib/genit/{builder_base.rb → builders/builder_base.rb} +0 -0
- data/lib/genit/{head_link_builder.rb → builders/head_link_builder.rb} +5 -0
- data/lib/genit/builders/img_builder.rb +39 -0
- data/lib/genit/{menu_builder.rb → builders/menu_builder.rb} +0 -0
- data/lib/genit/builders/script_builder.rb +37 -0
- data/lib/genit/documents.rb +5 -0
- data/lib/genit/{document_writer.rb → documents/document_writer.rb} +0 -0
- data/lib/genit/{fragment.rb → documents/fragment.rb} +0 -0
- data/lib/genit/{html_document.rb → documents/html_document.rb} +0 -0
- data/lib/genit/{xml_document.rb → documents/xml_document.rb} +0 -0
- data/lib/genit/extensions.rb +2 -44
- data/lib/genit/extensions/nokogiri_extension.rb +37 -0
- data/lib/genit/extensions/string_extension.rb +17 -0
- data/lib/genit/project.rb +4 -0
- data/lib/genit/{compiler.rb → project/compiler.rb} +12 -0
- data/lib/genit/{page_compiler.rb → project/page_compiler.rb} +21 -2
- data/lib/genit/project/project_creator.rb +119 -0
- data/lib/genit/tags.rb +9 -0
- data/lib/genit/tags/class_fragment_tag.rb +30 -0
- data/lib/genit/tags/class_menu_tag.rb +36 -0
- data/lib/genit/tags/class_news_tag.rb +52 -0
- data/lib/genit/tags/class_pages_tag.rb +34 -0
- data/lib/genit/tags/class_tag.rb +38 -0
- data/lib/genit/{var_tag.rb → tags/here_tag.rb} +10 -5
- data/lib/genit/{tag.rb → tags/tag.rb} +0 -0
- data/lib/genit/{tag_processor.rb → tags/tag_processor.rb} +4 -3
- data/lib/genit/utils.rb +2 -0
- data/lib/genit/{file_writer.rb → utils/file_writer.rb} +0 -0
- data/spec/class_news_tag_spec.rb +36 -0
- data/spec/class_tag_spec.rb +13 -0
- data/spec/compiler_spec.rb +1 -1
- data/spec/menu_builder_spec.rb +0 -14
- data/spec/page_compiler_spec.rb +3 -4
- data/spec/project_creator_spec.rb +6 -2
- data/spec/tag_processor_spec.rb +8 -0
- metadata +46 -27
- data/lib/genit/class_tag.rb +0 -66
- data/lib/genit/project_creator.rb +0 -72
@@ -0,0 +1,37 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
module Nokogiri
|
4
|
+
module XML
|
5
|
+
|
6
|
+
# I think it's a bad idea to extend the Nokogiri library cause it makes a
|
7
|
+
# too big dependency on Genit.
|
8
|
+
# It will be much better to do a little wrapper over Nokogiri::XML::Node.
|
9
|
+
class Node
|
10
|
+
|
11
|
+
def genit_class?
|
12
|
+
if self['class']
|
13
|
+
true
|
14
|
+
else
|
15
|
+
false
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def genit_here?
|
20
|
+
if self['here']
|
21
|
+
true
|
22
|
+
else
|
23
|
+
false
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def genit_what?
|
28
|
+
if self['what']
|
29
|
+
true
|
30
|
+
else
|
31
|
+
false
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
class String
|
4
|
+
|
5
|
+
def force_html_extension
|
6
|
+
self.gsub /markdown$/, 'html'
|
7
|
+
end
|
8
|
+
|
9
|
+
def force_html_extension!
|
10
|
+
self.gsub! /markdown$/, 'html'
|
11
|
+
end
|
12
|
+
|
13
|
+
def markdown_ext?
|
14
|
+
self.end_with?('.markdown')
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
@@ -17,6 +17,7 @@ module Genit
|
|
17
17
|
# Public: Compile the web site.
|
18
18
|
def compile
|
19
19
|
if genit_project_folder?
|
20
|
+
remove_content_of_www
|
20
21
|
compile_site
|
21
22
|
else
|
22
23
|
puts 'Not a genit project folder'
|
@@ -29,9 +30,20 @@ module Genit
|
|
29
30
|
File.exist?(File.join(@working_dir, '.genit'))
|
30
31
|
end
|
31
32
|
|
33
|
+
def remove_content_of_www
|
34
|
+
Dir.foreach(File.join(@working_dir, 'www')) do |file|
|
35
|
+
next if (file == ".") or (file == "..")
|
36
|
+
filename = File.join(@working_dir, 'www', file)
|
37
|
+
FileUtils.remove_dir(filename) if File.directory?(filename)
|
38
|
+
FileUtils.remove_file(filename) if File.file?(filename)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
32
42
|
def compile_site
|
33
43
|
compile_pages
|
34
44
|
FileUtils.cp_r File.join(@working_dir, 'styles'), File.join(@working_dir, 'www')
|
45
|
+
FileUtils.cp_r File.join(@working_dir, 'public'), File.join(@working_dir, 'www')
|
46
|
+
FileUtils.cp_r File.join(@working_dir, 'scripts'), File.join(@working_dir, 'www')
|
35
47
|
end
|
36
48
|
|
37
49
|
def compile_pages
|
@@ -21,17 +21,36 @@ module Genit
|
|
21
21
|
def compile
|
22
22
|
compile_body
|
23
23
|
compile_head
|
24
|
+
|
25
|
+
builder = ScriptBuilder.new @template
|
26
|
+
builder.build_for_page @filename
|
24
27
|
end
|
25
28
|
|
26
29
|
private
|
27
30
|
|
28
31
|
def compile_body
|
32
|
+
# Pourquoi 2 fois ?
|
33
|
+
# Parce que la 1ere fois, on inclus essentiellement la page au sein du
|
34
|
+
# template, et la seconde fois, on s'occupe des tags restants (ceux qui
|
35
|
+
# étaient dans la page).
|
36
|
+
# Suivant comment la hiérarchie de tag évoluera, il est possible qu'on
|
37
|
+
# ai un jour besoin de faire une boucle du genre :
|
38
|
+
# "Tant qu'il reste des tags"
|
39
|
+
2.times { replace_all_genit_tags }
|
40
|
+
|
41
|
+
builder = BodyLinkBuilder.new @template
|
42
|
+
@template = builder.build_for_page @filename
|
43
|
+
|
44
|
+
builder = ImgBuilder.new @template
|
45
|
+
@template = builder.build_for_page @filename
|
46
|
+
end
|
47
|
+
|
48
|
+
def replace_all_genit_tags
|
29
49
|
genit_tags_in_template.each do |tag|
|
50
|
+
next if tag.genit_what?
|
30
51
|
tp = TagProcessor.new(@working_dir, @template, @filename, tag)
|
31
52
|
@template = tp.process
|
32
53
|
end
|
33
|
-
builder = BodyLinkBuilder.new @template
|
34
|
-
@template = builder.build_for_page @filename
|
35
54
|
end
|
36
55
|
|
37
56
|
def compile_head
|
@@ -0,0 +1,119 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require "fileutils"
|
4
|
+
|
5
|
+
module Genit
|
6
|
+
|
7
|
+
# Create a skeleton project.
|
8
|
+
class ProjectCreator
|
9
|
+
|
10
|
+
# Sole constructor.
|
11
|
+
#
|
12
|
+
# name - The String name of the future project folder.
|
13
|
+
# doctype - The String document type definition.
|
14
|
+
# empty - A Boolean telling if we produce a smoke test or not.
|
15
|
+
def initialize name, doctype, empty
|
16
|
+
@name = name
|
17
|
+
@doctype = doctype
|
18
|
+
@empty = empty
|
19
|
+
end
|
20
|
+
|
21
|
+
# Public: Create the structure of the project, that is many
|
22
|
+
# files and folders.
|
23
|
+
#
|
24
|
+
# Returns nothing.
|
25
|
+
def create
|
26
|
+
begin
|
27
|
+
create_the_project
|
28
|
+
rescue SystemCallError
|
29
|
+
puts "Cannot create project..."
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def create_the_project
|
36
|
+
FileUtils.makedirs @name
|
37
|
+
create_dirs ['fragments', 'news', 'pages', 'scripts', 'styles', 'templates', 'www',
|
38
|
+
'styles/alsa', 'styles/yui', 'styles/images', 'public']
|
39
|
+
copy_main_template
|
40
|
+
copy_files ['templates/menu.html', 'styles/handheld.css', 'styles/print.css',
|
41
|
+
'styles/alsa/all.css', 'styles/yui/all.css', 'styles/yui/base.css',
|
42
|
+
'styles/yui/fonts.css', 'styles/yui/reset.css']
|
43
|
+
copy_index
|
44
|
+
copy_screen_css
|
45
|
+
FileUtils.touch "#{@name}/.genit"
|
46
|
+
end
|
47
|
+
|
48
|
+
# Create some subfolders inside the project folder.
|
49
|
+
#
|
50
|
+
# a_array - An Array of String subfolder names
|
51
|
+
#
|
52
|
+
# Examples
|
53
|
+
#
|
54
|
+
# create_dirs ['styles', 'scripts']
|
55
|
+
#
|
56
|
+
# create_dirs ['styles/css/alsa', 'styles/css/yui', 'styles/css/images']
|
57
|
+
#
|
58
|
+
# Returns nothing.
|
59
|
+
def create_dirs a_array
|
60
|
+
a_array.each {|dir| FileUtils.makedirs File.join(@name, dir) }
|
61
|
+
end
|
62
|
+
|
63
|
+
# Copy files to project.
|
64
|
+
#
|
65
|
+
# a_array - An Array of String "subfolder/file" names
|
66
|
+
#
|
67
|
+
# Example
|
68
|
+
#
|
69
|
+
# copy_files ['templates/main.html', 'pages/index.html']
|
70
|
+
#
|
71
|
+
# Returns nothing.
|
72
|
+
def copy_files a_array
|
73
|
+
a_array.each do |file|
|
74
|
+
src = File.join $GENIT_PATH, 'data', file
|
75
|
+
dest = File.join @name, file
|
76
|
+
FileUtils.cp src, dest
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def copy_index
|
81
|
+
dest = File.join @name, 'pages/index.html'
|
82
|
+
if @empty
|
83
|
+
src = File.join $GENIT_PATH, 'data/pages/index2.html'
|
84
|
+
else
|
85
|
+
src = File.join $GENIT_PATH, 'data/pages/index.html'
|
86
|
+
end
|
87
|
+
FileUtils.cp src, dest
|
88
|
+
end
|
89
|
+
|
90
|
+
def copy_screen_css
|
91
|
+
dest = File.join @name, 'styles/screen.css'
|
92
|
+
if @empty
|
93
|
+
FileUtils.touch dest
|
94
|
+
else
|
95
|
+
src = File.join $GENIT_PATH, 'data/styles/screen.css'
|
96
|
+
FileUtils.cp src, dest
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def copy_main_template
|
101
|
+
dest = File.join @name, 'templates', 'main.html'
|
102
|
+
copy_first_part dest
|
103
|
+
ProjectCreator.append_last_part dest
|
104
|
+
end
|
105
|
+
|
106
|
+
def copy_first_part dest
|
107
|
+
src = File.join $GENIT_PATH, 'data', 'templates', @doctype
|
108
|
+
FileUtils.cp src, dest
|
109
|
+
end
|
110
|
+
|
111
|
+
def self.append_last_part dest
|
112
|
+
src = File.join $GENIT_PATH, 'data', 'templates', 'main.html'
|
113
|
+
content = File.open(src, "r").read
|
114
|
+
File.open(dest, "a") {|out| out.puts content }
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|
data/lib/genit/tags.rb
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require 'genit/tags/tag_processor'
|
3
|
+
require 'genit/tags/tag'
|
4
|
+
require 'genit/tags/here_tag'
|
5
|
+
require 'genit/tags/class_tag'
|
6
|
+
require 'genit/tags/class_pages_tag'
|
7
|
+
require 'genit/tags/class_menu_tag'
|
8
|
+
require 'genit/tags/class_fragment_tag'
|
9
|
+
require 'genit/tags/class_news_tag'
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
module Genit
|
4
|
+
|
5
|
+
# Replace the <genit class="fragment"/> in the template.
|
6
|
+
class ClassFragmentTag < Tag
|
7
|
+
|
8
|
+
# Public: Constructor.
|
9
|
+
#
|
10
|
+
# working_dir - The String working directory, where live the project.
|
11
|
+
# template - The Nokogiri::XML::Document into which we process the tag.
|
12
|
+
# filename - The String name of the page
|
13
|
+
# tag - The tag to process as a Nokogiri::XML::Element
|
14
|
+
def initialize working_dir, template, filename, tag
|
15
|
+
super working_dir, template, filename, tag
|
16
|
+
end
|
17
|
+
|
18
|
+
# Public: Do the replacement.
|
19
|
+
#
|
20
|
+
# Returns the template as a Nokogiri::XML::Document
|
21
|
+
def process
|
22
|
+
file = @tag['file']
|
23
|
+
fragment = HtmlDocument.build_page_content(File.join(@working_dir, 'fragments', file), @working_dir)
|
24
|
+
css_rule = "genit.fragment[file='#{file}']"
|
25
|
+
replace_tag_into_template! css_rule, fragment.to_s
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
module Genit
|
4
|
+
|
5
|
+
# Replace the <genit class="menu"/> in the template.
|
6
|
+
class ClassMenuTag < Tag
|
7
|
+
|
8
|
+
# Public: Constructor.
|
9
|
+
#
|
10
|
+
# working_dir - The String working directory, where live the project.
|
11
|
+
# template - The Nokogiri::XML::Document into which we process the tag.
|
12
|
+
# filename - The String name of the page
|
13
|
+
# tag - The tag to process as a Nokogiri::XML::Element
|
14
|
+
def initialize working_dir, template, filename, tag
|
15
|
+
super working_dir, template, filename, tag
|
16
|
+
end
|
17
|
+
|
18
|
+
# Public: Do the replacement.
|
19
|
+
#
|
20
|
+
# Returns the template as a Nokogiri::XML::Document
|
21
|
+
def process
|
22
|
+
build_menu
|
23
|
+
replace_tag_into_template! 'genit.menu', @menu.to_html
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def build_menu
|
29
|
+
menu = XmlDocument.open(File.join(@working_dir, "templates/menu.html"))
|
30
|
+
builder = MenuBuilder.new(menu)
|
31
|
+
@menu = builder.build_for_page(@filename)
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
module Genit
|
4
|
+
|
5
|
+
# Replace the <genit class="news"/> in the template.
|
6
|
+
class ClassNewsTag < Tag
|
7
|
+
|
8
|
+
# Public: Constructor.
|
9
|
+
#
|
10
|
+
# working_dir - The String working directory, where live the project.
|
11
|
+
# template - The Nokogiri::XML::Document into which we process the tag.
|
12
|
+
# filename - The String name of the page
|
13
|
+
# tag - The tag to process as a Nokogiri::XML::Element
|
14
|
+
def initialize working_dir, template, filename, tag
|
15
|
+
super working_dir, template, filename, tag
|
16
|
+
end
|
17
|
+
|
18
|
+
# Public: Do the replacement.
|
19
|
+
#
|
20
|
+
# Returns the template as a Nokogiri::XML::Document
|
21
|
+
def process
|
22
|
+
replace_tag_into_template! 'genit.news', news_content
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def news_content
|
28
|
+
news_string = ''
|
29
|
+
news_files.each do |file|
|
30
|
+
doc = HtmlDocument.open_as_string file
|
31
|
+
if @tag['wrapper']
|
32
|
+
news_string += "<div class='#{@tag['wrapper']}'>" + doc.to_s + '</div>'
|
33
|
+
else
|
34
|
+
news_string += doc.to_s
|
35
|
+
end
|
36
|
+
end
|
37
|
+
news_string
|
38
|
+
end
|
39
|
+
|
40
|
+
def news_files
|
41
|
+
files = Dir.glob(File.join(@working_dir, 'news', '*')).sort.reverse
|
42
|
+
number = @tag['number']
|
43
|
+
if number
|
44
|
+
files[0...(number).to_i]
|
45
|
+
else
|
46
|
+
files
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
module Genit
|
4
|
+
|
5
|
+
# Replace the <genit class="pages"/> in the template.
|
6
|
+
class ClassPagesTag < Tag
|
7
|
+
|
8
|
+
# Public: Constructor.
|
9
|
+
#
|
10
|
+
# working_dir - The String working directory, where live the project.
|
11
|
+
# template - The Nokogiri::XML::Document into which we process the tag.
|
12
|
+
# filename - The String name of the page
|
13
|
+
# tag - The tag to process as a Nokogiri::XML::Element
|
14
|
+
def initialize working_dir, template, filename, tag
|
15
|
+
super working_dir, template, filename, tag
|
16
|
+
end
|
17
|
+
|
18
|
+
# Public: Do the replacement.
|
19
|
+
#
|
20
|
+
# Returns the template as a Nokogiri::XML::Document
|
21
|
+
def process
|
22
|
+
replace_tag_into_template! 'genit.pages', page_content
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def page_content
|
28
|
+
filename = File.join(@working_dir, 'pages', @filename)
|
29
|
+
HtmlDocument.build_page_content filename, @working_dir
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
module Genit
|
4
|
+
|
5
|
+
# A Genit general tag.
|
6
|
+
# Currently we have three tags:
|
7
|
+
# * <genit class="pages"/>
|
8
|
+
# * <genit class="menu"/>
|
9
|
+
# * <genit class="fragment" file="foo.html"/>
|
10
|
+
class ClassTag < Tag
|
11
|
+
|
12
|
+
# Public: Constructor.
|
13
|
+
#
|
14
|
+
# working_dir - The String working directory, where live the project.
|
15
|
+
# template - The Nokogiri::XML::Document into which we process the tag.
|
16
|
+
# filename - The String name of the page
|
17
|
+
# tag - The tag to process as a Nokogiri::XML::Element
|
18
|
+
def initialize working_dir, template, filename, tag
|
19
|
+
super working_dir, template, filename, tag
|
20
|
+
end
|
21
|
+
|
22
|
+
# Public: Replace something in the template.
|
23
|
+
#
|
24
|
+
# Returns the template as a Nokogiri::XML::Document
|
25
|
+
def process
|
26
|
+
case @tag['class']
|
27
|
+
when 'pages' then ClassPagesTag.new(@working_dir, @template, @filename, @tag).process
|
28
|
+
when 'menu' then ClassMenuTag.new(@working_dir, @template, @filename, @tag).process
|
29
|
+
when 'fragment' then ClassFragmentTag.new(@working_dir, @template, @filename, @tag).process
|
30
|
+
when 'news' then ClassNewsTag.new(@working_dir, @template, @filename, @tag).process
|
31
|
+
else
|
32
|
+
raise RuntimeError
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|