genit 0.99 → 1.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/NEWS +16 -1
- data/TODO +32 -0
- data/VERSION +1 -1
- data/lib/genit.rb +15 -0
- data/lib/genit/builders.rb +2 -0
- data/lib/genit/builders/body_link_builder.rb +3 -17
- data/lib/genit/builders/head_link_builder.rb +3 -15
- data/lib/genit/builders/img_builder.rb +3 -17
- data/lib/genit/builders/relativizer.rb +27 -0
- data/lib/genit/builders/script_builder.rb +4 -16
- data/lib/genit/documents.rb +1 -0
- data/lib/genit/documents/fragment.rb +3 -0
- data/lib/genit/documents/sitemap.rb +44 -0
- data/lib/genit/project.rb +1 -0
- data/lib/genit/project/compiler.rb +22 -9
- data/lib/genit/project/pages_finder.rb +32 -0
- data/lib/genit/project/project_creator.rb +9 -3
- data/lib/genit/tags/class_fragment_tag.rb +6 -3
- data/lib/genit/tags/class_tag.rb +2 -6
- data/lib/genit/tags/here_tag.rb +3 -3
- data/spec/class_tag_spec.rb +1 -1
- data/spec/compiler_spec.rb +154 -9
- data/spec/helper.rb +4 -0
- data/spec/news_utils_spec.rb +14 -0
- data/spec/pages_finder_spec.rb +58 -0
- data/spec/project_creator_spec.rb +6 -0
- data/spec/sitemap_spec.rb +42 -0
- metadata +16 -10
data/NEWS
CHANGED
|
@@ -1,6 +1,21 @@
|
|
|
1
|
+
v1.0 2011-10-02
|
|
2
|
+
|
|
3
|
+
* Genit creates a sitemap.xml
|
|
4
|
+
|
|
5
|
+
* Genit put an error message when:
|
|
6
|
+
- config file not present
|
|
7
|
+
- unknown tag
|
|
8
|
+
- bad or incomplete fragment tag
|
|
9
|
+
- syntax error in .config
|
|
10
|
+
|
|
11
|
+
* Genit put a warning message when a here tag is used without its counterpart
|
|
12
|
+
|
|
13
|
+
* Version is added to the .genit file
|
|
14
|
+
|
|
15
|
+
|
|
1
16
|
v0.99 2011-09-25
|
|
2
17
|
|
|
3
|
-
* Genit
|
|
18
|
+
* Genit creates an RSS feed for your news articles
|
|
4
19
|
|
|
5
20
|
|
|
6
21
|
v0.9 2011-09-04
|
data/TODO
CHANGED
|
@@ -1,3 +1,35 @@
|
|
|
1
1
|
|
|
2
|
+
sitemap
|
|
3
|
+
------------------
|
|
4
|
+
*trouver la liste des pages (et markdown ?))
|
|
5
|
+
*transformer liste page en liste url
|
|
6
|
+
*construire le sitemap
|
|
7
|
+
*tout ensemble
|
|
8
|
+
*la doc
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
messages erreur
|
|
12
|
+
----------------
|
|
13
|
+
|
|
14
|
+
*Les deux fichiers cachés doivent être présent à la compil
|
|
15
|
+
*<genit class="foo" /> dans le template fait un RuntimeError. Idem dans une page.
|
|
16
|
+
*<genit class="fragment"/> dans template ou page fait une erreur moche.
|
|
17
|
+
*<genit class="fragment" file="inconnu.html"/> fait une erreur moche.
|
|
18
|
+
*une erreur de syntaxe dans le .config fait une erreur moche.
|
|
19
|
+
|
|
20
|
+
*<genit here="window_title"/> sans contrepartie ne fait rien, il faudrait un warning.
|
|
21
|
+
|
|
22
|
+
si j'écris <h1>news page (en oubliant le tag de fin) Genit ne dis
|
|
23
|
+
rien et ajoute silencieusement le </h1>. Voir si on peut lui faire
|
|
24
|
+
cracher un warning (ou une erreur si pas possible warning).
|
|
25
|
+
|
|
26
|
+
Quand je fais reférence à une url interne inexistante, il serait bon
|
|
27
|
+
d'avoir un warning.
|
|
28
|
+
|
|
29
|
+
dans le dossier page on accepte uniquement .html et .markdown (warning)
|
|
30
|
+
|
|
31
|
+
fichier .genit
|
|
32
|
+
---------------
|
|
33
|
+
*ajouter la version
|
|
2
34
|
|
|
3
35
|
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0
|
|
1
|
+
1.0
|
data/lib/genit.rb
CHANGED
|
@@ -6,5 +6,20 @@ require 'genit/utils'
|
|
|
6
6
|
require 'genit/builders'
|
|
7
7
|
require 'genit/tags'
|
|
8
8
|
|
|
9
|
+
module Errors
|
|
10
|
+
|
|
11
|
+
def error message
|
|
12
|
+
puts "Error: #{message}"
|
|
13
|
+
exit 1
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def warning message
|
|
17
|
+
puts "Warning: #{message}"
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
end
|
|
21
|
+
|
|
9
22
|
module Genit
|
|
23
|
+
include Errors
|
|
24
|
+
|
|
10
25
|
end
|
data/lib/genit/builders.rb
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
|
2
2
|
require 'genit/builders/builder'
|
|
3
3
|
require 'genit/builders/builder_base'
|
|
4
|
+
require 'genit/builders/relativizer'
|
|
4
5
|
require 'genit/builders/menu_builder'
|
|
5
6
|
require 'genit/builders/head_link_builder'
|
|
6
7
|
require 'genit/builders/body_link_builder'
|
|
7
8
|
require 'genit/builders/img_builder'
|
|
8
9
|
require 'genit/builders/script_builder'
|
|
10
|
+
|
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
|
2
2
|
|
|
3
|
-
require 'uri'
|
|
4
|
-
|
|
5
3
|
module Genit
|
|
6
4
|
|
|
7
5
|
# Modify links.
|
|
8
|
-
class BodyLinkBuilder <
|
|
6
|
+
class BodyLinkBuilder < Relativizer
|
|
9
7
|
|
|
10
8
|
# Public: Relativize links.
|
|
11
9
|
#
|
|
@@ -13,25 +11,13 @@ module Genit
|
|
|
13
11
|
#
|
|
14
12
|
# Returns the modified Nokogiri::XML::Document
|
|
15
13
|
def build_for_page page_name
|
|
16
|
-
build page_name,
|
|
14
|
+
build page_name, @document.css("body a")
|
|
17
15
|
end
|
|
18
16
|
|
|
19
17
|
private
|
|
20
18
|
|
|
21
|
-
def get_links
|
|
22
|
-
@document.css("body a")
|
|
23
|
-
end
|
|
24
|
-
|
|
25
19
|
def update link
|
|
26
|
-
|
|
27
|
-
return if not_an_internal_link?
|
|
28
|
-
nb = BuilderBase::get_number_of_base_dirs @page_name
|
|
29
|
-
make_relative nb
|
|
30
|
-
link['href'] = @path
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
def not_an_internal_link?
|
|
34
|
-
@path.nil? or @path =~ URI::regexp
|
|
20
|
+
super link, "href"
|
|
35
21
|
end
|
|
36
22
|
|
|
37
23
|
end
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
module Genit
|
|
4
4
|
|
|
5
5
|
# Modify head link tags.
|
|
6
|
-
class HeadLinkBuilder <
|
|
6
|
+
class HeadLinkBuilder < Relativizer
|
|
7
7
|
|
|
8
8
|
# Public: Build the document head link tags of a particular page.
|
|
9
9
|
#
|
|
@@ -11,25 +11,13 @@ module Genit
|
|
|
11
11
|
#
|
|
12
12
|
# Returns the modified Nokogiri::XML::Document
|
|
13
13
|
def build_for_page page_name
|
|
14
|
-
build page_name,
|
|
14
|
+
build page_name, @document.css("head link")
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
private
|
|
18
18
|
|
|
19
|
-
def head_links
|
|
20
|
-
@document.css("head link")
|
|
21
|
-
end
|
|
22
|
-
|
|
23
19
|
def update link
|
|
24
|
-
|
|
25
|
-
return if not_an_internal_link?
|
|
26
|
-
nb = BuilderBase::get_number_of_base_dirs @page_name
|
|
27
|
-
make_relative nb
|
|
28
|
-
link['href'] = @path
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
def not_an_internal_link?
|
|
32
|
-
@path.nil? or @path =~ URI::regexp
|
|
20
|
+
super link, "href"
|
|
33
21
|
end
|
|
34
22
|
|
|
35
23
|
end
|
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
|
2
2
|
|
|
3
|
-
require 'uri'
|
|
4
|
-
|
|
5
3
|
module Genit
|
|
6
4
|
|
|
7
5
|
# Modify img src.
|
|
8
|
-
class ImgBuilder <
|
|
6
|
+
class ImgBuilder < Relativizer
|
|
9
7
|
|
|
10
8
|
# Public: Relativize image source.
|
|
11
9
|
#
|
|
@@ -13,25 +11,13 @@ module Genit
|
|
|
13
11
|
#
|
|
14
12
|
# Returns the modified Nokogiri::XML::Document
|
|
15
13
|
def build_for_page page_name
|
|
16
|
-
build page_name,
|
|
14
|
+
build page_name, @document.css("body img")
|
|
17
15
|
end
|
|
18
16
|
|
|
19
17
|
private
|
|
20
18
|
|
|
21
|
-
def get_links
|
|
22
|
-
@document.css("body img")
|
|
23
|
-
end
|
|
24
|
-
|
|
25
19
|
def update link
|
|
26
|
-
|
|
27
|
-
return if not_an_internal_link?
|
|
28
|
-
nb = BuilderBase::get_number_of_base_dirs @page_name
|
|
29
|
-
make_relative nb
|
|
30
|
-
link['src'] = @path
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
def not_an_internal_link?
|
|
34
|
-
@path.nil? or @path =~ URI::regexp
|
|
20
|
+
super link, "src"
|
|
35
21
|
end
|
|
36
22
|
|
|
37
23
|
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
require 'uri'
|
|
4
|
+
|
|
5
|
+
module Genit
|
|
6
|
+
|
|
7
|
+
# Base class for builder that should relativize
|
|
8
|
+
# some links in a XHTML document.
|
|
9
|
+
class Relativizer < BuilderBase
|
|
10
|
+
|
|
11
|
+
def not_an_internal_link?
|
|
12
|
+
@path.nil? or @path =~ URI::regexp
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
private
|
|
16
|
+
|
|
17
|
+
def update link, field
|
|
18
|
+
@path = link[field]
|
|
19
|
+
return if not_an_internal_link?
|
|
20
|
+
nb = BuilderBase::get_number_of_base_dirs @page_name
|
|
21
|
+
make_relative nb
|
|
22
|
+
link[field] = @path
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
end
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
module Genit
|
|
4
4
|
|
|
5
5
|
# Modify script tags.
|
|
6
|
-
class ScriptBuilder <
|
|
6
|
+
class ScriptBuilder < Relativizer
|
|
7
7
|
|
|
8
8
|
# Public: Relativize the <script src=""> tags of a particular page.
|
|
9
9
|
#
|
|
@@ -11,27 +11,15 @@ module Genit
|
|
|
11
11
|
#
|
|
12
12
|
# Returns the modified Nokogiri::XML::Document
|
|
13
13
|
def build_for_page page_name
|
|
14
|
-
build page_name,
|
|
14
|
+
build page_name, @document.css("script")
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
private
|
|
18
18
|
|
|
19
|
-
def head_links
|
|
20
|
-
@document.css("script")
|
|
21
|
-
end
|
|
22
|
-
|
|
23
19
|
def update link
|
|
24
|
-
|
|
25
|
-
return if not_an_internal_link?
|
|
26
|
-
nb = BuilderBase::get_number_of_base_dirs @page_name
|
|
27
|
-
make_relative nb
|
|
28
|
-
link['src'] = @path
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
def not_an_internal_link?
|
|
32
|
-
@path.nil? or @path =~ URI::regexp
|
|
20
|
+
super link, "src"
|
|
33
21
|
end
|
|
34
|
-
|
|
22
|
+
|
|
35
23
|
end
|
|
36
24
|
|
|
37
25
|
end
|
data/lib/genit/documents.rb
CHANGED
|
@@ -10,12 +10,15 @@ module Genit
|
|
|
10
10
|
# file - Full String filename of the page.
|
|
11
11
|
# working_dir - The String working directory, where live the project.
|
|
12
12
|
def initialize file, working_dir
|
|
13
|
+
|
|
13
14
|
@page = HtmlDocument.open_fragment file
|
|
14
15
|
@working_dir = working_dir
|
|
15
16
|
HtmlDocument.genit_tags_from(@page).each do |tag|
|
|
16
17
|
case tag['class']
|
|
17
18
|
when 'fragment'
|
|
18
19
|
@file = tag['file']
|
|
20
|
+
error "Incomplete #{tag}" if @file.nil?
|
|
21
|
+
error "No such file #{tag}" unless File.exists?(File.join(@working_dir, 'fragments', @file))
|
|
19
22
|
replace_fragment
|
|
20
23
|
end
|
|
21
24
|
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
module Genit
|
|
4
|
+
|
|
5
|
+
# Build an XML sitemap.
|
|
6
|
+
class Sitemap
|
|
7
|
+
|
|
8
|
+
# Public: Constructor.
|
|
9
|
+
#
|
|
10
|
+
# urls - an Array of all the URLs to include in the sitemap.
|
|
11
|
+
def initialize urls
|
|
12
|
+
@builder = Sitemap.builder urls
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Public: Get the sitemap
|
|
16
|
+
#
|
|
17
|
+
# Returns the sitemap as a String.
|
|
18
|
+
def get
|
|
19
|
+
@builder.to_xml
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
private
|
|
23
|
+
|
|
24
|
+
def self.builder urls
|
|
25
|
+
Nokogiri::XML::Builder.new { |xml| Sitemap.build_urlset xml, urls }
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def self.build_urlset xml, urls
|
|
29
|
+
xml.urlset('xmlns' => 'http://www.sitemaps.org/schemas/sitemap/0.9') do
|
|
30
|
+
Sitemap.build_url_elements xml, urls
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def self.build_url_elements xml, urls
|
|
35
|
+
urls.each { |elem| Sitemap.build_loc_element xml, elem }
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def self.build_loc_element xml, elem
|
|
39
|
+
xml.url { xml.loc elem }
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
end
|
data/lib/genit/project.rb
CHANGED
|
@@ -12,22 +12,22 @@ module Genit
|
|
|
12
12
|
# working_dir - The String working directory, where live the project.
|
|
13
13
|
def initialize working_dir
|
|
14
14
|
@working_dir = working_dir
|
|
15
|
+
check_missing_file '.genit', 'Not a genit project folder'
|
|
16
|
+
check_missing_file '.config', 'Missing config file'
|
|
15
17
|
end
|
|
16
18
|
|
|
17
19
|
# Public: Compile the web site.
|
|
18
20
|
def compile
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
compile_site
|
|
22
|
-
else
|
|
23
|
-
puts 'Not a genit project folder'
|
|
24
|
-
end
|
|
21
|
+
remove_content_of_www
|
|
22
|
+
compile_site
|
|
25
23
|
end
|
|
26
24
|
|
|
27
25
|
private
|
|
28
26
|
|
|
29
|
-
def
|
|
30
|
-
File.exist?(File.join(@working_dir,
|
|
27
|
+
def check_missing_file filename, message
|
|
28
|
+
unless File.exist?(File.join(@working_dir, filename))
|
|
29
|
+
error message
|
|
30
|
+
end
|
|
31
31
|
end
|
|
32
32
|
|
|
33
33
|
def remove_content_of_www
|
|
@@ -43,6 +43,7 @@ module Genit
|
|
|
43
43
|
compile_pages
|
|
44
44
|
copy_static_content
|
|
45
45
|
create_rss_feed
|
|
46
|
+
create_sitemap_xml
|
|
46
47
|
end
|
|
47
48
|
|
|
48
49
|
def compile_pages
|
|
@@ -73,11 +74,23 @@ module Genit
|
|
|
73
74
|
|
|
74
75
|
def create_rss_feed
|
|
75
76
|
all_news_files = Dir.glob(File.join(@working_dir, 'news', '*')).sort.reverse
|
|
76
|
-
|
|
77
|
+
begin
|
|
78
|
+
config_file = YAML.load_file(File.join(@working_dir, '.config'))
|
|
79
|
+
rescue ArgumentError => msg
|
|
80
|
+
error "In .config file: #{msg}"
|
|
81
|
+
end
|
|
77
82
|
return unless config_file[:rss]
|
|
78
83
|
RssFeed.new(@working_dir, all_news_files, config_file).generate_rss
|
|
79
84
|
end
|
|
80
85
|
|
|
86
|
+
def create_sitemap_xml
|
|
87
|
+
pages = PagesFinder.new(@working_dir).find
|
|
88
|
+
config_file = YAML.load_file(File.join(@working_dir, '.config'))
|
|
89
|
+
urls = PagesFinder.pagenames2urls(pages, config_file[:address])
|
|
90
|
+
sitemap = Sitemap.new(urls).get
|
|
91
|
+
FileWriter.write sitemap, File.join(@working_dir, 'www', 'sitemap.xml')
|
|
92
|
+
end
|
|
93
|
+
|
|
81
94
|
end
|
|
82
95
|
|
|
83
96
|
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
module Genit
|
|
4
|
+
|
|
5
|
+
# I can find the list of all page names, named from
|
|
6
|
+
# the site root.
|
|
7
|
+
class PagesFinder
|
|
8
|
+
|
|
9
|
+
# Public: Constructor.
|
|
10
|
+
#
|
|
11
|
+
# working_dir - The String working directory, where live the project.
|
|
12
|
+
def initialize working_dir
|
|
13
|
+
@working_dir = working_dir
|
|
14
|
+
@pages_folder = File.join(@working_dir, 'pages')
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# Public: Retrieve the list of all page names.
|
|
18
|
+
#
|
|
19
|
+
# Returns an Array of String.
|
|
20
|
+
def find
|
|
21
|
+
list = Dir.glob(File.join(@pages_folder, '**/*'))
|
|
22
|
+
list.map! { |name| name.gsub(@pages_folder + '/', '')}
|
|
23
|
+
list.map { |name| name.force_html_extension }
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def self.pagenames2urls array, url_string
|
|
27
|
+
array.map { |name| File.join(url_string, name) }
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
end
|
|
@@ -55,13 +55,19 @@ module Genit
|
|
|
55
55
|
end
|
|
56
56
|
|
|
57
57
|
def create_the_project_config
|
|
58
|
-
|
|
58
|
+
version = File.read(File.join($GENIT_PATH, 'VERSION')).strip
|
|
59
|
+
write_config version, '.genit'
|
|
60
|
+
|
|
59
61
|
config_file = { :address => 'http://www.example.com',
|
|
60
62
|
:rss => true,
|
|
61
63
|
:rss_title => 'RSS TITLE',
|
|
62
64
|
:rss_description => 'RSS DESCRIPTION'}.to_yaml
|
|
63
|
-
|
|
64
|
-
|
|
65
|
+
write_config config_file, '.config'
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def write_config content, filename
|
|
69
|
+
dest = File.join @project_name, filename
|
|
70
|
+
File.open(dest, "w") {|out| out.puts content }
|
|
65
71
|
end
|
|
66
72
|
|
|
67
73
|
# Create some subfolders inside the project folder.
|
|
@@ -13,15 +13,18 @@ module Genit
|
|
|
13
13
|
# tag - The tag to process as a Nokogiri::XML::Element
|
|
14
14
|
def initialize working_dir, template, filename, tag
|
|
15
15
|
super working_dir, template, filename, tag
|
|
16
|
+
@file = @tag['file']
|
|
17
|
+
error "Incomplete #{@tag}" if @file.nil?
|
|
18
|
+
@full_path = File.join(@working_dir, 'fragments', @file)
|
|
19
|
+
error "No such file #{@tag}" unless File.exists?(@full_path)
|
|
16
20
|
end
|
|
17
21
|
|
|
18
22
|
# Public: Do the replacement.
|
|
19
23
|
#
|
|
20
24
|
# Returns the template as a Nokogiri::XML::Document
|
|
21
25
|
def process
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
css_rule = "genit.fragment[file='#{file}']"
|
|
26
|
+
fragment = HtmlDocument.build_page_content(@full_path, @working_dir)
|
|
27
|
+
css_rule = "genit.fragment[file='#{@file}']"
|
|
25
28
|
replace_tag_into_template! css_rule, fragment.to_s
|
|
26
29
|
end
|
|
27
30
|
|
data/lib/genit/tags/class_tag.rb
CHANGED
|
@@ -3,12 +3,8 @@
|
|
|
3
3
|
module Genit
|
|
4
4
|
|
|
5
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
6
|
class ClassTag < Tag
|
|
11
|
-
|
|
7
|
+
|
|
12
8
|
# Public: Constructor.
|
|
13
9
|
#
|
|
14
10
|
# working_dir - The String working directory, where live the project.
|
|
@@ -29,7 +25,7 @@ module Genit
|
|
|
29
25
|
when 'fragment' then ClassFragmentTag.new(@working_dir, @template, @filename, @tag).process
|
|
30
26
|
when 'news' then ClassNewsTag.new(@working_dir, @template, @filename, @tag).process
|
|
31
27
|
else
|
|
32
|
-
|
|
28
|
+
error "Unknown tag #{@tag}"
|
|
33
29
|
end
|
|
34
30
|
end
|
|
35
31
|
|
data/lib/genit/tags/here_tag.rb
CHANGED
|
@@ -34,10 +34,10 @@ module Genit
|
|
|
34
34
|
end
|
|
35
35
|
|
|
36
36
|
def get_variable_value
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
elem = doc.at_css("genit[what='#{@tag['here']}']")
|
|
37
|
+
doc = HtmlDocument.open_fragment File.join(@working_dir, 'pages', @filename)
|
|
38
|
+
elem = doc.at_css "genit[what='#{@tag['here']}']"
|
|
40
39
|
if elem.nil?
|
|
40
|
+
warning "here without what #{@tag}"
|
|
41
41
|
""
|
|
42
42
|
else
|
|
43
43
|
elem.inner_html
|
data/spec/class_tag_spec.rb
CHANGED
|
@@ -7,7 +7,7 @@ describe ClassTag do
|
|
|
7
7
|
it "should raise error if class is unknown" do
|
|
8
8
|
tag = {'class' => 'unknown'}
|
|
9
9
|
ct = ClassTag.new 'mock', 'mock', 'mock', tag
|
|
10
|
-
lambda{ct.process}.should raise_error(
|
|
10
|
+
lambda{ct.process}.should raise_error(SystemExit)
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
end
|
data/spec/compiler_spec.rb
CHANGED
|
@@ -4,13 +4,13 @@ require './spec/helper'
|
|
|
4
4
|
|
|
5
5
|
describe Compiler do
|
|
6
6
|
|
|
7
|
-
before :
|
|
7
|
+
before :each do
|
|
8
8
|
@project = ProjectCreator.new('spec/project-name', 'html_5', false)
|
|
9
9
|
@project.create
|
|
10
|
-
@compiler = Compiler.new
|
|
10
|
+
@compiler = Compiler.new test_project_path
|
|
11
11
|
end
|
|
12
12
|
|
|
13
|
-
after :
|
|
13
|
+
after :each do
|
|
14
14
|
clean_test_repository
|
|
15
15
|
end
|
|
16
16
|
|
|
@@ -33,6 +33,7 @@ describe Compiler do
|
|
|
33
33
|
end
|
|
34
34
|
|
|
35
35
|
it "should copy the styles/ into www/" do
|
|
36
|
+
@compiler.compile
|
|
36
37
|
File.exist?('spec/project-name/www/styles/screen.css').should be_true
|
|
37
38
|
end
|
|
38
39
|
|
|
@@ -42,18 +43,162 @@ describe Compiler do
|
|
|
42
43
|
doc.at_css("ul#menu a#selected")['href'].should == 'index.html'
|
|
43
44
|
end
|
|
44
45
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
46
|
+
context "with no '.genit' file" do
|
|
47
|
+
it "should exit" do
|
|
48
|
+
$stdout.should_receive(:puts).with(/Not a genit project folder/i)
|
|
49
|
+
lambda{Compiler.new File.expand_path('.')}.should raise_error(SystemExit)
|
|
50
|
+
end
|
|
49
51
|
end
|
|
50
52
|
|
|
51
|
-
|
|
53
|
+
context "with no '.config' file" do
|
|
54
|
+
it "should exit" do
|
|
55
|
+
$stdout.should_receive(:puts).with(/Missing config file/i)
|
|
56
|
+
FileUtils.rm 'spec/project-name/.config'
|
|
57
|
+
lambda{Compiler.new test_project_path}.should raise_error(SystemExit)
|
|
58
|
+
end
|
|
59
|
+
end
|
|
52
60
|
|
|
61
|
+
describe "RSS feed" do
|
|
53
62
|
it "should build the rss.xml file" do
|
|
54
|
-
|
|
63
|
+
@compiler.compile
|
|
64
|
+
File.exist?('spec/project-name/www/rss.xml').should be_true
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
describe "Sitemap XML" do
|
|
69
|
+
it "should build the 'sitemap.xml'" do
|
|
70
|
+
a_news = %q{<h1>title</h1>}
|
|
71
|
+
File.open('spec/project-name/news/2011-10-01.html', "w") {|out| out.puts a_news }
|
|
72
|
+
@compiler.compile
|
|
73
|
+
File.exist?('spec/project-name/www/sitemap.xml').should be_true
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
context "with bad tag syntax" do
|
|
78
|
+
context "with unknown class into template" do
|
|
79
|
+
it "should exit" do
|
|
80
|
+
# replace main.html
|
|
81
|
+
main = %q{
|
|
82
|
+
<html>
|
|
83
|
+
<body>
|
|
84
|
+
<genit class="foo"/>
|
|
85
|
+
</body>
|
|
86
|
+
</html>
|
|
87
|
+
}
|
|
88
|
+
File.open('spec/project-name/templates/main.html', "w") {|out| out.puts main }
|
|
89
|
+
|
|
90
|
+
$stdout.should_receive(:puts).with(/Unknown tag <genit class="foo"/i)
|
|
91
|
+
lambda{Compiler.new(test_project_path).compile}.should raise_error(SystemExit)
|
|
92
|
+
end
|
|
55
93
|
end
|
|
56
94
|
|
|
95
|
+
context "with unknown class into page" do
|
|
96
|
+
it "should exit" do
|
|
97
|
+
# replace index.html
|
|
98
|
+
index = %q{<genit class="foo"/>}
|
|
99
|
+
File.open('spec/project-name/pages/index.html', "w") {|out| out.puts index }
|
|
100
|
+
|
|
101
|
+
$stdout.should_receive(:puts).with(/Unknown tag <genit class="foo"/i)
|
|
102
|
+
lambda{Compiler.new(test_project_path).compile}.should raise_error(SystemExit)
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
context "with incomplete fragment tag into template" do
|
|
107
|
+
it "should exit" do
|
|
108
|
+
# replace main.html
|
|
109
|
+
main = %q{
|
|
110
|
+
<html>
|
|
111
|
+
<body>
|
|
112
|
+
<genit class="fragment"/>
|
|
113
|
+
</body>
|
|
114
|
+
</html>
|
|
115
|
+
}
|
|
116
|
+
File.open('spec/project-name/templates/main.html', "w") {|out| out.puts main }
|
|
117
|
+
|
|
118
|
+
$stdout.should_receive(:puts).with(/Incomplete <genit class="fragment"/i)
|
|
119
|
+
lambda{Compiler.new(test_project_path).compile}.should raise_error(SystemExit)
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
context "with incomplete fragment tag into page" do
|
|
124
|
+
it "should exit" do
|
|
125
|
+
# replace index.html
|
|
126
|
+
index = %q{<genit class="fragment"/>}
|
|
127
|
+
File.open('spec/project-name/pages/index.html', "w") {|out| out.puts index }
|
|
128
|
+
|
|
129
|
+
$stdout.should_receive(:puts).with(/Incomplete <genit class="fragment"/i)
|
|
130
|
+
lambda{Compiler.new(test_project_path).compile}.should raise_error(SystemExit)
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
context "with unknown file in fragment tag into template" do
|
|
135
|
+
it "should exit" do
|
|
136
|
+
# replace main.html
|
|
137
|
+
main = %q{
|
|
138
|
+
<html>
|
|
139
|
+
<body>
|
|
140
|
+
<genit class="fragment" file="unknown.html"/>
|
|
141
|
+
</body>
|
|
142
|
+
</html>
|
|
143
|
+
}
|
|
144
|
+
File.open('spec/project-name/templates/main.html', "w") {|out| out.puts main }
|
|
145
|
+
|
|
146
|
+
$stdout.should_receive(:puts).with(/No such file <genit class="fragment" file=/i)
|
|
147
|
+
lambda{Compiler.new(test_project_path).compile}.should raise_error(SystemExit)
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
context "with unknown file in fragment tag into page" do
|
|
152
|
+
it "should exit" do
|
|
153
|
+
# replace index.html
|
|
154
|
+
index = %q{<genit class="fragment" file="unknown.html"/>}
|
|
155
|
+
File.open('spec/project-name/pages/index.html', "w") {|out| out.puts index }
|
|
156
|
+
|
|
157
|
+
$stdout.should_receive(:puts).with(/No such file <genit class="fragment" file=/i)
|
|
158
|
+
lambda{Compiler.new(test_project_path).compile}.should raise_error(SystemExit)
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
context "with here tag without what tag" do
|
|
163
|
+
it "should warn" do
|
|
164
|
+
# replace main.html
|
|
165
|
+
main = %q{
|
|
166
|
+
<html>
|
|
167
|
+
<body>
|
|
168
|
+
|
|
169
|
+
<genit class="pages"/>
|
|
170
|
+
<genit here="foo"/>
|
|
171
|
+
</body>
|
|
172
|
+
</html>
|
|
173
|
+
}
|
|
174
|
+
File.open('spec/project-name/templates/main.html', "w") {|out| out.puts main }
|
|
175
|
+
$stdout.should_receive(:puts).with(/here without what/i)
|
|
176
|
+
#~ lambda{Compiler.new(test_project_path).compile}.should_not raise_error
|
|
177
|
+
Compiler.new(test_project_path).compile
|
|
178
|
+
end
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
context "with what tag without here tag" do
|
|
182
|
+
it "should warn"
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
context "with bad '.config' syntax" do
|
|
188
|
+
it "should exit" do
|
|
189
|
+
# replace .config
|
|
190
|
+
main =
|
|
191
|
+
%q{---
|
|
192
|
+
:address: http://www.example.com
|
|
193
|
+
:rss: true
|
|
194
|
+
:rss_title: RSS TITLE
|
|
195
|
+
:rss_description: RSS DESCRIPTION
|
|
196
|
+
}
|
|
197
|
+
File.open('spec/project-name/.config', "w") {|out| out.puts main }
|
|
198
|
+
|
|
199
|
+
$stdout.should_receive(:puts).with(/in .config file/i)
|
|
200
|
+
lambda{Compiler.new(test_project_path).compile}.should raise_error(SystemExit)
|
|
201
|
+
end
|
|
57
202
|
end
|
|
58
203
|
|
|
59
204
|
describe "BUGS" do
|
data/spec/helper.rb
CHANGED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
require './spec/helper'
|
|
4
|
+
|
|
5
|
+
describe NewsUtils do
|
|
6
|
+
|
|
7
|
+
describe "#get_date_from_filename" do
|
|
8
|
+
it "should get the date from a news filename" do
|
|
9
|
+
result = NewsUtils.get_date_from_filename "2011-10-01.html"
|
|
10
|
+
result.should eql "2011-10-01"
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
end
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
require './spec/helper'
|
|
4
|
+
|
|
5
|
+
describe PagesFinder do
|
|
6
|
+
|
|
7
|
+
before :each do
|
|
8
|
+
@project = ProjectCreator.new('spec/project-name', 'html_5', false)
|
|
9
|
+
@project.create
|
|
10
|
+
@finder = PagesFinder.new 'spec/project-name'
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
after :each do
|
|
14
|
+
clean_test_repository
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def write_file name, content
|
|
18
|
+
File.open(File.join('spec/project-name', name), "w") do |file|
|
|
19
|
+
file.puts content
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
it "should retrieve the right number of pages" do
|
|
24
|
+
write_file 'pages/a.html', '<h1>a</h1>'
|
|
25
|
+
write_file 'pages/b.html', '<h1>b</h1>'
|
|
26
|
+
@finder.find.size.should == 3
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it "should name the pages from the root" do
|
|
30
|
+
write_file 'pages/a.html', '<h1>a</h1>'
|
|
31
|
+
write_file 'pages/b.html', '<h1>b</h1>'
|
|
32
|
+
list = @finder.find
|
|
33
|
+
list.include?("index.html").should be_true
|
|
34
|
+
list.include?("a.html").should be_true
|
|
35
|
+
list.include?("b.html").should be_true
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it "should take care of markdown files" do
|
|
39
|
+
write_file 'pages/a.markdown', '#a'
|
|
40
|
+
write_file 'pages/b.markdown', '#b'
|
|
41
|
+
list = @finder.find
|
|
42
|
+
list.size.should == 3
|
|
43
|
+
list.include?("index.html").should be_true
|
|
44
|
+
list.include?("a.html").should be_true
|
|
45
|
+
list.include?("b.html").should be_true
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
it "should transform an array of pagenames into an array of URL strings" do
|
|
49
|
+
pagenames = ['a.html', 'b.html', 'c/d.html']
|
|
50
|
+
url = 'http://www.example.com'
|
|
51
|
+
result = PagesFinder.pagenames2urls(pagenames, url)
|
|
52
|
+
result.size.should == 3
|
|
53
|
+
result.include?('http://www.example.com/a.html').should be_true
|
|
54
|
+
result.include?('http://www.example.com/b.html').should be_true
|
|
55
|
+
result.include?('http://www.example.com/c/d.html').should be_true
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
end
|
|
@@ -19,6 +19,12 @@ describe ProjectCreator do
|
|
|
19
19
|
File.exist?('spec/project-name').should == true
|
|
20
20
|
end
|
|
21
21
|
|
|
22
|
+
it "should create a project folder with version number" do
|
|
23
|
+
a = File.read('VERSION').strip
|
|
24
|
+
b = File.read('spec/project-name/.genit').strip
|
|
25
|
+
b.should eql a
|
|
26
|
+
end
|
|
27
|
+
|
|
22
28
|
it "should say it if it cannot create a project" do
|
|
23
29
|
project = ProjectCreator.new('/root/project', 'html_5', false)
|
|
24
30
|
$stdout.should_receive(:puts).with("Cannot create project...")
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
require './spec/helper'
|
|
4
|
+
|
|
5
|
+
describe Sitemap do
|
|
6
|
+
|
|
7
|
+
before :each do
|
|
8
|
+
@sitemap = Sitemap.new ['a.html', 'b.html', 'c.html']
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
it "should return a string" do
|
|
12
|
+
@sitemap.get.class.should == String
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it "should have only one <urlset> element" do
|
|
16
|
+
doc = Nokogiri::XML::Document.parse @sitemap.get
|
|
17
|
+
doc.css("urlset").size.should == 1
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it "should have the right <urlset> element" do
|
|
21
|
+
@sitemap.get.match('http://www.sitemaps.org/schemas/sitemap/0.9').should_not be_nil
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it "should have the right number of <url> elements" do
|
|
25
|
+
doc = Nokogiri::XML::Document.parse @sitemap.get
|
|
26
|
+
doc.css("url").size.should == 3
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
describe "<url> element" do
|
|
30
|
+
|
|
31
|
+
it "should have the right <loc> element" do
|
|
32
|
+
doc = Nokogiri::XML::Document.parse @sitemap.get
|
|
33
|
+
list = doc.css("url loc").to_a
|
|
34
|
+
list = list.map { |e| e.inner_html }
|
|
35
|
+
list.include?('a.html').should be_true
|
|
36
|
+
list.include?('b.html').should be_true
|
|
37
|
+
list.include?('c.html').should be_true
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: genit
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: '0
|
|
4
|
+
version: '1.0'
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -9,12 +9,12 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2011-
|
|
12
|
+
date: 2011-10-02 00:00:00.000000000 +02:00
|
|
13
13
|
default_executable:
|
|
14
14
|
dependencies:
|
|
15
15
|
- !ruby/object:Gem::Dependency
|
|
16
16
|
name: coco
|
|
17
|
-
requirement: &
|
|
17
|
+
requirement: &72352700 !ruby/object:Gem::Requirement
|
|
18
18
|
none: false
|
|
19
19
|
requirements:
|
|
20
20
|
- - ! '>='
|
|
@@ -22,10 +22,10 @@ dependencies:
|
|
|
22
22
|
version: 0.4.2
|
|
23
23
|
type: :runtime
|
|
24
24
|
prerelease: false
|
|
25
|
-
version_requirements: *
|
|
25
|
+
version_requirements: *72352700
|
|
26
26
|
- !ruby/object:Gem::Dependency
|
|
27
27
|
name: nokogiri
|
|
28
|
-
requirement: &
|
|
28
|
+
requirement: &72352350 !ruby/object:Gem::Requirement
|
|
29
29
|
none: false
|
|
30
30
|
requirements:
|
|
31
31
|
- - ! '>='
|
|
@@ -33,10 +33,10 @@ dependencies:
|
|
|
33
33
|
version: 1.4.6
|
|
34
34
|
type: :runtime
|
|
35
35
|
prerelease: false
|
|
36
|
-
version_requirements: *
|
|
36
|
+
version_requirements: *72352350
|
|
37
37
|
- !ruby/object:Gem::Dependency
|
|
38
38
|
name: bluecloth
|
|
39
|
-
requirement: &
|
|
39
|
+
requirement: &72351960 !ruby/object:Gem::Requirement
|
|
40
40
|
none: false
|
|
41
41
|
requirements:
|
|
42
42
|
- - ! '>='
|
|
@@ -44,10 +44,10 @@ dependencies:
|
|
|
44
44
|
version: 2.1.0
|
|
45
45
|
type: :runtime
|
|
46
46
|
prerelease: false
|
|
47
|
-
version_requirements: *
|
|
47
|
+
version_requirements: *72351960
|
|
48
48
|
- !ruby/object:Gem::Dependency
|
|
49
49
|
name: clamp
|
|
50
|
-
requirement: &
|
|
50
|
+
requirement: &72351550 !ruby/object:Gem::Requirement
|
|
51
51
|
none: false
|
|
52
52
|
requirements:
|
|
53
53
|
- - ! '>='
|
|
@@ -55,7 +55,7 @@ dependencies:
|
|
|
55
55
|
version: 0.2.2
|
|
56
56
|
type: :runtime
|
|
57
57
|
prerelease: false
|
|
58
|
-
version_requirements: *
|
|
58
|
+
version_requirements: *72351550
|
|
59
59
|
description: ! "Genit builds a **static web site**, that is a web site without server
|
|
60
60
|
side \nprograming language and database. The site consists only of xhtml code (+
|
|
61
61
|
css and medias) and \neventually of javascript. It is a command line framework,
|
|
@@ -68,6 +68,7 @@ executables:
|
|
|
68
68
|
extensions: []
|
|
69
69
|
extra_rdoc_files: []
|
|
70
70
|
files:
|
|
71
|
+
- lib/genit/project/pages_finder.rb
|
|
71
72
|
- lib/genit/project/rss_feed.rb
|
|
72
73
|
- lib/genit/project/project_creator.rb
|
|
73
74
|
- lib/genit/project/page_compiler.rb
|
|
@@ -77,6 +78,7 @@ files:
|
|
|
77
78
|
- lib/genit/builders/menu_builder.rb
|
|
78
79
|
- lib/genit/builders/builder_base.rb
|
|
79
80
|
- lib/genit/builders/script_builder.rb
|
|
81
|
+
- lib/genit/builders/relativizer.rb
|
|
80
82
|
- lib/genit/builders/img_builder.rb
|
|
81
83
|
- lib/genit/builders/body_link_builder.rb
|
|
82
84
|
- lib/genit/tags.rb
|
|
@@ -84,6 +86,7 @@ files:
|
|
|
84
86
|
- lib/genit/documents/html_document.rb
|
|
85
87
|
- lib/genit/documents/xml_document.rb
|
|
86
88
|
- lib/genit/documents/fragment.rb
|
|
89
|
+
- lib/genit/documents/sitemap.rb
|
|
87
90
|
- lib/genit/documents/document_writer.rb
|
|
88
91
|
- lib/genit/utils/file_writer.rb
|
|
89
92
|
- lib/genit/utils/news_utils.rb
|
|
@@ -127,6 +130,8 @@ files:
|
|
|
127
130
|
- spec/helper.rb
|
|
128
131
|
- spec/html_document_spec.rb
|
|
129
132
|
- spec/builder_base_spec.rb
|
|
133
|
+
- spec/sitemap_spec.rb
|
|
134
|
+
- spec/news_utils_spec.rb
|
|
130
135
|
- spec/nokogiri_spec.rb
|
|
131
136
|
- spec/project_creator_spec.rb
|
|
132
137
|
- spec/extensions_spec.rb
|
|
@@ -145,6 +150,7 @@ files:
|
|
|
145
150
|
- spec/class_news_tag_spec.rb
|
|
146
151
|
- spec/page_compiler_spec.rb
|
|
147
152
|
- spec/class_tag_spec.rb
|
|
153
|
+
- spec/pages_finder_spec.rb
|
|
148
154
|
- spec/xml_document_spec.rb
|
|
149
155
|
- VERSION
|
|
150
156
|
- NEWS
|